diff options
101 files changed, 3142 insertions, 2541 deletions
diff --git a/src/server/game/AI/CoreAI/GameObjectAI.cpp b/src/server/game/AI/CoreAI/GameObjectAI.cpp index 94fe71f449d..e9ac3f67e6b 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.cpp +++ b/src/server/game/AI/CoreAI/GameObjectAI.cpp @@ -18,6 +18,7 @@ #include "GameObjectAI.h" #include "CreatureAI.h" #include "GameObject.h" +#include "LootMgr.h" #include "QuestDef.h" int32 GameObjectAI::Permissible(GameObject const* /*go*/) @@ -25,6 +26,11 @@ int32 GameObjectAI::Permissible(GameObject const* /*go*/) return PERMIT_BASE_NO; } +void GameObjectAI::QuestReward(Player* player, Quest const* quest, uint32 opt) +{ + QuestReward(player, quest, LootItemType::Item, opt); +} + uint32 GameObjectAI::GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; diff --git a/src/server/game/AI/CoreAI/GameObjectAI.h b/src/server/game/AI/CoreAI/GameObjectAI.h index 1e15325eefb..3299e0d66d7 100644 --- a/src/server/game/AI/CoreAI/GameObjectAI.h +++ b/src/server/game/AI/CoreAI/GameObjectAI.h @@ -26,6 +26,7 @@ class Player; class Quest; class SpellInfo; class Unit; +enum class LootItemType : uint8; class TC_GAME_API GameObjectAI { @@ -61,7 +62,8 @@ class TC_GAME_API GameObjectAI virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { } // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 - virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } + virtual void QuestReward(Player* player, Quest const* quest, uint32 opt); + virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, LootItemType /*type*/, uint32 /*opt*/) { } // Called when the dialog status between a player and the gameobject is requested. virtual uint32 GetDialogStatus(Player* player); diff --git a/src/server/game/AI/CoreAI/UnitAI.cpp b/src/server/game/AI/CoreAI/UnitAI.cpp index 55c4f780285..a7204104e9f 100644 --- a/src/server/game/AI/CoreAI/UnitAI.cpp +++ b/src/server/game/AI/CoreAI/UnitAI.cpp @@ -18,6 +18,7 @@ #include "UnitAI.h" #include "Creature.h" #include "CreatureAIImpl.h" +#include "LootMgr.h" #include "Map.h" #include "MotionMaster.h" #include "Player.h" @@ -312,6 +313,11 @@ void UnitAI::FillAISpellInfo() }); } +void UnitAI::QuestReward(Player* player, Quest const* quest, uint32 opt) +{ + QuestReward(player, quest, LootItemType::Item, opt); +} + uint32 UnitAI::GetDialogStatus(Player* /*player*/) { return DIALOG_STATUS_SCRIPTED_NO_STATUS; diff --git a/src/server/game/AI/CoreAI/UnitAI.h b/src/server/game/AI/CoreAI/UnitAI.h index cec43d12698..41405a11b24 100644 --- a/src/server/game/AI/CoreAI/UnitAI.h +++ b/src/server/game/AI/CoreAI/UnitAI.h @@ -43,6 +43,7 @@ struct AISpellInfoType; enum DamageEffectType : uint8; enum Difficulty : uint8; enum SpellEffIndex : uint8; +enum class LootItemType : uint8; //Selection method used by SelectTarget enum SelectAggroTarget @@ -321,7 +322,8 @@ class TC_GAME_API UnitAI virtual void QuestAccept(Player* /*player*/, Quest const* /*quest*/) { } // Called when a player completes a quest and is rewarded, opt is the selected item's index or 0 - virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, uint32 /*opt*/) { } + virtual void QuestReward(Player* player, Quest const* quest, uint32 opt); + virtual void QuestReward(Player* /*player*/, Quest const* /*quest*/, LootItemType /*type*/, uint32 /*opt*/) { } // Called when a game event starts or ends virtual void OnGameEvent(bool /*start*/, uint16 /*eventId*/) { } diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index aad55cd5c30..d1747b784ba 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -242,9 +242,8 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) { WorldPackets::NPC::ClientGossipText& text = packet.GossipText[count]; text.QuestID = questID; + text.ContentTuningID = quest->GetContentTuningId(); text.QuestType = item.QuestIcon; - text.QuestLevel = quest->GetQuestLevel(); - text.QuestMaxScalingLevel = quest->GetQuestMaxScalingLevel(); text.QuestFlags[0] = quest->GetFlags(); text.QuestFlags[1] = quest->GetFlagsEx(); text.Repeatable = quest->IsRepeatable(); @@ -375,19 +374,20 @@ void PlayerMenu::SendQuestGiverQuestListMessage(Object* questgiver) if (Quest const* quest = sObjectMgr->GetQuestTemplate(questID)) { - std::string title = quest->GetLogTitle(); + questList.QuestDataText.emplace_back(); + WorldPackets::NPC::ClientGossipText& text = questList.QuestDataText.back(); + text.QuestID = questID; + text.ContentTuningID = quest->GetContentTuningId(); + text.QuestType = questMenuItem.QuestIcon; + text.QuestFlags[0] = quest->GetFlags(); + text.QuestFlags[1] = quest->GetFlagsEx(); + text.Repeatable = quest->IsRepeatable(); + text.QuestTitle = quest->GetLogTitle(); + LocaleConstant localeConstant = _session->GetSessionDbLocaleIndex(); if (localeConstant != LOCALE_enUS) - if (QuestTemplateLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(questID)) - ObjectMgr::GetLocaleString(questTemplateLocale->LogTitle, localeConstant, title); - - if (questLevelInTitle) - Quest::AddQuestLevelToTitle(title, quest->GetQuestLevel()); - - bool repeatable = false; // NYI - - questList.QuestDataText.emplace_back(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetQuestMaxScalingLevel(), - quest->GetFlags(), quest->GetFlagsEx(), repeatable, std::move(title)); + if (QuestTemplateLocale const* localeData = sObjectMgr->GetQuestLocale(questID)) + ObjectMgr::GetLocaleString(localeData->LogTitle, localeConstant, text.QuestTitle); } } diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h index ca36c9e024e..cd4ec97ae76 100644 --- a/src/server/game/Entities/Creature/GossipDef.h +++ b/src/server/game/Entities/Creature/GossipDef.h @@ -129,6 +129,20 @@ enum Poi_Icon ICON_POI_REDHORSE = 40 // Red Horse }; +enum class GossipOptionStatus : uint8 +{ + Available = 0, + Unavailable = 1, + Locked = 2, + AlreadyComplete = 3 +}; + +enum class GossipOptionRewardType : uint8 +{ + Item = 0, + Currency = 1 +}; + struct GossipMenuItem { uint8 MenuItemIcon; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index d52e93b7e18..0661811d60d 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -481,6 +481,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const bool hasAreaTriggerCylinder = areaTriggerTemplate->IsCylinder(); bool hasAreaTriggerSpline = areaTrigger->HasSplines(); bool hasOrbit = areaTrigger->HasOrbit(); + bool hasMovementScript = false; data->WriteBit(hasAbsoluteOrientation); data->WriteBit(hasDynamicShape); @@ -503,6 +504,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const data->WriteBit(hasAreaTriggerCylinder); data->WriteBit(hasAreaTriggerSpline); data->WriteBit(hasOrbit); + data->WriteBit(hasMovementScript); if (hasUnk3) data->WriteBit(false); @@ -581,6 +583,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const *data << float(areaTriggerTemplate->CylinderDatas.LocationZOffsetTarget); } + //if (hasMovementScript) + // *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo + if (hasOrbit) *data << *areaTrigger->GetCircularMovementInfo(); } diff --git a/src/server/game/Entities/Player/EquipmentSet.h b/src/server/game/Entities/Player/EquipmentSet.h index ce9d0952e21..7181b7d89ee 100644 --- a/src/server/game/Entities/Player/EquipmentSet.h +++ b/src/server/game/Entities/Player/EquipmentSet.h @@ -52,8 +52,10 @@ struct EquipmentSetInfo std::string SetName; std::string SetIcon; std::array<ObjectGuid, EQUIPMENT_SET_SLOTS> Pieces; - std::array<int32, EQUIPMENT_SET_SLOTS> Appearances; ///< ItemModifiedAppearanceID + std::array<int32, EQUIPMENT_SET_SLOTS> Appearances; ///< ItemModifiedAppearanceID std::array<int32, 2> Enchants; ///< SpellItemEnchantmentID + int32 Unknown901_1 = 0; + int32 Unknown901_2 = 0; } Data; /// Server-side data diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c1c3f5bfa23..f71064390d6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -7846,10 +7846,6 @@ void Unit::Dismount() if (Player* thisPlayer = ToPlayer()) thisPlayer->SendMovementSetCollisionHeight(thisPlayer->GetCollisionHeight(false)); - WorldPackets::Misc::Dismount data; - data.Guid = GetGUID(); - SendMessageToSet(data.Write(), true); - // dismount as a vehicle if (GetTypeId() == TYPEID_PLAYER && GetVehicleKit()) { diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index 0a16ac42e36..9c84f6a712b 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -590,20 +590,20 @@ void Garrison::SendBlueprintAndSpecializationData() _owner->SendDirectMessage(data.Write()); } -void Garrison::SendBuildingLandmarks(Player* receiver) const +void Garrison::SendMapData(Player* receiver) const { - WorldPackets::Garrison::GarrisonBuildingLandmarks buildingLandmarks; - buildingLandmarks.Landmarks.reserve(_plots.size()); + WorldPackets::Garrison::GarrisonMapDataResponse mapData; + mapData.Buildings.reserve(_plots.size()); for (auto const& p : _plots) { Plot const& plot = p.second; if (plot.BuildingInfo.PacketInfo) if (uint32 garrBuildingPlotInstId = sGarrisonMgr.GetGarrBuildingPlotInst(plot.BuildingInfo.PacketInfo->GarrBuildingID, plot.GarrSiteLevelPlotInstId)) - buildingLandmarks.Landmarks.emplace_back(garrBuildingPlotInstId, plot.PacketInfo.PlotPos.Pos); + mapData.Buildings.emplace_back(garrBuildingPlotInstId, plot.PacketInfo.PlotPos.Pos); } - receiver->SendDirectMessage(buildingLandmarks.Write()); + receiver->SendDirectMessage(mapData.Write()); } Map* Garrison::FindMap() const diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 5d76eae3e64..8a4551521be 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -257,7 +257,7 @@ public: void SendInfo(); void SendRemoteInfo() const; void SendBlueprintAndSpecializationData(); - void SendBuildingLandmarks(Player* receiver) const; + void SendMapData(Player* receiver) const; void ResetFollowerActivationLimit() { _followerActivationsRemainingToday = 1; } diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 2e4e837c10e..52884fd4110 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7955,7 +7955,7 @@ void ObjectMgr::LoadQuestPOI() { QuestPOIData& poiData = _questPOIStore[questID]; poiData.QuestID = questID; - poiData.QuestPOIBlobDataStats.emplace_back(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapID, priority, flags, + poiData.Blobs.emplace_back(blobIndex, objectiveIndex, questObjectiveID, questObjectID, mapID, uiMapID, priority, flags, worldEffectID, playerConditionID, spawnTrackingID, std::move(POIs[questID][idx1]), alwaysAllowMergingBlobs); } else diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index ce1cd5d6ea0..0a113095374 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -719,9 +719,10 @@ struct QuestPOIBlobPoint { int32 X; int32 Y; + int32 Z; - QuestPOIBlobPoint() : X(0), Y(0) { } - QuestPOIBlobPoint(int32 _X, int32 _Y) : X(_X), Y(_Y) { } + QuestPOIBlobPoint() : X(0), Y(0), Z(0) { } + QuestPOIBlobPoint(int32 x, int32 y) : X(x), Y(y), Z(0) { } }; struct QuestPOIBlobData @@ -736,24 +737,25 @@ struct QuestPOIBlobData int32 Flags; int32 WorldEffectID; int32 PlayerConditionID; + int32 NavigationPlayerConditionID; int32 SpawnTrackingID; - std::vector<QuestPOIBlobPoint> QuestPOIBlobPointStats; + std::vector<QuestPOIBlobPoint> Points; bool AlwaysAllowMergingBlobs; QuestPOIBlobData() : BlobIndex(0), ObjectiveIndex(0), QuestObjectiveID(0), QuestObjectID(0), MapID(0), UiMapID(0), Priority(0), Flags(0), WorldEffectID(0), - PlayerConditionID(0), SpawnTrackingID(0), AlwaysAllowMergingBlobs(false) { } + PlayerConditionID(0), NavigationPlayerConditionID(0), SpawnTrackingID(0), AlwaysAllowMergingBlobs(false) { } QuestPOIBlobData(int32 blobIndex, int32 objectiveIndex, int32 questObjectiveID, int32 questObjectID, int32 mapID, int32 uiMapID, int32 priority, - int32 flags, int32 worldEffectID, int32 playerConditionID, int32 spawnTrackingID, std::vector<QuestPOIBlobPoint> questPOIBlobPointStats, + int32 flags, int32 worldEffectID, int32 playerConditionID, int32 spawnTrackingID, std::vector<QuestPOIBlobPoint> points, bool alwaysAllowMergingBlobs) : BlobIndex(blobIndex), ObjectiveIndex(objectiveIndex), QuestObjectiveID(questObjectiveID), QuestObjectID(questObjectID), MapID(mapID), UiMapID(uiMapID), Priority(priority), Flags(flags), WorldEffectID(worldEffectID), - PlayerConditionID(playerConditionID), SpawnTrackingID(spawnTrackingID), QuestPOIBlobPointStats(std::move(questPOIBlobPointStats)), + PlayerConditionID(playerConditionID), NavigationPlayerConditionID(0), SpawnTrackingID(spawnTrackingID), Points(std::move(points)), AlwaysAllowMergingBlobs(alwaysAllowMergingBlobs) { } }; struct QuestPOIData { int32 QuestID = 0; - std::vector<QuestPOIBlobData> QuestPOIBlobDataStats; + std::vector<QuestPOIBlobData> Blobs; void InitializeQueryData(); ByteBuffer QueryDataBuffer; diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index 9554f7dc869..56d2e458474 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -2264,11 +2264,11 @@ void Guild::SendEventAwayChanged(ObjectGuid const& memberGuid, bool afk, bool dn else member->RemFlag(GUILDMEMBER_STATUS_DND); - WorldPackets::Guild::GuildEventAwayChange awayChange; - awayChange.Guid = memberGuid; - awayChange.AFK = afk; - awayChange.DND = dnd; - BroadcastPacket(awayChange.Write()); + WorldPackets::Guild::GuildEventStatusChange statusChange; + statusChange.Guid = memberGuid; + statusChange.AFK = afk; + statusChange.DND = dnd; + BroadcastPacket(statusChange.Write()); } void Guild::SendEventBankMoneyChanged() const diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 56eca9b75b1..6e94c89917d 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -600,7 +600,7 @@ void WorldSession::HandleReportPvPAFK(WorldPackets::Battleground::ReportPvPPlaye reportedPlayer->ReportedAfkBy(_player); } -void WorldSession::HandleRequestRatedBattlefieldInfo(WorldPackets::Battleground::RequestRatedBattlefieldInfo& /*packet*/) +void WorldSession::HandleRequestRatedPvpInfo(WorldPackets::Battleground::RequestRatedPvpInfo& /*packet*/) { WorldPackets::Battleground::RatedPvpInfo ratedPvpInfo; SendPacket(ratedPvpInfo.Write()); diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp index 0470e6f77e2..e80a8b3add6 100644 --- a/src/server/game/Handlers/CalendarHandler.cpp +++ b/src/server/game/Handlers/CalendarHandler.cpp @@ -124,10 +124,10 @@ void WorldSession::HandleCalendarGetEvent(WorldPackets::Calendar::CalendarGetEve sCalendarMgr->SendCalendarCommandResult(_player->GetGUID(), CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarCommunityFilter(WorldPackets::Calendar::CalendarCommunityFilter& calendarCommunityFilter) +void WorldSession::HandleCalendarCommunityInvite(WorldPackets::Calendar::CalendarCommunityInviteRequest& calendarCommunityInvite) { if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId())) - guild->MassInviteToEvent(this, calendarCommunityFilter.MinLevel, calendarCommunityFilter.MaxLevel, calendarCommunityFilter.MaxRankOrder); + guild->MassInviteToEvent(this, calendarCommunityInvite.MinLevel, calendarCommunityInvite.MaxLevel, calendarCommunityInvite.MaxRankOrder); } void WorldSession::HandleCalendarAddEvent(WorldPackets::Calendar::CalendarAddEvent& calendarAddEvent) @@ -239,7 +239,7 @@ void WorldSession::HandleCalendarCopyEvent(WorldPackets::Calendar::CalendarCopyE sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarEventInvite(WorldPackets::Calendar::CalendarEventInvite& calendarEventInvite) +void WorldSession::HandleCalendarInvite(WorldPackets::Calendar::CalendarInvite& calendarEventInvite) { ObjectGuid playerGuid = _player->GetGUID(); @@ -347,22 +347,22 @@ void WorldSession::HandleCalendarEventSignup(WorldPackets::Calendar::CalendarEve sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarEventRsvp(WorldPackets::Calendar::CalendarEventRSVP& calendarEventRSVP) +void WorldSession::HandleCalendarRsvp(WorldPackets::Calendar::CalendarRSVP& calendarRSVP) { ObjectGuid guid = _player->GetGUID(); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventRSVP.EventID)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarRSVP.EventID)) { // I think we still should be able to remove self from locked events - if (calendarEventRSVP.Status != CALENDAR_STATUS_REMOVED && calendarEvent->IsLocked()) + if (calendarRSVP.Status != CALENDAR_STATUS_REMOVED && calendarEvent->IsLocked()) { sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_LOCKED); return; } - if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventRSVP.InviteID)) + if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarRSVP.InviteID)) { - invite->SetStatus(CalendarInviteStatus(calendarEventRSVP.Status)); + invite->SetStatus(CalendarInviteStatus(calendarRSVP.Status)); invite->SetResponseTime(time(nullptr)); sCalendarMgr->UpdateInvite(invite); @@ -398,23 +398,23 @@ void WorldSession::HandleCalendarEventRemoveInvite(WorldPackets::Calendar::Calen sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); } -void WorldSession::HandleCalendarEventStatus(WorldPackets::Calendar::CalendarEventStatus& calendarEventStatus) +void WorldSession::HandleCalendarStatus(WorldPackets::Calendar::CalendarStatus& calendarStatus) { ObjectGuid guid = _player->GetGUID(); - TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_STATUS [%s] EventId [" + TC_LOG_DEBUG("network", "CMSG_CALENDAR_STATUS [%s] EventId [" UI64FMTD "] ownerInviteId [" UI64FMTD "], Invitee ([%s] id: [" - UI64FMTD "], status %u", guid.ToString().c_str(), calendarEventStatus.EventID, calendarEventStatus.ModeratorID, calendarEventStatus.Guid.ToString().c_str(), calendarEventStatus.InviteID, calendarEventStatus.Status); + UI64FMTD "], status %u", guid.ToString().c_str(), calendarStatus.EventID, calendarStatus.ModeratorID, calendarStatus.Guid.ToString().c_str(), calendarStatus.InviteID, calendarStatus.Status); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventStatus.EventID)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarStatus.EventID)) { - if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventStatus.InviteID)) + if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarStatus.InviteID)) { - invite->SetStatus((CalendarInviteStatus)calendarEventStatus.Status); + invite->SetStatus((CalendarInviteStatus)calendarStatus.Status); sCalendarMgr->UpdateInvite(invite); sCalendarMgr->SendCalendarEventStatus(*calendarEvent, *invite); - sCalendarMgr->SendCalendarClearPendingAction(calendarEventStatus.Guid); + sCalendarMgr->SendCalendarClearPendingAction(calendarStatus.Guid); } else sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_NO_INVITE); // correct? @@ -423,19 +423,19 @@ void WorldSession::HandleCalendarEventStatus(WorldPackets::Calendar::CalendarEve sCalendarMgr->SendCalendarCommandResult(guid, CALENDAR_ERROR_EVENT_INVALID); } -void WorldSession::HandleCalendarEventModeratorStatus(WorldPackets::Calendar::CalendarEventModeratorStatus& calendarEventModeratorStatus) +void WorldSession::HandleCalendarModeratorStatus(WorldPackets::Calendar::CalendarModeratorStatusQuery& calendarModeratorStatus) { ObjectGuid guid = _player->GetGUID(); - TC_LOG_DEBUG("network", "CMSG_CALENDAR_EVENT_MODERATOR_STATUS [%s] EventID [" + TC_LOG_DEBUG("network", "CMSG_CALENDAR_MODERATOR_STATUS [%s] EventID [" UI64FMTD "] ModeratorID [" UI64FMTD "], Invitee ([%s] InviteID: [" - UI64FMTD "], Status %u", guid.ToString().c_str(), calendarEventModeratorStatus.EventID, calendarEventModeratorStatus.ModeratorID, calendarEventModeratorStatus.Guid.ToString().c_str(), calendarEventModeratorStatus.InviteID, calendarEventModeratorStatus.Status); + UI64FMTD "], Status %u", guid.ToString().c_str(), calendarModeratorStatus.EventID, calendarModeratorStatus.ModeratorID, calendarModeratorStatus.Guid.ToString().c_str(), calendarModeratorStatus.InviteID, calendarModeratorStatus.Status); - if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarEventModeratorStatus.EventID)) + if (CalendarEvent* calendarEvent = sCalendarMgr->GetEvent(calendarModeratorStatus.EventID)) { - if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarEventModeratorStatus.InviteID)) + if (CalendarInvite* invite = sCalendarMgr->GetInvite(calendarModeratorStatus.InviteID)) { - invite->SetRank(CalendarModerationRank(calendarEventModeratorStatus.Status)); + invite->SetRank(CalendarModerationRank(calendarModeratorStatus.Status)); sCalendarMgr->UpdateInvite(invite); sCalendarMgr->SendCalendarEventModeratorStatusAlert(*calendarEvent, *invite); } diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 9461ebdb276..49283ac0c26 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -309,10 +309,6 @@ bool LoginQueryHolder::Initialize() void WorldSession::HandleCharEnum(PreparedQueryResult result) { - uint8 demonHunterCount = 0; // We use this counter to allow multiple demon hunter creations when allowed in config - bool canAlwaysCreateDemonHunter = HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEMON_HUNTER); - if (sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER) == 0) // char level = 0 means this check is disabled, so always true - canAlwaysCreateDemonHunter = true; WorldPackets::Character::EnumCharactersResult charEnum; charEnum.Success = true; charEnum.IsDeletedCharacters = false; @@ -358,21 +354,11 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) if (!sCharacterCache->HasCharacterCacheEntry(charInfo.Guid)) // This can happen if characters are inserted into the database manually. Core hasn't loaded name data yet. sCharacterCache->AddCharacterCacheEntry(charInfo.Guid, GetAccountId(), charInfo.Name, charInfo.SexID, charInfo.RaceID, charInfo.ClassID, charInfo.ExperienceLevel, false); - if (charInfo.ClassID == CLASS_DEMON_HUNTER) - demonHunterCount++; - - if (demonHunterCount >= sWorld->getIntConfig(CONFIG_DEMON_HUNTERS_PER_REALM) && !canAlwaysCreateDemonHunter) - charEnum.HasDemonHunterOnRealm = true; - else - charEnum.HasDemonHunterOnRealm = false; - charEnum.MaxCharacterLevel = std::max<int32>(charEnum.MaxCharacterLevel, charInfo.ExperienceLevel); } while (result->NextRow()); } - charEnum.IsTestDemonHunterCreationAllowed = canAlwaysCreateDemonHunter; - charEnum.IsDemonHunterCreationAllowed = GetAccountExpansion() >= EXPANSION_LEGION || canAlwaysCreateDemonHunter; charEnum.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= EXPANSION_BATTLE_FOR_AZEROTH; for (std::pair<uint8 const, RaceUnlockRequirement> const& requirement : sObjectMgr->GetRaceUnlockRequirements()) @@ -643,26 +629,12 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact if (result) { uint32 team = Player::TeamForRace(createInfo->Race); - uint32 freeDemonHunterSlots = sWorld->getIntConfig(CONFIG_DEMON_HUNTERS_PER_REALM); Field* field = result->Fetch(); uint8 accRace = field[1].GetUInt8(); if (checkDemonHunterReqs) { - uint8 accClass = field[2].GetUInt8(); - if (accClass == CLASS_DEMON_HUNTER) - { - if (freeDemonHunterSlots > 0) - --freeDemonHunterSlots; - - if (freeDemonHunterSlots == 0) - { - SendCharCreate(CHAR_CREATE_FAILED); - return; - } - } - if (!hasDemonHunterReqLevel) { uint8 accLevel = field[0].GetUInt8(); @@ -1376,6 +1348,40 @@ void WorldSession::HandleRequestForcedReactionsOpcode(WorldPackets::Reputation:: _player->GetReputationMgr().SendForceReactions(); } +void WorldSession::HandleCheckCharacterNameAvailability(WorldPackets::Character::CheckCharacterNameAvailability& checkCharacterNameAvailability) +{ + // prevent character rename to invalid name + if (!normalizePlayerName(checkCharacterNameAvailability.Name)) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, CHAR_NAME_NO_NAME).Write()); + return; + } + + ResponseCodes res = ObjectMgr::CheckPlayerName(checkCharacterNameAvailability.Name, GetSessionDbcLocale(), true); + if (res != CHAR_NAME_SUCCESS) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, res).Write()); + return; + } + + // check name limitations + if (!HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_RESERVEDNAME) && sObjectMgr->IsReservedName(checkCharacterNameAvailability.Name)) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(checkCharacterNameAvailability.SequenceIndex, CHAR_NAME_RESERVED).Write()); + return; + } + + // Ensure that there is no character with the desired new name + CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHECK_NAME); + stmt->setString(0, checkCharacterNameAvailability.Name); + + _queryProcessor.AddCallback(CharacterDatabase.AsyncQuery(stmt) + .WithPreparedCallback([this, sequenceIndex = checkCharacterNameAvailability.SequenceIndex](PreparedQueryResult result) + { + SendPacket(WorldPackets::Character::CheckCharacterNameAvailabilityResult(sequenceIndex, result ? CHAR_CREATE_NAME_IN_USE : RESPONSE_SUCCESS).Write()); + })); +} + void WorldSession::HandleCharRenameOpcode(WorldPackets::Character::CharacterRenameRequest& request) { if (!IsLegitCharacterForAccount(request.RenameInfo->Guid)) @@ -2670,13 +2676,8 @@ void WorldSession::SendCharFactionChange(ResponseCodes result, WorldPackets::Cha packet.Display = boost::in_place(); packet.Display->Name = factionChangeInfo->Name; packet.Display->SexID = factionChangeInfo->SexID; - packet.Display->SkinID = factionChangeInfo->SkinID; - packet.Display->HairColorID = factionChangeInfo->HairColorID; - packet.Display->HairStyleID = factionChangeInfo->HairStyleID; - packet.Display->FacialHairStyleID = factionChangeInfo->FacialHairStyleID; - packet.Display->FaceID = factionChangeInfo->FaceID; + packet.Display->Customizations = &factionChangeInfo->Customizations; packet.Display->RaceID = factionChangeInfo->RaceID; - packet.Display->CustomDisplay = factionChangeInfo->CustomDisplay; } SendPacket(packet.Write()); diff --git a/src/server/game/Handlers/GarrisonHandler.cpp b/src/server/game/Handlers/GarrisonHandler.cpp index 22f42084aa1..ef725a3cd39 100644 --- a/src/server/game/Handlers/GarrisonHandler.cpp +++ b/src/server/game/Handlers/GarrisonHandler.cpp @@ -50,8 +50,8 @@ void WorldSession::HandleGarrisonRequestBlueprintAndSpecializationData(WorldPack garrison->SendBlueprintAndSpecializationData(); } -void WorldSession::HandleGarrisonGetBuildingLandmarks(WorldPackets::Garrison::GarrisonGetBuildingLandmarks& /*garrisonGetBuildingLandmarks*/) +void WorldSession::HandleGarrisonGetMapData(WorldPackets::Garrison::GarrisonGetMapData& /*garrisonGetMapData*/) { if (Garrison* garrison = _player->GetGarrison()) - garrison->SendBuildingLandmarks(_player); + garrison->SendMapData(_player); } diff --git a/src/server/game/Handlers/HotfixHandler.cpp b/src/server/game/Handlers/HotfixHandler.cpp index 798b7060f2d..85880fd0786 100644 --- a/src/server/game/Handlers/HotfixHandler.cpp +++ b/src/server/game/Handlers/HotfixHandler.cpp @@ -42,7 +42,7 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Hotfix::DBQueryBulk& dbQuery) if (store->HasRecord(record.RecordID)) { - dbReply.Allow = true; + dbReply.Status = 1; dbReply.Timestamp = GameTime::GetGameTime(); store->WriteRecord(record.RecordID, GetSessionDbcLocale(), dbReply.Data); } diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index dd15b7e7590..b2982d5c36d 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -151,7 +151,7 @@ void WorldSession::SendLfgPlayerLockInfo() // Get player locked Dungeons for (auto const& lock : sLFGMgr->GetLockedDungeons(_player->GetGUID())) - lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel); + lfgPlayerInfo.BlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0); for (uint32 slot : randomDungeons) { @@ -224,7 +224,7 @@ void WorldSession::SendLfgPartyLockInfo() WorldPackets::LFG::LFGBlackList& lfgBlackList = lfgPartyInfo.Player.back(); lfgBlackList.PlayerGuid = pguid; for (auto const& lock : sLFGMgr->GetLockedDungeons(pguid)) - lfgBlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel); + lfgBlackList.Slot.emplace_back(lock.first, lock.second.lockStatus, lock.second.requiredItemLevel, lock.second.currentItemLevel, 0); } TC_LOG_DEBUG("lfg", "SMSG_LFG_PARTY_INFO %s", GetPlayerInfo().c_str()); @@ -347,15 +347,15 @@ void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData) for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) { lfgJoinResult.BlackList.emplace_back(); - WorldPackets::LFG::LFGJoinBlackList& blackList = lfgJoinResult.BlackList.back(); - blackList.Guid = it->first; + WorldPackets::LFG::LFGBlackList& blackList = lfgJoinResult.BlackList.back(); + blackList.PlayerGuid = it->first; for (lfg::LfgLockMap::const_iterator itr = it->second.begin(); itr != it->second.end(); ++itr) { TC_LOG_TRACE("lfg", "SendLfgJoinResult:: %s DungeonID: %u Lock status: %u Required itemLevel: %u Current itemLevel: %f", it->first.ToString().c_str(), (itr->first & 0x00FFFFFF), itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel); - blackList.Slots.emplace_back(itr->first, itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel); + blackList.Slot.emplace_back(itr->first, itr->second.lockStatus, itr->second.requiredItemLevel, itr->second.currentItemLevel, 0); } } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 66e891fe3ee..9f7c2532005 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -240,7 +240,7 @@ void WorldSession::HandleSuspendTokenResponse(WorldPackets::Movement::SuspendTok WorldPackets::Movement::NewWorld packet; packet.MapID = loc.GetMapId(); - packet.Pos = loc; + packet.Loc.Pos = loc; packet.Reason = !_player->IsBeingTeleportedSeamlessly() ? NEW_WORLD_NORMAL : NEW_WORLD_SEAMLESS; SendPacket(packet.Write()); diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp index 6bcb4f29a0b..9590356f3dd 100644 --- a/src/server/game/Handlers/QuestHandler.cpp +++ b/src/server/game/Handlers/QuestHandler.cpp @@ -26,6 +26,7 @@ #include "GossipDef.h" #include "Group.h" #include "Log.h" +#include "LootMgr.h" #include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Player.h" @@ -252,26 +253,31 @@ void WorldSession::HandleQuestQueryOpcode(WorldPackets::Quest::QueryQuestInfo& p void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::QuestGiverChooseReward& packet) { - TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %s, quest = %u, reward = %u", packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.ItemChoiceID); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %s, quest = %u, reward = %u", + packet.QuestGiverGUID.ToString().c_str(), packet.QuestID, packet.Choice.Item.ItemID); Quest const* quest = sObjectMgr->GetQuestTemplate(packet.QuestID); if (!quest) return; - // This is Real Item Entry, not slot id as pre 5.x - if (packet.ItemChoiceID) + // TODO: currency choice items + if (packet.Choice.LootItemType != LootItemType::Item) + return; + + if (packet.Choice.Item.ItemID) { - ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.ItemChoiceID); + ItemTemplate const* rewardProto = sObjectMgr->GetItemTemplate(packet.Choice.Item.ItemID); if (!rewardProto) { - TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward item (Item Entry: %u) for quest %u (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID, packet.QuestID); + TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get invalid reward item (Item Entry: %u) for quest %u (possible packet-hacking detected)", + _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID); return; } bool itemValid = false; for (uint32 i = 0; i < quest->GetRewChoiceItemsCount(); ++i) { - if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == uint32(packet.ItemChoiceID)) + if (quest->RewardChoiceItemId[i] && quest->RewardChoiceItemId[i] == packet.Choice.Item.ItemID) { itemValid = true; break; @@ -284,7 +290,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest { for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) { - if (questPackageItem->ItemID != packet.ItemChoiceID) + if (questPackageItem->ItemID != packet.Choice.Item.ItemID) continue; if (_player->CanSelectQuestPackageItem(questPackageItem)) @@ -301,7 +307,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest { for (QuestPackageItemEntry const* questPackageItem : *questPackageItems) { - if (questPackageItem->ItemID != packet.ItemChoiceID) + if (questPackageItem->ItemID != packet.Choice.Item.ItemID) continue; itemValid = true; @@ -313,7 +319,8 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest if (!itemValid) { - TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward item (Item Entry: %u) wich is not a reward for quest %u (possible packet-hacking detected)", _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.ItemChoiceID, packet.QuestID); + TC_LOG_ERROR("entities.player.cheat", "Error in CMSG_QUESTGIVER_CHOOSE_REWARD: player %s (%s) tried to get reward item (Item Entry: %u) wich is not a reward for quest %u (possible packet-hacking detected)", + _player->GetName().c_str(), _player->GetGUID().ToString().c_str(), packet.Choice.Item.ItemID, packet.QuestID); return; } } @@ -339,9 +346,9 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest return; } - if (_player->CanRewardQuest(quest, packet.ItemChoiceID, true)) + if (_player->CanRewardQuest(quest, packet.Choice.Item.ItemID, true)) { - _player->RewardQuest(quest, packet.ItemChoiceID, object); + _player->RewardQuest(quest, packet.Choice.Item.ItemID, object); switch (object->GetTypeId()) { @@ -364,7 +371,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest } _player->PlayerTalkClass->ClearMenus(); - creatureQGiver->GetAI()->QuestReward(_player, quest, packet.ItemChoiceID); + creatureQGiver->GetAI()->QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); break; } case TYPEID_GAMEOBJECT: @@ -384,7 +391,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode(WorldPackets::Quest::Quest } _player->PlayerTalkClass->ClearMenus(); - questGiver->AI()->QuestReward(_player, quest, packet.ItemChoiceID); + questGiver->AI()->QuestReward(_player, quest, packet.Choice.LootItemType, packet.Choice.Item.ItemID); break; } default: diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 5ff33e97bf3..8ccfd1c29c3 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -541,13 +541,8 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorI Guild* guild = player->GetGuild(); - mirrorImageComponentedData.SkinColor = player->m_playerData->SkinID; - mirrorImageComponentedData.FaceVariation = player->m_playerData->FaceID; - mirrorImageComponentedData.HairVariation = player->m_playerData->HairStyleID; - mirrorImageComponentedData.HairColor = player->m_playerData->HairColorID; - mirrorImageComponentedData.BeardVariation = player->m_playerData->FacialHairStyleID; - for (uint32 i = 0; i < PLAYER_CUSTOM_DISPLAY_SIZE; ++i) - mirrorImageComponentedData.CustomDisplay[i] = player->m_playerData->CustomDisplayOption[i]; + for (UF::ChrCustomizationChoice customization : player->m_playerData->Customizations) + mirrorImageComponentedData.Customizations.push_back({ customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID }); mirrorImageComponentedData.GuildGUID = (guild ? guild->GetGUID() : ObjectGuid::Empty); mirrorImageComponentedData.ItemDisplayID.reserve(11); diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp index ef1332dc4a2..af1b54218cd 100644 --- a/src/server/game/Handlers/TicketHandler.cpp +++ b/src/server/game/Handlers/TicketHandler.cpp @@ -40,30 +40,32 @@ void WorldSession::HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTick SendPacket(response.Write()); } -void WorldSession::HandleSupportTicketSubmitBug(WorldPackets::Ticket::SupportTicketSubmitBug& packet) +void WorldSession::HandleSubmitUserFeedback(WorldPackets::Ticket::SubmitUserFeedback& userFeedback) { - if (!sSupportMgr->GetBugSystemStatus()) - return; - - BugTicket* ticket = new BugTicket(GetPlayer()); - ticket->SetPosition(packet.Header.MapID, packet.Header.Position); - ticket->SetFacing(packet.Header.Facing); - ticket->SetNote(packet.Note); - - sSupportMgr->AddTicket(ticket); -} - -void WorldSession::HandleSupportTicketSubmitSuggestion(WorldPackets::Ticket::SupportTicketSubmitSuggestion& packet) -{ - if (!sSupportMgr->GetSuggestionSystemStatus()) - return; - - SuggestionTicket* ticket = new SuggestionTicket(GetPlayer()); - ticket->SetPosition(packet.Header.MapID, packet.Header.Position); - ticket->SetFacing(packet.Header.Facing); - ticket->SetNote(packet.Note); - - sSupportMgr->AddTicket(ticket); + if (userFeedback.IsSuggestion) + { + if (!sSupportMgr->GetSuggestionSystemStatus()) + return; + + SuggestionTicket* ticket = new SuggestionTicket(GetPlayer()); + ticket->SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position); + ticket->SetFacing(userFeedback.Header.Facing); + ticket->SetNote(userFeedback.Note); + + sSupportMgr->AddTicket(ticket); + } + else + { + if (!sSupportMgr->GetBugSystemStatus()) + return; + + BugTicket* ticket = new BugTicket(GetPlayer()); + ticket->SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position); + ticket->SetFacing(userFeedback.Header.Facing); + ticket->SetNote(userFeedback.Note); + + sSupportMgr->AddTicket(ticket); + } } void WorldSession::HandleSupportTicketSubmitComplaint(WorldPackets::Ticket::SupportTicketSubmitComplaint& packet) diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h index c531d085b37..23915fec051 100644 --- a/src/server/game/Loot/LootMgr.h +++ b/src/server/game/Loot/LootMgr.h @@ -33,6 +33,12 @@ class Player; struct Loot; struct LootItem; +enum class LootItemType : uint8 +{ + Item = 0, + Currency = 1 +}; + struct TC_GAME_API LootStoreItem { uint32 itemid; // id of the item diff --git a/src/server/game/Movement/Spline/MoveSpline.cpp b/src/server/game/Movement/Spline/MoveSpline.cpp index 4d72d506549..336a6918dbe 100644 --- a/src/server/game/Movement/Spline/MoveSpline.cpp +++ b/src/server/game/Movement/Spline/MoveSpline.cpp @@ -54,7 +54,7 @@ Location MoveSpline::computePosition(int32 time_point, int32 point_index) const } else { - if (!splineflags.hasFlag(MoveSplineFlag::OrientationFixed | MoveSplineFlag::Falling | MoveSplineFlag::Unknown0)) + if (!splineflags.hasFlag(MoveSplineFlag::OrientationFixed | MoveSplineFlag::Falling | MoveSplineFlag::Unknown0x8)) { Vector3 hermite; spline.evaluate_derivative(point_Idx, u, hermite); @@ -191,6 +191,7 @@ void MoveSpline::Initialize(MoveSplineInitArgs const& args) vertical_acceleration = 0.f; effect_start_time = 0; spell_effect_extra = args.spellEffectExtra; + anim_tier = args.animTier; splineIsFacingOnly = args.path.size() == 2 && args.facing.type != MONSTER_MOVE_NORMAL && ((args.path[1] - args.path[0]).length() < 0.1f); // Check if its a stop spline diff --git a/src/server/game/Movement/Spline/MoveSpline.h b/src/server/game/Movement/Spline/MoveSpline.h index 0bc025fc5f0..c9d4745e036 100644 --- a/src/server/game/Movement/Spline/MoveSpline.h +++ b/src/server/game/Movement/Spline/MoveSpline.h @@ -81,6 +81,7 @@ namespace Movement int32 point_Idx; int32 point_Idx_offset; Optional<SpellEffectExtraData> spell_effect_extra; + Optional<AnimTierTransition> anim_tier; void init_spline(MoveSplineInitArgs const& args); diff --git a/src/server/game/Movement/Spline/MoveSplineFlag.h b/src/server/game/Movement/Spline/MoveSplineFlag.h index 2f80d1d509c..a6396184a2e 100644 --- a/src/server/game/Movement/Spline/MoveSplineFlag.h +++ b/src/server/game/Movement/Spline/MoveSplineFlag.h @@ -30,13 +30,15 @@ namespace Movement enum eFlags { None = 0x00000000, - // x00-x07 used as animation Ids storage in pair with Animation flag - Unknown0 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation + Unknown_0x1 = 0x00000001, // NOT VERIFIED + Unknown_0x2 = 0x00000002, // NOT VERIFIED + Unknown_0x4 = 0x00000004, // NOT VERIFIED + Unknown_0x8 = 0x00000008, // NOT VERIFIED - does someting related to falling/fixed orientation FallingSlow = 0x00000010, Done = 0x00000020, Falling = 0x00000040, // Affects elevation computation, can't be combined with Parabolic flag No_Spline = 0x00000080, - Unknown1 = 0x00000100, // NOT VERIFIED + Unknown_0x100 = 0x00000100, // NOT VERIFIED Flying = 0x00000200, // Smooth movement(Catmullrom interpolation mode), flying animation OrientationFixed = 0x00000400, // Model orientation fixed Catmullrom = 0x00000800, // Used Catmullrom interpolation mode @@ -45,29 +47,28 @@ namespace Movement Frozen = 0x00004000, // Will never arrive TransportEnter = 0x00008000, TransportExit = 0x00010000, - Unknown2 = 0x00020000, // NOT VERIFIED - Unknown3 = 0x00040000, // NOT VERIFIED + Unknown_0x20000 = 0x00020000, // NOT VERIFIED + Unknown_0x40000 = 0x00040000, // NOT VERIFIED Backward = 0x00080000, SmoothGroundPath = 0x00100000, CanSwim = 0x00200000, UncompressedPath = 0x00400000, - Unknown4 = 0x00800000, // NOT VERIFIED - Unknown5 = 0x01000000, // NOT VERIFIED + Unknown_0x800000 = 0x00800000, // NOT VERIFIED + Unknown_0x1000000 = 0x01000000, // NOT VERIFIED Animation = 0x02000000, // Plays animation after some time passed Parabolic = 0x04000000, // Affects elevation computation, can't be combined with Falling flag FadeObject = 0x08000000, Steering = 0x10000000, - Unknown8 = 0x20000000, // NOT VERIFIED - Unknown9 = 0x40000000, // NOT VERIFIED - Unknown10 = 0x80000000, // NOT VERIFIED + Unknown_0x20000000 = 0x20000000, // NOT VERIFIED + Unknown_0x40000000 = 0x40000000, // NOT VERIFIED + Unknown_0x80000000 = 0x80000000, // NOT VERIFIED // Masks - // animation ids stored here, see AnimType enum, used with Animation flag - Mask_Animations = 0x7, // flags that shouldn't be appended into SMSG_MONSTER_MOVE\SMSG_MONSTER_MOVE_TRANSPORT packet, should be more probably - Mask_No_Monster_Move = Mask_Animations | Done, + Mask_No_Monster_Move = Done, // Unused, not suported flags - Mask_Unused = No_Spline|Enter_Cycle|Frozen|Unknown0|Unknown1|Unknown2|Unknown3|Unknown4|Unknown5|FadeObject|Steering|Unknown8|Unknown9|Unknown10 + Mask_Unused = No_Spline | Enter_Cycle | Frozen | Unknown_0x8 | Unknown_0x100 | Unknown_0x20000 | Unknown_0x40000 + | Unknown_0x800000 | Unknown_0x1000000 | FadeObject | Steering | Unknown_0x20000000 | Unknown_0x40000000 | Unknown_0x80000000 }; inline uint32& raw() { return (uint32&)*this; } @@ -81,7 +82,6 @@ namespace Movement bool isSmooth() const { return (raw() & Catmullrom) != 0; } bool isLinear() const { return !isSmooth(); } - uint8 getAnimTier() const { return animTier; } bool hasAllFlags(uint32 f) const { return (raw() & f) == f; } bool hasFlag(uint32 f) const { return (raw() & f) != 0; } uint32 operator & (uint32 f) const { return (raw() & f); } @@ -93,21 +93,23 @@ namespace Movement void operator &= (uint32 f) { raw() &= f; } void operator |= (uint32 f) { raw() |= f; } - void EnableAnimation(uint8 anim) { raw() = (raw() & ~(Mask_Animations | Falling | Parabolic | FallingSlow | FadeObject)) | Animation | (anim & Mask_Animations); } - void EnableParabolic() { raw() = (raw() & ~(Mask_Animations | Falling | Animation | FallingSlow | FadeObject)) | Parabolic; } + void EnableAnimation() { raw() = (raw() & ~(Falling | Parabolic | FallingSlow | FadeObject)) | Animation; } + void EnableParabolic() { raw() = (raw() & ~(Falling | Animation | FallingSlow | FadeObject)) | Parabolic; } void EnableFlying() { raw() = (raw() & ~(Falling)) | Flying; } - void EnableFalling() { raw() = (raw() & ~(Mask_Animations | Parabolic | Animation | Flying)) | Falling; } + void EnableFalling() { raw() = (raw() & ~(Parabolic | Animation | Flying)) | Falling; } void EnableCatmullRom() { raw() = (raw() & ~SmoothGroundPath) | Catmullrom; } void EnableTransportEnter() { raw() = (raw() & ~TransportExit) | TransportEnter; } void EnableTransportExit() { raw() = (raw() & ~TransportEnter) | TransportExit; } - uint8 animTier : 3; - bool unknown0 : 1; + bool unknown0x1 : 1; + bool unknown0x2 : 1; + bool unknown0x4 : 1; + bool unknown0x8 : 1; bool fallingSlow : 1; bool done : 1; bool falling : 1; bool no_spline : 1; - bool unknown1 : 1; + bool unknown0x100 : 1; bool flying : 1; bool orientationFixed : 1; bool catmullrom : 1; @@ -116,21 +118,21 @@ namespace Movement bool frozen : 1; bool transportEnter : 1; bool transportExit : 1; - bool unknown2 : 1; - bool unknown3 : 1; + bool unknown0x20000 : 1; + bool unknown0x40000 : 1; bool backward : 1; bool smoothGroundPath : 1; bool canSwim : 1; bool uncompressedPath : 1; - bool unknown4 : 1; - bool unknown5 : 1; + bool unknown0x800000 : 1; + bool unknown0x1000000 : 1; bool animation : 1; bool parabolic : 1; bool fadeObject : 1; bool steering : 1; - bool unknown8 : 1; - bool unknown9 : 1; - bool unknown10 : 1; + bool unknown0x20000000 : 1; + bool unknown0x40000000 : 1; + bool unknown0x80000000 : 1; }; #pragma pack(pop) } diff --git a/src/server/game/Movement/Spline/MoveSplineInit.h b/src/server/game/Movement/Spline/MoveSplineInit.h index 62678e2be91..fa33851475d 100644 --- a/src/server/game/Movement/Spline/MoveSplineInit.h +++ b/src/server/game/Movement/Spline/MoveSplineInit.h @@ -181,7 +181,9 @@ namespace Movement inline void MoveSplineInit::SetAnimation(AnimType anim) { args.time_perc = 0.f; - args.flags.EnableAnimation((uint8)anim); + args.animTier.emplace(); + args.animTier->AnimTier = anim; + args.flags.EnableAnimation(); } inline void MoveSplineInit::DisableTransportPathTransformations() { args.TransformForTransport = false; } diff --git a/src/server/game/Movement/Spline/MoveSplineInitArgs.h b/src/server/game/Movement/Spline/MoveSplineInitArgs.h index 6ae25b48de0..61d2b951c94 100644 --- a/src/server/game/Movement/Spline/MoveSplineInitArgs.h +++ b/src/server/game/Movement/Spline/MoveSplineInitArgs.h @@ -50,6 +50,12 @@ namespace Movement uint32 ParabolicCurveId = 0; }; + struct AnimTierTransition + { + uint32 TierTransitionId = 0; + uint8 AnimTier = 0; + }; + struct MoveSplineInitArgs { explicit MoveSplineInitArgs(size_t path_capacity = 16); @@ -65,6 +71,7 @@ namespace Movement uint32 splineId; float initialOrientation; Optional<SpellEffectExtraData> spellEffectExtra; + Optional<AnimTierTransition> animTier; bool walk; bool HasVelocity; bool TransformForTransport; diff --git a/src/server/game/Movement/Spline/MovementUtil.cpp b/src/server/game/Movement/Spline/MovementUtil.cpp index 95ceb3752a5..f8e9ba0d8a6 100644 --- a/src/server/game/Movement/Spline/MovementUtil.cpp +++ b/src/server/game/Movement/Spline/MovementUtil.cpp @@ -133,13 +133,13 @@ namespace Movement STRINGIZE(CanSwimToFlyTrans ), // 0x00000400 STRINGIZE(Unk11 ), // 0x00000800 STRINGIZE(CanTurnWhileFalling ), // 0x00001000 - STRINGIZE(Unkt13 ), // 0x00002000 + STRINGIZE(Unk13 ), // 0x00002000 STRINGIZE(IgnoreMovementForces ), // 0x00004000 STRINGIZE(Unk15 ), // 0x00008000 STRINGIZE(CanDoubleJump ), // 0x00010000 STRINGIZE(DoubleJump ), // 0x00020000 STRINGIZE(Unk18 ), // 0x00040000 - STRINGIZE(Unk19 ), // 0x00080000 + STRINGIZE(AwaitingLoad ), // 0x00080000 STRINGIZE(InterpolatedMovement ), // 0x00100000 STRINGIZE(InterpolatedTurning ), // 0x00200000 STRINGIZE(InterpolatedPitching ), // 0x00400000 @@ -147,38 +147,38 @@ namespace Movement char const* SplineFlagNames[32] = { - STRINGIZE(AnimBit1 ), // 0x00000001 - STRINGIZE(AnimBit2 ), // 0x00000002 - STRINGIZE(AnimBit3 ), // 0x00000004 - STRINGIZE(Unknown0 ), // 0x00000008 - STRINGIZE(FallingSlow ), // 0x00000010 - STRINGIZE(Done ), // 0x00000020 - STRINGIZE(Falling ), // 0x00000040 // Not Compartible With Trajectory Movement - STRINGIZE(No_Spline ), // 0x00000080 - STRINGIZE(Unknown1 ), // 0x00000100 - STRINGIZE(Flying ), // 0x00000200 // Smooth Movement(Catmullrom Interpolation Mode), Flying Animation - STRINGIZE(OrientationFixed ), // 0x00000400 // Model Orientation Fixed - STRINGIZE(Catmullrom ), // 0x00000800 // Used Catmullrom Interpolation Mode - STRINGIZE(Cyclic ), // 0x00001000 // Movement By Cycled Spline - STRINGIZE(Enter_Cycle ), // 0x00002000 // Everytime Appears With Cyclic Flag In Monster Move Packet - STRINGIZE(Frozen ), // 0x00004000 - STRINGIZE(TransportEnter ), // 0x00008000 - STRINGIZE(TransportExit ), // 0x00010000 - STRINGIZE(Unknown2 ), // 0x00020000 - STRINGIZE(Unknown3 ), // 0x00040000 - STRINGIZE(Backward ), // 0x00080000 // Appears With Runmode Flag, Nodes ), // 1, Handles Orientation - STRINGIZE(SmoothGroundPath ), // 0x00100000 - STRINGIZE(CanSwim ), // 0x00200000 - STRINGIZE(UncompressedPath ), // 0x00400000 - STRINGIZE(Unknown4 ), // 0x00800000 - STRINGIZE(Unknown5 ), // 0x01000000 - STRINGIZE(Animation ), // 0x02000000 // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement - STRINGIZE(Parabolic ), // 0x04000000 // Not Compartible With Fall Movement - STRINGIZE(FadeObject ), // 0x08000000 - STRINGIZE(Steering ), // 0x10000000 - STRINGIZE(Unknown8 ), // 0x20000000 - STRINGIZE(Unknown9 ), // 0x40000000 - STRINGIZE(Unknown10 ), // 0x80000000 + STRINGIZE(Unknown_0x1 ), // 0x00000001 + STRINGIZE(Unknown_0x2 ), // 0x00000002 + STRINGIZE(Unknown_0x4 ), // 0x00000004 + STRINGIZE(Unknown_0x8 ), // 0x00000008 + STRINGIZE(FallingSlow ), // 0x00000010 + STRINGIZE(Done ), // 0x00000020 + STRINGIZE(Falling ), // 0x00000040 // Not Compartible With Trajectory Movement + STRINGIZE(No_Spline ), // 0x00000080 + STRINGIZE(Unknown_0x100 ), // 0x00000100 + STRINGIZE(Flying ), // 0x00000200 // Smooth Movement(Catmullrom Interpolation Mode), Flying Animation + STRINGIZE(OrientationFixed ), // 0x00000400 // Model Orientation Fixed + STRINGIZE(Catmullrom ), // 0x00000800 // Used Catmullrom Interpolation Mode + STRINGIZE(Cyclic ), // 0x00001000 // Movement By Cycled Spline + STRINGIZE(Enter_Cycle ), // 0x00002000 // Everytime Appears With Cyclic Flag In Monster Move Packet + STRINGIZE(Frozen ), // 0x00004000 + STRINGIZE(TransportEnter ), // 0x00008000 + STRINGIZE(TransportExit ), // 0x00010000 + STRINGIZE(Unknown_0x20000 ), // 0x00020000 + STRINGIZE(Unknown_0x40000 ), // 0x00040000 + STRINGIZE(Backward ), // 0x00080000 // Appears With Runmode Flag, Nodes ), // 1, Handles Orientation + STRINGIZE(SmoothGroundPath ), // 0x00100000 + STRINGIZE(CanSwim ), // 0x00200000 + STRINGIZE(UncompressedPath ), // 0x00400000 + STRINGIZE(Unknown_0x800000 ), // 0x00800000 + STRINGIZE(Unknown_0x1000000 ), // 0x01000000 + STRINGIZE(Animation ), // 0x02000000 // Animationid (0...3), Uint32 Time, Not Compartible With Trajectory And Fall Movement + STRINGIZE(Parabolic ), // 0x04000000 // Not Compartible With Fall Movement + STRINGIZE(FadeObject ), // 0x08000000 + STRINGIZE(Steering ), // 0x10000000 + STRINGIZE(Unknown_0x20000000), // 0x20000000 + STRINGIZE(Unknown_0x40000000), // 0x40000000 + STRINGIZE(Unknown_0x80000000), // 0x80000000 }; template<class Flags, int N> diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index da9d80dad63..4826cebe06d 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -376,6 +376,7 @@ class TC_GAME_API Quest int32 GetQuestLevel() const { return _level; } int32 GetQuestScalingFactionGroup() const { return _scalingFactionGroup; } int32 GetQuestMaxScalingLevel() const { return _maxScalingLevel; } + int32 GetContentTuningId() const { return 0; } uint32 GetQuestInfoID() const { return _questInfoID; } uint32 GetAllowableClasses() const { return _allowableClasses; } Trinity::RaceMask<uint64> GetAllowableRaces() const { return _allowableRaces; } diff --git a/src/server/game/Scenarios/ScenarioMgr.h b/src/server/game/Scenarios/ScenarioMgr.h index 3a56fca7a1b..62b51871754 100644 --- a/src/server/game/Scenarios/ScenarioMgr.h +++ b/src/server/game/Scenarios/ScenarioMgr.h @@ -65,9 +65,10 @@ struct ScenarioPOIPoint { int32 X; int32 Y; + int32 Z; - ScenarioPOIPoint() : X(0), Y(0) { } - ScenarioPOIPoint(int32 _X, int32 _Y) : X(_X), Y(_Y) { } + ScenarioPOIPoint() : X(0), Y(0), Z(0) { } + ScenarioPOIPoint(int32 x, int32 y) : X(x), Y(y), Z(0) { } }; struct ScenarioPOI @@ -79,18 +80,17 @@ struct ScenarioPOI int32 Flags; int32 WorldEffectID; int32 PlayerConditionID; + int32 NavigationPlayerConditionID; std::vector<ScenarioPOIPoint> Points; - ScenarioPOI() : BlobIndex(0), MapID(0), UiMapID(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0) { } + ScenarioPOI() : BlobIndex(0), MapID(0), UiMapID(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0), NavigationPlayerConditionID(0) { } ScenarioPOI(int32 blobIndex, int32 mapID, int32 uiMapID, int32 priority, int32 flags, int32 worldEffectID, int32 playerConditionID, std::vector<ScenarioPOIPoint> points) : BlobIndex(blobIndex), MapID(mapID), UiMapID(uiMapID), Priority(priority), Flags(flags), WorldEffectID(worldEffectID), - PlayerConditionID(playerConditionID), Points(std::move(points)) { } + PlayerConditionID(playerConditionID), NavigationPlayerConditionID(0), Points(std::move(points)) { } - ScenarioPOI(ScenarioPOI&& scenarioPOI) : - BlobIndex(scenarioPOI.BlobIndex), MapID(scenarioPOI.MapID), UiMapID(scenarioPOI.UiMapID), Priority(scenarioPOI.Priority), - Flags(scenarioPOI.Flags), WorldEffectID(scenarioPOI.WorldEffectID), PlayerConditionID(scenarioPOI.PlayerConditionID), Points(std::move(scenarioPOI.Points)) { } + ScenarioPOI(ScenarioPOI&& scenarioPOI) = default; }; typedef std::vector<ScenarioPOI> ScenarioPOIVector; diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.cpp b/src/server/game/Server/Packets/AreaTriggerPackets.cpp index eb4b454b028..d293c2beaba 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.cpp +++ b/src/server/game/Server/Packets/AreaTriggerPackets.cpp @@ -55,6 +55,14 @@ ByteBuffer& operator<<(ByteBuffer& data, AreaTriggerOrbitInfo const& areaTrigger return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::AreaTrigger::AreaTriggerMovementScriptInfo const& areaTriggerMovementScript) +{ + data << int32(areaTriggerMovementScript.SpellScriptID); + data << areaTriggerMovementScript.Center; + + return data; +} + void WorldPackets::AreaTrigger::AreaTrigger::Read() { _worldPacket >> AreaTriggerID; @@ -77,11 +85,15 @@ WorldPacket const* WorldPackets::AreaTrigger::AreaTriggerRePath::Write() _worldPacket.WriteBit(AreaTriggerSpline.is_initialized()); _worldPacket.WriteBit(AreaTriggerOrbit.is_initialized()); + _worldPacket.WriteBit(AreaTriggerMovementScript.is_initialized()); _worldPacket.FlushBits(); if (AreaTriggerSpline) _worldPacket << *AreaTriggerSpline; + if (AreaTriggerMovementScript) + _worldPacket << *AreaTriggerMovementScript; + if (AreaTriggerOrbit) _worldPacket << *AreaTriggerOrbit; diff --git a/src/server/game/Server/Packets/AreaTriggerPackets.h b/src/server/game/Server/Packets/AreaTriggerPackets.h index 7bb4ec70594..bb7caed140c 100644 --- a/src/server/game/Server/Packets/AreaTriggerPackets.h +++ b/src/server/game/Server/Packets/AreaTriggerPackets.h @@ -34,6 +34,12 @@ namespace WorldPackets std::vector<TaggedPosition<Position::XYZ>> Points; }; + struct AreaTriggerMovementScriptInfo + { + uint32 SpellScriptID = 0; + TaggedPosition<Position::XYZ> Center; + }; + class AreaTrigger final : public ClientPacket { public: @@ -74,6 +80,7 @@ namespace WorldPackets Optional<AreaTriggerSplineInfo> AreaTriggerSpline; Optional<AreaTriggerOrbitInfo> AreaTriggerOrbit; + Optional<AreaTriggerMovementScriptInfo> AreaTriggerMovementScript; ObjectGuid TriggerGUID; }; } diff --git a/src/server/game/Server/Packets/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp index 51b36df9bf4..68154c8572a 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.cpp +++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp @@ -154,6 +154,7 @@ ByteBuffer& operator<<(ByteBuffer& data, BucketInfo const& bucketInfo) { data << bucketInfo.Key; data << int32(bucketInfo.TotalQuantity); + data << int32(bucketInfo.RequiredLevel); data << uint64(bucketInfo.MinPrice); data << uint32(bucketInfo.ItemModifiedAppearanceIDs.size()); if (!bucketInfo.ItemModifiedAppearanceIDs.empty()) @@ -162,6 +163,7 @@ ByteBuffer& operator<<(ByteBuffer& data, BucketInfo const& bucketInfo) data.WriteBit(bucketInfo.MaxBattlePetQuality.is_initialized()); data.WriteBit(bucketInfo.MaxBattlePetLevel.is_initialized()); data.WriteBit(bucketInfo.BattlePetBreedID.is_initialized()); + data.WriteBit(bucketInfo.Unk901_1.is_initialized()); data.WriteBit(bucketInfo.ContainsOwnerItem); data.WriteBit(bucketInfo.ContainsOnlyCollectedAppearances); data.FlushBits(); @@ -175,6 +177,9 @@ ByteBuffer& operator<<(ByteBuffer& data, BucketInfo const& bucketInfo) if (bucketInfo.BattlePetBreedID) data << uint8(*bucketInfo.BattlePetBreedID); + if (bucketInfo.Unk901_1) + data << uint32(*bucketInfo.Unk901_1); + return data; } @@ -633,6 +638,9 @@ WorldPacket const* AuctionListOwnedItemsResult::Write() for (AuctionItem const& item : Items) _worldPacket << item; + for (AuctionItem const& item : SoldItems) + _worldPacket << item; + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h index 15016ecd2e8..59dd8dbcff3 100644 --- a/src/server/game/Server/Packets/AuctionHousePackets.h +++ b/src/server/game/Server/Packets/AuctionHousePackets.h @@ -95,11 +95,13 @@ namespace WorldPackets { AuctionBucketKey Key; int32 TotalQuantity = 0; + int32 RequiredLevel = 0; uint64 MinPrice = 0; std::vector<int32> ItemModifiedAppearanceIDs; Optional<uint8> MaxBattlePetQuality; Optional<uint8> MaxBattlePetLevel; Optional<uint8> BattlePetBreedID; + Optional<uint32> Unk901_1; bool ContainsOwnerItem = false; bool ContainsOnlyCollectedAppearances = false; }; diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 1215296a877..f7b58ae0659 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -150,13 +150,13 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write() _worldPacket.FlushBits(); { - _worldPacket << uint32(SuccessInfo->Billing.BillingPlan); - _worldPacket << uint32(SuccessInfo->Billing.TimeRemain); - _worldPacket << uint32(SuccessInfo->Billing.Unknown735); + _worldPacket << uint32(SuccessInfo->GameTimeInfo.BillingPlan); + _worldPacket << uint32(SuccessInfo->GameTimeInfo.TimeRemain); + _worldPacket << uint32(SuccessInfo->GameTimeInfo.Unknown735); // 3x same bit is not a mistake - preserves legacy client behavior of BillingPlanFlags::SESSION_IGR - _worldPacket.WriteBit(SuccessInfo->Billing.InGameRoom); // inGameRoom check in function checking which lua event to fire when remaining time is near end - BILLING_NAG_DIALOG vs IGR_BILLING_NAG_DIALOG - _worldPacket.WriteBit(SuccessInfo->Billing.InGameRoom); // inGameRoom lua return from Script_GetBillingPlan - _worldPacket.WriteBit(SuccessInfo->Billing.InGameRoom); // not used anywhere in the client + _worldPacket.WriteBit(SuccessInfo->GameTimeInfo.InGameRoom); // inGameRoom check in function checking which lua event to fire when remaining time is near end - BILLING_NAG_DIALOG vs IGR_BILLING_NAG_DIALOG + _worldPacket.WriteBit(SuccessInfo->GameTimeInfo.InGameRoom); // inGameRoom lua return from Script_GetBillingPlan + _worldPacket.WriteBit(SuccessInfo->GameTimeInfo.InGameRoom); // not used anywhere in the client _worldPacket.FlushBits(); } diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 75b61acda5a..dc4eab9e310 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -118,6 +118,7 @@ namespace WorldPackets struct VirtualRealmInfo { + VirtualRealmInfo() : RealmAddress(0) { } VirtualRealmInfo(uint32 realmAddress, bool isHomeRealm, bool isInternalRealm, std::string const& realmNameActual, std::string const& realmNameNormalized) : RealmAddress(realmAddress), RealmNameInfo(isHomeRealm, isInternalRealm, realmNameActual, realmNameNormalized) { } @@ -130,7 +131,7 @@ namespace WorldPackets public: struct AuthSuccessInfo { - struct BillingInfo + struct GameTime { uint32 BillingPlan = 0; uint32 TimeRemain = 0; @@ -147,7 +148,7 @@ namespace WorldPackets uint32 CurrencyID = 0; ///< this is probably used for the ingame shop. @todo implement int32 Time = 0; - BillingInfo Billing; + GameTime GameTimeInfo; std::vector<VirtualRealmInfo> VirtualRealms; ///< list of realms connected to this one (inclusive) @todo implement std::vector<CharacterTemplate const*> Templates; ///< list of pre-made character templates. @@ -295,6 +296,7 @@ namespace WorldPackets } } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::VirtualRealmInfo const& realmInfo); ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Auth::VirtualRealmNameInfo const& realmInfo); #endif // AuthenticationPacketsWorld_h__ diff --git a/src/server/game/Server/Packets/BattlePetPackets.cpp b/src/server/game/Server/Packets/BattlePetPackets.cpp index d939ee026ba..4568103d7de 100644 --- a/src/server/game/Server/Packets/BattlePetPackets.cpp +++ b/src/server/game/Server/Packets/BattlePetPackets.cpp @@ -84,7 +84,7 @@ WorldPacket const* WorldPackets::BattlePet::BattlePetUpdates::Write() _worldPacket.WriteBit(PetAdded); _worldPacket.FlushBits(); - for (auto const& pet : Pets) + for (BattlePet const& pet : Pets) _worldPacket << pet; return &_worldPacket; diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index bc925b0ae93..ecf37c02761 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -22,7 +22,10 @@ WorldPacket const* WorldPackets::Battleground::SeasonInfo::Write() _worldPacket << int32(MythicPlusSeasonID); _worldPacket << int32(CurrentSeason); _worldPacket << int32(PreviousSeason); + _worldPacket << int32(ConquestWeeklyProgressCurrencyID); _worldPacket << int32(PvpSeasonID); + _worldPacket.WriteBit(WeeklyRewardChestsEnabled); + _worldPacket.FlushBits(); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index dfb19be4108..f5389ae22f1 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -33,7 +33,7 @@ namespace WorldPackets class SeasonInfo final : public ServerPacket { public: - SeasonInfo() : ServerPacket(SMSG_SEASON_INFO, 4 + 4 + 4 + 4) { } + SeasonInfo() : ServerPacket(SMSG_SEASON_INFO, 4 + 4 + 4 + 4 + 4 + 1) { } WorldPacket const* Write() override; @@ -41,6 +41,8 @@ namespace WorldPackets int32 PreviousSeason = 0; int32 CurrentSeason = 0; int32 PvpSeasonID = 0; + int32 ConquestWeeklyProgressCurrencyID = 0; + bool WeeklyRewardChestsEnabled = false; }; class AreaSpiritHealerQuery final : public ClientPacket @@ -416,10 +418,10 @@ namespace WorldPackets void Read() override { } }; - class RequestRatedBattlefieldInfo final : public ClientPacket + class RequestRatedPvpInfo final : public ClientPacket { public: - RequestRatedBattlefieldInfo(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_RATED_BATTLEFIELD_INFO, std::move(packet)) { } + RequestRatedPvpInfo(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_RATED_PVP_INFO, std::move(packet)) { } void Read() override { } }; diff --git a/src/server/game/Server/Packets/CalendarPackets.cpp b/src/server/game/Server/Packets/CalendarPackets.cpp index 436a820c020..d12d73831e6 100644 --- a/src/server/game/Server/Packets/CalendarPackets.cpp +++ b/src/server/game/Server/Packets/CalendarPackets.cpp @@ -80,7 +80,7 @@ void WorldPackets::Calendar::CalendarGetEvent::Read() _worldPacket >> EventID; } -void WorldPackets::Calendar::CalendarCommunityFilter::Read() +void WorldPackets::Calendar::CalendarCommunityInviteRequest::Read() { _worldPacket >> ClubID; _worldPacket >> MinLevel; @@ -182,14 +182,14 @@ void WorldPackets::Calendar::CalendarCopyEvent::Read() Date = _worldPacket.ReadPackedTime(); } -void WorldPackets::Calendar::CalendarEventRSVP::Read() +void WorldPackets::Calendar::CalendarRSVP::Read() { _worldPacket >> EventID; _worldPacket >> InviteID; _worldPacket >> Status; } -void WorldPackets::Calendar::CalendarEventInvite::Read() +void WorldPackets::Calendar::CalendarInvite::Read() { _worldPacket >> EventID; _worldPacket >> ModeratorID; @@ -217,7 +217,7 @@ void WorldPackets::Calendar::CalendarRemoveInvite::Read() _worldPacket >> EventID; } -void WorldPackets::Calendar::CalendarEventStatus::Read() +void WorldPackets::Calendar::CalendarStatus::Read() { _worldPacket >> Guid; _worldPacket >> EventID; @@ -233,7 +233,7 @@ void WorldPackets::Calendar::SetSavedInstanceExtend::Read() Extend = _worldPacket.ReadBit(); } -void WorldPackets::Calendar::CalendarEventModeratorStatus::Read() +void WorldPackets::Calendar::CalendarModeratorStatusQuery::Read() { _worldPacket >> Guid; _worldPacket >> EventID; diff --git a/src/server/game/Server/Packets/CalendarPackets.h b/src/server/game/Server/Packets/CalendarPackets.h index 0010dc71c72..1f292ca1468 100644 --- a/src/server/game/Server/Packets/CalendarPackets.h +++ b/src/server/game/Server/Packets/CalendarPackets.h @@ -46,10 +46,10 @@ namespace WorldPackets uint64 EventID = 0; }; - class CalendarCommunityFilter final : public ClientPacket + class CalendarCommunityInviteRequest final : public ClientPacket { public: - CalendarCommunityFilter(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_COMMUNITY_FILTER, std::move(packet)) { } + CalendarCommunityInviteRequest(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_COMMUNITY_INVITE, std::move(packet)) { } void Read() override; @@ -256,10 +256,10 @@ namespace WorldPackets std::string EventName; }; - class CalendarEventInvite final : public ClientPacket + class CalendarInvite final : public ClientPacket { public: - CalendarEventInvite(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_INVITE, std::move(packet)) { } + CalendarInvite(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_INVITE, std::move(packet)) { } void Read() override; @@ -271,10 +271,10 @@ namespace WorldPackets std::string Name; }; - class CalendarEventRSVP final : public ClientPacket + class CalendarRSVP final : public ClientPacket { public: - CalendarEventRSVP(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_RSVP, std::move(packet)) { } + CalendarRSVP(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_RSVP, std::move(packet)) { } void Read() override; @@ -422,10 +422,10 @@ namespace WorldPackets uint64 InviteID = 0; }; - class CalendarEventStatus final : public ClientPacket + class CalendarStatus final : public ClientPacket { public: - CalendarEventStatus(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_STATUS, std::move(packet)) { } + CalendarStatus(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_STATUS, std::move(packet)) { } void Read() override; @@ -448,10 +448,10 @@ namespace WorldPackets uint32 DifficultyID = 0; }; - class CalendarEventModeratorStatus final : public ClientPacket + class CalendarModeratorStatusQuery final : public ClientPacket { public: - CalendarEventModeratorStatus(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_EVENT_MODERATOR_STATUS, std::move(packet)) { } + CalendarModeratorStatusQuery(WorldPacket&& packet) : ClientPacket(CMSG_CALENDAR_MODERATOR_STATUS, std::move(packet)) { } void Read() override; diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index 15a86fed6ca..2e7f834cf27 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -77,7 +77,7 @@ namespace WorldPackets std::string ChannelWelcomeMsg; int32 ChatChannelID = 0; - int32 InstanceID = 0; + uint64 InstanceID = 0; uint32 _ChannelFlags = 0; ///< @see enum ChannelFlags std::string _Channel; ///< Channel Name ObjectGuid ChannelGUID; diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 42d3893ff12..86ebe42cb7f 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -22,12 +22,32 @@ #include "Player.h" #include "World.h" -WorldPackets::Character::EnumCharacters::EnumCharacters(WorldPacket&& packet) : ClientPacket(std::move(packet)) +namespace WorldPackets +{ +namespace Character +{ +ByteBuffer& operator<<(ByteBuffer& data, ChrCustomizationChoice const& customizationChoice) +{ + data << uint32(customizationChoice.ChrCustomizationOptionID); + data << uint32(customizationChoice.ChrCustomizationChoiceID); + + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, ChrCustomizationChoice& customizationChoice) +{ + data >> customizationChoice.ChrCustomizationOptionID; + data >> customizationChoice.ChrCustomizationChoiceID; + + return data; +} + +EnumCharacters::EnumCharacters(WorldPacket&& packet) : ClientPacket(std::move(packet)) { ASSERT(GetOpcode() == CMSG_ENUM_CHARACTERS || GetOpcode() == CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT); } -WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) +EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields) { // 0 1 2 3 4 5 6 7 // "SELECT characters.guid, characters.name, characters.race, characters.class, characters.gender, characters.skin, characters.face, characters.hairStyle, " @@ -123,17 +143,18 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::CharacterInfo::VisualItemInfo const& visualItem) +ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo::VisualItemInfo const& visualItem) { data << uint32(visualItem.DisplayID); data << uint32(visualItem.DisplayEnchantID); + data << int32(visualItem.ItemModifiedAppearanceID); data << uint8(visualItem.InvType); data << uint8(visualItem.Subclass); return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::CharacterInfo const& charInfo) +ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo const& charInfo) { data << charInfo.Guid; data << uint64(charInfo.GuildClubMemberID); @@ -141,12 +162,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters data << uint8(charInfo.RaceID); data << uint8(charInfo.ClassID); data << uint8(charInfo.SexID); - data << uint8(charInfo.SkinID); - data << uint8(charInfo.FaceID); - data << uint8(charInfo.HairStyle); - data << uint8(charInfo.HairColor); - data << uint8(charInfo.FacialHair); - data.append(charInfo.CustomDisplay.data(), charInfo.CustomDisplay.size()); + data << uint32(charInfo.Customizations.size()); data << uint8(charInfo.ExperienceLevel); data << int32(charInfo.ZoneID); data << int32(charInfo.MapID); @@ -162,7 +178,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters data << uint32(charInfo.ProfessionIds[0]); data << uint32(charInfo.ProfessionIds[1]); - for (WorldPackets::Character::EnumCharactersResult::CharacterInfo::VisualItemInfo const& visualItem : charInfo.VisualItems) + for (EnumCharactersResult::CharacterInfo::VisualItemInfo const& visualItem : charInfo.VisualItems) data << visualItem; data << uint32(charInfo.LastPlayedTime); @@ -170,18 +186,23 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters data << uint32(charInfo.Unknown703); data << uint32(charInfo.LastLoginVersion); data << uint32(charInfo.Flags4); - data << uint32(charInfo.Unknown830.size()); + data << uint32(charInfo.MailSenders.size()); + data << uint32(charInfo.OverrideSelectScreenFileDataID); + + for (ChrCustomizationChoice customization : charInfo.Customizations) + data << customization; + data.WriteBits(charInfo.Name.length(), 6); data.WriteBit(charInfo.FirstLogin); data.WriteBit(charInfo.BoostInProgress); data.WriteBits(charInfo.unkWod61x, 5); - for (std::string const& str : charInfo.Unknown830) + for (std::string const& str : charInfo.MailSenders) data.WriteBits(str.length() + 1, 6); data.FlushBits(); - for (std::string const& str : charInfo.Unknown830) + for (std::string const& str : charInfo.MailSenders) if (!str.empty()) data << str; @@ -190,7 +211,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::RaceUnlock const& raceUnlock) +ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::RaceUnlock const& raceUnlock) { data << int32(raceUnlock.RaceID); data.WriteBit(raceUnlock.HasExpansion); @@ -201,7 +222,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::UnlockedConditionalAppearance const& unlockedConditionalAppearance) +ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::UnlockedConditionalAppearance const& unlockedConditionalAppearance) { data << int32(unlockedConditionalAppearance.AchievementID); data << int32(unlockedConditionalAppearance.Unused); @@ -209,15 +230,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters return data; } -WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() +WorldPacket const* EnumCharactersResult::Write() { _worldPacket.reserve(9 + Characters.size() * sizeof(CharacterInfo) + RaceUnlockData.size() * sizeof(RaceUnlock)); _worldPacket.WriteBit(Success); _worldPacket.WriteBit(IsDeletedCharacters); - _worldPacket.WriteBit(IsTestDemonHunterCreationAllowed); - _worldPacket.WriteBit(HasDemonHunterOnRealm); - _worldPacket.WriteBit(IsDemonHunterCreationAllowed); + _worldPacket.WriteBit(IsNewPlayerRestrictionSkipped); + _worldPacket.WriteBit(IsNewPlayer); _worldPacket.WriteBit(DisabledClassesMask.is_initialized()); _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); _worldPacket << uint32(Characters.size()); @@ -240,54 +260,66 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() return &_worldPacket; } -void WorldPackets::Character::CreateCharacter::Read() +void CheckCharacterNameAvailability::Read() { - CreateInfo.reset(new CharacterCreateInfo()); + _worldPacket >> SequenceIndex; + Name = _worldPacket.ReadString(_worldPacket.ReadBits(6)); +} + +WorldPacket const* CheckCharacterNameAvailabilityResult::Write() +{ + _worldPacket << uint32(SequenceIndex); + _worldPacket << uint32(Result); + + return &_worldPacket; +} + +void CreateCharacter::Read() +{ + CreateInfo = std::make_shared<CharacterCreateInfo>(); uint32 nameLength = _worldPacket.ReadBits(6); bool const hasTemplateSet = _worldPacket.ReadBit(); CreateInfo->IsTrialBoost = _worldPacket.ReadBit(); + CreateInfo->UseNPE = _worldPacket.ReadBit(); _worldPacket >> CreateInfo->Race; _worldPacket >> CreateInfo->Class; _worldPacket >> CreateInfo->Sex; - _worldPacket >> CreateInfo->Skin; - _worldPacket >> CreateInfo->Face; - _worldPacket >> CreateInfo->HairStyle; - _worldPacket >> CreateInfo->HairColor; - _worldPacket >> CreateInfo->FacialHairStyle; - _worldPacket >> CreateInfo->OutfitId; - _worldPacket.read(CreateInfo->CustomDisplay.data(), CreateInfo->CustomDisplay.size()); + CreateInfo->Customizations.resize(_worldPacket.read<uint32>()); CreateInfo->Name = _worldPacket.ReadString(nameLength); if (hasTemplateSet) CreateInfo->TemplateSet = _worldPacket.read<int32>(); + + for (ChrCustomizationChoice& customization : CreateInfo->Customizations) + _worldPacket >> customization; } -WorldPacket const* WorldPackets::Character::CreateChar::Write() +WorldPacket const* CreateChar::Write() { _worldPacket << uint8(Code); _worldPacket << Guid; return &_worldPacket; } -void WorldPackets::Character::CharDelete::Read() +void CharDelete::Read() { _worldPacket >> Guid; } -WorldPacket const* WorldPackets::Character::DeleteChar::Write() +WorldPacket const* DeleteChar::Write() { _worldPacket << uint8(Code); return &_worldPacket; } -void WorldPackets::Character::CharacterRenameRequest::Read() +void CharacterRenameRequest::Read() { - RenameInfo.reset(new CharacterRenameInfo()); + RenameInfo = std::make_shared<CharacterRenameInfo>(); _worldPacket >> RenameInfo->Guid; RenameInfo->NewName = _worldPacket.ReadString(_worldPacket.ReadBits(6)); } -WorldPacket const* WorldPackets::Character::CharacterRenameResult::Write() +WorldPacket const* CharacterRenameResult::Write() { _worldPacket << uint8(Result); _worldPacket.WriteBit(Guid.is_initialized()); @@ -302,23 +334,21 @@ WorldPacket const* WorldPackets::Character::CharacterRenameResult::Write() return &_worldPacket; } -void WorldPackets::Character::CharCustomize::Read() +void CharCustomize::Read() { - CustomizeInfo.reset(new CharCustomizeInfo()); + CustomizeInfo = std::make_shared<CharCustomizeInfo>(); _worldPacket >> CustomizeInfo->CharGUID; _worldPacket >> CustomizeInfo->SexID; - _worldPacket >> CustomizeInfo->SkinID; - _worldPacket >> CustomizeInfo->HairColorID; - _worldPacket >> CustomizeInfo->HairStyleID; - _worldPacket >> CustomizeInfo->FacialHairStyleID; - _worldPacket >> CustomizeInfo->FaceID; - _worldPacket.read(CustomizeInfo->CustomDisplay.data(), CustomizeInfo->CustomDisplay.size()); + CustomizeInfo->Customizations.resize(_worldPacket.read<uint32>()); + for (ChrCustomizationChoice& customization : CustomizeInfo->Customizations) + _worldPacket >> customization; + CustomizeInfo->CharName = _worldPacket.ReadString(_worldPacket.ReadBits(6)); } -void WorldPackets::Character::CharRaceOrFactionChange::Read() +void CharRaceOrFactionChange::Read() { - RaceOrFactionChangeInfo.reset(new CharRaceOrFactionChangeInfo()); + RaceOrFactionChangeInfo = std::make_shared<CharRaceOrFactionChangeInfo>(); RaceOrFactionChangeInfo->FactionChange = _worldPacket.ReadBit(); @@ -327,16 +357,13 @@ void WorldPackets::Character::CharRaceOrFactionChange::Read() _worldPacket >> RaceOrFactionChangeInfo->Guid; _worldPacket >> RaceOrFactionChangeInfo->SexID; _worldPacket >> RaceOrFactionChangeInfo->RaceID; - _worldPacket >> RaceOrFactionChangeInfo->SkinID; - _worldPacket >> RaceOrFactionChangeInfo->HairColorID; - _worldPacket >> RaceOrFactionChangeInfo->HairStyleID; - _worldPacket >> RaceOrFactionChangeInfo->FacialHairStyleID; - _worldPacket >> RaceOrFactionChangeInfo->FaceID; - _worldPacket.read(RaceOrFactionChangeInfo->CustomDisplay.data(), RaceOrFactionChangeInfo->CustomDisplay.size()); + RaceOrFactionChangeInfo->Customizations.resize(_worldPacket.read<uint32>()); RaceOrFactionChangeInfo->Name = _worldPacket.ReadString(nameLength); + for (ChrCustomizationChoice& customization : RaceOrFactionChangeInfo->Customizations) + _worldPacket >> customization; } -WorldPacket const* WorldPackets::Character::CharFactionChangeResult::Write() +WorldPacket const* CharFactionChangeResult::Write() { _worldPacket << uint8(Result); _worldPacket << Guid; @@ -347,26 +374,22 @@ WorldPacket const* WorldPackets::Character::CharFactionChangeResult::Write() { _worldPacket.WriteBits(Display->Name.length(), 6); _worldPacket << uint8(Display->SexID); - _worldPacket << uint8(Display->SkinID); - _worldPacket << uint8(Display->HairColorID); - _worldPacket << uint8(Display->HairStyleID); - _worldPacket << uint8(Display->FacialHairStyleID); - _worldPacket << uint8(Display->FaceID); _worldPacket << uint8(Display->RaceID); - _worldPacket.append(Display->CustomDisplay.data(), Display->CustomDisplay.size()); _worldPacket.WriteString(Display->Name); + for (ChrCustomizationChoice customization : *Display->Customizations) + _worldPacket << customization; } return &_worldPacket; } -void WorldPackets::Character::GenerateRandomCharacterName::Read() +void GenerateRandomCharacterName::Read() { _worldPacket >> Race; _worldPacket >> Sex; } -WorldPacket const* WorldPackets::Character::GenerateRandomCharacterNameResult::Write() +WorldPacket const* GenerateRandomCharacterNameResult::Write() { _worldPacket.WriteBit(Success); _worldPacket.WriteBits(Name.length(), 6); @@ -377,11 +400,11 @@ WorldPacket const* WorldPackets::Character::GenerateRandomCharacterNameResult::W return &_worldPacket; } -WorldPackets::Character::ReorderCharacters::ReorderCharacters(WorldPacket&& packet) : ClientPacket(CMSG_REORDER_CHARACTERS, std::move(packet)) +ReorderCharacters::ReorderCharacters(WorldPacket&& packet) : ClientPacket(CMSG_REORDER_CHARACTERS, std::move(packet)) { } -void WorldPackets::Character::ReorderCharacters::Read() +void ReorderCharacters::Read() { Entries.resize(_worldPacket.ReadBits(9)); for (ReorderInfo& reorderInfo : Entries) @@ -391,14 +414,14 @@ void WorldPackets::Character::ReorderCharacters::Read() } } -void WorldPackets::Character::UndeleteCharacter::Read() +void UndeleteCharacter::Read() { - UndeleteInfo.reset(new CharacterUndeleteInfo()); + UndeleteInfo = std::make_shared<CharacterUndeleteInfo>(); _worldPacket >> UndeleteInfo->ClientToken; _worldPacket >> UndeleteInfo->CharacterGuid; } -WorldPacket const* WorldPackets::Character::UndeleteCharacterResponse::Write() +WorldPacket const* UndeleteCharacterResponse::Write() { ASSERT(UndeleteInfo); _worldPacket << int32(UndeleteInfo->ClientToken); @@ -407,7 +430,7 @@ WorldPacket const* WorldPackets::Character::UndeleteCharacterResponse::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Character::UndeleteCooldownStatusResponse::Write() +WorldPacket const* UndeleteCooldownStatusResponse::Write() { _worldPacket.WriteBit(OnCooldown); _worldPacket << uint32(MaxCooldown); @@ -415,13 +438,13 @@ WorldPacket const* WorldPackets::Character::UndeleteCooldownStatusResponse::Writ return &_worldPacket; } -void WorldPackets::Character::PlayerLogin::Read() +void PlayerLogin::Read() { _worldPacket >> Guid; _worldPacket >> FarClip; } -WorldPacket const* WorldPackets::Character::LoginVerifyWorld::Write() +WorldPacket const* LoginVerifyWorld::Write() { _worldPacket << int32(MapID); _worldPacket << Pos; @@ -429,18 +452,18 @@ WorldPacket const* WorldPackets::Character::LoginVerifyWorld::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Character::CharacterLoginFailed::Write() +WorldPacket const* CharacterLoginFailed::Write() { _worldPacket << uint8(Code); return &_worldPacket; } -void WorldPackets::Character::LogoutRequest::Read() +void LogoutRequest::Read() { IdleLogout = _worldPacket.ReadBit(); } -WorldPacket const* WorldPackets::Character::LogoutResponse::Write() +WorldPacket const* LogoutResponse::Write() { _worldPacket << int32(LogoutResult); _worldPacket.WriteBit(Instant); @@ -448,13 +471,13 @@ WorldPacket const* WorldPackets::Character::LogoutResponse::Write() return &_worldPacket; } -void WorldPackets::Character::LoadingScreenNotify::Read() +void LoadingScreenNotify::Read() { _worldPacket >> MapID; Showing = _worldPacket.ReadBit(); } -WorldPacket const* WorldPackets::Character::InitialSetup::Write() +WorldPacket const* InitialSetup::Write() { _worldPacket << uint8(ServerExpansionLevel); _worldPacket << uint8(ServerExpansionTier); @@ -462,17 +485,17 @@ WorldPacket const* WorldPackets::Character::InitialSetup::Write() return &_worldPacket; } -void WorldPackets::Character::SetActionBarToggles::Read() +void SetActionBarToggles::Read() { _worldPacket >> Mask; } -void WorldPackets::Character::RequestPlayedTime::Read() +void RequestPlayedTime::Read() { TriggerScriptEvent = _worldPacket.ReadBit(); } -WorldPacket const* WorldPackets::Character::PlayedTime::Write() +WorldPacket const* PlayedTime::Write() { _worldPacket << int32(TotalTime); _worldPacket << int32(LevelTime); @@ -482,29 +505,26 @@ WorldPacket const* WorldPackets::Character::PlayedTime::Write() return &_worldPacket; } -void WorldPackets::Character::SetTitle::Read() +void SetTitle::Read() { _worldPacket >> TitleID; } -void WorldPackets::Character::AlterApperance::Read() +void AlterApperance::Read() { - _worldPacket >> NewHairStyle; - _worldPacket >> NewHairColor; - _worldPacket >> NewFacialHair; - _worldPacket >> NewSkinColor; - _worldPacket >> NewFace; - for (std::size_t i = 0; i < NewCustomDisplay.size(); ++i) - _worldPacket >> NewCustomDisplay[i]; + Customizations.resize(_worldPacket.read<uint32>()); + _worldPacket >> NewSex; + for (ChrCustomizationChoice& customization : Customizations) + _worldPacket >> customization; } -WorldPacket const* WorldPackets::Character::BarberShopResult::Write() +WorldPacket const* BarberShopResult::Write() { _worldPacket << int32(Result); return &_worldPacket; } -WorldPacket const* WorldPackets::Character::LogXPGain::Write() +WorldPacket const* LogXPGain::Write() { _worldPacket << Victim; _worldPacket << int32(Original); @@ -516,64 +536,56 @@ WorldPacket const* WorldPackets::Character::LogXPGain::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Character::TitleEarned::Write() +WorldPacket const* TitleEarned::Write() { _worldPacket << uint32(Index); return &_worldPacket; } -void WorldPackets::Character::SetFactionAtWar::Read() +void SetFactionAtWar::Read() { _worldPacket >> FactionIndex; } -void WorldPackets::Character::SetFactionNotAtWar::Read() +void SetFactionNotAtWar::Read() { _worldPacket >> FactionIndex; } -void WorldPackets::Character::SetFactionInactive::Read() +void SetFactionInactive::Read() { _worldPacket >> Index; State = _worldPacket.ReadBit(); } -void WorldPackets::Character::SetWatchedFaction::Read() +void SetWatchedFaction::Read() { _worldPacket >> FactionIndex; } -WorldPacket const* WorldPackets::Character::SetFactionVisible::Write() +WorldPacket const* SetFactionVisible::Write() { _worldPacket << FactionIndex; return &_worldPacket; } -WorldPackets::Character::CharCustomizeSuccess::CharCustomizeSuccess(WorldPackets::Character::CharCustomizeInfo const* info) - : ServerPacket(SMSG_CHAR_CUSTOMIZE_SUCCESS, 16 + 1 + 1 + 1 + 1 + 1 + 1 + 1) +CharCustomizeSuccess::CharCustomizeSuccess(CharCustomizeInfo const* info) + : ServerPacket(SMSG_CHAR_CUSTOMIZE_SUCCESS, 16 + 1 + 1 + 1 + 1 + 1 + 1 + 1), Customizations(info->Customizations) { CharGUID = info->CharGUID; SexID = info->SexID; - SkinID = info->SkinID; - HairColorID = info->HairColorID; - HairStyleID = info->HairStyleID; - FacialHairStyleID = info->FacialHairStyleID; - FaceID = info->FaceID; CharName = info->CharName; - CustomDisplay = info->CustomDisplay; } -WorldPacket const* WorldPackets::Character::CharCustomizeSuccess::Write() +WorldPacket const* CharCustomizeSuccess::Write() { _worldPacket << CharGUID; _worldPacket << uint8(SexID); - _worldPacket << uint8(SkinID); - _worldPacket << uint8(HairColorID); - _worldPacket << uint8(HairStyleID); - _worldPacket << uint8(FacialHairStyleID); - _worldPacket << uint8(FaceID); - _worldPacket.append(CustomDisplay.data(), CustomDisplay.size()); + _worldPacket << uint32(Customizations.size()); + for (ChrCustomizationChoice customization : Customizations) + _worldPacket << customization; + _worldPacket.WriteBits(CharName.length(), 6); _worldPacket.FlushBits(); _worldPacket.WriteString(CharName); @@ -581,7 +593,7 @@ WorldPacket const* WorldPackets::Character::CharCustomizeSuccess::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Character::CharCustomizeFailure::Write() +WorldPacket const* CharCustomizeFailure::Write() { _worldPacket << uint8(Result); _worldPacket << CharGUID; @@ -589,7 +601,7 @@ WorldPacket const* WorldPackets::Character::CharCustomizeFailure::Write() return &_worldPacket; } -void WorldPackets::Character::SetPlayerDeclinedNames::Read() +void SetPlayerDeclinedNames::Read() { _worldPacket >> Player; @@ -602,10 +614,12 @@ void WorldPackets::Character::SetPlayerDeclinedNames::Read() DeclinedNames.name[i] = _worldPacket.ReadString(stringLengths[i]); } -WorldPacket const * WorldPackets::Character::SetPlayerDeclinedNamesResult::Write() +WorldPacket const * SetPlayerDeclinedNamesResult::Write() { _worldPacket << int32(ResultCode); _worldPacket << Player; return &_worldPacket; } +} +} diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 5880cb43119..d34e5d7e301 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -35,6 +35,15 @@ namespace WorldPackets { namespace Character { + struct ChrCustomizationChoice + { + uint32 ChrCustomizationOptionID = 0; + uint32 ChrCustomizationChoiceID = 0; + }; + + ByteBuffer& operator<<(ByteBuffer& data, ChrCustomizationChoice const& customizationChoice); + ByteBuffer& operator>>(ByteBuffer& data, ChrCustomizationChoice& customizationChoice); + class EnumCharacters final : public ClientPacket { public: @@ -49,15 +58,10 @@ namespace WorldPackets uint8 Race = RACE_NONE; uint8 Class = CLASS_NONE; uint8 Sex = GENDER_NONE; - uint8 Skin = 0; - uint8 Face = 0; - uint8 HairStyle = 0; - uint8 HairColor = 0; - uint8 FacialHairStyle = 0; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay = { }; - uint8 OutfitId = 0; + Array<ChrCustomizationChoice, 50> Customizations; Optional<int32> TemplateSet; bool IsTrialBoost = false; + bool UseNPE = false; std::string Name; /// Server side data @@ -72,30 +76,20 @@ namespace WorldPackets struct CharCustomizeInfo { - uint8 HairStyleID = 0; - uint8 FaceID = 0; ObjectGuid CharGUID; uint8 SexID = GENDER_NONE; std::string CharName; - uint8 HairColorID = 0; - uint8 FacialHairStyleID = 0; - uint8 SkinID = 0; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay = { }; + Array<ChrCustomizationChoice, 50> Customizations; }; struct CharRaceOrFactionChangeInfo { - uint8 HairColorID = 0; uint8 RaceID = RACE_NONE; uint8 SexID = GENDER_NONE; - uint8 SkinID = 0; - uint8 FacialHairStyleID = 0; ObjectGuid Guid; bool FactionChange = false; std::string Name; - uint8 FaceID = 0; - uint8 HairStyleID = 0; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay = { }; + Array<ChrCustomizationChoice, 50> Customizations; }; struct CharacterUndeleteInfo @@ -129,12 +123,7 @@ namespace WorldPackets uint8 RaceID = 0; uint8 ClassID = 0; uint8 SexID = 0; - uint8 SkinID = 0; - uint8 FaceID = 0; - uint8 HairStyle = 0; - uint8 HairColor = 0; - uint8 FacialHair = 0; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay = { }; + std::vector<ChrCustomizationChoice> Customizations; uint8 ExperienceLevel = 0; int32 ZoneID = 0; int32 MapID = 0; @@ -150,6 +139,7 @@ namespace WorldPackets uint16 SpecID = 0; uint32 Unknown703 = 0; uint32 LastLoginVersion = 0; + uint32 OverrideSelectScreenFileDataID = 0; uint32 PetCreatureDisplayID = 0; uint32 PetExperienceLevel = 0; @@ -162,13 +152,13 @@ namespace WorldPackets { uint32 DisplayID = 0; uint32 DisplayEnchantID = 0; + int32 ItemModifiedAppearanceID = 0; // also -1 is some special value uint8 InvType = 0; uint8 Subclass = 0; }; std::array<VisualItemInfo, 23> VisualItems = { }; - std::vector<std::string> Unknown830; // Something with character names, same length limit as name, - // client accepts unlimited number of these in packet but only uses first 3 + std::vector<std::string> MailSenders; }; struct RaceUnlock @@ -191,9 +181,8 @@ namespace WorldPackets bool Success = false; ///< bool IsDeletedCharacters = false; ///< used for character undelete list - bool IsTestDemonHunterCreationAllowed = false; ///< allows client to skip 1 per realm and level 70 requirements - bool HasDemonHunterOnRealm = false; - bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access + bool IsNewPlayerRestrictionSkipped = false; ///< allows client to skip new player restrictions + bool IsNewPlayer = false; ///< forbids hero classes and allied races bool IsAlliedRacesCreationAllowed = false; int32 MaxCharacterLevel = 1; @@ -204,6 +193,31 @@ namespace WorldPackets std::vector<UnlockedConditionalAppearance> UnlockedConditionalAppearances; }; + class CheckCharacterNameAvailability final : public ClientPacket + { + public: + CheckCharacterNameAvailability(WorldPacket&& packet) : ClientPacket(CMSG_CHECK_CHARACTER_NAME_AVAILABILITY, std::move(packet)) { } + + void Read() override; + + uint32 SequenceIndex = 0; + std::string Name; + }; + + class CheckCharacterNameAvailabilityResult final : public ServerPacket + { + public: + CheckCharacterNameAvailabilityResult(uint32 sequenceIndex, uint32 result) : ServerPacket(SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT, 4 + 4), + SequenceIndex(sequenceIndex), Result(result) + { + } + + WorldPacket const* Write() override; + + uint32 SequenceIndex; + uint32 Result; + }; + class CreateCharacter final : public ClientPacket { public: @@ -335,13 +349,8 @@ namespace WorldPackets { std::string Name; uint8 SexID = 0; - uint8 SkinID = 0; - uint8 HairColorID = 0; - uint8 HairStyleID = 0; - uint8 FacialHairStyleID = 0; - uint8 FaceID = 0; uint8 RaceID = RACE_NONE; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay = { }; + Array<ChrCustomizationChoice, 50> const* Customizations = nullptr; }; CharFactionChangeResult() : ServerPacket(SMSG_CHAR_FACTION_CHANGE_RESULT, 20 + sizeof(CharFactionChangeDisplayInfo)) { } @@ -388,7 +397,7 @@ namespace WorldPackets void Read() override; - Array<ReorderInfo, MAX_CHARACTERS_PER_REALM> Entries; + Array<ReorderInfo, 200> Entries; }; class UndeleteCharacter final : public ClientPacket @@ -605,12 +614,8 @@ namespace WorldPackets void Read() override; - uint32 NewHairStyle = 0; - uint32 NewHairColor = 0; - uint32 NewFacialHair = 0; - uint32 NewSkinColor = 0; - uint32 NewFace = 0; - std::array<uint32, PLAYER_CUSTOM_DISPLAY_SIZE> NewCustomDisplay = { }; + uint8 NewSex = 0; + Array<ChrCustomizationChoice, 50> Customizations; }; class BarberShopResult final : public ServerPacket @@ -710,7 +715,6 @@ namespace WorldPackets class CharCustomizeSuccess final : public ServerPacket { public: - CharCustomizeSuccess() : ServerPacket(SMSG_CHAR_CUSTOMIZE_SUCCESS, 16 + 1 + 1 + 1 + 1 + 1 + 1 + 1) { } CharCustomizeSuccess(CharCustomizeInfo const* customizeInfo); WorldPacket const* Write() override; @@ -718,12 +722,7 @@ namespace WorldPackets ObjectGuid CharGUID; std::string CharName; uint8 SexID = 0; - uint8 SkinID = 0; - uint8 HairColorID = 0; - uint8 HairStyleID = 0; - uint8 FacialHairStyleID = 0; - uint8 FaceID = 0; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay = { }; + Array<ChrCustomizationChoice, 50> const& Customizations; }; class CharCustomizeFailure final : public ServerPacket diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index d52b9045983..9b96753af8b 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -176,7 +176,7 @@ WorldPacket const* WorldPackets::Chat::Chat::Write() _worldPacket.WriteBits(Prefix.length(), 5); _worldPacket.WriteBits(_Channel.length(), 7); _worldPacket.WriteBits(ChatText.length(), 12); - _worldPacket.WriteBits(_ChatFlags, 11); + _worldPacket.WriteBits(_ChatFlags, 14); _worldPacket.WriteBit(HideChatLog); _worldPacket.WriteBit(FakeSenderName); _worldPacket.WriteBit(Unused_801.is_initialized()); diff --git a/src/server/game/Server/Packets/ClientConfigPackets.cpp b/src/server/game/Server/Packets/ClientConfigPackets.cpp index 150c229788c..8ddc8c998ab 100644 --- a/src/server/game/Server/Packets/ClientConfigPackets.cpp +++ b/src/server/game/Server/Packets/ClientConfigPackets.cpp @@ -21,7 +21,7 @@ WorldPacket const* WorldPackets::ClientConfig::AccountDataTimes::Write() { _worldPacket << PlayerGuid; _worldPacket << uint32(ServerTime); - _worldPacket.append(AccountTimes, NUM_ACCOUNT_DATA_TYPES); + _worldPacket.append(AccountTimes.data(), AccountTimes.size()); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/ClientConfigPackets.h b/src/server/game/Server/Packets/ClientConfigPackets.h index 810d2b8dffe..230df93da77 100644 --- a/src/server/game/Server/Packets/ClientConfigPackets.h +++ b/src/server/game/Server/Packets/ClientConfigPackets.h @@ -34,7 +34,7 @@ namespace WorldPackets ObjectGuid PlayerGuid; uint32 ServerTime = 0; - uint32 AccountTimes[NUM_ACCOUNT_DATA_TYPES]; + std::array<uint32, NUM_ACCOUNT_DATA_TYPES> AccountTimes = { }; }; class ClientCacheVersion final : public ServerPacket diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index e0253371a2e..cfdb4b39f40 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -24,7 +24,7 @@ WorldPacket const* WorldPackets::CombatLog::SpellNonMeleeDamageLog::Write() *this << CasterGUID; *this << CastID; *this << int32(SpellID); - *this << int32(SpellXSpellVisualID); + *this << Visual; *this << int32(Damage); *this << int32(OriginalDamage); *this << int32(Overkill); @@ -349,8 +349,8 @@ WorldPacket const* WorldPackets::CombatLog::AttackerStateUpdate::Write() attackRoundInfo << uint8(ContentTuning.TargetMaxScalingLevel); attackRoundInfo << int16(ContentTuning.PlayerLevelDelta); attackRoundInfo << int8(ContentTuning.TargetScalingLevelDelta); - attackRoundInfo << uint16(ContentTuning.PlayerItemLevel); - attackRoundInfo << uint16(ContentTuning.TargetItemLevel); + attackRoundInfo << float(ContentTuning.PlayerItemLevel); + attackRoundInfo << float(ContentTuning.TargetItemLevel); attackRoundInfo << uint16(ContentTuning.ScalingHealthItemLevelCurveID); attackRoundInfo << uint8(ContentTuning.ScalesWithItemLevel ? 1 : 0); diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index 9227977652e..0d06623746f 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -37,7 +37,7 @@ namespace WorldPackets ObjectGuid CasterGUID; ObjectGuid CastID; int32 SpellID = 0; - int32 SpellXSpellVisualID = 0; + Spells::SpellCastVisual Visual; int32 Damage = 0; int32 OriginalDamage = 0; int32 Overkill = -1; @@ -92,7 +92,7 @@ namespace WorldPackets class SpellHealLog final : public CombatLogServerPacket { public: - SpellHealLog() : CombatLogServerPacket(SMSG_SPELL_HEAL_LOG, 16 + 16 + 4 * 4 + 1) { } + SpellHealLog() : CombatLogServerPacket(SMSG_SPELL_HEAL_LOG, 16 + 16 + 4 * 5 + 1) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index 8b6654e79dc..7a48a3ed2da 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -23,7 +23,11 @@ #include "SpellInfo.h" #include "Unit.h" -void WorldPackets::Spells::SpellCastLogData::Initialize(Unit const* unit) +namespace WorldPackets +{ +namespace Spells +{ +void SpellCastLogData::Initialize(Unit const* unit) { Health = unit->GetHealth(); AttackPower = unit->GetTotalAttackPowerValue(unit->getClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK); @@ -32,7 +36,7 @@ void WorldPackets::Spells::SpellCastLogData::Initialize(Unit const* unit) PowerData.emplace_back(int32(unit->GetPowerType()), unit->GetPower(unit->GetPowerType()), int32(0)); } -void WorldPackets::Spells::SpellCastLogData::Initialize(Spell const* spell) +void SpellCastLogData::Initialize(Spell const* spell) { Health = spell->GetCaster()->GetHealth(); AttackPower = spell->GetCaster()->GetTotalAttackPowerValue(spell->GetCaster()->getClass() == CLASS_HUNTER ? RANGED_ATTACK : BASE_ATTACK); @@ -51,110 +55,99 @@ void WorldPackets::Spells::SpellCastLogData::Initialize(Spell const* spell) PowerData.insert(PowerData.begin(), SpellLogPowerData(int32(primaryPowerType), spell->GetCaster()->GetPower(primaryPowerType), 0)); } -namespace WorldPackets +template<class T, class U> +bool ContentTuningParams::GenerateDataForUnits(T* /*attacker*/, U* /*target*/) { - namespace Spells - { - template<class T, class U> - bool ContentTuningParams::GenerateDataForUnits(T* /*attacker*/, U* /*target*/) - { - return false; - } + return false; +} - template<> - bool ContentTuningParams::GenerateDataForUnits<Creature, Player>(Creature* attacker, Player* target) - { - CreatureTemplate const* creatureTemplate = attacker->GetCreatureTemplate(); - CreatureLevelScaling const* creatureScaling = creatureTemplate->GetLevelScaling(attacker->GetMap()->GetDifficultyID()); - - Type = TYPE_CREATURE_TO_PLAYER_DAMAGE; - PlayerLevelDelta = target->m_activePlayerData->ScalingPlayerLevelDelta; - PlayerItemLevel = target->GetAverageItemLevel(); - TargetItemLevel = 0; - ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; - TargetLevel = target->getLevel(); - Expansion = creatureTemplate->HealthScalingExpansion; - TargetMinScalingLevel = uint8(creatureScaling->MinLevel); - TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); - TargetScalingLevelDelta = int8(attacker->m_unitData->ScalingLevelDelta); - return true; - } +template<> +bool ContentTuningParams::GenerateDataForUnits<Creature, Player>(Creature* attacker, Player* target) +{ + CreatureTemplate const* creatureTemplate = attacker->GetCreatureTemplate(); + CreatureLevelScaling const* creatureScaling = creatureTemplate->GetLevelScaling(attacker->GetMap()->GetDifficultyID()); + + Type = TYPE_CREATURE_TO_PLAYER_DAMAGE; + PlayerLevelDelta = target->m_activePlayerData->ScalingPlayerLevelDelta; + PlayerItemLevel = target->GetAverageItemLevel(); + TargetItemLevel = 0; + ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; + TargetLevel = target->getLevel(); + Expansion = creatureTemplate->HealthScalingExpansion; + TargetMinScalingLevel = uint8(creatureScaling->MinLevel); + TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); + TargetScalingLevelDelta = int8(attacker->m_unitData->ScalingLevelDelta); + return true; +} - template<> - bool ContentTuningParams::GenerateDataForUnits<Player, Creature>(Player* attacker, Creature* target) +template<> +bool ContentTuningParams::GenerateDataForUnits<Player, Creature>(Player* attacker, Creature* target) +{ + CreatureTemplate const* creatureTemplate = target->GetCreatureTemplate(); + CreatureLevelScaling const* creatureScaling = creatureTemplate->GetLevelScaling(target->GetMap()->GetDifficultyID()); + + Type = TYPE_PLAYER_TO_CREATURE_DAMAGE; + PlayerLevelDelta = attacker->m_activePlayerData->ScalingPlayerLevelDelta; + PlayerItemLevel = attacker->GetAverageItemLevel(); + TargetItemLevel = 0; + ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; + TargetLevel = target->getLevel(); + Expansion = creatureTemplate->HealthScalingExpansion; + TargetMinScalingLevel = uint8(creatureScaling->MinLevel); + TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); + TargetScalingLevelDelta = int8(target->m_unitData->ScalingLevelDelta); + return true; +} + +template<> +bool ContentTuningParams::GenerateDataForUnits<Creature, Creature>(Creature* attacker, Creature* target) +{ + Creature* accessor = target->HasScalableLevels() ? target : attacker; + CreatureTemplate const* creatureTemplate = accessor->GetCreatureTemplate(); + CreatureLevelScaling const* creatureScaling = creatureTemplate->GetLevelScaling(accessor->GetMap()->GetDifficultyID()); + + Type = TYPE_CREATURE_TO_CREATURE_DAMAGE; + PlayerLevelDelta = 0; + PlayerItemLevel = 0; + TargetLevel = target->getLevel(); + Expansion = creatureTemplate->HealthScalingExpansion; + TargetMinScalingLevel = uint8(creatureScaling->MinLevel); + TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); + TargetScalingLevelDelta = int8(accessor->m_unitData->ScalingLevelDelta); + return true; +} + +template<> +bool ContentTuningParams::GenerateDataForUnits<Unit, Unit>(Unit* attacker, Unit* target) +{ + if (Player* playerAttacker = attacker->ToPlayer()) + { + if (Player* playerTarget = target->ToPlayer()) + return GenerateDataForUnits(playerAttacker, playerTarget); + else if (Creature* creatureTarget = target->ToCreature()) { - CreatureTemplate const* creatureTemplate = target->GetCreatureTemplate(); - CreatureLevelScaling const* creatureScaling = creatureTemplate->GetLevelScaling(target->GetMap()->GetDifficultyID()); - - Type = TYPE_PLAYER_TO_CREATURE_DAMAGE; - PlayerLevelDelta = attacker->m_activePlayerData->ScalingPlayerLevelDelta; - PlayerItemLevel = attacker->GetAverageItemLevel(); - TargetItemLevel = 0; - ScalingHealthItemLevelCurveID = target->m_unitData->ScalingHealthItemLevelCurveID; - TargetLevel = target->getLevel(); - Expansion = creatureTemplate->HealthScalingExpansion; - TargetMinScalingLevel = uint8(creatureScaling->MinLevel); - TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); - TargetScalingLevelDelta = int8(target->m_unitData->ScalingLevelDelta); - return true; + if (creatureTarget->HasScalableLevels()) + return GenerateDataForUnits(playerAttacker, creatureTarget); } - - template<> - bool ContentTuningParams::GenerateDataForUnits<Creature, Creature>(Creature* attacker, Creature* target) + } + else if (Creature* creatureAttacker = attacker->ToCreature()) + { + if (Player* playerTarget = target->ToPlayer()) { - Creature* accessor = target->HasScalableLevels() ? target : attacker; - CreatureTemplate const* creatureTemplate = accessor->GetCreatureTemplate(); - CreatureLevelScaling const* creatureScaling = creatureTemplate->GetLevelScaling(accessor->GetMap()->GetDifficultyID()); - - Type = TYPE_CREATURE_TO_CREATURE_DAMAGE; - PlayerLevelDelta = 0; - PlayerItemLevel = 0; - TargetLevel = target->getLevel(); - Expansion = creatureTemplate->HealthScalingExpansion; - TargetMinScalingLevel = uint8(creatureScaling->MinLevel); - TargetMaxScalingLevel = uint8(creatureScaling->MaxLevel); - TargetScalingLevelDelta = int8(accessor->m_unitData->ScalingLevelDelta); - return true; + if (creatureAttacker->HasScalableLevels()) + return GenerateDataForUnits(creatureAttacker, playerTarget); } - - template<> - bool ContentTuningParams::GenerateDataForUnits<Unit, Unit>(Unit* attacker, Unit* target) + else if (Creature* creatureTarget = target->ToCreature()) { - if (Player* playerAttacker = attacker->ToPlayer()) - { - if (Player* playerTarget = target->ToPlayer()) - return GenerateDataForUnits(playerAttacker, playerTarget); - else if (Creature* creatureTarget = target->ToCreature()) - { - if (creatureTarget->HasScalableLevels()) - return GenerateDataForUnits(playerAttacker, creatureTarget); - } - } - else if (Creature* creatureAttacker = attacker->ToCreature()) - { - if (Player* playerTarget = target->ToPlayer()) - { - if (creatureAttacker->HasScalableLevels()) - return GenerateDataForUnits(creatureAttacker, playerTarget); - } - else if (Creature* creatureTarget = target->ToCreature()) - { - if (creatureAttacker->HasScalableLevels() || creatureTarget->HasScalableLevels()) - return GenerateDataForUnits(creatureAttacker, creatureTarget); - } - } - - return false; + if (creatureAttacker->HasScalableLevels() || creatureTarget->HasScalableLevels()) + return GenerateDataForUnits(creatureAttacker, creatureTarget); } } -} -ByteBuffer& WorldPackets::CombatLog::CombatLogServerPacket::WriteLogData() -{ - return _fullLogPacket << LogData; + return false; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData) +ByteBuffer& operator<<(ByteBuffer& data, SpellCastLogData const& spellCastLogData) { data << int64(spellCastLogData.Health); data << int32(spellCastLogData.AttackPower); @@ -173,11 +166,11 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ContentTuningParams const& contentTuningParams) +ByteBuffer& operator<<(ByteBuffer& data, ContentTuningParams const& contentTuningParams) { + data << float(contentTuningParams.PlayerItemLevel); + data << float(contentTuningParams.TargetItemLevel); data << int16(contentTuningParams.PlayerLevelDelta); - data << uint16(contentTuningParams.PlayerItemLevel); - data << uint16(contentTuningParams.TargetItemLevel); data << uint16(contentTuningParams.ScalingHealthItemLevelCurveID); data << uint8(contentTuningParams.TargetLevel); data << uint8(contentTuningParams.Expansion); @@ -189,3 +182,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ContentTuningPara data.FlushBits(); return data; } + +ByteBuffer& operator>>(ByteBuffer& data, SpellCastVisual& visual) +{ + data >> visual.SpellXSpellVisualID; + data >> visual.ScriptVisualID; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, SpellCastVisual const& visual) +{ + data << int32(visual.SpellXSpellVisualID); + data << int32(visual.ScriptVisualID); + + return data; +} +} +} + +ByteBuffer& WorldPackets::CombatLog::CombatLogServerPacket::WriteLogData() +{ + return _fullLogPacket << LogData; +} diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h index 249e8430721..298d478cc94 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h @@ -61,8 +61,8 @@ namespace WorldPackets uint32 Type = 0; int16 PlayerLevelDelta = 0; - uint16 PlayerItemLevel = 0; - uint16 TargetItemLevel = 0; + float PlayerItemLevel = 0; + float TargetItemLevel = 0; uint16 ScalingHealthItemLevelCurveID = 0; uint8 TargetLevel = 0; uint8 Expansion = 0; @@ -74,6 +74,17 @@ namespace WorldPackets template<class T, class U> bool GenerateDataForUnits(T* attacker, U* target); }; + + struct SpellCastVisual + { + int32 SpellXSpellVisualID = 0; + int32 ScriptVisualID = 0; + }; + + ByteBuffer& operator<<(ByteBuffer& data, SpellCastLogData const& spellCastLogData); + ByteBuffer& operator<<(ByteBuffer& data, ContentTuningParams const& contentTuningParams); + ByteBuffer& operator>>(ByteBuffer& data, SpellCastVisual& visual); + ByteBuffer& operator<<(ByteBuffer& data, SpellCastVisual const& visual); } namespace CombatLog @@ -129,7 +140,4 @@ namespace WorldPackets } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData const& spellCastLogData); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ContentTuningParams const& contentTuningParams); - #endif // CombatLogPacketsCommon_h__ diff --git a/src/server/game/Server/Packets/EquipmentSetPackets.cpp b/src/server/game/Server/Packets/EquipmentSetPackets.cpp index 3ef50d4d525..ff47852e429 100644 --- a/src/server/game/Server/Packets/EquipmentSetPackets.cpp +++ b/src/server/game/Server/Packets/EquipmentSetPackets.cpp @@ -45,6 +45,9 @@ WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write() _worldPacket.append(equipSet->Enchants.data(), equipSet->Enchants.size()); + _worldPacket << int32(equipSet->Unknown901_1); + _worldPacket << int32(equipSet->Unknown901_2); + _worldPacket.WriteBit(equipSet->AssignedSpecIndex != -1); _worldPacket.WriteBits(equipSet->SetName.length(), 8); _worldPacket.WriteBits(equipSet->SetIcon.length(), 9); @@ -62,7 +65,7 @@ WorldPacket const* WorldPackets::EquipmentSet::LoadEquipmentSet::Write() void WorldPackets::EquipmentSet::SaveEquipmentSet::Read() { - Set.Type = EquipmentSetInfo::EquipmentSetType(_worldPacket.read<int32>()); + Set.Type = _worldPacket.read<EquipmentSetInfo::EquipmentSetType, int32>(); _worldPacket >> Set.Guid; _worldPacket >> Set.SetID; _worldPacket >> Set.IgnoreMask; @@ -76,6 +79,9 @@ void WorldPackets::EquipmentSet::SaveEquipmentSet::Read() _worldPacket >> Set.Enchants[0]; _worldPacket >> Set.Enchants[1]; + _worldPacket >> Set.Unknown901_1; + _worldPacket >> Set.Unknown901_2; + bool hasSpecIndex = _worldPacket.ReadBit(); uint32 setNameLength = _worldPacket.ReadBits(8); diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 68678dc7a9f..55f778b39b6 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -18,7 +18,11 @@ #include "GarrisonPackets.h" #include "DB2Structure.h" -WorldPacket const* WorldPackets::Garrison::GarrisonCreateResult::Write() +namespace WorldPackets +{ +namespace Garrison +{ +WorldPacket const* GarrisonCreateResult::Write() { _worldPacket << uint32(Result); _worldPacket << uint32(GarrSiteLevelID); @@ -26,7 +30,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonCreateResult::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonDeleteResult::Write() +WorldPacket const* GarrisonDeleteResult::Write() { _worldPacket << uint32(Result); _worldPacket << uint32(GarrSiteID); @@ -34,7 +38,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonDeleteResult::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonPlotInfo& plotInfo) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonPlotInfo& plotInfo) { data << uint32(plotInfo.GarrPlotInstanceID); data << plotInfo.PlotPos; @@ -43,7 +47,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonPlotInf return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonBuildingInfo const& buildingInfo) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonBuildingInfo const& buildingInfo) { data << uint32(buildingInfo.GarrPlotInstanceID); data << uint32(buildingInfo.GarrBuildingID); @@ -56,7 +60,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonBuildin return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonFollower const& follower) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonFollower const& follower) { data << uint64(follower.DbID); data << uint32(follower.GarrFollowerID); @@ -71,6 +75,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonFollowe data << uint32(follower.AbilityID.size()); data << uint32(follower.ZoneSupportSpellID); data << uint32(follower.FollowerStatus); + data << int32(follower.Health); + data << int8(follower.BoardIndex); + data << int32(follower.HealingTimestamp); for (GarrAbilityEntry const* ability : follower.AbilityID) data << uint32(ability->ID); @@ -81,7 +88,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonFollowe return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission const& mission) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonMission const& mission) { data << uint64(mission.DbID); data << uint32(mission.MissionRecID); @@ -91,13 +98,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission data << uint32(mission.TravelDuration); data << uint32(mission.MissionDuration); data << uint32(mission.MissionState); - data << uint32(mission.Unknown1); - data << uint32(mission.Unknown2); + data << uint32(mission.SuccessChance); + data << uint32(mission.Flags); + data << float(mission.MissionScalar); return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonMissionReward const& missionRewardItem) { data << int32(missionRewardItem.ItemID); data << uint32(missionRewardItem.Quantity); @@ -110,7 +118,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionBonusAbility const& areaBonus) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonMissionBonusAbility const& areaBonus) { data << uint32(areaBonus.GarrMssnBonusAbilityID); data << uint32(areaBonus.StartTime); @@ -118,17 +126,66 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonTalent const& talent) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonTalentSocketData const& talentSocketData) +{ + data << int32(talentSocketData.SoulbindConduitID); + data << int32(talentSocketData.SoulbindConduitRank); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, GarrisonTalent const& talent) { data << int32(talent.GarrTalentID); data << int32(talent.Rank); data << int32(talent.ResearchStartTime); data << int32(talent.Flags); + data.WriteBit(talent.Socket.is_initialized()); + data.FlushBits(); + + if (talent.Socket) + data << *talent.Socket; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, GarrisonCollectionEntry const& collectionEntry) +{ + data << int32(collectionEntry.EntryID); + data << int32(collectionEntry.Rank); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, GarrisonCollection const& collection) +{ + data << int32(collection.Type); + data << uint32(collection.Entries.size()); + for (GarrisonCollectionEntry const& collectionEntry : collection.Entries) + data << collectionEntry; return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo const& garrison) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonEventEntry const& event) +{ + data << int32(event.EntryID); + data << int32(event.EventValue); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, GarrisonEventList const& eventList) +{ + data << int32(eventList.Type); + data << uint32(eventList.Events.size()); + for (GarrisonEventEntry const& event : eventList.Events) + data << event; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, GarrisonInfo const& garrison) { ASSERT(garrison.Missions.size() == garrison.MissionRewards.size()); ASSERT(garrison.Missions.size() == garrison.MissionOvermaxRewards.size()); @@ -140,46 +197,52 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo co data << uint32(garrison.Buildings.size()); data << uint32(garrison.Plots.size()); data << uint32(garrison.Followers.size()); + data << uint32(garrison.AutoTroops.size()); data << uint32(garrison.Missions.size()); data << uint32(garrison.MissionRewards.size()); data << uint32(garrison.MissionOvermaxRewards.size()); data << uint32(garrison.MissionAreaBonuses.size()); data << uint32(garrison.Talents.size()); + data << uint32(garrison.Collections.size()); + data << uint32(garrison.EventLists.size()); data << uint32(garrison.CanStartMission.size()); data << uint32(garrison.ArchivedMissions.size()); data << int32(garrison.NumFollowerActivationsRemaining); data << uint32(garrison.NumMissionsStartedToday); - for (WorldPackets::Garrison::GarrisonPlotInfo* plot : garrison.Plots) + for (GarrisonPlotInfo* plot : garrison.Plots) data << *plot; - for (WorldPackets::Garrison::GarrisonMission const* mission : garrison.Missions) + for (GarrisonMission const* mission : garrison.Missions) data << *mission; - for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionRewards) + for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards) data << uint32(missionReward.size()); - for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionRewards) - for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward) + for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionRewards) + for (GarrisonMissionReward const& missionRewardItem : missionReward) data << missionRewardItem; - for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) + for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) data << uint32(missionReward.size()); - for (std::vector<WorldPackets::Garrison::GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) - for (WorldPackets::Garrison::GarrisonMissionReward const& missionRewardItem : missionReward) + for (std::vector<GarrisonMissionReward> const& missionReward : garrison.MissionOvermaxRewards) + for (GarrisonMissionReward const& missionRewardItem : missionReward) data << missionRewardItem; - for (WorldPackets::Garrison::GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses) + for (GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses) data << *areaBonus; - for (WorldPackets::Garrison::GarrisonTalent const& talent : garrison.Talents) - data << talent; + for (GarrisonCollection const& collection : garrison.Collections) + data << collection; + + for (GarrisonEventList const& eventList : garrison.EventLists) + data << eventList; if (!garrison.ArchivedMissions.empty()) data.append(garrison.ArchivedMissions.data(), garrison.ArchivedMissions.size()); - for (WorldPackets::Garrison::GarrisonBuildingInfo const* building : garrison.Buildings) + for (GarrisonBuildingInfo const* building : garrison.Buildings) data << *building; for (bool canStartMission : garrison.CanStartMission) @@ -187,20 +250,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo co data.FlushBits(); - for (WorldPackets::Garrison::GarrisonFollower const* follower : garrison.Followers) + for (GarrisonFollower const* follower : garrison.Followers) + data << *follower; + + for (GarrisonFollower const* follower : garrison.AutoTroops) data << *follower; + for (GarrisonTalent const& talent : garrison.Talents) + data << talent; + return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::FollowerSoftCapInfo const& followerSoftCapInfo) +ByteBuffer& operator<<(ByteBuffer& data, FollowerSoftCapInfo const& followerSoftCapInfo) { data << int32(followerSoftCapInfo.GarrFollowerTypeID); data << uint32(followerSoftCapInfo.Count); return data; } -WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() +WorldPacket const* GetGarrisonInfoResult::Write() { _worldPacket << int32(FactionIndex); _worldPacket << uint32(Garrisons.size()); @@ -214,7 +283,7 @@ WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonRemoteBuildingInfo const& building) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonRemoteBuildingInfo const& building) { data << uint32(building.GarrPlotInstanceID); data << uint32(building.GarrBuildingID); @@ -222,17 +291,17 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonRemoteB return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonRemoteSiteInfo const& site) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonRemoteSiteInfo const& site) { data << uint32(site.GarrSiteLevelID); data << uint32(site.Buildings.size()); - for (WorldPackets::Garrison::GarrisonRemoteBuildingInfo const& building : site.Buildings) + for (GarrisonRemoteBuildingInfo const& building : site.Buildings) data << building; return data; } -WorldPacket const* WorldPackets::Garrison::GarrisonRemoteInfo::Write() +WorldPacket const* GarrisonRemoteInfo::Write() { _worldPacket << uint32(Sites.size()); for (GarrisonRemoteSiteInfo const& site : Sites) @@ -241,14 +310,14 @@ WorldPacket const* WorldPackets::Garrison::GarrisonRemoteInfo::Write() return &_worldPacket; } -void WorldPackets::Garrison::GarrisonPurchaseBuilding::Read() +void GarrisonPurchaseBuilding::Read() { _worldPacket >> NpcGUID; _worldPacket >> PlotInstanceID; _worldPacket >> BuildingID; } -WorldPacket const* WorldPackets::Garrison::GarrisonPlaceBuildingResult::Write() +WorldPacket const* GarrisonPlaceBuildingResult::Write() { _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); @@ -259,13 +328,13 @@ WorldPacket const* WorldPackets::Garrison::GarrisonPlaceBuildingResult::Write() return &_worldPacket; } -void WorldPackets::Garrison::GarrisonCancelConstruction::Read() +void GarrisonCancelConstruction::Read() { _worldPacket >> NpcGUID; _worldPacket >> PlotInstanceID; } -WorldPacket const* WorldPackets::Garrison::GarrisonBuildingRemoved::Write() +WorldPacket const* GarrisonBuildingRemoved::Write() { _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); @@ -275,7 +344,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonBuildingRemoved::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonLearnBlueprintResult::Write() +WorldPacket const* GarrisonLearnBlueprintResult::Write() { _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); @@ -284,7 +353,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonLearnBlueprintResult::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonUnlearnBlueprintResult::Write() +WorldPacket const* GarrisonUnlearnBlueprintResult::Write() { _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); @@ -293,7 +362,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonUnlearnBlueprintResult::Write return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationDataResult::Write() +WorldPacket const* GarrisonRequestBlueprintAndSpecializationDataResult::Write() { _worldPacket << int32(GarrTypeID); _worldPacket << uint32(BlueprintsKnown ? BlueprintsKnown->size() : 0); @@ -309,24 +378,24 @@ WorldPacket const* WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializa return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonBuildingLandmark& landmark) +ByteBuffer& operator<<(ByteBuffer& data, GarrisonBuildingMapData& building) { - data << uint32(landmark.GarrBuildingPlotInstID); - data << landmark.Pos; + data << uint32(building.GarrBuildingPlotInstID); + data << building.Pos; return data; } -WorldPacket const* WorldPackets::Garrison::GarrisonBuildingLandmarks::Write() +WorldPacket const* GarrisonMapDataResponse::Write() { - _worldPacket << uint32(Landmarks.size()); - for (GarrisonBuildingLandmark& landmark : Landmarks) + _worldPacket << uint32(Buildings.size()); + for (GarrisonBuildingMapData& landmark : Buildings) _worldPacket << landmark; return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonPlotPlaced::Write() +WorldPacket const* GarrisonPlotPlaced::Write() { _worldPacket << int32(GarrTypeID); _worldPacket << *PlotInfo; @@ -334,14 +403,14 @@ WorldPacket const* WorldPackets::Garrison::GarrisonPlotPlaced::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonPlotRemoved::Write() +WorldPacket const* GarrisonPlotRemoved::Write() { _worldPacket << uint32(GarrPlotInstanceID); return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write() +WorldPacket const* GarrisonAddFollowerResult::Write() { _worldPacket << int32(GarrTypeID); _worldPacket << uint32(Result); @@ -350,7 +419,7 @@ WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonRemoveFollowerResult::Write() +WorldPacket const* GarrisonRemoveFollowerResult::Write() { _worldPacket << uint64(FollowerDBID); _worldPacket << int32(GarrTypeID); @@ -360,9 +429,11 @@ WorldPacket const* WorldPackets::Garrison::GarrisonRemoveFollowerResult::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Garrison::GarrisonBuildingActivated::Write() +WorldPacket const* GarrisonBuildingActivated::Write() { _worldPacket << uint32(GarrPlotInstanceID); return &_worldPacket; } +} +} diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index 6e929d08245..cb33d51ff42 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -20,6 +20,7 @@ #include "Packet.h" #include "ObjectGuid.h" +#include "Optional.h" #include "Position.h" #include "PacketUtilities.h" #include <list> @@ -94,6 +95,9 @@ namespace WorldPackets std::list<GarrAbilityEntry const*> AbilityID; uint32 ZoneSupportSpellID = 0; uint32 FollowerStatus = 0; + int32 Health = 0; + int32 HealingTimestamp = 0; + int8 BoardIndex = 0; std::string CustomName; }; @@ -107,8 +111,9 @@ namespace WorldPackets uint32 TravelDuration = 0; uint32 MissionDuration = 0; uint32 MissionState = 0; - uint32 Unknown1 = 0; - uint32 Unknown2 = 0; + uint32 SuccessChance = 0; + uint32 Flags = 0; + float MissionScalar = 1.0f; }; struct GarrisonMissionReward @@ -128,12 +133,43 @@ namespace WorldPackets time_t StartTime = time_t(0); }; + struct GarrisonTalentSocketData + { + int32 SoulbindConduitID = 0; + int32 SoulbindConduitRank = 0; + }; + struct GarrisonTalent { int32 GarrTalentID = 0; int32 Rank = 0; time_t ResearchStartTime = time_t(0); int32 Flags = 0; + Optional<GarrisonTalentSocketData> Socket; + }; + + struct GarrisonCollectionEntry + { + int32 EntryID = 0; + int32 Rank = 0; + }; + + struct GarrisonCollection + { + int32 Type = 0; + std::vector<GarrisonCollectionEntry> Entries; + }; + + struct GarrisonEventEntry + { + int32 EntryID = 0; + int32 EventValue = 0; + }; + + struct GarrisonEventList + { + int32 Type = 0; + std::vector<GarrisonEventEntry> Events; }; struct GarrisonInfo @@ -146,11 +182,14 @@ namespace WorldPackets std::vector<GarrisonPlotInfo*> Plots; std::vector<GarrisonBuildingInfo const*> Buildings; std::vector<GarrisonFollower const*> Followers; + std::vector<GarrisonFollower const*> AutoTroops; std::vector<GarrisonMission const*> Missions; std::vector<std::vector<GarrisonMissionReward>> MissionRewards; std::vector<std::vector<GarrisonMissionReward>> MissionOvermaxRewards; std::vector<GarrisonMissionBonusAbility const*> MissionAreaBonuses; std::vector<GarrisonTalent> Talents; + std::vector<GarrisonCollection> Collections; + std::vector<GarrisonEventList> EventLists; std::vector<bool> CanStartMission; std::vector<int32> ArchivedMissions; }; @@ -291,31 +330,31 @@ namespace WorldPackets std::unordered_set<uint32> const* BlueprintsKnown = nullptr; }; - class GarrisonGetBuildingLandmarks final : public ClientPacket + class GarrisonGetMapData final : public ClientPacket { public: - GarrisonGetBuildingLandmarks(WorldPacket&& packet) : ClientPacket(CMSG_GARRISON_GET_BUILDING_LANDMARKS, std::move(packet)) { } + GarrisonGetMapData(WorldPacket&& packet) : ClientPacket(CMSG_GARRISON_GET_MAP_DATA, std::move(packet)) { } void Read() override { } }; - struct GarrisonBuildingLandmark + struct GarrisonBuildingMapData { - GarrisonBuildingLandmark() : GarrBuildingPlotInstID(0), Pos() { } - GarrisonBuildingLandmark(uint32 buildingPlotInstId, Position const& pos) : GarrBuildingPlotInstID(buildingPlotInstId), Pos(pos) { } + GarrisonBuildingMapData() : GarrBuildingPlotInstID(0), Pos() { } + GarrisonBuildingMapData(uint32 buildingPlotInstId, Position const& pos) : GarrBuildingPlotInstID(buildingPlotInstId), Pos(pos) { } uint32 GarrBuildingPlotInstID; TaggedPosition<Position::XYZ> Pos; }; - class GarrisonBuildingLandmarks final : public ServerPacket + class GarrisonMapDataResponse final : public ServerPacket { public: - GarrisonBuildingLandmarks() : ServerPacket(SMSG_GARRISON_BUILDING_LANDMARKS) { } + GarrisonMapDataResponse() : ServerPacket(SMSG_GARRISON_MAP_DATA_RESPONSE) { } WorldPacket const* Write() override; - std::vector<GarrisonBuildingLandmark> Landmarks; + std::vector<GarrisonBuildingMapData> Buildings; }; class GarrisonPlotPlaced final : public ServerPacket diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index aae54fca389..d0d91e6ab32 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -188,7 +188,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRosterMemberD return data; } -WorldPacket const* WorldPackets::Guild::GuildEventAwayChange::Write() +WorldPacket const* WorldPackets::Guild::GuildEventStatusChange::Write() { _worldPacket << Guid; _worldPacket.WriteBit(AFK); @@ -272,12 +272,10 @@ WorldPacket const* WorldPackets::Guild::GuildEventPlayerLeft::Write() { _worldPacket.WriteBit(Removed); _worldPacket.WriteBits(LeaverName.length(), 6); - _worldPacket.FlushBits(); if (Removed) { _worldPacket.WriteBits(RemoverName.length(), 6); - _worldPacket.FlushBits(); _worldPacket << RemoverGUID; _worldPacket << uint32(RemoverVirtualRealmAddress); diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 5762f2b7971..a64595465ac 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -227,10 +227,10 @@ namespace WorldPackets std::string OldGuildName; }; - class GuildEventAwayChange final : public ServerPacket + class GuildEventStatusChange final : public ServerPacket { public: - GuildEventAwayChange() : ServerPacket(SMSG_GUILD_EVENT_AWAY_CHANGE, 16 + 1) { } + GuildEventStatusChange() : ServerPacket(SMSG_GUILD_EVENT_STATUS_CHANGE, 16 + 1) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/HotfixPackets.cpp b/src/server/game/Server/Packets/HotfixPackets.cpp index 175dee3d600..629627ff852 100644 --- a/src/server/game/Server/Packets/HotfixPackets.cpp +++ b/src/server/game/Server/Packets/HotfixPackets.cpp @@ -54,7 +54,7 @@ WorldPacket const* DBReply::Write() _worldPacket << uint32(TableHash); _worldPacket << uint32(RecordID); _worldPacket << uint32(Timestamp); - _worldPacket.WriteBit(Allow); + _worldPacket.WriteBits(Status, 2); _worldPacket << uint32(Data.size()); _worldPacket.append(Data); @@ -91,12 +91,12 @@ ByteBuffer& operator<<(ByteBuffer& data, HotfixConnect::HotfixData const& hotfix if (hotfixData.Size) { data << uint32(*hotfixData.Size); - data.WriteBit(true); + data.WriteBits(1, 2); } else { data << uint32(0); - data.WriteBit(false); + data.WriteBits(3, 2); } data.FlushBits(); diff --git a/src/server/game/Server/Packets/HotfixPackets.h b/src/server/game/Server/Packets/HotfixPackets.h index e4e0e2b193f..ecd48021203 100644 --- a/src/server/game/Server/Packets/HotfixPackets.h +++ b/src/server/game/Server/Packets/HotfixPackets.h @@ -47,14 +47,14 @@ namespace WorldPackets class DBReply final : public ServerPacket { public: - DBReply() : ServerPacket(SMSG_DB_REPLY, 12) { } + DBReply() : ServerPacket(SMSG_DB_REPLY, 4 + 4 + 4 + 1 + 4) { } WorldPacket const* Write() override; uint32 TableHash = 0; uint32 Timestamp = 0; uint32 RecordID = 0; - bool Allow = false; + uint8 Status = 3; ByteBuffer Data; }; diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 7ae472302b3..0abe35115fe 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -78,14 +78,11 @@ void WorldPackets::Inspect::PlayerModelDisplayInfo::Initialize(Player const* pla SpecializationID = player->GetPrimarySpecialization(); Name = player->GetName(); GenderID = player->m_playerData->NativeSex; - Skin = player->m_playerData->SkinID; - HairColor = player->m_playerData->HairColorID; - HairStyle = player->m_playerData->HairStyleID; - FacialHairStyle = player->m_playerData->FacialHairStyleID; - Face = player->m_playerData->FaceID; Race = player->getRace(); ClassID = player->getClass(); - std::copy(player->m_playerData->CustomDisplayOption.begin(), player->m_playerData->CustomDisplayOption.end(), CustomDisplay.begin()); + + for (UF::ChrCustomizationChoice customization : player->m_playerData->Customizations) + Customizations.push_back({ customization.ChrCustomizationOptionID, customization.ChrCustomizationChoiceID }); for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) if (::Item* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, i)) @@ -99,16 +96,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PlayerModelDispl data << uint32(displayInfo.Items.size()); data.WriteBits(displayInfo.Name.length(), 6); data << uint8(displayInfo.GenderID); - data << uint8(displayInfo.Skin); - data << uint8(displayInfo.HairColor); - data << uint8(displayInfo.HairStyle); - data << uint8(displayInfo.FacialHairStyle); - data << uint8(displayInfo.Face); data << uint8(displayInfo.Race); data << uint8(displayInfo.ClassID); - data.append(displayInfo.CustomDisplay.data(), displayInfo.CustomDisplay.size()); + data << uint32(displayInfo.Customizations.size()); data.WriteString(displayInfo.Name); + for (WorldPackets::Character::ChrCustomizationChoice const& customization : displayInfo.Customizations) + data << customization; + for (WorldPackets::Inspect::InspectItemData const& item : displayInfo.Items) data << item; diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h index eb62955cfb7..91e8e69afc9 100644 --- a/src/server/game/Server/Packets/InspectPackets.h +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -18,6 +18,7 @@ #pragma once #include "Packet.h" +#include "CharacterPackets.h" #include "DBCEnums.h" #include "ItemPacketsCommon.h" #include "ObjectGuid.h" @@ -78,14 +79,9 @@ namespace WorldPackets std::string Name; int32 SpecializationID = 0; uint8 GenderID = GENDER_NONE; - uint8 Skin = 0; - uint8 HairColor = 0; - uint8 HairStyle = 0; - uint8 FacialHairStyle = 0; - uint8 Face = 0; uint8 Race = RACE_NONE; uint8 ClassID = CLASS_NONE; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; + std::vector<Character::ChrCustomizationChoice> Customizations; void Initialize(Player const* player); }; diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp index 1952ed9242e..12284f1e483 100644 --- a/src/server/game/Server/Packets/ItemPackets.cpp +++ b/src/server/game/Server/Packets/ItemPackets.cpp @@ -32,7 +32,7 @@ void WorldPackets::Item::BuyItem::Read() _worldPacket >> Muid; _worldPacket >> Slot; _worldPacket >> Item; - ItemType = static_cast<ItemVendorType>(_worldPacket.ReadBits(2)); + ItemType = static_cast<ItemVendorType>(_worldPacket.ReadBits(3)); } WorldPacket const* WorldPackets::Item::BuySucceeded::Write() diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp index 6e694cf1873..79f7a4a61b0 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.cpp +++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp @@ -19,7 +19,11 @@ #include "Item.h" #include "Player.h" -bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData const& r) const +namespace WorldPackets +{ +namespace Item +{ +bool ItemBonuses::operator==(ItemBonuses const& r) const { if (Context != r.Context) return false; @@ -30,9 +34,22 @@ bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData return std::is_permutation(BonusListIDs.begin(), BonusListIDs.end(), r.BonusListIDs.begin()); } -void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) +bool ItemMod::operator==(ItemMod const& r) const +{ + return Value == r.Value && Type == r.Type; +} + +bool ItemModList::operator==(ItemModList const& r) const +{ + if (Values.size() != r.Values.size()) + return false; + + return std::is_permutation(Values.begin(), Values.end(), r.Values.begin()); +} + +void ItemInstance::Initialize(::Item const* item) { - ItemID = item->GetEntry(); + ItemID = item->GetEntry(); std::vector<int32> const& bonusListIds = item->m_itemData->BonusListIDs; if (!bonusListIds.empty()) { @@ -41,21 +58,15 @@ void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) ItemBonus->Context = item->GetContext(); } - if (uint32 mask = item->m_itemData->ModifiersMask) - { - Modifications = boost::in_place(); - - for (size_t i = 0; mask != 0; mask >>= 1, ++i) - if ((mask & 1) != 0) - Modifications->Insert(i, item->GetModifier(ItemModifier(i))); - } + for (UF::ItemMod mod : item->m_itemData->Modifiers->Values) + Modifications.Values.emplace_back(mod.Value, ItemModifier(mod.Type)); } -void WorldPackets::Item::ItemInstance::Initialize(UF::SocketedGem const* gem) +void ItemInstance::Initialize(UF::SocketedGem const* gem) { ItemID = gem->ItemID; - ItemBonusInstanceData bonus; + ItemBonuses bonus; bonus.Context = ItemContext(*gem->Context); for (uint16 bonusListId : gem->BonusListIDs) if (bonusListId) @@ -65,7 +76,7 @@ void WorldPackets::Item::ItemInstance::Initialize(UF::SocketedGem const* gem) ItemBonus = bonus; } -void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) +void ItemInstance::Initialize(::LootItem const& lootItem) { ItemID = lootItem.itemid; @@ -79,18 +90,15 @@ void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) } } -void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem) +void ItemInstance::Initialize(::VoidStorageItem const* voidItem) { ItemID = voidItem->ItemEntry; - if (voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) - { - Modifications = boost::in_place(); - if (voidItem->FixedScalingLevel) - Modifications->Insert(ITEM_MODIFIER_TIMEWALKER_LEVEL, voidItem->FixedScalingLevel); - if (voidItem->ArtifactKnowledgeLevel) - Modifications->Insert(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL, voidItem->ArtifactKnowledgeLevel); - } + if (voidItem->FixedScalingLevel) + Modifications.Values.emplace_back(voidItem->FixedScalingLevel, ITEM_MODIFIER_TIMEWALKER_LEVEL); + + if (voidItem->ArtifactKnowledgeLevel) + Modifications.Values.emplace_back(voidItem->ArtifactKnowledgeLevel, ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL); if (!voidItem->BonusListIDs.empty()) { @@ -100,15 +108,15 @@ void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidI } } -bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const +bool ItemInstance::operator==(ItemInstance const& r) const { if (ItemID != r.ItemID) return false; - if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized() || Modifications.is_initialized() != r.Modifications.is_initialized()) + if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized()) return false; - if (Modifications.is_initialized() && *Modifications != *r.Modifications) + if (Modifications != r.Modifications) return false; if (ItemBonus.is_initialized() && *ItemBonus != *r.ItemBonus) @@ -117,7 +125,7 @@ bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const return true; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData) +ByteBuffer& operator<<(ByteBuffer& data, ItemBonuses const& itemBonusInstanceData) { data << uint8(itemBonusInstanceData.Context); data << uint32(itemBonusInstanceData.BonusListIDs.size()); @@ -127,7 +135,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceDa return data; } -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData) +ByteBuffer& operator>>(ByteBuffer& data, ItemBonuses& itemBonusInstanceData) { uint32 bonusListIdSize; @@ -144,47 +152,77 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceDa return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance) +ByteBuffer& operator<<(ByteBuffer& data, ItemMod const& itemMod) +{ + data << int32(itemMod.Value); + data << uint8(itemMod.Type); + + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, ItemMod& itemMod) +{ + data >> itemMod.Value; + itemMod.Type = data.read<ItemModifier, uint8>(); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, ItemModList const& itemModList) +{ + data.WriteBits(itemModList.Values.size(), 6); + data.FlushBits(); + + for (ItemMod const& itemMod : itemModList.Values) + data << itemMod; + + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, ItemModList& itemModList) +{ + itemModList.Values.resize(data.ReadBits(6)); + + for (ItemMod& itemMod : itemModList.Values) + data >> itemMod; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, ItemInstance const& itemInstance) { data << int32(itemInstance.ItemID); data.WriteBit(itemInstance.ItemBonus.is_initialized()); - data.WriteBit(itemInstance.Modifications.is_initialized()); data.FlushBits(); + data << itemInstance.Modifications; + if (itemInstance.ItemBonus) data << *itemInstance.ItemBonus; - if (itemInstance.Modifications) - data << *itemInstance.Modifications; - return data; } -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance) +ByteBuffer& operator>>(ByteBuffer& data, ItemInstance& itemInstance) { data >> itemInstance.ItemID; bool hasItemBonus = data.ReadBit(); - bool hasModifications = data.ReadBit(); data.ResetBitPos(); + data >> itemInstance.Modifications; + if (hasItemBonus) { itemInstance.ItemBonus = boost::in_place(); data >> *itemInstance.ItemBonus; } - if (hasModifications) - { - itemInstance.Modifications = boost::in_place(); - data >> *itemInstance.Modifications; - } - return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData const& itemEnchantData) +ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData) { data << int32(itemEnchantData.ID); data << uint32(itemEnchantData.Expiration); @@ -193,28 +231,30 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData con return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemData const& itemGemData) +ByteBuffer& operator<<(ByteBuffer& data, ItemGemData const& itemGemData) { data << uint8(itemGemData.Slot); data << itemGemData.Item; return data; } -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemData& itemGemData) +ByteBuffer& operator>>(ByteBuffer& data, ItemGemData& itemGemData) { data >> itemGemData.Slot; data >> itemGemData.Item; return data; } -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::InvUpdate& invUpdate) +ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate) { invUpdate.Items.resize(data.ReadBits(2)); - for (size_t i = 0; i < invUpdate.Items.size(); ++i) + for (InvUpdate::InvItem& item : invUpdate.Items) { - data >> invUpdate.Items[i].ContainerSlot; - data >> invUpdate.Items[i].Slot; + data >> item.ContainerSlot; + data >> item.Slot; } return data; } +} +} diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.h b/src/server/game/Server/Packets/ItemPacketsCommon.h index 147672997b3..2131d8ae7a5 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.h +++ b/src/server/game/Server/Packets/ItemPacketsCommon.h @@ -18,7 +18,7 @@ #ifndef ItemPacketsCommon_h__ #define ItemPacketsCommon_h__ -#include "Define.h" +#include "ItemDefines.h" #include "PacketUtilities.h" #include "Optional.h" #include <vector> @@ -38,13 +38,33 @@ namespace WorldPackets { namespace Item { - struct ItemBonusInstanceData + struct ItemBonuses { ItemContext Context = ItemContext(0); std::vector<int32> BonusListIDs; - bool operator==(ItemBonusInstanceData const& r) const; - bool operator!=(ItemBonusInstanceData const& r) const { return !(*this == r); } + bool operator==(ItemBonuses const& r) const; + bool operator!=(ItemBonuses const& r) const { return !(*this == r); } + }; + + struct ItemMod + { + ItemMod() = default; + ItemMod(int32 value, ItemModifier type) : Value(value), Type(type) { } + + int32 Value = 0; + ItemModifier Type = MAX_ITEM_MODIFIERS; + + bool operator==(ItemMod const& r) const; + bool operator!=(ItemMod const& r) const { return !(*this == r); } + }; + + struct ItemModList + { + Array<ItemMod, MAX_ITEM_MODIFIERS> Values; + + bool operator==(ItemModList const& r) const; + bool operator!=(ItemModList const& r) const { return !(*this == r); } }; struct ItemInstance @@ -55,8 +75,8 @@ namespace WorldPackets void Initialize(::VoidStorageItem const* voidItem); uint32 ItemID = 0; - Optional<ItemBonusInstanceData> ItemBonus; - Optional<CompactArray<int32>> Modifications; + Optional<ItemBonuses> ItemBonus; + ItemModList Modifications; bool operator==(ItemInstance const& r) const; bool operator!=(ItemInstance const& r) const { return !(*this == r); } @@ -90,17 +110,20 @@ namespace WorldPackets } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData const& itemBonusInstanceData); -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceData& itemBonusInstanceData); - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance); -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance); +namespace WorldPackets +{ +namespace Item +{ +ByteBuffer& operator<<(ByteBuffer& data, ItemInstance const& itemInstance); +ByteBuffer& operator>>(ByteBuffer& data, ItemInstance& itemInstance); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData const& itemEnchantData); +ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemData const& itemGemInstanceData); -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemData& itemGemInstanceData); +ByteBuffer& operator<<(ByteBuffer& data, ItemGemData const& itemGemInstanceData); +ByteBuffer& operator>>(ByteBuffer& data, ItemGemData& itemGemInstanceData); -ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::InvUpdate& invUpdate); +ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate); +} +} #endif // ItemPacketsCommon_h__ diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index dee02bba7a2..7452384c7d4 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -69,6 +69,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGBlackListSlot con data << uint32(lfgBlackListSlot.Reason); data << int32(lfgBlackListSlot.SubReason1); data << int32(lfgBlackListSlot.SubReason2); + data << uint32(lfgBlackListSlot.SoftLock); return data; } @@ -262,27 +263,6 @@ WorldPacket const* WorldPackets::LFG::LFGRoleCheckUpdate::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGJoinBlackListSlot const& lfgBlackListSlot) -{ - data << int32(lfgBlackListSlot.Slot); - data << int32(lfgBlackListSlot.Reason); - data << int32(lfgBlackListSlot.SubReason1); - data << int32(lfgBlackListSlot.SubReason2); - - return data; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::LFG::LFGJoinBlackList const& blackList) -{ - data << blackList.Guid; - data << uint32(blackList.Slots.size()); - - for (WorldPackets::LFG::LFGJoinBlackListSlot const& slot : blackList.Slots) - data << slot; - - return data; -} - WorldPacket const* WorldPackets::LFG::LFGJoinResult::Write() { _worldPacket << Ticket; @@ -291,7 +271,7 @@ WorldPacket const* WorldPackets::LFG::LFGJoinResult::Write() _worldPacket << uint32(BlackList.size()); _worldPacket << uint32(BlackListNames.size()); - for (LFGJoinBlackList const& blackList : BlackList) + for (LFGBlackList const& blackList : BlackList) _worldPacket << blackList; for (std::string const* str : BlackListNames) diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index f3580464129..7dd0fbccc2e 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -122,14 +122,15 @@ namespace WorldPackets struct LFGBlackListSlot { - LFGBlackListSlot() { } - LFGBlackListSlot(uint32 slot, uint32 reason, int32 subReason1, int32 subReason2) - : Slot(slot), Reason(reason), SubReason1(subReason1), SubReason2(subReason2) { } + LFGBlackListSlot() = default; + LFGBlackListSlot(uint32 slot, uint32 reason, int32 subReason1, int32 subReason2, uint32 softLock) + : Slot(slot), Reason(reason), SubReason1(subReason1), SubReason2(subReason2), SoftLock(softLock) { } uint32 Slot = 0; uint32 Reason = 0; int32 SubReason1 = 0; int32 SubReason2 = 0; + uint32 SoftLock = 0; }; struct LFGBlackList @@ -140,7 +141,7 @@ namespace WorldPackets struct LfgPlayerQuestRewardItem { - LfgPlayerQuestRewardItem() { } + LfgPlayerQuestRewardItem() = default; LfgPlayerQuestRewardItem(int32 itemId, int32 quantity) : ItemID(itemId), Quantity(quantity) { } int32 ItemID = 0; @@ -149,7 +150,7 @@ namespace WorldPackets struct LfgPlayerQuestRewardCurrency { - LfgPlayerQuestRewardCurrency() { } + LfgPlayerQuestRewardCurrency() = default; LfgPlayerQuestRewardCurrency(int32 currencyID, int32 quantity) : CurrencyID(currencyID), Quantity(quantity) { } int32 CurrencyID = 0; @@ -250,7 +251,7 @@ namespace WorldPackets struct LFGRoleCheckUpdateMember { - LFGRoleCheckUpdateMember() { } + LFGRoleCheckUpdateMember() = default; LFGRoleCheckUpdateMember(ObjectGuid guid, uint32 rolesDesired, uint8 level, bool roleCheckComplete) : Guid(guid), RolesDesired(rolesDesired), Level(level), RoleCheckComplete(roleCheckComplete) { } @@ -277,24 +278,6 @@ namespace WorldPackets bool IsRequeue = false; }; - struct LFGJoinBlackListSlot - { - LFGJoinBlackListSlot() { } - LFGJoinBlackListSlot(int32 slot, int32 reason, int32 subReason1, int32 subReason2) - : Slot(slot), Reason(reason), SubReason1(subReason1), SubReason2(subReason2) { } - - int32 Slot = 0; - int32 Reason = 0; - int32 SubReason1 = 0; - int32 SubReason2 = 0; - }; - - struct LFGJoinBlackList - { - ObjectGuid Guid; - std::vector<LFGJoinBlackListSlot> Slots; - }; - class LFGJoinResult final : public ServerPacket { public: @@ -305,7 +288,7 @@ namespace WorldPackets RideTicket Ticket; uint8 Result = 0; uint8 ResultDetail = 0; - std::vector<LFGJoinBlackList> BlackList; + std::vector<LFGBlackList> BlackList; std::vector<std::string const*> BlackListNames; }; @@ -327,7 +310,7 @@ namespace WorldPackets struct LFGPlayerRewards { - LFGPlayerRewards() { } + LFGPlayerRewards() = default; LFGPlayerRewards(int32 id, uint32 quantity, int32 bonusQuantity, bool isCurrency) : Quantity(quantity), BonusQuantity(bonusQuantity) { diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index ba96fcd366f..127a040b032 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -53,6 +53,7 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() _worldPacket.WriteBit(WeeklyQuantity.is_initialized()); _worldPacket.WriteBit(TrackedQuantity.is_initialized()); _worldPacket.WriteBit(MaxQuantity.is_initialized()); + _worldPacket.WriteBit(Unused901.is_initialized()); _worldPacket.WriteBit(SuppressChatLog); _worldPacket.WriteBit(QuantityChange.is_initialized()); _worldPacket.WriteBit(QuantityGainSource.is_initialized()); @@ -68,6 +69,9 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() if (MaxQuantity) _worldPacket << int32(*MaxQuantity); + if (Unused901) + _worldPacket << int32(*Unused901); + if (QuantityChange) _worldPacket << int32(*QuantityChange); @@ -98,6 +102,7 @@ WorldPacket const* WorldPackets::Misc::SetupCurrency::Write() _worldPacket.WriteBit(data.MaxWeeklyQuantity.is_initialized()); _worldPacket.WriteBit(data.TrackedQuantity.is_initialized()); _worldPacket.WriteBit(data.MaxQuantity.is_initialized()); + _worldPacket.WriteBit(data.Unused901.is_initialized()); _worldPacket.WriteBits(data.Flags, 5); _worldPacket.FlushBits(); @@ -109,6 +114,8 @@ WorldPacket const* WorldPackets::Misc::SetupCurrency::Write() _worldPacket << uint32(*data.TrackedQuantity); if (data.MaxQuantity) _worldPacket << int32(*data.MaxQuantity); + if (data.Unused901) + _worldPacket << int32(*data.Unused901); } return &_worldPacket; @@ -181,7 +188,7 @@ WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() _worldPacket << uint32(*RestrictedAccountMaxLevel); if (RestrictedAccountMaxMoney) - _worldPacket << uint32(*RestrictedAccountMaxMoney); + _worldPacket << uint64(*RestrictedAccountMaxMoney); if (InstanceGroupSize) _worldPacket << uint32(*InstanceGroupSize); @@ -466,6 +473,7 @@ WorldPacket const* WorldPackets::Misc::PlayObjectSound::Write() _worldPacket << SourceObjectGUID; _worldPacket << TargetObjectGUID; _worldPacket << Position; + _worldPacket << int32(BroadcastTextID); return &_worldPacket; } @@ -474,6 +482,7 @@ WorldPacket const* WorldPackets::Misc::PlaySound::Write() { _worldPacket << int32(SoundKitID); _worldPacket << SourceObjectGuid; + _worldPacket << int32(BroadcastTextID); return &_worldPacket; } @@ -491,13 +500,6 @@ void WorldPackets::Misc::FarSight::Read() Enable = _worldPacket.ReadBit(); } -WorldPacket const* WorldPackets::Misc::Dismount::Write() -{ - _worldPacket << Guid; - - return &_worldPacket; -} - void WorldPackets::Misc::SaveCUFProfiles::Read() { CUFProfiles.resize(_worldPacket.read<uint32>()); diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index cc91c0bf49e..78ea4fb997e 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -117,6 +117,7 @@ namespace WorldPackets Optional<int32> WeeklyQuantity; Optional<int32> TrackedQuantity; Optional<int32> MaxQuantity; + Optional<int32> Unused901; Optional<int32> QuantityChange; Optional<int32> QuantityGainSource; Optional<int32> QuantityLostSource; @@ -144,6 +145,7 @@ namespace WorldPackets Optional<int32> MaxWeeklyQuantity; // Weekly Currency cap. Optional<int32> TrackedQuantity; Optional<int32> MaxQuantity; + Optional<int32> Unused901; uint8 Flags = 0; // 0 = none, }; @@ -260,7 +262,7 @@ namespace WorldPackets bool BlockExitingLoadingScreen = false; // when set to true, sending SMSG_UPDATE_OBJECT with CreateObject Self bit = true will not hide loading screen // instead it will be done after this packet is sent again with false in this bit and SMSG_UPDATE_OBJECT Values for player Optional<uint32> RestrictedAccountMaxLevel; - Optional<uint32> RestrictedAccountMaxMoney; + Optional<uint64> RestrictedAccountMaxMoney; Optional<uint32> InstanceGroupSize; }; @@ -631,6 +633,7 @@ namespace WorldPackets ObjectGuid SourceObjectGUID; int32 SoundKitID = 0; TaggedPosition<::Position::XYZ> Position; + int32 BroadcastTextID = 0; }; class TC_GAME_API PlaySound final : public ServerPacket @@ -643,6 +646,7 @@ namespace WorldPackets ObjectGuid SourceObjectGuid; int32 SoundKitID = 0; + int32 BroadcastTextID = 0; }; class TC_GAME_API PlaySpeakerbotSound final : public ServerPacket @@ -692,16 +696,6 @@ namespace WorldPackets bool Enable = false; }; - class Dismount final : public ServerPacket - { - public: - Dismount() : ServerPacket(SMSG_DISMOUNT, 16) { } - - WorldPacket const* Write() override; - - ObjectGuid Guid; - }; - class SaveCUFProfiles final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index f05c3cf1b14..2c44b01bb7c 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -53,8 +53,8 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo) data.WriteBit(hasFallData); data.WriteBit(hasSpline); - data.WriteBit(0); // HeightChangeFailed - data.WriteBit(0); // RemoteTimeValid + data.WriteBit(false); // HeightChangeFailed + data.WriteBit(false); // RemoteTimeValid data.FlushBits(); @@ -227,24 +227,48 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineJu return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineAnimTierTransition const& animTierTransition) +{ + data << int32(animTierTransition.TierTransitionID); + data << uint32(animTierTransition.StartTime); + data << uint32(animTierTransition.EndTime); + data << uint8(animTierTransition.AnimTier); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MonsterSplineUnknown901 const& unk) +{ + for (WorldPackets::Movement::MonsterSplineUnknown901::Inner const& unkInner : unk.Data) + { + data << int32(unkInner.Unknown_1); + data << int32(unkInner.Unknown_2); + data << int32(unkInner.Unknown_3); + data << uint32(unkInner.Unknown_4); + } + + return data; +} + ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline const& movementSpline) { data << uint32(movementSpline.Flags); - data << uint8(movementSpline.AnimTier); - data << uint32(movementSpline.TierTransStartTime); data << int32(movementSpline.Elapsed); data << uint32(movementSpline.MoveTime); data << uint32(movementSpline.FadeObjectTime); data << uint8(movementSpline.Mode); - data << uint8(movementSpline.VehicleExitVoluntary); data << movementSpline.TransportGUID; data << int8(movementSpline.VehicleSeat); data.WriteBits(movementSpline.Face, 2); data.WriteBits(movementSpline.Points.size(), 16); + data.WriteBit(movementSpline.VehicleExitVoluntary); + data.WriteBit(movementSpline.Interpolate); data.WriteBits(movementSpline.PackedDeltas.size(), 16); data.WriteBit(movementSpline.SplineFilter.is_initialized()); data.WriteBit(movementSpline.SpellEffectExtraData.is_initialized()); data.WriteBit(movementSpline.JumpExtraData.is_initialized()); + data.WriteBit(movementSpline.AnimTierTransition.is_initialized()); + data.WriteBit(movementSpline.Unknown901.is_initialized()); data.FlushBits(); if (movementSpline.SplineFilter) @@ -266,6 +290,7 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline for (TaggedPosition<Position::XYZ> const& pos : movementSpline.Points) data << pos; + for (TaggedPosition<Position::PackedXYZ> const& pos : movementSpline.PackedDeltas) data << pos; @@ -275,6 +300,12 @@ ByteBuffer& WorldPackets::operator<<(ByteBuffer& data, Movement::MovementSpline if (movementSpline.JumpExtraData) data << *movementSpline.JumpExtraData; + if (movementSpline.AnimTierTransition) + data << *movementSpline.AnimTierTransition; + + if (movementSpline.Unknown901) + data << *movementSpline.Unknown901; + return data; } @@ -315,10 +346,11 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: data.WriteBits(moveSpline.facing.type, 2); // Face bool hasFadeObjectTime = data.WriteBit(moveSpline.splineflags.fadeObject && moveSpline.effect_start_time < moveSpline.Duration()); data.WriteBits(moveSpline.getPath().size(), 16); - data.WriteBits(uint8(moveSpline.spline.mode()), 2); // Mode - data.WriteBit(0); // HasSplineFilter + data.WriteBit(false); // HasSplineFilter data.WriteBit(moveSpline.spell_effect_extra.is_initialized()); // HasSpellEffectExtraData data.WriteBit(moveSpline.splineflags.parabolic); // HasJumpExtraData + data.WriteBit(moveSpline.anim_tier.is_initialized()); // HasAnimationTierTransition + data.WriteBit(false); // HasUnknown901 data.FlushBits(); //if (HasSplineFilterKey) @@ -374,6 +406,25 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: data << uint32(moveSpline.effect_start_time); data << uint32(0); // Duration (override) } + + if (moveSpline.anim_tier) + { + data << int32(moveSpline.anim_tier->TierTransitionId); + data << uint32(moveSpline.effect_start_time); + data << uint32(0); + data << uint8(moveSpline.anim_tier->AnimTier); + } + + //if (HasUnknown901) + //{ + // for (WorldPackets::Movement::MonsterSplineUnknown901::Inner const& unkInner : unk.Data) size = 16 + // { + // data << int32(unkInner.Unknown_1); + // data << int32(unkInner.Unknown_2); + // data << int32(unkInner.Unknown_3); + // data << uint32(unkInner.Unknown_4); + // } + //} } } @@ -436,15 +487,17 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS if (splineFlags.animation) { - movementSpline.AnimTier = splineFlags.getAnimTier(); - movementSpline.TierTransStartTime = moveSpline.effect_start_time; + movementSpline.AnimTierTransition.emplace(); + movementSpline.AnimTierTransition->TierTransitionID = moveSpline.anim_tier->TierTransitionId; + movementSpline.AnimTierTransition->StartTime = moveSpline.effect_start_time; + movementSpline.AnimTierTransition->AnimTier = moveSpline.anim_tier->AnimTier; } movementSpline.MoveTime = moveSpline.Duration(); if (splineFlags.parabolic) { - movementSpline.JumpExtraData = boost::in_place(); + movementSpline.JumpExtraData.emplace(); movementSpline.JumpExtraData->JumpGravity = moveSpline.vertical_acceleration; movementSpline.JumpExtraData->StartTime = moveSpline.effect_start_time; } @@ -454,7 +507,7 @@ void WorldPackets::Movement::MonsterMove::InitializeSplineData(::Movement::MoveS if (moveSpline.spell_effect_extra) { - movementSpline.SpellEffectExtraData = boost::in_place(); + movementSpline.SpellEffectExtraData.emplace(); movementSpline.SpellEffectExtraData->TargetGUID = moveSpline.spell_effect_extra->Target; movementSpline.SpellEffectExtraData->SpellVisualID = moveSpline.spell_effect_extra->SpellVisualId; movementSpline.SpellEffectExtraData->ProgressCurveID = moveSpline.spell_effect_extra->ProgressCurveId; @@ -582,10 +635,19 @@ WorldPacket const* WorldPackets::Movement::TransferAborted::Write() return &_worldPacket; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::TeleportLocation const& teleportLocation) +{ + data << teleportLocation.Pos; + data << int32(teleportLocation.Unused901_1); + data << int32(teleportLocation.Unused901_2); + + return data; +} + WorldPacket const* WorldPackets::Movement::NewWorld::Write() { _worldPacket << int32(MapID); - _worldPacket << Pos; + _worldPacket << Loc; _worldPacket << uint32(Reason); _worldPacket << MovementOffset; return &_worldPacket; @@ -772,9 +834,9 @@ WorldPacket const* WorldPackets::Movement::MoveSetCollisionHeight::Write() _worldPacket << uint32(SequenceIndex); _worldPacket << float(Height); _worldPacket << float(Scale); + _worldPacket << uint8(Reason); _worldPacket << uint32(MountDisplayID); _worldPacket << int32(ScaleDuration); - _worldPacket.WriteBits(Reason, 2); _worldPacket.FlushBits(); return &_worldPacket; @@ -840,7 +902,7 @@ void WorldPackets::Movement::MoveSetCollisionHeightAck::Read() _worldPacket >> Data; _worldPacket >> Height; _worldPacket >> MountDisplayID; - Reason = UpdateCollisionHeightReason(_worldPacket.ReadBits(2)); + Reason = _worldPacket.read<UpdateCollisionHeightReason, uint8>(); } void WorldPackets::Movement::MoveTimeSkipped::Read() @@ -917,13 +979,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound data.WriteBit(stateChange.MovementForceGUID.is_initialized()); data.FlushBits(); - if (stateChange.CollisionHeight) - { - data << float(stateChange.CollisionHeight->Height); - data << float(stateChange.CollisionHeight->Scale); - data.WriteBits(stateChange.CollisionHeight->Reason, 2); - data.FlushBits(); - } + if (stateChange.MovementForce_) + data << *stateChange.MovementForce_; if (stateChange.Speed) data << float(*stateChange.Speed); @@ -938,12 +995,16 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound if (stateChange.VehicleRecID) data << int32(*stateChange.VehicleRecID); + if (stateChange.CollisionHeight) + { + data << float(stateChange.CollisionHeight->Height); + data << float(stateChange.CollisionHeight->Scale); + data << uint8(stateChange.CollisionHeight->Reason); + } + if (stateChange.MovementForceGUID) data << *stateChange.MovementForceGUID; - if (stateChange.MovementForce_) - data << *stateChange.MovementForce_; - return data; } diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index e8bb4ac7ae9..ae8c7a07c6c 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -91,24 +91,46 @@ namespace WorldPackets uint32 Duration = 0; }; + struct MonsterSplineAnimTierTransition + { + int32 TierTransitionID = 0; + uint32 StartTime = 0; + uint32 EndTime = 0; + uint8 AnimTier = 0; + }; + + struct MonsterSplineUnknown901 + { + struct Inner + { + int32 Unknown_1 = 0; + int32 Unknown_2 = 0; + int32 Unknown_3 = 0; + uint32 Unknown_4 = 0; + }; + + std::array<Inner, 16> Data; + }; + struct MovementSpline { uint32 Flags = 0; // Spline flags uint8 Face = 0; // Movement direction (see MonsterMoveType enum) - uint8 AnimTier = 0; - uint32 TierTransStartTime = 0; int32 Elapsed = 0; uint32 MoveTime = 0; uint32 FadeObjectTime = 0; std::vector<TaggedPosition<Position::XYZ>> Points; // Spline path uint8 Mode = 0; // Spline mode - actually always 0 in this packet - Catmullrom mode appears only in SMSG_UPDATE_OBJECT. In this packet it is determined by flags - uint8 VehicleExitVoluntary = 0; + bool VehicleExitVoluntary = false; + bool Interpolate = false; ObjectGuid TransportGUID; int8 VehicleSeat = -1; std::vector<TaggedPosition<Position::PackedXYZ>> PackedDeltas; Optional<MonsterSplineFilter> SplineFilter; Optional<MonsterSplineSpellEffectExtraData> SpellEffectExtraData; Optional<MonsterSplineJumpExtraData> JumpExtraData; + Optional<MonsterSplineAnimTierTransition> AnimTierTransition; + Optional<MonsterSplineUnknown901> Unknown901; float FaceDirection = 0.0f; ObjectGuid FaceGUID; TaggedPosition<Position::XYZ> FaceSpot; @@ -233,16 +255,23 @@ namespace WorldPackets uint32 TransfertAbort = 0; }; + struct TeleportLocation + { + TaggedPosition<Position::XYZO> Pos; + int32 Unused901_1 = -1; + int32 Unused901_2 = -1; + }; + class NewWorld final : public ServerPacket { public: - NewWorld() : ServerPacket(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4) { } + NewWorld() : ServerPacket(SMSG_NEW_WORLD, 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4) { } WorldPacket const* Write() override; int32 MapID = 0; uint32 Reason = 0; - TaggedPosition<Position::XYZO> Pos; + TeleportLocation Loc; TaggedPosition<Position::XYZ> MovementOffset; // Adjusts all pending movement events by this offset }; @@ -609,7 +638,7 @@ namespace WorldPackets { float Height = 0.0f; float Scale = 0.0f; - UpdateCollisionHeightReason Reason; + UpdateCollisionHeightReason Reason = UPDATE_COLLISION_HEIGHT_MOUNT; }; struct KnockBackInfo diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index acaa5f64cbf..770a7bb7ea3 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -16,13 +16,53 @@ */ #include "NPCPackets.h" +#include "Util.h" -void WorldPackets::NPC::Hello::Read() +namespace WorldPackets +{ +namespace NPC +{ +ByteBuffer& operator<<(ByteBuffer& data, ClientGossipText const& gossipText) +{ + data << int32(gossipText.QuestID); + data << int32(gossipText.ContentTuningID); + data << int32(gossipText.QuestType); + data << int32(gossipText.QuestFlags[0]); + data << int32(gossipText.QuestFlags[1]); + + data.WriteBit(gossipText.Repeatable); + data.WriteBits(gossipText.QuestTitle.size(), 9); + data.FlushBits(); + + data.WriteString(gossipText.QuestTitle); + + return data; +} + +void Hello::Read() { _worldPacket >> Unit; } -WorldPacket const* WorldPackets::NPC::GossipMessage::Write() +ByteBuffer& operator<<(ByteBuffer& data, TreasureItem const& treasureItem) +{ + data.WriteBits(AsUnderlyingType(treasureItem.Type), 1); + data << int32(treasureItem.ID); + data << int32(treasureItem.Quantity); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, TreasureLootList const& treasureLootList) +{ + data << uint32(treasureLootList.Items.size()); + for (TreasureItem const& treasureItem : treasureLootList.Items) + data << treasureItem; + + return data; +} + +WorldPacket const* GossipMessage::Write() { _worldPacket << GossipGUID; _worldPacket << int32(GossipID); @@ -39,32 +79,22 @@ WorldPacket const* WorldPackets::NPC::GossipMessage::Write() _worldPacket << int32(options.OptionCost); _worldPacket.WriteBits(options.Text.size(), 12); _worldPacket.WriteBits(options.Confirm.size(), 12); + _worldPacket.WriteBits(AsUnderlyingType(options.Status), 2); _worldPacket.FlushBits(); + _worldPacket << options.Treasure; + _worldPacket.WriteString(options.Text); _worldPacket.WriteString(options.Confirm); } for (ClientGossipText const& text : GossipText) - { - _worldPacket << int32(text.QuestID); - _worldPacket << int32(text.QuestType); - _worldPacket << int32(text.QuestLevel); - _worldPacket << int32(text.QuestMaxScalingLevel); - _worldPacket << int32(text.QuestFlags[0]); - _worldPacket << int32(text.QuestFlags[1]); - - _worldPacket.WriteBit(text.Repeatable); - _worldPacket.WriteBits(text.QuestTitle.size(), 9); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(text.QuestTitle); - } + _worldPacket << text; return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &item) +ByteBuffer& operator<<(ByteBuffer& data, VendorItem const& item) { data << uint32(item.MuID); data << int32(item.Type); @@ -75,6 +105,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &it data << int32(item.ExtendedCostID); data << int32(item.PlayerConditionFailed); data << item.Item; + data.WriteBit(item.Locked); data.WriteBit(item.DoNotFilterOnVendor); data.WriteBit(item.Refundable); data.FlushBits(); @@ -82,7 +113,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &it return data; } -WorldPacket const* WorldPackets::NPC::VendorInventory::Write() +WorldPacket const* VendorInventory::Write() { _worldPacket << Vendor; _worldPacket << uint8(Reason); @@ -93,7 +124,7 @@ WorldPacket const* WorldPackets::NPC::VendorInventory::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::NPC::TrainerList::Write() +WorldPacket const* TrainerList::Write() { _worldPacket << TrainerGUID; _worldPacket << uint32(TrainerType); @@ -118,14 +149,14 @@ WorldPacket const* WorldPackets::NPC::TrainerList::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::NPC::ShowBank::Write() +WorldPacket const* ShowBank::Write() { _worldPacket << Guid; return &_worldPacket; } -void WorldPackets::NPC::GossipSelectOption::Read() +void GossipSelectOption::Read() { _worldPacket >> GossipUnit; _worldPacket >> GossipID; @@ -135,14 +166,14 @@ void WorldPackets::NPC::GossipSelectOption::Read() PromotionCode = _worldPacket.ReadString(length); } -WorldPacket const* WorldPackets::NPC::PlayerTabardVendorActivate::Write() +WorldPacket const* PlayerTabardVendorActivate::Write() { _worldPacket << Vendor; return &_worldPacket; } -WorldPacket const* WorldPackets::NPC::GossipPOI::Write() +WorldPacket const* GossipPOI::Write() { _worldPacket << int32(ID); _worldPacket << Pos; @@ -156,26 +187,26 @@ WorldPacket const* WorldPackets::NPC::GossipPOI::Write() return &_worldPacket; } -void WorldPackets::NPC::SpiritHealerActivate::Read() +void SpiritHealerActivate::Read() { _worldPacket >> Healer; } -WorldPacket const* WorldPackets::NPC::SpiritHealerConfirm::Write() +WorldPacket const* SpiritHealerConfirm::Write() { _worldPacket << Unit; return &_worldPacket; } -void WorldPackets::NPC::TrainerBuySpell::Read() +void TrainerBuySpell::Read() { _worldPacket >> TrainerGUID; _worldPacket >> TrainerID; _worldPacket >> SpellID; } -WorldPacket const* WorldPackets::NPC::TrainerBuyFailed::Write() +WorldPacket const* TrainerBuyFailed::Write() { _worldPacket << TrainerGUID; _worldPacket << SpellID; @@ -184,7 +215,9 @@ WorldPacket const* WorldPackets::NPC::TrainerBuyFailed::Write() return &_worldPacket; } -void WorldPackets::NPC::RequestStabledPets::Read() +void RequestStabledPets::Read() { _worldPacket >> StableMaster; } +} +} diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index 9cc3cad1c7b..c5d57b31efc 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -24,6 +24,9 @@ #include "Position.h" #include <array> +enum class GossipOptionStatus : uint8; +enum class GossipOptionRewardType : uint8; + namespace WorldPackets { namespace NPC @@ -45,27 +48,42 @@ namespace WorldPackets ObjectGuid Unit; }; + struct TreasureItem + { + GossipOptionRewardType Type = GossipOptionRewardType(0); + int32 ID = 0; + int32 Quantity = 0; + }; + + struct TreasureLootList + { + std::vector<TreasureItem> Items; + }; + struct ClientGossipOptions { int32 ClientOption = 0; uint8 OptionNPC = 0; uint8 OptionFlags = 0; int32 OptionCost = 0; + GossipOptionStatus Status = GossipOptionStatus(0); std::string Text; std::string Confirm; + TreasureLootList Treasure; }; struct ClientGossipText { int32 QuestID = 0; + int32 ContentTuningID = 0; int32 QuestType = 0; - int32 QuestLevel = 0; - int32 QuestMaxScalingLevel = 0; bool Repeatable = false; std::string QuestTitle; int32 QuestFlags[2] = { }; }; + ByteBuffer& operator<<(ByteBuffer& data, ClientGossipText const& gossipText); + class GossipMessage final : public ServerPacket { public: @@ -113,6 +131,7 @@ namespace WorldPackets int32 StackCount = 0; int32 ExtendedCostID = 0; int32 PlayerConditionFailed = 0; + bool Locked = false; bool DoNotFilterOnVendor = false; bool Refundable = false; }; diff --git a/src/server/game/Server/Packets/PacketUtilities.cpp b/src/server/game/Server/Packets/PacketUtilities.cpp index 510f9bbcbf8..99f3decd0e1 100644 --- a/src/server/game/Server/Packets/PacketUtilities.cpp +++ b/src/server/game/Server/Packets/PacketUtilities.cpp @@ -25,8 +25,3 @@ WorldPackets::PacketArrayMaxCapacityException::PacketArrayMaxCapacityException(s builder << "Attempted to read more array elements from packet " << requestedSize << " than allowed " << sizeLimit; message().assign(builder.str()); } - -void WorldPackets::CheckCompactArrayMaskOverflow(std::size_t index, std::size_t limit) -{ - ASSERT(index < limit, "Attempted to insert " SZFMTD " values into CompactArray but it can only hold " SZFMTD, index, limit); -} diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h index c40858d0088..327c42923a2 100644 --- a/src/server/game/Server/Packets/PacketUtilities.h +++ b/src/server/game/Server/Packets/PacketUtilities.h @@ -90,101 +90,16 @@ namespace WorldPackets _storage.push_back(std::forward<value_type>(value)); } - private: - storage_type _storage; - }; - - void CheckCompactArrayMaskOverflow(std::size_t index, std::size_t limit); - - template <typename T> - class CompactArray - { - public: - CompactArray() : _mask(0) { } - - CompactArray(CompactArray const& right) - : _mask(right._mask), _contents(right._contents) { } - - CompactArray(CompactArray&& right) - : _mask(right._mask), _contents(std::move(right._contents)) - { - right._mask = 0; - } - - CompactArray& operator=(CompactArray const& right) - { - _mask = right._mask; - _contents = right._contents; - return *this; - } - - CompactArray& operator=(CompactArray&& right) - { - _mask = right._mask; - right._mask = 0; - _contents = std::move(right._contents); - return *this; - } - - uint32 GetMask() const { return _mask; } - T const& operator[](std::size_t index) const { return _contents[index]; } - std::size_t GetSize() const { return _contents.size(); } - - void Insert(std::size_t index, T const& value) - { - CheckCompactArrayMaskOverflow(index, sizeof(_mask) * 8); - - _mask |= 1 << index; - if (_contents.size() <= index) - _contents.resize(index + 1); - _contents[index] = value; - } - - void Clear() + template<typename... Args> + T& emplace_back(Args&&... args) { - _mask = 0; - _contents.clear(); - } - - bool operator==(CompactArray const& r) const - { - if (_mask != r._mask) - return false; - - return _contents == r._contents; + _storage.emplace_back(std::forward<Args>(args)...); + return _storage.back(); } - bool operator!=(CompactArray const& r) const { return !(*this == r); } - private: - uint32 _mask; - std::vector<T> _contents; + storage_type _storage; }; - - template <typename T> - ByteBuffer& operator<<(ByteBuffer& data, CompactArray<T> const& v) - { - uint32 mask = v.GetMask(); - data << uint32(mask); - for (std::size_t i = 0; i < v.GetSize(); ++i) - if (mask & (1 << i)) - data << v[i]; - - return data; - } - - template <typename T> - ByteBuffer& operator>>(ByteBuffer& data, CompactArray<T>& v) - { - uint32 mask; - data >> mask; - - for (std::size_t index = 0; mask != 0; mask >>= 1, ++index) - if ((mask & 1) != 0) - v.Insert(index, data.read<T>()); - - return data; - } } #endif // PacketUtilities_h__ diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 1c58bf9edc3..72388d1b98c 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -64,16 +64,10 @@ WorldPacket const* WorldPackets::Party::PartyInvite::Write() _worldPacket.WriteBit(IsXRealm); _worldPacket.WriteBit(MustBeBNetFriend); _worldPacket.WriteBit(AllowMultipleRoles); + _worldPacket.WriteBit(QuestSessionActive); _worldPacket.WriteBits(InviterName.length(), 6); - _worldPacket << InviterVirtualRealmAddress; - _worldPacket.WriteBit(IsLocal); - _worldPacket.WriteBit(Unk2); - _worldPacket.WriteBits(InviterRealmNameActual.size(), 8); - _worldPacket.WriteBits(InviterRealmNameNormalized.size(), 8); - _worldPacket.WriteString(InviterRealmNameActual); - _worldPacket.WriteString(InviterRealmNameNormalized); - + _worldPacket << InviterRealm; _worldPacket << InviterGUID; _worldPacket << InviterBNetAccountId; _worldPacket << uint16(Unk1); @@ -99,9 +93,7 @@ void WorldPackets::Party::PartyInvite::Initialize(Player* const inviter, int32 p ProposedRoles = proposedRoles; - InviterVirtualRealmAddress = realm.Id.GetAddress(); - InviterRealmNameActual = realm.Name; - InviterRealmNameNormalized = realm.NormalizedName; + InviterRealm = Auth::VirtualRealmInfo(realm.Id.GetAddress(), true, false, realm.Name, realm.NormalizedName); } void WorldPackets::Party::PartyInviteResponse::Read() @@ -165,7 +157,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPhaseSt ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberAuraStates const& aura) { data << int32(aura.SpellID); - data << uint8(aura.Flags); + data << uint16(aura.Flags); data << uint32(aura.ActiveFlags); data << int32(aura.Points.size()); for (float points : aura.Points) @@ -174,6 +166,15 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberAuraSta return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::CTROptions const& ctrOptions) +{ + data << uint32(ctrOptions.ContentTuningConditionMask); + data << int32(ctrOptions.Unused901); + data << uint32(ctrOptions.ExpansionLevelMask); + + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberPetStats const& petStats) { data << petStats.GUID; @@ -214,6 +215,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyMemberStats c data << int32(memberStats.VehicleSeat); data << uint32(memberStats.Auras.size()); data << memberStats.Phases; + data << memberStats.ChromieTime; for (WorldPackets::Party::PartyMemberAuraStates const& aura : memberStats.Auras) data << aura; diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 3dde1e61399..769ffae245d 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -19,6 +19,7 @@ #define PartyPackets_h__ #include "Packet.h" +#include "AuthenticationPackets.h" #include "ObjectGuid.h" #include "Group.h" #include "Optional.h" @@ -67,22 +68,19 @@ namespace WorldPackets bool MightCRZYou = false; bool MustBeBNetFriend = false; bool AllowMultipleRoles = false; - bool Unk2 = false; + bool QuestSessionActive = false; uint16 Unk1 = 0; bool CanAccept = false; // Inviter + Auth::VirtualRealmInfo InviterRealm; ObjectGuid InviterGUID; ObjectGuid InviterBNetAccountId; std::string InviterName; // Realm bool IsXRealm = false; - bool IsLocal = true; - uint32 InviterVirtualRealmAddress = 0u; - std::string InviterRealmNameActual; - std::string InviterRealmNameNormalized; // Lfg uint32 ProposedRoles = 0; @@ -159,7 +157,7 @@ namespace WorldPackets struct PartyMemberAuraStates { int32 SpellID = 0; - uint8 Flags = 0; + uint16 Flags = 0; uint32 ActiveFlags = 0u; std::vector<float> Points; }; @@ -176,6 +174,13 @@ namespace WorldPackets std::vector<PartyMemberAuraStates> Auras; }; + struct CTROptions + { + uint32 ContentTuningConditionMask = 0; + int32 Unused901 = 0; + uint32 ExpansionLevelMask = 0; + }; + struct PartyMemberStats { uint16 Level = 0; @@ -204,6 +209,8 @@ namespace WorldPackets uint16 WmoGroupID = 0; uint32 WmoDoodadPlacementID = 0; int8 PartyType[2]; + + CTROptions ChromieTime; }; class PartyMemberFullState final : public ServerPacket diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index c1de4be8960..e6cdb28ee60 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -80,7 +80,6 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write() _worldPacket << int32(Stats.RequiredExpansion); _worldPacket << int32(Stats.VignetteID); _worldPacket << int32(Stats.Class); - _worldPacket << float(Stats.FadeRegionRadius); _worldPacket << int32(Stats.WidgetSetID); _worldPacket << int32(Stats.WidgetSetUnitConditionID); @@ -355,9 +354,9 @@ void WorldPackets::Query::QuestPOIQuery::Read() ByteBuffer& operator<<(ByteBuffer& data, QuestPOIData const& questPOIData) { data << int32(questPOIData.QuestID); - data << int32(questPOIData.QuestPOIBlobDataStats.size()); + data << int32(questPOIData.Blobs.size()); - for (QuestPOIBlobData const& questPOIBlobData : questPOIData.QuestPOIBlobDataStats) + for (QuestPOIBlobData const& questPOIBlobData : questPOIData.Blobs) { data << int32(questPOIBlobData.BlobIndex); data << int32(questPOIBlobData.ObjectiveIndex); @@ -369,13 +368,15 @@ ByteBuffer& operator<<(ByteBuffer& data, QuestPOIData const& questPOIData) data << int32(questPOIBlobData.Flags); data << int32(questPOIBlobData.WorldEffectID); data << int32(questPOIBlobData.PlayerConditionID); + data << int32(questPOIBlobData.NavigationPlayerConditionID); data << int32(questPOIBlobData.SpawnTrackingID); - data << int32(questPOIBlobData.QuestPOIBlobPointStats.size()); + data << int32(questPOIBlobData.Points.size()); - for (QuestPOIBlobPoint const& questPOIBlobPoint : questPOIBlobData.QuestPOIBlobPointStats) + for (QuestPOIBlobPoint const& questPOIBlobPoint : questPOIBlobData.Points) { - data << int32(questPOIBlobPoint.X); - data << int32(questPOIBlobPoint.Y); + data << int16(questPOIBlobPoint.X); + data << int16(questPOIBlobPoint.Y); + data << int16(questPOIBlobPoint.Z); } data.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs); diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 6c8d2b6c648..b7279d18964 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -83,7 +83,6 @@ namespace WorldPackets uint32 RequiredExpansion = 0; uint32 VignetteID = 0; int32 Class = 0; - float FadeRegionRadius = 0.0f; int32 WidgetSetID = 0; int32 WidgetSetUnitConditionID = 0; std::array<uint32, 2> Flags; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 36bb9c3aa17..3fcd20bb1fe 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -16,13 +16,26 @@ */ #include "QuestPackets.h" +#include "Util.h" -void WorldPackets::Quest::QuestGiverStatusQuery::Read() +namespace WorldPackets +{ +namespace Quest +{ +ByteBuffer& operator<<(ByteBuffer& data, QuestCompleteDisplaySpell const& questDisplaySpell) +{ + data << int32(questDisplaySpell.SpellID); + data << int32(questDisplaySpell.PlayerConditionID); + + return data; +} + +void QuestGiverStatusQuery::Read() { _worldPacket >> QuestGiverGUID; } -WorldPacket const* WorldPackets::Quest::QuestGiverStatus::Write() +WorldPacket const* QuestGiverStatus::Write() { _worldPacket << QuestGiver.Guid; _worldPacket << uint32(QuestGiver.Status); @@ -30,7 +43,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverStatus::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestGiverStatusMultiple::Write() +WorldPacket const* QuestGiverStatusMultiple::Write() { _worldPacket << int32(QuestGiver.size()); for (QuestGiverInfo const& questGiver : QuestGiver) @@ -42,18 +55,18 @@ WorldPacket const* WorldPackets::Quest::QuestGiverStatusMultiple::Write() return &_worldPacket; } -void WorldPackets::Quest::QuestGiverHello::Read() +void QuestGiverHello::Read() { _worldPacket >> QuestGiverGUID; } -void WorldPackets::Quest::QueryQuestInfo::Read() +void QueryQuestInfo::Read() { _worldPacket >> QuestID; _worldPacket >> QuestGiver; } -WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() +WorldPacket const* QueryQuestInfoResponse::Write() { _worldPacket << uint32(QuestID); @@ -64,11 +77,8 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() { _worldPacket << int32(Info.QuestID); _worldPacket << int32(Info.QuestType); - _worldPacket << int32(Info.QuestLevel); - _worldPacket << int32(Info.QuestScalingFactionGroup); - _worldPacket << int32(Info.QuestMaxScalingLevel); _worldPacket << int32(Info.QuestPackageID); - _worldPacket << int32(Info.QuestMinLevel); + _worldPacket << int32(Info.ContentTuningID); _worldPacket << int32(Info.QuestSortID); _worldPacket << int32(Info.QuestInfoID); _worldPacket << int32(Info.SuggestedGroupNum); @@ -79,7 +89,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << int32(Info.RewardMoneyDifficulty); _worldPacket << float(Info.RewardMoneyMultiplier); _worldPacket << int32(Info.RewardBonusMoney); - _worldPacket.append(Info.RewardDisplaySpell, QUEST_REWARD_DISPLAY_SPELL_COUNT); + _worldPacket << uint32(Info.RewardDisplaySpell.size()); _worldPacket << int32(Info.RewardSpell); _worldPacket << int32(Info.RewardHonor); _worldPacket << float(Info.RewardKillHonor); @@ -149,6 +159,9 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << int32(Info.ManagedWorldStateID); _worldPacket << int32(Info.QuestSessionBonus); + for (QuestCompleteDisplaySpell const& rewardDisplaySpell : Info.RewardDisplaySpell) + _worldPacket << rewardDisplaySpell; + _worldPacket.WriteBits(Info.LogTitle.size(), 9); _worldPacket.WriteBits(Info.LogDescription.size(), 12); _worldPacket.WriteBits(Info.QuestDescription.size(), 12); @@ -158,6 +171,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket.WriteBits(Info.PortraitTurnInText.size(), 10); _worldPacket.WriteBits(Info.PortraitTurnInName.size(), 8); _worldPacket.WriteBits(Info.QuestCompletionLog.size(), 11); + _worldPacket.WriteBit(Info.ReadyForTranslation); _worldPacket.FlushBits(); for (QuestObjective const& questObjective : Info.Objectives) @@ -195,7 +209,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestUpdateAddCredit::Write() +WorldPacket const* QuestUpdateAddCredit::Write() { _worldPacket << VictimGUID; _worldPacket << int32(QuestID); @@ -207,7 +221,7 @@ WorldPacket const* WorldPackets::Quest::QuestUpdateAddCredit::Write() return &_worldPacket; }; -WorldPacket const* WorldPackets::Quest::QuestUpdateAddCreditSimple::Write() +WorldPacket const* QuestUpdateAddCreditSimple::Write() { _worldPacket << int32(QuestID); _worldPacket << int32(ObjectID); @@ -216,7 +230,7 @@ WorldPacket const* WorldPackets::Quest::QuestUpdateAddCreditSimple::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestUpdateAddPvPCredit::Write() +WorldPacket const* QuestUpdateAddPvPCredit::Write() { _worldPacket << int32(QuestID); _worldPacket << uint16(Count); @@ -224,7 +238,26 @@ WorldPacket const* WorldPackets::Quest::QuestUpdateAddPvPCredit::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards) +ByteBuffer& operator<<(ByteBuffer& data, QuestChoiceItem const& questChoiceItem) +{ + data.WriteBits(AsUnderlyingType(questChoiceItem.LootItemType), 2); + data << questChoiceItem.Item; + data << int32(questChoiceItem.Quantity); + + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, QuestChoiceItem& questChoiceItem) +{ + data.ResetBitPos(); + questChoiceItem.LootItemType = LootItemType(data.ReadBits(2)); + data >> questChoiceItem.Item; + data >> questChoiceItem.Quantity; + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, QuestRewards const& questRewards) { data << int32(questRewards.ChoiceItemCount); data << int32(questRewards.ItemCount); @@ -251,8 +284,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const data << int32(questRewards.FactionCapIn[i]); } - for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) - data << int32(questRewards.SpellCompletionDisplayID[i]); + data.append(questRewards.SpellCompletionDisplayID.data(), questRewards.SpellCompletionDisplayID.size()); data << int32(questRewards.SpellCompletionID); @@ -266,11 +298,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const data << int32(questRewards.NumSkillUps); data << int32(questRewards.TreasurePickerID); - for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) - { - data << questRewards.ChoiceItems[i].Item; - data << int32(questRewards.ChoiceItems[i].Quantity); - } + for (QuestChoiceItem const& choiceItem : questRewards.ChoiceItems) + data << choiceItem; data.WriteBit(questRewards.IsBoostSpell); data.FlushBits(); @@ -278,7 +307,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferReward const& offer) +ByteBuffer& operator<<(ByteBuffer& data, QuestGiverOfferReward const& offer) { data << offer.QuestGiverGUID; data << int32(offer.QuestGiverCreatureID); @@ -287,23 +316,24 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferRew data << int32(offer.QuestFlags[1]); // FlagsEx data << int32(offer.SuggestedPartyMembers); data << int32(offer.Emotes.size()); - for (WorldPackets::Quest::QuestDescEmote const& emote : offer.Emotes) + for (QuestDescEmote const& emote : offer.Emotes) { data << int32(emote.Type); data << uint32(emote.Delay); } data.WriteBit(offer.AutoLaunched); + data.WriteBit(false); // Unused data.FlushBits(); - data << offer.Rewards; // WorldPackets::Quest::QuestRewards + data << offer.Rewards; // QuestRewards return data; } -WorldPacket const* WorldPackets::Quest::QuestGiverOfferRewardMessage::Write() +WorldPacket const* QuestGiverOfferRewardMessage::Write() { - _worldPacket << QuestData; // WorldPackets::Quest::QuestGiverOfferReward + _worldPacket << QuestData; // QuestGiverOfferReward _worldPacket << int32(QuestPackageID); _worldPacket << int32(PortraitGiver); _worldPacket << int32(PortraitGiverMount); @@ -327,14 +357,14 @@ WorldPacket const* WorldPackets::Quest::QuestGiverOfferRewardMessage::Write() return &_worldPacket; }; -void WorldPackets::Quest::QuestGiverChooseReward::Read() +void QuestGiverChooseReward::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; - _worldPacket >> ItemChoiceID; + _worldPacket >> Choice; } -WorldPacket const* WorldPackets::Quest::QuestGiverQuestComplete::Write() +WorldPacket const* QuestGiverQuestComplete::Write() { _worldPacket << int32(QuestID); _worldPacket << int32(XPReward); @@ -351,14 +381,14 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestComplete::Write() return &_worldPacket; } -void WorldPackets::Quest::QuestGiverCompleteQuest::Read() +void QuestGiverCompleteQuest::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; FromScript = _worldPacket.ReadBit(); } -WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() +WorldPacket const* QuestGiverQuestDetails::Write() { _worldPacket << QuestGiverGUID; _worldPacket << InformUnit; @@ -379,13 +409,13 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() for (int32 spell : LearnSpells) _worldPacket << int32(spell); - for (WorldPackets::Quest::QuestDescEmote const& emote : DescEmotes) + for (QuestDescEmote const& emote : DescEmotes) { _worldPacket << int32(emote.Type); _worldPacket << uint32(emote.Delay); } - for (WorldPackets::Quest::QuestObjectiveSimple const& obj : Objectives) + for (QuestObjectiveSimple const& obj : Objectives) { _worldPacket << int32(obj.ID); _worldPacket << int32(obj.ObjectID); @@ -406,7 +436,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() _worldPacket.WriteBit(DisplayPopup); _worldPacket.FlushBits(); - _worldPacket << Rewards; // WorldPackets::Quest::QuestRewards + _worldPacket << Rewards; // QuestRewards _worldPacket.WriteString(QuestTitle); _worldPacket.WriteString(DescriptionText); _worldPacket.WriteString(LogDescription); @@ -418,7 +448,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestDetails::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write() +WorldPacket const* QuestGiverRequestItems::Write() { _worldPacket << QuestGiverGUID; _worldPacket << int32(QuestGiverCreatureID); @@ -459,32 +489,32 @@ WorldPacket const* WorldPackets::Quest::QuestGiverRequestItems::Write() return &_worldPacket; } -void WorldPackets::Quest::QuestGiverRequestReward::Read() +void QuestGiverRequestReward::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; } -void WorldPackets::Quest::QuestGiverQueryQuest::Read() +void QuestGiverQueryQuest::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; RespondToGiver = _worldPacket.ReadBit(); } -void WorldPackets::Quest::QuestGiverAcceptQuest::Read() +void QuestGiverAcceptQuest::Read() { _worldPacket >> QuestGiverGUID; _worldPacket >> QuestID; StartCheat = _worldPacket.ReadBit(); } -void WorldPackets::Quest::QuestLogRemoveQuest::Read() +void QuestLogRemoveQuest::Read() { _worldPacket >> Entry; } -WorldPacket const* WorldPackets::Quest::QuestGiverQuestListMessage::Write() +WorldPacket const* QuestGiverQuestListMessage::Write() { _worldPacket << QuestGiverGUID; _worldPacket << uint32(GreetEmoteDelay); @@ -493,33 +523,22 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestListMessage::Write() _worldPacket.WriteBits(Greeting.size(), 11); _worldPacket.FlushBits(); - for (GossipText const& gossip : QuestDataText) - { - _worldPacket << uint32(gossip.QuestID); - _worldPacket << uint32(gossip.QuestType); - _worldPacket << int32(gossip.QuestLevel); - _worldPacket << int32(gossip.QuestMaxScalingLevel); - _worldPacket << uint32(gossip.QuestFlags); - _worldPacket << uint32(gossip.QuestFlagsEx); - _worldPacket.WriteBit(gossip.Repeatable); - _worldPacket.WriteBits(gossip.QuestTitle.size(), 9); - _worldPacket.FlushBits(); - _worldPacket.WriteString(gossip.QuestTitle); - } + for (NPC::ClientGossipText const& gossip : QuestDataText) + _worldPacket << gossip; _worldPacket.WriteString(Greeting); return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestUpdateComplete::Write() +WorldPacket const* QuestUpdateComplete::Write() { _worldPacket << int32(QuestID); return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestConfirmAcceptResponse::Write() +WorldPacket const* QuestConfirmAcceptResponse::Write() { _worldPacket << uint32(QuestID); _worldPacket << InitiatedBy; @@ -532,12 +551,12 @@ WorldPacket const* WorldPackets::Quest::QuestConfirmAcceptResponse::Write() return &_worldPacket; } -void WorldPackets::Quest::QuestConfirmAccept::Read() +void QuestConfirmAccept::Read() { _worldPacket >> QuestID; } -WorldPacket const* WorldPackets::Quest::QuestPushResultResponse::Write() +WorldPacket const* QuestPushResultResponse::Write() { _worldPacket << SenderGUID; _worldPacket << uint8(Result); @@ -545,14 +564,14 @@ WorldPacket const* WorldPackets::Quest::QuestPushResultResponse::Write() return &_worldPacket; } -void WorldPackets::Quest::QuestPushResult::Read() +void QuestPushResult::Read() { _worldPacket >> SenderGUID; _worldPacket >> QuestID; _worldPacket >> Result; } -WorldPacket const* WorldPackets::Quest::QuestGiverInvalidQuest::Write() +WorldPacket const* QuestGiverInvalidQuest::Write() { _worldPacket << uint32(Reason); _worldPacket << int32(ContributionRewardID); @@ -567,14 +586,14 @@ WorldPacket const* WorldPackets::Quest::QuestGiverInvalidQuest::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestUpdateFailedTimer::Write() +WorldPacket const* QuestUpdateFailedTimer::Write() { _worldPacket << uint32(QuestID); return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::QuestGiverQuestFailed::Write() +WorldPacket const* QuestGiverQuestFailed::Write() { _worldPacket << uint32(QuestID); _worldPacket << uint32(Reason); @@ -582,19 +601,19 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestFailed::Write() return &_worldPacket; } -void WorldPackets::Quest::PushQuestToParty::Read() +void PushQuestToParty::Read() { _worldPacket >> QuestID; } -WorldPacket const* WorldPackets::Quest::DailyQuestsReset::Write() +WorldPacket const* DailyQuestsReset::Write() { _worldPacket << int32(Count); return &_worldPacket; } -WorldPacket const* WorldPackets::Quest::WorldQuestUpdateResponse::Write() +WorldPacket const* WorldQuestUpdateResponse::Write() { _worldPacket << uint32(WorldQuestUpdates.size()); @@ -610,14 +629,14 @@ WorldPacket const* WorldPackets::Quest::WorldQuestUpdateResponse::Write() return &_worldPacket; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceResponseRewardEntry const& playerChoiceResponseRewardEntry) +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseRewardEntry const& playerChoiceResponseRewardEntry) { data << playerChoiceResponseRewardEntry.Item; data << int32(playerChoiceResponseRewardEntry.Quantity); return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceResponseReward const& playerChoiceResponseReward) +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseReward const& playerChoiceResponseReward) { data << int32(playerChoiceResponseReward.TitleID); data << int32(playerChoiceResponseReward.PackageID); @@ -632,30 +651,45 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon data << uint32(playerChoiceResponseReward.Factions.size()); data << uint32(playerChoiceResponseReward.ItemChoices.size()); - for (WorldPackets::Quest::PlayerChoiceResponseRewardEntry const& item : playerChoiceResponseReward.Items) + for (PlayerChoiceResponseRewardEntry const& item : playerChoiceResponseReward.Items) data << item; - for (WorldPackets::Quest::PlayerChoiceResponseRewardEntry const& currency : playerChoiceResponseReward.Currencies) + for (PlayerChoiceResponseRewardEntry const& currency : playerChoiceResponseReward.Currencies) data << currency; - for (WorldPackets::Quest::PlayerChoiceResponseRewardEntry const& faction : playerChoiceResponseReward.Factions) + for (PlayerChoiceResponseRewardEntry const& faction : playerChoiceResponseReward.Factions) data << faction; - for (WorldPackets::Quest::PlayerChoiceResponseRewardEntry const& itemChoice : playerChoiceResponseReward.ItemChoices) + for (PlayerChoiceResponseRewardEntry const& itemChoice : playerChoiceResponseReward.ItemChoices) data << itemChoice; return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceResponse const& playerChoiceResponse) +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponseMawPower const& playerChoiceResponseMawPower) +{ + data << int32(playerChoiceResponseMawPower.Unused901_1); + data << int32(playerChoiceResponseMawPower.TypeArtFileID); + data << int32(playerChoiceResponseMawPower.Rarity); + data << uint32(playerChoiceResponseMawPower.RarityColor); + data << int32(playerChoiceResponseMawPower.Unused901_2); + data << int32(playerChoiceResponseMawPower.SpellID); + data << int32(playerChoiceResponseMawPower.MaxStacks); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, PlayerChoiceResponse const& playerChoiceResponse) { data << int32(playerChoiceResponse.ResponseID); + data << uint16(playerChoiceResponse.ResponseIdentifier); data << int32(playerChoiceResponse.ChoiceArtFileID); data << int32(playerChoiceResponse.Flags); data << uint32(playerChoiceResponse.WidgetSetID); data << uint32(playerChoiceResponse.UiTextureAtlasElementID); data << uint32(playerChoiceResponse.SoundKitID); data << uint8(playerChoiceResponse.GroupID); + data << int32(playerChoiceResponse.UiTextureKitID); data.WriteBits(playerChoiceResponse.Answer.length(), 9); data.WriteBits(playerChoiceResponse.Header.length(), 9); @@ -665,6 +699,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon data.WriteBits(playerChoiceResponse.Confirmation.length(), 7); data.WriteBit(playerChoiceResponse.RewardQuestID.is_initialized()); data.WriteBit(playerChoiceResponse.Reward.is_initialized()); + data.WriteBit(playerChoiceResponse.MawPower.is_initialized()); data.FlushBits(); if (playerChoiceResponse.Reward) @@ -680,10 +715,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon if (playerChoiceResponse.RewardQuestID) data << uint32(*playerChoiceResponse.RewardQuestID); + if (playerChoiceResponse.MawPower) + data << *playerChoiceResponse.MawPower; + return data; } -WorldPacket const* WorldPackets::Quest::DisplayPlayerChoice::Write() +WorldPacket const* DisplayPlayerChoice::Write() { _worldPacket << int32(ChoiceID); _worldPacket << uint32(Responses.size()); @@ -703,8 +741,10 @@ WorldPacket const* WorldPackets::Quest::DisplayPlayerChoice::Write() return &_worldPacket; } -void WorldPackets::Quest::ChoiceResponse::Read() +void ChoiceResponse::Read() { _worldPacket >> ChoiceID; _worldPacket >> ResponseID; } +} +} diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 096c77c28cc..8c738fdcebe 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -20,8 +20,12 @@ #include "Packet.h" #include "ItemPacketsCommon.h" +#include "NPCPackets.h" #include "ObjectGuid.h" #include "QuestDef.h" +#include <array> + +enum class LootItemType : uint8; namespace WorldPackets { @@ -104,15 +108,18 @@ namespace WorldPackets int32 DisplayID = 0; }; + struct QuestCompleteDisplaySpell + { + int32 SpellID = 0; + int32 PlayerConditionID = 0; + }; + struct QuestInfo { int32 QuestID = 0; int32 QuestType = 0; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) - int32 QuestLevel = 0; // may be -1, static data, in other cases must be used dynamic level: Player::GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client) - int32 QuestScalingFactionGroup = 0; - int32 QuestMaxScalingLevel = 255; + int32 ContentTuningID = 0; int32 QuestPackageID = 0; - int32 QuestMinLevel = 0; int32 QuestSortID = 0; // zone or sort to display in quest log int32 QuestInfoID = 0; int32 SuggestedGroupNum = 0; @@ -123,7 +130,7 @@ namespace WorldPackets int32 RewardMoneyDifficulty = 0; float RewardMoneyMultiplier = 1.0f; int32 RewardBonusMoney = 0; - int32 RewardDisplaySpell[QUEST_REWARD_DISPLAY_SPELL_COUNT] = { }; // reward spell, this spell will be displayed (icon) + std::vector<QuestCompleteDisplaySpell> RewardDisplaySpell; // reward spell, this spell will be displayed (icon) int32 RewardSpell = 0; int32 RewardHonor = 0; float RewardKillHonor = 0.0f; @@ -176,6 +183,7 @@ namespace WorldPackets int32 RewardFactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT] = { }; int32 RewardCurrencyID[QUEST_REWARD_CURRENCY_COUNT] = { }; int32 RewardCurrencyQty[QUEST_REWARD_CURRENCY_COUNT] = { }; + bool ReadyForTranslation = false; }; class QueryQuestInfoResponse final : public ServerPacket @@ -230,6 +238,7 @@ namespace WorldPackets struct QuestChoiceItem { + ::LootItemType LootItemType = ::LootItemType(0); Item::ItemInstance Item; int32 Quantity = 0; }; @@ -245,20 +254,20 @@ namespace WorldPackets int32 Honor = 0; int32 Title = 0; int32 FactionFlags = 0; - int32 SpellCompletionDisplayID[QUEST_REWARD_DISPLAY_SPELL_COUNT] = { }; + std::array<int32, QUEST_REWARD_DISPLAY_SPELL_COUNT> SpellCompletionDisplayID = { }; int32 SpellCompletionID = 0; int32 SkillLineID = 0; int32 NumSkillUps = 0; int32 TreasurePickerID = 0; - QuestChoiceItem ChoiceItems[QUEST_REWARD_CHOICES_COUNT]; - int32 ItemID[QUEST_REWARD_ITEM_COUNT] = { }; - int32 ItemQty[QUEST_REWARD_ITEM_COUNT] = { }; - int32 FactionID[QUEST_REWARD_REPUTATIONS_COUNT] = { }; - int32 FactionValue[QUEST_REWARD_REPUTATIONS_COUNT] = { }; - int32 FactionOverride[QUEST_REWARD_REPUTATIONS_COUNT] = { }; - int32 FactionCapIn[QUEST_REWARD_REPUTATIONS_COUNT] = { }; - int32 CurrencyID[QUEST_REWARD_CURRENCY_COUNT] = { }; - int32 CurrencyQty[QUEST_REWARD_CURRENCY_COUNT] = { }; + std::array<QuestChoiceItem, QUEST_REWARD_CHOICES_COUNT> ChoiceItems; + std::array<int32, QUEST_REWARD_ITEM_COUNT> ItemID = { }; + std::array<int32, QUEST_REWARD_ITEM_COUNT> ItemQty = { }; + std::array<int32, QUEST_REWARD_REPUTATIONS_COUNT> FactionID = { }; + std::array<int32, QUEST_REWARD_REPUTATIONS_COUNT> FactionValue = { }; + std::array<int32, QUEST_REWARD_REPUTATIONS_COUNT> FactionOverride = { }; + std::array<int32, QUEST_REWARD_REPUTATIONS_COUNT> FactionCapIn = { }; + std::array<int32, QUEST_REWARD_CURRENCY_COUNT> CurrencyID = { }; + std::array<int32, QUEST_REWARD_CURRENCY_COUNT> CurrencyQty = { }; bool IsBoostSpell = false; }; @@ -310,7 +319,7 @@ namespace WorldPackets ObjectGuid QuestGiverGUID; int32 QuestID = 0; - int32 ItemChoiceID = 0; + QuestChoiceItem Choice; }; class QuestGiverQuestComplete final : public ServerPacket @@ -469,21 +478,6 @@ namespace WorldPackets uint8 Entry = 0; }; - struct GossipText - { - GossipText(uint32 questID, uint32 questType, int32 questLevel, int32 questMaxScalingLevel, uint32 questFlags, uint32 questFlagsEx, bool repeatable, std::string questTitle) : - QuestID(questID), QuestType(questType), QuestLevel(questLevel), QuestMaxScalingLevel(questMaxScalingLevel), QuestFlags(questFlags), - QuestFlagsEx(questFlagsEx), Repeatable(repeatable), QuestTitle(std::move(questTitle)) { } - uint32 QuestID; - uint32 QuestType; - int32 QuestLevel; - int32 QuestMaxScalingLevel; - uint32 QuestFlags; - uint32 QuestFlagsEx; - bool Repeatable; - std::string QuestTitle; - }; - class QuestGiverQuestListMessage final : public ServerPacket { public: @@ -494,7 +488,7 @@ namespace WorldPackets ObjectGuid QuestGiverGUID; uint32 GreetEmoteDelay = 0; uint32 GreetEmoteType = 0; - std::vector<GossipText> QuestDataText; + std::vector<NPC::ClientGossipText> QuestDataText; std::string Greeting; }; @@ -667,15 +661,28 @@ namespace WorldPackets std::vector<PlayerChoiceResponseRewardEntry> ItemChoices; }; + struct PlayerChoiceResponseMawPower + { + int32 Unused901_1 = 0; + int32 TypeArtFileID = 0; + int32 Rarity = 0; + uint32 RarityColor = 0; + int32 Unused901_2 = 0; + int32 SpellID = 0; + int32 MaxStacks = 0; + }; + struct PlayerChoiceResponse { int32 ResponseID = 0; + uint16 ResponseIdentifier = 0; int32 ChoiceArtFileID = 0; int32 Flags = 0; uint32 WidgetSetID = 0; uint32 UiTextureAtlasElementID = 0; uint32 SoundKitID = 0; uint8 GroupID = 0; + int32 UiTextureKitID = 0; std::string Answer; std::string Header; std::string SubHeader; @@ -684,6 +691,7 @@ namespace WorldPackets std::string Confirmation; Optional<PlayerChoiceResponseReward> Reward; Optional<uint32> RewardQuestID; + Optional<PlayerChoiceResponseMawPower> MawPower; }; class DisplayPlayerChoice final : public ServerPacket @@ -717,7 +725,4 @@ namespace WorldPackets } } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestRewards const& questRewards); -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::QuestGiverOfferReward const& offer); - #endif // QuestPackets_h__ diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h index b6406fe95cb..b3eecced951 100644 --- a/src/server/game/Server/Packets/ReputationPackets.h +++ b/src/server/game/Server/Packets/ReputationPackets.h @@ -25,7 +25,7 @@ namespace WorldPackets { namespace Reputation { - static uint16 const FactionCount = 350; + static uint16 const FactionCount = 400; class InitializeFactions final : public ServerPacket { diff --git a/src/server/game/Server/Packets/ScenarioPackets.cpp b/src/server/game/Server/Packets/ScenarioPackets.cpp index cc40dca1135..c833e6a2104 100644 --- a/src/server/game/Server/Packets/ScenarioPackets.cpp +++ b/src/server/game/Server/Packets/ScenarioPackets.cpp @@ -114,12 +114,14 @@ WorldPacket const* WorldPackets::Scenario::ScenarioPOIs::Write() _worldPacket << int32(scenarioPOI.Flags); _worldPacket << int32(scenarioPOI.WorldEffectID); _worldPacket << int32(scenarioPOI.PlayerConditionID); + _worldPacket << int32(scenarioPOI.NavigationPlayerConditionID); _worldPacket << uint32(scenarioPOI.Points.size()); for (ScenarioPOIPoint const& scenarioPOIBlobPoint : scenarioPOI.Points) { _worldPacket << int32(scenarioPOIBlobPoint.X); _worldPacket << int32(scenarioPOIBlobPoint.Y); + _worldPacket << int32(scenarioPOIBlobPoint.Z); } } } diff --git a/src/server/game/Server/Packets/SocialPackets.cpp b/src/server/game/Server/Packets/SocialPackets.cpp index 0ab58ca7bb7..a86a8f4c706 100644 --- a/src/server/game/Server/Packets/SocialPackets.cpp +++ b/src/server/game/Server/Packets/SocialPackets.cpp @@ -64,8 +64,8 @@ WorldPacket const* WorldPackets::Social::ContactList::Write() _worldPacket.WriteBits(Contacts.size(), 8); _worldPacket.FlushBits(); - for (size_t i = 0; i < Contacts.size(); ++i) - _worldPacket << Contacts[i]; + for (ContactInfo const& contact : Contacts) + _worldPacket << contact; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 9efe37d956d..d31647bb122 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -95,8 +95,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraDataInfo cons { data << auraData.CastID; data << int32(auraData.SpellID); - data << int32(auraData.SpellXSpellVisualID); - data << uint8(auraData.Flags); + data << auraData.Visual; + data << uint16(auraData.Flags); data << uint32(auraData.ActiveFlags); data << uint16(auraData.CastLevel); data << uint8(auraData.Applications); @@ -205,15 +205,39 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::MissileTrajecto return buffer; } +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Spells::SpellOptionalReagent& optionalReagent) +{ + data >> optionalReagent.ItemID; + data >> optionalReagent.Slot; + data >> optionalReagent.Count; + return data; +} + +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Spells::SpellExtraCurrencyCost& extraCurrencyCost) +{ + data >> extraCurrencyCost.CurrencyID; + data >> extraCurrencyCost.Count; + return data; +} + ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastRequest& request) { buffer >> request.CastID; buffer >> request.Misc[0]; buffer >> request.Misc[1]; buffer >> request.SpellID; - buffer >> request.SpellXSpellVisualID; + buffer >> request.Visual; buffer >> request.MissileTrajectory; buffer >> request.CraftingNPC; + request.OptionalReagents.resize(buffer.read<uint32>()); + request.OptionalCurrencies.resize(buffer.read<uint32>()); + + for (WorldPackets::Spells::SpellOptionalReagent& optionalReagent : request.OptionalReagents) + buffer >> optionalReagent; + + for (WorldPackets::Spells::SpellExtraCurrencyCost& optionalCurrency : request.OptionalCurrencies) + buffer >> optionalCurrency; + request.SendCastFlags = buffer.ReadBits(5); bool hasMoveUpdate = buffer.ReadBit(); request.Weight.resize(buffer.ReadBits(2)); @@ -372,7 +396,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con data << spellCastData.CastID; data << spellCastData.OriginalCastID; data << int32(spellCastData.SpellID); - data << uint32(spellCastData.SpellXSpellVisualID); + data << spellCastData.Visual; data << uint32(spellCastData.CastFlags); data << uint32(spellCastData.CastFlagsEx); data << uint32(spellCastData.CastTime); @@ -439,6 +463,7 @@ WorldPacket const* WorldPackets::Spells::LearnedSpells::Write() { _worldPacket << uint32(SpellID.size()); _worldPacket << uint32(FavoriteSpellID.size()); + _worldPacket << uint32(SpecializationID); for (int32 spell : SpellID) _worldPacket << spell; @@ -474,7 +499,7 @@ WorldPacket const* WorldPackets::Spells::SpellFailure::Write() _worldPacket << CasterUnit; _worldPacket << CastID; _worldPacket << int32(SpellID); - _worldPacket << uint32(SpellXSpellVisualID); + _worldPacket << Visual; _worldPacket << uint16(Reason); return &_worldPacket; @@ -485,7 +510,7 @@ WorldPacket const* WorldPackets::Spells::SpellFailedOther::Write() _worldPacket << CasterUnit; _worldPacket << CastID; _worldPacket << uint32(SpellID); - _worldPacket << uint32(SpellXSpellVisualID); + _worldPacket << Visual; _worldPacket << uint8(Reason); return &_worldPacket; @@ -495,7 +520,7 @@ WorldPacket const* WorldPackets::Spells::CastFailed::Write() { _worldPacket << CastID; _worldPacket << int32(SpellID); - _worldPacket << int32(SpellXSpellVisualID); + _worldPacket << Visual; _worldPacket << int32(Reason); _worldPacket << int32(FailedArg1); _worldPacket << int32(FailedArg2); @@ -715,6 +740,8 @@ WorldPacket const* WorldPackets::Spells::CancelSpellVisualKit::Write() { _worldPacket << Source; _worldPacket << int32(SpellVisualKitID); + _worldPacket.WriteBit(MountedVisual); + _worldPacket.FlushBits(); return &_worldPacket; } @@ -760,6 +787,8 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisualKit::Write() _worldPacket << int32(KitRecID); _worldPacket << int32(KitType); _worldPacket << uint32(Duration); + _worldPacket.WriteBit(MountedVisual); + _worldPacket.FlushBits(); return &_worldPacket; } @@ -794,7 +823,7 @@ WorldPacket const* WorldPackets::Spells::SpellChannelStart::Write() { _worldPacket << CasterGUID; _worldPacket << int32(SpellID); - _worldPacket << int32(SpellXSpellVisualID); + _worldPacket << Visual; _worldPacket << uint32(ChannelDuration); _worldPacket.WriteBit(InterruptImmunities.is_initialized()); _worldPacket.WriteBit(HealPrediction.is_initialized()); @@ -852,18 +881,17 @@ WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write() { _worldPacket << UnitGUID; _worldPacket << int32(DisplayID); + _worldPacket << int32(SpellVisualKitID); _worldPacket << uint8(RaceID); _worldPacket << uint8(Gender); _worldPacket << uint8(ClassID); - _worldPacket << uint8(SkinColor); - _worldPacket << uint8(FaceVariation); - _worldPacket << uint8(HairVariation); - _worldPacket << uint8(HairColor); - _worldPacket << uint8(BeardVariation); - _worldPacket.append(CustomDisplay.data(), CustomDisplay.size()); + _worldPacket << uint32(Customizations.size()); _worldPacket << GuildGUID; _worldPacket << uint32(ItemDisplayID.size()); + for (Character::ChrCustomizationChoice const& customization : Customizations) + _worldPacket << customization; + for (int32 itemDisplayId : ItemDisplayID) _worldPacket << int32(itemDisplayId); @@ -874,6 +902,7 @@ WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write() { _worldPacket << UnitGUID; _worldPacket << int32(DisplayID); + _worldPacket << int32(SpellVisualKitID); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 65f1484322d..fa043ec305f 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -18,10 +18,12 @@ #ifndef SpellPackets_h__ #define SpellPackets_h__ +#include "CharacterPackets.h" #include "CombatLogPacketsCommon.h" #include "MovementInfo.h" #include "ObjectGuid.h" #include "Optional.h" +#include "PacketUtilities.h" #include "Position.h" #include "SharedDefines.h" #include <array> @@ -174,8 +176,8 @@ namespace WorldPackets { ObjectGuid CastID; int32 SpellID = 0; - int32 SpellXSpellVisualID = 0; - uint8 Flags = 0; + SpellCastVisual Visual; + uint16 Flags = 0; uint32 ActiveFlags = 0; uint16 CastLevel = 1; uint8 Applications = 1; @@ -238,16 +240,31 @@ namespace WorldPackets uint32 Quantity = 0; }; + struct SpellOptionalReagent + { + int32 ItemID = 0; + int32 Slot = 0; + int32 Count = 0; + }; + + struct SpellExtraCurrencyCost + { + int32 CurrencyID = 0; + int32 Count = 0; + }; + struct SpellCastRequest { ObjectGuid CastID; int32 SpellID = 0; - uint32 SpellXSpellVisualID = 0; + SpellCastVisual Visual; uint8 SendCastFlags = 0; SpellTargetData Target; MissileTrajectoryRequest MissileTrajectory; Optional<MovementInfo> MoveUpdate; std::vector<SpellWeight> Weight; + Array<SpellOptionalReagent, 3> OptionalReagents; + Array<SpellExtraCurrencyCost, 5 /*MAX_ITEM_EXT_COST_CURRENCIES*/> OptionalCurrencies; ObjectGuid CraftingNPC; int32 Misc[2] = { }; }; @@ -359,7 +376,7 @@ namespace WorldPackets ObjectGuid CastID; ObjectGuid OriginalCastID; int32 SpellID = 0; - uint32 SpellXSpellVisualID = 0; + SpellCastVisual Visual; uint32 CastFlags = 0; uint32 CastFlagsEx = 0; uint32 CastTime = 0; @@ -407,6 +424,7 @@ namespace WorldPackets std::vector<int32> SpellID; std::vector<int32> FavoriteSpellID; + uint32 SpecializationID = 0; bool SuppressMessaging = false; }; @@ -425,13 +443,13 @@ namespace WorldPackets class SpellFailure final : public ServerPacket { public: - SpellFailure() : ServerPacket(SMSG_SPELL_FAILURE, 16+4+2+1) { } + SpellFailure() : ServerPacket(SMSG_SPELL_FAILURE, 16 + 4 + 8 + 2 + 16) { } WorldPacket const* Write() override; ObjectGuid CasterUnit; uint32 SpellID = 0; - uint32 SpellXSpellVisualID = 0; + SpellCastVisual Visual; uint16 Reason = 0; ObjectGuid CastID; }; @@ -439,13 +457,13 @@ namespace WorldPackets class SpellFailedOther final : public ServerPacket { public: - SpellFailedOther() : ServerPacket(SMSG_SPELL_FAILED_OTHER, 16+4+1+1) { } + SpellFailedOther() : ServerPacket(SMSG_SPELL_FAILED_OTHER, 16 + 4 + 8 + 1 + 16) { } WorldPacket const* Write() override; ObjectGuid CasterUnit; uint32 SpellID = 0; - uint32 SpellXSpellVisualID = 0; + SpellCastVisual Visual; uint8 Reason = 0; ObjectGuid CastID; }; @@ -459,7 +477,7 @@ namespace WorldPackets ObjectGuid CastID; int32 SpellID = 0; - int32 SpellXSpellVisualID = 0; + SpellCastVisual Visual; int32 Reason = 0; int32 FailedArg1 = -1; int32 FailedArg2 = -1; @@ -697,6 +715,7 @@ namespace WorldPackets ObjectGuid Source; int32 SpellVisualKitID = 0; + bool MountedVisual = false; }; class PlayOrphanSpellVisual final : public ServerPacket @@ -749,6 +768,7 @@ namespace WorldPackets int32 KitRecID = 0; int32 KitType = 0; uint32 Duration = 0; + bool MountedVisual = false; }; class CancelCast final : public ClientPacket @@ -793,7 +813,7 @@ namespace WorldPackets WorldPacket const* Write() override; int32 SpellID = 0; - int32 SpellXSpellVisualID = 0; + SpellCastVisual Visual; Optional<SpellChannelStartInterruptImmunities> InterruptImmunities; ObjectGuid CasterGUID; Optional<SpellTargetedHealPrediction> HealPrediction; @@ -867,15 +887,11 @@ namespace WorldPackets ObjectGuid UnitGUID; int32 DisplayID = 0; + int32 SpellVisualKitID = 0; uint8 RaceID = 0; uint8 Gender = 0; uint8 ClassID = 0; - uint8 SkinColor = 0; - uint8 FaceVariation = 0; - uint8 HairVariation = 0; - uint8 HairColor = 0; - uint8 BeardVariation = 0; - std::array<uint8, PLAYER_CUSTOM_DISPLAY_SIZE> CustomDisplay; + std::vector<Character::ChrCustomizationChoice> Customizations; ObjectGuid GuildGUID; std::vector<int32> ItemDisplayID; @@ -890,6 +906,7 @@ namespace WorldPackets ObjectGuid UnitGUID; int32 DisplayID = 0; + int32 SpellVisualKitID = 0; }; class SpellClick final : public ClientPacket diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index cd7501cd52a..ca8be7045e7 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -18,7 +18,32 @@ #include "SystemPackets.h" #include "Errors.h" -WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() +namespace WorldPackets +{ +namespace System +{ +ByteBuffer& operator<<(ByteBuffer& data, SavedThrottleObjectState const& throttleState) +{ + data << uint32(throttleState.MaxTries); + data << uint32(throttleState.PerMilliseconds); + data << uint32(throttleState.TryCount); + data << uint32(throttleState.LastResetTimeBeforeNow); + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, EuropaTicketConfig const& europaTicketSystemStatus) +{ + data.WriteBit(europaTicketSystemStatus.TicketsEnabled); + data.WriteBit(europaTicketSystemStatus.BugsEnabled); + data.WriteBit(europaTicketSystemStatus.ComplaintsEnabled); + data.WriteBit(europaTicketSystemStatus.SuggestionsEnabled); + + data << europaTicketSystemStatus.ThrottleState; + + return data; +} + +WorldPacket const* FeatureSystemStatus::Write() { _worldPacket << uint8(ComplaintStatus); @@ -37,6 +62,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket << uint32(TwitterPostThrottleCooldown); _worldPacket << uint32(TokenPollTimeSeconds); + _worldPacket << uint32(KioskSessionMinutes); _worldPacket << int64(TokenBalanceAmount); _worldPacket << uint32(BpayStoreProductDeliveryDelay); @@ -59,7 +85,6 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket.WriteBit(RestrictedAccount); _worldPacket.WriteBit(CommerceSystemEnabled); _worldPacket.WriteBit(TutorialsEnabled); - _worldPacket.WriteBit(NPETutorialsEnabled); _worldPacket.WriteBit(TwitterEnabled); _worldPacket.WriteBit(Unk67); _worldPacket.WriteBit(WillKickFromWorld); @@ -76,6 +101,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket.WriteBit(QuestSessionEnabled); _worldPacket.WriteBit(IsMuted); _worldPacket.WriteBit(ClubFinderEnabled); + _worldPacket.WriteBit(Unknown901CheckoutRelated); _worldPacket.FlushBits(); @@ -113,28 +139,18 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() } { - _worldPacket.WriteBit(VoiceChatManagerSettings.IsSquelched); - _worldPacket << VoiceChatManagerSettings.BnetAccountGuid; - _worldPacket << VoiceChatManagerSettings.GuildGuid; + _worldPacket.WriteBit(Squelch.IsSquelched); + _worldPacket << Squelch.BnetAccountGuid; + _worldPacket << Squelch.GuildGuid; } if (EuropaTicketSystemStatus) - { - _worldPacket.WriteBit(EuropaTicketSystemStatus->TicketsEnabled); - _worldPacket.WriteBit(EuropaTicketSystemStatus->BugsEnabled); - _worldPacket.WriteBit(EuropaTicketSystemStatus->ComplaintsEnabled); - _worldPacket.WriteBit(EuropaTicketSystemStatus->SuggestionsEnabled); - - _worldPacket << uint32(EuropaTicketSystemStatus->ThrottleState.MaxTries); - _worldPacket << uint32(EuropaTicketSystemStatus->ThrottleState.PerMilliseconds); - _worldPacket << uint32(EuropaTicketSystemStatus->ThrottleState.TryCount); - _worldPacket << uint32(EuropaTicketSystemStatus->ThrottleState.LastResetTimeBeforeNow); - } + _worldPacket << *EuropaTicketSystemStatus; return &_worldPacket; } -WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write() +WorldPacket const* FeatureSystemStatusGlueScreen::Write() { _worldPacket.WriteBit(BpayStoreEnabled); _worldPacket.WriteBit(BpayStoreAvailable); @@ -151,21 +167,32 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatusGlueScreen::Write() _worldPacket.WriteBit(LiveRegionCharacterListEnabled); _worldPacket.WriteBit(LiveRegionCharacterCopyEnabled); _worldPacket.WriteBit(LiveRegionAccountCopyEnabled); + _worldPacket.WriteBit(LiveRegionKeyBindingsCopyEnabled); + _worldPacket.WriteBit(Unknown901CheckoutRelated); + _worldPacket.WriteBit(EuropaTicketSystemStatus.is_initialized()); _worldPacket.FlushBits(); + if (EuropaTicketSystemStatus) + _worldPacket << *EuropaTicketSystemStatus; + _worldPacket << uint32(TokenPollTimeSeconds); + _worldPacket << uint32(KioskSessionMinutes); _worldPacket << int64(TokenBalanceAmount); _worldPacket << int32(MaxCharactersPerRealm); + _worldPacket << uint32(LiveRegionCharacterCopySourceRegions.size()); _worldPacket << uint32(BpayStoreProductDeliveryDelay); _worldPacket << int32(ActiveCharacterUpgradeBoostType); _worldPacket << int32(ActiveClassTrialBoostType); _worldPacket << int32(MinimumExpansionLevel); _worldPacket << int32(MaximumExpansionLevel); + if (!LiveRegionCharacterCopySourceRegions.empty()) + _worldPacket.append(LiveRegionCharacterCopySourceRegions.data(), LiveRegionCharacterCopySourceRegions.size()); + return &_worldPacket; } -WorldPacket const* WorldPackets::System::MOTD::Write() +WorldPacket const* MOTD::Write() { ASSERT(Text); _worldPacket.WriteBits(Text->size(), 4); @@ -181,7 +208,7 @@ WorldPacket const* WorldPackets::System::MOTD::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::System::SetTimeZoneInformation::Write() +WorldPacket const* SetTimeZoneInformation::Write() { _worldPacket.WriteBits(ServerTimeTZ.length(), 7); _worldPacket.WriteBits(GameTimeTZ.length(), 7); @@ -192,3 +219,5 @@ WorldPacket const* WorldPackets::System::SetTimeZoneInformation::Write() return &_worldPacket; } +} +} diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 4f87ab34edc..34d9aabfda0 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -26,27 +26,27 @@ namespace WorldPackets { namespace System { - class FeatureSystemStatus final : public ServerPacket + struct SavedThrottleObjectState { - public: - struct SavedThrottleObjectState - { - uint32 MaxTries = 0; - uint32 PerMilliseconds = 0; - uint32 TryCount = 0; - uint32 LastResetTimeBeforeNow = 0; - }; + uint32 MaxTries = 0; + uint32 PerMilliseconds = 0; + uint32 TryCount = 0; + uint32 LastResetTimeBeforeNow = 0; + }; - struct EuropaTicketConfig - { - bool TicketsEnabled = false; - bool BugsEnabled = false; - bool ComplaintsEnabled = false; - bool SuggestionsEnabled = false; + struct EuropaTicketConfig + { + bool TicketsEnabled = false; + bool BugsEnabled = false; + bool ComplaintsEnabled = false; + bool SuggestionsEnabled = false; - SavedThrottleObjectState ThrottleState; - }; + SavedThrottleObjectState ThrottleState; + }; + class FeatureSystemStatus final : public ServerPacket + { + public: struct SessionAlertConfig { int32 Delay = 0; @@ -81,7 +81,7 @@ namespace WorldPackets float ThrottleDfBestPriority = 0.0f; }; - struct VoiceChatProxySettings + struct SquelchInfo { bool IsSquelched = false; ObjectGuid BnetAccountGuid; @@ -121,6 +121,7 @@ namespace WorldPackets uint32 BpayStoreProductDeliveryDelay = 0; uint32 ClubsPresenceUpdateTimer = 0; uint32 HiddenUIClubsPresenceUpdateTimer = 0; ///< Timer for updating club presence when communities ui frame is hidden + uint32 KioskSessionMinutes = 0; bool ItemRestorationButtonEnabled = false; bool CharUndeleteEnabled = false; ///< Implemented bool BpayStoreDisabledByParentalControls = false; @@ -144,9 +145,10 @@ namespace WorldPackets bool QuestSessionEnabled = false; bool IsMuted = false; bool ClubFinderEnabled = false; + bool Unknown901CheckoutRelated = false; SocialQueueConfig QuickJoinConfig; - VoiceChatProxySettings VoiceChatManagerSettings; + SquelchInfo Squelch; RafSystemFeatureInfo RAFSystem; }; @@ -172,6 +174,10 @@ namespace WorldPackets bool LiveRegionCharacterListEnabled = false; // NYI bool LiveRegionCharacterCopyEnabled = false; // NYI bool LiveRegionAccountCopyEnabled = false; // NYI + bool LiveRegionKeyBindingsCopyEnabled = false; + bool Unknown901CheckoutRelated = false; // NYI + Optional<EuropaTicketConfig> EuropaTicketSystemStatus; + std::vector<int32> LiveRegionCharacterCopySourceRegions; uint32 TokenPollTimeSeconds = 0; // NYI int64 TokenBalanceAmount = 0; // NYI int32 MaxCharactersPerRealm = 0; @@ -180,6 +186,7 @@ namespace WorldPackets int32 ActiveClassTrialBoostType = 0; // NYI int32 MinimumExpansionLevel = 0; int32 MaximumExpansionLevel = 0; + uint32 KioskSessionMinutes = 0; }; class MOTD final : public ServerPacket diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index 0b38d9e2df7..30c2f8a06a9 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -64,16 +64,16 @@ void WorldPackets::Ticket::GMTicketAcknowledgeSurvey::Read() _worldPacket >> CaseID; } -void WorldPackets::Ticket::SupportTicketSubmitBug::Read() +void WorldPackets::Ticket::SubmitUserFeedback::Read() { _worldPacket >> Header; - Note = _worldPacket.ReadString(_worldPacket.ReadBits(10)); -} - -void WorldPackets::Ticket::SupportTicketSubmitSuggestion::Read() -{ - _worldPacket >> Header; - Note = _worldPacket.ReadString(_worldPacket.ReadBits(10)); + uint32 noteLength = _worldPacket.ReadBits(24); + IsSuggestion = _worldPacket.ReadBit(); + if (noteLength) + { + Note = _worldPacket.ReadString(noteLength - 1); + _worldPacket.read_skip<char>(); // null terminator + } } WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketChatLine::SupportTicketChatLine(uint32 timestamp, std::string const& text) : diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h index 344deabd972..4e7026c6c6e 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -92,26 +92,16 @@ namespace WorldPackets int32 CaseID; }; - class SupportTicketSubmitBug final : public ClientPacket + class SubmitUserFeedback final : public ClientPacket { public: - SupportTicketSubmitBug(WorldPacket&& packet) : ClientPacket(CMSG_SUPPORT_TICKET_SUBMIT_BUG, std::move(packet)) { } - - void Read() override; - - SupportTicketHeader Header; - std::string Note; - }; - - class SupportTicketSubmitSuggestion final : public ClientPacket - { - public: - SupportTicketSubmitSuggestion(WorldPacket&& packet) : ClientPacket(CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION, std::move(packet)) { } + SubmitUserFeedback(WorldPacket&& packet) : ClientPacket(CMSG_SUBMIT_USER_FEEDBACK, std::move(packet)) { } void Read() override; SupportTicketHeader Header; std::string Note; + bool IsSuggestion = false; }; class SupportTicketSubmitComplaint final : public ClientPacket diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.cpp b/src/server/game/Server/Packets/TransmogrificationPackets.cpp index a36dac184a6..3ea86ae6106 100644 --- a/src/server/game/Server/Packets/TransmogrificationPackets.cpp +++ b/src/server/game/Server/Packets/TransmogrificationPackets.cpp @@ -22,6 +22,7 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Transmogrification::Trans data >> transmogItem.ItemModifiedAppearanceID; data >> transmogItem.Slot; data >> transmogItem.SpellItemEnchantmentID; + data >> transmogItem.SecondaryItemModifiedAppearanceID; return data; } diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.h b/src/server/game/Server/Packets/TransmogrificationPackets.h index 09926a52e4f..2f1e22063fa 100644 --- a/src/server/game/Server/Packets/TransmogrificationPackets.h +++ b/src/server/game/Server/Packets/TransmogrificationPackets.h @@ -31,6 +31,7 @@ namespace WorldPackets int32 ItemModifiedAppearanceID = 0; uint32 Slot = 0; int32 SpellItemEnchantmentID = 0; + int32 SecondaryItemModifiedAppearanceID = 0; }; class TransmogrifyItems final : public ClientPacket diff --git a/src/server/game/Server/Packets/WardenPackets.h b/src/server/game/Server/Packets/WardenPackets.h index a8a13bea65e..d3160e33ab4 100644 --- a/src/server/game/Server/Packets/WardenPackets.h +++ b/src/server/game/Server/Packets/WardenPackets.h @@ -27,7 +27,7 @@ namespace WorldPackets class WardenData final : public ClientPacket { public: - WardenData(WorldPacket&& packet) : ClientPacket(CMSG_WARDEN_DATA, std::move(packet)) { } + WardenData(WorldPacket&& packet) : ClientPacket(CMSG_WARDEN3_DATA, std::move(packet)) { } void Read() override; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index b8a2bfdc9cc..397a627051d 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -130,9 +130,11 @@ void OpcodeTable::Initialize() #define DEFINE_HANDLER(opcode, status, processing, handler) \ ValidateAndSetClientOpcode<decltype(handler), handler>(opcode, #opcode, status, processing) + DEFINE_HANDLER(CMSG_ABANDON_NPE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAcceptInvite); DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptTradeOpcode); DEFINE_HANDLER(CMSG_ACCEPT_WARGAME_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ACTIVATE_SOULBIND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ACTIVATE_TAXI, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode); DEFINE_HANDLER(CMSG_ADDON_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -141,13 +143,14 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAddToy); DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_OPEN_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_START_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_ADVENTURE_MAP_POI_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAlterAppearance); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueryOpcode); DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaSpiritHealerQueueOpcode); DEFINE_HANDLER(CMSG_AREA_TRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAreaTriggerOpcode); DEFINE_HANDLER(CMSG_ARTIFACT_ADD_POWER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArtifactAddPower); DEFINE_HANDLER(CMSG_ARTIFACT_SET_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleArtifactSetAppearance); + DEFINE_HANDLER(CMSG_ASSIGN_EQUIPMENT_SET_SPEC, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ATTACK_STOP, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackStopOpcode); DEFINE_HANDLER(CMSG_ATTACK_SWING, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleAttackSwingOpcode); DEFINE_HANDLER(CMSG_AUCTIONABLE_TOKEN_SELL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -199,12 +202,9 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PAY_GET_PRODUCT_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_GET_PURCHASE_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_OPEN_CHECKOUT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PAY_REQUEST_CHARACTER_BOOST_UNREVOKE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_REQUEST_PRICE_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_START_PURCHASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_START_VAS_PURCHASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_CLEAR_FANFARE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetDeletePet); DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -217,9 +217,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBeginTradeOpcode); - //DEFINE_HANDLER(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfEntryInviteResponse); - //DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_EXIT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfQueueExitRequest); - //DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfQueueInviteResponse); DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBinderActivateOpcode); DEFINE_HANDLER(CMSG_BLACK_MARKET_BID_ON_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBlackMarketBidOnItem); DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBlackMarketOpen); @@ -233,19 +230,19 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BUY_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CAGE_BATTLE_PET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCageBattlePet); DEFINE_HANDLER(CMSG_CALENDAR_ADD_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent); - DEFINE_HANDLER(CMSG_CALENDAR_COMMUNITY_FILTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarCommunityFilter); + DEFINE_HANDLER(CMSG_CALENDAR_COMMUNITY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarCommunityInvite); DEFINE_HANDLER(CMSG_CALENDAR_COMPLAIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarComplain); DEFINE_HANDLER(CMSG_CALENDAR_COPY_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarCopyEvent); - DEFINE_HANDLER(CMSG_CALENDAR_EVENT_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventInvite); - DEFINE_HANDLER(CMSG_CALENDAR_EVENT_MODERATOR_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventModeratorStatus); - DEFINE_HANDLER(CMSG_CALENDAR_EVENT_RSVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventRsvp); DEFINE_HANDLER(CMSG_CALENDAR_EVENT_SIGN_UP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventSignup); - DEFINE_HANDLER(CMSG_CALENDAR_EVENT_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventStatus); DEFINE_HANDLER(CMSG_CALENDAR_GET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetCalendar); DEFINE_HANDLER(CMSG_CALENDAR_GET_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetEvent); DEFINE_HANDLER(CMSG_CALENDAR_GET_NUM_PENDING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetNumPending); + DEFINE_HANDLER(CMSG_CALENDAR_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarInvite); + DEFINE_HANDLER(CMSG_CALENDAR_MODERATOR_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarModeratorStatus); DEFINE_HANDLER(CMSG_CALENDAR_REMOVE_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarRemoveEvent); DEFINE_HANDLER(CMSG_CALENDAR_REMOVE_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventRemoveInvite); + DEFINE_HANDLER(CMSG_CALENDAR_RSVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarRsvp); + DEFINE_HANDLER(CMSG_CALENDAR_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarStatus); DEFINE_HANDLER(CMSG_CALENDAR_UPDATE_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarUpdateEvent); DEFINE_HANDLER(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode); DEFINE_HANDLER(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAutoRepeatSpellOpcode); @@ -262,13 +259,15 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleCastSpellOpcode); DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_LEADERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_BANK_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_REALM_TICKET, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlenetChangeRealmTicket); DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSubGroupOpcode); + DEFINE_HANDLER(CMSG_CHARACTER_CHECK_UPGRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHARACTER_RENAME_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharRenameOpcode); + DEFINE_HANDLER(CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_CHARACTER_UPGRADE_START, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCustomizeOpcode); DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharDeleteOpcode); DEFINE_HANDLER(CMSG_CHAR_RACE_OR_FACTION_CHANGE, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharRaceOrFactionChangeOpcode); @@ -308,7 +307,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHAT_REPORT_FILTERED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHAT_REPORT_IGNORED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleChatIgnoredOpcode); DEFINE_HANDLER(CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAllAddonPrefixesOpcode); + DEFINE_HANDLER(CMSG_CHECK_CHARACTER_NAME_AVAILABILITY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCheckCharacterNameAvailability); + DEFINE_HANDLER(CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHOICE_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandlePlayerChoiceResponse); + DEFINE_HANDLER(CMSG_CHROMIE_TIME_SELECT_EXPANSION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_CLAIM_WEEKLY_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CLEAR_NEW_APPEARANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearRaidMarker); DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleClearTradeItemOpcode); @@ -324,7 +327,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CLUB_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_CLUB_PRESENCE_SUBSCRIBE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_COLLECTION_ITEM_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCollectionItemSetFavorite); DEFINE_HANDLER(CMSG_COMMENTATOR_ENABLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_COMMENTATOR_ENTER_INSTANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -359,10 +362,12 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DELETE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDeleteEquipmentSet); DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelFriendOpcode); DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode); + DEFINE_HANDLER(CMSG_DEPOSIT_ANIMA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DEPOSIT_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDestroyItemOpcode); DEFINE_HANDLER(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode); - DEFINE_HANDLER(CMSG_DF_GET_JOIN_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleDFGetJoinStatus); + DEFINE_HANDLER(CMSG_DF_CONFIRM_EXPAND_SEARCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_DF_GET_JOIN_STATUS, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleDFGetJoinStatus); DEFINE_HANDLER(CMSG_DF_GET_SYSTEM_INFO, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleDFGetSystemInfo); DEFINE_HANDLER(CMSG_DF_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode); DEFINE_HANDLER(CMSG_DF_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode); @@ -370,8 +375,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DF_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DF_SET_ROLES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetRolesOpcode); DEFINE_HANDLER(CMSG_DF_TELEPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgTeleportOpcode); + DEFINE_HANDLER(CMSG_DISABLE_AE_LOOTING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DISCARDED_TIME_SYNC_ACKS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DISMISS_CRITTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter); + DEFINE_HANDLER(CMSG_DO_COUNTDOWN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DO_MASTER_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DO_READY_CHECK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDoReadyCheckOpcode); DEFINE_HANDLER(CMSG_DUEL_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleDuelResponseOpcode); @@ -388,13 +395,16 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GAME_EVENT_DEBUG_ENABLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GAME_OBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGameobjectReportUse); DEFINE_HANDLER(CMSG_GAME_OBJ_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGameObjectUseOpcode); + DEFINE_HANDLER(CMSG_GARRISON_ADD_FOLLOWER_HEALTH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_CANCEL_CONSTRUCTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGarrisonCancelConstruction); DEFINE_HANDLER(CMSG_GARRISON_CHECK_UPGRADEABLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_COMPLETE_MISSION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_GENERATE_RECRUITS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GARRISON_GET_BUILDING_LANDMARKS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGarrisonGetBuildingLandmarks); + DEFINE_HANDLER(CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_GARRISON_GET_MAP_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGarrisonGetMapData); DEFINE_HANDLER(CMSG_GARRISON_GET_MISSION_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_GARRISON_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_MISSION_BONUS_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_PURCHASE_BUILDING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGarrisonPurchaseBuilding); DEFINE_HANDLER(CMSG_GARRISON_RECRUIT_FOLLOWER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); @@ -402,21 +412,21 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_RENAME_FOLLOWER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGarrisonRequestBlueprintAndSpecializationData); - DEFINE_HANDLER(CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REQUEST_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_RESEARCH_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_GARRISON_RESET_TALENT_TREE_SOCKETS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_BUILDING_ACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_FOLLOWER_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_FOLLOWER_INACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_GARRISON_SOCKET_TALENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_START_MISSION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SWAP_BUILDINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GENERATE_RANDOM_CHARACTER_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomizeCharNameOpcode); DEFINE_HANDLER(CMSG_GET_ACCOUNT_CHARACTER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GET_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GET_GARRISON_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGetGarrisonInfo); DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGetItemPurchaseData); + DEFINE_HANDLER(CMSG_GET_LANDING_PAGE_SHIPMENTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest); DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGetPVPOptionsEnabled); DEFINE_HANDLER(CMSG_GET_RAF_ACCOUNT_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); @@ -473,6 +483,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildUpdateInfoText); DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildUpdateMotdText); DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthAndResurrect); + DEFINE_HANDLER(CMSG_HIDE_QUEST_CHOICE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_HOTFIX_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleHotfixRequest); DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleIgnoreTradeOpcode); DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateRolePoll); @@ -512,6 +523,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_LIVE_REGION_ACCOUNT_RESTORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LIVE_REGION_CHARACTER_COPY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_LIVE_REGION_KEY_BINDINGS_COPY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOADING_SCREEN_NOTIFY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleLoadScreenOpcode); DEFINE_HANDLER(CMSG_LOAD_SELECTED_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLogoutCancelOpcode); @@ -533,6 +545,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMailReturnToSender); DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeItem); DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeMoney); + DEFINE_HANDLER(CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MASTER_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode); DEFINE_HANDLER(CMSG_MINIMAP_PING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode); DEFINE_HANDLER(CMSG_MISSILE_TRAJECTORY_COLLISION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMissileTrajectoryCollision); @@ -542,6 +555,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveApplyMovementForceAck); DEFINE_HANDLER(CMSG_MOVE_CHANGE_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_CHANGE_VEHICLE_SEATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveChangeVehicleSeats); + DEFINE_HANDLER(CMSG_MOVE_COLLISION_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); + DEFINE_HANDLER(CMSG_MOVE_COLLISION_ENABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_DISMISS_VEHICLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveDismissVehicle); DEFINE_HANDLER(CMSG_MOVE_DOUBLE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); @@ -578,6 +593,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetModMovementForceMagnitudeAck); DEFINE_HANDLER(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_SET_RUN_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); + DEFINE_HANDLER(CMSG_MOVE_SET_TURN_RATE_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_SET_VEHICLE_REC_ID_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetVehicleRecAck); DEFINE_HANDLER(CMSG_MOVE_SET_WALK_MODE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_SPLINE_DONE, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveSplineDoneOpcode); @@ -600,9 +616,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck); DEFINE_HANDLER(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode); - DEFINE_HANDLER(CMSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_UPDATE_FALL_SPEED, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); + DEFINE_HANDLER(CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_MYTHIC_PLUS_WEEKLY_REWARD_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera); DEFINE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleObjectUpdateFailedOpcode); @@ -645,13 +662,12 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PUSH_QUEST_TO_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty); DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePVPLogDataOpcode); DEFINE_HANDLER(CMSG_QUERY_BATTLE_PET_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_QUERY_COMMUNITY_NAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseLocation); DEFINE_HANDLER(CMSG_QUERY_CORPSE_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseTransport); DEFINE_HANDLER(CMSG_QUERY_COUNTDOWN_TIMER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_CREATURE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleCreatureQuery); DEFINE_HANDLER(CMSG_QUERY_GAME_OBJECT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleGameObjectQueryOpcode); - DEFINE_HANDLER(CMSG_QUERY_GARRISON_CREATURE_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_QUERY_GARRISON_PET_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_GUILD_INFO, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryInspectAchievements); DEFINE_HANDLER(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryNextMailTime); @@ -660,6 +676,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUERY_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryPetition); DEFINE_HANDLER(CMSG_QUERY_PET_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryPetName); DEFINE_HANDLER(CMSG_QUERY_PLAYER_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNameQueryOpcode); + DEFINE_HANDLER(CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryQuestCompletionNPCs); DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryRealmName); @@ -670,6 +688,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept); DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverAcceptQuestOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverChooseRewardOpcode); + DEFINE_HANDLER(CMSG_QUEST_GIVER_CLOSE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUEST_GIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverCompleteQuest); DEFINE_HANDLER(CMSG_QUEST_GIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverHelloOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverQueryQuestOpcode); @@ -708,35 +727,39 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REPORT_PVP_PLAYER_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK); DEFINE_HANDLER(CMSG_REPORT_SERVER_LAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_REPORT_STUCK_IN_COMBAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData); DEFINE_HANDLER(CMSG_REQUEST_AREA_POI_UPDATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestBattlefieldStatusOpcode); DEFINE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCategoryCooldowns); DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCemeteryList); - DEFINE_HANDLER(CMSG_REQUEST_CHALLENGE_MODE_AFFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_REQUEST_COVENANT_CALLINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_CROWD_CONTROL_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_FORCED_REACTIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestForcedReactionsOpcode); DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestPartyState); DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestGuildRewardsList); + DEFINE_HANDLER(CMSG_REQUEST_LATEST_SPLASH_SCREEN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_REQUEST_MYTHIC_PLUS_AFFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyJoinUpdates); DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode); DEFINE_HANDLER(CMSG_REQUEST_PET_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfo); DEFINE_HANDLER(CMSG_REQUEST_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayedTime); - DEFINE_HANDLER(CMSG_REQUEST_PVP_BRAWL_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_PVP_REWARDS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPvpReward); - DEFINE_HANDLER(CMSG_REQUEST_QUEST_LINES_FOR_MAP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRaidInfoOpcode); - DEFINE_HANDLER(CMSG_REQUEST_RATED_BATTLEFIELD_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRatedBattlefieldInfo); + DEFINE_HANDLER(CMSG_REQUEST_RATED_PVP_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRatedPvpInfo); DEFINE_HANDLER(CMSG_REQUEST_REALM_GUILD_MASTER_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_RESEARCH_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_REQUEST_SCHEDULED_PVP_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_STABLED_PETS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestStabledPets); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleExit); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleNextSeat); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehiclePrevSeat); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleSwitchSeat); + DEFINE_HANDLER(CMSG_REQUEST_WEEKLY_REWARDS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_WORLD_QUEST_UPDATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestWorldQuestUpdate); DEFINE_HANDLER(CMSG_RESET_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_RESET_CHALLENGE_MODE_CHEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); @@ -752,6 +775,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SCENE_TRIGGER_EVENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSceneTriggerEvent); DEFINE_HANDLER(CMSG_SELF_RES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSelfResOpcode); DEFINE_HANDLER(CMSG_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSellItemOpcode); + DEFINE_HANDLER(CMSG_SEND_CHARACTER_CLUB_INVITATION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SEND_CONTACT_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleContactListOpcode); DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSendMail); DEFINE_HANDLER(CMSG_SEND_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTextEmoteOpcode); @@ -774,7 +798,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_SET_FACTION_NOT_AT_WAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetFactionNotAtWar); DEFINE_HANDLER(CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_LFG_BONUS_FACTION_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_LOOT_METHOD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetLootMethodOpcode); DEFINE_HANDLER(CMSG_SET_LOOT_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetLootSpecialization); DEFINE_HANDLER(CMSG_SET_PARTY_ASSIGNMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetPartyAssignment); @@ -811,10 +834,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_START_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_SPECTATOR_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_SUBMIT_USER_FEEDBACK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSubmitUserFeedback); + DEFINE_HANDLER(CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SUMMON_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSummonResponseOpcode); - DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_BUG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSupportTicketSubmitBug); DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSupportTicketSubmitComplaint); - DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSupportTicketSubmitSuggestion); DEFINE_HANDLER(CMSG_SURRENDER_ARENA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleSuspendTokenResponse); @@ -845,6 +868,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TWITTER_CONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TWITTER_DISCONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TWITTER_POST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_UI_MAP_QUEST_LINES_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode); @@ -858,6 +882,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_UPDATE_SPELL_VISUAL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPDATE_VAS_PURCHASE_STATES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_UPGRADE_RUNEFORGE_LEGENDARY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUseCritterItem); DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUseEquipmentSet); @@ -870,12 +895,16 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_VOICE_CHAT_JOIN_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_CHAT_LOGIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleVoidStorageTransfer); - DEFINE_HANDLER(CMSG_WARDEN_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenData); - DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleWhoOpcode); + DEFINE_HANDLER(CMSG_WARDEN3_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenData); + DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleWhoOpcode); DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoIsOpcode); DEFINE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode); DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItem); + //DEFINE_HANDLER(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfEntryInviteResponse); + //DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_EXIT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfQueueExitRequest); + //DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfQueueInviteResponse); + #undef DEFINE_HANDLER #define DEFINE_SERVER_OPCODE_HANDLER(opcode, status, con) \ @@ -893,6 +922,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_ESSENCE_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_SOULBIND_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_TAXI_REPLY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVE_GLYPHS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_LIST_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -901,6 +931,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADVENTURE_MAP_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGETS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGET_ACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -991,7 +1022,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_MOUNT_DELIVERED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_PURCHASE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_CHECKOUT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_GUILD_FOLLOW_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1089,10 +1120,15 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_PLAYER_AMBIGUOUS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_PLAYER_NOTFOUND, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_RECONNECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_REGIONAL_SERVICE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_RESTRICTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHEAT_IGNORE_DIMISHING_RETURNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_ABANDON_NPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT,STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_WARGAME_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHROMIE_TIME_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLAIM_RAF_REWARD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1102,8 +1138,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_RESURRECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TREASURE_PICKER_CACHE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLOSE_ARTIFACT_FORGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLOSE_HEART_FORGE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLOSE_ITEM_FORGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_ERROR_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1125,19 +1163,20 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONNECT_TO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSOLE_WRITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED,STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTROL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_LOCATION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_TRANSPORT_QUERY, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COVENANT_PREVIEW_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATE_SHIPMENT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1151,12 +1190,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_EXPIRED_MISSIONS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_ARENA_UNIT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DIFFERENT_INSTANCE_FROM_PARTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISCONNECT_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1188,6 +1227,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXTERNAL_TRANSACTION_ID_GENERATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_PLAYER_CONDITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_QUEST_TURN_IN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1199,8 +1239,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_FLIGHT_SPLINE_SYNC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCED_DEATH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIMATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_OBJECT_RELINK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAIN_MAW_POWER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_BASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_CUSTOM_ANIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1213,57 +1255,76 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_SPEED_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_ACTIVATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_LANDMARKS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT,STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_COLLECTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_EVENT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COLLECTION_REMOVE_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COLLECTION_UPDATE_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CREATE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_DELETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_DELETE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CATEGORIES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_DURABILITY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_XP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_IS_UPGRADEABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_AREA_BONUS_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MAP_DATA_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_LIST_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_REWARD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_UPDATE_CAN_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_START_CONDITION_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_ARCHITECT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_CRAFTER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_MISSION_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_RECRUITMENT_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_TALENT_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLACE_BUILDING_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_PLACED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_USED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RENAME_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RESEARCH_TALENT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RESET_TALENT_TREE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_START_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_TALENT_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_TALENT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPDATE_FOLLOWER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_USE_RECALL_PORTAL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GENERATE_SSO_TOKEN_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_REMAINING_GAME_TIME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1272,7 +1333,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENT_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_REQUEST_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1281,7 +1342,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_TEXT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_QUEST_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_ACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_AUTO_KICK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1301,7 +1362,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_AWAY_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_DISBANDED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1313,6 +1373,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_RANKS_UPDATED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_RANK_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_STATUS_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_ADDED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_MODIFIED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1321,7 +1382,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_DECLINED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ITEM_LOOTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ITEM_LOOTED_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_KNOWN_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_WITH_RECIPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1366,9 +1427,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_GROUP_SIZE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INTERRUPT_POWER_REGEN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_SAVE_CREATED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INTERRUPT_POWER_REGEN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PAGE_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALID_PROMOTION_CODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1396,6 +1457,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVEL_UP_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_EXPAND_SEARCH_PROMPT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_APPLICANT_LIST_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1429,7 +1491,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUITS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_CHARACTER_COPY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_EQUIPMENT_SET, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SET_TIME_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1548,10 +1611,13 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTI_FLOOR_LEAVE_FLOOR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTI_FLOOR_NEW_FLOOR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_ALL_MAP_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_CURRENT_AFFIXES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_NEW_SEASON_RECORD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_SEASON_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MYTHIC_PLUS_WEEKLY_REWARD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1563,9 +1629,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_OFFER_PETITION_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_MONSTER_MOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_ANIMA_DIVERSION_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_ARTIFACT_FORGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_CONTAINER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_HEART_FORGE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_ITEM_FORGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_LFG_DUNGEON_FINDER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_SHIPMENT_NPC_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1620,12 +1688,15 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PHASE_SHIFT_CHANGE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYED_TIME, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_AZERITE_ITEM_GAINS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_BONUS_ROLL_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_BOUND, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_CHOICE_CLEAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_CHOICE_DISPLAY_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_CONDITION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SAVE_GUILD_EMBLEM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TABARD_VENDOR_ACTIVATE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1656,16 +1727,16 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_MATCH_STATISTICS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_COMMUNITY_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_CREATURE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PET_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1681,16 +1752,14 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_LINES_FOR_MAP_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_LOG_FULL, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_UPDATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_PUSH_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_SESSION_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_SESSION_READY_CHECK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_SESSION_READY_CHECK_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_SESSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_SPAWN_TRACKING_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1720,6 +1789,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_ITEM_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_SPELL_FROM_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPLACE_TROPHY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_PLAYER_AFK_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1728,6 +1798,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_QUEST_POI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_RANGED_COMBAT_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_WEEKLY_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPEC_WIPE_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1744,6 +1815,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHOSEN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RUNE_REGEN_DEBUG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_COMPLETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_POIS, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1757,7 +1829,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCRIPT_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEASON_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1798,13 +1870,16 @@ void OpcodeTable::Initialize() 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SHIPMENT_READY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TASK_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHIPMENT_FACTION_UPDATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_QUEST_COMPLETION_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TAXI_NODES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TRADE_SKILL_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1836,6 +1911,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PREPARE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_VISUAL_LOAD_SCREEN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLASH_SCREEN_SHOW_LATEST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STAND_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1883,6 +1959,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_TWITTER_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UI_HEALING_RANGE_MODIFIED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UI_ITEM_INTERACTION_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UI_MAP_QUEST_LINES_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_CHARACTER_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1895,6 +1972,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CHARACTER_FLAGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_DAILY_MISSION_COUNTER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_EXPANSION_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_GAME_TIME_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1909,7 +1987,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_GET_SERVICE_STATUS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VAS_PURCHASE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1931,10 +2009,13 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARFRONT_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEATHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_REWARDS_PROGRESS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_REWARDS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_REWARD_CLAIM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO_IS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_MAP_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_QUEST_UPDATE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index a01713616c3..8e492926c39 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -44,45 +44,47 @@ enum OpcodeMisc : uint16 enum OpcodeClient : uint16 { + CMSG_ABANDON_NPE_RESPONSE = 0x33ED, CMSG_ACCEPT_GUILD_INVITE = 0x35FC, CMSG_ACCEPT_TRADE = 0x315A, CMSG_ACCEPT_WARGAME_INVITE = 0x35E0, - CMSG_ACTIVATE_TAXI = 0x34AB, + CMSG_ACTIVATE_SOULBIND = 0x33DE, + CMSG_ACTIVATE_TAXI = 0x34B1, CMSG_ADDON_LIST = 0x35D8, CMSG_ADD_BATTLENET_FRIEND = 0x365A, - CMSG_ADD_FRIEND = 0x36CE, - CMSG_ADD_IGNORE = 0x36D2, - CMSG_ADD_TOY = 0x329C, - CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3203, - CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x3346, - CMSG_ADVENTURE_MAP_POI_QUERY = 0x324A, - CMSG_ALTER_APPEARANCE = 0x34FD, - CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34B0, - CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34B1, - CMSG_AREA_TRIGGER = 0x31D7, - CMSG_ARTIFACT_ADD_POWER = 0x31A9, - CMSG_ARTIFACT_SET_APPEARANCE = 0x31AB, - CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x320B, - CMSG_ATTACK_STOP = 0x3259, - CMSG_ATTACK_SWING = 0x3258, - CMSG_AUCTIONABLE_TOKEN_SELL = 0x36E6, - CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x36E7, - CMSG_AUCTION_BROWSE_QUERY = 0x34D0, - CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0x34D8, - CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0x34D7, - CMSG_AUCTION_GET_COMMODITY_QUOTE = 0x34D6, - CMSG_AUCTION_HELLO_REQUEST = 0x34CB, - CMSG_AUCTION_LIST_BIDDED_ITEMS = 0x34D4, - CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = 0x34D5, - CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = 0x34D1, - CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = 0x34D2, - CMSG_AUCTION_LIST_OWNED_ITEMS = 0x34D3, - CMSG_AUCTION_PLACE_BID = 0x34CF, - CMSG_AUCTION_REMOVE_ITEM = 0x34CD, - CMSG_AUCTION_REPLICATE_ITEMS = 0x34CE, - CMSG_AUCTION_SELL_COMMODITY = 0x34D9, - CMSG_AUCTION_SELL_ITEM = 0x34CC, - CMSG_AUCTION_SET_FAVORITE_ITEM = 0x3732, + CMSG_ADD_FRIEND = 0x36D0, + CMSG_ADD_IGNORE = 0x36D4, + CMSG_ADD_TOY = 0x32A5, + CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3206, + CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x335A, + CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x33E1, + CMSG_ALTER_APPEARANCE = 0x3503, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34B6, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34B7, + CMSG_AREA_TRIGGER = 0x31D9, + CMSG_ARTIFACT_ADD_POWER = 0x31AB, + CMSG_ARTIFACT_SET_APPEARANCE = 0x31AD, + CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x320F, + CMSG_ATTACK_STOP = 0x325E, + CMSG_ATTACK_SWING = 0x325D, + CMSG_AUCTIONABLE_TOKEN_SELL = 0x36E8, + CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x36E9, + CMSG_AUCTION_BROWSE_QUERY = 0x34D6, + CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0x34DE, + CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0x34DD, + CMSG_AUCTION_GET_COMMODITY_QUOTE = 0x34DC, + CMSG_AUCTION_HELLO_REQUEST = 0x34D1, + CMSG_AUCTION_LIST_BIDDED_ITEMS = 0x34DA, + CMSG_AUCTION_LIST_BUCKETS_BY_BUCKET_KEYS = 0x34DB, + CMSG_AUCTION_LIST_ITEMS_BY_BUCKET_KEY = 0x34D7, + CMSG_AUCTION_LIST_ITEMS_BY_ITEM_ID = 0x34D8, + CMSG_AUCTION_LIST_OWNED_ITEMS = 0x34D9, + CMSG_AUCTION_PLACE_BID = 0x34D5, + CMSG_AUCTION_REMOVE_ITEM = 0x34D3, + CMSG_AUCTION_REPLICATE_ITEMS = 0x34D4, + CMSG_AUCTION_SELL_COMMODITY = 0x34DF, + CMSG_AUCTION_SELL_ITEM = 0x34D2, + CMSG_AUCTION_SET_FAVORITE_ITEM = 0x3735, CMSG_AUTH_CONTINUED_SESSION = 0x3766, CMSG_AUTH_SESSION = 0x3765, CMSG_AUTOBANK_ITEM = 0x3996, @@ -92,97 +94,96 @@ enum OpcodeClient : uint16 CMSG_AUTO_EQUIP_ITEM = 0x399A, CMSG_AUTO_EQUIP_ITEM_SLOT = 0x399F, CMSG_AUTO_STORE_BAG_ITEM = 0x399B, - CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x3366, - CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x3350, - CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x3368, - CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x3367, - CMSG_BANKER_ACTIVATE = 0x34B3, + CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x3383, + CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x3365, + CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x3385, + CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x3384, + CMSG_BANKER_ACTIVATE = 0x34B9, CMSG_BATTLEFIELD_LEAVE = 0x3173, CMSG_BATTLEFIELD_LIST = 0x317E, - CMSG_BATTLEFIELD_PORT = 0x352F, - CMSG_BATTLEMASTER_HELLO = 0x32B4, - CMSG_BATTLEMASTER_JOIN = 0x3528, - CMSG_BATTLEMASTER_JOIN_ARENA = 0x3529, - CMSG_BATTLEMASTER_JOIN_BRAWL = 0x352D, - CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x352A, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D1, - CMSG_BATTLENET_REQUEST = 0x36F5, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CB, - CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x3712, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CA, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C1, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36B9, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36BA, - CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x370C, - CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C4, - CMSG_BATTLE_PAY_REQUEST_CHARACTER_BOOST_UNREVOKE = 0x36C2, - CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x3708, - CMSG_BATTLE_PAY_START_PURCHASE = 0x36C9, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F2, - CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C3, + CMSG_BATTLEFIELD_PORT = 0x3536, + CMSG_BATTLEMASTER_HELLO = 0x32BF, + CMSG_BATTLEMASTER_JOIN = 0x352F, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x3530, + CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3534, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3531, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D3, + CMSG_BATTLENET_REQUEST = 0x36F7, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CD, + CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x3714, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CC, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C3, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36BB, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36BC, + CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x370E, + CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x370A, + CMSG_BATTLE_PAY_START_PURCHASE = 0x36CB, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F4, CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C, - CMSG_BATTLE_PET_DELETE_PET = 0x3623, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3624, - CMSG_BATTLE_PET_MODIFY_NAME = 0x3626, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3622, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3621, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362B, - CMSG_BATTLE_PET_SET_FLAGS = 0x362F, - CMSG_BATTLE_PET_SUMMON = 0x3627, - CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x31E1, - CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31E0, + CMSG_BATTLE_PET_DELETE_PET = 0x3624, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3625, + CMSG_BATTLE_PET_MODIFY_NAME = 0x3627, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3623, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3622, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362C, + CMSG_BATTLE_PET_SET_FLAGS = 0x3630, + CMSG_BATTLE_PET_SUMMON = 0x3628, + CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x31E3, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31E2, CMSG_BEGIN_TRADE = 0x3157, - CMSG_BINDER_ACTIVATE = 0x34B2, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3537, - CMSG_BLACK_MARKET_OPEN = 0x3535, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3536, - CMSG_BONUS_ROLL = 0x3369, + CMSG_BINDER_ACTIVATE = 0x34B8, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x353E, + CMSG_BLACK_MARKET_OPEN = 0x353C, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x353D, + CMSG_BONUS_ROLL = 0x3386, CMSG_BUG_REPORT = 0x3686, CMSG_BUSY_TRADE = 0x3158, - CMSG_BUY_BACK_ITEM = 0x34A4, - CMSG_BUY_BANK_SLOT = 0x34B4, - CMSG_BUY_ITEM = 0x34A3, - CMSG_BUY_REAGENT_BANK = 0x34B5, - CMSG_CAGE_BATTLE_PET = 0x31F2, + CMSG_BUY_BACK_ITEM = 0x34AA, + CMSG_BUY_BANK_SLOT = 0x34BA, + CMSG_BUY_ITEM = 0x34A9, + CMSG_BUY_REAGENT_BANK = 0x34BB, + CMSG_CAGE_BATTLE_PET = 0x31F5, CMSG_CALENDAR_ADD_EVENT = 0x367D, - CMSG_CALENDAR_COMMUNITY_FILTER = 0x3671, + CMSG_CALENDAR_COMMUNITY_INVITE = 0x3671, CMSG_CALENDAR_COMPLAIN = 0x3679, CMSG_CALENDAR_COPY_EVENT = 0x3678, - CMSG_CALENDAR_EVENT_INVITE = 0x3672, - CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x3676, - CMSG_CALENDAR_EVENT_RSVP = 0x3674, CMSG_CALENDAR_EVENT_SIGN_UP = 0x367B, - CMSG_CALENDAR_EVENT_STATUS = 0x3675, CMSG_CALENDAR_GET = 0x366F, CMSG_CALENDAR_GET_EVENT = 0x3670, CMSG_CALENDAR_GET_NUM_PENDING = 0x367A, + CMSG_CALENDAR_INVITE = 0x3672, + CMSG_CALENDAR_MODERATOR_STATUS = 0x3676, CMSG_CALENDAR_REMOVE_EVENT = 0x3677, CMSG_CALENDAR_REMOVE_INVITE = 0x3673, + CMSG_CALENDAR_RSVP = 0x3674, + CMSG_CALENDAR_STATUS = 0x3675, CMSG_CALENDAR_UPDATE_EVENT = 0x367E, - CMSG_CANCEL_AURA = 0x31AD, - CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34EF, - CMSG_CANCEL_CAST = 0x32A2, - CMSG_CANCEL_CHANNELLING = 0x326E, - CMSG_CANCEL_GROWTH_AURA = 0x3273, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3213, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31AC, - CMSG_CANCEL_MOUNT_AURA = 0x3284, + CMSG_CANCEL_AURA = 0x31AF, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34F5, + CMSG_CANCEL_CAST = 0x32AB, + CMSG_CANCEL_CHANNELLING = 0x3276, + CMSG_CANCEL_GROWTH_AURA = 0x327B, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3217, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31AE, + CMSG_CANCEL_MOUNT_AURA = 0x328D, CMSG_CANCEL_QUEUED_SPELL = 0x317F, - CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34FA, + CMSG_CANCEL_TEMP_ENCHANTMENT = 0x3500, CMSG_CANCEL_TRADE = 0x315C, CMSG_CAN_DUEL = 0x3662, - CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x3707, - CMSG_CAST_SPELL = 0x329F, + CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x3709, + CMSG_CAST_SPELL = 0x32A8, CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x3090, - CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308F, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x3328, - CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x3329, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x330A, - CMSG_CHANGE_REALM_TICKET = 0x36FA, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x333E, + CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x333F, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3320, + CMSG_CHANGE_REALM_TICKET = 0x36FC, CMSG_CHANGE_SUB_GROUP = 0x364C, - CMSG_CHARACTER_RENAME_REQUEST = 0x36BF, + CMSG_CHARACTER_CHECK_UPGRADE = 0x36C6, + CMSG_CHARACTER_RENAME_REQUEST = 0x36C1, + CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST = 0x36C4, + CMSG_CHARACTER_UPGRADE_START = 0x36C5, CMSG_CHAR_CUSTOMIZE = 0x3690, - CMSG_CHAR_DELETE = 0x369D, + CMSG_CHAR_DELETE = 0x369E, CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3696, CMSG_CHAT_ADDON_MESSAGE = 0x37EE, CMSG_CHAT_ADDON_MESSAGE_TARGETED = 0x37EF, @@ -220,24 +221,28 @@ enum OpcodeClient : uint16 CMSG_CHAT_REPORT_FILTERED = 0x37CC, CMSG_CHAT_REPORT_IGNORED = 0x37CB, CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x37CE, - CMSG_CHOICE_RESPONSE = 0x32A4, + CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x3645, + CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x324F, + CMSG_CHOICE_RESPONSE = 0x32AF, + CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x33DD, + CMSG_CLAIM_WEEKLY_REWARD = 0x33B8, CMSG_CLEAR_NEW_APPEARANCE = 0x312F, - CMSG_CLEAR_RAID_MARKER = 0x31A5, + CMSG_CLEAR_RAID_MARKER = 0x31A7, CMSG_CLEAR_TRADE_ITEM = 0x315E, - CMSG_CLIENT_PORT_GRAVEYARD = 0x3531, - CMSG_CLOSE_INTERACTION = 0x3493, - CMSG_CLOSE_QUEST_CHOICE = 0x32A5, - CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x371C, - CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x371A, - CMSG_CLUB_FINDER_POST = 0x3717, - CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x371E, - CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x3718, - CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x3719, - CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x371D, - CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x371F, - CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x371B, - CMSG_CLUB_INVITE = 0x36F9, - CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x3632, + CMSG_CLIENT_PORT_GRAVEYARD = 0x3538, + CMSG_CLOSE_INTERACTION = 0x3499, + CMSG_CLOSE_QUEST_CHOICE = 0x32B0, + CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x371F, + CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x371D, + CMSG_CLUB_FINDER_POST = 0x371A, + CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x3721, + CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x371B, + CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x371C, + CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x3720, + CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x3722, + CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x371E, + CMSG_CLUB_PRESENCE_SUBSCRIBE = 0x36F9, + CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x3633, CMSG_COMMENTATOR_ENABLE = 0x35F0, CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F4, CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F5, @@ -245,116 +250,123 @@ enum OpcodeClient : uint16 CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x35F3, CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F2, CMSG_COMMENTATOR_START_WARGAME = 0x35EF, - CMSG_COMMERCE_TOKEN_GET_COUNT = 0x36E4, - CMSG_COMMERCE_TOKEN_GET_LOG = 0x36EE, - CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x36E5, + CMSG_COMMERCE_TOKEN_GET_COUNT = 0x36E6, + CMSG_COMMERCE_TOKEN_GET_LOG = 0x36F0, + CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x36E7, CMSG_COMPLAINT = 0x366C, - CMSG_COMPLETE_CINEMATIC = 0x354F, - CMSG_COMPLETE_MOVIE = 0x34E5, - CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31AA, - CMSG_CONFIRM_RESPEC_WIPE = 0x320D, + CMSG_COMPLETE_CINEMATIC = 0x3556, + CMSG_COMPLETE_MOVIE = 0x34EB, + CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31AC, + CMSG_CONFIRM_RESPEC_WIPE = 0x3211, CMSG_CONNECT_TO_FAILED = 0x35D4, - CMSG_CONSUMABLE_TOKEN_BUY = 0x36E9, - CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x36EA, - CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x36E8, - CMSG_CONSUMABLE_TOKEN_REDEEM = 0x36EC, - CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x36ED, - CMSG_CONTRIBUTION_CONTRIBUTE = 0x355F, - CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x3560, - CMSG_CONVERSATION_LINE_STARTED = 0x3550, + CMSG_CONSUMABLE_TOKEN_BUY = 0x36EB, + CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x36EC, + CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x36EA, + CMSG_CONSUMABLE_TOKEN_REDEEM = 0x36EE, + CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x36EF, + CMSG_CONTRIBUTION_CONTRIBUTE = 0x3568, + CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x3569, + CMSG_CONVERSATION_LINE_STARTED = 0x3557, CMSG_CONVERT_RAID = 0x364E, - CMSG_CREATE_CHARACTER = 0x3643, - CMSG_CREATE_SHIPMENT = 0x32F6, + CMSG_CREATE_CHARACTER = 0x3644, + CMSG_CREATE_SHIPMENT = 0x330C, CMSG_DB_QUERY_BULK = 0x35E4, - CMSG_DECLINE_GUILD_INVITES = 0x3526, - CMSG_DECLINE_PETITION = 0x353E, - CMSG_DELETE_EQUIPMENT_SET = 0x3513, - CMSG_DEL_FRIEND = 0x36CF, - CMSG_DEL_IGNORE = 0x36D3, - CMSG_DEPOSIT_REAGENT_BANK = 0x3331, - CMSG_DESTROY_ITEM = 0x3296, - CMSG_DF_BOOT_PLAYER_VOTE = 0x3614, - CMSG_DF_GET_JOIN_STATUS = 0x3612, - CMSG_DF_GET_SYSTEM_INFO = 0x3611, - CMSG_DF_JOIN = 0x3607, - CMSG_DF_LEAVE = 0x3610, + CMSG_DECLINE_GUILD_INVITES = 0x352D, + CMSG_DECLINE_PETITION = 0x3545, + CMSG_DELETE_EQUIPMENT_SET = 0x3519, + CMSG_DEL_FRIEND = 0x36D1, + CMSG_DEL_IGNORE = 0x36D5, + CMSG_DEPOSIT_ANIMA = 0x33E0, + CMSG_DEPOSIT_REAGENT_BANK = 0x3347, + CMSG_DESTROY_ITEM = 0x329F, + CMSG_DF_BOOT_PLAYER_VOTE = 0x3615, + CMSG_DF_CONFIRM_EXPAND_SEARCH = 0x3607, + CMSG_DF_GET_JOIN_STATUS = 0x3613, + CMSG_DF_GET_SYSTEM_INFO = 0x3612, + CMSG_DF_JOIN = 0x3608, + CMSG_DF_LEAVE = 0x3611, CMSG_DF_PROPOSAL_RESPONSE = 0x3606, - CMSG_DF_READY_CHECK_RESPONSE = 0x3617, - CMSG_DF_SET_ROLES = 0x3613, - CMSG_DF_TELEPORT = 0x3615, - CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A3D, - CMSG_DISMISS_CRITTER = 0x3501, - CMSG_DO_MASTER_LOOT_ROLL = 0x3212, - CMSG_DO_READY_CHECK = 0x3633, - CMSG_DUEL_RESPONSE = 0x34EA, - CMSG_EJECT_PASSENGER = 0x323F, - CMSG_EMOTE = 0x354B, + CMSG_DF_READY_CHECK_RESPONSE = 0x3618, + CMSG_DF_SET_ROLES = 0x3614, + CMSG_DF_TELEPORT = 0x3616, + CMSG_DISABLE_AE_LOOTING = 0x321D, + CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A3E, + CMSG_DISMISS_CRITTER = 0x3507, + CMSG_DO_COUNTDOWN = 0x3719, + CMSG_DO_MASTER_LOOT_ROLL = 0x3216, + CMSG_DO_READY_CHECK = 0x3634, + CMSG_DUEL_RESPONSE = 0x34F0, + CMSG_EJECT_PASSENGER = 0x3244, + CMSG_EMOTE = 0x3552, CMSG_ENABLE_NAGLE = 0x376B, - CMSG_ENABLE_TAXI_NODE = 0x34A9, - CMSG_ENGINE_SURVEY = 0x36E2, + CMSG_ENABLE_TAXI_NODE = 0x34AF, + CMSG_ENGINE_SURVEY = 0x36E4, CMSG_ENTER_ENCRYPTED_MODE_ACK = 0x3767, CMSG_ENUM_CHARACTERS = 0x35E8, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36DC, - CMSG_FAR_SIGHT = 0x34F0, - CMSG_GAME_EVENT_DEBUG_DISABLE = 0x31B1, - CMSG_GAME_EVENT_DEBUG_ENABLE = 0x31B0, - CMSG_GAME_OBJ_REPORT_USE = 0x34F7, - CMSG_GAME_OBJ_USE = 0x34F6, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32E1, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32CF, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x3324, - CMSG_GARRISON_COMPLETE_MISSION = 0x3317, - CMSG_GARRISON_GENERATE_RECRUITS = 0x32E4, - CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32F2, - CMSG_GARRISON_GET_MISSION_REWARD = 0x334A, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3319, - CMSG_GARRISON_PURCHASE_BUILDING = 0x32CB, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32E6, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x330E, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32E2, - CMSG_GARRISON_RENAME_FOLLOWER = 0x32E3, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32CA, - CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32EB, - CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32F5, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32F4, - CMSG_GARRISON_RESEARCH_TALENT = 0x32E7, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32CC, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32DF, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32D8, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32E5, - CMSG_GARRISON_START_MISSION = 0x3316, - CMSG_GARRISON_SWAP_BUILDINGS = 0x32D0, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36DE, + CMSG_FAR_SIGHT = 0x34F6, + CMSG_GAME_EVENT_DEBUG_DISABLE = 0x31B3, + CMSG_GAME_EVENT_DEBUG_ENABLE = 0x31B2, + CMSG_GAME_OBJ_REPORT_USE = 0x34FD, + CMSG_GAME_OBJ_USE = 0x34FC, + CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x3307, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32ED, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32DA, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x333A, + CMSG_GARRISON_COMPLETE_MISSION = 0x332D, + CMSG_GARRISON_GENERATE_RECRUITS = 0x32F0, + CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x32FF, + CMSG_GARRISON_GET_MAP_DATA = 0x3306, + CMSG_GARRISON_GET_MISSION_REWARD = 0x335E, + CMSG_GARRISON_LEARN_TALENT = 0x32FB, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x332F, + CMSG_GARRISON_PURCHASE_BUILDING = 0x32D6, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32F2, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x3324, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32EE, + CMSG_GARRISON_RENAME_FOLLOWER = 0x32EF, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32D5, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x330A, + CMSG_GARRISON_RESEARCH_TALENT = 0x32F3, + CMSG_GARRISON_RESET_TALENT_TREE_SOCKETS = 0x32FD, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32D7, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32EB, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32E3, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32F1, + CMSG_GARRISON_SOCKET_TALENT = 0x32F9, + CMSG_GARRISON_START_MISSION = 0x332C, + CMSG_GARRISON_SWAP_BUILDINGS = 0x32DB, CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E7, - CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x36B5, - CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3683, - CMSG_GET_GARRISON_INFO = 0x32C5, - CMSG_GET_ITEM_PURCHASE_DATA = 0x3539, - CMSG_GET_MIRROR_IMAGE_DATA = 0x329A, + CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x36B6, + CMSG_GET_GARRISON_INFO = 0x32D0, + CMSG_GET_ITEM_PURCHASE_DATA = 0x3540, + CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x330B, + CMSG_GET_MIRROR_IMAGE_DATA = 0x32A3, CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EE, - CMSG_GET_RAF_ACCOUNT_INFO = 0x3720, - CMSG_GET_REMAINING_GAME_TIME = 0x36EB, - CMSG_GET_TROPHY_LIST = 0x3307, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36DE, - CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x36F0, - CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x36F1, + CMSG_GET_RAF_ACCOUNT_INFO = 0x3723, + CMSG_GET_REMAINING_GAME_TIME = 0x36ED, + CMSG_GET_TROPHY_LIST = 0x331D, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E0, + CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x36F2, + CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x36F3, CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3694, CMSG_GM_TICKET_GET_CASE_STATUS = 0x3693, CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3692, - CMSG_GOSSIP_SELECT_OPTION = 0x3494, + CMSG_GOSSIP_SELECT_OPTION = 0x349A, CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308E, CMSG_GUILD_ADD_RANK = 0x3065, CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x3060, CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x3062, - CMSG_GUILD_BANK_ACTIVATE = 0x34B6, - CMSG_GUILD_BANK_BUY_TAB = 0x34C4, - CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34C6, + CMSG_GUILD_BANK_ACTIVATE = 0x34BC, + CMSG_GUILD_BANK_BUY_TAB = 0x34CA, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34CC, CMSG_GUILD_BANK_LOG_QUERY = 0x3083, - CMSG_GUILD_BANK_QUERY_TAB = 0x34C3, + CMSG_GUILD_BANK_QUERY_TAB = 0x34C9, CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3084, CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3087, CMSG_GUILD_BANK_TEXT_QUERY = 0x3088, - CMSG_GUILD_BANK_UPDATE_TAB = 0x34C5, - CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34C7, + CMSG_GUILD_BANK_UPDATE_TAB = 0x34CB, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34CD, CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x307C, CMSG_GUILD_CHANGE_NAME_REQUEST = 0x307F, CMSG_GUILD_DECLINE_INVITATION = 0x3061, @@ -378,125 +390,130 @@ enum OpcodeClient : uint16 CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3089, CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x3070, CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3071, - CMSG_GUILD_SET_GUILD_MASTER = 0x36C6, + CMSG_GUILD_SET_GUILD_MASTER = 0x36C8, CMSG_GUILD_SET_MEMBER_NOTE = 0x3073, CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3068, CMSG_GUILD_SHIFT_RANK = 0x3067, CMSG_GUILD_UPDATE_INFO_TEXT = 0x3076, CMSG_GUILD_UPDATE_MOTD_TEXT = 0x3075, - CMSG_HEARTH_AND_RESURRECT = 0x350F, + CMSG_HEARTH_AND_RESURRECT = 0x3515, + CMSG_HIDE_QUEST_CHOICE = 0x32B1, CMSG_HOTFIX_REQUEST = 0x35E5, CMSG_IGNORE_TRADE = 0x3159, CMSG_INITIATE_ROLE_POLL = 0x35DA, CMSG_INITIATE_TRADE = 0x3156, - CMSG_INSPECT = 0x3533, - CMSG_INSTANCE_LOCK_RESPONSE = 0x3514, - CMSG_ISLAND_QUEUE = 0x3396, - CMSG_ITEM_PURCHASE_REFUND = 0x353A, - CMSG_ITEM_TEXT_QUERY = 0x3325, - CMSG_JOIN_PET_BATTLE_QUEUE = 0x31DE, + CMSG_INSPECT = 0x353A, + CMSG_INSTANCE_LOCK_RESPONSE = 0x351A, + CMSG_ISLAND_QUEUE = 0x33B4, + CMSG_ITEM_PURCHASE_REFUND = 0x3541, + CMSG_ITEM_TEXT_QUERY = 0x333B, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x31E0, CMSG_JOIN_RATED_BATTLEGROUND = 0x3178, CMSG_KEEP_ALIVE = 0x367F, - CMSG_KEYBOUND_OVERRIDE = 0x3225, - CMSG_LEARN_PVP_TALENTS = 0x355E, - CMSG_LEARN_TALENTS = 0x355C, + CMSG_KEYBOUND_OVERRIDE = 0x3229, + CMSG_LEARN_PVP_TALENTS = 0x3567, + CMSG_LEARN_TALENTS = 0x3565, CMSG_LEAVE_GROUP = 0x3649, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31DF, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360B, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360C, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360D, - CMSG_LFG_LIST_GET_STATUS = 0x3609, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x360E, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x360F, - CMSG_LFG_LIST_JOIN = 0x3364, - CMSG_LFG_LIST_LEAVE = 0x3608, - CMSG_LFG_LIST_SEARCH = 0x360A, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x3365, - CMSG_LF_GUILD_ADD_RECRUIT = 0x361A, - CMSG_LF_GUILD_BROWSE = 0x361C, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31E1, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360C, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360D, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360E, + CMSG_LFG_LIST_GET_STATUS = 0x360A, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x360F, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x3610, + CMSG_LFG_LIST_JOIN = 0x3381, + CMSG_LFG_LIST_LEAVE = 0x3609, + CMSG_LFG_LIST_SEARCH = 0x360B, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x3382, + CMSG_LF_GUILD_ADD_RECRUIT = 0x361B, + CMSG_LF_GUILD_BROWSE = 0x361D, CMSG_LF_GUILD_DECLINE_RECRUIT = 0x3079, CMSG_LF_GUILD_GET_APPLICATIONS = 0x307A, CMSG_LF_GUILD_GET_GUILD_POST = 0x3077, CMSG_LF_GUILD_GET_RECRUITS = 0x3078, CMSG_LF_GUILD_REMOVE_RECRUIT = 0x307B, - CMSG_LF_GUILD_SET_GUILD_POST = 0x361B, - CMSG_LIST_INVENTORY = 0x34A1, - CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36B8, - CMSG_LIVE_REGION_CHARACTER_COPY = 0x36B7, - CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B6, + CMSG_LF_GUILD_SET_GUILD_POST = 0x361C, + CMSG_LIST_INVENTORY = 0x34A7, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36B9, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x36B8, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B7, + CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x36BA, CMSG_LOADING_SCREEN_NOTIFY = 0x35F8, - CMSG_LOAD_SELECTED_TROPHY = 0x3308, - CMSG_LOGOUT_CANCEL = 0x34E0, - CMSG_LOGOUT_INSTANT = 0x34E1, - CMSG_LOGOUT_REQUEST = 0x34DE, + CMSG_LOAD_SELECTED_TROPHY = 0x331E, + CMSG_LOGOUT_CANCEL = 0x34E6, + CMSG_LOGOUT_INSTANT = 0x34E7, + CMSG_LOGOUT_REQUEST = 0x34E4, CMSG_LOG_DISCONNECT = 0x3769, CMSG_LOG_STREAMING_ERROR = 0x376D, - CMSG_LOOT_ITEM = 0x3210, - CMSG_LOOT_MONEY = 0x320F, - CMSG_LOOT_RELEASE = 0x3214, - CMSG_LOOT_ROLL = 0x3215, - CMSG_LOOT_UNIT = 0x320E, - CMSG_LOW_LEVEL_RAID1 = 0x36A1, - CMSG_LOW_LEVEL_RAID2 = 0x351B, - CMSG_MAIL_CREATE_TEXT_ITEM = 0x3545, - CMSG_MAIL_DELETE = 0x3227, - CMSG_MAIL_GET_LIST = 0x3540, - CMSG_MAIL_MARK_AS_READ = 0x3544, + CMSG_LOOT_ITEM = 0x3214, + CMSG_LOOT_MONEY = 0x3213, + CMSG_LOOT_RELEASE = 0x3218, + CMSG_LOOT_ROLL = 0x3219, + CMSG_LOOT_UNIT = 0x3212, + CMSG_LOW_LEVEL_RAID1 = 0x36A2, + CMSG_LOW_LEVEL_RAID2 = 0x3521, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x354C, + CMSG_MAIL_DELETE = 0x322B, + CMSG_MAIL_GET_LIST = 0x3547, + CMSG_MAIL_MARK_AS_READ = 0x354B, CMSG_MAIL_RETURN_TO_SENDER = 0x3655, - CMSG_MAIL_TAKE_ITEM = 0x3542, - CMSG_MAIL_TAKE_MONEY = 0x3541, - CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x3229, - CMSG_MASTER_LOOT_ITEM = 0x3211, + CMSG_MAIL_TAKE_ITEM = 0x3549, + CMSG_MAIL_TAKE_MONEY = 0x3548, + CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x322D, + CMSG_MASTER_LOOT_ITEM = 0x3215, CMSG_MINIMAP_PING = 0x364B, CMSG_MISSILE_TRAJECTORY_COLLISION = 0x318A, CMSG_MOUNT_CLEAR_FANFARE = 0x312D, - CMSG_MOUNT_SET_FAVORITE = 0x3631, - CMSG_MOUNT_SPECIAL_ANIM = 0x3285, - CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A13, - CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2D, - CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A32, - CMSG_MOVE_DISMISS_VEHICLE = 0x3A31, + CMSG_MOUNT_SET_FAVORITE = 0x3632, + CMSG_MOUNT_SPECIAL_ANIM = 0x328E, + CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A14, + CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2E, + CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A33, + CMSG_MOVE_COLLISION_DISABLE_ACK = 0x3A36, + CMSG_MOVE_COLLISION_ENABLE_ACK = 0x3A37, + CMSG_MOVE_DISMISS_VEHICLE = 0x3A32, CMSG_MOVE_DOUBLE_JUMP = 0x39EB, - CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x3A1C, - CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3A22, + CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x3A1D, + CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3A23, CMSG_MOVE_FALL_LAND = 0x39FA, - CMSG_MOVE_FALL_RESET = 0x3A17, - CMSG_MOVE_FEATHER_FALL_ACK = 0x3A1A, - CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x3A2C, - CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x3A2B, - CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x3A30, - CMSG_MOVE_FORCE_ROOT_ACK = 0x3A0C, - CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x3A0A, - CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3A09, - CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3A20, - CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x3A0B, - CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3A21, - CMSG_MOVE_FORCE_UNROOT_ACK = 0x3A0D, - CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x3A1F, - CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x3A33, - CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x3A34, - CMSG_MOVE_HEARTBEAT = 0x3A0E, - CMSG_MOVE_HOVER_ACK = 0x3A11, + CMSG_MOVE_FALL_RESET = 0x3A18, + CMSG_MOVE_FEATHER_FALL_ACK = 0x3A1B, + CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x3A2D, + CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x3A2C, + CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x3A31, + CMSG_MOVE_FORCE_ROOT_ACK = 0x3A0D, + CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x3A0B, + CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3A0A, + CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3A21, + CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x3A0C, + CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3A22, + CMSG_MOVE_FORCE_UNROOT_ACK = 0x3A0E, + CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x3A20, + CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x3A34, + CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x3A35, + CMSG_MOVE_HEARTBEAT = 0x3A0F, + CMSG_MOVE_HOVER_ACK = 0x3A12, CMSG_MOVE_JUMP = 0x39EA, - CMSG_MOVE_KNOCK_BACK_ACK = 0x3A10, - CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x3A15, - CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x3A14, - CMSG_MOVE_SEAMLESS_TRANSFER_COMPLETE = 0x3A40, - CMSG_MOVE_SET_CAN_FLY_ACK = 0x3A25, - CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x3A23, - CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x3A37, - CMSG_MOVE_SET_FACING = 0x3A07, - CMSG_MOVE_SET_FLY = 0x3A26, - CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x3A24, - CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x3A3E, - CMSG_MOVE_SET_PITCH = 0x3A08, + CMSG_MOVE_KNOCK_BACK_ACK = 0x3A11, + CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x3A16, + CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x3A15, + CMSG_MOVE_SEAMLESS_TRANSFER_COMPLETE = 0x3A41, + CMSG_MOVE_SET_CAN_FLY_ACK = 0x3A26, + CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x3A24, + CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x3A38, + CMSG_MOVE_SET_FACING = 0x3A08, + CMSG_MOVE_SET_FLY = 0x3A27, + CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x3A25, + CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x3A3F, + CMSG_MOVE_SET_PITCH = 0x3A09, CMSG_MOVE_SET_RUN_MODE = 0x39F2, - CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x3A12, + CMSG_MOVE_SET_TURN_RATE_CHEAT = 0x3A05, + CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x3A13, CMSG_MOVE_SET_WALK_MODE = 0x39F3, - CMSG_MOVE_SPLINE_DONE = 0x3A16, - CMSG_MOVE_START_ASCEND = 0x3A27, + CMSG_MOVE_SPLINE_DONE = 0x3A17, + CMSG_MOVE_START_ASCEND = 0x3A28, CMSG_MOVE_START_BACKWARD = 0x39E5, - CMSG_MOVE_START_DESCEND = 0x3A2E, + CMSG_MOVE_START_DESCEND = 0x3A2F, CMSG_MOVE_START_FORWARD = 0x39E4, CMSG_MOVE_START_PITCH_DOWN = 0x39F0, CMSG_MOVE_START_PITCH_UP = 0x39EF, @@ -506,284 +523,293 @@ enum OpcodeClient : uint16 CMSG_MOVE_START_TURN_LEFT = 0x39EC, CMSG_MOVE_START_TURN_RIGHT = 0x39ED, CMSG_MOVE_STOP = 0x39E6, - CMSG_MOVE_STOP_ASCEND = 0x3A28, + CMSG_MOVE_STOP_ASCEND = 0x3A29, CMSG_MOVE_STOP_PITCH = 0x39F1, CMSG_MOVE_STOP_STRAFE = 0x39E9, CMSG_MOVE_STOP_SWIM = 0x39FC, CMSG_MOVE_STOP_TURN = 0x39EE, CMSG_MOVE_TELEPORT_ACK = 0x39F9, - CMSG_MOVE_TIME_SKIPPED = 0x3A19, - CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x3A06, - CMSG_MOVE_UPDATE_FALL_SPEED = 0x3A18, - CMSG_MOVE_WATER_WALK_ACK = 0x3A1B, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31D4, - CMSG_NEXT_CINEMATIC_CAMERA = 0x354E, + CMSG_MOVE_TIME_SKIPPED = 0x3A1A, + CMSG_MOVE_UPDATE_FALL_SPEED = 0x3A19, + CMSG_MOVE_WATER_WALK_ACK = 0x3A1C, + CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = 0x308F, + CMSG_MYTHIC_PLUS_WEEKLY_REWARD_REQUEST = 0x3683, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31D6, + CMSG_NEXT_CINEMATIC_CAMERA = 0x3555, CMSG_OBJECT_UPDATE_FAILED = 0x3180, CMSG_OBJECT_UPDATE_RESCUED = 0x3181, - CMSG_OFFER_PETITION = 0x33B1, - CMSG_OPENING_CINEMATIC = 0x354D, - CMSG_OPEN_ITEM = 0x3326, - CMSG_OPEN_MISSION_NPC = 0x32ED, - CMSG_OPEN_SHIPMENT_NPC = 0x32F3, - CMSG_OPEN_TRADESKILL_NPC = 0x32FE, - CMSG_OPT_OUT_OF_LOOT = 0x34FE, + CMSG_OFFER_PETITION = 0x33DC, + CMSG_OPENING_CINEMATIC = 0x3554, + CMSG_OPEN_ITEM = 0x333C, + CMSG_OPEN_MISSION_NPC = 0x3301, + CMSG_OPEN_SHIPMENT_NPC = 0x3309, + CMSG_OPEN_TRADESKILL_NPC = 0x3314, + CMSG_OPT_OUT_OF_LOOT = 0x3504, CMSG_PARTY_INVITE = 0x3602, CMSG_PARTY_INVITE_RESPONSE = 0x3603, CMSG_PARTY_UNINVITE = 0x3647, - CMSG_PERFORM_ITEM_INTERACTION = 0x3231, - CMSG_PETITION_BUY = 0x34C9, - CMSG_PETITION_RENAME_GUILD = 0x36C7, - CMSG_PETITION_SHOW_LIST = 0x34C8, - CMSG_PETITION_SHOW_SIGNATURES = 0x34CA, - CMSG_PET_ABANDON = 0x348D, - CMSG_PET_ACTION = 0x348B, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31E3, - CMSG_PET_BATTLE_INPUT = 0x3640, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3226, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31E2, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3641, - CMSG_PET_BATTLE_REQUEST_PVP = 0x31DC, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31DD, - CMSG_PET_BATTLE_REQUEST_WILD = 0x31DA, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31E4, - CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31DB, - CMSG_PET_CANCEL_AURA = 0x348E, - CMSG_PET_CAST_SPELL = 0x329E, + CMSG_PERFORM_ITEM_INTERACTION = 0x3235, + CMSG_PETITION_BUY = 0x34CF, + CMSG_PETITION_RENAME_GUILD = 0x36C9, + CMSG_PETITION_SHOW_LIST = 0x34CE, + CMSG_PETITION_SHOW_SIGNATURES = 0x34D0, + CMSG_PET_ABANDON = 0x3493, + CMSG_PET_ACTION = 0x3491, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31E5, + CMSG_PET_BATTLE_INPUT = 0x3641, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x322A, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31E4, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3642, + CMSG_PET_BATTLE_REQUEST_PVP = 0x31DE, + CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31DF, + CMSG_PET_BATTLE_REQUEST_WILD = 0x31DC, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31E6, + CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31DD, + CMSG_PET_CANCEL_AURA = 0x3494, + CMSG_PET_CAST_SPELL = 0x32A7, CMSG_PET_RENAME = 0x3685, - CMSG_PET_SET_ACTION = 0x348A, - CMSG_PET_SPELL_AUTOCAST = 0x348F, - CMSG_PET_STOP_ATTACK = 0x348C, + CMSG_PET_SET_ACTION = 0x3490, + CMSG_PET_SPELL_AUTOCAST = 0x3495, + CMSG_PET_STOP_ATTACK = 0x3492, CMSG_PING = 0x3768, CMSG_PLAYER_LOGIN = 0x35EA, - CMSG_PUSH_QUEST_TO_PARTY = 0x349F, + CMSG_PUSH_QUEST_TO_PARTY = 0x34A5, CMSG_PVP_LOG_DATA = 0x317B, - CMSG_QUERY_BATTLE_PET_NAME = 0x327A, - CMSG_QUERY_COMMUNITY_NAME = 0x368B, + CMSG_QUERY_BATTLE_PET_NAME = 0x3282, CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3660, CMSG_QUERY_CORPSE_TRANSPORT = 0x3661, - CMSG_QUERY_COUNTDOWN_TIMER = 0x31A8, - CMSG_QUERY_CREATURE = 0x3274, - CMSG_QUERY_GAME_OBJECT = 0x3275, - CMSG_QUERY_GARRISON_CREATURE_NAME = 0x327B, + CMSG_QUERY_COUNTDOWN_TIMER = 0x31AA, + CMSG_QUERY_CREATURE = 0x327C, + CMSG_QUERY_GAME_OBJECT = 0x327D, + CMSG_QUERY_GARRISON_PET_NAME = 0x3283, CMSG_QUERY_GUILD_INFO = 0x368E, - CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x3508, - CMSG_QUERY_NEXT_MAIL_TIME = 0x3543, - CMSG_QUERY_NPC_TEXT = 0x3276, - CMSG_QUERY_PAGE_TEXT = 0x3278, - CMSG_QUERY_PETITION = 0x327C, - CMSG_QUERY_PET_NAME = 0x3279, + CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x350E, + CMSG_QUERY_NEXT_MAIL_TIME = 0x354A, + CMSG_QUERY_NPC_TEXT = 0x327E, + CMSG_QUERY_PAGE_TEXT = 0x3280, + CMSG_QUERY_PETITION = 0x3284, + CMSG_QUERY_PET_NAME = 0x3281, CMSG_QUERY_PLAYER_NAME = 0x368A, + CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY = 0x368C, + CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID = 0x368B, CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3175, - CMSG_QUERY_QUEST_INFO = 0x3277, + CMSG_QUERY_QUEST_INFO = 0x327F, CMSG_QUERY_REALM_NAME = 0x368D, CMSG_QUERY_SCENARIO_POI = 0x3656, - CMSG_QUERY_TIME = 0x34DD, - CMSG_QUERY_TREASURE_PICKER = 0x334C, - CMSG_QUERY_VOID_STORAGE = 0x31A1, - CMSG_QUEST_CONFIRM_ACCEPT = 0x349E, - CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3498, - CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x349A, - CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x3499, - CMSG_QUEST_GIVER_HELLO = 0x3496, - CMSG_QUEST_GIVER_QUERY_QUEST = 0x3497, - CMSG_QUEST_GIVER_REQUEST_REWARD = 0x349B, - CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x349D, - CMSG_QUEST_GIVER_STATUS_QUERY = 0x349C, - CMSG_QUEST_LOG_REMOVE_QUEST = 0x3538, - CMSG_QUEST_POI_QUERY = 0x36AF, - CMSG_QUEST_PUSH_RESULT = 0x34A0, - CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x33A5, - CMSG_QUEST_SESSION_REQUEST_START = 0x33A4, - CMSG_QUEST_SESSION_REQUEST_STOP = 0x372B, + CMSG_QUERY_TIME = 0x34E3, + CMSG_QUERY_TREASURE_PICKER = 0x3361, + CMSG_QUERY_VOID_STORAGE = 0x31A3, + CMSG_QUEST_CONFIRM_ACCEPT = 0x34A4, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x349E, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x34A0, + CMSG_QUEST_GIVER_CLOSE_QUEST = 0x355A, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x349F, + CMSG_QUEST_GIVER_HELLO = 0x349C, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x349D, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x34A1, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x34A3, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x34A2, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x353F, + CMSG_QUEST_POI_QUERY = 0x36B0, + CMSG_QUEST_PUSH_RESULT = 0x34A6, + CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x33CD, + CMSG_QUEST_SESSION_REQUEST_START = 0x33CC, + CMSG_QUEST_SESSION_REQUEST_STOP = 0x372E, CMSG_QUEUED_MESSAGES_END = 0x376C, - CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3706, - CMSG_QUICK_JOIN_REQUEST_INVITE = 0x3705, - CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x3730, - CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x3704, - CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x3703, - CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0x350C, - CMSG_RAF_CLAIM_NEXT_REWARD = 0x3721, - CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x3723, - CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x3722, - CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36E3, + CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3708, + CMSG_QUICK_JOIN_REQUEST_INVITE = 0x3707, + CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x3733, + CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x3706, + CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x3705, + CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0x3512, + CMSG_RAF_CLAIM_NEXT_REWARD = 0x3724, + CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x3726, + CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x3725, + CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36E5, CMSG_RANDOM_ROLL = 0x3654, - CMSG_READY_CHECK_RESPONSE = 0x3634, - CMSG_READ_ITEM = 0x3327, - CMSG_RECLAIM_CORPSE = 0x34E3, - CMSG_REMOVE_NEW_ITEM = 0x334F, - CMSG_REMOVE_RAF_RECRUIT = 0x3724, + CMSG_READY_CHECK_RESPONSE = 0x3635, + CMSG_READ_ITEM = 0x333D, + CMSG_RECLAIM_CORPSE = 0x34E9, + CMSG_REMOVE_NEW_ITEM = 0x3364, + CMSG_REMOVE_RAF_RECRUIT = 0x3727, CMSG_REORDER_CHARACTERS = 0x35E9, - CMSG_REPAIR_ITEM = 0x34F4, - CMSG_REPLACE_TROPHY = 0x3309, - CMSG_REPOP_REQUEST = 0x3530, - CMSG_REPORT_CLIENT_VARIABLES = 0x3700, - CMSG_REPORT_ENABLED_ADDONS = 0x36FF, - CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x3701, - CMSG_REPORT_PVP_PLAYER_AFK = 0x34FC, - CMSG_REPORT_SERVER_LAG = 0x339C, - CMSG_REQUEST_ACCOUNT_DATA = 0x3697, - CMSG_REQUEST_AREA_POI_UPDATE = 0x334E, + CMSG_REPAIR_ITEM = 0x34FA, + CMSG_REPLACE_TROPHY = 0x331F, + CMSG_REPOP_REQUEST = 0x3537, + CMSG_REPORT_CLIENT_VARIABLES = 0x3702, + CMSG_REPORT_ENABLED_ADDONS = 0x3701, + CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x3703, + CMSG_REPORT_PVP_PLAYER_AFK = 0x3502, + CMSG_REPORT_SERVER_LAG = 0x33C3, + CMSG_REPORT_STUCK_IN_COMBAT = 0x33C4, + CMSG_REQUEST_ACCOUNT_DATA = 0x3698, + CMSG_REQUEST_AREA_POI_UPDATE = 0x3363, CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DC, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317D, CMSG_REQUEST_CEMETERY_LIST = 0x3176, - CMSG_REQUEST_CHALLENGE_MODE_AFFIXES = 0x3207, CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x368F, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32B7, - CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x3534, - CMSG_REQUEST_FORCED_REACTIONS = 0x3209, - CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A7, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A6, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x32A7, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32C2, + CMSG_REQUEST_COVENANT_CALLINGS = 0x33B6, + CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x353B, + CMSG_REQUEST_FORCED_REACTIONS = 0x320D, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A9, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A8, + CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x33C5, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x32B2, + CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x320A, + CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x320B, CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F7, CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3653, - CMSG_REQUEST_PET_INFO = 0x3490, - CMSG_REQUEST_PLAYED_TIME = 0x327F, - CMSG_REQUEST_PVP_BRAWL_INFO = 0x3195, - CMSG_REQUEST_PVP_REWARDS = 0x3194, - CMSG_REQUEST_QUEST_LINES_FOR_MAP = 0x3397, - CMSG_REQUEST_RAID_INFO = 0x36C8, - CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E3, + CMSG_REQUEST_PET_INFO = 0x3496, + CMSG_REQUEST_PLAYED_TIME = 0x3287, + CMSG_REQUEST_PVP_REWARDS = 0x3196, + CMSG_REQUEST_RAID_INFO = 0x36CA, + CMSG_REQUEST_RATED_PVP_INFO = 0x35E3, CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0x309B, CMSG_REQUEST_RESEARCH_HISTORY = 0x3167, - CMSG_REQUEST_STABLED_PETS = 0x3491, - CMSG_REQUEST_VEHICLE_EXIT = 0x323A, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x323C, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x323B, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x323D, - CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x334D, - CMSG_RESET_CHALLENGE_MODE = 0x3205, - CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3206, + CMSG_REQUEST_SCHEDULED_PVP_INFO = 0x3197, + CMSG_REQUEST_STABLED_PETS = 0x3497, + CMSG_REQUEST_VEHICLE_EXIT = 0x323F, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x3241, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3240, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x3242, + CMSG_REQUEST_WEEKLY_REWARDS = 0x33B9, + CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3362, + CMSG_RESET_CHALLENGE_MODE = 0x3208, + CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3209, CMSG_RESET_INSTANCES = 0x3668, CMSG_RESURRECT_RESPONSE = 0x3684, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x330B, - CMSG_RIDE_VEHICLE_INTERACT = 0x323E, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x3321, + CMSG_RIDE_VEHICLE_INTERACT = 0x3243, CMSG_SAVE_CUF_PROFILES = 0x318B, - CMSG_SAVE_EQUIPMENT_SET = 0x3512, - CMSG_SAVE_GUILD_EMBLEM = 0x32AB, - CMSG_SCENE_PLAYBACK_CANCELED = 0x3222, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x3221, - CMSG_SCENE_TRIGGER_EVENT = 0x3223, - CMSG_SELF_RES = 0x353B, - CMSG_SELL_ITEM = 0x34A2, - CMSG_SEND_CONTACT_LIST = 0x36CD, + CMSG_SAVE_EQUIPMENT_SET = 0x3518, + CMSG_SAVE_GUILD_EMBLEM = 0x32B6, + CMSG_SCENE_PLAYBACK_CANCELED = 0x3226, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x3225, + CMSG_SCENE_TRIGGER_EVENT = 0x3227, + CMSG_SELF_RES = 0x3542, + CMSG_SELL_ITEM = 0x34A8, + CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x36FB, + CMSG_SEND_CONTACT_LIST = 0x36CF, CMSG_SEND_MAIL = 0x35FA, - CMSG_SEND_TEXT_EMOTE = 0x3488, - CMSG_SERVER_TIME_OFFSET_REQUEST = 0x369C, - CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x3228, - CMSG_SET_ACTION_BAR_TOGGLES = 0x353C, - CMSG_SET_ACTION_BUTTON = 0x3635, - CMSG_SET_ACTIVE_MOVER = 0x3A38, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32B8, + CMSG_SEND_TEXT_EMOTE = 0x348E, + CMSG_SERVER_TIME_OFFSET_REQUEST = 0x369D, + CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x322C, + CMSG_SET_ACTION_BAR_TOGGLES = 0x3543, + CMSG_SET_ACTION_BUTTON = 0x3636, + CMSG_SET_ACTIVE_MOVER = 0x3A39, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32C3, CMSG_SET_ASSISTANT_LEADER = 0x364F, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x332A, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x332B, - CMSG_SET_CONTACT_NOTES = 0x36D0, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3340, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3341, + CMSG_SET_CONTACT_NOTES = 0x36D2, CMSG_SET_CURRENCY_FLAGS = 0x3169, - CMSG_SET_DIFFICULTY_ID = 0x3224, + CMSG_SET_DIFFICULTY_ID = 0x3228, CMSG_SET_DUNGEON_DIFFICULTY = 0x3682, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3616, - CMSG_SET_FACTION_AT_WAR = 0x34E6, - CMSG_SET_FACTION_INACTIVE = 0x34E8, - CMSG_SET_FACTION_NOT_AT_WAR = 0x34E7, - CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x31B8, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x332D, - CMSG_SET_LFG_BONUS_FACTION_ID = 0x32A6, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3617, + CMSG_SET_FACTION_AT_WAR = 0x34EC, + CMSG_SET_FACTION_INACTIVE = 0x34EE, + CMSG_SET_FACTION_NOT_AT_WAR = 0x34ED, + CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x31BA, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3343, CMSG_SET_LOOT_METHOD = 0x3648, - CMSG_SET_LOOT_SPECIALIZATION = 0x3549, + CMSG_SET_LOOT_SPECIALIZATION = 0x3550, CMSG_SET_PARTY_ASSIGNMENT = 0x3651, CMSG_SET_PARTY_LEADER = 0x364A, CMSG_SET_PET_SLOT = 0x3168, CMSG_SET_PLAYER_DECLINED_NAMES = 0x3689, CMSG_SET_PREFERRED_CEMETERY = 0x3177, - CMSG_SET_PVP = 0x32AF, - CMSG_SET_RAID_DIFFICULTY = 0x36DA, + CMSG_SET_PVP = 0x32BA, + CMSG_SET_RAID_DIFFICULTY = 0x36DC, CMSG_SET_ROLE = 0x35D9, CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3687, - CMSG_SET_SELECTION = 0x3532, - CMSG_SET_SHEATHED = 0x3489, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x332C, - CMSG_SET_TAXI_BENCHMARK_MODE = 0x34FB, - CMSG_SET_TITLE = 0x3283, + CMSG_SET_SELECTION = 0x3539, + CMSG_SET_SHEATHED = 0x348F, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3342, + CMSG_SET_TAXI_BENCHMARK_MODE = 0x3501, + CMSG_SET_TITLE = 0x328C, CMSG_SET_TRADE_CURRENCY = 0x3160, CMSG_SET_TRADE_GOLD = 0x315F, CMSG_SET_TRADE_ITEM = 0x315D, - CMSG_SET_USING_PARTY_GARRISON = 0x32EF, - CMSG_SET_WAR_MODE = 0x32B0, - CMSG_SET_WATCHED_FACTION = 0x34E9, - CMSG_SHOW_TRADE_SKILL = 0x36C0, - CMSG_SIGN_PETITION = 0x353D, + CMSG_SET_USING_PARTY_GARRISON = 0x3303, + CMSG_SET_WAR_MODE = 0x32BB, + CMSG_SET_WATCHED_FACTION = 0x34EF, + CMSG_SHOW_TRADE_SKILL = 0x36C2, + CMSG_SIGN_PETITION = 0x3544, CMSG_SILENCE_PARTY_TALKER = 0x3652, - CMSG_SOCKET_GEMS = 0x34F3, - CMSG_SORT_BAGS = 0x332E, - CMSG_SORT_BANK_BAGS = 0x332F, - CMSG_SORT_REAGENT_BANK_BAGS = 0x3330, - CMSG_SPELL_CLICK = 0x3495, - CMSG_SPIRIT_HEALER_ACTIVATE = 0x34AF, + CMSG_SOCKET_GEMS = 0x34F9, + CMSG_SORT_BAGS = 0x3344, + CMSG_SORT_BANK_BAGS = 0x3345, + CMSG_SORT_REAGENT_BANK_BAGS = 0x3346, + CMSG_SPELL_CLICK = 0x349B, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x34B5, CMSG_SPLIT_ITEM = 0x399E, CMSG_STAND_STATE_CHANGE = 0x3189, - CMSG_START_CHALLENGE_MODE = 0x3554, + CMSG_START_CHALLENGE_MODE = 0x355B, CMSG_START_SPECTATOR_WAR_GAME = 0x35DF, CMSG_START_WAR_GAME = 0x35DE, + CMSG_SUBMIT_USER_FEEDBACK = 0x3697, + CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x33E5, CMSG_SUMMON_RESPONSE = 0x366A, - CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3645, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3644, - CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3646, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3646, CMSG_SURRENDER_ARENA = 0x3174, CMSG_SUSPEND_COMMS_ACK = 0x3764, CMSG_SUSPEND_TOKEN_RESPONSE = 0x376A, CMSG_SWAP_INV_ITEM = 0x399D, CMSG_SWAP_ITEM = 0x399C, CMSG_SWAP_SUB_GROUPS = 0x364D, - CMSG_SWAP_VOID_ITEM = 0x31A3, - CMSG_TABARD_VENDOR_ACTIVATE = 0x32AC, - CMSG_TALK_TO_GOSSIP = 0x3492, - CMSG_TAXI_NODE_STATUS_QUERY = 0x34A8, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34AA, - CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34AC, - CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A3C, - CMSG_TIME_SYNC_RESPONSE = 0x3A39, - CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3B, - CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A3A, + CMSG_SWAP_VOID_ITEM = 0x31A5, + CMSG_TABARD_VENDOR_ACTIVATE = 0x32B7, + CMSG_TALK_TO_GOSSIP = 0x3498, + CMSG_TAXI_NODE_STATUS_QUERY = 0x34AE, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34B0, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34B2, + CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A3D, + CMSG_TIME_SYNC_RESPONSE = 0x3A3A, + CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3C, + CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A3B, CMSG_TOGGLE_DIFFICULTY = 0x3657, - CMSG_TOGGLE_PVP = 0x32AE, - CMSG_TOTEM_DESTROYED = 0x3500, + CMSG_TOGGLE_PVP = 0x32B9, + CMSG_TOTEM_DESTROYED = 0x3506, CMSG_TOY_CLEAR_FANFARE = 0x312E, - CMSG_TRADE_SKILL_SET_FAVORITE = 0x334B, - CMSG_TRAINER_BUY_SPELL = 0x34AE, - CMSG_TRAINER_LIST = 0x34AD, - CMSG_TRANSMOGRIFY_ITEMS = 0x3196, - CMSG_TURN_IN_PETITION = 0x353F, - CMSG_TUTORIAL = 0x36DB, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x3360, + CMSG_TRAINER_BUY_SPELL = 0x34B4, + CMSG_TRAINER_LIST = 0x34B3, + CMSG_TRANSMOGRIFY_ITEMS = 0x3198, + CMSG_TURN_IN_PETITION = 0x3546, + CMSG_TUTORIAL = 0x36DD, CMSG_TWITTER_CHECK_STATUS = 0x312A, CMSG_TWITTER_CONNECT = 0x3127, CMSG_TWITTER_DISCONNECT = 0x312B, - CMSG_TWITTER_POST = 0x3332, + CMSG_TWITTER_POST = 0x3348, + CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x33B5, CMSG_UNACCEPT_TRADE = 0x315B, - CMSG_UNDELETE_CHARACTER = 0x36DD, - CMSG_UNLEARN_SKILL = 0x34ED, - CMSG_UNLEARN_SPECIALIZATION = 0x31A4, - CMSG_UNLOCK_VOID_STORAGE = 0x31A0, - CMSG_UPDATE_ACCOUNT_DATA = 0x3698, - CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x32A1, + CMSG_UNDELETE_CHARACTER = 0x36DF, + CMSG_UNLEARN_SKILL = 0x34F3, + CMSG_UNLEARN_SPECIALIZATION = 0x31A6, + CMSG_UNLOCK_VOID_STORAGE = 0x31A2, + CMSG_UPDATE_ACCOUNT_DATA = 0x3699, + CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x32AA, CMSG_UPDATE_CLIENT_SETTINGS = 0x3664, - CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3F, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A40, CMSG_UPDATE_RAID_TARGET = 0x3650, - CMSG_UPDATE_SPELL_VISUAL = 0x32A0, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F3, - CMSG_UPGRADE_GARRISON = 0x32C0, + CMSG_UPDATE_SPELL_VISUAL = 0x32A9, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F5, + CMSG_UPGRADE_GARRISON = 0x32CB, + CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x33E4, CMSG_USED_FOLLOW = 0x3186, - CMSG_USE_CRITTER_ITEM = 0x3244, + CMSG_USE_CRITTER_ITEM = 0x3249, CMSG_USE_EQUIPMENT_SET = 0x3995, - CMSG_USE_ITEM = 0x329B, - CMSG_USE_TOY = 0x329D, - CMSG_VAS_CHECK_TRANSFER_OK = 0x370B, - CMSG_VAS_GET_QUEUE_MINUTES = 0x370A, - CMSG_VAS_GET_SERVICE_STATUS = 0x3709, + CMSG_USE_ITEM = 0x32A4, + CMSG_USE_TOY = 0x32A6, + CMSG_VAS_CHECK_TRANSFER_OK = 0x370D, + CMSG_VAS_GET_QUEUE_MINUTES = 0x370C, + CMSG_VAS_GET_SERVICE_STATUS = 0x370B, CMSG_VIOLENCE_LEVEL = 0x3184, - CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x370F, - CMSG_VOICE_CHAT_LOGIN = 0x370E, - CMSG_VOID_STORAGE_TRANSFER = 0x31A2, - CMSG_WARDEN_DATA = 0x35EC, + CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x3711, + CMSG_VOICE_CHAT_LOGIN = 0x3710, + CMSG_VOID_STORAGE_TRANSFER = 0x31A4, + CMSG_WARDEN3_DATA = 0x35EC, CMSG_WHO = 0x3681, CMSG_WHO_IS = 0x3680, CMSG_WORLD_PORT_RESPONSE = 0x35F9, @@ -796,203 +822,205 @@ enum OpcodeClient : uint16 enum OpcodeServer : uint16 { - SMSG_ABORT_NEW_WORLD = 0x25AF, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x28C5, - SMSG_ACCOUNT_DATA_TIMES = 0x274F, - SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C4, - SMSG_ACCOUNT_TOY_UPDATE = 0x25C5, - SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x25C8, - SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x25C7, - SMSG_ACHIEVEMENT_DELETED = 0x2727, - SMSG_ACHIEVEMENT_EARNED = 0x2663, - SMSG_ACTIVATE_ESSENCE_FAILED = 0x2872, - SMSG_ACTIVATE_TAXI_REPLY = 0x26AC, - SMSG_ACTIVE_GLYPHS = 0x2C53, - SMSG_ADDON_LIST_REQUEST = 0x2662, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x265D, - SMSG_ADD_ITEM_PASSIVE = 0x25C0, - SMSG_ADD_LOSS_OF_CONTROL = 0x269C, - SMSG_ADD_RUNE_POWER = 0x26EB, - SMSG_ADJUST_SPLINE_DURATION = 0x25E9, - SMSG_ADVENTURE_MAP_OPEN_NPC = 0x2838, - SMSG_AE_LOOT_TARGETS = 0x262F, - SMSG_AE_LOOT_TARGET_ACK = 0x2630, - SMSG_AI_REACTION = 0x26E8, - SMSG_ALLIED_RACE_DETAILS = 0x283E, + SMSG_ABORT_NEW_WORLD = 0x259F, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x287D, + SMSG_ACCOUNT_DATA_TIMES = 0x270F, + SMSG_ACCOUNT_MOUNT_UPDATE = 0x25B1, + SMSG_ACCOUNT_TOY_UPDATE = 0x25B2, + SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x25B5, + SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x25B4, + SMSG_ACHIEVEMENT_DELETED = 0x26EC, + SMSG_ACHIEVEMENT_EARNED = 0x2640, + SMSG_ACTIVATE_ESSENCE_FAILED = 0x3016, + SMSG_ACTIVATE_SOULBIND_FAILED = 0x3018, + SMSG_ACTIVATE_TAXI_REPLY = 0x267B, + SMSG_ACTIVE_GLYPHS = 0x2C54, + SMSG_ADDON_LIST_REQUEST = 0x263F, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x263A, + SMSG_ADD_ITEM_PASSIVE = 0x25AD, + SMSG_ADD_LOSS_OF_CONTROL = 0x266D, + SMSG_ADD_RUNE_POWER = 0x26B5, + SMSG_ADJUST_SPLINE_DURATION = 0x25CF, + SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x288D, + SMSG_ADVENTURE_MAP_OPEN_NPC = 0x27F7, + SMSG_AE_LOOT_TARGETS = 0x2615, + SMSG_AE_LOOT_TARGET_ACK = 0x2616, + SMSG_AI_REACTION = 0x26B2, + SMSG_ALLIED_RACE_DETAILS = 0x27FD, SMSG_ALL_ACCOUNT_CRITERIA = 0x2571, SMSG_ALL_ACHIEVEMENT_DATA = 0x2570, SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8, - SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x28B5, + SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x286A, SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2588, - SMSG_AREA_POI_UPDATE_RESPONSE = 0x284F, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x2786, - SMSG_AREA_TRIGGER_DENIED = 0x26A3, - SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING = 0x2642, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x275B, - SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x2641, - SMSG_AREA_TRIGGER_RE_PATH = 0x263F, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x2644, - SMSG_AREA_TRIGGER_SET_VISUAL_ANIM = 0x2640, - SMSG_AREA_TRIGGER_UNATTACH = 0x2643, - SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x2652, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2668, - SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x27EC, - SMSG_ARTIFACT_FORGE_ERROR = 0x27EA, - SMSG_ARTIFACT_RESPEC_PROMPT = 0x27EB, - SMSG_ARTIFACT_XP_GAIN = 0x2830, - SMSG_ATTACKER_STATE_UPDATE = 0x27D5, - SMSG_ATTACK_START = 0x2670, - SMSG_ATTACK_STOP = 0x2671, - SMSG_ATTACK_SWING_ERROR = 0x2739, - SMSG_ATTACK_SWING_LANDED_LOG = 0x273A, - SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x281E, - SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x281D, - SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x281C, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2731, - SMSG_AUCTION_COMMAND_RESULT = 0x272E, - SMSG_AUCTION_FAVORITE_LIST = 0x28CC, - SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x28C3, - SMSG_AUCTION_HELLO_RESPONSE = 0x272C, - SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x28C2, - SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x28BF, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x28C0, - SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x28C1, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2730, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2732, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x272D, - SMSG_AUCTION_WON_NOTIFICATION = 0x272F, + SMSG_AREA_POI_UPDATE_RESPONSE = 0x3011, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x2744, + SMSG_AREA_TRIGGER_DENIED = 0x2917, + SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING = 0x2914, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x271B, + SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x2913, + SMSG_AREA_TRIGGER_RE_PATH = 0x2911, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x2916, + SMSG_AREA_TRIGGER_SET_VISUAL_ANIM = 0x2912, + SMSG_AREA_TRIGGER_UNATTACH = 0x2915, + SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x262F, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2645, + SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x27A6, + SMSG_ARTIFACT_FORGE_ERROR = 0x27A4, + SMSG_ARTIFACT_RESPEC_PROMPT = 0x27A5, + SMSG_ARTIFACT_XP_GAIN = 0x27EF, + SMSG_ATTACKER_STATE_UPDATE = 0x294C, + SMSG_ATTACK_START = 0x2937, + SMSG_ATTACK_STOP = 0x2938, + SMSG_ATTACK_SWING_ERROR = 0x2946, + SMSG_ATTACK_SWING_LANDED_LOG = 0x2947, + SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x27D8, + SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x27D7, + SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x27D6, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26F6, + SMSG_AUCTION_COMMAND_RESULT = 0x26F3, + SMSG_AUCTION_FAVORITE_LIST = 0x2884, + SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x287B, + SMSG_AUCTION_HELLO_RESPONSE = 0x26F1, + SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x287A, + SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x2877, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2878, + SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x2879, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x26F5, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x26F7, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x26F2, + SMSG_AUCTION_WON_NOTIFICATION = 0x26F4, SMSG_AURA_POINTS_DEPLETED = 0x2C23, SMSG_AURA_UPDATE = 0x2C22, SMSG_AUTH_CHALLENGE = 0x3048, SMSG_AUTH_FAILED = 0x256C, SMSG_AUTH_RESPONSE = 0x256D, - SMSG_AVAILABLE_HOTFIXES = 0x25A3, - SMSG_AZERITE_RESPEC_NPC = 0x283B, - SMSG_BAG_CLEANUP_FINISHED = 0x2826, - SMSG_BARBER_SHOP_RESULT = 0x26F1, - SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x28A4, - SMSG_BATTLEFIELD_LIST = 0x2596, - SMSG_BATTLEFIELD_PORT_DENIED = 0x259C, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2592, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x2595, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x2591, - SMSG_BATTLEFIELD_STATUS_NONE = 0x2594, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2593, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A7, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259D, - SMSG_BATTLEGROUND_INIT = 0x27A4, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x259A, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x259B, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2597, - SMSG_BATTLEGROUND_POINTS = 0x27A3, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x27D4, - SMSG_BATTLENET_CHALLENGE_START = 0x27D3, - SMSG_BATTLENET_NOTIFICATION = 0x284A, - SMSG_BATTLENET_RESPONSE = 0x2849, - SMSG_BATTLE_NET_CONNECTION_STATUS = 0x284B, - SMSG_BATTLE_PAY_ACK_FAILED = 0x27CE, - SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x27C2, - SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x27C3, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27CD, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27C0, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27BF, - SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x27BD, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27BE, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27BC, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27BA, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27BB, - SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x27C1, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27CC, - SMSG_BATTLE_PAY_START_CHECKOUT = 0x2869, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27CA, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27C9, - SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x285D, + SMSG_AVAILABLE_HOTFIXES = 0x2595, + SMSG_AZERITE_RESPEC_NPC = 0x27FA, + SMSG_BAG_CLEANUP_FINISHED = 0x2DA7, + SMSG_BARBER_SHOP_RESULT = 0x26BB, + SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x285B, + SMSG_BATTLEFIELD_LIST = 0x2927, + SMSG_BATTLEFIELD_PORT_DENIED = 0x292D, + SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2923, + SMSG_BATTLEFIELD_STATUS_FAILED = 0x2926, + SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x2922, + SMSG_BATTLEFIELD_STATUS_NONE = 0x2925, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2924, + SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x292F, + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x292E, + SMSG_BATTLEGROUND_INIT = 0x2949, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x292B, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x292C, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2928, + SMSG_BATTLEGROUND_POINTS = 0x2948, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x278D, + SMSG_BATTLENET_CHALLENGE_START = 0x278C, + SMSG_BATTLENET_NOTIFICATION = 0x2808, + SMSG_BATTLENET_RESPONSE = 0x2807, + SMSG_BATTLE_NET_CONNECTION_STATUS = 0x2809, + SMSG_BATTLE_PAY_ACK_FAILED = 0x2787, + SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x277C, + SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x277D, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x2786, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x277A, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x2779, + SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x2777, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x2778, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x2776, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x2774, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x2775, + SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x277B, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x2785, + SMSG_BATTLE_PAY_START_CHECKOUT = 0x2825, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x2783, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x2782, + SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x2819, SMSG_BATTLE_PAY_VAS_GUILD_FOLLOW_INFO = 0x29E7, SMSG_BATTLE_PAY_VAS_GUILD_MASTER_LIST = 0x29E6, - SMSG_BATTLE_PETS_HEALED = 0x260B, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x26A6, - SMSG_BATTLE_PET_DELETED = 0x2608, - SMSG_BATTLE_PET_ERROR = 0x2658, - SMSG_BATTLE_PET_JOURNAL = 0x2607, - SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2605, - SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2606, - SMSG_BATTLE_PET_LICENSE_CHANGED = 0x260C, - SMSG_BATTLE_PET_RESTORED = 0x260A, - SMSG_BATTLE_PET_REVOKED = 0x2609, - SMSG_BATTLE_PET_SET_MAX_PETS = 0x2603, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x2602, - SMSG_BATTLE_PET_UPDATES = 0x2601, - SMSG_BINDER_CONFIRM = 0x273F, + SMSG_BATTLE_PETS_HEALED = 0x25F0, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x2676, + SMSG_BATTLE_PET_DELETED = 0x25ED, + SMSG_BATTLE_PET_ERROR = 0x2635, + SMSG_BATTLE_PET_JOURNAL = 0x25EC, + SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x25EA, + SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x25EB, + SMSG_BATTLE_PET_LICENSE_CHANGED = 0x25F1, + SMSG_BATTLE_PET_RESTORED = 0x25EF, + SMSG_BATTLE_PET_REVOKED = 0x25EE, + SMSG_BATTLE_PET_SET_MAX_PETS = 0x25E8, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x25E7, + SMSG_BATTLE_PET_UPDATES = 0x25E6, + SMSG_BINDER_CONFIRM = 0x2700, SMSG_BIND_POINT_UPDATE = 0x257D, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2648, - SMSG_BLACK_MARKET_OPEN_RESULT = 0x2646, - SMSG_BLACK_MARKET_OUTBID = 0x2649, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2647, - SMSG_BLACK_MARKET_WON = 0x264A, - SMSG_BONUS_ROLL_EMPTY = 0x2665, - SMSG_BOSS_KILL = 0x27C8, - SMSG_BREAK_TARGET = 0x266F, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2625, + SMSG_BLACK_MARKET_OPEN_RESULT = 0x2623, + SMSG_BLACK_MARKET_OUTBID = 0x2626, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2624, + SMSG_BLACK_MARKET_WON = 0x2627, + SMSG_BONUS_ROLL_EMPTY = 0x2642, + SMSG_BOSS_KILL = 0x294B, + SMSG_BREAK_TARGET = 0x2936, SMSG_BROADCAST_ACHIEVEMENT = 0x2BBC, - SMSG_BROADCAST_SUMMON_CAST = 0x28A8, - SMSG_BROADCAST_SUMMON_RESPONSE = 0x28A9, - SMSG_BUY_FAILED = 0x26FA, - SMSG_BUY_SUCCEEDED = 0x26F9, - SMSG_CACHE_INFO = 0x2749, - SMSG_CACHE_VERSION = 0x2748, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26CC, - SMSG_CALENDAR_COMMAND_RESULT = 0x26CD, - SMSG_CALENDAR_COMMUNITY_INVITE = 0x26BC, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26C4, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26C5, - SMSG_CALENDAR_INVITE_ADDED = 0x26BD, - SMSG_CALENDAR_INVITE_ALERT = 0x26C1, - SMSG_CALENDAR_INVITE_NOTES = 0x26C6, - SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x26C7, - SMSG_CALENDAR_INVITE_REMOVED = 0x26BE, - SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x26C3, - SMSG_CALENDAR_INVITE_STATUS = 0x26BF, - SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x26C2, - SMSG_CALENDAR_MODERATOR_STATUS = 0x26C0, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26C8, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26C9, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26CA, - SMSG_CALENDAR_SEND_CALENDAR = 0x26BA, - SMSG_CALENDAR_SEND_EVENT = 0x26BB, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x26CB, - SMSG_CAMERA_EFFECT = 0x276B, - SMSG_CANCEL_AUTO_REPEAT = 0x271B, - SMSG_CANCEL_COMBAT = 0x2737, + SMSG_BROADCAST_SUMMON_CAST = 0x285D, + SMSG_BROADCAST_SUMMON_RESPONSE = 0x285E, + SMSG_BUY_FAILED = 0x26C4, + SMSG_BUY_SUCCEEDED = 0x26C3, + SMSG_CACHE_INFO = 0x2709, + SMSG_CACHE_VERSION = 0x2708, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x269B, + SMSG_CALENDAR_COMMAND_RESULT = 0x269C, + SMSG_CALENDAR_COMMUNITY_INVITE = 0x268B, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x2693, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x2694, + SMSG_CALENDAR_INVITE_ADDED = 0x268C, + SMSG_CALENDAR_INVITE_ALERT = 0x2690, + SMSG_CALENDAR_INVITE_NOTES = 0x2695, + SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x2696, + SMSG_CALENDAR_INVITE_REMOVED = 0x268D, + SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x2692, + SMSG_CALENDAR_INVITE_STATUS = 0x268E, + SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x2691, + SMSG_CALENDAR_MODERATOR_STATUS = 0x268F, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x2697, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x2698, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x2699, + SMSG_CALENDAR_SEND_CALENDAR = 0x2689, + SMSG_CALENDAR_SEND_EVENT = 0x268A, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x269A, + SMSG_CAMERA_EFFECT = 0x272A, + SMSG_CANCEL_AUTO_REPEAT = 0x26E2, + SMSG_CANCEL_COMBAT = 0x2945, SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C46, - SMSG_CANCEL_SCENE = 0x2657, + SMSG_CANCEL_SCENE = 0x2634, SMSG_CANCEL_SPELL_VISUAL = 0x2C44, SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C48, - SMSG_CAN_DUEL_RESULT = 0x267A, - SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x285C, - SMSG_CAPTURE_POINT_REMOVED = 0x2599, - SMSG_CAST_FAILED = 0x2C56, + SMSG_CAN_DUEL_RESULT = 0x2941, + SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x2818, + SMSG_CAPTURE_POINT_REMOVED = 0x292A, + SMSG_CAST_FAILED = 0x2C57, SMSG_CATEGORY_COOLDOWN = 0x2C16, - SMSG_CHALLENGE_MODE_COMPLETE = 0x2622, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2626, - SMSG_CHALLENGE_MODE_RESET = 0x2621, - SMSG_CHALLENGE_MODE_START = 0x261F, - SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x2620, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x273B, - SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x284C, + SMSG_CHALLENGE_MODE_COMPLETE = 0x2607, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x260C, + SMSG_CHALLENGE_MODE_RESET = 0x2606, + SMSG_CHALLENGE_MODE_START = 0x2604, + SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x2605, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x3005, + SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x280A, SMSG_CHANNEL_LIST = 0x2BC3, SMSG_CHANNEL_NOTIFY = 0x2BC0, SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC1, SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC2, - SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x2806, - SMSG_CHARACTER_LOGIN_FAILED = 0x274A, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27D2, - SMSG_CHARACTER_RENAME_RESULT = 0x27AC, - SMSG_CHARACTER_UPGRADE_ABORTED = 0x2805, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x2804, - SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x2807, - SMSG_CHARACTER_UPGRADE_STARTED = 0x2803, - SMSG_CHAR_CUSTOMIZE_FAILURE = 0x2721, - SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x2722, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27F0, + SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x27C0, + SMSG_CHARACTER_LOGIN_FAILED = 0x270A, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x278B, + SMSG_CHARACTER_RENAME_RESULT = 0x2766, + SMSG_CHARACTER_UPGRADE_ABORTED = 0x27BF, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27BE, + SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x27C1, + SMSG_CHARACTER_UPGRADE_STARTED = 0x27BD, + SMSG_CHAR_CUSTOMIZE_FAILURE = 0x26E6, + SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x26E7, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27AA, SMSG_CHAT = 0x2BAD, SMSG_CHAT_AUTO_RESPONDED = 0x2BB8, SMSG_CHAT_DOWN = 0x2BBD, @@ -1002,205 +1030,235 @@ enum OpcodeServer : uint16 SMSG_CHAT_PLAYER_AMBIGUOUS = 0x2BB0, SMSG_CHAT_PLAYER_NOTFOUND = 0x2BB7, SMSG_CHAT_RECONNECT = 0x2BBF, + SMSG_CHAT_REGIONAL_SERVICE_STATUS = 0x2BC5, SMSG_CHAT_RESTRICTED = 0x2BB3, SMSG_CHAT_SERVER_MESSAGE = 0x2BC4, SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x2C12, - SMSG_CHECK_WARGAME_ENTRY = 0x25A0, - SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x28B9, + SMSG_CHECK_ABANDON_NPE = 0x3019, + SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = 0x2584, + SMSG_CHECK_WARGAME_ENTRY = 0x2592, + SMSG_CHROMIE_TIME_OPEN_NPC = 0x27FF, + SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x2887, + SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x286E, SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C27, - SMSG_CLEAR_BOSS_EMOTES = 0x25CE, - SMSG_CLEAR_COOLDOWN = 0x26ED, + SMSG_CLEAR_BOSS_EMOTES = 0x25BC, + SMSG_CLEAR_COOLDOWN = 0x26B7, SMSG_CLEAR_COOLDOWNS = 0x2C26, - SMSG_CLEAR_LOSS_OF_CONTROL = 0x269E, - SMSG_CLEAR_RESURRECT = 0x2580, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x266F, + SMSG_CLEAR_RESURRECT = 0x257F, SMSG_CLEAR_SPELL_CHARGES = 0x2C28, - SMSG_CLEAR_TARGET = 0x26E4, - SMSG_CLOSE_ARTIFACT_FORGE = 0x27E9, - SMSG_CLOSE_HEART_FORGE = 0x2874, - SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x28B1, - SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x28B4, - SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x28B2, - SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x28AF, - SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x28B3, - SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x28B0, - SMSG_COIN_REMOVED = 0x262E, - SMSG_COMBAT_EVENT_FAILED = 0x2672, - SMSG_COMMENTATOR_MAP_INFO = 0x274C, - SMSG_COMMENTATOR_PLAYER_INFO = 0x274D, - SMSG_COMMENTATOR_STATE_CHANGED = 0x274B, - SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x2819, - SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x2825, - SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x281B, - SMSG_COMMERCE_TOKEN_UPDATE = 0x281A, - SMSG_COMPLAINT_RESULT = 0x26DB, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27E4, - SMSG_CONFIRM_PARTY_INVITE = 0x285B, + SMSG_CLEAR_TARGET = 0x2942, + SMSG_CLEAR_TREASURE_PICKER_CACHE = 0x2AA0, + SMSG_CLOSE_ARTIFACT_FORGE = 0x27A3, + SMSG_CLOSE_HEART_FORGE = 0x282B, + SMSG_CLOSE_ITEM_FORGE = 0x27A1, + SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x2866, + SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x2869, + SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x2867, + SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x2864, + SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x2868, + SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x2865, + SMSG_COIN_REMOVED = 0x2614, + SMSG_COMBAT_EVENT_FAILED = 0x2939, + SMSG_COMMENTATOR_MAP_INFO = 0x270C, + SMSG_COMMENTATOR_PLAYER_INFO = 0x270D, + SMSG_COMMENTATOR_STATE_CHANGED = 0x270B, + SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x27D3, + SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x27DF, + SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x27D5, + SMSG_COMMERCE_TOKEN_UPDATE = 0x27D4, + SMSG_COMPLAINT_RESULT = 0x26A9, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x279C, + SMSG_CONFIRM_PARTY_INVITE = 0x2817, SMSG_CONNECT_TO = 0x304D, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27CF, - SMSG_CONSOLE_WRITE = 0x2655, - SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x2821, - SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x2820, - SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x281F, - SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x2823, - SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x2824, - SMSG_CONTACT_LIST = 0x27D0, - SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x2862, - SMSG_CONTROL_UPDATE = 0x2667, - SMSG_COOLDOWN_CHEAT = 0x277F, - SMSG_COOLDOWN_EVENT = 0x26EC, - SMSG_CORPSE_LOCATION = 0x266E, - SMSG_CORPSE_RECLAIM_DELAY = 0x2791, - SMSG_CORPSE_TRANSPORT_QUERY = 0x2757, - SMSG_CREATE_CHAR = 0x2744, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x27E3, - SMSG_CRITERIA_DELETED = 0x2726, - SMSG_CRITERIA_UPDATE = 0x2720, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26F5, - SMSG_CUSTOM_LOAD_SCREEN = 0x25E4, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x2788, + SMSG_CONSOLE_WRITE = 0x2632, + SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x27DB, + SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x27DA, + SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x27D9, + SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x27DD, + SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x27DE, + SMSG_CONTACT_LIST = 0x2789, + SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x281E, + SMSG_CONTROL_UPDATE = 0x2644, + SMSG_COOLDOWN_CHEAT = 0x273D, + SMSG_COOLDOWN_EVENT = 0x26B6, + SMSG_CORPSE_LOCATION = 0x264B, + SMSG_CORPSE_RECLAIM_DELAY = 0x274E, + SMSG_CORPSE_TRANSPORT_QUERY = 0x2717, + SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x2800, + SMSG_CREATE_CHAR = 0x2704, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x279B, + SMSG_CRITERIA_DELETED = 0x26EB, + SMSG_CRITERIA_UPDATE = 0x26E5, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26BF, + SMSG_CUSTOM_LOAD_SCREEN = 0x25CA, SMSG_DAILY_QUESTS_RESET = 0x2A80, - SMSG_DAMAGE_CALC_LOG = 0x280E, - SMSG_DB_REPLY = 0x25A2, - SMSG_DEATH_RELEASE_LOC = 0x2710, - SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x2680, + SMSG_DAMAGE_CALC_LOG = 0x27C8, + SMSG_DB_REPLY = 0x2594, + SMSG_DEATH_RELEASE_LOC = 0x26D8, + SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x2651, SMSG_DEFENSE_MESSAGE = 0x2BB6, - SMSG_DELETE_CHAR = 0x2745, - SMSG_DESTROY_ARENA_UNIT = 0x2788, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x2738, + SMSG_DELETE_CHAR = 0x2705, + SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0x2976, + SMSG_DESTROY_ARENA_UNIT = 0x2746, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x26FC, SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258C, - SMSG_DISCONNECT_REASON = 0x2832, - SMSG_DISENCHANT_CREDIT = 0x25BD, - SMSG_DISMOUNT = 0x26E3, + SMSG_DISCONNECT_REASON = 0x27F1, + SMSG_DISENCHANT_CREDIT = 0x25AA, SMSG_DISMOUNT_RESULT = 0x257C, SMSG_DISPEL_FAILED = 0x2C30, - SMSG_DISPLAY_GAME_ERROR = 0x25B6, - SMSG_DISPLAY_PLAYER_CHOICE = 0x26A7, - SMSG_DISPLAY_PROMOTION = 0x266B, + SMSG_DISPLAY_GAME_ERROR = 0x25A4, + SMSG_DISPLAY_PLAYER_CHOICE = 0x2FFC, + SMSG_DISPLAY_PROMOTION = 0x2648, SMSG_DISPLAY_QUEST_POPUP = 0x2A9D, - SMSG_DISPLAY_TOAST = 0x263B, - SMSG_DISPLAY_WORLD_TEXT = 0x2831, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F8, + SMSG_DISPLAY_TOAST = 0x2621, + SMSG_DISPLAY_WORLD_TEXT = 0x27F0, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25DD, SMSG_DROP_NEW_CONNECTION = 0x304C, - SMSG_DUEL_ARRANGED = 0x2674, - SMSG_DUEL_COMPLETE = 0x2678, - SMSG_DUEL_COUNTDOWN = 0x2677, - SMSG_DUEL_IN_BOUNDS = 0x2676, - SMSG_DUEL_OUT_OF_BOUNDS = 0x2675, - SMSG_DUEL_REQUESTED = 0x2673, - SMSG_DUEL_WINNER = 0x2679, - SMSG_DURABILITY_DAMAGE_DEATH = 0x278D, - SMSG_EMOTE = 0x280F, - SMSG_ENABLE_BARBER_SHOP = 0x26F0, - SMSG_ENCHANTMENT_LOG = 0x2758, - SMSG_ENCOUNTER_END = 0x27C7, - SMSG_ENCOUNTER_START = 0x27C6, - SMSG_END_LIGHTNING_STORM = 0x26D7, + SMSG_DUEL_ARRANGED = 0x293B, + SMSG_DUEL_COMPLETE = 0x293F, + SMSG_DUEL_COUNTDOWN = 0x293E, + SMSG_DUEL_IN_BOUNDS = 0x293D, + SMSG_DUEL_OUT_OF_BOUNDS = 0x293C, + SMSG_DUEL_REQUESTED = 0x293A, + SMSG_DUEL_WINNER = 0x2940, + SMSG_DURABILITY_DAMAGE_DEATH = 0x274A, + SMSG_EMOTE = 0x27C9, + SMSG_ENABLE_BARBER_SHOP = 0x26BA, + SMSG_ENCHANTMENT_LOG = 0x2718, + SMSG_ENCOUNTER_END = 0x2781, + SMSG_ENCOUNTER_START = 0x2780, + SMSG_END_LIGHTNING_STORM = 0x26A6, SMSG_ENTER_ENCRYPTED_MODE = 0x3049, - SMSG_ENUM_CHARACTERS_RESULT = 0x2584, - SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x2837, + SMSG_ENUM_CHARACTERS_RESULT = 0x2583, + SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x27F6, SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C21, - SMSG_EQUIPMENT_SET_ID = 0x26E5, + SMSG_EQUIPMENT_SET_ID = 0x26AF, SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, - SMSG_EXPLORATION_EXPERIENCE = 0x27A9, - SMSG_FACTION_BONUS_INFO = 0x276A, - SMSG_FAILED_PLAYER_CONDITION = 0x25E3, - SMSG_FAILED_QUEST_TURN_IN = 0x2858, - SMSG_FEATURE_SYSTEM_STATUS = 0x25D2, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D3, - SMSG_FEIGN_DEATH_RESISTED = 0x278B, - SMSG_FISH_ESCAPED = 0x2703, - SMSG_FISH_NOT_HOOKED = 0x2702, - SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7, - SMSG_FORCED_DEATH_UPDATE = 0x2711, - SMSG_FORCE_ANIM = 0x2798, - SMSG_FORCE_OBJECT_RELINK = 0x266A, - SMSG_FRIEND_STATUS = 0x27D1, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D7, - SMSG_GAME_OBJECT_BASE = 0x2875, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D8, - SMSG_GAME_OBJECT_DESPAWN = 0x25D9, + SMSG_EXPLORATION_EXPERIENCE = 0x2763, + SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x288E, + SMSG_FACTION_BONUS_INFO = 0x2729, + SMSG_FAILED_PLAYER_CONDITION = 0x2FFA, + SMSG_FAILED_QUEST_TURN_IN = 0x2814, + SMSG_FEATURE_SYSTEM_STATUS = 0x25C0, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25C1, + SMSG_FEIGN_DEATH_RESISTED = 0x2749, + SMSG_FISH_ESCAPED = 0x26CD, + SMSG_FISH_NOT_HOOKED = 0x26CC, + SMSG_FLIGHT_SPLINE_SYNC = 0x2E29, + SMSG_FORCED_DEATH_UPDATE = 0x26D9, + SMSG_FORCE_ANIM = 0x2755, + SMSG_FORCE_ANIMATIONS = 0x2756, + SMSG_FORCE_OBJECT_RELINK = 0x2647, + SMSG_FRIEND_STATUS = 0x278A, + SMSG_GAIN_MAW_POWER = 0x27E4, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25C3, + SMSG_GAME_OBJECT_BASE = 0x282C, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25C4, + SMSG_GAME_OBJECT_DESPAWN = 0x25C5, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4B, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C4A, - SMSG_GAME_OBJECT_RESET_STATE = 0x2762, - SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x2848, - SMSG_GAME_OBJECT_UI_LINK = 0x275F, - SMSG_GAME_SPEED_SET = 0x26B0, - SMSG_GAME_TIME_SET = 0x2751, - SMSG_GAME_TIME_UPDATE = 0x2750, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2902, - SMSG_GARRISON_ADD_MISSION_RESULT = 0x2906, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2918, - SMSG_GARRISON_BUILDING_ACTIVATED = 0x28FB, - SMSG_GARRISON_BUILDING_LANDMARKS = 0x292C, - SMSG_GARRISON_BUILDING_REMOVED = 0x28F4, - SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x28F6, - SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x2916, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2908, - SMSG_GARRISON_CREATE_RESULT = 0x28FC, - SMSG_GARRISON_DELETE_RESULT = 0x2920, - SMSG_GARRISON_FOLLOWER_CATEGORIES = 0x2901, - SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x2914, - SMSG_GARRISON_FOLLOWER_CHANGED_DURABILITY = 0x2904, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x2913, - SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x2915, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x2912, - SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2929, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x28F7, - SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x28F5, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2905, - SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x292A, - SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x2910, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x290C, - SMSG_GARRISON_MISSION_LIST_UPDATE = 0x290E, - SMSG_GARRISON_MISSION_REWARD_RESPONSE = 0x292D, - SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x2911, - SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x2917, - SMSG_GARRISON_OPEN_ARCHITECT = 0x2921, - SMSG_GARRISON_OPEN_MISSION_NPC = 0x2923, - SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x291C, - SMSG_GARRISON_OPEN_TALENT_NPC = 0x291D, - SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x2922, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x28F3, - SMSG_GARRISON_PLOT_PLACED = 0x28F1, - SMSG_GARRISON_PLOT_REMOVED = 0x28F2, - SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x290A, - SMSG_GARRISON_RECALL_PORTAL_USED = 0x290B, - SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x291E, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x291F, - SMSG_GARRISON_REMOTE_INFO = 0x28FA, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2919, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x2903, - SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x28F9, - SMSG_GARRISON_START_MISSION_RESULT = 0x2907, - SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x28F8, - SMSG_GARRISON_UPGRADE_RESULT = 0x28FD, + SMSG_GAME_OBJECT_RESET_STATE = 0x2723, + SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x2806, + SMSG_GAME_OBJECT_UI_LINK = 0x271F, + SMSG_GAME_SPEED_SET = 0x267F, + SMSG_GAME_TIME_SET = 0x2711, + SMSG_GAME_TIME_UPDATE = 0x2710, + SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0x2978, + SMSG_GARRISON_ADD_EVENT = 0x299B, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x296A, + SMSG_GARRISON_ADD_MISSION_RESULT = 0x296E, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2980, + SMSG_GARRISON_BUILDING_ACTIVATED = 0x295F, + SMSG_GARRISON_BUILDING_REMOVED = 0x2958, + SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x295A, + SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = 0x2971, + SMSG_GARRISON_CLEAR_COLLECTION = 0x299A, + SMSG_GARRISON_CLEAR_EVENT_LIST = 0x299D, + SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0x2999, + SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0x2998, + SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0x2990, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x2970, + SMSG_GARRISON_CREATE_RESULT = 0x2960, + SMSG_GARRISON_DELETE_MISSION_RESULT = 0x2977, + SMSG_GARRISON_DELETE_RESULT = 0x2989, + SMSG_GARRISON_FOLLOWER_ACTIVATIONS_SET = 0x297F, + SMSG_GARRISON_FOLLOWER_CHANGED_FLAGS = 0x297D, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x297B, + SMSG_GARRISON_FOLLOWER_CHANGED_QUALITY = 0x297C, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x297A, + SMSG_GARRISON_FOLLOWER_FATIGUE_CLEARED = 0x297E, + SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = 0x2987, + SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = 0x2969, + SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = 0x2972, + SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0x2992, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x295B, + SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x2959, + SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0x2993, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x296D, + SMSG_GARRISON_MAP_DATA_RESPONSE = 0x2995, + SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x2974, + SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0x2996, + SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = 0x2979, + SMSG_GARRISON_OPEN_ARCHITECT = 0x298A, + SMSG_GARRISON_OPEN_CRAFTER = 0x298B, + SMSG_GARRISON_OPEN_MISSION_NPC = 0x298C, + SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x2984, + SMSG_GARRISON_OPEN_TALENT_NPC = 0x2985, + SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x2957, + SMSG_GARRISON_PLOT_PLACED = 0x2955, + SMSG_GARRISON_PLOT_REMOVED = 0x2956, + SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x2988, + SMSG_GARRISON_REMOTE_INFO = 0x295E, + SMSG_GARRISON_REMOVE_EVENT = 0x299C, + SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = 0x2983, + SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x2981, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x296B, + SMSG_GARRISON_RENAME_FOLLOWER_RESULT = 0x2982, + SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x295D, + SMSG_GARRISON_RESEARCH_TALENT_RESULT = 0x2962, + SMSG_GARRISON_RESET_TALENT_TREE = 0x2967, + SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = 0x2968, + SMSG_GARRISON_START_MISSION_RESULT = 0x296F, + SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0x298F, + SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0x299E, + SMSG_GARRISON_TALENT_COMPLETED = 0x2963, + SMSG_GARRISON_TALENT_REMOVED = 0x2964, + SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = 0x2966, + SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = 0x2965, + SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x295C, + SMSG_GARRISON_UPDATE_FOLLOWER = 0x296C, + SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0x2991, + SMSG_GARRISON_UPGRADE_RESULT = 0x2961, + SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0x2973, SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2585, - SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x2863, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27AA, - SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928, - SMSG_GET_GARRISON_INFO_RESULT = 0x28F0, - SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x27E6, - SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x2822, - SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x280B, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27E5, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27E1, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x280A, - SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x2833, - SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x2834, - SMSG_GM_PLAYER_INFO = 0x277E, - SMSG_GM_REQUEST_PLAYER_INFO = 0x25EF, - SMSG_GM_TICKET_CASE_STATUS = 0x26D2, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x26D1, - SMSG_GOD_MODE = 0x273E, + SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x281F, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2764, + SMSG_GET_GARRISON_INFO_RESULT = 0x2954, + SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x279E, + SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x27DC, + SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x27C5, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x279D, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x2799, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x27C4, + SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x27F2, + SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x27F3, + SMSG_GM_PLAYER_INFO = 0x3006, + SMSG_GM_REQUEST_PLAYER_INFO = 0x2FFB, + SMSG_GM_TICKET_CASE_STATUS = 0x26A1, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x26A0, + SMSG_GOD_MODE = 0x26FF, SMSG_GOSSIP_COMPLETE = 0x2A96, SMSG_GOSSIP_MESSAGE = 0x2A97, - SMSG_GOSSIP_POI = 0x27DE, - SMSG_GOSSIP_TEXT_UPDATE = 0x2A98, - SMSG_GROUP_ACTION_THROTTLED = 0x259E, - SMSG_GROUP_AUTO_KICK = 0x27DC, - SMSG_GROUP_DECLINE = 0x27D9, - SMSG_GROUP_DESTROYED = 0x27DB, - SMSG_GROUP_NEW_LEADER = 0x264D, - SMSG_GROUP_UNINVITE = 0x27DA, + SMSG_GOSSIP_POI = 0x2796, + SMSG_GOSSIP_QUEST_UPDATE = 0x2A98, + SMSG_GROUP_ACTION_THROTTLED = 0x2590, + SMSG_GROUP_AUTO_KICK = 0x2794, + SMSG_GROUP_DECLINE = 0x2791, + SMSG_GROUP_DESTROYED = 0x2793, + SMSG_GROUP_NEW_LEADER = 0x262A, + SMSG_GROUP_UNINVITE = 0x2792, SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7, @@ -1214,7 +1272,6 @@ enum OpcodeServer : uint16 SMSG_GUILD_COMMAND_RESULT = 0x29BA, SMSG_GUILD_CRITERIA_DELETED = 0x29C6, SMSG_GUILD_CRITERIA_UPDATE = 0x29C3, - SMSG_GUILD_EVENT_AWAY_CHANGE = 0x29F0, SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x29F8, SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x29F7, SMSG_GUILD_EVENT_DISBANDED = 0x29ED, @@ -1226,6 +1283,7 @@ enum OpcodeServer : uint16 SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x29EF, SMSG_GUILD_EVENT_RANKS_UPDATED = 0x29F1, SMSG_GUILD_EVENT_RANK_CHANGED = 0x29F2, + SMSG_GUILD_EVENT_STATUS_CHANGE = 0x29F0, SMSG_GUILD_EVENT_TAB_ADDED = 0x29F3, SMSG_GUILD_EVENT_TAB_DELETED = 0x29F4, SMSG_GUILD_EVENT_TAB_MODIFIED = 0x29F5, @@ -1234,7 +1292,7 @@ enum OpcodeServer : uint16 SMSG_GUILD_INVITE = 0x29CA, SMSG_GUILD_INVITE_DECLINED = 0x29E8, SMSG_GUILD_INVITE_EXPIRED = 0x29E9, - SMSG_GUILD_ITEM_LOOTED = 0x29D4, + SMSG_GUILD_ITEM_LOOTED_NOTIFY = 0x29D4, SMSG_GUILD_KNOWN_RECIPES = 0x29BE, SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x29BF, SMSG_GUILD_MEMBER_DAILY_RESET = 0x29E4, @@ -1254,61 +1312,62 @@ enum OpcodeServer : uint16 SMSG_GUILD_ROSTER = 0x29BB, SMSG_GUILD_ROSTER_UPDATE = 0x29BC, SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9, - SMSG_HEALTH_UPDATE = 0x2706, - SMSG_HIGHEST_THREAT_UPDATE = 0x2717, - SMSG_HOTFIX_CONNECT = 0x25A5, - SMSG_HOTFIX_MESSAGE = 0x25A4, - SMSG_INITIALIZE_FACTIONS = 0x2769, - SMSG_INITIAL_SETUP = 0x2581, - SMSG_INIT_WORLD_STATES = 0x278E, - SMSG_INSPECT_RESULT = 0x2651, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27F6, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27F5, - SMSG_INSTANCE_ENCOUNTER_END = 0x27FE, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27F4, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x2800, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27FF, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27F9, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27F8, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27FD, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x2801, - SMSG_INSTANCE_ENCOUNTER_START = 0x27FA, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27F7, - SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x27FC, - SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x27FB, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x273C, - SMSG_INSTANCE_INFO = 0x2654, - SMSG_INSTANCE_RESET = 0x26B5, - SMSG_INSTANCE_RESET_FAILED = 0x26B6, - SMSG_INSTANCE_SAVE_CREATED = 0x27C5, - SMSG_INTERRUPT_POWER_REGEN = 0x2C58, - SMSG_INVALIDATE_PAGE_TEXT = 0x270C, - SMSG_INVALIDATE_PLAYER = 0x26DA, - SMSG_INVALID_PROMOTION_CODE = 0x2799, - SMSG_INVENTORY_CHANGE_FAILURE = 0x2767, - SMSG_INVENTORY_FIXUP_COMPLETE = 0x285A, - SMSG_INVENTORY_FULL_OVERFLOW = 0x286B, - SMSG_ISLANDS_MISSION_NPC = 0x283D, - SMSG_ISLAND_AZERITE_GAIN = 0x27A6, - SMSG_ISLAND_COMPLETE = 0x27A7, + SMSG_HEALTH_UPDATE = 0x26D0, + SMSG_HIGHEST_THREAT_UPDATE = 0x26DE, + SMSG_HOTFIX_CONNECT = 0x2597, + SMSG_HOTFIX_MESSAGE = 0x2596, + SMSG_INITIALIZE_FACTIONS = 0x2728, + SMSG_INITIAL_SETUP = 0x2580, + SMSG_INIT_WORLD_STATES = 0x274B, + SMSG_INSPECT_RESULT = 0x262E, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27B0, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27AF, + SMSG_INSTANCE_ENCOUNTER_END = 0x27B8, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27AE, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27BA, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27B9, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27B3, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27B2, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27B7, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27BB, + SMSG_INSTANCE_ENCOUNTER_START = 0x27B4, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27B1, + SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x27B6, + SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x27B5, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x26FD, + SMSG_INSTANCE_INFO = 0x2631, + SMSG_INSTANCE_RESET = 0x2684, + SMSG_INSTANCE_RESET_FAILED = 0x2685, + SMSG_INSTANCE_SAVE_CREATED = 0x277F, + SMSG_INTERRUPT_POWER_REGEN = 0x2C59, + SMSG_INVALIDATE_PAGE_TEXT = 0x26D4, + SMSG_INVALIDATE_PLAYER = 0x2FFF, + SMSG_INVALID_PROMOTION_CODE = 0x2757, + SMSG_INVENTORY_CHANGE_FAILURE = 0x2DA5, + SMSG_INVENTORY_FIXUP_COMPLETE = 0x2816, + SMSG_INVENTORY_FULL_OVERFLOW = 0x2827, + SMSG_ISLANDS_MISSION_NPC = 0x27FC, + SMSG_ISLAND_AZERITE_GAIN = 0x2760, + SMSG_ISLAND_COMPLETE = 0x2761, SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A83, - SMSG_ITEM_CHANGED = 0x2729, - SMSG_ITEM_COOLDOWN = 0x280D, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x279B, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25B3, - SMSG_ITEM_INTERACTION_COMPLETE = 0x28CE, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25B1, - SMSG_ITEM_PUSH_RESULT = 0x263A, - SMSG_ITEM_TIME_UPDATE = 0x279A, - SMSG_KICK_REASON = 0x26B8, + SMSG_ITEM_CHANGED = 0x26EE, + SMSG_ITEM_COOLDOWN = 0x27C7, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2759, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25A3, + SMSG_ITEM_INTERACTION_COMPLETE = 0x2886, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25A1, + SMSG_ITEM_PUSH_RESULT = 0x2620, + SMSG_ITEM_TIME_UPDATE = 0x2758, + SMSG_KICK_REASON = 0x2687, SMSG_LEARNED_SPELLS = 0x2C4D, - SMSG_LEARN_PVP_TALENT_FAILED = 0x25EB, - SMSG_LEARN_TALENT_FAILED = 0x25EA, - SMSG_LEGACY_LOOT_RULES = 0x2876, - SMSG_LEVEL_LINKING_RESULT = 0x28B7, - SMSG_LEVEL_UP_INFO = 0x2728, + SMSG_LEARN_PVP_TALENT_FAILED = 0x25D1, + SMSG_LEARN_TALENT_FAILED = 0x25D0, + SMSG_LEGACY_LOOT_RULES = 0x282D, + SMSG_LEVEL_LINKING_RESULT = 0x286C, + SMSG_LEVEL_UP_INFO = 0x26ED, SMSG_LFG_BOOT_PLAYER = 0x2A35, SMSG_LFG_DISABLED = 0x2A33, + SMSG_LFG_EXPAND_SEARCH_PROMPT = 0x2A3B, SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x2A25, SMSG_LFG_JOIN_RESULT = 0x2A1C, SMSG_LFG_LIST_APPLICANT_LIST_UPDATE = 0x2A2B, @@ -1340,248 +1399,257 @@ enum OpcodeServer : uint16 SMSG_LF_GUILD_COMMAND_RESULT = 0x29D0, SMSG_LF_GUILD_POST = 0x29CD, SMSG_LF_GUILD_RECRUITS = 0x29CF, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27B8, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27B6, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27AB, - SMSG_LOAD_CUF_PROFILES = 0x25CF, - SMSG_LOAD_EQUIPMENT_SET = 0x2753, - SMSG_LOGIN_SET_TIME_SPEED = 0x2752, - SMSG_LOGIN_VERIFY_WORLD = 0x25AE, - SMSG_LOGOUT_CANCEL_ACK = 0x26B4, - SMSG_LOGOUT_COMPLETE = 0x26B3, - SMSG_LOGOUT_RESPONSE = 0x26B2, - SMSG_LOG_XP_GAIN = 0x2724, - SMSG_LOOT_ALL_PASSED = 0x2638, - SMSG_LOOT_LIST = 0x2787, - SMSG_LOOT_MONEY_NOTIFY = 0x2633, - SMSG_LOOT_RELEASE = 0x2632, - SMSG_LOOT_RELEASE_ALL = 0x2631, - SMSG_LOOT_REMOVED = 0x262D, - SMSG_LOOT_RESPONSE = 0x262C, - SMSG_LOOT_ROLL = 0x2635, - SMSG_LOOT_ROLLS_COMPLETE = 0x2637, - SMSG_LOOT_ROLL_WON = 0x2639, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x269B, - SMSG_MAIL_COMMAND_RESULT = 0x265B, - SMSG_MAIL_LIST_RESULT = 0x279C, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x279D, - SMSG_MAP_OBJECTIVES_INIT = 0x27A5, - SMSG_MAP_OBJ_EVENTS = 0x25DA, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x2636, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x2771, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x2770, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2765, + SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x2772, + SMSG_LOAD_CUF_PROFILES = 0x25BD, + SMSG_LOAD_EQUIPMENT_SET = 0x2713, + SMSG_LOGIN_SET_TIME_SPEED = 0x2712, + SMSG_LOGIN_VERIFY_WORLD = 0x259E, + SMSG_LOGOUT_CANCEL_ACK = 0x2683, + SMSG_LOGOUT_COMPLETE = 0x2682, + SMSG_LOGOUT_RESPONSE = 0x2681, + SMSG_LOG_XP_GAIN = 0x26E9, + SMSG_LOOT_ALL_PASSED = 0x261E, + SMSG_LOOT_LIST = 0x2745, + SMSG_LOOT_MONEY_NOTIFY = 0x2619, + SMSG_LOOT_RELEASE = 0x2618, + SMSG_LOOT_RELEASE_ALL = 0x2617, + SMSG_LOOT_REMOVED = 0x2613, + SMSG_LOOT_RESPONSE = 0x2612, + SMSG_LOOT_ROLL = 0x261B, + SMSG_LOOT_ROLLS_COMPLETE = 0x261D, + SMSG_LOOT_ROLL_WON = 0x261F, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x266C, + SMSG_MAIL_COMMAND_RESULT = 0x2638, + SMSG_MAIL_LIST_RESULT = 0x275A, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x275B, + SMSG_MAP_OBJECTIVES_INIT = 0x294A, + SMSG_MAP_OBJ_EVENTS = 0x25C6, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x261C, SMSG_MESSAGE_BOX = 0x2576, - SMSG_MINIMAP_PING = 0x2701, + SMSG_MINIMAP_PING = 0x26CB, SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, - SMSG_MISSILE_CANCEL = 0x25DB, - SMSG_MODIFY_COOLDOWN = 0x27AD, + SMSG_MISSILE_CANCEL = 0x25C7, + SMSG_MODIFY_COOLDOWN = 0x2767, SMSG_MOTD = 0x2BAF, SMSG_MOUNT_RESULT = 0x257B, - SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x28A5, - SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1, - SMSG_MOVE_DISABLE_COLLISION = 0x2DDD, - SMSG_MOVE_DISABLE_DOUBLE_JUMP = 0x2DCB, - SMSG_MOVE_DISABLE_GRAVITY = 0x2DDB, - SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2DDA, - SMSG_MOVE_ENABLE_COLLISION = 0x2DDE, - SMSG_MOVE_ENABLE_DOUBLE_JUMP = 0x2DCA, - SMSG_MOVE_ENABLE_GRAVITY = 0x2DDC, - SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2DD9, - SMSG_MOVE_KNOCK_BACK = 0x2DD1, - SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x2DE2, - SMSG_MOVE_ROOT = 0x2DC7, - SMSG_MOVE_SET_ACTIVE_MOVER = 0x2DA3, - SMSG_MOVE_SET_CAN_FLY = 0x2DD3, - SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x2DD5, - SMSG_MOVE_SET_COLLISION_HEIGHT = 0x2DDF, - SMSG_MOVE_SET_COMPOUND_STATE = 0x2DE3, - SMSG_MOVE_SET_FEATHER_FALL = 0x2DCD, - SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x2DC3, - SMSG_MOVE_SET_FLIGHT_SPEED = 0x2DC2, - SMSG_MOVE_SET_HOVERING = 0x2DCF, - SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x2DD7, - SMSG_MOVE_SET_LAND_WALK = 0x2DCC, - SMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x2DB4, - SMSG_MOVE_SET_NORMAL_FALL = 0x2DCE, - SMSG_MOVE_SET_PITCH_RATE = 0x2DC6, - SMSG_MOVE_SET_RUN_BACK_SPEED = 0x2DBF, - SMSG_MOVE_SET_RUN_SPEED = 0x2DBE, - SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x2DC1, - SMSG_MOVE_SET_SWIM_SPEED = 0x2DC0, - SMSG_MOVE_SET_TURN_RATE = 0x2DC5, - SMSG_MOVE_SET_VEHICLE_REC_ID = 0x2DE0, - SMSG_MOVE_SET_WALK_SPEED = 0x2DC4, - SMSG_MOVE_SET_WATER_WALK = 0x2DC9, - SMSG_MOVE_SKIP_TIME = 0x2DE4, - SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x2DE9, - SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x2DE7, - SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x2DEA, - SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x2DE8, - SMSG_MOVE_SPLINE_ROOT = 0x2DE5, - SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x2DEB, - SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x2DBA, - SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x2DB9, - SMSG_MOVE_SPLINE_SET_FLYING = 0x2DF5, - SMSG_MOVE_SPLINE_SET_HOVER = 0x2DED, - SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x2DF0, - SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x2DEC, - SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x2DBD, - SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x2DB6, - SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x2DF3, - SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x2DB5, - SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x2DB8, - SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x2DB7, - SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x2DBC, - SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x2DF4, - SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x2DBB, - SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x2DEF, - SMSG_MOVE_SPLINE_START_SWIM = 0x2DF1, - SMSG_MOVE_SPLINE_STOP_SWIM = 0x2DF2, - SMSG_MOVE_SPLINE_UNROOT = 0x2DE6, - SMSG_MOVE_SPLINE_UNSET_FLYING = 0x2DF6, - SMSG_MOVE_SPLINE_UNSET_HOVER = 0x2DEE, - SMSG_MOVE_TELEPORT = 0x2DD2, - SMSG_MOVE_UNROOT = 0x2DC8, - SMSG_MOVE_UNSET_CAN_FLY = 0x2DD4, - SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x2DD6, - SMSG_MOVE_UNSET_HOVERING = 0x2DD0, - SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x2DD8, - SMSG_MOVE_UPDATE = 0x2DAE, - SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x2DB2, - SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x2DAD, - SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x2DAA, - SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x2DA9, - SMSG_MOVE_UPDATE_KNOCK_BACK = 0x2DB0, - SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x2DB1, - SMSG_MOVE_UPDATE_PITCH_RATE = 0x2DAC, - SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x2DB3, - SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x2DA5, - SMSG_MOVE_UPDATE_RUN_SPEED = 0x2DA4, - SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x2DA8, - SMSG_MOVE_UPDATE_SWIM_SPEED = 0x2DA7, - SMSG_MOVE_UPDATE_TELEPORT = 0x2DAF, - SMSG_MOVE_UPDATE_TURN_RATE = 0x2DAB, - SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DA6, - SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x2624, - SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x2625, - SMSG_MYTHIC_PLUS_NEW_SEASON_RECORD = 0x2629, - SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x2628, - SMSG_MYTHIC_PLUS_WEEKLY_REWARD_RESPONSE = 0x2623, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25F3, - SMSG_NEW_TAXI_PATH = 0x26AD, - SMSG_NEW_WORLD = 0x25AD, + SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x285C, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2E13, + SMSG_MOVE_DISABLE_COLLISION = 0x2E0F, + SMSG_MOVE_DISABLE_DOUBLE_JUMP = 0x2DFD, + SMSG_MOVE_DISABLE_GRAVITY = 0x2E0D, + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2E0C, + SMSG_MOVE_ENABLE_COLLISION = 0x2E10, + SMSG_MOVE_ENABLE_DOUBLE_JUMP = 0x2DFC, + SMSG_MOVE_ENABLE_GRAVITY = 0x2E0E, + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x2E0B, + SMSG_MOVE_KNOCK_BACK = 0x2E03, + SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x2E14, + SMSG_MOVE_ROOT = 0x2DF9, + SMSG_MOVE_SET_ACTIVE_MOVER = 0x2DD5, + SMSG_MOVE_SET_CAN_FLY = 0x2E05, + SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x2E07, + SMSG_MOVE_SET_COLLISION_HEIGHT = 0x2E11, + SMSG_MOVE_SET_COMPOUND_STATE = 0x2E15, + SMSG_MOVE_SET_FEATHER_FALL = 0x2DFF, + SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x2DF5, + SMSG_MOVE_SET_FLIGHT_SPEED = 0x2DF4, + SMSG_MOVE_SET_HOVERING = 0x2E01, + SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x2E09, + SMSG_MOVE_SET_LAND_WALK = 0x2DFE, + SMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x2DE6, + SMSG_MOVE_SET_NORMAL_FALL = 0x2E00, + SMSG_MOVE_SET_PITCH_RATE = 0x2DF8, + SMSG_MOVE_SET_RUN_BACK_SPEED = 0x2DF1, + SMSG_MOVE_SET_RUN_SPEED = 0x2DF0, + SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x2DF3, + SMSG_MOVE_SET_SWIM_SPEED = 0x2DF2, + SMSG_MOVE_SET_TURN_RATE = 0x2DF7, + SMSG_MOVE_SET_VEHICLE_REC_ID = 0x2E12, + SMSG_MOVE_SET_WALK_SPEED = 0x2DF6, + SMSG_MOVE_SET_WATER_WALK = 0x2DFB, + SMSG_MOVE_SKIP_TIME = 0x2E16, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x2E1B, + SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x2E19, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x2E1C, + SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x2E1A, + SMSG_MOVE_SPLINE_ROOT = 0x2E17, + SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x2E1D, + SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x2DEC, + SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x2DEB, + SMSG_MOVE_SPLINE_SET_FLYING = 0x2E27, + SMSG_MOVE_SPLINE_SET_HOVER = 0x2E1F, + SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x2E22, + SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x2E1E, + SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x2DEF, + SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x2DE8, + SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x2E25, + SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x2DE7, + SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x2DEA, + SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x2DE9, + SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x2DEE, + SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x2E26, + SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x2DED, + SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x2E21, + SMSG_MOVE_SPLINE_START_SWIM = 0x2E23, + SMSG_MOVE_SPLINE_STOP_SWIM = 0x2E24, + SMSG_MOVE_SPLINE_UNROOT = 0x2E18, + SMSG_MOVE_SPLINE_UNSET_FLYING = 0x2E28, + SMSG_MOVE_SPLINE_UNSET_HOVER = 0x2E20, + SMSG_MOVE_TELEPORT = 0x2E04, + SMSG_MOVE_UNROOT = 0x2DFA, + SMSG_MOVE_UNSET_CAN_FLY = 0x2E06, + SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x2E08, + SMSG_MOVE_UNSET_HOVERING = 0x2E02, + SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x2E0A, + SMSG_MOVE_UPDATE = 0x2DE0, + SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x2DE4, + SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x2DDF, + SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x2DDC, + SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x2DDB, + SMSG_MOVE_UPDATE_KNOCK_BACK = 0x2DE2, + SMSG_MOVE_UPDATE_MOD_MOVEMENT_FORCE_MAGNITUDE = 0x2DE3, + SMSG_MOVE_UPDATE_PITCH_RATE = 0x2DDE, + SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x2DE5, + SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x2DD7, + SMSG_MOVE_UPDATE_RUN_SPEED = 0x2DD6, + SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x2DDA, + SMSG_MOVE_UPDATE_SWIM_SPEED = 0x2DD9, + SMSG_MOVE_UPDATE_TELEPORT = 0x2DE1, + SMSG_MOVE_UPDATE_TURN_RATE = 0x2DDD, + SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DD8, + SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x27E1, + SMSG_MULTI_FLOOR_NEW_FLOOR = 0x27E0, + SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x2609, + SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x260B, + SMSG_MYTHIC_PLUS_NEW_SEASON_RECORD = 0x260F, + SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x260E, + SMSG_MYTHIC_PLUS_SEASON_DATA = 0x260A, + SMSG_MYTHIC_PLUS_WEEKLY_REWARD_RESPONSE = 0x2608, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25D8, + SMSG_NEW_TAXI_PATH = 0x267C, + SMSG_NEW_WORLD = 0x259D, SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C43, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26D9, - SMSG_NOTIFY_MONEY = 0x25B0, - SMSG_NOTIFY_RECEIVED_MAIL = 0x265C, - SMSG_OFFER_PETITION_ERROR = 0x26E9, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2725, - SMSG_ON_MONSTER_MOVE = 0x2DA2, - SMSG_OPEN_ARTIFACT_FORGE = 0x27E8, - SMSG_OPEN_CONTAINER = 0x2768, - SMSG_OPEN_HEART_FORGE = 0x2873, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26A8, + SMSG_NOTIFY_MONEY = 0x25A0, + SMSG_NOTIFY_RECEIVED_MAIL = 0x2639, + SMSG_OFFER_PETITION_ERROR = 0x26B3, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x26EA, + SMSG_ON_MONSTER_MOVE = 0x2DD4, + SMSG_OPEN_ANIMA_DIVERSION_UI = 0x2720, + SMSG_OPEN_ARTIFACT_FORGE = 0x27A2, + SMSG_OPEN_CONTAINER = 0x2DA6, + SMSG_OPEN_HEART_FORGE = 0x282A, + SMSG_OPEN_ITEM_FORGE = 0x27A0, SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A31, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27E0, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27E2, - SMSG_OVERRIDE_LIGHT = 0x26EF, - SMSG_PAGE_TEXT = 0x275E, - SMSG_PARTY_COMMAND_RESULT = 0x27DD, - SMSG_PARTY_INVITE = 0x25D0, - SMSG_PARTY_KILL_LOG = 0x27A1, - SMSG_PARTY_MEMBER_FULL_STATE = 0x279F, - SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x279E, - SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x28CF, - SMSG_PARTY_UPDATE = 0x260D, - SMSG_PAUSE_MIRROR_TIMER = 0x2755, - SMSG_PENDING_RAID_LOCK = 0x2736, - SMSG_PETITION_ALREADY_SIGNED = 0x25B9, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x2798, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x279A, + SMSG_OVERRIDE_LIGHT = 0x26B9, + SMSG_PAGE_TEXT = 0x271E, + SMSG_PARTY_COMMAND_RESULT = 0x2795, + SMSG_PARTY_INVITE = 0x25BE, + SMSG_PARTY_KILL_LOG = 0x275E, + SMSG_PARTY_MEMBER_FULL_STATE = 0x275D, + SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x275C, + SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x288C, + SMSG_PARTY_UPDATE = 0x25F2, + SMSG_PAUSE_MIRROR_TIMER = 0x2715, + SMSG_PENDING_RAID_LOCK = 0x26FB, + SMSG_PETITION_ALREADY_SIGNED = 0x25A6, SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29FA, - SMSG_PETITION_SHOW_LIST = 0x26F2, - SMSG_PETITION_SHOW_SIGNATURES = 0x26F3, - SMSG_PETITION_SIGN_RESULTS = 0x2793, - SMSG_PET_ACTION_FEEDBACK = 0x2790, - SMSG_PET_ACTION_SOUND = 0x26CF, - SMSG_PET_ADDED = 0x25AA, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x261A, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x26A2, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x2613, - SMSG_PET_BATTLE_FINAL_ROUND = 0x2618, - SMSG_PET_BATTLE_FINISHED = 0x2619, - SMSG_PET_BATTLE_FIRST_ROUND = 0x2615, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0x2614, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x261B, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0x2612, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2659, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x265A, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2617, - SMSG_PET_BATTLE_REQUEST_FAILED = 0x2611, - SMSG_PET_BATTLE_ROUND_RESULT = 0x2616, - SMSG_PET_BATTLE_SLOT_UPDATES = 0x2604, - SMSG_PET_CAST_FAILED = 0x2C57, + SMSG_PETITION_SHOW_LIST = 0x26BC, + SMSG_PETITION_SHOW_SIGNATURES = 0x26BD, + SMSG_PETITION_SIGN_RESULTS = 0x2750, + SMSG_PET_ACTION_FEEDBACK = 0x274D, + SMSG_PET_ACTION_SOUND = 0x269E, + SMSG_PET_ADDED = 0x259A, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x25FF, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2673, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x25F8, + SMSG_PET_BATTLE_FINAL_ROUND = 0x25FD, + SMSG_PET_BATTLE_FINISHED = 0x25FE, + SMSG_PET_BATTLE_FIRST_ROUND = 0x25FA, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x25F9, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x2600, + SMSG_PET_BATTLE_PVP_CHALLENGE = 0x25F7, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2636, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x2637, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x25FC, + SMSG_PET_BATTLE_REQUEST_FAILED = 0x25F6, + SMSG_PET_BATTLE_ROUND_RESULT = 0x25FB, + SMSG_PET_BATTLE_SLOT_UPDATES = 0x25E9, + SMSG_PET_CAST_FAILED = 0x2C58, SMSG_PET_CLEAR_SPELLS = 0x2C24, - SMSG_PET_DISMISS_SOUND = 0x26D0, - SMSG_PET_GOD_MODE = 0x26AA, - SMSG_PET_GUIDS = 0x2747, + SMSG_PET_DISMISS_SOUND = 0x269F, + SMSG_PET_GOD_MODE = 0x2679, + SMSG_PET_GUIDS = 0x2707, SMSG_PET_LEARNED_SPELLS = 0x2C4F, SMSG_PET_MODE = 0x258B, - SMSG_PET_NAME_INVALID = 0x26F7, + SMSG_PET_NAME_INVALID = 0x26C1, SMSG_PET_NEWLY_TAMED = 0x2589, SMSG_PET_SLOT_UPDATED = 0x258A, SMSG_PET_SPELLS_MESSAGE = 0x2C25, - SMSG_PET_STABLE_LIST = 0x25AB, - SMSG_PET_STABLE_RESULT = 0x25AC, - SMSG_PET_TAME_FAILURE = 0x26E6, + SMSG_PET_STABLE_LIST = 0x259B, + SMSG_PET_STABLE_RESULT = 0x259C, + SMSG_PET_TAME_FAILURE = 0x26B0, SMSG_PET_UNLEARNED_SPELLS = 0x2C50, SMSG_PHASE_SHIFT_CHANGE = 0x2578, - SMSG_PLAYED_TIME = 0x2713, - SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x2871, - SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x2870, - SMSG_PLAYER_BONUS_ROLL_FAILED = 0x2877, - SMSG_PLAYER_BOUND = 0x257E, - SMSG_PLAYER_CONDITION_RESULT = 0x2843, - SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x2842, + SMSG_PLAYED_TIME = 0x26DA, + SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x3015, + SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x3014, + SMSG_PLAYER_BONUS_ROLL_FAILED = 0x3017, + SMSG_PLAYER_BOUND = 0x2FF8, + SMSG_PLAYER_CHOICE_CLEAR = 0x2FFE, + SMSG_PLAYER_CHOICE_DISPLAY_ERROR = 0x2FFD, + SMSG_PLAYER_CONDITION_RESULT = 0x300B, + SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x300A, + SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0x300F, SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F9, - SMSG_PLAYER_SKINNED = 0x278C, - SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x27A0, - SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x2847, - SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x2846, - SMSG_PLAY_MUSIC = 0x27B2, - SMSG_PLAY_OBJECT_SOUND = 0x27B3, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x2776, + SMSG_PLAYER_SKINNED = 0x3007, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x3008, + SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x300E, + SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x300D, + SMSG_PLAY_MUSIC = 0x276C, + SMSG_PLAY_OBJECT_SOUND = 0x276D, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x2735, SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C47, - SMSG_PLAY_SCENE = 0x2656, - SMSG_PLAY_SOUND = 0x27B1, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x27B4, + SMSG_PLAY_SCENE = 0x2633, + SMSG_PLAY_SOUND = 0x276B, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x276E, SMSG_PLAY_SPELL_VISUAL = 0x2C45, SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C49, - SMSG_PLAY_TIME_WARNING = 0x2740, + SMSG_PLAY_TIME_WARNING = 0x2701, SMSG_PONG = 0x304E, - SMSG_POWER_UPDATE = 0x2707, + SMSG_POWER_UPDATE = 0x26D1, SMSG_PRELOAD_CHILD_MAP = 0x2579, - SMSG_PREPOPULATE_NAME_CACHE = 0x28AA, - SMSG_PRE_RESSURECT = 0x27B0, - SMSG_PRINT_NOTIFICATION = 0x25E2, - SMSG_PROC_RESIST = 0x27A2, + SMSG_PREPOPULATE_NAME_CACHE = 0x285F, + SMSG_PRE_RESSURECT = 0x276A, + SMSG_PRINT_NOTIFICATION = 0x25C9, + SMSG_PROC_RESIST = 0x275F, SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C51, - SMSG_PVP_CREDIT = 0x271F, - SMSG_PVP_MATCH_COMPLETE = 0x28A7, - SMSG_PVP_MATCH_INITIALIZE = 0x28AC, - SMSG_PVP_MATCH_START = 0x28A6, - SMSG_PVP_MATCH_STATISTICS = 0x25B4, - SMSG_PVP_OPTIONS_ENABLED = 0x25B7, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x270E, - SMSG_QUERY_COMMUNITY_NAME_RESPONSE = 0x270A, - SMSG_QUERY_CREATURE_RESPONSE = 0x2704, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x2705, - SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B, + SMSG_PVP_CREDIT = 0x2944, + SMSG_PVP_MATCH_COMPLETE = 0x294E, + SMSG_PVP_MATCH_INITIALIZE = 0x294F, + SMSG_PVP_MATCH_START = 0x294D, + SMSG_PVP_MATCH_STATISTICS = 0x2931, + SMSG_PVP_OPTIONS_ENABLED = 0x2933, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x26D6, + SMSG_QUERY_CREATURE_RESPONSE = 0x26CE, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26CF, + SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0x2994, SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x280C, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x2708, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x270B, - SMSG_QUERY_PETITION_RESPONSE = 0x270F, - SMSG_QUERY_PET_NAME_RESPONSE = 0x270D, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x2709, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x27C6, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26D2, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x26D3, + SMSG_QUERY_PETITION_RESPONSE = 0x26D7, + SMSG_QUERY_PET_NAME_RESPONSE = 0x26D5, + SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE = 0x3003, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x3002, SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A95, - SMSG_QUERY_TIME_RESPONSE = 0x2723, + SMSG_QUERY_TIME_RESPONSE = 0x26E8, SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81, SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8E, SMSG_QUEST_FORCE_REMOVED = 0x2A9B, @@ -1594,16 +1662,14 @@ enum OpcodeServer : uint16 SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x2A92, SMSG_QUEST_GIVER_STATUS = 0x2A9A, SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x2A90, - SMSG_QUEST_LINES_FOR_MAP_RESPONSE = 0x2AA1, SMSG_QUEST_LOG_FULL = 0x2A86, - SMSG_QUEST_POI_CHANGED = 0x2A9F, SMSG_QUEST_POI_QUERY_RESPONSE = 0x2A9C, + SMSG_QUEST_POI_UPDATE_RESPONSE = 0x2A9E, SMSG_QUEST_PUSH_RESULT = 0x2A8F, - SMSG_QUEST_SESSION_INFO_RESPONSE = 0x28CA, - SMSG_QUEST_SESSION_READY_CHECK = 0x28BB, - SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x28BC, - SMSG_QUEST_SESSION_RESULT = 0x28BA, - SMSG_QUEST_SPAWN_TRACKING_UPDATE = 0x2A9E, + SMSG_QUEST_SESSION_INFO_RESPONSE = 0x2882, + SMSG_QUEST_SESSION_READY_CHECK = 0x2870, + SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x2871, + SMSG_QUEST_SESSION_RESULT = 0x286F, SMSG_QUEST_UPDATE_ADD_CREDIT = 0x2A8B, SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x2A8C, SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x2A8D, @@ -1611,119 +1677,125 @@ enum OpcodeServer : uint16 SMSG_QUEST_UPDATE_COMPLETE_BY_SPELL = 0x2A87, SMSG_QUEST_UPDATE_FAILED = 0x2A89, SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A8A, - SMSG_QUEUE_SUMMARY_UPDATE = 0x2859, - SMSG_RAF_ACCOUNT_INFO = 0x28B8, - SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x28C6, - SMSG_RAID_DIFFICULTY_SET = 0x27F1, - SMSG_RAID_GROUP_ONLY = 0x27F3, + SMSG_QUEUE_SUMMARY_UPDATE = 0x2815, + SMSG_RAF_ACCOUNT_INFO = 0x286D, + SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x287E, + SMSG_RAID_DIFFICULTY_SET = 0x27AB, + SMSG_RAID_GROUP_ONLY = 0x27AD, SMSG_RAID_INSTANCE_MESSAGE = 0x2BB4, - SMSG_RAID_MARKERS_CHANGED = 0x25BA, - SMSG_RANDOM_ROLL = 0x2650, - SMSG_RATED_PVP_INFO = 0x25A8, - SMSG_READY_CHECK_COMPLETED = 0x2610, - SMSG_READY_CHECK_RESPONSE = 0x260F, - SMSG_READY_CHECK_STARTED = 0x260E, - SMSG_READ_ITEM_RESULT_FAILED = 0x27ED, - SMSG_READ_ITEM_RESULT_OK = 0x27E7, - SMSG_REALM_LOOKUP_INFO = 0x2812, - SMSG_REALM_QUERY_RESPONSE = 0x26EE, - SMSG_REATTACH_RESURRECT = 0x2792, - SMSG_RECRUIT_A_FRIEND_FAILURE = 0x26F4, - SMSG_REFRESH_COMPONENT = 0x267C, + SMSG_RAID_MARKERS_CHANGED = 0x25A7, + SMSG_RANDOM_ROLL = 0x262D, + SMSG_RATED_PVP_INFO = 0x2930, + SMSG_READY_CHECK_COMPLETED = 0x25F5, + SMSG_READY_CHECK_RESPONSE = 0x25F4, + SMSG_READY_CHECK_STARTED = 0x25F3, + SMSG_READ_ITEM_RESULT_FAILED = 0x27A7, + SMSG_READ_ITEM_RESULT_OK = 0x279F, + SMSG_REALM_LOOKUP_INFO = 0x27CC, + SMSG_REALM_QUERY_RESPONSE = 0x26B8, + SMSG_REATTACH_RESURRECT = 0x274F, + SMSG_RECRUIT_A_FRIEND_FAILURE = 0x26BE, + SMSG_REFRESH_COMPONENT = 0x264D, SMSG_REFRESH_SPELL_HISTORY = 0x2C2C, - SMSG_REMOVE_ITEM_PASSIVE = 0x25C1, - SMSG_REMOVE_LOSS_OF_CONTROL = 0x269D, - SMSG_REPLACE_TROPHY_RESPONSE = 0x2809, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26E2, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259F, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D5, - SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x25D6, + SMSG_REMOVE_ITEM_PASSIVE = 0x25AE, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x266E, + SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x2C52, + SMSG_REPLACE_TROPHY_RESPONSE = 0x27C3, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x3001, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x2591, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x2934, + SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x2935, SMSG_RESEARCH_COMPLETE = 0x2587, SMSG_RESET_COMPRESSION_CONTEXT = 0x304F, - SMSG_RESET_FAILED_NOTIFY = 0x26EA, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x271C, + SMSG_RESET_FAILED_NOTIFY = 0x26B4, + SMSG_RESET_QUEST_POI = 0x2A9F, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x2943, SMSG_RESET_WEEKLY_CURRENCY = 0x2575, - SMSG_RESPEC_WIPE_CONFIRM = 0x262A, + SMSG_RESPEC_WIPE_CONFIRM = 0x2610, SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2572, - SMSG_RESTRICTED_ACCOUNT_WARNING = 0x25CC, + SMSG_RESTRICTED_ACCOUNT_WARNING = 0x25BA, SMSG_RESUME_CAST = 0x2C3B, SMSG_RESUME_CAST_BAR = 0x2C3E, SMSG_RESUME_COMMS = 0x304B, - SMSG_RESUME_TOKEN = 0x25BF, - SMSG_RESURRECT_REQUEST = 0x257F, - SMSG_RESYNC_RUNES = 0x2743, - SMSG_RETURN_APPLICANT_LIST = 0x28AE, - SMSG_RETURN_RECRUITING_CLUBS = 0x28AD, - SMSG_ROLE_CHANGED_INFORM = 0x258E, + SMSG_RESUME_TOKEN = 0x25AC, + SMSG_RESURRECT_REQUEST = 0x257E, + SMSG_RESYNC_RUNES = 0x2C5F, + SMSG_RETURN_APPLICANT_LIST = 0x2863, + SMSG_RETURN_RECRUITING_CLUBS = 0x2862, + SMSG_ROLE_CHANGED_INFORM = 0x258D, SMSG_ROLE_CHOSEN = 0x2A39, - SMSG_ROLE_POLL_INFORM = 0x258F, - SMSG_RUNE_REGEN_DEBUG = 0x25C9, - SMSG_SCENARIO_COMPLETED = 0x282F, - SMSG_SCENARIO_POIS = 0x2653, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x264C, - SMSG_SCENARIO_SHOW_CRITERIA = 0x2841, - SMSG_SCENARIO_STATE = 0x264B, - SMSG_SCENARIO_UI_UPDATE = 0x2840, - SMSG_SCENARIO_VACATE = 0x27EE, - SMSG_SCENE_OBJECT_EVENT = 0x25F9, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FE, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FF, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25FB, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25FA, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25FD, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25FC, - SMSG_SCRIPT_CAST = 0x2C55, - SMSG_SEASON_INFO = 0x25D4, - SMSG_SELL_RESPONSE = 0x26F8, - SMSG_SEND_ITEM_PASSIVES = 0x25C2, + SMSG_ROLE_POLL_INFORM = 0x258E, + SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x2801, + SMSG_RUNE_REGEN_DEBUG = 0x25B7, + SMSG_SCENARIO_COMPLETED = 0x27EE, + SMSG_SCENARIO_POIS = 0x2630, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x2629, + SMSG_SCENARIO_SHOW_CRITERIA = 0x2804, + SMSG_SCENARIO_STATE = 0x2628, + SMSG_SCENARIO_UI_UPDATE = 0x2803, + SMSG_SCENARIO_VACATE = 0x27A8, + SMSG_SCENE_OBJECT_EVENT = 0x25DE, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25E3, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25E4, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25E0, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25DF, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25E2, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25E1, + SMSG_SCRIPT_CAST = 0x2C56, + SMSG_SEASON_INFO = 0x25C2, + SMSG_SELL_RESPONSE = 0x26C2, + SMSG_SEND_ITEM_PASSIVES = 0x25AF, SMSG_SEND_KNOWN_SPELLS = 0x2C2A, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x264E, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x264F, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x262B, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x262C, SMSG_SEND_SPELL_CHARGES = 0x2C2D, SMSG_SEND_SPELL_HISTORY = 0x2C2B, SMSG_SEND_UNLEARN_SPELLS = 0x2C2E, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x266D, - SMSG_SERVER_TIME = 0x26B1, - SMSG_SERVER_TIME_OFFSET = 0x2759, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x264A, + SMSG_SERVER_TIME = 0x2680, + SMSG_SERVER_TIME_OFFSET = 0x2719, SMSG_SETUP_CURRENCY = 0x2573, SMSG_SETUP_RESEARCH_HISTORY = 0x2586, - SMSG_SET_AI_ANIM_KIT = 0x2775, - SMSG_SET_ALL_TASK_PROGRESS = 0x27D7, - SMSG_SET_ANIM_TIER = 0x2779, - SMSG_SET_CHR_UPGRADE_TIER = 0x25F6, + SMSG_SET_AI_ANIM_KIT = 0x2734, + SMSG_SET_ALL_TASK_PROGRESS = 0x278F, + SMSG_SET_ANIM_TIER = 0x2738, + SMSG_SET_CHR_UPGRADE_TIER = 0x25DB, SMSG_SET_CURRENCY = 0x2574, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E, - SMSG_SET_DUNGEON_DIFFICULTY = 0x26D3, - SMSG_SET_FACTION_AT_WAR = 0x2742, - SMSG_SET_FACTION_NOT_VISIBLE = 0x2770, - SMSG_SET_FACTION_STANDING = 0x2771, - SMSG_SET_FACTION_VISIBLE = 0x276F, + SMSG_SET_DUNGEON_DIFFICULTY = 0x26A2, + SMSG_SET_FACTION_AT_WAR = 0x2703, + SMSG_SET_FACTION_NOT_VISIBLE = 0x272F, + SMSG_SET_FACTION_STANDING = 0x2730, + SMSG_SET_FACTION_VISIBLE = 0x272E, SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, - SMSG_SET_FORCED_REACTIONS = 0x2761, - SMSG_SET_ITEM_PURCHASE_DATA = 0x25B2, - SMSG_SET_LOOT_METHOD_FAILED = 0x2818, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B8, - SMSG_SET_MELEE_ANIM_KIT = 0x2778, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x2777, + SMSG_SET_FORCED_REACTIONS = 0x2722, + SMSG_SET_ITEM_PURCHASE_DATA = 0x25A2, + SMSG_SET_LOOT_METHOD_FAILED = 0x27D2, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25A5, + SMSG_SET_MELEE_ANIM_KIT = 0x2737, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x2736, SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, - SMSG_SET_PET_SPECIALIZATION = 0x2645, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2712, - SMSG_SET_PLAY_HOVER_ANIM = 0x25CD, - SMSG_SET_PROFICIENCY = 0x277A, - SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x28BE, + SMSG_SET_PET_SPECIALIZATION = 0x2622, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x3004, + SMSG_SET_PLAY_HOVER_ANIM = 0x25BB, + SMSG_SET_PROFICIENCY = 0x2739, + SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x2876, + SMSG_SET_SHIPMENT_READY_RESPONSE = 0x298D, SMSG_SET_SPELL_CHARGES = 0x2C29, - SMSG_SET_TASK_COMPLETE = 0x27D8, - SMSG_SET_TIME_ZONE_INFORMATION = 0x26A5, - SMSG_SET_VEHICLE_REC_ID = 0x2735, - SMSG_SHOW_BANK = 0x26AE, - SMSG_SHOW_MAILBOX = 0x27EF, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25F2, - SMSG_SHOW_TAXI_NODES = 0x2700, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27B9, - SMSG_SOCKET_GEMS_FAILURE = 0x276D, - SMSG_SOCKET_GEMS_SUCCESS = 0x276C, - SMSG_SPECIAL_MOUNT_ANIM = 0x26CE, - SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x275D, + SMSG_SET_TASK_COMPLETE = 0x2790, + SMSG_SET_TIME_ZONE_INFORMATION = 0x2675, + SMSG_SET_VEHICLE_REC_ID = 0x26FA, + SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x298E, + SMSG_SHOW_BANK = 0x267D, + SMSG_SHOW_MAILBOX = 0x27A9, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25D7, + SMSG_SHOW_QUEST_COMPLETION_TEXT = 0x2A94, + SMSG_SHOW_TAXI_NODES = 0x26CA, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x2773, + SMSG_SOCKET_GEMS_FAILURE = 0x272C, + SMSG_SOCKET_GEMS_SUCCESS = 0x272B, + SMSG_SPECIAL_MOUNT_ANIM = 0x269D, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x271D, SMSG_SPELL_ABSORB_LOG = 0x2C1F, SMSG_SPELL_CATEGORY_COOLDOWN = 0x2C17, SMSG_SPELL_CHANNEL_START = 0x2C34, @@ -1734,9 +1806,9 @@ enum OpcodeServer : uint16 SMSG_SPELL_DISPELL_LOG = 0x2C1A, SMSG_SPELL_ENERGIZE_LOG = 0x2C1C, SMSG_SPELL_EXECUTE_LOG = 0x2C40, - SMSG_SPELL_FAILED_OTHER = 0x2C54, - SMSG_SPELL_FAILURE = 0x2C52, - SMSG_SPELL_FAILURE_MESSAGE = 0x2C59, + SMSG_SPELL_FAILED_OTHER = 0x2C55, + SMSG_SPELL_FAILURE = 0x2C53, + SMSG_SPELL_FAILURE_MESSAGE = 0x2C5A, SMSG_SPELL_GO = 0x2C39, SMSG_SPELL_HEAL_ABSORB_LOG = 0x2C1E, SMSG_SPELL_HEAL_LOG = 0x2C1D, @@ -1748,116 +1820,122 @@ enum OpcodeServer : uint16 SMSG_SPELL_PERIODIC_AURA_LOG = 0x2C1B, SMSG_SPELL_PREPARE = 0x2C38, SMSG_SPELL_START = 0x2C3A, - SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x25E5, - SMSG_SPIRIT_HEALER_CONFIRM = 0x275A, - SMSG_STAND_STATE_UPDATE = 0x2760, - SMSG_START_ELAPSED_TIMER = 0x261C, - SMSG_START_ELAPSED_TIMERS = 0x261E, - SMSG_START_LIGHTNING_STORM = 0x26D6, - SMSG_START_LOOT_ROLL = 0x2634, - SMSG_START_MIRROR_TIMER = 0x2754, - SMSG_START_TIMER = 0x25BC, - SMSG_STOP_ELAPSED_TIMER = 0x261D, - SMSG_STOP_MIRROR_TIMER = 0x2756, - SMSG_STOP_SPEAKERBOT_SOUND = 0x27B5, - SMSG_STREAMING_MOVIES = 0x25BB, - SMSG_SUMMON_CANCEL = 0x26E1, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x2590, - SMSG_SUMMON_REQUEST = 0x2765, + SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x25CB, + SMSG_SPIRIT_HEALER_CONFIRM = 0x271A, + SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x2888, + SMSG_STAND_STATE_UPDATE = 0x2721, + SMSG_START_ELAPSED_TIMER = 0x2601, + SMSG_START_ELAPSED_TIMERS = 0x2603, + SMSG_START_LIGHTNING_STORM = 0x26A5, + SMSG_START_LOOT_ROLL = 0x261A, + SMSG_START_MIRROR_TIMER = 0x2714, + SMSG_START_TIMER = 0x25A9, + SMSG_STOP_ELAPSED_TIMER = 0x2602, + SMSG_STOP_MIRROR_TIMER = 0x2716, + SMSG_STOP_SPEAKERBOT_SOUND = 0x276F, + SMSG_STREAMING_MOVIES = 0x25A8, + SMSG_SUMMON_CANCEL = 0x26AE, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258F, + SMSG_SUMMON_REQUEST = 0x2726, SMSG_SUPERCEDED_SPELLS = 0x2C4C, SMSG_SUSPEND_COMMS = 0x304A, - SMSG_SUSPEND_TOKEN = 0x25BE, - SMSG_SYNC_WOW_ENTITLEMENTS = 0x28C8, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x275C, - SMSG_TAXI_NODE_STATUS = 0x26AB, - SMSG_TEXT_EMOTE = 0x26A9, - SMSG_THREAT_CLEAR = 0x271A, - SMSG_THREAT_REMOVE = 0x2719, - SMSG_THREAT_UPDATE = 0x2718, - SMSG_TIME_ADJUSTMENT = 0x2DA1, - SMSG_TIME_SYNC_REQUEST = 0x2DA0, - SMSG_TITLE_EARNED = 0x2715, - SMSG_TITLE_LOST = 0x2716, - SMSG_TOTEM_CREATED = 0x26FB, - SMSG_TOTEM_DURATION_CHANGED = 0x26FC, - SMSG_TOTEM_MOVED = 0x26FD, - SMSG_TRADE_STATUS = 0x2583, - SMSG_TRADE_UPDATED = 0x2582, - SMSG_TRAINER_BUY_FAILED = 0x271E, - SMSG_TRAINER_LIST = 0x271D, - SMSG_TRANSFER_ABORTED = 0x2746, - SMSG_TRANSFER_PENDING = 0x25E6, - SMSG_TRANSMOGRIFY_NPC = 0x283A, - SMSG_TREASURE_PICKER_RESPONSE = 0x284D, - SMSG_TRIGGER_CINEMATIC = 0x2810, - SMSG_TRIGGER_MOVIE = 0x26FE, - SMSG_TURN_IN_PETITION_RESULT = 0x2795, - SMSG_TUTORIAL_FLAGS = 0x2802, - SMSG_TWITTER_STATUS = 0x2FFD, - SMSG_UI_HEALING_RANGE_MODIFIED = 0x278A, - SMSG_UI_ITEM_INTERACTION_NPC = 0x283C, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2813, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2814, + SMSG_SUSPEND_TOKEN = 0x25AB, + SMSG_SYNC_WOW_ENTITLEMENTS = 0x2880, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x271C, + SMSG_TAXI_NODE_STATUS = 0x267A, + SMSG_TEXT_EMOTE = 0x2678, + SMSG_THREAT_CLEAR = 0x26E1, + SMSG_THREAT_REMOVE = 0x26E0, + SMSG_THREAT_UPDATE = 0x26DF, + SMSG_TIME_ADJUSTMENT = 0x2DD3, + SMSG_TIME_SYNC_REQUEST = 0x2DD2, + SMSG_TITLE_EARNED = 0x26DC, + SMSG_TITLE_LOST = 0x26DD, + SMSG_TOTEM_CREATED = 0x26C5, + SMSG_TOTEM_DURATION_CHANGED = 0x26C6, + SMSG_TOTEM_MOVED = 0x26C7, + SMSG_TRADE_STATUS = 0x2582, + SMSG_TRADE_UPDATED = 0x2581, + SMSG_TRAINER_BUY_FAILED = 0x26E4, + SMSG_TRAINER_LIST = 0x26E3, + SMSG_TRANSFER_ABORTED = 0x2706, + SMSG_TRANSFER_PENDING = 0x25CC, + SMSG_TRANSMOGRIFY_NPC = 0x27F9, + SMSG_TREASURE_PICKER_RESPONSE = 0x280B, + SMSG_TRIGGER_CINEMATIC = 0x27CA, + SMSG_TRIGGER_MOVIE = 0x26C8, + SMSG_TURN_IN_PETITION_RESULT = 0x2752, + SMSG_TUTORIAL_FLAGS = 0x27BC, + SMSG_TWITTER_STATUS = 0x3043, + SMSG_UI_HEALING_RANGE_MODIFIED = 0x2748, + SMSG_UI_ITEM_INTERACTION_NPC = 0x27FB, + SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0x2AA1, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x27CD, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x27CE, SMSG_UNLEARNED_SPELLS = 0x2C4E, SMSG_UNLOAD_CHILD_MAP = 0x257A, - SMSG_UPDATE_ACCOUNT_DATA = 0x274E, - SMSG_UPDATE_ACTION_BUTTONS = 0x25F7, - SMSG_UPDATE_BNET_SESSION_KEY = 0x286A, - SMSG_UPDATE_CAPTURE_POINT = 0x2598, - SMSG_UPDATE_CELESTIAL_BODY = 0x2866, - SMSG_UPDATE_CHARACTER_FLAGS = 0x2808, - SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x27AF, - SMSG_UPDATE_COOLDOWN = 0x27AE, - SMSG_UPDATE_EXPANSION_LEVEL = 0x2666, - SMSG_UPDATE_GAME_TIME_STATE = 0x286D, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26D8, - SMSG_UPDATE_LAST_INSTANCE = 0x26B7, - SMSG_UPDATE_OBJECT = 0x2811, - SMSG_UPDATE_PRIMARY_SPEC = 0x25EE, - SMSG_UPDATE_TALENT_DATA = 0x25ED, - SMSG_UPDATE_TASK_PROGRESS = 0x27D6, + SMSG_UPDATE_ACCOUNT_DATA = 0x270E, + SMSG_UPDATE_ACTION_BUTTONS = 0x25DC, + SMSG_UPDATE_BNET_SESSION_KEY = 0x2826, + SMSG_UPDATE_CAPTURE_POINT = 0x2929, + SMSG_UPDATE_CELESTIAL_BODY = 0x2822, + SMSG_UPDATE_CHARACTER_FLAGS = 0x27C2, + SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x2769, + SMSG_UPDATE_COOLDOWN = 0x2768, + SMSG_UPDATE_DAILY_MISSION_COUNTER = 0x2975, + SMSG_UPDATE_EXPANSION_LEVEL = 0x2643, + SMSG_UPDATE_GAME_TIME_STATE = 0x2829, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26A7, + SMSG_UPDATE_LAST_INSTANCE = 0x2686, + SMSG_UPDATE_OBJECT = 0x27CB, + SMSG_UPDATE_PRIMARY_SPEC = 0x25D4, + SMSG_UPDATE_TALENT_DATA = 0x25D3, + SMSG_UPDATE_TASK_PROGRESS = 0x278E, SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19, - SMSG_UPDATE_WORLD_STATE = 0x278F, + SMSG_UPDATE_WORLD_STATE = 0x274C, SMSG_USERLIST_ADD = 0x2BB9, SMSG_USERLIST_REMOVE = 0x2BBA, SMSG_USERLIST_UPDATE = 0x2BBB, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x2796, - SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x2861, - SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x285F, - SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x285E, - SMSG_VAS_PURCHASE_COMPLETE = 0x2836, - SMSG_VAS_PURCHASE_STATE_UPDATE = 0x2835, - SMSG_VENDOR_INVENTORY = 0x25CB, - SMSG_VIGNETTE_UPDATE = 0x27B7, - SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x2865, - SMSG_VOICE_LOGIN_RESPONSE = 0x2864, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25E0, - SMSG_VOID_STORAGE_CONTENTS = 0x25DD, - SMSG_VOID_STORAGE_FAILED = 0x25DC, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x25DE, - SMSG_VOID_TRANSFER_RESULT = 0x25DF, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x2753, + SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x281D, + SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x281B, + SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x281A, + SMSG_VAS_PURCHASE_COMPLETE = 0x27F5, + SMSG_VAS_PURCHASE_STATE_UPDATE = 0x27F4, + SMSG_VENDOR_INVENTORY = 0x25B9, + SMSG_VIGNETTE_UPDATE = 0x3009, + SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x2821, + SMSG_VOICE_LOGIN_RESPONSE = 0x2820, + SMSG_VOID_ITEM_SWAP_RESPONSE = 0x2DA4, + SMSG_VOID_STORAGE_CONTENTS = 0x2DA1, + SMSG_VOID_STORAGE_FAILED = 0x2DA0, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x2DA2, + SMSG_VOID_TRANSFER_RESULT = 0x2DA3, SMSG_WAIT_QUEUE_FINISH = 0x256F, SMSG_WAIT_QUEUE_UPDATE = 0x256E, SMSG_WARDEN3_DATA = 0x2577, - SMSG_WARDEN3_DISABLED = 0x2868, - SMSG_WARDEN3_ENABLED = 0x2867, - SMSG_WARFRONT_COMPLETE = 0x27A8, - SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B5, - SMSG_WEATHER = 0x26D5, + SMSG_WARDEN3_DISABLED = 0x2824, + SMSG_WARDEN3_ENABLED = 0x2823, + SMSG_WARFRONT_COMPLETE = 0x2762, + SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x2932, + SMSG_WEATHER = 0x26A4, + SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x288B, + SMSG_WEEKLY_REWARDS_RESULT = 0x2889, + SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x288A, SMSG_WEEKLY_SPELL_USAGE = 0x2C18, SMSG_WHO = 0x2BAE, - SMSG_WHO_IS = 0x26D4, - SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x286C, - SMSG_WORLD_MAP_OPEN_NPC = 0x2839, - SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x284E, - SMSG_WORLD_SERVER_INFO = 0x25C3, - SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x28C9, - SMSG_XP_GAIN_ABORTED = 0x25E1, - SMSG_XP_GAIN_ENABLED = 0x27F2, + SMSG_WHO_IS = 0x26A3, + SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x2828, + SMSG_WORLD_MAP_OPEN_NPC = 0x27F8, + SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x3010, + SMSG_WORLD_SERVER_INFO = 0x25B0, + SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x2881, + SMSG_XP_GAIN_ABORTED = 0x25C8, + SMSG_XP_GAIN_ENABLED = 0x27AC, SMSG_ZONE_UNDER_ATTACK = 0x2BB5, // Opcodes that are not generated automatically - SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x25C6, // no client handler + SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x25B3, // no client handler SMSG_COMPRESSED_PACKET = 0x3052, SMSG_MULTIPLE_PACKETS = 0x3051, diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index d909511a100..74119b46016 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1350,16 +1350,15 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co case CMSG_CREATE_CHARACTER: // 7 5 3 async db queries case CMSG_ENUM_CHARACTERS: // 22 3 2 async db queries case CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT: // 22 3 2 async db queries - case CMSG_SUPPORT_TICKET_SUBMIT_BUG: // not profiled 1 async db query - case CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION: // not profiled 1 async db query + case CMSG_SUBMIT_USER_FEEDBACK: // not profiled 1 async db query case CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT: // not profiled 1 async db query case CMSG_CALENDAR_UPDATE_EVENT: // not profiled case CMSG_CALENDAR_REMOVE_EVENT: // not profiled case CMSG_CALENDAR_COPY_EVENT: // not profiled - case CMSG_CALENDAR_EVENT_INVITE: // not profiled + case CMSG_CALENDAR_INVITE: // not profiled case CMSG_CALENDAR_EVENT_SIGN_UP: // not profiled - case CMSG_CALENDAR_EVENT_RSVP: // not profiled - case CMSG_CALENDAR_EVENT_MODERATOR_STATUS: // not profiled + case CMSG_CALENDAR_RSVP: // not profiled + case CMSG_CALENDAR_MODERATOR_STATUS: // not profiled case CMSG_CALENDAR_REMOVE_INVITE: // not profiled case CMSG_SET_LOOT_METHOD: // not profiled case CMSG_GUILD_INVITE_BY_NAME: // not profiled diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 2e08b3b77fd..5f990c35e52 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -158,7 +158,7 @@ namespace WorldPackets class RequestBattlefieldStatus; class ReportPvPPlayerAFK; class RequestPVPRewards; - class RequestRatedBattlefieldInfo; + class RequestRatedPvpInfo; } namespace Battlenet @@ -190,15 +190,15 @@ namespace WorldPackets { class CalendarAddEvent; class CalendarCopyEvent; - class CalendarEventInvite; - class CalendarEventModeratorStatus; - class CalendarEventRSVP; + class CalendarInvite; + class CalendarModeratorStatusQuery; + class CalendarRSVP; class CalendarEventSignUp; - class CalendarEventStatus; + class CalendarStatus; class CalendarGetCalendar; class CalendarGetEvent; class CalendarGetNumPending; - class CalendarCommunityFilter; + class CalendarCommunityInviteRequest; class CalendarRemoveEvent; class CalendarRemoveInvite; class CalendarUpdateEvent; @@ -221,6 +221,7 @@ namespace WorldPackets class CharacterRenameRequest; class CharCustomize; class CharRaceOrFactionChange; + class CheckCharacterNameAvailability; class GenerateRandomCharacterName; class GetUndeleteCharacterCooldownStatus; class ReorderCharacters; @@ -311,7 +312,7 @@ namespace WorldPackets class GarrisonPurchaseBuilding; class GarrisonCancelConstruction; class GarrisonRequestBlueprintAndSpecializationData; - class GarrisonGetBuildingLandmarks; + class GarrisonGetMapData; } namespace Guild @@ -702,8 +703,7 @@ namespace WorldPackets { class GMTicketGetSystemStatus; class GMTicketGetCaseStatus; - class SupportTicketSubmitBug; - class SupportTicketSubmitSuggestion; + class SubmitUserFeedback; class SupportTicketSubmitComplaint; class BugReport; class Complaint; @@ -1130,6 +1130,7 @@ class TC_GAME_API WorldSession void AbortLogin(WorldPackets::Character::LoginFailureReason reason); void HandleLoadScreenOpcode(WorldPackets::Character::LoadingScreenNotify& loadingScreenNotify); void HandlePlayerLogin(LoginQueryHolder* holder); + void HandleCheckCharacterNameAvailability(WorldPackets::Character::CheckCharacterNameAvailability& checkCharacterNameAvailability); void HandleCharRenameOpcode(WorldPackets::Character::CharacterRenameRequest& request); void HandleCharRenameCallBack(std::shared_ptr<WorldPackets::Character::CharacterRenameInfo> renameInfo, PreparedQueryResult result); void HandleSetPlayerDeclinedNames(WorldPackets::Character::SetPlayerDeclinedNames& packet); @@ -1197,8 +1198,7 @@ class TC_GAME_API WorldSession // GM Ticket opcodes void HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTicketGetCaseStatus& packet); void HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTicketGetSystemStatus& packet); - void HandleSupportTicketSubmitBug(WorldPackets::Ticket::SupportTicketSubmitBug& packet); - void HandleSupportTicketSubmitSuggestion(WorldPackets::Ticket::SupportTicketSubmitSuggestion& packet); + void HandleSubmitUserFeedback(WorldPackets::Ticket::SubmitUserFeedback& userFeedback); void HandleSupportTicketSubmitComplaint(WorldPackets::Ticket::SupportTicketSubmitComplaint& packet); void HandleBugReportOpcode(WorldPackets::Ticket::BugReport& bugReport); void HandleComplaint(WorldPackets::Ticket::Complaint& packet); @@ -1539,7 +1539,7 @@ class TC_GAME_API WorldSession void HandleBattlefieldLeaveOpcode(WorldPackets::Battleground::BattlefieldLeave& battlefieldLeave); void HandleBattlemasterJoinArena(WorldPackets::Battleground::BattlemasterJoinArena& packet); void HandleReportPvPAFK(WorldPackets::Battleground::ReportPvPPlayerAFK& reportPvPPlayerAFK); - void HandleRequestRatedBattlefieldInfo(WorldPackets::Battleground::RequestRatedBattlefieldInfo& packet); + void HandleRequestRatedPvpInfo(WorldPackets::Battleground::RequestRatedPvpInfo& packet); void HandleGetPVPOptionsEnabled(WorldPackets::Battleground::GetPVPOptionsEnabled& getPvPOptionsEnabled); void HandleRequestPvpReward(WorldPackets::Battleground::RequestPVPRewards& packet); void HandleAreaSpiritHealerQueryOpcode(WorldPackets::Battleground::AreaSpiritHealerQuery& areaSpiritHealerQuery); @@ -1628,16 +1628,16 @@ class TC_GAME_API WorldSession // Calendar void HandleCalendarGetCalendar(WorldPackets::Calendar::CalendarGetCalendar& calendarGetCalendar); void HandleCalendarGetEvent(WorldPackets::Calendar::CalendarGetEvent& calendarGetEvent); - void HandleCalendarCommunityFilter(WorldPackets::Calendar::CalendarCommunityFilter& calendarCommunityFilter); + void HandleCalendarCommunityInvite(WorldPackets::Calendar::CalendarCommunityInviteRequest& calendarCommunityInvite); void HandleCalendarAddEvent(WorldPackets::Calendar::CalendarAddEvent& calendarAddEvent); void HandleCalendarUpdateEvent(WorldPackets::Calendar::CalendarUpdateEvent& calendarUpdateEvent); void HandleCalendarRemoveEvent(WorldPackets::Calendar::CalendarRemoveEvent& calendarRemoveEvent); void HandleCalendarCopyEvent(WorldPackets::Calendar::CalendarCopyEvent& calendarCopyEvent); - void HandleCalendarEventInvite(WorldPackets::Calendar::CalendarEventInvite& calendarEventInvite); - void HandleCalendarEventRsvp(WorldPackets::Calendar::CalendarEventRSVP& calendarEventRSVP); + void HandleCalendarInvite(WorldPackets::Calendar::CalendarInvite& calendarEventInvite); + void HandleCalendarRsvp(WorldPackets::Calendar::CalendarRSVP& calendarRSVP); void HandleCalendarEventRemoveInvite(WorldPackets::Calendar::CalendarRemoveInvite& calendarRemoveInvite); - void HandleCalendarEventStatus(WorldPackets::Calendar::CalendarEventStatus& calendarEventStatus); - void HandleCalendarEventModeratorStatus(WorldPackets::Calendar::CalendarEventModeratorStatus& calendarEventModeratorStatus); + void HandleCalendarStatus(WorldPackets::Calendar::CalendarStatus& calendarStatus); + void HandleCalendarModeratorStatus(WorldPackets::Calendar::CalendarModeratorStatusQuery& calendarModeratorStatus); void HandleCalendarComplain(WorldPackets::Calendar::CalendarComplain& calendarComplain); void HandleCalendarGetNumPending(WorldPackets::Calendar::CalendarGetNumPending& calendarGetNumPending); void HandleCalendarEventSignup(WorldPackets::Calendar::CalendarEventSignUp& calendarEventSignUp); @@ -1700,7 +1700,7 @@ class TC_GAME_API WorldSession void HandleGarrisonPurchaseBuilding(WorldPackets::Garrison::GarrisonPurchaseBuilding& garrisonPurchaseBuilding); void HandleGarrisonCancelConstruction(WorldPackets::Garrison::GarrisonCancelConstruction& garrisonCancelConstruction); void HandleGarrisonRequestBlueprintAndSpecializationData(WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationData& garrisonRequestBlueprintAndSpecializationData); - void HandleGarrisonGetBuildingLandmarks(WorldPackets::Garrison::GarrisonGetBuildingLandmarks& garrisonGetBuildingLandmarks); + void HandleGarrisonGetMapData(WorldPackets::Garrison::GarrisonGetMapData& garrisonGetMapData); // Battle Pets void HandleBattlePetRequestJournal(WorldPackets::BattlePet::BattlePetRequestJournal& battlePetRequestJournal); diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 6e9a88887c9..469ac69186e 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -178,7 +178,7 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo WorldPackets::Spells::AuraDataInfo& auraData = auraInfo.AuraData.get(); auraData.CastID = aura->GetCastGUID(); auraData.SpellID = aura->GetId(); - auraData.SpellXSpellVisualID = aura->GetSpellXSpellVisualId(); + auraData.Visual.SpellXSpellVisualID = aura->GetSpellXSpellVisualId(); auraData.Flags = GetFlags(); if (aura->GetMaxDuration() > 0 && !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_HIDE_DURATION)) auraData.Flags |= AFLAG_DURATION; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c7678330cec..818307d47cd 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -3994,7 +3994,7 @@ void Spell::SendCastResult(SpellCastResult result, uint32* param1 /*= nullptr*/, result = SPELL_FAILED_DONT_REPORT; WorldPackets::Spells::CastFailed castFailed; - castFailed.SpellXSpellVisualID = m_SpellVisual; + castFailed.Visual.SpellXSpellVisualID = m_SpellVisual; FillSpellCastFailedArgs(castFailed, m_castId, m_spellInfo, result, m_customError, param1, param2, m_caster->ToPlayer()); m_caster->ToPlayer()->SendDirectMessage(castFailed.Write()); } @@ -4022,7 +4022,7 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint32 sp return; WorldPackets::Spells::CastFailed packet; - packet.SpellXSpellVisualID = spellVisual; + packet.Visual.SpellXSpellVisualID = spellVisual; FillSpellCastFailedArgs(packet, cast_count, spellInfo, result, customError, param1, param2, caster); caster->SendDirectMessage(packet.Write()); } @@ -4083,7 +4083,7 @@ void Spell::SendSpellStart() castData.CastID = m_castId; castData.OriginalCastID = m_originalCastId; castData.SpellID = m_spellInfo->Id; - castData.SpellXSpellVisualID = m_SpellVisual; + castData.Visual.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; castData.CastFlagsEx = m_castFlagsEx; castData.CastTime = m_casttime; @@ -4199,7 +4199,7 @@ void Spell::SendSpellGo() castData.CastID = m_castId; castData.OriginalCastID = m_originalCastId; castData.SpellID = m_spellInfo->Id; - castData.SpellXSpellVisualID = m_SpellVisual; + castData.Visual.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; castData.CastFlagsEx = m_castFlagsEx; castData.CastTime = getMSTime(); @@ -4476,7 +4476,7 @@ void Spell::SendInterrupted(uint8 result) failurePacket.CasterUnit = m_caster->GetGUID(); failurePacket.CastID = m_castId; failurePacket.SpellID = m_spellInfo->Id; - failurePacket.SpellXSpellVisualID = m_SpellVisual; + failurePacket.Visual.SpellXSpellVisualID = m_SpellVisual; failurePacket.Reason = result; m_caster->SendMessageToSet(failurePacket.Write(), true); @@ -4484,6 +4484,7 @@ void Spell::SendInterrupted(uint8 result) failedPacket.CasterUnit = m_caster->GetGUID(); failedPacket.CastID = m_castId; failedPacket.SpellID = m_spellInfo->Id; + failedPacket.Visual.SpellXSpellVisualID = m_SpellVisual; failedPacket.Reason = result; m_caster->SendMessageToSet(failedPacket.Write(), true); } @@ -4508,7 +4509,7 @@ void Spell::SendChannelStart(uint32 duration) WorldPackets::Spells::SpellChannelStart spellChannelStart; spellChannelStart.CasterGUID = m_caster->GetGUID(); spellChannelStart.SpellID = m_spellInfo->Id; - spellChannelStart.SpellXSpellVisualID = m_SpellVisual; + spellChannelStart.Visual.SpellXSpellVisualID = m_SpellVisual; spellChannelStart.ChannelDuration = duration; m_caster->SendMessageToSet(spellChannelStart.Write(), true); diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index bb18e09b6cb..40df5986092 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -328,12 +328,12 @@ public: if (QuestPOIData const* poiData = sObjectMgr->GetQuestPOIData(questID)) { - auto data = poiData->QuestPOIBlobDataStats.front(); + QuestPOIBlobData const& data = poiData->Blobs.front(); mapId = data.MapID; - x = data.QuestPOIBlobPointStats.front().X; - y = data.QuestPOIBlobPointStats.front().Y; + x = data.Points.front().X; + y = data.Points.front().Y; } else { |