diff --git a/src/server/game/Phasing/PhasingHandler.cpp b/src/server/game/Phasing/PhasingHandler.cpp index aa883f9606..7d54ef0bc9 100644 --- a/src/server/game/Phasing/PhasingHandler.cpp +++ b/src/server/game/Phasing/PhasingHandler.cpp @@ -22,6 +22,7 @@ #include "DBCStores.h" #include "Language.h" #include "Map.h" +#include "MiscPackets.h" #include "ObjectMgr.h" #include "PhaseShift.h" #include "Player.h" @@ -394,50 +395,20 @@ void PhasingHandler::OnConditionChange(WorldObject* object) void PhasingHandler::SendToPlayer(Player const* player, PhaseShift const& phaseShift) { - ObjectGuid guid = player->GetGUID(); + WorldPackets::Misc::PhaseShiftChange phaseShiftChange; + phaseShiftChange.Client = player->GetGUID(); + phaseShiftChange.Phaseshift.PhaseShiftFlags = phaseShift.Flags.AsUnderlyingType(); + phaseShiftChange.Phaseshift.Phases.reserve(phaseShift.Phases.size()); + std::transform(phaseShift.Phases.begin(), phaseShift.Phases.end(), std::back_inserter(phaseShiftChange.Phaseshift.Phases), + [](PhaseShift::PhaseRef const& phase) -> uint16{ return { phase.Id }; }); + phaseShiftChange.VisibleMapIDs.reserve(phaseShift.VisibleMapIds.size()); + std::transform(phaseShift.VisibleMapIds.begin(), phaseShift.VisibleMapIds.end(), std::back_inserter(phaseShiftChange.VisibleMapIDs), + [](PhaseShift::VisibleMapIdContainer::value_type const& visibleMapId) { return visibleMapId.first; }); + phaseShiftChange.UiMapPhaseIDs.reserve(phaseShift.UiMapPhaseIds.size()); + std::transform(phaseShift.UiMapPhaseIds.begin(), phaseShift.UiMapPhaseIds.end(), std::back_inserter(phaseShiftChange.UiMapPhaseIDs), + [](PhaseShift::UiMapPhaseIdContainer::value_type const& uiWorldMapAreaIdSwap) { return uiWorldMapAreaIdSwap.first; }); - WorldPacket data(SMSG_SET_PHASE_SHIFT, 1 + 8 + 4 + 4 + 4 + 4 + 2 * phaseShift.Phases.size() + 4 + phaseShift.VisibleMapIds.size() * 2); - data.WriteBit(guid[2]); - data.WriteBit(guid[3]); - data.WriteBit(guid[1]); - data.WriteBit(guid[6]); - data.WriteBit(guid[4]); - data.WriteBit(guid[5]); - data.WriteBit(guid[0]); - data.WriteBit(guid[7]); - - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[4]); - - data << uint32(phaseShift.UiMapPhaseIds.size()) * 2; - for (auto itr = phaseShift.UiMapPhaseIds.begin(); itr != phaseShift.UiMapPhaseIds.end(); ++itr) - data << uint16(itr->first); // WorldMapArea.dbc id (controls map display) - - data.WriteByteSeq(guid[1]); - - data << uint32(phaseShift.Flags.AsUnderlyingType()); // flags - - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[6]); - - data << uint32(0); // Inactive terrain swaps - //for (uint8 i = 0; i < inactiveSwapsCount; ++i) - // data << uint16(0); - - data << uint32(phaseShift.Phases.size()) * 2; // Phase.dbc ids - for (auto itr = phaseShift.Phases.begin(); itr != phaseShift.Phases.end(); ++itr) - data << uint16(itr->Id); - - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[0]); - - data << uint32(phaseShift.VisibleMapIds.size()) * 2; // Active terrain swaps - for (auto itr = phaseShift.VisibleMapIds.begin(); itr != phaseShift.VisibleMapIds.end(); ++itr) - data << uint16(itr->first); - - data.WriteByteSeq(guid[5]); - - player->SendDirectMessage(&data); + player->SendDirectMessage(phaseShiftChange.Write()); } void PhasingHandler::SendToPlayer(Player const* player) diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 8666c5b72b..630e232920 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -86,3 +86,47 @@ WorldPacket const* WorldPackets::Misc::StreamingMovies::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Misc::PhaseShiftChange::Write() +{ + _worldPacket.WriteBit(Client[2]); + _worldPacket.WriteBit(Client[3]); + _worldPacket.WriteBit(Client[1]); + _worldPacket.WriteBit(Client[6]); + _worldPacket.WriteBit(Client[4]); + _worldPacket.WriteBit(Client[5]); + _worldPacket.WriteBit(Client[0]); + _worldPacket.WriteBit(Client[7]); + + _worldPacket.WriteByteSeq(Client[7]); + _worldPacket.WriteByteSeq(Client[4]); + + _worldPacket << uint32(UiMapPhaseIDs.size() * 2); // size in bytes + for (uint16 uiMapPhaseId : UiMapPhaseIDs) + _worldPacket << uint16(uiMapPhaseId); // phase id, controls only map display (visible on all maps) + + _worldPacket.WriteByteSeq(Client[1]); + + _worldPacket << uint32(Phaseshift.PhaseShiftFlags); + + _worldPacket.WriteByteSeq(Client[2]); + _worldPacket.WriteByteSeq(Client[6]); + + _worldPacket << uint32(PreloadMapIDs.size() * 2); // size in bytes + for (uint16 preloadMapId : PreloadMapIDs) + _worldPacket << uint16(preloadMapId); // Inactive terrain swap map id + + _worldPacket << uint32 (Phaseshift.Phases.size() * 2); // size in bytes + for (uint16 phaseId : Phaseshift.Phases) + _worldPacket << uint16(phaseId); // active phase ids + + _worldPacket.WriteByteSeq(Client[3]); + _worldPacket.WriteByteSeq(Client[0]); + + _worldPacket << uint32(VisibleMapIDs.size() * 2); // size in bytes + for (uint16 visibleMapId : VisibleMapIDs) + _worldPacket << uint16(visibleMapId); // Active terrain swap map id + + _worldPacket.WriteByteSeq(Client[5]); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 881aca21ef..5c20efab0c 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -123,6 +123,26 @@ namespace WorldPackets std::vector MovieIDs; }; + + struct PhaseShiftData + { + uint32 PhaseShiftFlags = 0; + std::vector Phases; + }; + + class PhaseShiftChange final : public ServerPacket + { + public: + PhaseShiftChange() : ServerPacket(SMSG_PHASE_SHIFT_CHANGE, 8 + 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid Client; + PhaseShiftData Phaseshift; + std::vector PreloadMapIDs; + std::vector UiMapPhaseIDs; + std::vector VisibleMapIDs; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 4d07937e40..593565e866 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1207,7 +1207,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PHASE_SHIFT_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 5440c77aca..5d8562e7b4 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1166,7 +1166,7 @@ enum OpcodeServer SMSG_SET_MELEE_ANIM_KIT = 0x6715, SMSG_SET_MOVEMENT_ANIM_KIT = 0x0F14, SMSG_SET_PCT_SPELL_MODIFIER = 0x0224, - SMSG_SET_PHASE_SHIFT = 0x70A0, + SMSG_PHASE_SHIFT_CHANGE = 0x70A0, SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2B25, SMSG_SET_PLAY_HOVER_ANIM = 0x30A6, SMSG_SET_PROFICIENCY = 0x6207,