本文整理汇总了C++中MapCell::IsActive方法的典型用法代码示例。如果您正苦于以下问题:C++ MapCell::IsActive方法的具体用法?C++ MapCell::IsActive怎么用?C++ MapCell::IsActive使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MapCell
的用法示例。
在下文中一共展示了MapCell::IsActive方法的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: LoadAllCells
void MapMgr::LoadAllCells()
{
// eek
MapCell * cellInfo;
CellSpawns * spawns;
for( uint32 x = 0 ; x < _sizeX ; x ++ )
{
for( uint32 y = 0 ; y < _sizeY ; y ++ )
{
cellInfo = GetCell( x , y );
if( !cellInfo )
{
// Cell doesn't exist, create it.
// There is no spoon. Err... cell.
cellInfo = Create( x , y );
cellInfo->Init( x , y , _mapId , this );
sLog.outDetail( "Created cell [%u,%u] on map %d (instance %d)." , x , y , _mapId , m_instanceID );
cellInfo->SetActivity( true );
_map->CellGoneActive( x , y );
ASSERT( !cellInfo->IsLoaded() );
spawns = _map->GetSpawnsList( x , y );
if( spawns )
cellInfo->LoadObjects( spawns );
}
else
{
// Cell exists, but is inactive
if ( !cellInfo->IsActive() )
{
sLog.outDetail("Activated cell [%u,%u] on map %d (instance %d).", x, y, _mapId, m_instanceID );
_map->CellGoneActive( x , y );
cellInfo->SetActivity( true );
if (!cellInfo->IsLoaded())
{
//sLog.outDetail("Loading objects for Cell [%d][%d] on map %d (instance %d)...",
// posX, posY, this->_mapId, m_instanceID);
spawns = _map->GetSpawnsList( x , y );
if( spawns )
cellInfo->LoadObjects( spawns );
}
}
}
}
}
}
示例2: 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;
}
示例3: PushObject
//.........这里部分代码省略.........
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) ) );
}
}break;
case HIGHGUID_TYPE_DYNAMICOBJECT:
m_DynamicObjectStorage[obj->GetLowGUID()] = (DynamicObject*)obj;
break;
}
}
// Handle activation of that object.
if(objCell->IsActive() && obj->CanActivate())
obj->Activate(this);
// Add the session to our set if it is a player.
if(plObj)
{
Sessions.insert(plObj->GetSession());
// Change the instance ID, this will cause it to be removed from the world thread (return value 1)
plObj->GetSession()->SetInstance(GetInstanceID());
/* Add the map wide objects */
if(_mapWideStaticObjects.size())
{
if(!buf)
buf = new ByteBuffer(300);
for(set<Object*>::iterator itr = _mapWideStaticObjects.begin(); itr != _mapWideStaticObjects.end(); ++itr)
{
count = (*itr)->BuildCreateUpdateBlockForPlayer(buf, plObj);
plObj->PushCreationData(buf, count);
}
}
}
if(buf)
delete buf;
if(plObj && InactiveMoveTime && !forced_expire)
InactiveMoveTime = 0;
}
示例4: UpdateCellActivity
void MapMgr::UpdateCellActivity(uint32 x, uint32 y, int radius)
{
CellSpawns * sp;
uint32 endX = (x + radius) <= _sizeX ? x + radius : (_sizeX-1);
uint32 endY = (y + radius) <= _sizeY ? y + radius : (_sizeY-1);
uint32 startX = x - radius > 0 ? x - radius : 0;
uint32 startY = y - radius > 0 ? y - radius : 0;
uint32 posX, posY;
MapCell *objCell;
for (posX = startX; posX <= endX; posX++ )
{
for (posY = startY; posY <= endY; posY++ )
{
objCell = GetCell(posX, posY);
if (!objCell)
{
if (_CellActive(posX, posY))
{
objCell = Create(posX, posY);
objCell->Init(posX, posY, _mapId, this);
sLog.outDetail("Cell [%d,%d] on map %d (instance %d) is now active.",
posX, posY, this->_mapId, m_instanceID);
objCell->SetActivity(true);
_map->CellGoneActive(posX, posY);
ASSERT(!objCell->IsLoaded());
sLog.outDetail("Loading objects for Cell [%d][%d] on map %d (instance %d)...",
posX, posY, this->_mapId, m_instanceID);
sp = _map->GetSpawnsList(posX, posY);
if(sp) objCell->LoadObjects(sp);
}
}
else
{
//Cell is now active
if (_CellActive(posX, posY) && !objCell->IsActive())
{
sLog.outDetail("Cell [%d,%d] on map %d (instance %d) is now active.",
posX, posY, this->_mapId, m_instanceID);
_map->CellGoneActive(posX, posY);
objCell->SetActivity(true);
if (!objCell->IsLoaded())
{
sLog.outDetail("Loading objects for Cell [%d][%d] on map %d (instance %d)...",
posX, posY, this->_mapId, m_instanceID);
sp = _map->GetSpawnsList(posX, posY);
if(sp) objCell->LoadObjects(sp);
}
}
//Cell is no longer active
else if (!_CellActive(posX, posY) && objCell->IsActive())
{
sLog.outDetail("Cell [%d,%d] on map %d (instance %d) is now idle.",
posX, posY, this->_mapId, m_instanceID);
_map->CellGoneIdle(posX, posY);
objCell->SetActivity(false);
}
}
}
}
}
示例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
//.........这里部分代码省略.........
//////////////////////
// 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)
{
_sqlids_gameobjects.insert(make_pair(TO_GAMEOBJECT(obj)->m_spawn->id, TO_GAMEOBJECT(obj)));
}
}
break;
case HIGHGUID_TYPE_DYNAMICOBJECT:
m_DynamicObjectStorage[obj->GetLowGUID()] = (DynamicObject*)obj;
break;
}
}
// Handle activation of that object.
if(objCell->IsActive() && obj->CanActivate())
obj->Activate(this);
// Add the session to our set if it is a player.
if(plObj != NULL)
{
Sessions.insert(plObj->GetSession());
// Change the instance ID, this will cause it to be removed from the world thread (return value 1)
plObj->GetSession()->SetInstance(GetInstanceID());
/* Add the map wide objects */
if(_mapWideStaticObjects.size())
{
uint32 globalcount = 0;
if(!buf)
buf = new ByteBuffer(300);
for(set<Object*>::iterator itr = _mapWideStaticObjects.begin(); itr != _mapWideStaticObjects.end(); ++itr)
{
count = (*itr)->BuildCreateUpdateBlockForPlayer(buf, plObj);
globalcount += count;
}
//VLack: It seems if we use the same buffer then it is a BAD idea to try and push created data one by one, add them at once!
// If you try to add them one by one, then as the buffer already contains data, they'll end up repeating some object.
// Like 6 object updates for Deeprun Tram, but the built package will contain these entries: 2AFD0, 2AFD0, 2AFD1, 2AFD0, 2AFD1, 2AFD2
if(globalcount > 0) plObj->PushCreationData(buf, globalcount);
}
}
if(buf)
delete buf;
if(plObj != NULL && InactiveMoveTime && !forced_expire)
InactiveMoveTime = 0;
}
示例7: UpdateCellActivity
void MapMgr::UpdateCellActivity(uint32 x, uint32 y, uint32 radius)
{
CellSpawns* sp;
uint32 endX = (x + radius) <= _sizeX ? x + radius : (_sizeX - 1);
uint32 endY = (y + radius) <= _sizeY ? y + radius : (_sizeY - 1);
uint32 startX = x > radius ? x - radius : 0;
uint32 startY = y > radius ? y - radius : 0;
uint32 posX, posY;
MapCell* objCell;
for(posX = startX; posX <= endX; posX++)
{
for(posY = startY; posY <= endY; posY++)
{
objCell = GetCell(posX, posY);
if(!objCell)
{
if(_CellActive(posX, posY))
{
objCell = Create(posX, posY);
objCell->Init(posX, posY, this);
LOG_DETAIL("Cell [%u,%u] on map %u (instance %u) is now active.",
posX, posY, this->_mapId, m_instanceID);
objCell->SetActivity(true);
_map->CellGoneActive(posX, posY);
_terrain->LoadTile((int32)posX / 8, (int32)posY / 8);
ARCEMU_ASSERT(!objCell->IsLoaded());
LOG_DETAIL("Loading objects for Cell [%u][%u] on map %u (instance %u)...",
posX, posY, this->_mapId, m_instanceID);
sp = _map->GetSpawnsList(posX, posY);
if(sp) objCell->LoadObjects(sp);
}
}
else
{
//Cell is now active
if(_CellActive(posX, posY) && !objCell->IsActive())
{
LOG_DETAIL("Cell [%u,%u] on map %u (instance %u) is now active.",
posX, posY, this->_mapId, m_instanceID);
_map->CellGoneActive(posX, posY);
_terrain->LoadTile((int32)posX / 8, (int32)posY / 8);
objCell->SetActivity(true);
if(!objCell->IsLoaded())
{
LOG_DETAIL("Loading objects for Cell [%u][%u] on map %u (instance %u)...",
posX, posY, this->_mapId, m_instanceID);
sp = _map->GetSpawnsList(posX, posY);
if(sp) objCell->LoadObjects(sp);
}
}
//Cell is no longer active
else if(!_CellActive(posX, posY) && objCell->IsActive())
{
LOG_DETAIL("Cell [%u,%u] on map %u (instance %u) is now idle.", posX, posY, _mapId, m_instanceID);
_map->CellGoneIdle(posX, posY);
objCell->SetActivity(false);
_terrain->UnloadTile((int32)posX / 8, (int32)posY / 8);
}
}
}
}
}