diff options
| -rw-r--r-- | sql/updates/world/2014_06_02_00_world_phases_434.sql | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Transport/Transport.h | 2 | ||||
| -rw-r--r-- | src/server/game/Instances/InstanceScript.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 22 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.h | 1 | ||||
| -rw-r--r-- | src/server/game/Maps/TransportMgr.cpp | 15 | ||||
| -rw-r--r-- | src/server/game/Maps/TransportMgr.h | 2 | ||||
| -rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 8 |
10 files changed, 56 insertions, 9 deletions
diff --git a/sql/updates/world/2014_06_02_00_world_phases_434.sql b/sql/updates/world/2014_06_02_00_world_phases_434.sql index e36d4f50deb..1c1b0a19f23 100644 --- a/sql/updates/world/2014_06_02_00_world_phases_434.sql +++ b/sql/updates/world/2014_06_02_00_world_phases_434.sql @@ -24,4 +24,8 @@ CREATE TABLE `phase_info` ( `terrainswapmap` int(10) unsigned NOT NULL DEFAULT '0', `comment` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=MyISAM DEFAULT CHARSET=utf8;
\ No newline at end of file +) ENGINE=MyISAM DEFAULT CHARSET=utf8; + +ALTER TABLE `transports` + ADD COLUMN `phaseid` INT(10) NOT NULL DEFAULT 0 AFTER `name`, + ADD COLUMN `phasegroup` INT(10) NOT NULL DEFAULT 0 AFTER `phaseid`;
\ No newline at end of file diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index f399686d5d5..a8e32b82f01 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -81,6 +81,9 @@ bool AreaTrigger::CreateAreaTrigger(uint32 guidlow, uint32 triggerEntry, Unit* c SetFloatValue(AREATRIGGER_FINAL_POS + 1, pos.GetPositionY()); SetFloatValue(AREATRIGGER_FINAL_POS + 2, pos.GetPositionZ()); + for (auto phase : caster->GetPhases()) + SetInPhase(phase, false, true); + if (!GetMap()->AddToMap(this)) return false; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 07f62adfc44..a018985f1cc 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -27880,6 +27880,9 @@ void Player::ReadMovementInfo(WorldPacket& data, MovementInfo* mi, Movement::Ext void Player::UpdatePhasing() { + if (!IsInWorld()) + return; + std::set<uint32> phaseIds; std::set<uint32> terrainswaps; std::set<uint32> worldAreaSwaps; diff --git a/src/server/game/Entities/Transport/Transport.h b/src/server/game/Entities/Transport/Transport.h index 293d4334a2e..cfa8439f829 100644 --- a/src/server/game/Entities/Transport/Transport.h +++ b/src/server/game/Entities/Transport/Transport.h @@ -27,7 +27,7 @@ struct CreatureData; class Transport : public GameObject, public TransportBase { - friend Transport* TransportMgr::CreateTransport(uint32, uint32, Map*); + friend Transport* TransportMgr::CreateTransport(uint32, uint32, Map*, uint32, uint32); Transport(); public: diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index a02206695a3..c8d495baab2 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -469,9 +469,8 @@ void InstanceScript::UpdateEncounterState(EncounterCreditType type, uint32 credi void InstanceScript::UpdatePhasing() { - /* Map::PlayerList const& players = instance->GetPlayers(); for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) if (Player* player = itr->GetSource()) - */ + player->UpdatePhasing(); } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 22c0b332f33..c086eb48263 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -2526,7 +2526,7 @@ void Map::SendInitTransports(Player* player) // Hack to send out transports UpdateData transData(player->GetMapId()); for (TransportsContainer::const_iterator i = _transports.begin(); i != _transports.end(); ++i) - if (*i != player->GetTransport()) + if (*i != player->GetTransport() && player->IsInPhase(*i)) (*i)->BuildCreateUpdateBlockForPlayer(&transData, player); WorldPacket packet; @@ -2547,6 +2547,26 @@ void Map::SendRemoveTransports(Player* player) player->GetSession()->SendPacket(&packet); } +void Map::SendUpdateTransportVisibility(Player* player, std::set<uint32> const& previousPhases) +{ + // Hack to send out transports + UpdateData transData(player->GetMapId()); + for (TransportsContainer::const_iterator i = _transports.begin(); i != _transports.end(); ++i) + { + if (*i == player->GetTransport()) + continue; + + if (player->IsInPhase(*i) && !Trinity::Containers::Intersects(previousPhases.begin(), previousPhases.end(), (*i)->GetPhases().begin(), (*i)->GetPhases().end())) + (*i)->BuildCreateUpdateBlockForPlayer(&transData); + else if (!player->IsInPhase(*i)) + (*i)->BuildOutOfRangeUpdateBlock(&transData); + } + + WorldPacket packet; + transData.BuildPacket(&packet); + player->GetSession()->SendPacket(&packet); +} + inline void Map::setNGrid(NGridType *grid, uint32 x, uint32 y) { if (x >= MAX_NUMBER_OF_GRIDS || y >= MAX_NUMBER_OF_GRIDS) diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h index c160d7a0f91..3b66fd0fed5 100644 --- a/src/server/game/Maps/Map.h +++ b/src/server/game/Maps/Map.h @@ -510,6 +510,7 @@ class Map : public GridRefManager<NGridType> void SendInitTransports(Player* player); void SendRemoveTransports(Player* player); + void SendUpdateTransportVisibility(Player* player, std::set<uint32> const& previousPhases); void SendZoneDynamicInfo(Player* player); void SetZoneMusic(uint32 zoneId, uint32 musicId); diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp index 28869d264c4..ba7d3784157 100644 --- a/src/server/game/Maps/TransportMgr.cpp +++ b/src/server/game/Maps/TransportMgr.cpp @@ -348,7 +348,7 @@ void TransportMgr::AddPathNodeToTransport(uint32 transportEntry, uint32 timeSeg, animNode.Path[timeSeg] = node; } -Transport* TransportMgr::CreateTransport(uint32 entry, uint32 guid /*= 0*/, Map* map /*= NULL*/) +Transport* TransportMgr::CreateTransport(uint32 entry, uint32 guid /*= 0*/, Map* map /*= NULL*/, uint32 phaseid /*= 0*/, uint32 phasegroup /*= 0*/) { // instance case, execute GetGameObjectEntry hook if (map) @@ -388,6 +388,13 @@ Transport* TransportMgr::CreateTransport(uint32 entry, uint32 guid /*= 0*/, Map* return NULL; } + if (phaseid) + trans->SetInPhase(phaseid, false, true); + + if (phasegroup) + for (auto ph : GetPhasesForGroup(phasegroup)) + trans->SetInPhase(ph, false, true); + if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId)) { if (mapEntry->Instanceable() != tInfo->inInstance) @@ -416,7 +423,7 @@ void TransportMgr::SpawnContinentTransports() uint32 oldMSTime = getMSTime(); - QueryResult result = WorldDatabase.Query("SELECT guid, entry FROM transports"); + QueryResult result = WorldDatabase.Query("SELECT guid, entry, phaseid, phasegroup FROM transports"); uint32 count = 0; if (result) @@ -426,10 +433,12 @@ void TransportMgr::SpawnContinentTransports() Field* fields = result->Fetch(); uint32 guid = fields[0].GetUInt32(); uint32 entry = fields[1].GetUInt32(); + uint32 phaseid = fields[2].GetUInt32(); + uint32 phasegroup = fields[3].GetUInt32(); if (TransportTemplate const* tInfo = GetTransportTemplate(entry)) if (!tInfo->inInstance) - if (CreateTransport(entry, guid)) + if (CreateTransport(entry, guid, nullptr, phaseid, phasegroup)) ++count; } while (result->NextRow()); diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 5da856b185c..759b761c3f1 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -105,7 +105,7 @@ class TransportMgr void LoadTransportTemplates(); // Creates a transport using given GameObject template entry - Transport* CreateTransport(uint32 entry, uint32 guid = 0, Map* map = NULL); + Transport* CreateTransport(uint32 entry, uint32 guid = 0, Map* map = nullptr, uint32 phaseid = 0, uint32 phasegroup = 0); // Spawns all continent transports, used at core startup void SpawnContinentTransports(); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index ff7c650a8cf..55c3357cc4f 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1606,8 +1606,12 @@ void AuraEffect::HandlePhase(AuraApplication const* aurApp, uint8 mode, bool app Unit* target = aurApp->GetTarget(); + std::set<uint32> const& oldPhases = target->GetPhases(); target->SetInPhase(GetMiscValueB(), false, apply); + if (target->IsInWorld()) + target->GetMap()->SendUpdateTransportVisibility(target, oldPhases); + // call functions which may have additional effects after chainging state of unit // phase auras normally not expected at BG but anyway better check if (apply) @@ -1631,10 +1635,14 @@ void AuraEffect::HandlePhaseGroup(AuraApplication const* aurApp, uint8 mode, boo Unit* target = aurApp->GetTarget(); + std::set<uint32> const& oldPhases = target->GetPhases(); std::set<uint32> const& phases = GetPhasesForGroup(GetMiscValueB()); for (auto phase : phases) target->SetInPhase(phase, false, apply); + if (target->IsInWorld()) + target->GetMap()->SendUpdateTransportVisibility(target, oldPhases); + // call functions which may have additional effects after chainging state of unit // phase auras normally not expected at BG but anyway better check if (apply) |
