本文整理汇总了C++中MapCell::AddObject方法的典型用法代码示例。如果您正苦于以下问题:C++ MapCell::AddObject方法的具体用法?C++ MapCell::AddObject怎么用?C++ MapCell::AddObject使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MapCell
的用法示例。
在下文中一共展示了MapCell::AddObject方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: ChangeObjectLocation
//.........这里部分代码省略.........
Player* plr = static_cast< Player* >( obj );
if(plr->GetBindMapId() != GetMapId())
{
plr->SafeTeleport(plr->GetBindMapId(),0,plr->GetBindPositionX(),plr->GetBindPositionY(),plr->GetBindPositionZ(),0);
plr->GetSession()->SystemMessage("Teleported you to your hearthstone location as you were out of the map boundaries.");
return;
}
else
{
obj->GetPositionV()->ChangeCoords(plr->GetBindPositionX(),plr->GetBindPositionY(),plr->GetBindPositionZ(),0);
plr->GetSession()->SystemMessage("Teleported you to your hearthstone location as you were out of the map boundaries.");
WorldPacket * data = plr->BuildTeleportAckMsg(plr->GetPosition());
plr->GetSession()->SendPacket(data);
delete data;
}
}
else
{
obj->GetPositionV()->ChangeCoords(0,0,0,0);
}
}
uint32 cellX = GetPosX(obj->GetPositionX());
uint32 cellY = GetPosY(obj->GetPositionY());
if(cellX >= _sizeX || cellY >= _sizeY)
{
return;
}
MapCell *objCell = GetCell(cellX, cellY);
MapCell * pOldCell = obj->GetMapCell();
if (!objCell)
{
objCell = Create(cellX,cellY);
objCell->Init(cellX, cellY, _mapId, this);
}
// If object moved cell
if (objCell != obj->GetMapCell())
{
// THIS IS A HACK!
// Current code, if a creature on a long waypoint path moves from an active
// cell into an inactive one, it will disable itself and will never return.
// This is to prevent cpu leaks. I will think of a better solution very soon :P
if(!objCell->IsActive() && !plObj && obj->Active)
obj->Deactivate(this);
if(obj->GetMapCell())
obj->GetMapCell()->RemoveObject(obj);
objCell->AddObject(obj);
obj->SetMapCell(objCell);
// if player we need to update cell activity
// radius = 2 is used in order to update both
// old and new cells
if(obj->GetTypeId() == TYPEID_PLAYER)
{
// have to unlock/lock here to avoid a deadlock situation.
UpdateCellActivity(cellX, cellY, 2);
if( pOldCell != NULL )
{
// only do the second check if theres -/+ 2 difference
if( abs( (int)cellX - (int)pOldCell->_x ) > 2 ||
abs( (int)cellY - (int)pOldCell->_y ) > 2 )
{
UpdateCellActivity( pOldCell->_x, pOldCell->_y, 2 );
}
}
}
}
//////////////////////////////////////
// Update in-range set for new objects
//////////////////////////////////////
uint32 endX = cellX <= _sizeX ? cellX + 1 : (_sizeX-1);
uint32 endY = cellY <= _sizeY ? cellY + 1 : (_sizeY-1);
uint32 startX = cellX > 0 ? cellX - 1 : 0;
uint32 startY = cellY > 0 ? cellY - 1 : 0;
uint32 posX, posY;
MapCell *cell;
MapCell::ObjectSet::iterator iter;
for (posX = startX; posX <= endX; ++posX )
{
for (posY = startY; posY <= endY; ++posY )
{
cell = GetCell(posX, posY);
if (cell)
UpdateInRangeSet(obj, plObj, cell, &buf);
}
}
if(buf)
delete buf;
}
示例2: PushObject
//.........这里部分代码省略.........
uint32 count;
Player *plObj;
if(obj->GetTypeId() == TYPEID_PLAYER)
plObj = static_cast< Player* >( obj );
else
plObj = NULL;
if(plObj)
{
sLog.outDetail("Creating player "I64FMT" for himself.", obj->GetGUID());
ByteBuffer pbuf(10000);
count = plObj->BuildCreateUpdateBlockForPlayer(&pbuf, plObj);
plObj->PushCreationData(&pbuf, count);
}
//////////////////////
// Build in-range data
//////////////////////
for (posX = startX; posX <= endX; posX++ )
{
for (posY = startY; posY <= endY; posY++ )
{
cell = GetCell(posX, posY);
if (cell)
{
UpdateInRangeSet(obj, plObj, cell, &buf);
}
}
}
//Add to the cell's object list
objCell->AddObject(obj);
obj->SetMapCell(objCell);
//Add to the mapmanager's object list
if(plObj)
{
m_PlayerStorage[plObj->GetLowGUID()] = plObj;
UpdateCellActivity(x, y, 2);
}
else
{
switch(obj->GetTypeFromGUID())
{
case HIGHGUID_TYPE_PET:
m_PetStorage[obj->GetUIdFromGUID()] = static_cast< Pet* >( obj );
break;
case HIGHGUID_TYPE_UNIT:
{
ASSERT((obj->GetUIdFromGUID()) <= m_CreatureHighGuid);
m_CreatureStorage[obj->GetUIdFromGUID()] = (Creature*)obj;
if(((Creature*)obj)->m_spawn != NULL)
{
_sqlids_creatures.insert(make_pair( ((Creature*)obj)->m_spawn->id, ((Creature*)obj) ) );
}
}break;
case HIGHGUID_TYPE_GAMEOBJECT:
{
m_GOStorage[obj->GetUIdFromGUID()] = (GameObject*)obj;
if(((GameObject*)obj)->m_spawn != NULL)
{
_sqlids_gameobjects.insert(make_pair( ((GameObject*)obj)->m_spawn->id, ((GameObject*)obj) ) );
示例3: AddObject
void MapMgr::AddObject(Object *obj)
{
ASSERT(obj);
// make sure object is a virgin
ASSERT(obj->GetInRangeSetBegin() == obj->GetInRangeSetEnd());
ASSERT(obj->GetMapId() == _mapId);
ASSERT(obj->GetPositionX() < _maxX && obj->GetPositionX() > _minX);
ASSERT(obj->GetPositionY() < _maxY && obj->GetPositionY() > _minY);
ASSERT(_cells);
// That object types are not map objects. TODO: add AI groups here?
if(obj->GetTypeId() == TYPEID_ITEM || obj->GetTypeId() == TYPEID_CONTAINER)
{
// mark object as updatable and exit
obj->AddToWorld();
return;
}
uint32 x = (uint32)(obj->GetPositionX() > 0 ? abs(_minX) + obj->GetPositionX() :
abs(_minX) - abs(obj->GetPositionX()));
uint32 y = (uint32)(obj->GetPositionY() > 0 ? abs(_minY) + obj->GetPositionY() :
abs(_minY) - abs(obj->GetPositionY()));
x /= _sizeX;
y /= _sizeY;
/*
sLog.outDetail("Obj position: %f %f Cell position: %u %u",
obj->GetPositionX(), obj->GetPositionY(), x, y);
*/
MapCell *objCell = &(_cells[x][y]);
uint32 endX = x < _sizeX ? x + 1 : _sizeX;
uint32 endY = y < _sizeY ? y + 1 : _sizeY;
uint32 startX = x > 0 ? x - 1 : 0;
uint32 startY = y > 0 ? y - 1 : 0;
uint32 posX, posY;
MapCell *cell;
MapCell::ObjectSet::iterator iter;
WorldPacket packet;
UpdateData data;
UpdateData playerData;
for (posX = startX; posX <= endX; posX++ )
{
for (posY = startY; posY <= endY; posY++ )
{
cell = &(_cells[posX][posY]);
ASSERT(cell);
for (iter = cell->Begin(); iter != cell->End(); iter++)
{
if ((*iter)->GetDistance2dSq(obj) <= UPDATE_DISTANCE*UPDATE_DISTANCE)
{
// Object in range, add to set
if((*iter)->GetTypeId() == TYPEID_PLAYER)
{
sLog.outDetail("Creating object "I64FMT" for player "I64FMT".",
obj->GetGUID(), (*iter)->GetGUID());
data.Clear();
obj->BuildCreateUpdateBlockForPlayer( &data, (Player*)*iter );
data.BuildPacket(&packet);
((Player*)*iter)->GetSession()->SendPacket( &packet );
}
(*iter)->AddInRangeObject(obj);
if(obj->GetTypeId() == TYPEID_PLAYER)
{
sLog.outDetail("Creating object "I64FMT" for player "I64FMT".",
(*iter)->GetGUID(), obj->GetGUID());
(*iter)->BuildCreateUpdateBlockForPlayer( &playerData, (Player*)obj );
}
obj->AddInRangeObject(*iter);
}
}
}
}
if(obj->GetTypeId() == TYPEID_PLAYER)
{
sLog.outDetail("Creating player "I64FMT" for himself.", obj->GetGUID());
obj->BuildCreateUpdateBlockForPlayer( &playerData, (Player*)obj );
playerData.BuildPacket( &packet );
((Player*)obj)->GetSession()->SendPacket( &packet );
}
objCell->AddObject(obj);
_objects[obj->GetGUID()] = obj;
obj->SetMapCell(objCell);
obj->AddToWorld();
}
示例4: ChangeObjectLocation
void MapMgr::ChangeObjectLocation(Object *obj)
{
ASSERT(obj);
ASSERT(obj->GetMapId() == _mapId);
ASSERT(_cells);
if(obj->GetTypeId() == TYPEID_ITEM || obj->GetTypeId() == TYPEID_CONTAINER)
return;
WorldPacket packet;
UpdateData data;
UpdateData playerData;
Object* curObj;
for (Object::InRangeSet::iterator iter = obj->GetInRangeSetBegin();
iter != obj->GetInRangeSetEnd();)
{
curObj = *iter;
iter++;
if (curObj->GetDistance2dSq(obj) > UPDATE_DISTANCE*UPDATE_DISTANCE)
{
sLog.outDetail("Object "I64FMT" no longer in field of view of object "I64FMT".",
obj->GetGUID(), (curObj)->GetGUID());
if( obj->GetTypeId() == TYPEID_PLAYER )
curObj->BuildOutOfRangeUpdateBlock( &playerData );
obj->RemoveInRangeObject(curObj);
if( curObj->GetTypeId() == TYPEID_PLAYER )
{
data.Clear();
obj->BuildOutOfRangeUpdateBlock( &data );
data.BuildPacket(&packet);
((Player*)curObj)->GetSession()->SendPacket( &packet );
}
curObj->RemoveInRangeObject(obj);
}
}
uint32 cellX = (uint32)(obj->GetPositionX() > 0 ? abs(_minX) + obj->GetPositionX() :
abs(_minX) - abs(obj->GetPositionX()));
uint32 cellY = (uint32)(obj->GetPositionY() > 0 ? abs(_minY) + obj->GetPositionY() :
abs(_minY) - abs(obj->GetPositionY()));
cellX /= _sizeX;
cellY /= _sizeY;
/*
sLog.outDetail("Obj position: %f %f Cell position: %u %u",
obj->GetPositionX(), obj->GetPositionY(), cellX, cellY);
*/
MapCell *objCell = &(_cells[cellX][cellY]);
if (objCell != obj->GetMapCell())
{
obj->GetMapCell()->RemoveObject(obj);
objCell->AddObject(obj);
obj->SetMapCell(objCell);
}
uint32 endX = cellX < _sizeX ? cellX + 1 : _sizeX;
uint32 endY = cellY < _sizeY ? cellY + 1 : _sizeY;
uint32 startX = cellX > 0 ? cellX - 1 : 0;
uint32 startY = cellY > 0 ? cellY - 1 : 0;
uint32 posX, posY;
MapCell *cell;
MapCell::ObjectSet::iterator iter;
for (posX = startX; posX <= endX; posX++ )
{
for (posY = startY; posY <= endY; posY++ )
{
cell = &(_cells[posX][posY]);
ASSERT(cell);
for (iter = cell->Begin(); iter != cell->End(); iter++)
{
curObj = *iter;
if (curObj != obj &&
(curObj)->GetDistance2dSq(obj) <= UPDATE_DISTANCE*UPDATE_DISTANCE &&
!obj->IsInRangeSet(curObj))
{
// Object in range, add to set
if((curObj)->GetTypeId() == TYPEID_PLAYER)
{
sLog.outDetail("Creating object "I64FMT" for player "I64FMT".",
obj->GetGUID(), (curObj)->GetGUID());
data.Clear();
obj->BuildCreateUpdateBlockForPlayer( &data, (Player*)curObj );
data.BuildPacket(&packet);
((Player*)curObj)->GetSession()->SendPacket( &packet );
}
(curObj)->AddInRangeObject(obj);
//.........这里部分代码省略.........
示例5: ChangeObjectLocation
//.........这里部分代码省略.........
{
obj->GetPositionV()->ChangeCoords(plObj->GetBindPositionX(), plObj->GetBindPositionY(), plObj->GetBindPositionZ(), 0);
plObj->GetSession()->SystemMessage("Teleported you to your hearthstone location as you were out of the map boundaries.");
plObj->SendTeleportAckMsg(plObj->GetPosition());
}
}
else
{
obj->GetPositionV()->ChangeCoords(0, 0, 0, 0);
}
}
uint32 cellX = GetPosX(obj->GetPositionX());
uint32 cellY = GetPosY(obj->GetPositionY());
if(cellX >= _sizeX || cellY >= _sizeY)
{
return;
}
MapCell* objCell = GetCell(cellX, cellY);
MapCell* pOldCell = obj->GetMapCell();
if(objCell == NULL)
{
objCell = Create(cellX, cellY);
objCell->Init(cellX, cellY, this);
}
ARCEMU_ASSERT(objCell != NULL);
// If object moved cell
if(objCell != pOldCell)
{
// THIS IS A HACK!
// Current code, if a creature on a long waypoint path moves from an active
// cell into an inactive one, it will disable itself and will never return.
// This is to prevent cpu leaks. I will think of a better solution very soon :P
if(!objCell->IsActive() && !plObj && obj->IsActive())
obj->Deactivate(this);
if(pOldCell != NULL)
pOldCell->RemoveObject(obj);
objCell->AddObject(obj);
obj->SetMapCell(objCell);
// if player we need to update cell activity
// radius = 2 is used in order to update both
// old and new cells
if(obj->IsPlayer())
{
// have to unlock/lock here to avoid a deadlock situation.
UpdateCellActivity(cellX, cellY, 2);
if(pOldCell != NULL)
{
// only do the second check if there's -/+ 2 difference
if(abs((int)cellX - (int)pOldCell->_x) > 2 ||
abs((int)cellY - (int)pOldCell->_y) > 2)
{
UpdateCellActivity(pOldCell->_x, pOldCell->_y, 2);
}
}
}
}
//////////////////////////////////////
// Update in-range set for new objects
//////////////////////////////////////
uint32 endX = cellX <= _sizeX ? cellX + 1 : (_sizeX - 1);
uint32 endY = cellY <= _sizeY ? cellY + 1 : (_sizeY - 1);
uint32 startX = cellX > 0 ? cellX - 1 : 0;
uint32 startY = cellY > 0 ? cellY - 1 : 0;
uint32 posX, posY;
MapCell* cell;
//If the object announcing it's position is a special one, then it should do so in a much wider area - like the distance between the two transport towers in Orgrimmar, or more. - By: VLack
if(obj->IsGameObject() && (TO< GameObject* >(obj)->GetOverrides() & GAMEOBJECT_ONMOVEWIDE))
{
endX = cellX + 5 <= _sizeX ? cellX + 6 : (_sizeX - 1);
endY = cellY + 5 <= _sizeY ? cellY + 6 : (_sizeY - 1);
startX = cellX > 5 ? cellX - 6 : 0;
startY = cellY > 5 ? cellY - 6 : 0;
}
for(posX = startX; posX <= endX; ++posX)
{
for(posY = startY; posY <= endY; ++posY)
{
cell = GetCell(posX, posY);
if(cell)
UpdateInRangeSet(obj, plObj, cell, &buf);
}
}
if(buf)
delete buf;
}
示例6: PushObject
//.........这里部分代码省略.........
uint32 count;
Player* plObj;
if(obj->IsPlayer())
plObj = TO< Player* >(obj);
else
plObj = NULL;
if(plObj != NULL)
{
LOG_DETAIL("Creating player " I64FMT " for himself.", obj->GetGUID());
ByteBuffer pbuf(10000);
count = plObj->BuildCreateUpdateBlockForPlayer(&pbuf, plObj);
plObj->PushCreationData(&pbuf, count);
}
//////////////////////
// Build in-range data
//////////////////////
for(posX = startX; posX <= endX; posX++)
{
for(posY = startY; posY <= endY; posY++)
{
cell = GetCell(posX, posY);
if(cell)
{
UpdateInRangeSet(obj, plObj, cell, &buf);
}
}
}
//Add to the cell's object list
objCell->AddObject(obj);
obj->SetMapCell(objCell);
//Add to the mapmanager's object list
if(plObj != NULL)
{
m_PlayerStorage[plObj->GetLowGUID()] = plObj;
UpdateCellActivity(x, y, 2);
}
else
{
switch(obj->GetTypeFromGUID())
{
case HIGHGUID_TYPE_PET:
m_PetStorage[obj->GetUIdFromGUID()] = TO< Pet* >(obj);
break;
case HIGHGUID_TYPE_UNIT:
case HIGHGUID_TYPE_VEHICLE:
{
ARCEMU_ASSERT(obj->GetUIdFromGUID() <= m_CreatureHighGuid);
CreatureStorage[ obj->GetUIdFromGUID() ] = TO< Creature* >(obj);
if(TO_CREATURE(obj)->m_spawn != NULL)
{
_sqlids_creatures.insert(make_pair(TO_CREATURE(obj)->m_spawn->id, TO_CREATURE(obj)));
}
}
break;
case HIGHGUID_TYPE_GAMEOBJECT:
{
GOStorage[ obj->GetUIdFromGUID() ] = TO< GameObject* >(obj);
if(TO_GAMEOBJECT(obj)->m_spawn != NULL)