diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 5e04e0ba61..b6a239274f 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -588,16 +588,20 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) if (t_diff) _dynamicTree.update(t_diff); - /// update worldsessions for existing players + // Update world sessions and players for (m_mapRefIter = m_mapRefMgr.begin(); m_mapRefIter != m_mapRefMgr.end(); ++m_mapRefIter) { Player* player = m_mapRefIter->GetSource(); if (player && player->IsInWorld()) { - //player->Update(t_diff); + // Update session WorldSession* session = player->GetSession(); MapSessionFilter updater(session); session->Update(s_diff, updater); + + // update players at tick + if (!t_diff) + player->Update(s_diff); } } @@ -605,17 +609,6 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) if (!t_diff) { - for (m_mapRefIter = m_mapRefMgr.begin(); m_mapRefIter != m_mapRefMgr.end(); ++m_mapRefIter) - { - Player* player = m_mapRefIter->GetSource(); - - if (!player || !player->IsInWorld()) - continue; - - // update players at tick - player->Update(s_diff); - } - HandleDelayedVisibility(); return; } @@ -624,36 +617,35 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) resetMarkedCells(); resetMarkedCellsLarge(); + // Prepare object updaters Acore::ObjectUpdater updater(t_diff, false); - // for creature - TypeContainerVisitor grid_object_update(updater); - // for pets - TypeContainerVisitor world_object_update(updater); + // For creature + TypeContainerVisitor grid_object_update(updater); - // for large creatures + // For pets + TypeContainerVisitor world_object_update(updater); + + // For large creatures Acore::ObjectUpdater largeObjectUpdater(t_diff, true); - TypeContainerVisitor grid_large_object_update(largeObjectUpdater); - TypeContainerVisitor world_large_object_update(largeObjectUpdater); + TypeContainerVisitor grid_large_object_update(largeObjectUpdater); + TypeContainerVisitor world_large_object_update(largeObjectUpdater); // pussywizard: container for far creatures in combat with players std::vector updateList; updateList.reserve(10); - // non-player active objects, increasing iterator in the loop in case of object removal + // Update non-player active objects for (m_activeNonPlayersIter = m_activeNonPlayers.begin(); m_activeNonPlayersIter != m_activeNonPlayers.end();) { WorldObject* obj = *m_activeNonPlayersIter; ++m_activeNonPlayersIter; - if (!obj || !obj->IsInWorld()) - continue; - - VisitNearbyCellsOf(obj, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update); + if (obj && obj->IsInWorld()) + VisitNearbyCellsOf(obj, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update); } - // the player iterator is stored in the map object - // to make sure calls to Map::Remove don't invalidate it + // Update players and their associated objects for (m_mapRefIter = m_mapRefMgr.begin(); m_mapRefIter != m_mapRefMgr.end(); ++m_mapRefIter) { Player* player = m_mapRefIter->GetSource(); @@ -661,12 +653,10 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) if (!player || !player->IsInWorld()) continue; - // update players at tick player->Update(s_diff); - VisitNearbyCellsOfPlayer(player, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update); - // If player is using far sight, visit that object too + // If player is using far sight, update viewpoint if (WorldObject* viewPoint = player->GetViewpoint()) { if (Creature* viewCreature = viewPoint->ToCreature()) @@ -684,7 +674,8 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) { updateList.clear(); float rangeSq = player->GetGridActivationRange() - 1.0f; - rangeSq = rangeSq * rangeSq; + rangeSq *= rangeSq; + HostileReference* ref = player->getHostileRefMgr().getFirst(); while (ref) { @@ -694,20 +685,20 @@ void Map::Update(const uint32 t_diff, const uint32 s_diff, bool /*thread*/) updateList.push_back(cre); ref = ref->next(); } - for (std::vector::const_iterator itr = updateList.begin(); itr != updateList.end(); ++itr) - VisitNearbyCellsOf(*itr, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update); + + for (Creature* cre : updateList) + VisitNearbyCellsOf(cre, grid_object_update, world_object_update, grid_large_object_update, world_large_object_update); } } - for (_transportsUpdateIter = _transports.begin(); _transportsUpdateIter != _transports.end();) // pussywizard: transports updated after VisitNearbyCellsOf, grids around are loaded, everything ok + // Update transports - pussywizard: transports updated after VisitNearbyCellsOf, grids around are loaded, everything ok + for (_transportsUpdateIter = _transports.begin(); _transportsUpdateIter != _transports.end();) { MotionTransport* transport = *_transportsUpdateIter; ++_transportsUpdateIter; - if (!transport->IsInWorld()) - continue; - - transport->Update(t_diff); + if (transport->IsInWorld()) + transport->Update(t_diff); } SendObjectUpdates(); @@ -1674,14 +1665,16 @@ bool Map::IsUnderWater(uint32 phaseMask, float x, float y, float z, float collis bool Map::HasEnoughWater(WorldObject const* searcher, float x, float y, float z) const { - LiquidData const& liquidData = const_cast(this)->GetLiquidData(searcher->GetPhaseMask(), x, y, z, searcher->GetCollisionHeight(), MAP_ALL_LIQUIDS); - return (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING) != 0 && HasEnoughWater(searcher, liquidData); -} + LiquidData const& liquidData = const_cast(this)->GetLiquidData( + searcher->GetPhaseMask(), x, y, z, searcher->GetCollisionHeight(), MAP_ALL_LIQUIDS); + + if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING) == 0) + return false; -bool Map::HasEnoughWater(WorldObject const* searcher, LiquidData const& liquidData) const -{ float minHeightInWater = searcher->GetMinHeightInWater(); - return liquidData.Level > INVALID_HEIGHT && liquidData.Level > liquidData.DepthLevel && liquidData.Level - liquidData.DepthLevel >= minHeightInWater; + return liquidData.Level > INVALID_HEIGHT && + liquidData.Level > liquidData.DepthLevel && + liquidData.Level - liquidData.DepthLevel >= minHeightInWater; } char const* Map::GetMapName() const