mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2026-01-14 09:39:11 +00:00
Merge branch 'master' into Playerbot
This commit is contained in:
@@ -55,16 +55,6 @@ Map::~Map()
|
||||
|
||||
sScriptMgr->OnDestroyMap(this);
|
||||
|
||||
while (!i_worldObjects.empty())
|
||||
{
|
||||
WorldObject* obj = *i_worldObjects.begin();
|
||||
ASSERT(obj->IsWorldObject());
|
||||
LOG_DEBUG("maps", "Map::~Map: WorldObject TypeId is not a corpse! ({})", static_cast<uint8>(obj->GetTypeId()));
|
||||
//ASSERT(obj->IsCorpse());
|
||||
obj->RemoveFromWorld();
|
||||
obj->ResetMap();
|
||||
}
|
||||
|
||||
if (!m_scriptSchedule.empty())
|
||||
sScriptMgr->DecreaseScheduledScriptCount(m_scriptSchedule.size());
|
||||
|
||||
@@ -73,8 +63,7 @@ Map::~Map()
|
||||
|
||||
Map::Map(uint32 id, uint32 InstanceId, uint8 SpawnMode, Map* _parent) :
|
||||
_mapGridManager(this), i_mapEntry(sMapStore.LookupEntry(id)), i_spawnMode(SpawnMode), i_InstanceId(InstanceId),
|
||||
m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE),
|
||||
_instanceResetPeriod(0), m_activeNonPlayersIter(m_activeNonPlayers.end()),
|
||||
m_unloadTimer(0), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), _instanceResetPeriod(0),
|
||||
_transportsUpdateIter(_transports.end()), i_scriptLock(false), _defaultLight(GetDefaultMapLight(id))
|
||||
{
|
||||
m_parentMap = (_parent ? _parent : this);
|
||||
@@ -117,20 +106,16 @@ template<class T>
|
||||
void Map::AddToGrid(T* obj, Cell const& cell)
|
||||
{
|
||||
MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
|
||||
if (obj->IsWorldObject())
|
||||
grid->AddWorldObject<T>(cell.CellX(), cell.CellY(), obj);
|
||||
else
|
||||
grid->AddGridObject<T>(cell.CellX(), cell.CellY(), obj);
|
||||
grid->AddGridObject<T>(cell.CellX(), cell.CellY(), obj);
|
||||
|
||||
obj->SetCurrentCell(cell);
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::AddToGrid(Creature* obj, Cell const& cell)
|
||||
{
|
||||
MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
|
||||
if (obj->IsWorldObject())
|
||||
grid->AddWorldObject(cell.CellX(), cell.CellY(), obj);
|
||||
else
|
||||
grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
|
||||
grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
|
||||
|
||||
obj->SetCurrentCell(cell);
|
||||
}
|
||||
@@ -145,15 +130,10 @@ void Map::AddToGrid(GameObject* obj, Cell const& cell)
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::AddToGrid(DynamicObject* obj, Cell const& cell)
|
||||
void Map::AddToGrid(Player* obj, Cell const& cell)
|
||||
{
|
||||
MapGridType* grid = GetMapGrid(cell.GridX(), cell.GridY());
|
||||
if (obj->IsWorldObject())
|
||||
grid->AddWorldObject(cell.CellX(), cell.CellY(), obj);
|
||||
else
|
||||
grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
|
||||
|
||||
obj->SetCurrentCell(cell);
|
||||
grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
|
||||
}
|
||||
|
||||
template<>
|
||||
@@ -167,12 +147,7 @@ void Map::AddToGrid(Corpse* obj, Cell const& cell)
|
||||
// so we need to explicitly check it here (Map::AddToGrid is only called from Player::BuildPlayerRepop, not from ObjectGridLoader)
|
||||
// to avoid failing an assertion in GridObject::AddToGrid
|
||||
if (grid->IsObjectDataLoaded())
|
||||
{
|
||||
if (obj->IsWorldObject())
|
||||
grid->AddWorldObject(cell.CellX(), cell.CellY(), obj);
|
||||
else
|
||||
grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
|
||||
}
|
||||
grid->AddGridObject(cell.CellX(), cell.CellY(), obj);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
@@ -289,7 +264,6 @@ bool Map::AddPlayerToMap(Player* player)
|
||||
SendInitSelf(player);
|
||||
SendZoneDynamicInfo(player);
|
||||
|
||||
player->m_clientGUIDs.clear();
|
||||
player->UpdateObjectVisibility(false);
|
||||
|
||||
if (player->IsAlive())
|
||||
@@ -358,9 +332,6 @@ bool Map::AddToMap(T* obj, bool checkTransport)
|
||||
|
||||
InitializeObject(obj);
|
||||
|
||||
if (obj->isActiveObject())
|
||||
AddToActive(obj);
|
||||
|
||||
//something, such as vehicle, needs to be update immediately
|
||||
//also, trigger needs to cast spell, if not update, cannot see visual
|
||||
obj->UpdateObjectVisibility(true);
|
||||
@@ -394,9 +365,6 @@ bool Map::AddToMap(MotionTransport* obj, bool /*checkTransport*/)
|
||||
|
||||
obj->AddToWorld();
|
||||
|
||||
if (obj->isActiveObject())
|
||||
AddToActive(obj);
|
||||
|
||||
_transports.insert(obj);
|
||||
|
||||
// Broadcast creation to players
|
||||
@@ -512,19 +480,6 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/)
|
||||
}
|
||||
}
|
||||
|
||||
if (_updatableObjectListRecheckTimer.Passed())
|
||||
{
|
||||
// Mark all cells near active objects
|
||||
for (m_activeNonPlayersIter = m_activeNonPlayers.begin(); m_activeNonPlayersIter != m_activeNonPlayers.end(); ++m_activeNonPlayersIter)
|
||||
{
|
||||
WorldObject* obj = *m_activeNonPlayersIter;
|
||||
if (!obj || !obj->IsInWorld())
|
||||
continue;
|
||||
|
||||
MarkNearbyCellsOf(obj);
|
||||
}
|
||||
}
|
||||
|
||||
UpdateNonPlayerObjects(t_diff);
|
||||
|
||||
SendObjectUpdates();
|
||||
@@ -676,13 +631,9 @@ void Map::RemovePlayerFromMap(Player* player, bool remove)
|
||||
player->UpdateZone(MAP_INVALID_ZONE, 0);
|
||||
player->getHostileRefMgr().deleteReferences(true); // pussywizard: multithreading crashfix
|
||||
|
||||
bool inWorld = player->IsInWorld();
|
||||
player->RemoveFromWorld();
|
||||
SendRemoveTransports(player);
|
||||
|
||||
if (!inWorld) // pussywizard: if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
|
||||
player->DestroyForNearbyPlayers(); // pussywizard: previous player->UpdateObjectVisibility(true)
|
||||
|
||||
if (player->IsInGrid())
|
||||
player->RemoveFromGrid();
|
||||
else
|
||||
@@ -702,15 +653,8 @@ void Map::AfterPlayerUnlinkFromMap()
|
||||
template<class T>
|
||||
void Map::RemoveFromMap(T* obj, bool remove)
|
||||
{
|
||||
bool inWorld = obj->IsInWorld() && obj->GetTypeId() >= TYPEID_UNIT && obj->GetTypeId() <= TYPEID_GAMEOBJECT;
|
||||
obj->RemoveFromWorld();
|
||||
|
||||
if (obj->isActiveObject())
|
||||
RemoveFromActive(obj);
|
||||
|
||||
if (!inWorld) // pussywizard: if was in world, RemoveFromWorld() called DestroyForNearbyPlayers()
|
||||
obj->DestroyForNearbyPlayers(); // pussywizard: previous player->UpdateObjectVisibility()
|
||||
|
||||
obj->RemoveFromGrid();
|
||||
|
||||
obj->ResetMap();
|
||||
@@ -726,8 +670,6 @@ template<>
|
||||
void Map::RemoveFromMap(MotionTransport* obj, bool remove)
|
||||
{
|
||||
obj->RemoveFromWorld();
|
||||
if (obj->isActiveObject())
|
||||
RemoveFromActive(obj);
|
||||
|
||||
Map::PlayerList const& players = GetPlayers();
|
||||
if (!players.IsEmpty())
|
||||
@@ -1653,6 +1595,9 @@ void Map::SendInitTransports(Player* player)
|
||||
if (*itr != player->GetTransport())
|
||||
(*itr)->BuildCreateUpdateBlockForPlayer(&transData, player);
|
||||
|
||||
if (!transData.HasData())
|
||||
return;
|
||||
|
||||
WorldPacket packet;
|
||||
transData.BuildPacket(packet);
|
||||
player->GetSession()->SendPacket(&packet);
|
||||
@@ -1667,7 +1612,7 @@ void Map::SendRemoveTransports(Player* player)
|
||||
(*itr)->BuildOutOfRangeUpdateBlock(&transData);
|
||||
|
||||
// pussywizard: remove static transports from client
|
||||
for (GuidUnorderedSet::const_iterator it = player->m_clientGUIDs.begin(); it != player->m_clientGUIDs.end(); )
|
||||
/*for (GuidUnorderedSet::const_iterator it = player->m_clientGUIDs.begin(); it != player->m_clientGUIDs.end(); )
|
||||
{
|
||||
if ((*it).IsTransport())
|
||||
{
|
||||
@@ -1676,7 +1621,10 @@ void Map::SendRemoveTransports(Player* player)
|
||||
}
|
||||
else
|
||||
++it;
|
||||
}
|
||||
}*/
|
||||
|
||||
if (!transData.HasData())
|
||||
return;
|
||||
|
||||
WorldPacket packet;
|
||||
transData.BuildPacket(packet);
|
||||
@@ -1686,7 +1634,6 @@ void Map::SendRemoveTransports(Player* player)
|
||||
void Map::SendObjectUpdates()
|
||||
{
|
||||
UpdateDataMapType update_players;
|
||||
UpdatePlayerSet player_set;
|
||||
|
||||
while (!_updateObjects.empty())
|
||||
{
|
||||
@@ -1694,7 +1641,7 @@ void Map::SendObjectUpdates()
|
||||
ASSERT(obj->IsInWorld());
|
||||
|
||||
_updateObjects.erase(_updateObjects.begin());
|
||||
obj->BuildUpdate(update_players, player_set);
|
||||
obj->BuildUpdate(update_players);
|
||||
}
|
||||
|
||||
WorldPacket packet; // here we allocate a std::vector with a size of 0x10000
|
||||
@@ -1830,60 +1777,6 @@ void Map::SendToPlayers(WorldPacket const* data) const
|
||||
itr->GetSource()->GetSession()->SendPacket(data);
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void Map::AddToActive(T* obj)
|
||||
{
|
||||
AddToActiveHelper(obj);
|
||||
}
|
||||
|
||||
template <>
|
||||
void Map::AddToActive(Creature* c)
|
||||
{
|
||||
AddToActiveHelper(c);
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::AddToActive(DynamicObject* d)
|
||||
{
|
||||
AddToActiveHelper(d);
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::AddToActive(GameObject* d)
|
||||
{
|
||||
AddToActiveHelper(d);
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::AddToActive(Corpse* /*c*/)
|
||||
{
|
||||
// do nothing for corpses
|
||||
}
|
||||
|
||||
template<class T>
|
||||
void Map::RemoveFromActive(T* obj)
|
||||
{
|
||||
RemoveFromActiveHelper(obj);
|
||||
}
|
||||
|
||||
template <>
|
||||
void Map::RemoveFromActive(Creature* c)
|
||||
{
|
||||
RemoveFromActiveHelper(c);
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::RemoveFromActive(DynamicObject* obj)
|
||||
{
|
||||
RemoveFromActiveHelper(obj);
|
||||
}
|
||||
|
||||
template<>
|
||||
void Map::RemoveFromActive(GameObject* obj)
|
||||
{
|
||||
RemoveFromActiveHelper(obj);
|
||||
}
|
||||
|
||||
template bool Map::AddToMap(Corpse*, bool);
|
||||
template bool Map::AddToMap(Creature*, bool);
|
||||
template bool Map::AddToMap(GameObject*, bool);
|
||||
@@ -2404,7 +2297,7 @@ GameObject* Map::GetGameObject(ObjectGuid const guid)
|
||||
|
||||
Pet* Map::GetPet(ObjectGuid const guid)
|
||||
{
|
||||
return _objectsStore.Find<Pet>(guid);
|
||||
return dynamic_cast<Pet*>(_objectsStore.Find<Creature>(guid));
|
||||
}
|
||||
|
||||
Transport* Map::GetTransport(ObjectGuid guid)
|
||||
@@ -2692,7 +2585,7 @@ void Map::RemoveCorpse(Corpse* corpse)
|
||||
ASSERT(corpse);
|
||||
GridCoord const gridCoord = Acore::ComputeGridCoord(corpse->GetPositionX(), corpse->GetPositionY());
|
||||
|
||||
corpse->DestroyForNearbyPlayers();
|
||||
corpse->DestroyForVisiblePlayers();
|
||||
if (corpse->IsInGrid())
|
||||
RemoveFromMap(corpse, false);
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user