aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/2014_06_02_00_world_phases_434.sql6
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp3
-rw-r--r--src/server/game/Entities/Player/Player.cpp3
-rw-r--r--src/server/game/Entities/Transport/Transport.h2
-rw-r--r--src/server/game/Instances/InstanceScript.cpp3
-rw-r--r--src/server/game/Maps/Map.cpp22
-rw-r--r--src/server/game/Maps/Map.h1
-rw-r--r--src/server/game/Maps/TransportMgr.cpp15
-rw-r--r--src/server/game/Maps/TransportMgr.h2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp8
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)