aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp24
-rw-r--r--src/server/game/Maps/PhaseMgr.cpp21
-rw-r--r--src/server/game/Maps/PhaseMgr.h4
3 files changed, 42 insertions, 7 deletions
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index be91a04061e..74975e48255 100644
--- a/src/server/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
@@ -928,6 +928,9 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
if (mask == GROUP_UPDATE_FLAG_NONE)
return;
+ std::set<uint32> phases;
+ player->GetPhaseMgr().GetActivePhases(phases);
+
if (mask & GROUP_UPDATE_FLAG_POWER_TYPE) // if update power type, update current/max power also
mask |= (GROUP_UPDATE_FLAG_CUR_POWER | GROUP_UPDATE_FLAG_MAX_POWER);
@@ -1155,9 +1158,10 @@ void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacke
if (mask & GROUP_UPDATE_FLAG_PHASE)
{
- *data << uint32(8); // either 0 or 8, same unk found in SMSG_PHASESHIFT
- *data << uint32(0); // byte count in next block
- // for (count) *data << uint16(phaseId)
+ data << uint32(phases.empty() ? 8 : 0);
+ data << uint32(phases.size());
+ for (std::set<uint32>::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
+ data << uint16(*itr);
}
}
@@ -1182,6 +1186,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData)
Pet* pet = player->GetPet();
Powers powerType = player->getPowerType();
+ std::set<uint32> phases;
+ player->GetPhaseMgr().GetActivePhases(phases);
WorldPacket data(SMSG_PARTY_MEMBER_STATS_FULL, 4+2+2+2+1+2*6+8+1+8);
data << uint8(0); // only for SMSG_PARTY_MEMBER_STATS_FULL, probably arena/bg related
@@ -1202,6 +1208,9 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData)
if (player->GetVehicle())
updateFlags |= GROUP_UPDATE_FLAG_VEHICLE_SEAT;
+ if (!phases.empty())
+ updateFlags |= GROUP_UPDATE_FLAG_PHASE;
+
uint16 playerStatus = MEMBER_STATUS_ONLINE;
if (player->IsPvP())
playerStatus |= MEMBER_STATUS_PVP;
@@ -1292,8 +1301,8 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData)
// GROUP_UPDATE_FLAG_PET_AURAS
uint64 petAuraMask = 0;
- maskPos = data.wpos();
data << uint8(1);
+ maskPos = data.wpos();
data << uint64(petAuraMask); // placeholder
data << uint32(MAX_AURAS); // count
if (pet)
@@ -1328,9 +1337,10 @@ void WorldSession::HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData)
if (updateFlags & GROUP_UPDATE_FLAG_PHASE)
{
- data << uint32(8); // either 0 or 8, same unk found in SMSG_PHASESHIFT
- data << uint32(0); // byte count in next block
- // for (count) *data << uint16(phaseId)
+ data << uint32(phases.empty() ? 8 : 0);
+ data << uint32(phases.size());
+ for (std::set<uint32>::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
+ data << uint16(*itr);
}
SendPacket(&data);
diff --git a/src/server/game/Maps/PhaseMgr.cpp b/src/server/game/Maps/PhaseMgr.cpp
index 0314a9605ba..87a7bc434ff 100644
--- a/src/server/game/Maps/PhaseMgr.cpp
+++ b/src/server/game/Maps/PhaseMgr.cpp
@@ -17,6 +17,7 @@
#include "PhaseMgr.h"
#include "Chat.h"
+#include "Group.h"
#include "Language.h"
#include "ObjectMgr.h"
#include "Player.h"
@@ -36,7 +37,10 @@ void PhaseMgr::Update()
return;
if (_UpdateFlags & PHASE_UPDATE_FLAG_CLIENTSIDE_CHANGED)
+ {
phaseData.SendPhaseshiftToPlayer();
+ player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_PHASE);
+ }
if (_UpdateFlags & PHASE_UPDATE_FLAG_SERVERSIDE_CHANGED)
phaseData.SendPhaseMaskToPlayer();
@@ -281,6 +285,18 @@ void PhaseData::SendPhaseshiftToPlayer()
player->GetSession()->SendSetPhaseShift(phaseIds, terrainswaps);
}
+void PhaseData::GetActivePhases(std::set<uint32>& phases) const
+{
+ for (PhaseInfoContainer::const_iterator itr = spellPhaseInfo.begin(); itr != spellPhaseInfo.end(); ++itr)
+ if (itr->second.phaseId)
+ phases.insert(itr->second.phaseId);
+
+ // Phase Definitions
+ for (std::list<PhaseDefinition const*>::const_iterator itr = activePhaseDefinitions.begin(); itr != activePhaseDefinitions.end(); ++itr)
+ if ((*itr)->phaseId)
+ phases.insert((*itr)->phaseId);
+}
+
void PhaseData::AddPhaseDefinition(PhaseDefinition const* phaseDefinition)
{
if (phaseDefinition->IsOverwritingExistingPhases())
@@ -380,3 +396,8 @@ bool PhaseMgr::IsConditionTypeSupported(ConditionTypes conditionType)
return false;
}
}
+
+void PhaseMgr::GetActivePhases(std::set<uint32>& phases) const
+{
+ phaseData.GetActivePhases(phases);
+}
diff --git a/src/server/game/Maps/PhaseMgr.h b/src/server/game/Maps/PhaseMgr.h
index 21f67038c3f..67313bd9940 100644
--- a/src/server/game/Maps/PhaseMgr.h
+++ b/src/server/game/Maps/PhaseMgr.h
@@ -105,6 +105,8 @@ struct PhaseData
void SendPhaseMaskToPlayer();
void SendPhaseshiftToPlayer();
+ void GetActivePhases(std::set<uint32>& phases) const;
+
private:
Player* player;
std::list<PhaseDefinition const*> activePhaseDefinitions;
@@ -155,6 +157,8 @@ public:
static bool IsConditionTypeSupported(ConditionTypes conditionType);
+ void GetActivePhases(std::set<uint32>& phases) const;
+
private:
void Recalculate();