Core/PacketIO: Updated most packet structures to 9.0.1

This commit is contained in:
Shauren
2020-12-08 18:16:41 +01:00
parent 16b39a448a
commit cab4c87d2d
101 changed files with 3154 additions and 2553 deletions
@@ -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;
+3 -1
View File
@@ -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);
+6
View File
@@ -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;
+3 -1
View File
@@ -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*/) { }
+13 -13
View File
@@ -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);
}
}
@@ -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;
@@ -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();
}
@@ -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
-4
View File
@@ -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())
{
+5 -5
View File
@@ -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
+1 -1
View File
@@ -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; }
+1 -1
View File
@@ -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
+9 -7
View File
@@ -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;
+5 -5
View File
@@ -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
@@ -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());
+21 -21
View File
@@ -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);
}
+35 -34
View File
@@ -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());
+2 -2
View File
@@ -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);
}
+1 -1
View File
@@ -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);
}
+5 -5
View File
@@ -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);
}
}
+1 -1
View File
@@ -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());
+20 -13
View File
@@ -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:
+2 -7
View File
@@ -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);
+21 -19
View File
@@ -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;
if (userFeedback.IsSuggestion)
{
if (!sSupportMgr->GetSuggestionSystemStatus())
return;
BugTicket* ticket = new BugTicket(GetPlayer());
ticket->SetPosition(packet.Header.MapID, packet.Header.Position);
ticket->SetFacing(packet.Header.Facing);
ticket->SetNote(packet.Note);
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);
}
sSupportMgr->AddTicket(ticket);
}
else
{
if (!sSupportMgr->GetBugSystemStatus())
return;
void WorldSession::HandleSupportTicketSubmitSuggestion(WorldPackets::Ticket::SupportTicketSubmitSuggestion& packet)
{
if (!sSupportMgr->GetSuggestionSystemStatus())
return;
BugTicket* ticket = new BugTicket(GetPlayer());
ticket->SetPosition(userFeedback.Header.MapID, userFeedback.Header.Position);
ticket->SetFacing(userFeedback.Header.Facing);
ticket->SetNote(userFeedback.Note);
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);
sSupportMgr->AddTicket(ticket);
}
}
void WorldSession::HandleSupportTicketSubmitComplaint(WorldPackets::Ticket::SupportTicketSubmitComplaint& packet)
+6
View File
@@ -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
@@ -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
@@ -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);
@@ -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)
}
@@ -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; }
@@ -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;
@@ -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>
+1
View File
@@ -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; }
+7 -7
View File
@@ -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;
@@ -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;
@@ -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;
};
}
@@ -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;
}
@@ -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;
};
@@ -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();
}
@@ -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__
@@ -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;
@@ -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;
}
@@ -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 { }
};
@@ -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;
@@ -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;
@@ -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;
@@ -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;
}
}
}
@@ -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
@@ -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());
@@ -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;
}
@@ -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
@@ -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);
@@ -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;
@@ -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
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<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())
{
template<class T, class U>
bool ContentTuningParams::GenerateDataForUnits(T* /*attacker*/, U* /*target*/)
if (Player* playerTarget = target->ToPlayer())
return GenerateDataForUnits(playerAttacker, playerTarget);
else if (Creature* creatureTarget = target->ToCreature())
{
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<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())
{
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 (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;
}
ByteBuffer& WorldPackets::CombatLog::CombatLogServerPacket::WriteLogData()
{
return _fullLogPacket << LogData;
}
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;
}
@@ -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__
@@ -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);
@@ -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, WorldPackets::Garrison::GarrisonInfo const& garrison)
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, 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;
}
}
}
@@ -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
@@ -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);
@@ -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;
@@ -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();
@@ -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;
};
@@ -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;
@@ -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);
};
@@ -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()
@@ -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
{
ItemID = item->GetEntry();
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();
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(itemInstance.ItemID);
data.WriteBit(itemInstance.ItemBonus.is_initialized());
data.WriteBit(itemInstance.Modifications.is_initialized());
data.FlushBits();
if (itemInstance.ItemBonus)
data << *itemInstance.ItemBonus;
if (itemInstance.Modifications)
data << *itemInstance.Modifications;
data << int32(itemMod.Value);
data << uint8(itemMod.Type);
return data;
}
ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance)
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.FlushBits();
data << itemInstance.Modifications;
if (itemInstance.ItemBonus)
data << *itemInstance.ItemBonus;
return data;
}
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;
}
}
}
@@ -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);
namespace WorldPackets
{
namespace Item
{
ByteBuffer& operator<<(ByteBuffer& data, ItemInstance const& itemInstance);
ByteBuffer& operator>>(ByteBuffer& data, ItemInstance& itemInstance);
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance);
ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance);
ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData);
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemEnchantData const& itemEnchantData);
ByteBuffer& operator<<(ByteBuffer& data, ItemGemData const& itemGemInstanceData);
ByteBuffer& operator>>(ByteBuffer& data, ItemGemData& itemGemInstanceData);
ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemGemData const& itemGemInstanceData);
ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemGemData& itemGemInstanceData);
ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::InvUpdate& invUpdate);
ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate);
}
}
#endif // ItemPacketsCommon_h__
+2 -22
View File
@@ -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)
+9 -26
View File
@@ -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)
{
+10 -8
View File
@@ -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>());
+5 -11
View File
@@ -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:
@@ -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;
}
@@ -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
+61 -28
View File
@@ -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;
}
}
}
+21 -2
View File
@@ -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;
};
@@ -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);
}
@@ -90,101 +90,16 @@ namespace WorldPackets
_storage.push_back(std::forward<value_type>(value));
}
template<typename... Args>
T& emplace_back(Args&&... args)
{
_storage.emplace_back(std::forward<Args>(args)...);
return _storage.back();
}
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()
{
_mask = 0;
_contents.clear();
}
bool operator==(CompactArray const& r) const
{
if (_mask != r._mask)
return false;
return _contents == r._contents;
}
bool operator!=(CompactArray const& r) const { return !(*this == r); }
private:
uint32 _mask;
std::vector<T> _contents;
};
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__
+14 -12
View File
@@ -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;
+13 -6
View File
@@ -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
@@ -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);
@@ -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;
+114 -74
View File
@@ -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;
}
}
}
+40 -35
View File
@@ -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__
@@ -25,7 +25,7 @@ namespace WorldPackets
{
namespace Reputation
{
static uint16 const FactionCount = 350;
static uint16 const FactionCount = 400;
class InitializeFactions final : public ServerPacket
{
@@ -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);
}
}
}
@@ -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;
}
+43 -14
View File
@@ -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;
}
+33 -16
View File
@@ -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
@@ -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;
}
}
}
+27 -20
View File
@@ -26,27 +26,27 @@ namespace WorldPackets
{
namespace System
{
struct SavedThrottleObjectState
{
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;
SavedThrottleObjectState ThrottleState;
};
class FeatureSystemStatus final : public ServerPacket
{
public:
struct SavedThrottleObjectState
{
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;
SavedThrottleObjectState ThrottleState;
};
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
@@ -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) :
+3 -13
View File
@@ -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
@@ -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;
}
@@ -31,6 +31,7 @@ namespace WorldPackets
int32 ItemModifiedAppearanceID = 0;
uint32 Slot = 0;
int32 SpellItemEnchantmentID = 0;
int32 SecondaryItemModifiedAppearanceID = 0;
};
class TransmogrifyItems final : public ClientPacket
@@ -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;
+150 -69
View File
@@ -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);
File diff suppressed because it is too large Load Diff
+4 -5
View File
@@ -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
+18 -18
View File
@@ -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);
+1 -1
View File
@@ -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;
+7 -6
View File
@@ -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);

Some files were not shown because too many files have changed in this diff Show More