Merge branch 'master' into Playerbot

This commit is contained in:
Yunfan Li
2025-08-09 15:02:41 +08:00
92 changed files with 1095 additions and 752 deletions

View File

@@ -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