本文整理汇总了C++中MapCell::Init方法的典型用法代码示例。如果您正苦于以下问题:C++ MapCell::Init方法的具体用法?C++ MapCell::Init怎么用?C++ MapCell::Init使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类MapCell
的用法示例。
在下文中一共展示了MapCell::Init方法的8个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: SetCellForcedStates
void MoonInstanceScript::SetCellForcedStates(float pMinX, float pMaxX, float pMinY, float pMaxY, bool pActivate)
{
if(pMinX == pMaxX || pMinY == pMaxY)
return;
float Y = pMinY;
while(pMinX < pMaxX)
{
while(pMinY < pMaxY)
{
MapCell* CurrentCell = mInstance->GetCellByCoords(pMinX, pMinY);
if(pActivate && CurrentCell == NULL)
{
CurrentCell = mInstance->CreateByCoords(pMinX, pMinY);
if(CurrentCell != NULL)
CurrentCell->Init(mInstance->GetPosX(pMinX), mInstance->GetPosY(pMinY), mInstance);
}
if(CurrentCell != NULL)
pActivate ? mInstance->AddForcedCell(CurrentCell) : mInstance->RemoveForcedCell(CurrentCell);
pMinY += 40.0f;
}
pMinY = Y;
pMinX += 40.0f;
}
}
示例2: 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 );
}
}
}
}
}
}
示例3: 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;
}
示例4: PushObject
void MapMgr::PushObject(Object *obj)
{
/////////////
// Assertions
/////////////
ASSERT(obj);
// 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
return;
}
if(obj->GetTypeId() == TYPEID_CORPSE)
{
m_corpses.insert(((Corpse*)obj));
}
obj->ClearInRangeSet();
ASSERT(obj->GetMapId() == _mapId);
if(!(obj->GetPositionX() < _maxX && obj->GetPositionX() > _minX) ||
!(obj->GetPositionY() < _maxY && obj->GetPositionY() > _minY))
{
if(obj->IsPlayer())
{
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);
}
}
ASSERT(obj->GetPositionY() < _maxY && obj->GetPositionY() > _minY);
ASSERT(_cells);
///////////////////////
// Get cell coordinates
///////////////////////
uint32 x = GetPosX(obj->GetPositionX());
uint32 y = GetPosY(obj->GetPositionY());
if(x >= _sizeX || y >= _sizeY)
{
if(obj->IsPlayer())
{
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);
}
x = GetPosX(obj->GetPositionX());
y = GetPosY(obj->GetPositionY());
}
MapCell *objCell = GetCell(x,y);
if (!objCell)
{
objCell = Create(x,y);
objCell->Init(x, y, _mapId, this);
}
uint32 endX = (x <= _sizeX) ? x + 1 : (_sizeX-1);
uint32 endY = (y <= _sizeY) ? y + 1 : (_sizeY-1);
uint32 startX = x > 0 ? x - 1 : 0;
uint32 startY = y > 0 ? y - 1 : 0;
uint32 posX, posY;
MapCell *cell;
//.........这里部分代码省略.........
示例5: 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);
}
}
}
}
}
示例6: ChangeObjectLocation
//.........这里部分代码省略.........
{
if(plObj->GetBindMapId() != GetMapId())
{
plObj->SafeTeleport(plObj->GetBindMapId(), 0, plObj->GetBindPositionX(), plObj->GetBindPositionY(), plObj->GetBindPositionZ(), 0);
plObj->GetSession()->SystemMessage("Teleported you to your hearthstone location as you were out of the map boundaries.");
return;
}
else
{
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 ||
示例7: PushObject
void MapMgr::PushObject(Object* obj)
{
/////////////
// Assertions
/////////////
ARCEMU_ASSERT(obj != NULL);
// That object types are not map objects. TODO: add AI groups here?
if(obj->IsItem() || obj->IsContainer())
{
// mark object as updatable and exit
return;
}
if(obj->IsCorpse())
{
m_corpses.insert(TO< Corpse* >(obj));
}
obj->ClearInRangeSet();
ARCEMU_ASSERT(obj->GetMapId() == _mapId);
if(!(obj->GetPositionX() < _maxX && obj->GetPositionX() > _minX) ||
!(obj->GetPositionY() < _maxY && obj->GetPositionY() > _minY))
{
if(obj->IsPlayer())
{
Player* plr = TO< 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.");
plr->SendTeleportAckMsg(plr->GetPosition());
}
}
else
{
obj->GetPositionV()->ChangeCoords(0, 0, 0, 0);
}
}
ARCEMU_ASSERT(obj->GetPositionY() < _maxY && obj->GetPositionY() > _minY);
ARCEMU_ASSERT(_cells != NULL);
///////////////////////
// Get cell coordinates
///////////////////////
uint32 x = GetPosX(obj->GetPositionX());
uint32 y = GetPosY(obj->GetPositionY());
if(x >= _sizeX || y >= _sizeY)
{
if(obj->IsPlayer())
{
Player* plr = TO< 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.");
plr->SendTeleportAckMsg(plr->GetPosition());
}
}
else
{
obj->GetPositionV()->ChangeCoords(0, 0, 0, 0);
}
x = GetPosX(obj->GetPositionX());
y = GetPosY(obj->GetPositionY());
}
MapCell* objCell = GetCell(x, y);
if(objCell == NULL)
{
objCell = Create(x, y);
objCell->Init(x, y, this);
}
ARCEMU_ASSERT(objCell != NULL);
uint32 endX = (x <= _sizeX) ? x + 1 : (_sizeX - 1);
uint32 endY = (y <= _sizeY) ? y + 1 : (_sizeY - 1);
uint32 startX = x > 0 ? x - 1 : 0;
uint32 startY = y > 0 ? y - 1 : 0;
uint32 posX, posY;
MapCell* cell;
//MapCell::ObjectSet::iterator iter;
//.........这里部分代码省略.........
示例8: 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);
}
}
}
}
}