本文整理汇总了C++中CItemBase::GetHeight方法的典型用法代码示例。如果您正苦于以下问题:C++ CItemBase::GetHeight方法的具体用法?C++ CItemBase::GetHeight怎么用?C++ CItemBase::GetHeight使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CItemBase
的用法示例。
在下文中一共展示了CItemBase::GetHeight方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetHeightPoint
void CWorld::GetHeightPoint( const CPointMap & pt, CGrayMapBlockState & block, bool fHouseCheck )
{
ADDTOCALLSTACK("CWorld::GetHeightPoint");
CItemBase * pItemDef = NULL;
CItemBaseDupe * pDupeDef = NULL;
CItem * pItem = NULL;
DWORD wBlockThis = 0;
signed char z = 0;
height_t zHeight = 0;
int x2 = 0, y2 = 0;
// Height of statics at/above given coordinates
// do gravity here for the z.
const CGrayMapBlock * pMapBlock = GetMapBlock( pt );
if (pMapBlock == NULL)
return;
size_t iQty = pMapBlock->m_Statics.GetStaticQty();
if ( iQty > 0 ) // no static items here.
{
x2 = pMapBlock->GetOffsetX(pt.m_x);
y2 = pMapBlock->GetOffsetY(pt.m_y);
const CUOStaticItemRec * pStatic = NULL;
for ( size_t i = 0; i < iQty; ++i, z = 0, zHeight = 0, pStatic = NULL, pDupeDef = NULL )
{
if ( ! pMapBlock->m_Statics.IsStaticPoint( i, x2, y2 ))
continue;
pStatic = pMapBlock->m_Statics.GetStatic( i );
if ( pStatic == NULL )
continue;
z = pStatic->m_z;
//DEBUG_ERR(("z (%d) block.m_zHeight (%d) block.m_Bottom.m_z (%d)\n",z,block.m_zHeight,block.m_Bottom.m_z));
if ( ! block.IsUsableZ( z, block.m_zHeight ))
continue;
// This static is at the coordinates in question.
// enough room for me to stand here ?
pItemDef = CItemBase::FindItemBase( pStatic->GetDispID() );
if ( pItemDef )
{
//DEBUG_ERR(("pItemDef->GetID(0%x) pItemDef->GetDispID(0%x) pStatic->GetDispID(0%x)\n",pItemDef->GetID(),pItemDef->GetDispID(),pStatic->GetDispID()));
if ( pItemDef->GetID() == pStatic->GetDispID() ) //parent item
{
zHeight = pItemDef->GetHeight();
wBlockThis = ( pItemDef->m_Can & CAN_I_MOVEMASK ); //Use only Block flags, other remove
}
else //non-parent item
{
pDupeDef = CItemBaseDupe::GetDupeRef(static_cast<ITEMID_TYPE>(pStatic->GetDispID()));
if ( ! pDupeDef )
{
g_Log.EventDebug("Failed to get non-parent reference (static) (DispID 0%x) (X: %d Y: %d Z: %d)\n",pStatic->GetDispID(),pStatic->m_x+pMapBlock->m_x,pStatic->m_y+pMapBlock->m_y,pStatic->m_z);
zHeight = pItemDef->GetHeight();
wBlockThis = ( pItemDef->m_Can & CAN_I_MOVEMASK );
}
else
{
zHeight = pDupeDef->GetHeight();
wBlockThis = ( pDupeDef->m_Can & CAN_I_MOVEMASK ); //Use only Block flags, other remove - CAN flags cannot be inherited from the parent item due to bad script pack...
}
}
}
else if ( pStatic->GetDispID() )
CItemBase::GetItemTiledataFlags(wBlockThis,pStatic->GetDispID());
block.CheckTile_Item( wBlockThis, z, zHeight, pStatic->GetDispID() + TERRAIN_QTY );
}
}
pItemDef = NULL;
pDupeDef = NULL;
pItem = NULL;
wBlockThis = 0;
z = 0;
zHeight = 0;
x2 = y2 = 0;
iQty = 0;
// Any multi items here ?
// Check all of them
if ( fHouseCheck )
{
CRegionLinks rlinks;
size_t iRegionQty = pt.GetRegions( REGION_TYPE_MULTI, rlinks );
if ( iRegionQty > 0 )
{
// ------------ For variables --------------------
CRegionBase * pRegion = NULL;
const CGrayMulti * pMulti = NULL;
const CUOMultiItemRec2 * pMultiItem = NULL;
x2 = 0;
y2 = 0;
// ------------ For variables --------------------
for ( size_t iRegion = 0; iRegion < iRegionQty; ++iRegion, pRegion = NULL, pItem = NULL, pMulti = NULL, x2 = 0, y2 = 0 )
{
//.........这里部分代码省略.........
示例2: GetFixPoint
void CWorld::GetFixPoint( const CPointMap & pt, CGrayMapBlockState & block)
{
//Will get the highest CAN_I_PLATFORM|CAN_I_CLIMB and places it into block.Bottom
ADDTOCALLSTACK("CWorld::GetFixPoint");
CItemBase * pItemDef = NULL;
CItemBaseDupe * pDupeDef = NULL;
CItem * pItem = NULL;
DWORD wBlockThis = 0;
signed char z = 0;
int x2 = 0, y2 = 0;
// Height of statics at/above given coordinates
// do gravity here for the z.
const CGrayMapBlock * pMapBlock = GetMapBlock( pt );
if (pMapBlock == NULL)
return;
size_t iQty = pMapBlock->m_Statics.GetStaticQty();
if ( iQty > 0 ) // no static items here.
{
x2 = pMapBlock->GetOffsetX(pt.m_x);
y2 = pMapBlock->GetOffsetY(pt.m_y);
const CUOStaticItemRec * pStatic = NULL;
for ( size_t i = 0; i < iQty; ++i, z = 0, pStatic = NULL, pDupeDef = NULL )
{
if ( ! pMapBlock->m_Statics.IsStaticPoint( i, x2, y2 ))
continue;
pStatic = pMapBlock->m_Statics.GetStatic( i );
if ( pStatic == NULL )
continue;
z = pStatic->m_z;
pItemDef = CItemBase::FindItemBase( pStatic->GetDispID() );
if ( pItemDef )
{
if (pItemDef->GetID() == pStatic->GetDispID()) //parent item
{
wBlockThis = (pItemDef->m_Can & CAN_I_MOVEMASK);
z += ((wBlockThis & CAN_I_CLIMB) ? pItemDef->GetHeight()/2 : pItemDef->GetHeight());
}
else //non-parent item
{
pDupeDef = CItemBaseDupe::GetDupeRef(static_cast<ITEMID_TYPE>(pStatic->GetDispID()));
if ( ! pDupeDef )
{
g_Log.EventDebug("Failed to get non-parent reference (static) (DispID 0%x) (X: %d Y: %d Z: %d)\n",pStatic->GetDispID(),pStatic->m_x+pMapBlock->m_x,pStatic->m_y+pMapBlock->m_y,pStatic->m_z);
wBlockThis = ( pItemDef->m_Can & CAN_I_MOVEMASK );
z += ((wBlockThis & CAN_I_CLIMB) ? pItemDef->GetHeight()/2 : pItemDef->GetHeight());
}
else
{
wBlockThis = (pDupeDef->m_Can & CAN_I_MOVEMASK);
z += ((wBlockThis & CAN_I_CLIMB) ? pDupeDef->GetHeight()/2 : pDupeDef->GetHeight());
}
}
}
else if ( pStatic->GetDispID() )
CItemBase::GetItemTiledataFlags(wBlockThis,pStatic->GetDispID());
if (block.m_Bottom.m_z < z)
{
if ((z < pt.m_z+PLAYER_HEIGHT) && (wBlockThis & (CAN_I_PLATFORM|CAN_I_CLIMB|CAN_I_WATER)))
{
block.m_Bottom.m_dwBlockFlags = wBlockThis;
block.m_Bottom.m_dwTile = pStatic->GetDispID() + TERRAIN_QTY;
block.m_Bottom.m_z = z;
}
else if (block.m_Top.m_z > z)
{
block.m_Top.m_dwBlockFlags = wBlockThis;
block.m_Top.m_dwTile = pStatic->GetDispID() + TERRAIN_QTY;
block.m_Top.m_z = z;
}
}
}
}
pItemDef = NULL;
pDupeDef = NULL;
pItem = NULL;
wBlockThis = 0;
z = 0;
x2 = y2 = 0;
iQty = 0;
// Any multi items here ?
// Check all of them
CRegionLinks rlinks;
size_t iRegionQty = pt.GetRegions( REGION_TYPE_MULTI, rlinks );
if ( iRegionQty > 0 )
{
// ------------ For variables --------------------
CRegionBase * pRegion = NULL;
const CGrayMulti * pMulti = NULL;
const CUOMultiItemRec2 * pMultiItem = NULL;
x2 = 0;
y2 = 0;
// ------------ For variables --------------------
//.........这里部分代码省略.........
示例3: Area
void CWorld::GetHeightPoint2( const CPointMap & pt, CGrayMapBlockState & block, bool fHouseCheck )
{
ADDTOCALLSTACK("CWorld::GetHeightPoint2");
// Height of statics at/above given coordinates
// do gravity here for the z.
DWORD wBlockThis = 0;
const CGrayMapBlock * pMapBlock = GetMapBlock( pt );
if ( !pMapBlock )
{
g_Log.EventWarn("GetMapBlock failed at %s.\n", pt.WriteUsed());
return;
}
{
size_t iStaticQty = pMapBlock->m_Statics.GetStaticQty();
if ( iStaticQty > 0 ) // no static items here.
{
int x2 = pMapBlock->GetOffsetX(pt.m_x);
int y2 = pMapBlock->GetOffsetY(pt.m_y);
for ( size_t i = 0; i < iStaticQty; i++ )
{
if ( ! pMapBlock->m_Statics.IsStaticPoint( i, x2, y2 ))
continue;
const CUOStaticItemRec * pStatic = pMapBlock->m_Statics.GetStatic( i );
signed char z = pStatic->m_z;
if ( ! block.IsUsableZ(z,PLAYER_HEIGHT))
continue;
// This static is at the coordinates in question.
// enough room for me to stand here ?
wBlockThis = 0;
height_t zHeight = CItemBase::GetItemHeight( pStatic->GetDispID(), wBlockThis );
block.CheckTile( wBlockThis, z, zHeight, pStatic->GetDispID() + TERRAIN_QTY );
}
}
}
// Any multi items here ?
if ( fHouseCheck )
{
CRegionLinks rlinks;
size_t iRegionQty = pt.GetRegions( REGION_TYPE_MULTI, rlinks );
if ( iRegionQty > 0 )
{
for ( size_t i = 0; i < iRegionQty; i++)
{
CRegionBase * pRegion = rlinks.GetAt(i);
CItem * pItem = pRegion->GetResourceID().ItemFind();
if ( pItem != NULL )
{
const CGrayMulti * pMulti = g_Cfg.GetMultiItemDefs(pItem);
if ( pMulti )
{
int x2 = pt.m_x - pItem->GetTopPoint().m_x;
int y2 = pt.m_y - pItem->GetTopPoint().m_y;
size_t iMultiQty = pMulti->GetItemCount();
for ( size_t j = 0; j < iMultiQty; j++ )
{
const CUOMultiItemRec2 * pMultiItem = pMulti->GetItem(j);
ASSERT(pMultiItem);
if ( ! pMultiItem->m_visible )
continue;
if ( pMultiItem->m_dx != x2 || pMultiItem->m_dy != y2 )
continue;
signed char zitem = static_cast<signed char>( pItem->GetTopZ() + pMultiItem->m_dz );
if ( ! block.IsUsableZ(zitem,PLAYER_HEIGHT))
continue;
wBlockThis = 0;
height_t zHeight = CItemBase::GetItemHeight( pMultiItem->GetDispID(), wBlockThis );
block.CheckTile( wBlockThis, zitem, zHeight, pMultiItem->GetDispID() + TERRAIN_QTY );
}
}
}
}
}
}
{
// Any dynamic items here ?
// NOTE: This could just be an item that an NPC could just move ?
CWorldSearch Area( pt );
for (;;)
{
CItem * pItem = Area.GetItem();
if ( pItem == NULL )
break;
signed char zitem = pItem->GetTopZ();
if ( ! block.IsUsableZ(zitem,PLAYER_HEIGHT))
continue;
// Invis items should not block ???
CItemBase * pItemDef = pItem->Item_GetDef();
ASSERT(pItemDef);
//.........这里部分代码省略.........
示例4: FindTypeNear_Top
CPointMap CWorld::FindTypeNear_Top( const CPointMap & pt, IT_TYPE iType, int iDistance )
{
ADDTOCALLSTACK("CWorld::FindTypeNear_Top");
#define RESOURCE_Z_CHECK 8
CPointMap ptFound;
CItemBase * pItemDef = NULL;
CItem * pItem = NULL;
CItemBaseDupe * pDupeDef = NULL;
height_t Height = 0;
BYTE z = 0;
CPointMap ptTest;
unsigned int iRetElem = 4;
CPointMap ptElem[5];
memset(ptElem, 0, sizeof(ptElem));
//for ( iQty = 0; iQty < 4; ++iQty )
// ptElem[iQty].m_z = UO_SIZE_MIN_Z;
ptElem[0].m_z = ptElem[1].m_z = ptElem[2].m_z = ptElem[3].m_z = UO_SIZE_MIN_Z;
ptElem[4] = CPointMap(USHRT_MAX, USHRT_MAX, UO_SIZE_MIN_Z);
bool fElem[4] = { false, false, false, false };
// Check dynamics
CWorldSearch Area( pt, iDistance );
Area.SetAllShow( true );
for (;;)
{
z = 0;
Height = 0;
pItem = Area.GetItem();
if ( pItem == NULL )
break;
if ( pt.GetDist( pItem->GetTopPoint() ) > iDistance )
continue;
pItemDef = CItemBase::FindItemBase( pItem->GetDispID() );
if ( pItemDef == NULL )
continue;
Height = pItemDef->GetHeight();
if ( pItemDef->GetID() != pItem->GetDispID() ) //not a parent item
{
pDupeDef = CItemBaseDupe::GetDupeRef(static_cast<ITEMID_TYPE>(pItem->GetDispID()));
if ( ! pDupeDef )
{
g_Log.EventDebug("Failed to get non-parent reference (dynamic) (DispID 0%x) (X: %d Y: %d Z: %d)\n",pItem->GetDispID(),ptTest.m_x,ptTest.m_y,ptTest.m_z);
Height = pItemDef->GetHeight();
}
else
Height = pDupeDef->GetHeight();
}
z = minimum( Height + pItem->GetTopPoint().m_z, UO_SIZE_Z ); //height + current position = the top point
if ( ptElem[0].m_z > z ) //if ( ptElem[0].m_z > pItem->GetTopPoint().m_z )
continue;
if ( ((( z - pt.m_z ) > 0) && ( z - pt.m_z ) > RESOURCE_Z_CHECK ) || ((( pt.m_z - z ) < 0) && (( pt.m_z - z ) < - RESOURCE_Z_CHECK ))) //if ( ((( pItem->GetTopPoint().m_z - pt.m_z ) > 0) && ( pItem->GetTopPoint().m_z - pt.m_z ) > RESOURCE_Z_CHECK ) || ((( pt.m_z - pItem->GetTopPoint().m_z ) < 0) && (( pt.m_z - pItem->GetTopPoint().m_z ) < - RESOURCE_Z_CHECK )))
continue;
if (( z < ptElem[0].m_z ) || (( z == ptElem[0].m_z ) && ( fElem[0] )))
continue;
ptElem[0] = pItem->GetTopPoint();
ptElem[0].m_z = z;
fElem[0] = false;
//DEBUG_ERR(("dynamic pItem->IsType( iType %d) %d\n",iType,pItem->IsType( iType )));
if ( pItem->IsType( iType ) ) //( pItem->Item_GetDef()->IsType(iType) ) )
{
fElem[0] = true;
iRetElem = 0;
}
}
// Parts of multis ?
const CGrayMulti * pMulti = NULL; // Multi Def (multi check)
const CUOMultiItemRec2 * pMultiItem = NULL; // Multi item iterator
CRegionBase * pRegion = NULL;
CRegionLinks rlinks;
size_t iRegionQty = pt.GetRegions( REGION_TYPE_MULTI, rlinks );
if ( iRegionQty > 0 )
{
for ( size_t iRegion = 0; iRegion < iRegionQty; pMulti = NULL, ++iRegion)
{
pRegion = rlinks.GetAt(iRegion);
pItem = pRegion->GetResourceID().ItemFind();
if ( !pItem )
continue;
pMulti = g_Cfg.GetMultiItemDefs(pItem);
if ( !pMulti )
continue;
size_t iMultiQty = pMulti->GetItemCount();
for ( size_t iMulti = 0; iMulti < iMultiQty; pItemDef = NULL, pMultiItem = NULL, Height = 0, ++iMulti )
{
pMultiItem = pMulti->GetItem(iMulti);
if ( !pMultiItem )
break;
//.........这里部分代码省略.........
示例5: CanSeeLOS_New
bool CChar::CanSeeLOS_New( const CPointMap &ptDst, CPointMap *pptBlock, int iMaxDist, word flags, bool bCombatCheck ) const
{
ADDTOCALLSTACK("CChar::CanSeeLOS_New");
// WARNING: CanSeeLOS is an expensive function (lot of calculations but most importantly it has to read the UO files, and file I/O is slow).
if ( !bCombatCheck && IsPriv(PRIV_GM) ) // If i'm checking the LOS during a combat, i don't want to shoot through the walls even if i'm a GM
{
WARNLOS(("GM Pass\n"));
return true;
}
CPointMap ptSrc = GetTopPoint();
CPointMap ptNow(ptSrc);
if ( ptSrc.m_map != ptDst.m_map ) // Different map
return this->CanSeeLOS_New_Failed(pptBlock, ptNow);
if ( ptSrc == ptDst ) // Same point ^^
return true;
short iTotalZ = ptSrc.m_z + GetHeightMount(true);
ptSrc.m_z = (char)minimum(iTotalZ, UO_SIZE_Z); //true - substract one from the height because of eyes height
WARNLOS(("Total Z: %d\n", ptSrc.m_z));
int dx, dy, dz;
dx = ptDst.m_x - ptSrc.m_x;
dy = ptDst.m_y - ptSrc.m_y;
dz = ptDst.m_z - ptSrc.m_z;
float dist2d, dist3d;
dist2d = sqrt((float)(dx*dx + dy*dy));
if ( dz )
dist3d = sqrt((float)(dist2d*dist2d + dz*dz));
else
dist3d = dist2d;
if ( APPROX(dist2d) > (float)iMaxDist )
{
WARNLOS(("( APPROX(dist2d)(%f) > ((double)iMaxDist)(%f) ) --> NOLOS\n", APPROX(dist2d), (float)iMaxDist));
return CanSeeLOS_New_Failed(pptBlock, ptNow);
}
float dFactorX, dFactorY, dFactorZ;
dFactorX = dx / dist3d;
dFactorY = dy / dist3d;
dFactorZ = dz / dist3d;
float nPx, nPy, nPz;
nPx = ptSrc.m_x;
nPy = ptSrc.m_y;
nPz = ptSrc.m_z;
std::vector<CPointMap> path;
for (;;)
{
if ( BETWEENPOINT(nPx, ptDst.m_x, ptSrc.m_x) && BETWEENPOINT(nPy, ptDst.m_y, ptSrc.m_y) && BETWEENPOINT(nPz, ptDst.m_z, ptSrc.m_z) )
{
dx = (int)APPROX(nPx);
dy = (int)APPROX(nPy);
dz = (int)APPROX(nPz);
// Add point to vector
if ( !path.empty() )
{
CPointMap ptEnd = path[path.size() - 1];
if ( ptEnd.m_x != dx || ptEnd.m_y != dy || ptEnd.m_z != dz )
path.emplace_back((word)dx, (word)dy, (char)dz, ptSrc.m_map);
}
else
{
path.emplace_back((word)dx, (word)dy, (char)dz, ptSrc.m_map);
}
WARNLOS(("PATH X:%d Y:%d Z:%d\n", dx, dy, dz));
nPx += dFactorX;
nPy += dFactorY;
nPz += dFactorZ;
}
else
break;
}
if ( !path.empty() )
{
if ( path[path.size() - 1] != ptDst )
path.emplace_back(ptDst.m_x, ptDst.m_y, ptDst.m_z, ptDst.m_map);
}
else
{
path.clear();
return CanSeeLOS_New_Failed(pptBlock, ptNow);
}
WARNLOS(("Path calculated %" PRIuSIZE_T "\n", path.size()));
// Ok now we should loop through all the points and checking for maptile, staticx, items, multis.
// If something is in the way and it has the wrong flags LOS return false
const CServerMapBlock *pBlock = nullptr; // Block of the map (for statics)
const CUOStaticItemRec *pStatic = nullptr; // Statics iterator (based on SphereMapBlock)
const CSphereMulti *pMulti = nullptr; // Multi Def (multi check)
//.........这里部分代码省略.........