From 03fed3c7a4c00930a59ae9681a3862fb8dfe1a60 Mon Sep 17 00:00:00 2001 From: Rat Date: Fri, 31 Oct 2014 00:05:13 +0100 Subject: [PATCH] Core/Phases: implemented usage of default terrain swaps - added example for Gilneas (from sniff) --- sql/updates/world/2014_10_30_01_world.sql | 3 +++ src/server/game/Entities/Object/Object.cpp | 15 +++++++++++++-- src/server/game/Entities/Player/Player.cpp | 2 ++ src/server/game/Globals/ObjectMgr.cpp | 13 ++++++++----- src/server/game/Maps/Map.cpp | 6 ++---- 5 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 sql/updates/world/2014_10_30_01_world.sql diff --git a/sql/updates/world/2014_10_30_01_world.sql b/sql/updates/world/2014_10_30_01_world.sql new file mode 100644 index 0000000000..025fc49386 --- /dev/null +++ b/sql/updates/world/2014_10_30_01_world.sql @@ -0,0 +1,3 @@ +DELETE FROM `terrain_phase_info` WHERE `Id` = 0; +INSERT INTO `terrain_phase_info` (Id, TerrainSwapMap, Comment) VALUES +(0, 638, 'Gilneas default terrain swap'); diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 0b01da98b4..89e2cf166e 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -2928,11 +2928,11 @@ void WorldObject::RebuildTerrainSwaps() ConditionList conditions; // Check all applied phases for terrain swap and add it only once - for (auto phaseId : _phases) + for (uint32 phaseId : _phases) { std::list& swaps = sObjectMgr->GetPhaseTerrainSwaps(phaseId); - for (auto swap : swaps) + for (uint32 swap : swaps) { conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_TERRAIN_SWAP, swap); @@ -2940,4 +2940,15 @@ void WorldObject::RebuildTerrainSwaps() _terrainSwaps.insert(swap); } } + + // get default terrain swaps, id is 0 + std::list& swaps = sObjectMgr->GetPhaseTerrainSwaps(0); + + for (uint32 swap : swaps) + { + conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_TERRAIN_SWAP, swap); + + if (sConditionMgr->IsObjectMeetToConditions(this, conditions)) + _terrainSwaps.insert(swap); + } } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index e811cfcee3..ccbb844de4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27993,6 +27993,8 @@ void Player::SendUpdatePhasing() if (!IsInWorld()) return; + RebuildTerrainSwaps(); // to set default maps swaps + std::set worldAreaSwaps; for (uint32 terrain : GetTerrainSwaps()) diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 5c9012facd..09643797a0 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -9319,13 +9319,16 @@ void ObjectMgr::LoadTerrainPhaseInfo() uint32 phaseId = fields[0].GetUInt32(); - PhaseEntry const* phase = sPhaseStore.LookupEntry(phaseId); - if (!phase) + // 0 is kept for default map swaps + if (phaseId) { - TC_LOG_ERROR("sql.sql", "Phase %u defined in `terrain_phase_info` does not exist, skipped.", phaseId); - continue; + PhaseEntry const* phase = sPhaseStore.LookupEntry(phaseId); + if (!phase) + { + TC_LOG_ERROR("sql.sql", "Phase %u defined in `terrain_phase_info` does not exist, skipped.", phaseId); + continue; + } } - uint32 terrainSwap = fields[1].GetUInt32(); _terrainPhaseInfoStore[phaseId].push_back(terrainSwap); diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index cdd43f8298..0ccd5a7765 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -488,6 +488,8 @@ bool Map::AddPlayerToMap(Player* player) player->m_clientGUIDs.clear(); player->UpdateObjectVisibility(false); + player->SendUpdatePhasing(); + sScriptMgr->OnPlayerEnterMap(this, player); return true; } @@ -548,10 +550,6 @@ bool Map::AddToMap(T* obj) obj->RebuildTerrainSwaps(); - // packets are only sent to players - if (obj->GetTypeId() == TYPEID_PLAYER) - obj->ToPlayer()->SendUpdatePhasing(); - //something, such as vehicle, needs to be update immediately //also, trigger needs to cast spell, if not update, cannot see visual obj->UpdateObjectVisibility(true);