aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Server
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2018-01-28 11:37:20 +0100
committerShauren <shauren.trinity@gmail.com>2018-03-25 19:28:36 +0300
commit91be2332e249147ce3169c46a7da77f0f8c2211d (patch)
treeeab9e0ab76ae523f7a843fe1c2300eba17f53af2 /src/server/game/Server
parent1e62b53c66829dc9820117e17bfb44cb2652f814 (diff)
Core/Entities: Phasing rewrite
* Optimized phase visibility checking * Handle all phase flags Closes #16758 Closes #21119
Diffstat (limited to 'src/server/game/Server')
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp48
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h29
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp12
-rw-r--r--src/server/game/Server/WorldSession.h2
4 files changed, 51 insertions, 40 deletions
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index e5795b6b7f4..a03f1ff35fc 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -376,29 +376,39 @@ WorldPacket const* WorldPackets::Misc::RandomRoll::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Misc::PhaseShift::Write()
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Misc::PhaseShiftDataPhase const& phaseShiftDataPhase)
{
- _worldPacket << ClientGUID; // CLientGUID
- _worldPacket << uint32(PhaseShifts.size() ? 0 : 8); // PhaseShiftFlags
- _worldPacket << uint32(PhaseShifts.size()); // PhaseShiftCount
- _worldPacket << PersonalGUID; // PersonalGUID
- for (uint32 phase : PhaseShifts)
- {
- _worldPacket << uint16(1); // PhaseFlags
- _worldPacket << uint16(phase); // PhaseID
- }
+ data << uint16(phaseShiftDataPhase.PhaseFlags);
+ data << uint16(phaseShiftDataPhase.Id);
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Misc::PhaseShiftData const& phaseShiftData)
+{
+ data << uint32(phaseShiftData.PhaseShiftFlags);
+ data << uint32(phaseShiftData.Phases.size());
+ data << phaseShiftData.PersonalGUID;
+ for (WorldPackets::Misc::PhaseShiftDataPhase const& phaseShiftDataPhase : phaseShiftData.Phases)
+ data << phaseShiftDataPhase;
+
+ return data;
+}
- _worldPacket << uint32(VisibleMapIDs.size() * 2); // Active terrain swaps size
- for (uint32 map : VisibleMapIDs)
- _worldPacket << uint16(map); // Active terrain swap map id
+WorldPacket const* WorldPackets::Misc::PhaseShiftChange::Write()
+{
+ _worldPacket << Client;
+ _worldPacket << Phaseshift;
+ _worldPacket << uint32(VisibleMapIDs.size() * 2); // size in bytes
+ for (uint16 visibleMapId : VisibleMapIDs)
+ _worldPacket << uint16(visibleMapId); // Active terrain swap map id
- _worldPacket << uint32(PreloadMapIDs.size() * 2); // Inactive terrain swaps size
- for (uint32 map : PreloadMapIDs)
- _worldPacket << uint16(map); // Inactive terrain swap map id
+ _worldPacket << uint32(PreloadMapIDs.size() * 2); // size in bytes
+ for (uint16 preloadMapId : PreloadMapIDs)
+ _worldPacket << uint16(preloadMapId); // Inactive terrain swap map id
- _worldPacket << uint32(UiWorldMapAreaIDSwaps.size() * 2); // UI map swaps size
- for (uint32 map : UiWorldMapAreaIDSwaps)
- _worldPacket << uint16(map); // UI map id, WorldMapArea.dbc, controls map display
+ _worldPacket << uint32(UiWorldMapAreaIDSwaps.size() * 2); // size in bytes
+ for (uint16 uiWorldMapAreaIDSwap : UiWorldMapAreaIDSwaps)
+ _worldPacket << uint16(uiWorldMapAreaIDSwap); // UI map id, WorldMapArea.db2, controls map display
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index e875885864f..26affbaf934 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -28,7 +28,6 @@
#include "SharedDefines.h"
#include <array>
#include <map>
-#include <set>
enum MountStatusFlags : uint8;
enum UnitStandStateType : uint8;
@@ -529,19 +528,31 @@ namespace WorldPackets
WorldPacket const* Write() override { return &_worldPacket; }
};
- class PhaseShift final : public ServerPacket
+ struct PhaseShiftDataPhase
+ {
+ uint16 PhaseFlags = 0;
+ uint16 Id = 0;
+ };
+
+ struct PhaseShiftData
+ {
+ uint32 PhaseShiftFlags = 0;
+ std::vector<PhaseShiftDataPhase> Phases;
+ ObjectGuid PersonalGUID;
+ };
+
+ class PhaseShiftChange final : public ServerPacket
{
public:
- PhaseShift() : ServerPacket(SMSG_PHASE_SHIFT_CHANGE, 4) { }
+ PhaseShiftChange() : ServerPacket(SMSG_PHASE_SHIFT_CHANGE, 16 + 4 + 4 + 16 + 4 + 4 + 4) { }
WorldPacket const* Write() override;
- ObjectGuid ClientGUID;
- ObjectGuid PersonalGUID;
- std::set<uint32> PhaseShifts;
- std::set<uint32> PreloadMapIDs;
- std::set<uint32> UiWorldMapAreaIDSwaps;
- std::set<uint32> VisibleMapIDs;
+ ObjectGuid Client;
+ PhaseShiftData Phaseshift;
+ std::vector<uint16> PreloadMapIDs;
+ std::vector<uint16> UiWorldMapAreaIDSwaps;
+ std::vector<uint16> VisibleMapIDs;
};
class ZoneUnderAttack final : public ServerPacket
diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp
index d3d1f45995d..939f0a65db1 100644
--- a/src/server/game/Server/Packets/PartyPackets.cpp
+++ b/src/server/game/Server/Packets/PartyPackets.cpp
@@ -17,6 +17,7 @@
#include "PartyPackets.h"
#include "Pet.h"
+#include "PhasingHandler.h"
#include "Player.h"
#include "Realm.h"
#include "SpellAuraEffects.h"
@@ -625,16 +626,7 @@ void WorldPackets::Party::PartyMemberState::Initialize(Player const* player)
}
// Phases
- std::set<uint32> const& phases = player->GetPhases();
- MemberStats.Phases.PhaseShiftFlags = 0x08 | (phases.size() ? 0x10 : 0);
- MemberStats.Phases.PersonalGUID = ObjectGuid::Empty;
- for (uint32 phaseId : phases)
- {
- WorldPackets::Party::PartyMemberPhase phase;
- phase.Id = phaseId;
- phase.Flags = 1;
- MemberStats.Phases.List.push_back(phase);
- }
+ PhasingHandler::FillPartyMemberPhase(&MemberStats.Phases, player->GetPhaseShift());
// Pet
if (player->GetPet())
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index 9de54534f0e..7346b14d312 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -31,7 +31,6 @@
#include "QueryCallbackProcessor.h"
#include "SharedDefines.h"
#include <array>
-#include <set>
#include <unordered_map>
#include <unordered_set>
@@ -908,7 +907,6 @@ class TC_GAME_API WorldSession
void SendNotification(uint32 stringId, ...);
void SendPetNameInvalid(uint32 error, std::string const& name, DeclinedName *declinedName);
void SendPartyResult(PartyOperation operation, std::string const& member, PartyResult res, uint32 val = 0);
- void SendSetPhaseShift(std::set<uint32> const& phaseIds, std::set<uint32> const& terrainswaps, std::set<uint32> const& worldMapAreaSwaps);
void SendQueryTimeResponse();
void SendAuthResponse(uint32 code, bool queued, uint32 queuePos = 0);