aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp138
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h5
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedGossip.cpp8
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedGossip.h4
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp105
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.cpp4
-rw-r--r--src/server/game/AuctionHouse/AuctionHouseMgr.h2
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp42
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h149
-rw-r--r--src/server/game/DataStores/DB2Metadata.h1790
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp30
-rw-r--r--src/server/game/DataStores/DB2Stores.h1
-rw-r--r--src/server/game/DataStores/DB2Structure.h124
-rw-r--r--src/server/game/DataStores/DBCEnums.h164
-rw-r--r--src/server/game/DataStores/GameTables.h15
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp6
-rw-r--r--src/server/game/Entities/Creature/GossipDef.cpp216
-rw-r--r--src/server/game/Entities/Creature/GossipDef.h125
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp25
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h19
-rw-r--r--src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp2
-rw-r--r--src/server/game/Entities/Item/Item.cpp34
-rw-r--r--src/server/game/Entities/Item/Item.h1
-rw-r--r--src/server/game/Entities/Item/ItemDefines.h5
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h62
-rw-r--r--src/server/game/Entities/Item/enuminfo_ItemDefines.cpp17
-rw-r--r--src/server/game/Entities/Object/MovementInfo.h13
-rw-r--r--src/server/game/Entities/Object/Object.cpp44
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp1534
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h761
-rw-r--r--src/server/game/Entities/Player/CollectionMgr.cpp6
-rw-r--r--src/server/game/Entities/Player/Player.cpp373
-rw-r--r--src/server/game/Entities/Player/Player.h94
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp12
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp5
-rw-r--r--src/server/game/Entities/Unit/Unit.h3
-rw-r--r--src/server/game/Entities/Unit/UnitDefines.h2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp217
-rw-r--r--src/server/game/Globals/ObjectMgr.h28
-rw-r--r--src/server/game/Groups/Group.h1
-rw-r--r--src/server/game/Handlers/AuthHandler.cpp1
-rw-r--r--src/server/game/Handlers/AzeriteHandler.cpp7
-rw-r--r--src/server/game/Handlers/BankHandler.cpp20
-rw-r--r--src/server/game/Handlers/BlackMarketHandler.cpp11
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp96
-rw-r--r--src/server/game/Handlers/ChatHandler.cpp6
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp4
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp37
-rw-r--r--src/server/game/Handlers/TransmogrificationHandler.cpp7
-rw-r--r--src/server/game/Handlers/VoidStorageHandler.cpp2
-rw-r--r--src/server/game/Loot/Loot.h11
-rw-r--r--src/server/game/Loot/LootItemStorage.h2
-rw-r--r--src/server/game/Maps/TransportMgr.cpp23
-rw-r--r--src/server/game/Maps/TransportMgr.h1
-rw-r--r--src/server/game/Miscellaneous/RaceMask.h76
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2408
-rw-r--r--src/server/game/Miscellaneous/enuminfo_RaceMask.cpp8
-rw-r--r--src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp71
-rw-r--r--src/server/game/Quests/QuestDef.cpp94
-rw-r--r--src/server/game/Quests/QuestDef.h29
-rw-r--r--src/server/game/Reputation/ReputationMgr.cpp1
-rw-r--r--src/server/game/Server/Packets/AuctionHousePackets.cpp4
-rw-r--r--src/server/game/Server/Packets/AuctionHousePackets.h2
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.cpp3
-rw-r--r--src/server/game/Server/Packets/AuthenticationPackets.h2
-rw-r--r--src/server/game/Server/Packets/AzeritePackets.cpp14
-rw-r--r--src/server/game/Server/Packets/AzeritePackets.h28
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.cpp5
-rw-r--r--src/server/game/Server/Packets/BattlegroundPackets.h5
-rw-r--r--src/server/game/Server/Packets/BlackMarketPackets.cpp9
-rw-r--r--src/server/game/Server/Packets/BlackMarketPackets.h11
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h23
-rw-r--r--src/server/game/Server/Packets/ChatPackets.cpp12
-rw-r--r--src/server/game/Server/Packets/CraftingPacketsCommon.cpp61
-rw-r--r--src/server/game/Server/Packets/CraftingPacketsCommon.h59
-rw-r--r--src/server/game/Server/Packets/GameObjectPackets.cpp24
-rw-r--r--src/server/game/Server/Packets/GameObjectPackets.h35
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.cpp9
-rw-r--r--src/server/game/Server/Packets/GarrisonPackets.h12
-rw-r--r--src/server/game/Server/Packets/InspectPackets.cpp55
-rw-r--r--src/server/game/Server/Packets/InspectPackets.h40
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp13
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h6
-rw-r--r--src/server/game/Server/Packets/ItemPacketsCommon.cpp42
-rw-r--r--src/server/game/Server/Packets/ItemPacketsCommon.h40
-rw-r--r--src/server/game/Server/Packets/LootPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/LootPackets.h4
-rw-r--r--src/server/game/Server/Packets/MailPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/MailPackets.h10
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp36
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h19
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp34
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h9
-rw-r--r--src/server/game/Server/Packets/MythicPlusPacketsCommon.h1
-rw-r--r--src/server/game/Server/Packets/NPCPackets.cpp141
-rw-r--r--src/server/game/Server/Packets/NPCPackets.h74
-rw-r--r--src/server/game/Server/Packets/PacketUtilities.h5
-rw-r--r--src/server/game/Server/Packets/QuestPackets.cpp46
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h21
-rw-r--r--src/server/game/Server/Packets/ReputationPackets.cpp3
-rw-r--r--src/server/game/Server/Packets/ReputationPackets.h16
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp269
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h55
-rw-r--r--src/server/game/Server/Packets/SystemPackets.cpp19
-rw-r--r--src/server/game/Server/Packets/SystemPackets.h8
-rw-r--r--src/server/game/Server/Packets/TraitPacketsCommon.cpp65
-rw-r--r--src/server/game/Server/Packets/TraitPacketsCommon.h53
-rw-r--r--src/server/game/Server/Packets/TransmogrificationPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/TransmogrificationPackets.h10
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp144
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h2199
-rw-r--r--src/server/game/Spells/Auras/SpellAuraDefines.h28
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp26
-rw-r--r--src/server/game/Spells/Spell.cpp37
-rw-r--r--src/server/game/Spells/Spell.h5
-rw-r--r--src/server/game/Spells/SpellEffects.cpp134
-rw-r--r--src/server/game/Spells/SpellHistory.cpp22
-rw-r--r--src/server/game/Spells/SpellHistory.h17
-rw-r--r--src/server/game/Spells/SpellInfo.cpp55
-rw-r--r--src/server/game/Spells/SpellInfo.h5
-rw-r--r--src/server/game/Spells/SpellMgr.cpp100
-rw-r--r--src/server/game/World/World.cpp15
-rw-r--r--src/server/game/World/World.h2
-rw-r--r--src/server/scripts/Spells/spell_generic.cpp6
-rw-r--r--src/server/worldserver/worldserver.conf.dist21
-rw-r--r--src/tools/extractor_common/ExtractorDB2LoadInfo.h24
-rw-r--r--src/tools/map_extractor/loadlib/DBFilesClientList.h85
128 files changed, 8870 insertions, 4608 deletions
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp
index 3af206c0644..88b8ad18193 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp
@@ -238,7 +238,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// BattlePetBreedQuality.db2
- PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, StateMultiplier, QualityEnum FROM battle_pet_breed_quality"
+ PrepareStatement(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT ID, MaxQualityRoll, StateMultiplier, QualityEnum FROM battle_pet_breed_quality"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_BATTLE_PET_BREED_QUALITY, "SELECT MAX(ID) + 1 FROM battle_pet_breed_quality", CONNECTION_SYNCH);
@@ -293,7 +293,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" AND locale = ?", CONNECTION_SYNCH);
// CharacterLoadout.db2
- PrepareStatement(HOTFIX_SEL_CHARACTER_LOADOUT, "SELECT ID, RaceMask, ChrClassID, Purpose, Unused910 FROM character_loadout"
+ PrepareStatement(HOTFIX_SEL_CHARACTER_LOADOUT, "SELECT ID, RaceMask, ChrClassID, Purpose, ItemContext FROM character_loadout"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHARACTER_LOADOUT, "SELECT MAX(ID) + 1 FROM character_loadout", CONNECTION_SYNCH);
@@ -334,8 +334,9 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT MAX(ID) + 1 FROM chr_classes_x_power_types", CONNECTION_SYNCH);
// ChrCustomizationChoice.db2
- PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, SortOrder, UiOrderIndex, "
- "Flags, AddedInPatch, SwatchColor1, SwatchColor2 FROM chr_customization_choice WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT Name, ID, ChrCustomizationOptionID, ChrCustomizationReqID, "
+ "ChrCustomizationVisReqID, SortOrder, UiOrderIndex, Flags, AddedInPatch, SwatchColor1, SwatchColor2 FROM chr_customization_choice"
+ " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT MAX(ID) + 1 FROM chr_customization_choice", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_CHOICE, "SELECT ID, Name_lang FROM chr_customization_choice_locale"
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
@@ -348,7 +349,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// ChrCustomizationElement.db2
PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT ID, ChrCustomizationChoiceID, RelatedChrCustomizationChoiceID, "
"ChrCustomizationGeosetID, ChrCustomizationSkinnedModelID, ChrCustomizationMaterialID, ChrCustomizationBoneSetID, "
- "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID FROM chr_customization_element"
+ "ChrCustomizationCondModelID, ChrCustomizationDisplayInfoID, ChrCustItemGeoModifyID, ChrCustomizationVoiceID FROM chr_customization_element"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT, "SELECT MAX(ID) + 1 FROM chr_customization_element", CONNECTION_SYNCH);
@@ -361,9 +362,11 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// ChrCustomizationReq.db2
- PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, Flags, ClassMask, AchievementID, OverrideArchive, ItemModifiedAppearanceID"
- " FROM chr_customization_req WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, ReqSource, Flags, ClassMask, AchievementID, QuestID, OverrideArchive, "
+ "ItemModifiedAppearanceID FROM chr_customization_req WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ, "SELECT MAX(ID) + 1 FROM chr_customization_req", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ, "SELECT ID, ReqSource_lang FROM chr_customization_req_locale WHERE (`VerifiedBuild` > 0) = ?"
+ " AND locale = ?", CONNECTION_SYNCH);
// ChrCustomizationReqChoice.db2
PrepareStatement(HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE, "SELECT ID, ChrCustomizationChoiceID, ChrCustomizationReqID"
@@ -378,7 +381,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_MODEL, "SELECT MAX(ID) + 1 FROM chr_model", CONNECTION_SYNCH);
// ChrRaceXChrModel.db2
- PrepareStatement(HOTFIX_SEL_CHR_RACE_X_CHR_MODEL, "SELECT ID, ChrRacesID, ChrModelID FROM chr_race_x_chr_model WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_CHR_RACE_X_CHR_MODEL, "SELECT ID, ChrRacesID, ChrModelID, Sex, AllowedTransmogSlots FROM chr_race_x_chr_model"
+ " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_RACE_X_CHR_MODEL, "SELECT MAX(ID) + 1 FROM chr_race_x_chr_model", CONNECTION_SYNCH);
// ChrRaces.db2
@@ -391,7 +395,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"MaleModelFallbackRaceID, FemaleModelFallbackRaceID, MaleTextureFallbackRaceID, FemaleTextureFallbackRaceID, PlayableRaceBit, "
"HelmetAnimScalingRaceID, TransmogrifyDisabledSlotMask, UnalteredVisualCustomizationRaceID, AlteredFormCustomizeOffsetFallback1, "
"AlteredFormCustomizeOffsetFallback2, AlteredFormCustomizeOffsetFallback3, AlteredFormCustomizeRotationFallback, Unknown910_11, "
- "Unknown910_12, Unknown910_13, Unknown910_21, Unknown910_22, Unknown910_23, BaseLanguage, CreatureType, MaleModelFallbackSex, "
+ "Unknown910_12, Unknown910_13, Unknown910_21, Unknown910_22, Unknown910_23, Unknown1000, BaseLanguage, CreatureType, MaleModelFallbackSex, "
"FemaleModelFallbackSex, MaleTextureFallbackSex, FemaleTextureFallbackSex FROM chr_races WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_RACES, "SELECT MAX(ID) + 1 FROM chr_races", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_RACES, "SELECT ID, Name_lang, NameFemale_lang, NameLowercase_lang, NameFemaleLowercase_lang, LoreName_lang, "
@@ -407,7 +411,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// CinematicCamera.db2
- PrepareStatement(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID, Unknown915"
+ PrepareStatement(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID, ConversationID"
" FROM cinematic_camera WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT MAX(ID) + 1 FROM cinematic_camera", CONNECTION_SYNCH);
@@ -441,7 +445,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"ExtendedDisplayInfoID, NPCSoundID, ParticleColorID, PortraitCreatureDisplayInfoID, PortraitTextureFileDataID, ObjectEffectPackageID, "
"AnimReplacementSetID, Flags, StateSpellVisualKitID, PlayerOverrideScale, PetInstanceScale, UnarmedWeaponType, MountPoofSpellVisualKitID, "
"DissolveEffectID, Gender, DissolveOutEffectID, CreatureModelMinLod, TextureVariationFileDataID1, TextureVariationFileDataID2, "
- "TextureVariationFileDataID3 FROM creature_display_info WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "TextureVariationFileDataID3, TextureVariationFileDataID4 FROM creature_display_info WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT MAX(ID) + 1 FROM creature_display_info", CONNECTION_SYNCH);
// CreatureDisplayInfoExtra.db2
@@ -490,8 +494,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// CurrencyTypes.db2
PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name, Description, CategoryID, InventoryIconFileID, SpellWeight, SpellCategory, MaxQty, "
- "MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, Flags1, Flags2"
- " FROM currency_types WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "MaxEarnablePerWeek, Quality, FactionID, ItemGroupSoundsID, XpQuestDifficulty, AwardConditionID, MaxQtyWorldStateID, "
+ "RechargingAmountPerCycle, RechargingCycleDurationMS, Flags1, Flags2 FROM currency_types WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT MAX(ID) + 1 FROM currency_types", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, Description_lang FROM currency_types_locale WHERE (`VerifiedBuild` > 0) = ?"
" AND locale = ?", CONNECTION_SYNCH);
@@ -501,7 +505,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CURVE, "SELECT MAX(ID) + 1 FROM curve", CONNECTION_SYNCH);
// CurvePoint.db2
- PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, PosX, PosY, PreSLSquishPosX, PreSLSquishPosY, CurveID, OrderIndex FROM curve_point"
+ PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT PosX, PosY, PreSLSquishPosX, PreSLSquishPosY, ID, CurveID, OrderIndex FROM curve_point"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_CURVE_POINT, "SELECT MAX(ID) + 1 FROM curve_point", CONNECTION_SYNCH);
@@ -521,8 +525,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_LOCALE_STMT(HOTFIX_SEL_DIFFICULTY, "SELECT ID, Name_lang FROM difficulty_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// DungeonEncounter.db2
- PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT Name, ID, MapID, DifficultyID, OrderIndex, CompleteWorldStateID, Bit, CreatureDisplayID, "
- "Flags, SpellIconFileID, Faction FROM dungeon_encounter WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT Name, ID, MapID, DifficultyID, OrderIndex, CompleteWorldStateID, Bit, Flags, "
+ "SpellIconFileID, Faction FROM dungeon_encounter WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT MAX(ID) + 1 FROM dungeon_encounter", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_DUNGEON_ENCOUNTER, "SELECT ID, Name_lang FROM dungeon_encounter_locale WHERE (`VerifiedBuild` > 0) = ?"
" AND locale = ?", CONNECTION_SYNCH);
@@ -568,16 +572,18 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// Faction.db2
PrepareStatement(HOTFIX_SEL_FACTION, "SELECT ID, ReputationRaceMask1, ReputationRaceMask2, ReputationRaceMask3, ReputationRaceMask4, Name, "
- "Description, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, ReputationClassMask1, "
- "ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, ReputationFlags3, ReputationFlags4, "
- "ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ReputationMax1, ReputationMax2, ReputationMax3, ReputationMax4, "
- "ParentFactionMod1, ParentFactionMod2, ParentFactionCap1, ParentFactionCap2 FROM faction WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "Description, ReputationIndex, ParentFactionID, Expansion, FriendshipRepID, Flags, ParagonFactionID, RenownFactionID, RenownCurrencyID, "
+ "ReputationClassMask1, ReputationClassMask2, ReputationClassMask3, ReputationClassMask4, ReputationFlags1, ReputationFlags2, "
+ "ReputationFlags3, ReputationFlags4, ReputationBase1, ReputationBase2, ReputationBase3, ReputationBase4, ReputationMax1, ReputationMax2, "
+ "ReputationMax3, ReputationMax4, ParentFactionMod1, ParentFactionMod2, ParentFactionCap1, ParentFactionCap2 FROM faction"
+ " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_FACTION, "SELECT MAX(ID) + 1 FROM faction", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_FACTION, "SELECT ID, Name_lang, Description_lang FROM faction_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// FactionTemplate.db2
PrepareStatement(HOTFIX_SEL_FACTION_TEMPLATE, "SELECT ID, Faction, Flags, FactionGroup, FriendGroup, EnemyGroup, Enemies1, Enemies2, Enemies3, "
- "Enemies4, Friend1, Friend2, Friend3, Friend4 FROM faction_template WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "Enemies4, Enemies5, Enemies6, Enemies7, Enemies8, Friend1, Friend2, Friend3, Friend4, Friend5, Friend6, Friend7, Friend8"
+ " FROM faction_template WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_FACTION_TEMPLATE, "SELECT MAX(ID) + 1 FROM faction_template", CONNECTION_SYNCH);
// FriendshipRepReaction.db2
@@ -717,6 +723,12 @@ void HotfixDatabaseConnection::DoPrepareStatements()
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_GLYPH_REQUIRED_SPEC, "SELECT MAX(ID) + 1 FROM glyph_required_spec", CONNECTION_SYNCH);
+ // GossipNpcOption.db2
+ PrepareStatement(HOTFIX_SEL_GOSSIP_NPC_OPTION, "SELECT ID, GossipNpcOption, LFGDungeonsID, TrainerID, GarrFollowerTypeID, CharShipmentID, "
+ "GarrTalentTreeID, UiMapID, UiItemInteractionID, Unknown_1000_8, Unknown_1000_9, CovenantID, GossipOptionID, TraitTreeID, ProfessionID, "
+ "Unknown_1002_14 FROM gossip_npc_option WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PREPARE_MAX_ID_STMT(HOTFIX_SEL_GOSSIP_NPC_OPTION, "SELECT MAX(ID) + 1 FROM gossip_npc_option", CONNECTION_SYNCH);
+
// GuildColorBackground.db2
PrepareStatement(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT ID, Red, Blue, Green FROM guild_color_background WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_GUILD_COLOR_BACKGROUND, "SELECT MAX(ID) + 1 FROM guild_color_background", CONNECTION_SYNCH);
@@ -769,7 +781,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// Item.db2
PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, ClassID, SubclassID, Material, InventoryType, SheatheType, SoundOverrideSubclassID, IconFileDataID, "
- "ItemGroupSoundsID, ContentTuningID, ModifiedCraftingReagentItemID FROM item WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "ItemGroupSoundsID, ContentTuningID, ModifiedCraftingReagentItemID, CraftingQualityID FROM item WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM, "SELECT MAX(ID) + 1 FROM item", CONNECTION_SYNCH);
// ItemAppearance.db2
@@ -940,14 +952,14 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"StatPercentageOfSocket2, StatPercentageOfSocket3, StatPercentageOfSocket4, StatPercentageOfSocket5, StatPercentageOfSocket6, "
"StatPercentageOfSocket7, StatPercentageOfSocket8, StatPercentageOfSocket9, StatPercentageOfSocket10, StatPercentEditor1, StatPercentEditor2, "
"StatPercentEditor3, StatPercentEditor4, StatPercentEditor5, StatPercentEditor6, StatPercentEditor7, StatPercentEditor8, StatPercentEditor9, "
- "StatPercentEditor10, Stackable, MaxCount, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, PriceRandomValue, Flags1, "
- "Flags2, Flags3, Flags4, FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, PlayerLevelToItemLevelCurveID, "
- "ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, GemProperties, SocketMatchEnchantmentId, TotemCategoryID, InstanceBound, "
- "ZoneBound1, ZoneBound2, ItemSet, LockID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, ItemLevel, AllowableClass, "
- "ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, PageMaterialID, Bonding, "
- "DamageDamageType, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, StatModifierBonusStat5, "
- "StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, StatModifierBonusStat10, ContainerSlots, "
- "MinReputation, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse"
+ "StatPercentEditor10, Stackable, MaxCount, MinReputation, RequiredAbility, SellPrice, BuyPrice, VendorStackCount, PriceVariance, "
+ "PriceRandomValue, Flags1, Flags2, Flags3, Flags4, FactionRelated, ModifiedCraftingReagentItemID, ContentTuningID, "
+ "PlayerLevelToItemLevelCurveID, ItemNameDescriptionID, RequiredTransmogHoliday, RequiredHoliday, GemProperties, SocketMatchEnchantmentId, "
+ "TotemCategoryID, InstanceBound, ZoneBound1, ZoneBound2, ItemSet, LockID, PageID, ItemDelay, MinFactionID, RequiredSkillRank, RequiredSkill, "
+ "ItemLevel, AllowableClass, ArtifactID, SpellWeight, SpellWeightCategory, SocketType1, SocketType2, SocketType3, SheatheType, Material, "
+ "PageMaterialID, Bonding, DamageDamageType, StatModifierBonusStat1, StatModifierBonusStat2, StatModifierBonusStat3, StatModifierBonusStat4, "
+ "StatModifierBonusStat5, StatModifierBonusStat6, StatModifierBonusStat7, StatModifierBonusStat8, StatModifierBonusStat9, "
+ "StatModifierBonusStat10, ContainerSlots, RequiredPVPMedal, RequiredPVPRank, RequiredLevel, InventoryType, OverallQualityID FROM item_sparse"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT MAX(ID) + 1 FROM item_sparse", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang"
@@ -987,7 +999,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// JournalInstance.db2
PrepareStatement(HOTFIX_SEL_JOURNAL_INSTANCE, "SELECT ID, Name, Description, MapID, BackgroundFileDataID, ButtonFileDataID, "
- "ButtonSmallFileDataID, LoreFileDataID, OrderIndex, Flags, AreaID FROM journal_instance WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "ButtonSmallFileDataID, LoreFileDataID, Flags, AreaID FROM journal_instance WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_JOURNAL_INSTANCE, "SELECT MAX(ID) + 1 FROM journal_instance", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_JOURNAL_INSTANCE, "SELECT ID, Name_lang, Description_lang FROM journal_instance_locale"
" WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
@@ -1057,8 +1069,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// Map.db2
PrepareStatement(HOTFIX_SEL_MAP, "SELECT ID, Directory, MapName, MapDescription0, MapDescription1, PvpShortDescription, PvpLongDescription, "
"CorpseX, CorpseY, MapType, InstanceType, ExpansionID, AreaTableID, LoadingScreenID, TimeOfDayOverride, ParentMapID, CosmeticParentMapID, "
- "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, Flags1, Flags2, Flags3 FROM map"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "TimeOffset, MinimapIconScale, CorpseMapID, MaxPlayers, WindSettingsID, ZmpFileDataID, WdtFileDataID, NavigationMaxDistance, Flags1, Flags2, "
+ "Flags3 FROM map WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_MAP, "SELECT MAX(ID) + 1 FROM map", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_MAP, "SELECT ID, MapName_lang, MapDescription0_lang, MapDescription1_lang, PvpShortDescription_lang, "
"PvpLongDescription_lang FROM map_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
@@ -1102,7 +1114,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// MountCapability.db2
PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, ReqRidingSkill, ReqAreaID, ReqSpellAuraID, ReqSpellKnownID, ModSpellAuraID, "
- "ReqMapID, PlayerConditionID FROM mount_capability WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "ReqMapID, PlayerConditionID, FlightCapabilityID FROM mount_capability WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT MAX(ID) + 1 FROM mount_capability", CONNECTION_SYNCH);
// MountTypeXCapability.db2
@@ -1166,16 +1178,18 @@ void HotfixDatabaseConnection::DoPrepareStatements()
"MinExpansionLevel, MaxExpansionLevel, MinAvgItemLevel, MaxAvgItemLevel, MinAvgEquippedItemLevel, MaxAvgEquippedItemLevel, PhaseUseFlags, "
"PhaseID, PhaseGroupID, Flags, ChrSpecializationIndex, ChrSpecializationRole, ModifierTreeID, PowerType, PowerTypeComp, PowerTypeValue, "
"WeaponSubclassMask, MaxGuildLevel, MinGuildLevel, MaxExpansionTier, MinExpansionTier, MinPVPRank, MaxPVPRank, ContentTuningID, CovenantID, "
- "SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, MaxSkill4, "
- "MinFactionID1, MinFactionID2, MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, PrevQuestID3, "
- "PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, "
+ "TraitNodeEntryLogic, SkillID1, SkillID2, SkillID3, SkillID4, MinSkill1, MinSkill2, MinSkill3, MinSkill4, MaxSkill1, MaxSkill2, MaxSkill3, "
+ "MaxSkill4, MinFactionID1, MinFactionID2, MinFactionID3, MinReputation1, MinReputation2, MinReputation3, PrevQuestID1, PrevQuestID2, "
+ "PrevQuestID3, PrevQuestID4, CurrQuestID1, CurrQuestID2, CurrQuestID3, CurrQuestID4, CurrentCompletedQuestID1, CurrentCompletedQuestID2, "
"CurrentCompletedQuestID3, CurrentCompletedQuestID4, SpellID1, SpellID2, SpellID3, SpellID4, ItemID1, ItemID2, ItemID3, ItemID4, ItemCount1, "
"ItemCount2, ItemCount3, ItemCount4, Explored1, Explored2, Time1, Time2, AuraSpellID1, AuraSpellID2, AuraSpellID3, AuraSpellID4, AuraStacks1, "
"AuraStacks2, AuraStacks3, AuraStacks4, Achievement1, Achievement2, Achievement3, Achievement4, AreaID1, AreaID2, AreaID3, AreaID4, "
"LfgStatus1, LfgStatus2, LfgStatus3, LfgStatus4, LfgCompare1, LfgCompare2, LfgCompare3, LfgCompare4, LfgValue1, LfgValue2, LfgValue3, "
"LfgValue4, CurrencyID1, CurrencyID2, CurrencyID3, CurrencyID4, CurrencyCount1, CurrencyCount2, CurrencyCount3, CurrencyCount4, "
"QuestKillMonster1, QuestKillMonster2, QuestKillMonster3, QuestKillMonster4, QuestKillMonster5, QuestKillMonster6, MovementFlags1, "
- "MovementFlags2 FROM player_condition WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "MovementFlags2, TraitNodeEntryID1, TraitNodeEntryID2, TraitNodeEntryID3, TraitNodeEntryID4, TraitNodeEntryMinRank1, TraitNodeEntryMinRank2, "
+ "TraitNodeEntryMinRank3, TraitNodeEntryMinRank4, TraitNodeEntryMaxRank1, TraitNodeEntryMaxRank2, TraitNodeEntryMaxRank3, "
+ "TraitNodeEntryMaxRank4 FROM player_condition WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT MAX(ID) + 1 FROM player_condition", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_PLAYER_CONDITION, "SELECT ID, FailureDescription_lang FROM player_condition_locale WHERE (`VerifiedBuild` > 0) = ?"
" AND locale = ?", CONNECTION_SYNCH);
@@ -1207,7 +1221,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// PvpTalent.db2
PrepareStatement(HOTFIX_SEL_PVP_TALENT, "SELECT Description, ID, SpecID, SpellID, OverridesSpellID, Flags, ActionBarSpellID, PvpTalentCategoryID, "
- "LevelRequired FROM pvp_talent WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "LevelRequired, PlayerConditionID FROM pvp_talent WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_PVP_TALENT, "SELECT MAX(ID) + 1 FROM pvp_talent", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_PVP_TALENT, "SELECT ID, Description_lang FROM pvp_talent_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
@@ -1257,7 +1271,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_LOCALE_STMT(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName_lang FROM quest_sort_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// QuestV2.db2
- PrepareStatement(HOTFIX_SEL_QUEST_V2, "SELECT ID, UniqueBitFlag FROM quest_v2 WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_QUEST_V2, "SELECT ID, UniqueBitFlag, UiQuestDetailsTheme FROM quest_v2 WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_QUEST_V2, "SELECT MAX(ID) + 1 FROM quest_v2", CONNECTION_SYNCH);
// QuestXp.db2
@@ -1318,17 +1332,19 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SkillLine.db2
PrepareStatement(HOTFIX_SEL_SKILL_LINE, "SELECT DisplayName, AlternateVerb, Description, HordeDisplayName, OverrideSourceInfoDisplayName, ID, "
- "CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID FROM skill_line"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "CategoryID, SpellIconFileID, CanLink, ParentSkillLineID, ParentTierIndex, Flags, SpellBookSpellID, ExpansionNameSharedStringID, "
+ "HordeExpansionNameSharedStringID FROM skill_line WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SKILL_LINE, "SELECT MAX(ID) + 1 FROM skill_line", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_SKILL_LINE, "SELECT ID, DisplayName_lang, AlternateVerb_lang, Description_lang, HordeDisplayName_lang"
" FROM skill_line_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// SkillLineAbility.db2
- PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT RaceMask, ID, SkillLine, Spell, MinSkillLineRank, ClassMask, SupercedesSpell, "
- "AcquireMethod, TrivialSkillLineRankHigh, TrivialSkillLineRankLow, Flags, NumSkillUps, UniqueBit, TradeSkillCategoryID, SkillupSkillLineID"
- " FROM skill_line_ability WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT RaceMask, AbilityVerb, AbilityAllVerb, ID, SkillLine, Spell, MinSkillLineRank, ClassMask, "
+ "SupercedesSpell, AcquireMethod, TrivialSkillLineRankHigh, TrivialSkillLineRankLow, Flags, NumSkillUps, UniqueBit, TradeSkillCategoryID, "
+ "SkillupSkillLineID FROM skill_line_ability WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT MAX(ID) + 1 FROM skill_line_ability", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMT(HOTFIX_SEL_SKILL_LINE_ABILITY, "SELECT ID, AbilityVerb_lang, AbilityAllVerb_lang FROM skill_line_ability_locale"
+ " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH);
// SkillRaceClassInfo.db2
PrepareStatement(HOTFIX_SEL_SKILL_RACE_CLASS_INFO, "SELECT ID, RaceMask, SkillID, ClassMask, Flags, Availability, MinLevel, SkillTierID"
@@ -1342,8 +1358,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SoundKit.db2
PrepareStatement(HOTFIX_SEL_SOUND_KIT, "SELECT ID, SoundType, VolumeFloat, Flags, MinDistance, DistanceCutoff, EAXDef, SoundKitAdvancedID, "
- "VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, DialogType, PitchAdjust, BusOverwriteID, MaxInstances"
- " FROM sound_kit WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, DialogType, PitchAdjust, BusOverwriteID, MaxInstances, "
+ "SoundMixGroupID FROM sound_kit WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SOUND_KIT, "SELECT MAX(ID) + 1 FROM sound_kit", CONNECTION_SYNCH);
// SpecializationSpells.db2
@@ -1364,8 +1380,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SpellAuraRestrictions.db2
PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, DifficultyID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, "
- "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell, SpellID"
- " FROM spell_aura_restrictions WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell, CasterAuraType, TargetAuraType, "
+ "ExcludeCasterAuraType, ExcludeTargetAuraType, SpellID FROM spell_aura_restrictions WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT MAX(ID) + 1 FROM spell_aura_restrictions", CONNECTION_SYNCH);
// SpellCastTimes.db2
@@ -1394,8 +1410,8 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT MAX(ID) + 1 FROM spell_class_options", CONNECTION_SYNCH);
// SpellCooldowns.db2
- PrepareStatement(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT ID, DifficultyID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, SpellID"
- " FROM spell_cooldowns WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ PrepareStatement(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT ID, DifficultyID, CategoryRecoveryTime, RecoveryTime, StartRecoveryTime, AuraSpellID, "
+ "SpellID FROM spell_cooldowns WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_COOLDOWNS, "SELECT MAX(ID) + 1 FROM spell_cooldowns", CONNECTION_SYNCH);
// SpellDuration.db2
@@ -1428,10 +1444,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_INTERRUPTS, "SELECT MAX(ID) + 1 FROM spell_interrupts", CONNECTION_SYNCH);
// SpellItemEnchantment.db2
- PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, EffectArg1, EffectArg2, EffectArg3, EffectScalingPoints1, "
- "EffectScalingPoints2, EffectScalingPoints3, IconFileDataID, MinItemLevel, MaxItemLevel, TransmogUseConditionID, TransmogCost, "
- "EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, Charges, Effect1, "
- "Effect2, Effect3, ScalingClass, ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment"
+ PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name, HordeName, Duration, EffectArg1, EffectArg2, EffectArg3, "
+ "EffectScalingPoints1, EffectScalingPoints2, EffectScalingPoints3, IconFileDataID, MinItemLevel, MaxItemLevel, TransmogUseConditionID, "
+ "TransmogCost, EffectPointsMin1, EffectPointsMin2, EffectPointsMin3, ItemVisual, Flags, RequiredSkillID, RequiredSkillRank, ItemLevel, "
+ "Charges, Effect1, Effect2, Effect3, ScalingClass, ScalingClassRestricted, ConditionID, MinLevel, MaxLevel FROM spell_item_enchantment"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT MAX(ID) + 1 FROM spell_item_enchantment", CONNECTION_SYNCH);
PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT, "SELECT ID, Name_lang, HordeName_lang FROM spell_item_enchantment_locale"
@@ -1473,7 +1489,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SpellPower.db2
PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, OrderIndex, ManaCost, ManaCostPerLevel, ManaPerSecond, PowerDisplayID, AltPowerBarID, "
- "PowerCostPct, PowerCostMaxPct, PowerPctPerSecond, PowerType, RequiredAuraSpellID, OptionalCost, SpellID FROM spell_power"
+ "PowerCostPct, PowerCostMaxPct, OptionalCostPct, PowerPctPerSecond, PowerType, RequiredAuraSpellID, OptionalCost, SpellID FROM spell_power"
" WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_POWER, "SELECT MAX(ID) + 1 FROM spell_power", CONNECTION_SYNCH);
@@ -1505,8 +1521,10 @@ void HotfixDatabaseConnection::DoPrepareStatements()
// SpellReagents.db2
PrepareStatement(HOTFIX_SEL_SPELL_REAGENTS, "SELECT ID, SpellID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, "
- "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 FROM spell_reagents"
- " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
+ "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8, "
+ "ReagentRecraftCount1, ReagentRecraftCount2, ReagentRecraftCount3, ReagentRecraftCount4, ReagentRecraftCount5, ReagentRecraftCount6, "
+ "ReagentRecraftCount7, ReagentRecraftCount8, ReagentSource1, ReagentSource2, ReagentSource3, ReagentSource4, ReagentSource5, ReagentSource6, "
+ "ReagentSource7, ReagentSource8 FROM spell_reagents WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_REAGENTS, "SELECT MAX(ID) + 1 FROM spell_reagents", CONNECTION_SYNCH);
// SpellReagentsCurrency.db2
@@ -1570,7 +1588,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_VISUAL_KIT, "SELECT MAX(ID) + 1 FROM spell_visual_kit", CONNECTION_SYNCH);
// SpellXSpellVisual.db2
- PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Priority, SpellIconFileID, "
+ PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, DifficultyID, SpellVisualID, Probability, Flags, Priority, SpellIconFileID, "
"ActiveIconFileID, ViewerUnitConditionID, ViewerPlayerConditionID, CasterUnitConditionID, CasterPlayerConditionID, SpellID"
" FROM spell_x_spell_visual WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT MAX(ID) + 1 FROM spell_x_spell_visual", CONNECTION_SYNCH);
@@ -1666,7 +1684,7 @@ void HotfixDatabaseConnection::DoPrepareStatements()
PREPARE_MAX_ID_STMT(HOTFIX_SEL_UI_MAP_ASSIGNMENT, "SELECT MAX(ID) + 1 FROM ui_map_assignment", CONNECTION_SYNCH);
// UiMapLink.db2
- PrepareStatement(HOTFIX_SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID, "
+ PrepareStatement(HOTFIX_SEL_UI_MAP_LINK, "SELECT UiMinX, UiMinY, UiMaxX, UiMaxY, ID, ParentUiMapID, OrderIndex, ChildUiMapID, PlayerConditionID, "
"OverrideHighlightFileDataID, OverrideHighlightAtlasID, Flags FROM ui_map_link WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH);
PREPARE_MAX_ID_STMT(HOTFIX_SEL_UI_MAP_LINK, "SELECT MAX(ID) + 1 FROM ui_map_link", CONNECTION_SYNCH);
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h
index 2bc899c79c7..7816a6e7de1 100644
--- a/src/server/database/Database/Implementation/HotfixDatabase.h
+++ b/src/server/database/Database/Implementation/HotfixDatabase.h
@@ -221,6 +221,7 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_CHR_CUSTOMIZATION_REQ,
HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_MAX_ID,
+ HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_LOCALE,
HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE,
HOTFIX_SEL_CHR_CUSTOMIZATION_REQ_CHOICE_MAX_ID,
@@ -412,6 +413,9 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_GLYPH_REQUIRED_SPEC,
HOTFIX_SEL_GLYPH_REQUIRED_SPEC_MAX_ID,
+ HOTFIX_SEL_GOSSIP_NPC_OPTION,
+ HOTFIX_SEL_GOSSIP_NPC_OPTION_MAX_ID,
+
HOTFIX_SEL_GUILD_COLOR_BACKGROUND,
HOTFIX_SEL_GUILD_COLOR_BACKGROUND_MAX_ID,
@@ -771,6 +775,7 @@ enum HotfixDatabaseStatements : uint32
HOTFIX_SEL_SKILL_LINE_ABILITY,
HOTFIX_SEL_SKILL_LINE_ABILITY_MAX_ID,
+ HOTFIX_SEL_SKILL_LINE_ABILITY_LOCALE,
HOTFIX_SEL_SKILL_RACE_CLASS_INFO,
HOTFIX_SEL_SKILL_RACE_CLASS_INFO_MAX_ID,
diff --git a/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp b/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp
index a6a956dc33e..879b808d5d6 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedGossip.cpp
@@ -40,15 +40,15 @@ void ClearGossipMenuFor(Player* player)
}
// Using provided text, not from DB
-void AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string const& text, uint32 sender, uint32 action)
+void AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action)
{
- player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, optionNpc, text, sender, action, "", 0);
+ player->PlayerTalkClass->GetGossipMenu().AddMenuItem(0, -1, optionNpc, std::move(text), 0, GossipOptionFlags::None, {}, false, 0, "", {}, {}, sender, action);
}
// Using provided texts, not from DB
-void AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string const& text, uint32 sender, uint32 action, std::string const& popupText, uint32 popupMoney, bool coded)
+void AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action, std::string popupText, uint32 popupMoney, bool coded)
{
- player->PlayerTalkClass->GetGossipMenu().AddMenuItem(-1, optionNpc, text, sender, action, popupText, popupMoney, coded);
+ player->PlayerTalkClass->GetGossipMenu().AddMenuItem(0, -1, optionNpc, std::move(text), 0, GossipOptionFlags::None, {}, coded, popupMoney, std::move(popupText), {}, {}, sender, action);
}
// Uses gossip item info from DB
diff --git a/src/server/game/AI/ScriptedAI/ScriptedGossip.h b/src/server/game/AI/ScriptedAI/ScriptedGossip.h
index 239d425a153..947554a39ec 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedGossip.h
+++ b/src/server/game/AI/ScriptedAI/ScriptedGossip.h
@@ -91,9 +91,9 @@ uint32 TC_GAME_API GetGossipActionFor(Player* player, uint32 gossipListId);
void TC_GAME_API InitGossipMenuFor(Player* player, uint32 menuId);
void TC_GAME_API ClearGossipMenuFor(Player* player);
// Using provided text, not from DB
-void TC_GAME_API AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string const& text, uint32 sender, uint32 action);
+void TC_GAME_API AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action);
// Using provided texts, not from DB
-void TC_GAME_API AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string const& text, uint32 sender, uint32 action, std::string const& popupText, uint32 popupMoney, bool coded);
+void TC_GAME_API AddGossipItemFor(Player* player, GossipOptionNpc optionNpc, std::string text, uint32 sender, uint32 action, std::string popupText, uint32 popupMoney, bool coded);
// Uses gossip item info from DB
void TC_GAME_API AddGossipItemFor(Player* player, uint32 gossipMenuID, uint32 gossipMenuItemID, uint32 sender, uint32 action);
void TC_GAME_API SendGossipMenuFor(Player* player, uint32 npcTextID, ObjectGuid const& guid);
diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp
index 5cbdcefd648..4cba6ab5b55 100644
--- a/src/server/game/Achievements/CriteriaHandler.cpp
+++ b/src/server/game/Achievements/CriteriaHandler.cpp
@@ -3095,7 +3095,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
bool bagScanReachedEnd = referencePlayer->ForEachItem(ItemSearchLocation::Everywhere, [&bonusListIDs](Item const* item)
{
- bool hasBonus = std::any_of(item->m_itemData->BonusListIDs->begin(), item->m_itemData->BonusListIDs->end(), [&bonusListIDs](int32 bonusListID)
+ bool hasBonus = std::any_of(item->GetBonusListIDs().begin(), item->GetBonusListIDs().end(), [&bonusListIDs](int32 bonusListID)
{
return bonusListIDs.find(bonusListID) != bonusListIDs.end();
});
@@ -3762,6 +3762,109 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6
return false;
break;
}
+ case ModifierTreeType::PlayerAuraWithLabelStackCountEqualOrGreaterThan: // 335
+ {
+ uint32 count = 0;
+ referencePlayer->HasAura([secondaryAsset, &count](Aura const* aura)
+ {
+ if (aura->GetSpellInfo()->HasLabel(secondaryAsset))
+ count += aura->GetStackAmount();
+ return false;
+ });
+ if (count < reqValue)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerAuraWithLabelStackCountEqual: // 336
+ {
+ uint32 count = 0;
+ referencePlayer->HasAura([secondaryAsset, &count](Aura const* aura)
+ {
+ if (aura->GetSpellInfo()->HasLabel(secondaryAsset))
+ count += aura->GetStackAmount();
+ return false;
+ });
+ if (count != reqValue)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerAuraWithLabelStackCountEqualOrLessThan: // 337
+ {
+ uint32 count = 0;
+ referencePlayer->HasAura([secondaryAsset, &count](Aura const* aura)
+ {
+ if (aura->GetSpellInfo()->HasLabel(secondaryAsset))
+ count += aura->GetStackAmount();
+ return false;
+ });
+ if (count > reqValue)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerIsInCrossFactionGroup: // 338
+ {
+ Group const* group = referencePlayer->GetGroup();
+ if (!(group->GetGroupFlags() & GROUP_FLAG_CROSS_FACTION))
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerHasTraitNodeEntryInActiveConfig: // 340
+ {
+ auto hasTraitNodeEntry = [referencePlayer, reqValue]()
+ {
+ for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs)
+ {
+ if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat)
+ {
+ if (int32(*referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID
+ || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec))
+ continue;
+ }
+
+ for (UF::TraitEntry const& traitEntry : traitConfig.Entries)
+ if (traitEntry.TraitNodeEntryID == int32(reqValue))
+ return true;
+ }
+ return false;
+ }();
+ if (!hasTraitNodeEntry)
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerHasTraitNodeEntryInActiveConfigRankGreaterOrEqualThan: // 341
+ {
+ auto traitNodeEntryRank = [referencePlayer, secondaryAsset]() -> Optional<uint16>
+ {
+ for (UF::TraitConfig const& traitConfig : referencePlayer->m_activePlayerData->TraitConfigs)
+ {
+ if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat)
+ {
+ if (int32(*referencePlayer->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID
+ || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec))
+ continue;
+ }
+
+ for (UF::TraitEntry const& traitEntry : traitConfig.Entries)
+ if (traitEntry.TraitNodeEntryID == int32(secondaryAsset))
+ return traitEntry.Rank;
+ }
+ return {};
+ }();
+ if (!traitNodeEntryRank || traitNodeEntryRank < int32(reqValue))
+ return false;
+ break;
+ }
+ case ModifierTreeType::PlayerDaysSinceLogout: // 344
+ if (GameTime::GetGameTime() - referencePlayer->m_playerData->LogoutTime < int64(reqValue) * DAY)
+ return false;
+ break;
+ case ModifierTreeType::PlayerCanUseItem: // 351
+ {
+ ItemTemplate const* itemTemplate = sObjectMgr->GetItemTemplate(reqValue);
+ if (!itemTemplate || !referencePlayer->CanUseItem(itemTemplate))
+ return false;
+ break;
+ }
default:
return false;
}
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
index e4bf0e0fb40..36d318a0ed4 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp
@@ -473,7 +473,7 @@ uint64 AuctionHouseMgr::GetItemAuctionDeposit(Player* player, Item* item, Minute
std::string AuctionHouseMgr::BuildItemAuctionMailSubject(AuctionMailType type, AuctionPosting const* auction)
{
return BuildAuctionMailSubject(auction->Items[0]->GetEntry(), type, auction->Id, auction->GetTotalItemCount(),
- auction->Items[0]->GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID), auction->Items[0]->GetContext(), *auction->Items[0]->m_itemData->BonusListIDs);
+ auction->Items[0]->GetModifier(ITEM_MODIFIER_BATTLE_PET_SPECIES_ID), auction->Items[0]->GetContext(), auction->Items[0]->GetBonusListIDs());
}
std::string AuctionHouseMgr::BuildCommodityAuctionMailSubject(AuctionMailType type, uint32 itemId, uint32 itemCount)
@@ -1231,7 +1231,7 @@ void AuctionHouseObject::BuildListBuckets(WorldPackets::AuctionHouse::AuctionLis
if (!(classFilters->Classes[bucketData->ItemClass].SubclassMask & (1 << bucketData->ItemSubClass)))
continue;
- if (!(classFilters->Classes[bucketData->ItemClass].InvTypes[bucketData->ItemSubClass] & (1 << bucketData->InventoryType)))
+ if (!(classFilters->Classes[bucketData->ItemClass].InvTypes[bucketData->ItemSubClass] & (UI64LIT(1) << bucketData->InventoryType)))
continue;
}
}
diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.h b/src/server/game/AuctionHouse/AuctionHouseMgr.h
index 8a0f62236d1..9cccec7bb95 100644
--- a/src/server/game/AuctionHouse/AuctionHouseMgr.h
+++ b/src/server/game/AuctionHouse/AuctionHouseMgr.h
@@ -146,7 +146,7 @@ struct AuctionSearchClassFilters
struct SubclassFilter
{
uint32 SubclassMask = FILTER_SKIP_CLASS;
- std::array<uint32, MAX_ITEM_SUBCLASS_TOTAL> InvTypes = { };
+ std::array<uint64, MAX_ITEM_SUBCLASS_TOTAL> InvTypes = { };
};
std::array<SubclassFilter, MAX_ITEM_CLASS> Classes = { };
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 63476dc1b8d..e1c385dc881 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -1547,7 +1547,7 @@ bool ConditionMgr::addToGossipMenuItems(Condition* cond) const
Trinity::IteratorPair pMenuItemBounds = sObjectMgr->GetGossipMenuItemsMapBoundsNonConst(cond->SourceGroup);
for (auto& [_, gossipMenuItem] : pMenuItemBounds)
{
- if (gossipMenuItem.MenuID == cond->SourceGroup && gossipMenuItem.OptionID == uint32(cond->SourceEntry))
+ if (gossipMenuItem.MenuID == cond->SourceGroup && gossipMenuItem.OrderIndex == uint32(cond->SourceEntry))
{
gossipMenuItem.Conditions.push_back(cond);
return true;
@@ -3350,6 +3350,46 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio
if (condition->CovenantID && player->m_playerData->CovenantID != condition->CovenantID)
return false;
+ if (std::any_of(condition->TraitNodeEntryID.begin(), condition->TraitNodeEntryID.end(), [](int32 traitNodeEntryId) { return traitNodeEntryId != 0; }))
+ {
+ auto getTraitNodeEntryRank = [player](int32 traitNodeEntryId) -> Optional<uint16>
+ {
+ for (UF::TraitConfig const& traitConfig : player->m_activePlayerData->TraitConfigs)
+ {
+ if (TraitConfigType(*traitConfig.Type) == TraitConfigType::Combat)
+ {
+ if (int32(*player->m_activePlayerData->ActiveCombatTraitConfigID) != traitConfig.ID
+ || !EnumFlag(TraitCombatConfigFlags(*traitConfig.CombatConfigFlags)).HasFlag(TraitCombatConfigFlags::ActiveForSpec))
+ continue;
+ }
+
+ for (UF::TraitEntry const& traitEntry : traitConfig.Entries)
+ if (traitEntry.TraitNodeEntryID == traitNodeEntryId)
+ return traitEntry.Rank;
+ }
+ return {};
+ };
+
+ std::array<bool, std::tuple_size_v<decltype(condition->TraitNodeEntryID)>> results;
+ results.fill(true);
+ for (std::size_t i = 0; i < condition->TraitNodeEntryID.size(); ++i)
+ {
+ if (!condition->TraitNodeEntryID[i])
+ continue;
+
+ Optional<int32> rank = getTraitNodeEntryRank(condition->TraitNodeEntryID[i]);
+ if (!rank)
+ results[i] = false;
+ else if (condition->TraitNodeEntryMinRank[i] && rank < condition->TraitNodeEntryMinRank[i])
+ results[i] = false;
+ else if (condition->TraitNodeEntryMaxRank[i] && rank > condition->TraitNodeEntryMaxRank[i])
+ results[i] = false;
+ }
+
+ if (!PlayerConditionLogic(condition->TraitNodeEntryLogic, results))
+ return false;
+ }
+
return true;
}
diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h
index c85f469e7b3..53fd6206137 100644
--- a/src/server/game/DataStores/DB2LoadInfo.h
+++ b/src/server/game/DataStores/DB2LoadInfo.h
@@ -753,6 +753,7 @@ struct BattlePetBreedQualityLoadInfo
static constexpr DB2FieldMeta fields[] =
{
{ false, FT_INT, "ID" },
+ { true, FT_INT, "MaxQualityRoll" },
{ false, FT_FLOAT, "StateMultiplier" },
{ true, FT_BYTE, "QualityEnum" },
};
@@ -790,7 +791,7 @@ struct BattlePetSpeciesLoadInfo
{ true, FT_INT, "SummonSpellID" },
{ true, FT_INT, "IconFileDataID" },
{ true, FT_BYTE, "PetTypeEnum" },
- { false, FT_SHORT, "Flags" },
+ { true, FT_INT, "Flags" },
{ true, FT_BYTE, "SourceTypeEnum" },
{ true, FT_INT, "CardUIModelSceneID" },
{ true, FT_INT, "LoadoutUIModelSceneID" },
@@ -833,7 +834,7 @@ struct BattlemasterListLoadInfo
{ true, FT_BYTE, "MaxLevel" },
{ true, FT_BYTE, "RatedPlayers" },
{ true, FT_BYTE, "MinPlayers" },
- { true, FT_BYTE, "MaxPlayers" },
+ { true, FT_INT, "MaxPlayers" },
{ true, FT_BYTE, "GroupsAllowed" },
{ true, FT_BYTE, "MaxGroupSize" },
{ true, FT_SHORT, "HolidayWorldState" },
@@ -951,8 +952,8 @@ struct CharacterLoadoutLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_LONG, "RaceMask" },
{ true, FT_BYTE, "ChrClassID" },
- { true, FT_BYTE, "Purpose" },
- { true, FT_BYTE, "Unused910" },
+ { true, FT_INT, "Purpose" },
+ { true, FT_BYTE, "ItemContext" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), CharacterLoadoutMeta::Instance(), HOTFIX_SEL_CHARACTER_LOADOUT);
return &loadInfo;
@@ -1084,6 +1085,7 @@ struct ChrCustomizationChoiceLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_INT, "ChrCustomizationOptionID" },
{ true, FT_INT, "ChrCustomizationReqID" },
+ { true, FT_INT, "ChrCustomizationVisReqID" },
{ false, FT_SHORT, "SortOrder" },
{ false, FT_SHORT, "UiOrderIndex" },
{ true, FT_INT, "Flags" },
@@ -1129,6 +1131,7 @@ struct ChrCustomizationElementLoadInfo
{ true, FT_INT, "ChrCustomizationCondModelID" },
{ true, FT_INT, "ChrCustomizationDisplayInfoID" },
{ true, FT_INT, "ChrCustItemGeoModifyID" },
+ { true, FT_INT, "ChrCustomizationVoiceID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), ChrCustomizationElementMeta::Instance(), HOTFIX_SEL_CHR_CUSTOMIZATION_ELEMENT);
return &loadInfo;
@@ -1167,9 +1170,11 @@ struct ChrCustomizationReqLoadInfo
static constexpr DB2FieldMeta fields[] =
{
{ false, FT_INT, "ID" },
+ { false, FT_STRING, "ReqSource" },
{ true, FT_INT, "Flags" },
{ true, FT_INT, "ClassMask" },
{ true, FT_INT, "AchievementID" },
+ { true, FT_INT, "QuestID" },
{ true, FT_INT, "OverrideArchive" },
{ true, FT_INT, "ItemModifiedAppearanceID" },
};
@@ -1235,6 +1240,8 @@ struct ChrRaceXChrModelLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_INT, "ChrRacesID" },
{ true, FT_INT, "ChrModelID" },
+ { true, FT_INT, "Sex" },
+ { true, FT_INT, "AllowedTransmogSlots" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), ChrRaceXChrModelMeta::Instance(), HOTFIX_SEL_CHR_RACE_X_CHR_MODEL);
return &loadInfo;
@@ -1303,6 +1310,7 @@ struct ChrRacesLoadInfo
{ false, FT_FLOAT, "Unknown910_21" },
{ false, FT_FLOAT, "Unknown910_22" },
{ false, FT_FLOAT, "Unknown910_23" },
+ { true, FT_INT, "Unknown1000" },
{ true, FT_BYTE, "BaseLanguage" },
{ true, FT_BYTE, "CreatureType" },
{ true, FT_BYTE, "MaleModelFallbackSex" },
@@ -1354,7 +1362,7 @@ struct CinematicCameraLoadInfo
{ false, FT_INT, "SoundID" },
{ false, FT_FLOAT, "OriginFacing" },
{ false, FT_INT, "FileDataID" },
- { true, FT_INT, "Unknown915" },
+ { false, FT_INT, "ConversationID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), CinematicCameraMeta::Instance(), HOTFIX_SEL_CINEMATIC_CAMERA);
return &loadInfo;
@@ -1495,6 +1503,7 @@ struct CreatureDisplayInfoLoadInfo
{ true, FT_INT, "TextureVariationFileDataID1" },
{ true, FT_INT, "TextureVariationFileDataID2" },
{ true, FT_INT, "TextureVariationFileDataID3" },
+ { true, FT_INT, "TextureVariationFileDataID4" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), CreatureDisplayInfoMeta::Instance(), HOTFIX_SEL_CREATURE_DISPLAY_INFO);
return &loadInfo;
@@ -1694,6 +1703,8 @@ struct CurrencyTypesLoadInfo
{ true, FT_INT, "XpQuestDifficulty" },
{ true, FT_INT, "AwardConditionID" },
{ true, FT_INT, "MaxQtyWorldStateID" },
+ { false, FT_INT, "RechargingAmountPerCycle" },
+ { false, FT_INT, "RechargingCycleDurationMS" },
{ true, FT_INT, "Flags1" },
{ true, FT_INT, "Flags2" },
};
@@ -1723,11 +1734,11 @@ struct CurvePointLoadInfo
{
static constexpr DB2FieldMeta fields[] =
{
- { false, FT_INT, "ID" },
{ false, FT_FLOAT, "PosX" },
{ false, FT_FLOAT, "PosY" },
{ false, FT_FLOAT, "PreSLSquishPosX" },
{ false, FT_FLOAT, "PreSLSquishPosY" },
+ { false, FT_INT, "ID" },
{ false, FT_SHORT, "CurveID" },
{ false, FT_BYTE, "OrderIndex" },
};
@@ -1810,7 +1821,6 @@ struct DungeonEncounterLoadInfo
{ true, FT_INT, "OrderIndex" },
{ true, FT_INT, "CompleteWorldStateID" },
{ true, FT_BYTE, "Bit" },
- { true, FT_INT, "CreatureDisplayID" },
{ true, FT_INT, "Flags" },
{ true, FT_INT, "SpellIconFileID" },
{ true, FT_INT, "Faction" },
@@ -1994,8 +2004,10 @@ struct FactionLoadInfo
{ false, FT_SHORT, "ParentFactionID" },
{ false, FT_BYTE, "Expansion" },
{ false, FT_INT, "FriendshipRepID" },
- { false, FT_BYTE, "Flags" },
+ { true, FT_INT, "Flags" },
{ false, FT_SHORT, "ParagonFactionID" },
+ { true, FT_INT, "RenownFactionID" },
+ { true, FT_INT, "RenownCurrencyID" },
{ true, FT_SHORT, "ReputationClassMask1" },
{ true, FT_SHORT, "ReputationClassMask2" },
{ true, FT_SHORT, "ReputationClassMask3" },
@@ -2038,10 +2050,18 @@ struct FactionTemplateLoadInfo
{ false, FT_SHORT, "Enemies2" },
{ false, FT_SHORT, "Enemies3" },
{ false, FT_SHORT, "Enemies4" },
+ { false, FT_SHORT, "Enemies5" },
+ { false, FT_SHORT, "Enemies6" },
+ { false, FT_SHORT, "Enemies7" },
+ { false, FT_SHORT, "Enemies8" },
{ false, FT_SHORT, "Friend1" },
{ false, FT_SHORT, "Friend2" },
{ false, FT_SHORT, "Friend3" },
{ false, FT_SHORT, "Friend4" },
+ { false, FT_SHORT, "Friend5" },
+ { false, FT_SHORT, "Friend6" },
+ { false, FT_SHORT, "Friend7" },
+ { false, FT_SHORT, "Friend8" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), FactionTemplateMeta::Instance(), HOTFIX_SEL_FACTION_TEMPLATE);
return &loadInfo;
@@ -2472,7 +2492,7 @@ struct GarrTalentTreeLoadInfo
{ false, FT_SHORT, "UiTextureKitID" },
{ true, FT_INT, "GarrTalentTreeType" },
{ true, FT_INT, "PlayerConditionID" },
- { true, FT_BYTE, "FeatureTypeIndex" },
+ { false, FT_BYTE, "FeatureTypeIndex" },
{ true, FT_BYTE, "FeatureSubtypeIndex" },
{ true, FT_INT, "CurrencyID" },
};
@@ -2558,6 +2578,34 @@ struct GlyphRequiredSpecLoadInfo
}
};
+struct GossipNpcOptionLoadInfo
+{
+ static DB2LoadInfo const* Instance()
+ {
+ static constexpr DB2FieldMeta fields[] =
+ {
+ { false, FT_INT, "ID" },
+ { true, FT_INT, "GossipNpcOption" },
+ { true, FT_INT, "LFGDungeonsID" },
+ { true, FT_INT, "TrainerID" },
+ { true, FT_INT, "GarrFollowerTypeID" },
+ { true, FT_INT, "CharShipmentID" },
+ { true, FT_INT, "GarrTalentTreeID" },
+ { true, FT_INT, "UiMapID" },
+ { true, FT_INT, "UiItemInteractionID" },
+ { true, FT_INT, "Unknown_1000_8" },
+ { true, FT_INT, "Unknown_1000_9" },
+ { true, FT_INT, "CovenantID" },
+ { true, FT_INT, "GossipOptionID" },
+ { true, FT_INT, "TraitTreeID" },
+ { true, FT_INT, "ProfessionID" },
+ { true, FT_INT, "Unknown_1002_14" },
+ };
+ static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), GossipNPCOptionMeta::Instance(), HOTFIX_SEL_GOSSIP_NPC_OPTION);
+ return &loadInfo;
+ }
+};
+
struct GuildColorBackgroundLoadInfo
{
static DB2LoadInfo const* Instance()
@@ -2797,6 +2845,7 @@ struct ItemLoadInfo
{ false, FT_BYTE, "ItemGroupSoundsID" },
{ true, FT_INT, "ContentTuningID" },
{ true, FT_INT, "ModifiedCraftingReagentItemID" },
+ { true, FT_INT, "CraftingQualityID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), ItemMeta::Instance(), HOTFIX_SEL_ITEM);
return &loadInfo;
@@ -3152,7 +3201,7 @@ struct ItemExtendedCostLoadInfo
{ true, FT_BYTE, "ArenaBracket" },
{ false, FT_BYTE, "Flags" },
{ false, FT_BYTE, "MinFactionID" },
- { false, FT_BYTE, "MinReputation" },
+ { true, FT_INT, "MinReputation" },
{ false, FT_BYTE, "RequiredAchievement" },
{ true, FT_INT, "ItemID1" },
{ true, FT_INT, "ItemID2" },
@@ -3338,7 +3387,7 @@ struct ItemSearchNameLoadInfo
{ false, FT_BYTE, "OverallQualityID" },
{ true, FT_INT, "ExpansionID" },
{ false, FT_SHORT, "MinFactionID" },
- { false, FT_BYTE, "MinReputation" },
+ { true, FT_INT, "MinReputation" },
{ true, FT_INT, "AllowableClass" },
{ true, FT_BYTE, "RequiredLevel" },
{ false, FT_SHORT, "RequiredSkill" },
@@ -3450,6 +3499,7 @@ struct ItemSparseLoadInfo
{ true, FT_INT, "StatPercentEditor10" },
{ true, FT_INT, "Stackable" },
{ true, FT_INT, "MaxCount" },
+ { true, FT_INT, "MinReputation" },
{ false, FT_INT, "RequiredAbility" },
{ false, FT_INT, "SellPrice" },
{ false, FT_INT, "BuyPrice" },
@@ -3504,7 +3554,6 @@ struct ItemSparseLoadInfo
{ true, FT_BYTE, "StatModifierBonusStat9" },
{ true, FT_BYTE, "StatModifierBonusStat10" },
{ false, FT_BYTE, "ContainerSlots" },
- { false, FT_BYTE, "MinReputation" },
{ false, FT_BYTE, "RequiredPVPMedal" },
{ false, FT_BYTE, "RequiredPVPRank" },
{ true, FT_BYTE, "RequiredLevel" },
@@ -3647,7 +3696,6 @@ struct JournalInstanceLoadInfo
{ true, FT_INT, "ButtonFileDataID" },
{ true, FT_INT, "ButtonSmallFileDataID" },
{ true, FT_INT, "LoreFileDataID" },
- { false, FT_BYTE, "OrderIndex" },
{ true, FT_INT, "Flags" },
{ false, FT_SHORT, "AreaID" },
};
@@ -3992,6 +4040,7 @@ struct MapLoadInfo
{ true, FT_SHORT, "WindSettingsID" },
{ true, FT_INT, "ZmpFileDataID" },
{ true, FT_INT, "WdtFileDataID" },
+ { true, FT_INT, "NavigationMaxDistance" },
{ true, FT_INT, "Flags1" },
{ true, FT_INT, "Flags2" },
{ true, FT_INT, "Flags3" },
@@ -4137,6 +4186,7 @@ struct MountCapabilityLoadInfo
{ true, FT_INT, "ModSpellAuraID" },
{ true, FT_SHORT, "ReqMapID" },
{ true, FT_INT, "PlayerConditionID" },
+ { true, FT_INT, "FlightCapabilityID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), MountCapabilityMeta::Instance(), HOTFIX_SEL_MOUNT_CAPABILITY);
return &loadInfo;
@@ -4401,6 +4451,7 @@ struct PlayerConditionLoadInfo
{ false, FT_BYTE, "MaxPVPRank" },
{ true, FT_INT, "ContentTuningID" },
{ true, FT_INT, "CovenantID" },
+ { false, FT_INT, "TraitNodeEntryLogic" },
{ false, FT_SHORT, "SkillID1" },
{ false, FT_SHORT, "SkillID2" },
{ false, FT_SHORT, "SkillID3" },
@@ -4491,6 +4542,18 @@ struct PlayerConditionLoadInfo
{ false, FT_INT, "QuestKillMonster6" },
{ true, FT_INT, "MovementFlags1" },
{ true, FT_INT, "MovementFlags2" },
+ { true, FT_INT, "TraitNodeEntryID1" },
+ { true, FT_INT, "TraitNodeEntryID2" },
+ { true, FT_INT, "TraitNodeEntryID3" },
+ { true, FT_INT, "TraitNodeEntryID4" },
+ { false, FT_SHORT, "TraitNodeEntryMinRank1" },
+ { false, FT_SHORT, "TraitNodeEntryMinRank2" },
+ { false, FT_SHORT, "TraitNodeEntryMinRank3" },
+ { false, FT_SHORT, "TraitNodeEntryMinRank4" },
+ { false, FT_SHORT, "TraitNodeEntryMaxRank1" },
+ { false, FT_SHORT, "TraitNodeEntryMaxRank2" },
+ { false, FT_SHORT, "TraitNodeEntryMaxRank3" },
+ { false, FT_SHORT, "TraitNodeEntryMaxRank4" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), PlayerConditionMeta::Instance(), HOTFIX_SEL_PLAYER_CONDITION);
return &loadInfo;
@@ -4525,12 +4588,12 @@ struct PowerTypeLoadInfo
{ false, FT_STRING_NOT_LOCALIZED, "CostGlobalStringTag" },
{ false, FT_INT, "ID" },
{ true, FT_BYTE, "PowerTypeEnum" },
- { true, FT_BYTE, "MinPower" },
- { true, FT_SHORT, "MaxBasePower" },
- { true, FT_BYTE, "CenterPower" },
- { true, FT_BYTE, "DefaultPower" },
- { true, FT_BYTE, "DisplayModifier" },
- { true, FT_SHORT, "RegenInterruptTimeMS" },
+ { true, FT_INT, "MinPower" },
+ { true, FT_INT, "MaxBasePower" },
+ { true, FT_INT, "CenterPower" },
+ { true, FT_INT, "DefaultPower" },
+ { true, FT_INT, "DisplayModifier" },
+ { true, FT_INT, "RegenInterruptTimeMS" },
{ false, FT_FLOAT, "RegenPeace" },
{ false, FT_FLOAT, "RegenCombat" },
{ true, FT_SHORT, "Flags" },
@@ -4605,6 +4668,7 @@ struct PvpTalentLoadInfo
{ true, FT_INT, "ActionBarSpellID" },
{ true, FT_INT, "PvpTalentCategoryID" },
{ true, FT_INT, "LevelRequired" },
+ { true, FT_INT, "PlayerConditionID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), PvpTalentMeta::Instance(), HOTFIX_SEL_PVP_TALENT);
return &loadInfo;
@@ -4696,7 +4760,7 @@ struct QuestInfoLoadInfo
{ false, FT_STRING, "InfoName" },
{ true, FT_BYTE, "Type" },
{ true, FT_INT, "Modifiers" },
- { false, FT_SHORT, "Profession" },
+ { true, FT_INT, "Profession" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), QuestInfoMeta::Instance(), HOTFIX_SEL_QUEST_INFO);
return &loadInfo;
@@ -4783,6 +4847,7 @@ struct QuestV2LoadInfo
{
{ false, FT_INT, "ID" },
{ false, FT_SHORT, "UniqueBitFlag" },
+ { true, FT_INT, "UiQuestDetailsTheme" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), QuestV2Meta::Instance(), HOTFIX_SEL_QUEST_V2);
return &loadInfo;
@@ -5032,6 +5097,8 @@ struct SkillLineLoadInfo
{ true, FT_INT, "ParentTierIndex" },
{ false, FT_SHORT, "Flags" },
{ true, FT_INT, "SpellBookSpellID" },
+ { true, FT_INT, "ExpansionNameSharedStringID" },
+ { true, FT_INT, "HordeExpansionNameSharedStringID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), SkillLineMeta::Instance(), HOTFIX_SEL_SKILL_LINE);
return &loadInfo;
@@ -5045,6 +5112,8 @@ struct SkillLineAbilityLoadInfo
static constexpr DB2FieldMeta fields[] =
{
{ true, FT_LONG, "RaceMask" },
+ { false, FT_STRING, "AbilityVerb" },
+ { false, FT_STRING, "AbilityAllVerb" },
{ false, FT_INT, "ID" },
{ true, FT_SHORT, "SkillLine" },
{ true, FT_INT, "Spell" },
@@ -5111,7 +5180,7 @@ struct SoundKitLoadInfo
{ false, FT_INT, "ID" },
{ true, FT_INT, "SoundType" },
{ false, FT_FLOAT, "VolumeFloat" },
- { false, FT_SHORT, "Flags" },
+ { true, FT_INT, "Flags" },
{ false, FT_FLOAT, "MinDistance" },
{ false, FT_FLOAT, "DistanceCutoff" },
{ false, FT_BYTE, "EAXDef" },
@@ -5124,6 +5193,7 @@ struct SoundKitLoadInfo
{ false, FT_FLOAT, "PitchAdjust" },
{ false, FT_SHORT, "BusOverwriteID" },
{ false, FT_BYTE, "MaxInstances" },
+ { false, FT_INT, "SoundMixGroupID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), SoundKitMeta::Instance(), HOTFIX_SEL_SOUND_KIT);
return &loadInfo;
@@ -5192,15 +5262,19 @@ struct SpellAuraRestrictionsLoadInfo
static constexpr DB2FieldMeta fields[] =
{
{ false, FT_INT, "ID" },
- { false, FT_BYTE, "DifficultyID" },
- { false, FT_BYTE, "CasterAuraState" },
- { false, FT_BYTE, "TargetAuraState" },
- { false, FT_BYTE, "ExcludeCasterAuraState" },
- { false, FT_BYTE, "ExcludeTargetAuraState" },
+ { true, FT_INT, "DifficultyID" },
+ { true, FT_INT, "CasterAuraState" },
+ { true, FT_INT, "TargetAuraState" },
+ { true, FT_INT, "ExcludeCasterAuraState" },
+ { true, FT_INT, "ExcludeTargetAuraState" },
{ true, FT_INT, "CasterAuraSpell" },
{ true, FT_INT, "TargetAuraSpell" },
{ true, FT_INT, "ExcludeCasterAuraSpell" },
{ true, FT_INT, "ExcludeTargetAuraSpell" },
+ { true, FT_INT, "CasterAuraType" },
+ { true, FT_INT, "TargetAuraType" },
+ { true, FT_INT, "ExcludeCasterAuraType" },
+ { true, FT_INT, "ExcludeTargetAuraType" },
{ false, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), SpellAuraRestrictionsMeta::Instance(), HOTFIX_SEL_SPELL_AURA_RESTRICTIONS);
@@ -5233,7 +5307,7 @@ struct SpellCastingRequirementsLoadInfo
{ true, FT_INT, "SpellID" },
{ false, FT_BYTE, "FacingCasterFlags" },
{ false, FT_SHORT, "MinFactionID" },
- { true, FT_BYTE, "MinReputation" },
+ { true, FT_INT, "MinReputation" },
{ false, FT_SHORT, "RequiredAreasID" },
{ false, FT_BYTE, "RequiredAuraVision" },
{ false, FT_SHORT, "RequiresSpellFocus" },
@@ -5315,6 +5389,7 @@ struct SpellCooldownsLoadInfo
{ true, FT_INT, "CategoryRecoveryTime" },
{ true, FT_INT, "RecoveryTime" },
{ true, FT_INT, "StartRecoveryTime" },
+ { true, FT_INT, "AuraSpellID" },
{ false, FT_INT, "SpellID" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), SpellCooldownsMeta::Instance(), HOTFIX_SEL_SPELL_COOLDOWNS);
@@ -5445,6 +5520,7 @@ struct SpellItemEnchantmentLoadInfo
{ false, FT_INT, "ID" },
{ false, FT_STRING, "Name" },
{ false, FT_STRING, "HordeName" },
+ { true, FT_INT, "Duration" },
{ false, FT_INT, "EffectArg1" },
{ false, FT_INT, "EffectArg2" },
{ false, FT_INT, "EffectArg3" },
@@ -5644,6 +5720,7 @@ struct SpellPowerLoadInfo
{ true, FT_INT, "AltPowerBarID" },
{ false, FT_FLOAT, "PowerCostPct" },
{ false, FT_FLOAT, "PowerCostMaxPct" },
+ { false, FT_FLOAT, "OptionalCostPct" },
{ false, FT_FLOAT, "PowerPctPerSecond" },
{ true, FT_BYTE, "PowerType" },
{ true, FT_INT, "RequiredAuraSpellID" },
@@ -5763,6 +5840,22 @@ struct SpellReagentsLoadInfo
{ true, FT_SHORT, "ReagentCount6" },
{ true, FT_SHORT, "ReagentCount7" },
{ true, FT_SHORT, "ReagentCount8" },
+ { true, FT_SHORT, "ReagentRecraftCount1" },
+ { true, FT_SHORT, "ReagentRecraftCount2" },
+ { true, FT_SHORT, "ReagentRecraftCount3" },
+ { true, FT_SHORT, "ReagentRecraftCount4" },
+ { true, FT_SHORT, "ReagentRecraftCount5" },
+ { true, FT_SHORT, "ReagentRecraftCount6" },
+ { true, FT_SHORT, "ReagentRecraftCount7" },
+ { true, FT_SHORT, "ReagentRecraftCount8" },
+ { false, FT_BYTE, "ReagentSource1" },
+ { false, FT_BYTE, "ReagentSource2" },
+ { false, FT_BYTE, "ReagentSource3" },
+ { false, FT_BYTE, "ReagentSource4" },
+ { false, FT_BYTE, "ReagentSource5" },
+ { false, FT_BYTE, "ReagentSource6" },
+ { false, FT_BYTE, "ReagentSource7" },
+ { false, FT_BYTE, "ReagentSource8" },
};
static DB2LoadInfo const loadInfo(&fields[0], std::size(fields), SpellReagentsMeta::Instance(), HOTFIX_SEL_SPELL_REAGENTS);
return &loadInfo;
@@ -6017,6 +6110,7 @@ struct SpellXSpellVisualLoadInfo
{ false, FT_BYTE, "DifficultyID" },
{ false, FT_INT, "SpellVisualID" },
{ false, FT_FLOAT, "Probability" },
+ { true, FT_INT, "Flags" },
{ true, FT_INT, "Priority" },
{ true, FT_INT, "SpellIconFileID" },
{ true, FT_INT, "ActiveIconFileID" },
@@ -6398,6 +6492,7 @@ struct UiMapLinkLoadInfo
{ true, FT_INT, "ParentUiMapID" },
{ true, FT_INT, "OrderIndex" },
{ true, FT_INT, "ChildUiMapID" },
+ { true, FT_INT, "PlayerConditionID" },
{ true, FT_INT, "OverrideHighlightFileDataID" },
{ true, FT_INT, "OverrideHighlightAtlasID" },
{ true, FT_INT, "Flags" },
diff --git a/src/server/game/DataStores/DB2Metadata.h b/src/server/game/DataStores/DB2Metadata.h
index 01d75b86e04..69bcd4b5b24 100644
--- a/src/server/game/DataStores/DB2Metadata.h
+++ b/src/server/game/DataStores/DB2Metadata.h
@@ -484,7 +484,7 @@ struct AreaPOIMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[20] =
+ static constexpr DB2MetaField fields[21] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -498,6 +498,7 @@ struct AreaPOIMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, false },
+ { FT_INT, 1, true },
{ FT_SHORT, 1, false },
{ FT_SHORT, 1, true },
{ FT_SHORT, 1, false },
@@ -507,7 +508,7 @@ struct AreaPOIMeta
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(1000630, 2, 20, 20, 0xF44FDD3B, fields, 12);
+ static constexpr DB2Meta instance(1000630, 2, 21, 21, 0xD721BABB, fields, 13);
return &instance;
}
};
@@ -604,6 +605,19 @@ struct AreaTriggerActionSetMeta
}
};
+struct AreaTriggerBoundedPlaneMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[1] =
+ {
+ { FT_FLOAT, 2, true },
+ };
+ static constexpr DB2Meta instance(4266572, -1, 1, 1, 0xAFEA6110, fields, -1);
+ return &instance;
+ }
+};
+
struct AreaTriggerBoxMeta
{
static DB2Meta const* Instance()
@@ -937,7 +951,7 @@ struct AuctionHouseCategoryMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[9] =
+ static constexpr DB2MetaField fields[10] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -946,10 +960,11 @@ struct AuctionHouseCategoryMeta
{ FT_INT, 1, true },
{ FT_BYTE, 1, true },
{ FT_INT, 1, true },
- { FT_BYTE, 1, false },
{ FT_INT, 1, true },
+ { FT_BYTE, 1, false },
+ { FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(4366440, 2, 9, 8, 0xA528FA70, fields, 8);
+ static constexpr DB2Meta instance(4366440, 2, 10, 10, 0x4945050B, fields, 7);
return &instance;
}
};
@@ -1286,12 +1301,13 @@ struct BattlePetBreedQualityMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
+ { FT_INT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(801578, -1, 2, 2, 0x2D17B177, fields, -1);
+ static constexpr DB2Meta instance(801578, -1, 3, 3, 0x13065D19, fields, -1);
return &instance;
}
};
@@ -1368,13 +1384,13 @@ struct BattlePetSpeciesMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_BYTE, 1, true },
- { FT_SHORT, 1, false },
+ { FT_INT, 1, true },
{ FT_BYTE, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(841622, 2, 12, 12, 0x48CF80A3, fields, -1);
+ static constexpr DB2Meta instance(841622, 2, 12, 12, 0x7E3C11F2, fields, -1);
return &instance;
}
};
@@ -1473,7 +1489,7 @@ struct BattlemasterListMeta
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
- { FT_BYTE, 1, true },
+ { FT_INT, 1, true },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
{ FT_SHORT, 1, true },
@@ -1482,7 +1498,7 @@ struct BattlemasterListMeta
{ FT_INT, 1, true },
{ FT_SHORT, 16, true },
};
- static constexpr DB2Meta instance(1360265, -1, 17, 17, 0xE162FCC0, fields, -1);
+ static constexpr DB2Meta instance(1360265, -1, 17, 17, 0x145B6F18, fields, -1);
return &instance;
}
};
@@ -1691,7 +1707,7 @@ struct CampaignMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[12] =
+ static constexpr DB2MetaField fields[14] =
{
{ FT_STRING, 1, true },
{ FT_STRING_NOT_LOCALIZED, 1, true },
@@ -1705,8 +1721,10 @@ struct CampaignMeta
{ FT_INT, 1, true },
{ FT_INT, 1, false },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(2031607, -1, 12, 12, 0x345FBC23, fields, -1);
+ static constexpr DB2Meta instance(2031607, -1, 14, 14, 0xAD30B727, fields, -1);
return &instance;
}
};
@@ -1856,12 +1874,13 @@ struct CharBaseInfoMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1343386, -1, 2, 2, 0xFE79090E, fields, -1);
+ static constexpr DB2Meta instance(1343386, -1, 3, 3, 0x862C2392, fields, -1);
return &instance;
}
};
@@ -2072,10 +2091,10 @@ struct CharacterLoadoutMeta
{
{ FT_LONG, 1, true },
{ FT_BYTE, 1, true },
- { FT_BYTE, 1, true },
+ { FT_INT, 1, true },
{ FT_BYTE, 1, true },
};
- static constexpr DB2Meta instance(1344281, -1, 4, 4, 0x8B9E97B1, fields, -1);
+ static constexpr DB2Meta instance(1344281, -1, 4, 4, 0xEF41DC0A, fields, -1);
return &instance;
}
};
@@ -2431,19 +2450,20 @@ struct ChrCustomizationChoiceMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[9] =
+ static constexpr DB2MetaField fields[10] =
{
{ FT_STRING, 1, true },
{ FT_INT, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_SHORT, 1, false },
{ FT_SHORT, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 2, true },
};
- static constexpr DB2Meta instance(3450554, 1, 9, 9, 0xAA51F086, fields, 2);
+ static constexpr DB2Meta instance(3450554, 1, 10, 10, 0x03A6DCB1, fields, 2);
return &instance;
}
};
@@ -2455,9 +2475,9 @@ struct ChrCustomizationCondModelMeta
static constexpr DB2MetaField fields[2] =
{
{ FT_INT, 1, true },
- { FT_INT, 3, true },
+ { FT_INT, 4, true },
};
- static constexpr DB2Meta instance(3460182, -1, 2, 2, 0xA91BA37D, fields, -1);
+ static constexpr DB2Meta instance(3460182, -1, 2, 2, 0x90F7861A, fields, -1);
return &instance;
}
};
@@ -2466,7 +2486,7 @@ struct ChrCustomizationConversionMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[7] =
+ static constexpr DB2MetaField fields[8] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
@@ -2475,8 +2495,9 @@ struct ChrCustomizationConversionMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3463337, -1, 7, 7, 0x7AA98C56, fields, 4);
+ static constexpr DB2Meta instance(3463337, -1, 8, 8, 0x685C2AB5, fields, 4);
return &instance;
}
};
@@ -2501,7 +2522,7 @@ struct ChrCustomizationElementMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[9] =
+ static constexpr DB2MetaField fields[10] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
@@ -2512,8 +2533,9 @@ struct ChrCustomizationElementMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3512765, -1, 9, 9, 0x726D9D9B, fields, -1);
+ static constexpr DB2Meta instance(3512765, -1, 10, 10, 0x0E39F850, fields, -1);
return &instance;
}
};
@@ -2576,15 +2598,17 @@ struct ChrCustomizationReqMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[5] =
+ static constexpr DB2MetaField fields[7] =
{
+ { FT_STRING, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3450453, -1, 5, 5, 0x9997AC13, fields, -1);
+ static constexpr DB2Meta instance(3450453, -1, 7, 7, 0x58DDCAF5, fields, -1);
return &instance;
}
};
@@ -2607,14 +2631,42 @@ struct ChrCustomizationSkinnedModelMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[4] =
+ static constexpr DB2MetaField fields[5] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(3460183, -1, 5, 5, 0xB02FB5F3, fields, -1);
+ return &instance;
+ }
+};
+
+struct ChrCustomizationVisReqMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4724136, -1, 2, 2, 0xF5C3ABD9, fields, -1);
+ return &instance;
+ }
+};
+
+struct ChrCustomizationVoiceMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[1] =
+ {
+ { FT_BYTE, 1, true },
};
- static constexpr DB2Meta instance(3460183, -1, 4, 4, 0x6DA5BD1E, fields, -1);
+ static constexpr DB2Meta instance(4672833, -1, 1, 1, 0x647E0FF4, fields, -1);
return &instance;
}
};
@@ -2643,7 +2695,7 @@ struct ChrModelMeta
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
};
- static constexpr DB2Meta instance(3384313, 2, 17, 17, 0x3FE3E372, fields, -1);
+ static constexpr DB2Meta instance(3384313, 2, 17, 17, 0x79F06E99, fields, 4);
return &instance;
}
};
@@ -2671,18 +2723,19 @@ struct ChrModelTextureLayerMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[8] =
+ static constexpr DB2MetaField fields[9] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 3, true },
{ FT_INT, 2, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3548976, -1, 8, 7, 0x3357359C, fields, 7);
+ static constexpr DB2Meta instance(3548976, -1, 9, 8, 0x0CE385AF, fields, 8);
return &instance;
}
};
@@ -2709,12 +2762,14 @@ struct ChrRaceXChrModelMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[4] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3490304, -1, 2, 2, 0xDCBBE9D5, fields, 0);
+ static constexpr DB2Meta instance(3490304, -1, 4, 4, 0xE0B5AE0D, fields, 0);
return &instance;
}
};
@@ -2723,7 +2778,7 @@ struct ChrRacesMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[51] =
+ static constexpr DB2MetaField fields[52] =
{
{ FT_STRING_NOT_LOCALIZED, 1, true },
{ FT_STRING_NOT_LOCALIZED, 1, true },
@@ -2770,6 +2825,7 @@ struct ChrRacesMeta
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 3, true },
{ FT_FLOAT, 3, true },
+ { FT_INT, 1, true },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
@@ -2777,7 +2833,23 @@ struct ChrRacesMeta
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
};
- static constexpr DB2Meta instance(1305311, -1, 51, 51, 0xBAD9D8A9, fields, -1);
+ static constexpr DB2Meta instance(1305311, -1, 52, 52, 0xCD316971, fields, -1);
+ return &instance;
+ }
+};
+
+struct ChrRacesCreateScreenIconMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_BYTE, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4566929, 0, 4, 4, 0xD69ECEFF, fields, -1);
return &instance;
}
};
@@ -2877,9 +2949,9 @@ struct CinematicCameraMeta
{ FT_INT, 1, false },
{ FT_FLOAT, 1, true },
{ FT_INT, 1, false },
- { FT_INT, 1, true },
+ { FT_INT, 1, false },
};
- static constexpr DB2Meta instance(1294214, -1, 5, 5, 0x3920D07C, fields, -1);
+ static constexpr DB2Meta instance(1294214, -1, 5, 5, 0x4B3DF171, fields, -1);
return &instance;
}
};
@@ -3093,16 +3165,37 @@ struct ConfigurationWarningMeta
}
};
+struct ContentRestrictionRuleMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[8] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4668112, -1, 8, 7, 0x5A5B939C, fields, 7);
+ return &instance;
+ }
+};
+
struct ContentRestrictionRuleSetMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
+ { FT_INT, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(4281307, -1, 2, 2, 0xD4E8BEC4, fields, -1);
+ static constexpr DB2Meta instance(4281307, 0, 3, 3, 0x7AA89A89, fields, -1);
return &instance;
}
};
@@ -3146,6 +3239,20 @@ struct ContentTuningXExpectedMeta
}
};
+struct ContentTuningXLabelMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4659576, -1, 2, 1, 0x62982D18, fields, 1);
+ return &instance;
+ }
+};
+
struct ContributionMeta
{
static DB2Meta const* Instance()
@@ -3236,7 +3343,7 @@ struct CovenantMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[8] =
+ static constexpr DB2MetaField fields[9] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -3246,8 +3353,176 @@ struct CovenantMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3384973, -1, 8, 8, 0xAD445FBB, fields, -1);
+ static constexpr DB2Meta instance(3384973, -1, 9, 9, 0xD6E6D3C8, fields, -1);
+ return &instance;
+ }
+};
+
+struct CraftingDataMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[15] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4545611, 0, 15, 15, 0xAC3DA43D, fields, -1);
+ return &instance;
+ }
+};
+
+struct CraftingDataEnchantQualityMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4659601, -1, 4, 3, 0x31677DFD, fields, 3);
+ return &instance;
+ }
+};
+
+struct CraftingDataItemQualityMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4545612, -1, 2, 1, 0x25756325, fields, 1);
+ return &instance;
+ }
+};
+
+struct CraftingDifficultyMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[5] =
+ {
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ };
+ static constexpr DB2Meta instance(4373536, -1, 5, 5, 0xA38AD18A, fields, -1);
+ return &instance;
+ }
+};
+
+struct CraftingDifficultyQualityMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[6] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4373537, 0, 6, 5, 0xC1A830DE, fields, 5);
+ return &instance;
+ }
+};
+
+struct CraftingOrderMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4529122, -1, 3, 3, 0xB84EEC7E, fields, -1);
+ return &instance;
+ }
+};
+
+struct CraftingOrderHouseMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_FLOAT, 1, true },
+ { FT_INT, 3, true },
+ };
+ static constexpr DB2Meta instance(4688652, -1, 2, 2, 0xAC451DAB, fields, -1);
+ return &instance;
+ }
+};
+
+struct CraftingQualityMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[1] =
+ {
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4373538, -1, 1, 1, 0xE97DD64C, fields, -1);
+ return &instance;
+ }
+};
+
+struct CraftingReagentEffectMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4541803, -1, 3, 2, 0xC85861E7, fields, 2);
+ return &instance;
+ }
+};
+
+struct CraftingReagentQualityMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[6] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4382197, 0, 6, 5, 0xCE4DB0CC, fields, 5);
return &instance;
}
};
@@ -3293,6 +3568,21 @@ struct CreatureDifficultyMeta
}
};
+struct CreatureDifficultyTreasureMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4044373, -1, 3, 2, 0x248ECDA6, fields, 2);
+ return &instance;
+ }
+};
+
struct CreatureDispXUiCameraMeta
{
static DB2Meta const* Instance()
@@ -3337,9 +3627,9 @@ struct CreatureDisplayInfoMeta
{ FT_BYTE, 1, true },
{ FT_INT, 1, true },
{ FT_BYTE, 1, true },
- { FT_INT, 3, true },
+ { FT_INT, 4, true },
};
- static constexpr DB2Meta instance(1108759, 0, 25, 25, 0x1D5BDC6A, fields, -1);
+ static constexpr DB2Meta instance(1108759, 0, 25, 25, 0x357FF9CD, fields, -1);
return &instance;
}
};
@@ -3356,10 +3646,10 @@ struct CreatureDisplayInfoCondMeta
{ FT_BYTE, 1, true },
{ FT_INT, 1, false },
{ FT_INT, 1, true },
- { FT_INT, 3, true },
+ { FT_INT, 4, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1332686, 1, 8, 7, 0xBCC79C0C, fields, 7);
+ static constexpr DB2Meta instance(1332686, 1, 8, 7, 0x5EAC4BFD, fields, 7);
return &instance;
}
};
@@ -3503,6 +3793,20 @@ struct CreatureImmunitiesMeta
}
};
+struct CreatureLabelMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(3055733, -1, 2, 1, 0xF7C12CAC, fields, 1);
+ return &instance;
+ }
+};
+
struct CreatureModelDataMeta
{
static DB2Meta const* Instance()
@@ -3779,7 +4083,7 @@ struct CurrencyTypesMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[15] =
+ static constexpr DB2MetaField fields[17] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -3795,9 +4099,11 @@ struct CurrencyTypesMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, false },
{ FT_INT, 2, true },
};
- static constexpr DB2Meta instance(1095531, -1, 15, 15, 0x9DB809D5, fields, -1);
+ static constexpr DB2Meta instance(1095531, -1, 17, 17, 0x2085AB84, fields, -1);
return &instance;
}
};
@@ -3806,12 +4112,13 @@ struct CurveMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
+ { FT_INT, 1, false },
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(892585, -1, 2, 2, 0x7266948A, fields, -1);
+ static constexpr DB2Meta instance(892585, 0, 3, 3, 0x58B43CA3, fields, -1);
return &instance;
}
};
@@ -3820,14 +4127,15 @@ struct CurvePointMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[4] =
+ static constexpr DB2MetaField fields[5] =
{
{ FT_FLOAT, 2, true },
{ FT_FLOAT, 2, true },
+ { FT_INT, 1, false },
{ FT_SHORT, 1, false },
{ FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(892586, -1, 4, 4, 0x205CB4E6, fields, -1);
+ static constexpr DB2Meta instance(892586, 2, 5, 5, 0x7B45328E, fields, 3);
return &instance;
}
};
@@ -3852,7 +4160,7 @@ struct DecalPropertiesMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[21] =
+ static constexpr DB2MetaField fields[25] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
@@ -3862,6 +4170,7 @@ struct DecalPropertiesMeta
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
{ FT_INT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
@@ -3873,10 +4182,13 @@ struct DecalPropertiesMeta
{ FT_FLOAT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 4, true },
{ FT_FLOAT, 4, true },
{ FT_FLOAT, 4, true },
};
- static constexpr DB2Meta instance(1278176, -1, 21, 21, 0xAC35CDEF, fields, -1);
+ static constexpr DB2Meta instance(1278176, -1, 25, 25, 0x1E49EE02, fields, -1);
return &instance;
}
};
@@ -3987,14 +4299,15 @@ struct DisplaySeasonMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[4] =
+ static constexpr DB2MetaField fields[5] =
{
{ FT_STRING, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(4279827, -1, 4, 4, 0x80AFE414, fields, -1);
+ static constexpr DB2Meta instance(4279827, -1, 5, 5, 0xA2007E11, fields, -1);
return &instance;
}
};
@@ -4003,7 +4316,7 @@ struct DissolveEffectMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[19] =
+ static constexpr DB2MetaField fields[21] =
{
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
@@ -4024,8 +4337,10 @@ struct DissolveEffectMeta
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1304325, -1, 19, 19, 0xA9203D0B, fields, -1);
+ static constexpr DB2Meta instance(1304325, -1, 21, 21, 0xE41A3D3D, fields, -1);
return &instance;
}
};
@@ -4053,7 +4368,7 @@ struct DungeonEncounterMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[11] =
+ static constexpr DB2MetaField fields[10] =
{
{ FT_STRING, 1, true },
{ FT_INT, 1, false },
@@ -4065,9 +4380,8 @@ struct DungeonEncounterMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
- { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1347279, 1, 11, 11, 0xAEAB1A82, fields, 2);
+ static constexpr DB2Meta instance(1347279, 1, 10, 10, 0x970800CA, fields, 2);
return &instance;
}
};
@@ -4290,7 +4604,7 @@ struct FactionMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[15] =
+ static constexpr DB2MetaField fields[17] =
{
{ FT_LONG, 4, true },
{ FT_STRING, 1, true },
@@ -4299,8 +4613,10 @@ struct FactionMeta
{ FT_SHORT, 1, false },
{ FT_BYTE, 1, false },
{ FT_INT, 1, false },
- { FT_BYTE, 1, false },
+ { FT_INT, 1, true },
{ FT_SHORT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_SHORT, 4, true },
{ FT_SHORT, 4, false },
{ FT_INT, 4, true },
@@ -4308,7 +4624,7 @@ struct FactionMeta
{ FT_FLOAT, 2, true },
{ FT_BYTE, 2, false },
};
- static constexpr DB2Meta instance(1361972, -1, 15, 15, 0xEB3D0F9B, fields, -1);
+ static constexpr DB2Meta instance(1361972, -1, 17, 17, 0xBE1F09D5, fields, -1);
return &instance;
}
};
@@ -4341,10 +4657,60 @@ struct FactionTemplateMeta
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
- { FT_SHORT, 4, false },
- { FT_SHORT, 4, false },
+ { FT_SHORT, 8, false },
+ { FT_SHORT, 8, false },
};
- static constexpr DB2Meta instance(1361579, -1, 7, 7, 0x0DCC3090, fields, -1);
+ static constexpr DB2Meta instance(1361579, -1, 7, 7, 0x207C5E80, fields, -1);
+ return &instance;
+ }
+};
+
+struct FlightCapabilityMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[24] =
+ {
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4501047, -1, 24, 24, 0x5BE49A5B, fields, -1);
+ return &instance;
+ }
+};
+
+struct FlightCapabilityXGlideEventMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4644249, -1, 2, 1, 0x002DF52F, fields, 1);
return &instance;
}
};
@@ -4600,6 +4966,20 @@ struct GameObjectDisplayInfoXSoundKitMeta
}
};
+struct GameObjectLabelMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4621877, -1, 2, 1, 0xDC099311, fields, 1);
+ return &instance;
+ }
+};
+
struct GameObjectsMeta
{
static DB2Meta const* Instance()
@@ -5715,6 +6095,57 @@ struct GemPropertiesMeta
}
};
+struct GlideEventMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[10] =
+ {
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4644012, -1, 10, 10, 0x63D375D1, fields, -1);
+ return &instance;
+ }
+};
+
+struct GlideEventBlendTimesMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4682325, -1, 3, 2, 0xD91C3032, fields, 2);
+ return &instance;
+ }
+};
+
+struct GlobalColorMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_STRING_NOT_LOCALIZED, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4328468, -1, 2, 2, 0x2566517B, fields, -1);
+ return &instance;
+ }
+};
+
struct GlobalCurveMeta
{
static DB2Meta const* Instance()
@@ -5844,6 +6275,48 @@ struct GlyphRequiredSpecMeta
}
};
+struct GossipNPCOptionMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[15] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4278503, -1, 15, 15, 0x9170AADA, fields, -1);
+ return &instance;
+ }
+};
+
+struct GossipNPCOptionDisplayInfoMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4335720, -1, 3, 3, 0x8B9BF10F, fields, -1);
+ return &instance;
+ }
+};
+
struct GossipXGarrTalentTreesMeta
{
static DB2Meta const* Instance()
@@ -6006,7 +6479,7 @@ struct GroupFinderCategoryMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(974812, -1, 4, 4, 0x9B053B0D, fields, -1);
+ static constexpr DB2Meta instance(974812, -1, 4, 4, 0x257D1287, fields, -1);
return &instance;
}
};
@@ -6206,14 +6679,15 @@ struct HelmetGeosetDataMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[4] =
+ static constexpr DB2MetaField fields[5] =
{
{ FT_INT, 1, true },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, false },
+ { FT_BYTE, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(2821752, -1, 4, 3, 0xE253742F, fields, 3);
+ static constexpr DB2Meta instance(2821752, -1, 5, 4, 0x78C6B857, fields, 4);
return &instance;
}
};
@@ -6381,7 +6855,7 @@ struct ItemMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[10] =
+ static constexpr DB2MetaField fields[11] =
{
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
@@ -6393,8 +6867,9 @@ struct ItemMeta
{ FT_BYTE, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(841626, -1, 10, 10, 0x327E4945, fields, -1);
+ static constexpr DB2Meta instance(841626, -1, 11, 11, 0xBCC9BC83, fields, -1);
return &instance;
}
};
@@ -6521,12 +6996,14 @@ struct ItemBonusListGroupMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[4] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3755382, -1, 2, 2, 0x465A33AE, fields, -1);
+ static constexpr DB2Meta instance(3755382, -1, 4, 4, 0x63FD68EB, fields, -1);
return &instance;
}
};
@@ -6535,7 +7012,7 @@ struct ItemBonusListGroupEntryMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[7] =
+ static constexpr DB2MetaField fields[8] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
@@ -6544,8 +7021,9 @@ struct ItemBonusListGroupEntryMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3025306, -1, 7, 7, 0xA5579C9E, fields, 0);
+ static constexpr DB2Meta instance(3025306, -1, 8, 8, 0x1CC556EF, fields, 0);
return &instance;
}
};
@@ -6674,16 +7152,17 @@ struct ItemContextPickerEntryMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[6] =
+ static constexpr DB2MetaField fields[7] =
{
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 1, false },
{ FT_INT, 1, false },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1405665, -1, 6, 5, 0xA71A3E17, fields, 5);
+ static constexpr DB2Meta instance(1405665, -1, 7, 6, 0x3C496406, fields, 6);
return &instance;
}
};
@@ -6876,16 +7355,18 @@ struct ItemDisplayInfoMaterialResMeta
}
};
-struct ItemDisplayXUiCameraMeta
+struct ItemDisplayInfoModelMatResMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[4] =
{
{ FT_INT, 1, true },
- { FT_SHORT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1146690, -1, 2, 2, 0x5867E622, fields, -1);
+ static constexpr DB2Meta instance(4050937, -1, 4, 3, 0x9601DF6B, fields, 3);
return &instance;
}
};
@@ -6920,14 +7401,14 @@ struct ItemExtendedCostMeta
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
- { FT_BYTE, 1, false },
+ { FT_INT, 1, true },
{ FT_BYTE, 1, false },
{ FT_INT, 5, true },
{ FT_SHORT, 5, false },
{ FT_SHORT, 5, false },
{ FT_INT, 5, false },
};
- static constexpr DB2Meta instance(801681, -1, 10, 10, 0x8EA78043, fields, -1);
+ static constexpr DB2Meta instance(801681, -1, 10, 10, 0xF4D91D1F, fields, -1);
return &instance;
}
};
@@ -7034,6 +7515,35 @@ struct ItemLimitCategoryConditionMeta
}
};
+struct ItemLogicalCostMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4677533, -1, 4, 3, 0xDB1BC742, fields, 3);
+ return &instance;
+ }
+};
+
+struct ItemLogicalCostGroupMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[1] =
+ {
+ { FT_INT, 1, false },
+ };
+ static constexpr DB2Meta instance(4677534, 0, 1, 1, 0x6657BD0A, fields, -1);
+ return &instance;
+ }
+};
+
struct ItemModifiedAppearanceMeta
{
static DB2Meta const* Instance()
@@ -7142,6 +7652,36 @@ struct ItemRangedDisplayInfoMeta
}
};
+struct ItemSalvageMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4548446, -1, 3, 3, 0x362127B8, fields, -1);
+ return &instance;
+ }
+};
+
+struct ItemSalvageLootMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4549058, -1, 3, 3, 0x96554070, fields, 0);
+ return &instance;
+ }
+};
+
struct ItemSearchNameMeta
{
static DB2Meta const* Instance()
@@ -7153,7 +7693,7 @@ struct ItemSearchNameMeta
{ FT_BYTE, 1, false },
{ FT_INT, 1, true },
{ FT_SHORT, 1, false },
- { FT_BYTE, 1, false },
+ { FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_BYTE, 1, true },
{ FT_SHORT, 1, false },
@@ -7162,7 +7702,7 @@ struct ItemSearchNameMeta
{ FT_SHORT, 1, false },
{ FT_INT, 4, true },
};
- static constexpr DB2Meta instance(1273408, -1, 13, 13, 0x3F17889F, fields, -1);
+ static constexpr DB2Meta instance(1273408, -1, 13, 13, 0xBCDBBEFB, fields, -1);
return &instance;
}
};
@@ -7225,6 +7765,7 @@ struct ItemSparseMeta
{ FT_INT, 10, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 1, false },
{ FT_INT, 1, false },
{ FT_INT, 1, false },
@@ -7266,12 +7807,11 @@ struct ItemSparseMeta
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
- { FT_BYTE, 1, false },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, true },
};
- static constexpr DB2Meta instance(1572924, -1, 64, 64, 0xE80AABF8, fields, -1);
+ static constexpr DB2Meta instance(1572924, -1, 64, 64, 0xB07DD994, fields, -1);
return &instance;
}
};
@@ -7531,7 +8071,7 @@ struct JournalInstanceMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[10] =
+ static constexpr DB2MetaField fields[9] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -7540,11 +8080,10 @@ struct JournalInstanceMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
- { FT_BYTE, 1, false },
{ FT_INT, 1, true },
{ FT_SHORT, 1, false },
};
- static constexpr DB2Meta instance(1237438, -1, 10, 10, 0xCBFE4A96, fields, -1);
+ static constexpr DB2Meta instance(1237438, -1, 9, 9, 0xE213FF3B, fields, -1);
return &instance;
}
};
@@ -7595,12 +8134,13 @@ struct JournalTierXInstanceMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
{ FT_SHORT, 1, false },
{ FT_SHORT, 1, false },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1285009, -1, 2, 2, 0xEF61F77B, fields, 0);
+ static constexpr DB2Meta instance(1285009, -1, 3, 3, 0x003E6589, fields, 0);
return &instance;
}
};
@@ -7686,7 +8226,7 @@ struct LFGDungeonsMeta
{ FT_INT, 1, true },
{ FT_INT, 2, true },
};
- static constexpr DB2Meta instance(1361033, -1, 29, 29, 0x11A21324, fields, -1);
+ static constexpr DB2Meta instance(1361033, -1, 29, 29, 0x5314B0A9, fields, -1);
return &instance;
}
};
@@ -7710,12 +8250,13 @@ struct LabelXContentRestrictRuleSetMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(4281309, -1, 2, 1, 0x2FB539AB, fields, 1);
+ static constexpr DB2Meta instance(4281309, -1, 3, 2, 0x4F3F4F82, fields, 2);
return &instance;
}
};
@@ -7786,7 +8327,7 @@ struct LightDataMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[45] =
+ static constexpr DB2MetaField fields[46] =
{
{ FT_SHORT, 1, false },
{ FT_SHORT, 1, false },
@@ -7830,11 +8371,12 @@ struct LightDataMeta
{ FT_FLOAT, 1, true },
{ FT_INT, 1, false },
{ FT_INT, 1, false },
+ { FT_INT, 1, true },
{ FT_FLOAT, 4, true },
{ FT_FLOAT, 4, true },
{ FT_FLOAT, 4, true },
};
- static constexpr DB2Meta instance(1375580, -1, 45, 45, 0xD057E40C, fields, 0);
+ static constexpr DB2Meta instance(1375580, -1, 46, 46, 0x5A08CEBB, fields, 0);
return &instance;
}
};
@@ -7878,6 +8420,21 @@ struct LightSkyboxMeta
}
};
+struct LightWorldShadowMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4680119, -1, 3, 2, 0x59642561, fields, 2);
+ return &instance;
+ }
+};
+
struct LightningMeta
{
static DB2Meta const* Instance()
@@ -8004,6 +8561,19 @@ struct LiquidTypeXTextureMeta
}
};
+struct LivingWorldObjectTemplateMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[1] =
+ {
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4276965, -1, 1, 1, 0x74706E81, fields, -1);
+ return &instance;
+ }
+};
+
struct LoadingScreenSkinMeta
{
static DB2Meta const* Instance()
@@ -8108,15 +8678,16 @@ struct LockTypeMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[5] =
+ static constexpr DB2MetaField fields[6] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
{ FT_STRING_NOT_LOCALIZED, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, false },
};
- static constexpr DB2Meta instance(1284823, -1, 5, 5, 0x9C547CBC, fields, -1);
+ static constexpr DB2Meta instance(1284823, -1, 6, 6, 0x62421B4C, fields, -1);
return &instance;
}
};
@@ -8188,12 +8759,13 @@ struct MCRSlotXMCRCategoryMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3390955, -1, 2, 1, 0x9E7DBEAA, fields, 1);
+ static constexpr DB2Meta instance(3390955, -1, 3, 2, 0x39F35458, fields, 2);
return &instance;
}
};
@@ -8321,7 +8893,7 @@ struct MapMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[23] =
+ static constexpr DB2MetaField fields[24] =
{
{ FT_STRING_NOT_LOCALIZED, 1, true },
{ FT_STRING, 1, true },
@@ -8345,9 +8917,10 @@ struct MapMeta
{ FT_SHORT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 3, true },
};
- static constexpr DB2Meta instance(1349477, -1, 23, 23, 0xAAA1F94E, fields, -1);
+ static constexpr DB2Meta instance(1349477, -1, 24, 24, 0x43E626E4, fields, -1);
return &instance;
}
};
@@ -8441,6 +9014,26 @@ struct MapLoadingScreenMeta
}
};
+struct MapRenderScaleMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[8] =
+ {
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ };
+ static constexpr DB2Meta instance(4633656, -1, 8, 8, 0x1D8358EA, fields, -1);
+ return &instance;
+ }
+};
+
struct MarketingPromotionsXLocaleMeta
{
static DB2Meta const* Instance()
@@ -8563,14 +9156,15 @@ struct ModelFileDataMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[4] =
+ static constexpr DB2MetaField fields[5] =
{
+ { FT_FLOAT, 6, true },
{ FT_INT, 1, false },
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
{ FT_INT, 1, false },
};
- static constexpr DB2Meta instance(1337833, 0, 4, 4, 0xDFBC2A88, fields, 3);
+ static constexpr DB2Meta instance(1337833, 1, 5, 5, 0x825A2247, fields, 4);
return &instance;
}
};
@@ -8593,13 +9187,30 @@ struct ModifiedCraftingCategoryMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[3] =
+ static constexpr DB2MetaField fields[5] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
{ FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(3386486, -1, 5, 5, 0x0BD1387B, fields, -1);
+ return &instance;
+ }
+};
+
+struct ModifiedCraftingItemMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3386486, -1, 3, 3, 0xB867034E, fields, -1);
+ static constexpr DB2Meta instance(4530643, 0, 3, 3, 0x16C3DB39, fields, -1);
return &instance;
}
};
@@ -8626,13 +9237,16 @@ struct ModifiedCraftingReagentSlotMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[3] =
+ static constexpr DB2MetaField fields[6] =
{
{ FT_STRING, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(3386488, -1, 3, 3, 0x0A01A16B, fields, -1);
+ static constexpr DB2Meta instance(3386488, 1, 6, 6, 0xFEE69CA3, fields, -1);
return &instance;
}
};
@@ -8641,27 +9255,16 @@ struct ModifiedCraftingSpellSlotMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[4] =
+ static constexpr DB2MetaField fields[6] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
- };
- static constexpr DB2Meta instance(3390956, -1, 4, 4, 0x4287A74D, fields, 0);
- return &instance;
- }
-};
-
-struct ModifiedReagentItemMeta
-{
- static DB2Meta const* Instance()
- {
- static constexpr DB2MetaField fields[1] =
- {
+ { FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3386490, -1, 1, 1, 0x106F4AE2, fields, -1);
+ static constexpr DB2Meta instance(3390956, -1, 6, 6, 0x87027844, fields, 0);
return &instance;
}
};
@@ -8714,7 +9317,7 @@ struct MountCapabilityMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[8] =
+ static constexpr DB2MetaField fields[9] =
{
{ FT_BYTE, 1, false },
{ FT_SHORT, 1, false },
@@ -8724,8 +9327,9 @@ struct MountCapabilityMeta
{ FT_INT, 1, true },
{ FT_SHORT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1114709, -1, 8, 8, 0x4F0F6872, fields, -1);
+ static constexpr DB2Meta instance(1114709, -1, 9, 9, 0x7620F729, fields, -1);
return &instance;
}
};
@@ -9532,7 +10136,7 @@ struct PlayerConditionMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[80] =
+ static constexpr DB2MetaField fields[84] =
{
{ FT_LONG, 1, true },
{ FT_STRING, 1, true },
@@ -9590,6 +10194,7 @@ struct PlayerConditionMeta
{ FT_BYTE, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, false },
{ FT_SHORT, 4, false },
{ FT_SHORT, 4, false },
{ FT_SHORT, 4, false },
@@ -9614,8 +10219,11 @@ struct PlayerConditionMeta
{ FT_INT, 4, false },
{ FT_INT, 6, false },
{ FT_INT, 2, true },
+ { FT_INT, 4, true },
+ { FT_SHORT, 4, false },
+ { FT_SHORT, 4, false },
};
- static constexpr DB2Meta instance(1045411, -1, 80, 80, 0xCBD65EC2, fields, -1);
+ static constexpr DB2Meta instance(1045411, -1, 84, 84, 0x4FD5055D, fields, -1);
return &instance;
}
};
@@ -9706,17 +10314,17 @@ struct PowerTypeMeta
{ FT_STRING_NOT_LOCALIZED, 1, true },
{ FT_INT, 1, false },
{ FT_BYTE, 1, true },
- { FT_BYTE, 1, true },
- { FT_SHORT, 1, true },
- { FT_BYTE, 1, true },
- { FT_BYTE, 1, true },
- { FT_BYTE, 1, true },
- { FT_SHORT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_SHORT, 1, true },
};
- static constexpr DB2Meta instance(1266022, 2, 13, 13, 0x5DEC7C8C, fields, -1);
+ static constexpr DB2Meta instance(1266022, 2, 13, 13, 0xE8AC7EEC, fields, -1);
return &instance;
}
};
@@ -9738,6 +10346,202 @@ struct PrestigeLevelInfoMeta
}
};
+struct ProfTraitPathNodeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[5] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4542069, 0, 5, 5, 0x93D92E33, fields, -1);
+ return &instance;
+ }
+};
+
+struct ProfTraitPerkNodeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4542084, 0, 4, 4, 0x53D97158, fields, -1);
+ return &instance;
+ }
+};
+
+struct ProfTraitTreeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4542085, 0, 2, 2, 0x55614ED1, fields, -1);
+ return &instance;
+ }
+};
+
+struct ProfessionMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[12] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4508544, 0, 12, 12, 0x2E97F732, fields, -1);
+ return &instance;
+ }
+};
+
+struct ProfessionEffectMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4505297, -1, 3, 3, 0xB42F4258, fields, -1);
+ return &instance;
+ }
+};
+
+struct ProfessionEffectTypeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_STRING, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4556715, -1, 2, 1, 0xFE8414F9, fields, 1);
+ return &instance;
+ }
+};
+
+struct ProfessionPropPointsMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[6] =
+ {
+ { FT_FLOAT, 2, true },
+ { FT_FLOAT, 2, true },
+ { FT_FLOAT, 2, true },
+ { FT_INT, 2, false },
+ { FT_INT, 2, false },
+ { FT_INT, 2, false },
+ };
+ static constexpr DB2Meta instance(4452078, -1, 6, 6, 0xE2DEF177, fields, -1);
+ return &instance;
+ }
+};
+
+struct ProfessionRatingMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[6] =
+ {
+ { FT_STRING, 1, true },
+ { FT_STRING, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4623413, 2, 6, 5, 0x78F181BD, fields, 5);
+ return &instance;
+ }
+};
+
+struct ProfessionTraitMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4505298, 0, 2, 2, 0xFB4B3FF8, fields, -1);
+ return &instance;
+ }
+};
+
+struct ProfessionTraitXEffectMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4505494, 0, 4, 4, 0x86D1D9C8, fields, 1);
+ return &instance;
+ }
+};
+
+struct ProfessionTraitXLabelMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4505299, 0, 3, 3, 0x3234BADF, fields, 1);
+ return &instance;
+ }
+};
+
+struct ProfessionXRatingMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ };
+ static constexpr DB2Meta instance(4868299, -1, 3, 3, 0x72DDE591, fields, -1);
+ return &instance;
+ }
+};
+
struct PvpBrawlMeta
{
static DB2Meta const* Instance()
@@ -9757,6 +10561,22 @@ struct PvpBrawlMeta
}
};
+struct PvpRatingMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_STRING_NOT_LOCALIZED, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4699082, -1, 4, 4, 0x4855B7DE, fields, -1);
+ return &instance;
+ }
+};
+
struct PvpScalingEffectMeta
{
static DB2Meta const* Instance()
@@ -9820,7 +10640,7 @@ struct PvpTalentMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[9] =
+ static constexpr DB2MetaField fields[10] =
{
{ FT_STRING, 1, true },
{ FT_INT, 1, false },
@@ -9831,8 +10651,9 @@ struct PvpTalentMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1302853, 1, 9, 9, 0x7150D804, fields, 2);
+ static constexpr DB2Meta instance(1302853, 1, 10, 10, 0xEC6943FA, fields, 2);
return &instance;
}
};
@@ -9929,9 +10750,9 @@ struct QuestInfoMeta
{ FT_STRING, 1, true },
{ FT_BYTE, 1, true },
{ FT_INT, 1, true },
- { FT_SHORT, 1, false },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1120960, -1, 4, 4, 0x8CE69EF5, fields, -1);
+ static constexpr DB2Meta instance(1120960, -1, 4, 4, 0xAFE57F67, fields, -1);
return &instance;
}
};
@@ -9992,11 +10813,11 @@ struct QuestObjectiveMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_BYTE, 1, false },
- { FT_BYTE, 1, false },
+ { FT_INT, 1, true },
{ FT_BYTE, 1, false },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1251960, -1, 8, 7, 0xBE46257D, fields, 7);
+ static constexpr DB2Meta instance(1251960, -1, 8, 7, 0x0CF5606A, fields, 7);
return &instance;
}
};
@@ -10073,11 +10894,12 @@ struct QuestV2Meta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[1] =
+ static constexpr DB2MetaField fields[2] =
{
{ FT_SHORT, 1, false },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1139443, -1, 1, 1, 0xBB71B2AE, fields, -1);
+ static constexpr DB2Meta instance(1139443, -1, 2, 2, 0xB2004732, fields, -1);
return &instance;
}
};
@@ -10793,6 +11615,21 @@ struct ShadowyEffectMeta
}
};
+struct SharedStringMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_STRING, 1, true },
+ { FT_INT, 1, false },
+ { FT_BYTE, 1, false },
+ };
+ static constexpr DB2Meta instance(4620073, 1, 3, 3, 0x31B665AF, fields, -1);
+ return &instance;
+ }
+};
+
struct SiegeablePropertiesMeta
{
static DB2Meta const* Instance()
@@ -10813,7 +11650,7 @@ struct SkillLineMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[13] =
+ static constexpr DB2MetaField fields[15] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -10828,8 +11665,10 @@ struct SkillLineMeta
{ FT_INT, 1, true },
{ FT_SHORT, 1, false },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1240935, 5, 13, 13, 0x83E286E5, fields, -1);
+ static constexpr DB2Meta instance(1240935, 5, 15, 15, 0xF0D60375, fields, -1);
return &instance;
}
};
@@ -10838,9 +11677,11 @@ struct SkillLineAbilityMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[15] =
+ static constexpr DB2MetaField fields[17] =
{
{ FT_LONG, 1, true },
+ { FT_STRING, 1, true },
+ { FT_STRING, 1, true },
{ FT_INT, 1, false },
{ FT_SHORT, 1, true },
{ FT_INT, 1, true },
@@ -10856,7 +11697,22 @@ struct SkillLineAbilityMeta
{ FT_SHORT, 1, true },
{ FT_SHORT, 1, true },
};
- static constexpr DB2Meta instance(1266278, 1, 15, 15, 0x0FCCC8B4, fields, 2);
+ static constexpr DB2Meta instance(1266278, 3, 17, 17, 0x1D9E00B1, fields, 4);
+ return &instance;
+ }
+};
+
+struct SkillLineXTraitTreeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4505477, -1, 3, 3, 0xB2E9968F, fields, 0);
return &instance;
}
};
@@ -11169,11 +12025,11 @@ struct SoundKitMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[15] =
+ static constexpr DB2MetaField fields[16] =
{
{ FT_INT, 1, true },
{ FT_FLOAT, 1, true },
- { FT_SHORT, 1, false },
+ { FT_INT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_BYTE, 1, false },
@@ -11186,8 +12042,9 @@ struct SoundKitMeta
{ FT_FLOAT, 1, true },
{ FT_SHORT, 1, false },
{ FT_BYTE, 1, false },
+ { FT_INT, 1, false },
};
- static constexpr DB2Meta instance(1237434, -1, 15, 15, 0x3FE1D132, fields, -1);
+ static constexpr DB2Meta instance(1237434, -1, 16, 16, 0x170F2CC3, fields, -1);
return &instance;
}
};
@@ -11304,6 +12161,23 @@ struct SoundKitFallbackMeta
}
};
+struct SoundMixGroupMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[5] =
+ {
+ { FT_STRING_NOT_LOCALIZED, 1, true },
+ { FT_STRING_NOT_LOCALIZED, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ };
+ static constexpr DB2Meta instance(4618887, -1, 5, 5, 0x25A56C20, fields, -1);
+ return &instance;
+ }
+};
+
struct SoundOverrideMeta
{
static DB2Meta const* Instance()
@@ -11373,6 +12247,20 @@ struct SoundProviderPreferencesMeta
}
};
+struct SoundWaterfallEmitterMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4756178, -1, 2, 2, 0xF82CAB0A, fields, -1);
+ return &instance;
+ }
+};
+
struct SourceInfoMeta
{
static DB2Meta const* Instance()
@@ -11523,20 +12411,24 @@ struct SpellAuraRestrictionsMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[10] =
+ static constexpr DB2MetaField fields[14] =
{
- { FT_BYTE, 1, false },
- { FT_BYTE, 1, false },
- { FT_BYTE, 1, false },
- { FT_BYTE, 1, false },
- { FT_BYTE, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(981566, -1, 10, 9, 0x98916922, fields, 9);
+ static constexpr DB2Meta instance(981566, -1, 14, 13, 0x78912DD7, fields, 13);
return &instance;
}
};
@@ -11594,12 +12486,12 @@ struct SpellCastingRequirementsMeta
{ FT_INT, 1, true },
{ FT_BYTE, 1, false },
{ FT_SHORT, 1, false },
- { FT_BYTE, 1, true },
+ { FT_INT, 1, true },
{ FT_SHORT, 1, false },
{ FT_BYTE, 1, false },
{ FT_SHORT, 1, false },
};
- static constexpr DB2Meta instance(1002166, -1, 7, 7, 0xA1320F30, fields, -1);
+ static constexpr DB2Meta instance(1002166, -1, 7, 7, 0x76B9E4FB, fields, -1);
return &instance;
}
};
@@ -11825,15 +12717,16 @@ struct SpellCooldownsMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[5] =
+ static constexpr DB2MetaField fields[6] =
{
{ FT_BYTE, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1139924, -1, 5, 4, 0xDD35D72E, fields, 4);
+ static constexpr DB2Meta instance(1139924, -1, 6, 5, 0x254654DD, fields, 5);
return &instance;
}
};
@@ -11959,6 +12852,36 @@ struct SpellEffectEmissionMeta
}
};
+struct SpellEmpowerMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4507381, 0, 3, 3, 0x7F1952AF, fields, -1);
+ return &instance;
+ }
+};
+
+struct SpellEmpowerStageMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4871072, -1, 3, 2, 0x6A138C60, fields, 2);
+ return &instance;
+ }
+};
+
struct SpellEquippedItemsMeta
{
static DB2Meta const* Instance()
@@ -12042,10 +12965,11 @@ struct SpellItemEnchantmentMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[22] =
+ static constexpr DB2MetaField fields[23] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 3, false },
{ FT_FLOAT, 3, true },
{ FT_INT, 1, false },
@@ -12067,7 +12991,7 @@ struct SpellItemEnchantmentMeta
{ FT_BYTE, 1, false },
{ FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(1362771, -1, 22, 22, 0x3C42D738, fields, -1);
+ static constexpr DB2Meta instance(1362771, -1, 23, 23, 0xF7D222D6, fields, -1);
return &instance;
}
};
@@ -12130,7 +13054,7 @@ struct SpellLearnSpellMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1001907, -1, 3, 3, 0x6E612037, fields, -1);
+ static constexpr DB2Meta instance(1001907, -1, 3, 3, 0x33C8C506, fields, 0);
return &instance;
}
};
@@ -12269,7 +13193,7 @@ struct SpellPowerMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[14] =
+ static constexpr DB2MetaField fields[15] =
{
{ FT_INT, 1, false },
{ FT_BYTE, 1, false },
@@ -12281,12 +13205,13 @@ struct SpellPowerMeta
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
{ FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
{ FT_BYTE, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, false },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(982806, 0, 14, 13, 0xD61F566E, fields, 13);
+ static constexpr DB2Meta instance(982806, 0, 15, 14, 0xE5EED97C, fields, 14);
return &instance;
}
};
@@ -12386,13 +13311,15 @@ struct SpellReagentsMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[3] =
+ static constexpr DB2MetaField fields[5] =
{
{ FT_INT, 1, true },
{ FT_INT, 8, true },
{ FT_SHORT, 8, true },
+ { FT_SHORT, 8, true },
+ { FT_BYTE, 8, false },
};
- static constexpr DB2Meta instance(841946, -1, 3, 3, 0xF0E58683, fields, -1);
+ static constexpr DB2Meta instance(841946, -1, 5, 5, 0xB40074F0, fields, -1);
return &instance;
}
};
@@ -12412,6 +13339,20 @@ struct SpellReagentsCurrencyMeta
}
};
+struct SpellReplacementMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[2] =
+ {
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4674394, -1, 2, 2, 0x88FB6F2C, fields, 0);
+ return &instance;
+ }
+};
+
struct SpellScalingMeta
{
static DB2Meta const* Instance()
@@ -12646,7 +13587,7 @@ struct SpellVisualEventMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[9] =
+ static constexpr DB2MetaField fields[11] =
{
{ FT_INT, 1, true },
{ FT_INT, 1, true },
@@ -12657,8 +13598,10 @@ struct SpellVisualEventMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1685317, -1, 9, 8, 0x54DB405C, fields, 8);
+ static constexpr DB2Meta instance(1685317, -1, 11, 10, 0xC9A05AD5, fields, 10);
return &instance;
}
};
@@ -12838,7 +13781,7 @@ struct SpellXSpellVisualMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[12] =
+ static constexpr DB2MetaField fields[13] =
{
{ FT_INT, 1, false },
{ FT_BYTE, 1, false },
@@ -12847,13 +13790,14 @@ struct SpellXSpellVisualMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_SHORT, 1, false },
{ FT_INT, 1, false },
{ FT_SHORT, 1, false },
{ FT_INT, 1, false },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1101657, 0, 12, 11, 0x4C5EA5C5, fields, 11);
+ static constexpr DB2Meta instance(1101657, 0, 13, 12, 0x049D96D6, fields, 12);
return &instance;
}
};
@@ -13208,6 +14152,411 @@ struct TradeSkillItemMeta
}
};
+struct TraitCondMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[15] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4543085, 0, 15, 15, 0x91F4174C, fields, 2);
+ return &instance;
+ }
+};
+
+struct TraitCostMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_STRING_NOT_LOCALIZED, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420295, 1, 4, 4, 0xCECF8496, fields, -1);
+ return &instance;
+ }
+};
+
+struct TraitCurrencyMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[5] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4524216, 0, 5, 5, 0x5BF919EC, fields, -1);
+ return &instance;
+ }
+};
+
+struct TraitCurrencySourceMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[9] =
+ {
+ { FT_STRING, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4539393, 1, 9, 9, 0xD42C05FC, fields, 2);
+ return &instance;
+ }
+};
+
+struct TraitDefinitionMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[8] =
+ {
+ { FT_STRING, 1, true },
+ { FT_STRING, 1, true },
+ { FT_STRING, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420327, 3, 8, 8, 0x05675F68, fields, -1);
+ return &instance;
+ }
+};
+
+struct TraitDefinitionEffectPointsMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[5] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4536895, 0, 5, 5, 0x5C22E1DB, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitEdgeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[5] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420308, 0, 5, 5, 0x32F9DD9A, fields, 2);
+ return &instance;
+ }
+};
+
+struct TraitNodeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[6] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_BYTE, 1, false },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420297, 0, 6, 6, 0x839579A1, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitNodeEntryMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_BYTE, 1, false },
+ };
+ static constexpr DB2Meta instance(4420298, 0, 4, 4, 0x81B195E8, fields, -1);
+ return &instance;
+ }
+};
+
+struct TraitNodeEntryXTraitCondMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4543088, 0, 3, 3, 0x53ACC501, fields, 2);
+ return &instance;
+ }
+};
+
+struct TraitNodeEntryXTraitCostMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420299, 0, 3, 3, 0x4178D9E2, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitNodeGroupMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420300, 0, 3, 3, 0xF4E2E579, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitNodeGroupXTraitCondMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4543090, 0, 3, 3, 0x28117816, fields, 2);
+ return &instance;
+ }
+};
+
+struct TraitNodeGroupXTraitCostMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420301, 0, 3, 3, 0x97B85B29, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitNodeGroupXTraitNodeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420302, 0, 4, 4, 0xD91D6CFE, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitNodeXTraitCondMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4543092, 0, 3, 3, 0xFEFA16A7, fields, 2);
+ return &instance;
+ }
+};
+
+struct TraitNodeXTraitCostMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420303, 0, 3, 3, 0x883FDE7A, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitNodeXTraitNodeEntryMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420304, 0, 4, 4, 0xCED10275, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitSystemMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4635649, 0, 3, 3, 0xD92E8FE4, fields, -1);
+ return &instance;
+ }
+};
+
+struct TraitTreeMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[8] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ { FT_FLOAT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420305, 0, 8, 8, 0xCA7B3D57, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitTreeLoadoutMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4669507, 0, 3, 3, 0xDE3BFB35, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitTreeLoadoutEntryMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[6] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4669509, 0, 6, 6, 0x3B3D126A, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitTreeXTraitCostMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[3] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4420306, 0, 3, 3, 0x823738BA, fields, 1);
+ return &instance;
+ }
+};
+
+struct TraitTreeXTraitCurrencyMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4524218, 0, 4, 4, 0x298B67E6, fields, 2);
+ return &instance;
+ }
+};
+
struct TransformMatrixMeta
{
static DB2Meta const* Instance()
@@ -13458,6 +14807,25 @@ struct UICovenantPreviewMeta
}
};
+struct UIDeadlyDebuffMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[7] =
+ {
+ { FT_STRING, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4579858, 1, 7, 7, 0xAD10C12D, fields, -1);
+ return &instance;
+ }
+};
+
struct UIDungeonScoreRarityMeta
{
static DB2Meta const* Instance()
@@ -13486,7 +14854,7 @@ struct UIEventToastMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[20] =
+ static constexpr DB2MetaField fields[21] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -13494,6 +14862,7 @@ struct UIEventToastMeta
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
+ { FT_INT, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
@@ -13509,7 +14878,7 @@ struct UIEventToastMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3946498, -1, 20, 20, 0xD800F14D, fields, -1);
+ static constexpr DB2Meta instance(3946498, 6, 21, 21, 0x1B94BDE2, fields, -1);
return &instance;
}
};
@@ -13518,13 +14887,16 @@ struct UIExpansionDisplayInfoMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[3] =
+ static constexpr DB2MetaField fields[6] =
{
+ { FT_INT, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(1729547, -1, 3, 3, 0xF6D1CC7A, fields, -1);
+ static constexpr DB2Meta instance(1729547, 0, 6, 6, 0x64FFA4B9, fields, -1);
return &instance;
}
};
@@ -13544,6 +14916,24 @@ struct UIExpansionDisplayInfoIconMeta
}
};
+struct UIGenericWidgetDisplayMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[6] =
+ {
+ { FT_STRING, 1, true },
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4861207, 1, 6, 6, 0xDE7C26FF, fields, -1);
+ return &instance;
+ }
+};
+
struct UIModifiedInstanceMeta
{
static DB2Meta const* Instance()
@@ -13740,7 +15130,7 @@ struct UiItemInteractionMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[16] =
+ static constexpr DB2MetaField fields[18] =
{
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
@@ -13748,6 +15138,7 @@ struct UiItemInteractionMeta
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
{ FT_STRING, 1, true },
+ { FT_STRING, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
@@ -13758,8 +15149,9 @@ struct UiItemInteractionMeta
{ FT_BYTE, 1, false },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(3182424, -1, 16, 16, 0xB9E40623, fields, -1);
+ static constexpr DB2Meta instance(3182424, -1, 18, 18, 0xA6022569, fields, -1);
return &instance;
}
};
@@ -13916,7 +15308,7 @@ struct UiMapLinkMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[9] =
+ static constexpr DB2MetaField fields[10] =
{
{ FT_FLOAT, 2, true },
{ FT_FLOAT, 2, true },
@@ -13927,8 +15319,9 @@ struct UiMapLinkMeta
{ FT_INT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
};
- static constexpr DB2Meta instance(2030690, 2, 9, 9, 0xAB3E538F, fields, 3);
+ static constexpr DB2Meta instance(2030690, 2, 10, 10, 0x11F6CF6C, fields, 3);
return &instance;
}
};
@@ -13952,12 +15345,13 @@ struct UiModelSceneMeta
{
static DB2Meta const* Instance()
{
- static constexpr DB2MetaField fields[2] =
+ static constexpr DB2MetaField fields[3] =
{
+ { FT_INT, 1, false },
{ FT_BYTE, 1, true },
{ FT_BYTE, 1, false },
};
- static constexpr DB2Meta instance(1548215, -1, 2, 2, 0xB25F82C0, fields, -1);
+ static constexpr DB2Meta instance(1548215, 0, 3, 3, 0x97CD29E5, fields, -1);
return &instance;
}
};
@@ -14132,6 +15526,22 @@ struct UiTextureKitMeta
}
};
+struct UiWeeklyRewardMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_INT, 1, false },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ };
+ static constexpr DB2Meta instance(4737221, 0, 4, 4, 0x03D3F36F, fields, -1);
+ return &instance;
+ }
+};
+
struct UiWidgetMeta
{
static DB2Meta const* Instance()
@@ -15029,6 +16439,22 @@ struct WorldMapOverlayTileMeta
}
};
+struct WorldShadowMeta
+{
+ static DB2Meta const* Instance()
+ {
+ static constexpr DB2MetaField fields[4] =
+ {
+ { FT_FLOAT, 2, true },
+ { FT_INT, 1, true },
+ { FT_INT, 1, true },
+ { FT_FLOAT, 1, true },
+ };
+ static constexpr DB2Meta instance(4680120, -1, 4, 4, 0x11BC9DDD, fields, -1);
+ return &instance;
+ }
+};
+
struct WorldStateExpressionMeta
{
static DB2Meta const* Instance()
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 3f78e9371b4..05b1be2e24b 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -154,6 +154,7 @@ DB2Storage<GlobalCurveEntry> sGlobalCurveStore("GlobalCurve.d
DB2Storage<GlyphBindableSpellEntry> sGlyphBindableSpellStore("GlyphBindableSpell.db2", GlyphBindableSpellLoadInfo::Instance());
DB2Storage<GlyphPropertiesEntry> sGlyphPropertiesStore("GlyphProperties.db2", GlyphPropertiesLoadInfo::Instance());
DB2Storage<GlyphRequiredSpecEntry> sGlyphRequiredSpecStore("GlyphRequiredSpec.db2", GlyphRequiredSpecLoadInfo::Instance());
+DB2Storage<GossipNPCOptionEntry> sGossipNPCOptionStore("GossipNPCOption.db2", GossipNpcOptionLoadInfo::Instance());
DB2Storage<GuildColorBackgroundEntry> sGuildColorBackgroundStore("GuildColorBackground.db2", GuildColorBackgroundLoadInfo::Instance());
DB2Storage<GuildColorBorderEntry> sGuildColorBorderStore("GuildColorBorder.db2", GuildColorBorderLoadInfo::Instance());
DB2Storage<GuildColorEmblemEntry> sGuildColorEmblemStore("GuildColorEmblem.db2", GuildColorEmblemLoadInfo::Instance());
@@ -370,7 +371,7 @@ typedef std::unordered_map<uint32 /*bonusListId*/, DB2Manager::ItemBonusList> It
typedef std::unordered_map<int16, uint32> ItemBonusListLevelDeltaContainer;
typedef std::unordered_multimap<uint32 /*itemId*/, uint32 /*bonusTreeId*/> ItemToBonusTreeContainer;
typedef std::unordered_map<uint32 /*itemId*/, ItemChildEquipmentEntry const*> ItemChildEquipmentContainer;
-typedef std::array<ItemClassEntry const*, 19> ItemClassByOldEnumContainer;
+typedef std::array<ItemClassEntry const*, 20> ItemClassByOldEnumContainer;
typedef std::unordered_map<uint32, std::vector<ItemLimitCategoryConditionEntry const*>> ItemLimitCategoryConditionContainer;
typedef std::set<ItemLevelSelectorQualityEntry const*, ItemLevelSelectorQualityEntryComparator> ItemLevelSelectorQualities;
typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, ItemModifiedAppearanceEntry const*> ItemModifiedAppearanceByItemContainer;
@@ -729,6 +730,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
LOAD_DB2(sGlyphBindableSpellStore);
LOAD_DB2(sGlyphPropertiesStore);
LOAD_DB2(sGlyphRequiredSpecStore);
+ LOAD_DB2(sGossipNPCOptionStore);
LOAD_DB2(sGuildColorBackgroundStore);
LOAD_DB2(sGuildColorBorderStore);
LOAD_DB2(sGuildColorEmblemStore);
@@ -925,13 +927,13 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
}
// Check loaded DB2 files proper version
- if (!sAreaTableStore.LookupEntry(14083) || // last area added in 9.2.7 (45114)
- !sCharTitlesStore.LookupEntry(727) || // last char title added in 9.2.7 (45114)
- !sGemPropertiesStore.LookupEntry(3922) || // last gem property added in 9.2.7 (45114)
- !sItemStore.LookupEntry(199202) || // last item added in 9.2.7 (45114)
- !sItemExtendedCostStore.LookupEntry(7316) || // last item extended cost added in 9.2.7 (45114)
- !sMapStore.LookupEntry(2559) || // last map added in 9.2.7 (45114)
- !sSpellNameStore.LookupEntry(387936)) // last spell added in 9.2.7 (45114)
+ if (!sAreaTableStore.LookupEntry(14618) || // last area added in 10.0.2 (46741)
+ !sCharTitlesStore.LookupEntry(749) || // last char title added in 10.0.2 (46741)
+ !sGemPropertiesStore.LookupEntry(4028) || // last gem property added in 10.0.2 (46741)
+ !sItemStore.LookupEntry(202712) || // last item added in 10.0.2 (46741)
+ !sItemExtendedCostStore.LookupEntry(7862) || // last item extended cost added in 10.0.2 (46741)
+ !sMapStore.LookupEntry(2582) || // last map added in 10.0.2 (46741)
+ !sSpellNameStore.LookupEntry(399311)) // last spell added in 10.0.2 (46741)
{
TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client.");
exit(1);
@@ -1001,7 +1003,9 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
if (battlemaster->MaxPlayers < battlemaster->MinPlayers)
{
TC_LOG_ERROR("db2.hotfix.battlemaster_list", "Battlemaster (%u) contains bad values for MinPlayers (%u) and MaxPlayers (%u). Swapping values.", battlemaster->ID, battlemaster->MinPlayers, battlemaster->MaxPlayers);
- std::swap(const_cast<BattlemasterListEntry*>(battlemaster)->MaxPlayers, const_cast<BattlemasterListEntry*>(battlemaster)->MinPlayers);
+ int8 minPlayers = battlemaster->MinPlayers;
+ const_cast<BattlemasterListEntry*>(battlemaster)->MinPlayers = battlemaster->MaxPlayers;
+ const_cast<BattlemasterListEntry*>(battlemaster)->MaxPlayers = minPlayers;
}
}
@@ -1072,16 +1076,16 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
{
if (ChrModelEntry const* model = sChrModelStore.LookupEntry(raceModel->ChrModelID))
{
- _chrModelsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(model->Sex) }] = model;
+ _chrModelsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex) }] = model;
if (std::vector<ChrCustomizationOptionEntry const*> const* customizationOptionsForModel = Trinity::Containers::MapGetValuePtr(customizationOptionsByModel, model->ID))
{
- std::vector<ChrCustomizationOptionEntry const*>& raceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(model->Sex) }];
+ std::vector<ChrCustomizationOptionEntry const*>& raceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex) }];
raceOptions.insert(raceOptions.end(), customizationOptionsForModel->begin(), customizationOptionsForModel->end());
if (uint32 const* parentRace = Trinity::Containers::MapGetValuePtr(parentRaces, raceModel->ChrRacesID))
{
- std::vector<ChrCustomizationOptionEntry const*>& parentRaceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(*parentRace), uint8(model->Sex) }];
+ std::vector<ChrCustomizationOptionEntry const*>& parentRaceOptions = _chrCustomizationOptionsByRaceAndGender[{ uint8(*parentRace), uint8(raceModel->Sex) }];
parentRaceOptions.insert(parentRaceOptions.end(), customizationOptionsForModel->begin(), customizationOptionsForModel->end());
}
}
@@ -1089,7 +1093,7 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul
// link shapeshift displays to race/gender/form
for (std::pair<uint32 const, std::pair<uint32, uint8>> const& shapeshiftOptionsForModel : Trinity::Containers::MapEqualRange(shapeshiftFormByModel, model->ID))
{
- ShapeshiftFormModelData& data = _chrCustomizationChoicesForShapeshifts[{ uint8(raceModel->ChrRacesID), uint8(model->Sex), shapeshiftOptionsForModel.second.second }];
+ ShapeshiftFormModelData& data = _chrCustomizationChoicesForShapeshifts[{ uint8(raceModel->ChrRacesID), uint8(raceModel->Sex), shapeshiftOptionsForModel.second.second }];
data.OptionID = shapeshiftOptionsForModel.second.first;
data.Choices = Trinity::Containers::MapGetValuePtr(_chrCustomizationChoicesByOption, shapeshiftOptionsForModel.second.first);
if (data.Choices)
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index 49b2f551f5a..6b232820363 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -120,6 +120,7 @@ TC_GAME_API extern DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLev
TC_GAME_API extern DB2Storage<GarrTalentTreeEntry> sGarrTalentTreeStore;
TC_GAME_API extern DB2Storage<GemPropertiesEntry> sGemPropertiesStore;
TC_GAME_API extern DB2Storage<GlyphPropertiesEntry> sGlyphPropertiesStore;
+TC_GAME_API extern DB2Storage<GossipNPCOptionEntry> sGossipNPCOptionStore;
TC_GAME_API extern DB2Storage<GuildColorBackgroundEntry> sGuildColorBackgroundStore;
TC_GAME_API extern DB2Storage<GuildColorBorderEntry> sGuildColorBorderStore;
TC_GAME_API extern DB2Storage<GuildColorEmblemEntry> sGuildColorEmblemStore;
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index e52a14eaa30..187eac98d3c 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -451,6 +451,7 @@ struct BarberShopStyleEntry
struct BattlePetBreedQualityEntry
{
uint32 ID;
+ int32 MaxQualityRoll;
float StateMultiplier;
int8 QualityEnum;
};
@@ -472,7 +473,7 @@ struct BattlePetSpeciesEntry
int32 SummonSpellID;
int32 IconFileDataID;
int8 PetTypeEnum;
- uint16 Flags;
+ int32 Flags;
int8 SourceTypeEnum;
int32 CardUIModelSceneID;
int32 LoadoutUIModelSceneID;
@@ -501,7 +502,7 @@ struct BattlemasterListEntry
int8 MaxLevel;
int8 RatedPlayers;
int8 MinPlayers;
- int8 MaxPlayers;
+ int32 MaxPlayers;
int8 GroupsAllowed;
int8 MaxGroupSize;
int16 HolidayWorldState;
@@ -563,8 +564,8 @@ struct CharacterLoadoutEntry
uint32 ID;
Trinity::RaceMask<int64> RaceMask;
int8 ChrClassID;
- int8 Purpose;
- int8 Unused910;
+ int32 Purpose;
+ int8 ItemContext;
bool IsForNewCharacter() const { return Purpose == 9; }
};
@@ -650,6 +651,7 @@ struct ChrCustomizationChoiceEntry
uint32 ID;
int32 ChrCustomizationOptionID;
int32 ChrCustomizationReqID;
+ int32 ChrCustomizationVisReqID;
uint16 SortOrder;
uint16 UiOrderIndex;
int32 Flags;
@@ -678,6 +680,7 @@ struct ChrCustomizationElementEntry
int32 ChrCustomizationCondModelID;
int32 ChrCustomizationDisplayInfoID;
int32 ChrCustItemGeoModifyID;
+ int32 ChrCustomizationVoiceID;
};
struct ChrCustomizationOptionEntry
@@ -700,9 +703,11 @@ struct ChrCustomizationOptionEntry
struct ChrCustomizationReqEntry
{
uint32 ID;
+ LocalizedString ReqSource;
int32 Flags;
int32 ClassMask;
int32 AchievementID;
+ int32 QuestID;
int32 OverrideArchive; // -1: allow any, otherwise must match OverrideArchive cvar
int32 ItemModifiedAppearanceID;
@@ -742,6 +747,8 @@ struct ChrRaceXChrModelEntry
uint32 ID;
int32 ChrRacesID;
int32 ChrModelID;
+ int32 Sex;
+ int32 AllowedTransmogSlots;
};
struct ChrRacesEntry
@@ -792,6 +799,7 @@ struct ChrRacesEntry
float AlteredFormCustomizeRotationFallback;
std::array<float, 3> Unknown910_1;
std::array<float, 3> Unknown910_2;
+ int32 Unknown1000;
int8 BaseLanguage;
int8 CreatureType;
int8 MaleModelFallbackSex;
@@ -833,7 +841,7 @@ struct CinematicCameraEntry
uint32 SoundID; // Sound ID (voiceover for cinematic)
float OriginFacing; // Orientation in map used for basis for M2 co
uint32 FileDataID; // Model
- int32 Unknown915;
+ uint32 ConversationID;
};
struct CinematicSequencesEntry
@@ -941,7 +949,7 @@ struct CreatureDisplayInfoEntry
int8 Gender;
int32 DissolveOutEffectID;
int8 CreatureModelMinLod;
- std::array<int32, 3> TextureVariationFileDataID;
+ std::array<int32, 4> TextureVariationFileDataID;
};
struct CreatureDisplayInfoExtraEntry
@@ -1273,6 +1281,8 @@ struct CurrencyTypesEntry
int32 XpQuestDifficulty;
int32 AwardConditionID;
int32 MaxQtyWorldStateID;
+ uint32 RechargingAmountPerCycle;
+ uint32 RechargingCycleDurationMS;
std::array<int32, 2> Flags;
};
@@ -1285,9 +1295,9 @@ struct CurveEntry
struct CurvePointEntry
{
- uint32 ID;
DBCPosition2D Pos;
DBCPosition2D PreSLSquishPos;
+ uint32 ID;
uint16 CurveID;
uint8 OrderIndex;
};
@@ -1346,7 +1356,6 @@ struct DungeonEncounterEntry
int32 OrderIndex;
int32 CompleteWorldStateID;
int8 Bit;
- int32 CreatureDisplayID;
int32 Flags;
int32 SpellIconFileID;
int32 Faction;
@@ -1436,8 +1445,10 @@ struct FactionEntry
uint16 ParentFactionID;
uint8 Expansion;
uint32 FriendshipRepID;
- uint8 Flags;
+ int32 Flags;
uint16 ParagonFactionID;
+ int32 RenownFactionID;
+ int32 RenownCurrencyID;
std::array<int16, 4> ReputationClassMask;
std::array<uint16, 4> ReputationFlags;
std::array<int32, 4> ReputationBase;
@@ -1452,7 +1463,7 @@ struct FactionEntry
}
};
-#define MAX_FACTION_RELATIONS 4
+#define MAX_FACTION_RELATIONS 8
struct FactionTemplateEntry
{
@@ -1771,7 +1782,7 @@ struct GarrTalentTreeEntry
uint16 UiTextureKitID;
int32 GarrTalentTreeType;
int32 PlayerConditionID;
- int8 FeatureTypeIndex;
+ uint8 FeatureTypeIndex;
int8 FeatureSubtypeIndex;
int32 CurrencyID;
};
@@ -1813,6 +1824,26 @@ struct GlyphRequiredSpecEntry
uint32 GlyphPropertiesID;
};
+struct GossipNPCOptionEntry
+{
+ uint32 ID;
+ int32 GossipNpcOption;
+ int32 LFGDungeonsID;
+ int32 TrainerID;
+ int32 GarrFollowerTypeID;
+ int32 CharShipmentID;
+ int32 GarrTalentTreeID;
+ int32 UiMapID;
+ int32 UiItemInteractionID;
+ int32 Unknown_1000_8;
+ int32 Unknown_1000_9;
+ int32 CovenantID;
+ int32 GossipOptionID;
+ int32 TraitTreeID;
+ int32 ProfessionID;
+ int32 Unknown_1002_14;
+};
+
struct GuildColorBackgroundEntry
{
uint32 ID;
@@ -1917,6 +1948,7 @@ struct ItemEntry
uint8 ItemGroupSoundsID;
int32 ContentTuningID;
int32 ModifiedCraftingReagentItemID;
+ int32 CraftingQualityID;
};
struct ItemAppearanceEntry
@@ -1974,9 +2006,11 @@ struct ItemBonusEntry
// int32 ItemBonusListGroupID;
// int32 ItemBonusListID;
// int32 ItemLevelSelectorID;
-// int32 OrderIndex;
+// int32 SequenceValue;
// int32 ItemExtendedCostID;
// int32 PlayerConditionID;
+// int32 Flags;
+// int32 ItemLogicalCostGroupID;
//};
struct ItemBonusListLevelDeltaEntry
@@ -2097,7 +2131,7 @@ struct ItemExtendedCostEntry
int8 ArenaBracket; // arena slot restrictions (min slot value)
uint8 Flags;
uint8 MinFactionID;
- uint8 MinReputation;
+ int32 MinReputation;
uint8 RequiredAchievement; // required personal arena rating
std::array<int32, MAX_ITEM_EXT_COST_ITEMS> ItemID; // required item id
std::array<uint16, MAX_ITEM_EXT_COST_ITEMS> ItemCount; // required count of 1st item
@@ -2187,7 +2221,7 @@ struct ItemSearchNameEntry
uint8 OverallQualityID;
int32 ExpansionID;
uint16 MinFactionID;
- uint8 MinReputation;
+ int32 MinReputation;
int32 AllowableClass;
int8 RequiredLevel;
uint16 RequiredSkill;
@@ -2240,6 +2274,7 @@ struct ItemSparseEntry
std::array<int32, MAX_ITEM_PROTO_STATS> StatPercentEditor;
int32 Stackable;
int32 MaxCount;
+ int32 MinReputation;
uint32 RequiredAbility;
uint32 SellPrice;
uint32 BuyPrice;
@@ -2279,7 +2314,6 @@ struct ItemSparseEntry
uint8 DamageDamageType;
std::array<int8, MAX_ITEM_PROTO_STATS> StatModifierBonusStat;
uint8 ContainerSlots;
- uint8 MinReputation;
uint8 RequiredPVPMedal;
uint8 RequiredPVPRank;
int8 RequiredLevel;
@@ -2365,7 +2399,6 @@ struct JournalInstanceEntry
int32 ButtonFileDataID;
int32 ButtonSmallFileDataID;
int32 LoreFileDataID;
- uint8 OrderIndex;
int32 Flags;
uint16 AreaID;
};
@@ -2525,6 +2558,7 @@ struct MapEntry
int16 WindSettingsID;
int32 ZmpFileDataID;
int32 WdtFileDataID;
+ int32 NavigationMaxDistance;
std::array<int32, 3> Flags;
// Helpers
@@ -2565,6 +2599,7 @@ struct MapEntry
case 1642:
case 1643:
case 2222:
+ case 2444:
return true;
default:
return false;
@@ -2574,7 +2609,7 @@ struct MapEntry
bool IsDynamicDifficultyMap() const { return GetFlags().HasFlag(MapFlags::DynamicDifficulty); }
bool IsFlexLocking() const { return GetFlags().HasFlag(MapFlags::FlexibleRaidLocking); }
bool IsGarrison() const { return GetFlags().HasFlag(MapFlags::Garrison); }
- bool IsSplitByFaction() const { return ID == 609 || ID == 2175; }
+ bool IsSplitByFaction() const { return ID == 609 || ID == 2175 || ID == 2570; }
EnumFlag<MapFlags> GetFlags() const { return static_cast<MapFlags>(Flags[0]); }
EnumFlag<MapFlags2> GetFlags2() const { return static_cast<MapFlags2>(Flags[1]); }
@@ -2680,6 +2715,7 @@ struct MountCapabilityEntry
int32 ModSpellAuraID;
int16 ReqMapID;
int32 PlayerConditionID;
+ int32 FlightCapabilityID;
};
struct MountTypeXCapabilityEntry
@@ -2835,6 +2871,7 @@ struct PlayerConditionEntry
uint8 MaxPVPRank;
int32 ContentTuningID;
int32 CovenantID;
+ uint32 TraitNodeEntryLogic;
std::array<uint16, 4> SkillID;
std::array<uint16, 4> MinSkill;
std::array<uint16, 4> MaxSkill;
@@ -2859,6 +2896,9 @@ struct PlayerConditionEntry
std::array<uint32, 4> CurrencyCount;
std::array<uint32, 6> QuestKillMonster;
std::array<int32, 2> MovementFlags;
+ std::array<int32, 4> TraitNodeEntryID;
+ std::array<uint16, 4> TraitNodeEntryMinRank;
+ std::array<uint16, 4> TraitNodeEntryMaxRank;
};
struct PowerDisplayEntry
@@ -2877,12 +2917,12 @@ struct PowerTypeEntry
char const* CostGlobalStringTag;
uint32 ID;
int8 PowerTypeEnum;
- int8 MinPower;
- int16 MaxBasePower;
- int8 CenterPower;
- int8 DefaultPower;
- int8 DisplayModifier;
- int16 RegenInterruptTimeMS;
+ int32 MinPower;
+ int32 MaxBasePower;
+ int32 CenterPower;
+ int32 DefaultPower;
+ int32 DisplayModifier;
+ int32 RegenInterruptTimeMS;
float RegenPeace;
float RegenCombat;
int16 Flags;
@@ -2930,6 +2970,7 @@ struct PvpTalentEntry
int32 ActionBarSpellID;
int32 PvpTalentCategoryID;
int32 LevelRequired;
+ int32 PlayerConditionID;
};
struct PvpTalentCategoryEntry
@@ -2972,7 +3013,7 @@ struct QuestInfoEntry
LocalizedString InfoName;
int8 Type;
int32 Modifiers;
- uint16 Profession;
+ int32 Profession;
};
struct QuestLineXQuestEntry
@@ -3010,6 +3051,7 @@ struct QuestV2Entry
{
uint32 ID;
uint16 UniqueBitFlag;
+ int32 UiQuestDetailsTheme;
};
struct QuestXPEntry
@@ -3136,6 +3178,8 @@ struct SkillLineEntry
int32 ParentTierIndex;
uint16 Flags;
int32 SpellBookSpellID;
+ int32 ExpansionNameSharedStringID;
+ int32 HordeExpansionNameSharedStringID;
EnumFlag<SkillLineFlags> GetFlags() const { return static_cast<SkillLineFlags>(Flags); }
};
@@ -3143,6 +3187,8 @@ struct SkillLineEntry
struct SkillLineAbilityEntry
{
Trinity::RaceMask<int64> RaceMask;
+ LocalizedString AbilityVerb;
+ LocalizedString AbilityAllVerb;
uint32 ID;
int16 SkillLine;
int32 Spell;
@@ -3158,7 +3204,7 @@ struct SkillLineAbilityEntry
int16 TradeSkillCategoryID;
int16 SkillupSkillLineID;
- EnumFlag<SkillLineAbilityFlags> GetFlags() const { return EnumFlag<SkillLineAbilityFlags>(static_cast<SkillLineAbilityFlags>(Flags)); }
+ EnumFlag<SkillLineAbilityFlags> GetFlags() const { return static_cast<SkillLineAbilityFlags>(Flags); }
};
struct SkillRaceClassInfoEntry
@@ -3187,7 +3233,7 @@ struct SoundKitEntry
uint32 ID;
int32 SoundType;
float VolumeFloat;
- uint16 Flags;
+ int32 Flags;
float MinDistance;
float DistanceCutoff;
uint8 EAXDef;
@@ -3200,6 +3246,7 @@ struct SoundKitEntry
float PitchAdjust;
uint16 BusOverwriteID;
uint8 MaxInstances;
+ uint32 SoundMixGroupID;
};
struct SpecializationSpellsEntry
@@ -3235,15 +3282,19 @@ struct SpellAuraOptionsEntry
struct SpellAuraRestrictionsEntry
{
uint32 ID;
- uint8 DifficultyID;
- uint8 CasterAuraState;
- uint8 TargetAuraState;
- uint8 ExcludeCasterAuraState;
- uint8 ExcludeTargetAuraState;
+ int32 DifficultyID;
+ int32 CasterAuraState;
+ int32 TargetAuraState;
+ int32 ExcludeCasterAuraState;
+ int32 ExcludeTargetAuraState;
int32 CasterAuraSpell;
int32 TargetAuraSpell;
int32 ExcludeCasterAuraSpell;
int32 ExcludeTargetAuraSpell;
+ int32 CasterAuraType;
+ int32 TargetAuraType;
+ int32 ExcludeCasterAuraType;
+ int32 ExcludeTargetAuraType;
uint32 SpellID;
};
@@ -3260,7 +3311,7 @@ struct SpellCastingRequirementsEntry
int32 SpellID;
uint8 FacingCasterFlags;
uint16 MinFactionID;
- int8 MinReputation;
+ int32 MinReputation;
uint16 RequiredAreasID;
uint8 RequiredAuraVision;
uint16 RequiresSpellFocus;
@@ -3307,6 +3358,7 @@ struct SpellCooldownsEntry
int32 CategoryRecoveryTime;
int32 RecoveryTime;
int32 StartRecoveryTime;
+ int32 AuraSpellID;
uint32 SpellID;
};
@@ -3385,6 +3437,7 @@ struct SpellItemEnchantmentEntry
uint32 ID;
LocalizedString Name;
LocalizedString HordeName;
+ int32 Duration;
std::array<uint32, MAX_ITEM_ENCHANTMENT_EFFECTS> EffectArg;
std::array<float, MAX_ITEM_ENCHANTMENT_EFFECTS> EffectScalingPoints;
uint32 IconFileDataID;
@@ -3484,6 +3537,7 @@ struct SpellPowerEntry
int32 AltPowerBarID;
float PowerCostPct;
float PowerCostMaxPct;
+ float OptionalCostPct;
float PowerPctPerSecond;
int8 PowerType;
int32 RequiredAuraSpellID;
@@ -3542,6 +3596,8 @@ struct SpellReagentsEntry
int32 SpellID;
std::array<int32, MAX_SPELL_REAGENTS> Reagent;
std::array<int16, MAX_SPELL_REAGENTS> ReagentCount;
+ std::array<int16, MAX_SPELL_REAGENTS> ReagentRecraftCount;
+ std::array<uint8, MAX_SPELL_REAGENTS> ReagentSource;
};
struct SpellReagentsCurrencyEntry
@@ -3691,6 +3747,7 @@ struct SpellXSpellVisualEntry
uint8 DifficultyID;
uint32 SpellVisualID;
float Probability;
+ int32 Flags;
int32 Priority;
int32 SpellIconFileID;
int32 ActiveIconFileID;
@@ -3873,7 +3930,7 @@ struct UiMapEntry
int32 AlternateUiMapGroup;
int32 ContentTuningID;
- EnumFlag<UiMapFlag> GetFlags() const { return EnumFlag<UiMapFlag>(static_cast<UiMapFlag>(Flags)); }
+ EnumFlag<UiMapFlag> GetFlags() const { return static_cast<UiMapFlag>(Flags); }
};
struct UiMapAssignmentEntry
@@ -3898,6 +3955,7 @@ struct UiMapLinkEntry
int32 ParentUiMapID;
int32 OrderIndex;
int32 ChildUiMapID;
+ int32 PlayerConditionID;
int32 OverrideHighlightFileDataID;
int32 OverrideHighlightAtlasID;
int32 Flags;
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index dc3a8a1a95c..4590b5909c9 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -191,24 +191,25 @@ enum AzeriteTierUnlockSetFlags
AZERITE_TIER_UNLOCK_SET_FLAG_DEFAULT = 0x1
};
-enum class BattlePetSpeciesFlags : uint16
-{
- NoRename = 0x0001,
- WellKnown = 0x0002,
- NotAccountWide = 0x0004,
- Capturable = 0x0008,
- NotTradable = 0x0010,
- HideFromJournal = 0x0020,
- LegacyAccountUnique = 0x0040,
- CantBattle = 0x0080,
- HordeOnly = 0x0100,
- AllianceOnly = 0x0200,
- Boss = 0x0400,
- RandomDisplay = 0x0800,
- NoLicenseRequired = 0x1000,
- AddsAllowedWithBoss = 0x2000,
- HideUntilLearned = 0x4000,
- MatchPlayerHighPetLevel = 0x8000
+enum class BattlePetSpeciesFlags : int32
+{
+ NoRename = 0x00001,
+ WellKnown = 0x00002,
+ NotAccountWide = 0x00004,
+ Capturable = 0x00008,
+ NotTradable = 0x00010,
+ HideFromJournal = 0x00020,
+ LegacyAccountUnique = 0x00040,
+ CantBattle = 0x00080,
+ HordeOnly = 0x00100,
+ AllianceOnly = 0x00200,
+ Boss = 0x00400,
+ RandomDisplay = 0x00800,
+ NoLicenseRequired = 0x01000,
+ AddsAllowedWithBoss = 0x02000,
+ HideUntilLearned = 0x04000,
+ MatchPlayerHighPetLevel = 0x08000,
+ NoWildPetAddsAllowed = 0x10000,
};
DEFINE_ENUM_FLAG(BattlePetSpeciesFlags);
@@ -607,6 +608,14 @@ enum class CriteriaType : uint8
SpentTalentPoint = 231, /*NYI*/ // (Player) spent talent point
MythicPlusDisplaySeasonEnded = 234, /*NYI*/ // {DisplaySeason}
+
+ WinRatedSoloShuffleRound = 239, /*NYI*/
+ ParticipateInRatedSoloShuffleRound = 240, /*NYI*/
+
+ ReputationAmountGained = 243, /*NYI*/ // Gain reputation amount with {FactionID}; accumulate, not highest
+
+ FulfillAnyCraftingOrder = 245, /*NYI*/
+ FulfillCraftingOrderType = 246, /*NYI*/ // {CraftingOrderType}
Count
};
@@ -940,6 +949,20 @@ enum class ItemContext : uint8
Raid_Heroic_Extended = 84,
Raid_Mythic_Extended = 85,
Character_Template_9_1 = 86,
+ Challenge_Mode_4 = 87,
+ Pvp_Ranked_9 = 88,
+ Raid_Normal_Extended_2 = 89,
+ Raid_Finder_Extended_2 = 90,
+ Raid_Heroic_Extended_2 = 91,
+ Raid_Mythic_Extended_2 = 92,
+ Raid_Normal_Extended_3 = 93,
+ Raid_Finder_Extended_3 = 94,
+ Raid_Heroic_Extended_3 = 95,
+ Raid_Mythic_Extended_3 = 96,
+ Template_Character_1 = 97,
+ Template_Character_2 = 98,
+ Template_Character_3 = 99,
+ Template_Character_4 = 100,
Max
};
@@ -1427,7 +1450,23 @@ enum class ModifierTreeType : int32
PlayerMythicPlusRatingInDisplaySeasonEqualOrGreaterThan = 329, /*NYI*/ // Player has Mythic+ Rating of at least "{#DungeonScore}" in {DisplaySeason}
- MythicPlusRatingIsInTop01Percent = 334, // top 0.1% rating
+ PlayerMythicPlusLadderRatingInDisplaySeasonEqualOrGreaterThan = 333, /*NYI*/ // Player has Mythic+ Ladder Rating of at least "{#DungeonScore}" in {DisplaySeason}
+ MythicPlusRatingIsInTop01Percent = 334, /*NYI*/ // top 0.1% rating
+ PlayerAuraWithLabelStackCountEqualOrGreaterThan = 335, // Player has at least {#Stacks} stacks of aura "{Label}"
+ PlayerAuraWithLabelStackCountEqual = 336, // Target has exactly {#Stacks} stacks of aura with label "{Label}"
+ PlayerAuraWithLabelStackCountEqualOrLessThan = 337, // Player has at most {#Stacks} stacks of aura "{Label}"
+ PlayerIsInCrossFactionGroup = 338, // Player is in a cross faction group
+
+ PlayerHasTraitNodeEntryInActiveConfig = 340, // Player has {TraitNodeEntry} node in currently active config
+ PlayerHasTraitNodeEntryInActiveConfigRankGreaterOrEqualThan = 341, // Player has at least {#Rank} for {TraitNodeEntry} node in currently active config
+ PlayerHasPurchasedCombatTraitRanks = 342, /*NYI*/ // Player has purchased at least {#Count} talent points in active combat config
+ PlayerHasPurchasedTraitRanksInTraitTree = 343, /*NYI*/ // Player has purchased at least {#Count} ranks in {#TraitTree}
+ PlayerDaysSinceLogout = 344,
+
+ CraftingOrderSkillLineAbility = 347, /*NYI*/
+ CraftingOrderProfession = 348, /*NYI*/ // ProfessionEnum
+
+ PlayerCanUseItem = 351, // Player can use item {#Item}
};
enum class ModifierTreeOperator : int8
@@ -1494,6 +1533,75 @@ enum class PlayerConditionLfgStatus : uint8
GearDiff = 8
};
+enum class PlayerInteractionType : int32
+{
+ None = 0,
+ TradePartner = 1,
+ Item = 2,
+ Gossip = 3,
+ QuestGiver = 4,
+ Merchant = 5,
+ TaxiNode = 6,
+ Trainer = 7,
+ Banker = 8,
+ AlliedRaceDetailsGiver = 9,
+ GuildBanker = 10,
+ Registrar = 11,
+ Vendor = 12,
+ PetitionVendor = 13,
+ TabardVendor = 14,
+ TalentMaster = 15,
+ SpecializationMaster = 16,
+ MailInfo = 17,
+ SpiritHealer = 18,
+ AreaSpiritHealer = 19,
+ Binder = 20,
+ Auctioneer = 21,
+ StableMaster = 22,
+ BattleMaster = 23,
+ Transmogrifier = 24,
+ LFGDungeon = 25,
+ VoidStorageBanker = 26,
+ BlackMarketAuctioneer = 27,
+ AdventureMap = 28,
+ WorldMap = 29,
+ GarrArchitect = 30,
+ GarrTradeskill = 31,
+ GarrMission = 32,
+ ShipmentCrafter = 33,
+ GarrRecruitment = 34,
+ GarrTalent = 35,
+ Trophy = 36,
+ PlayerChoice = 37,
+ ArtifactForge = 38,
+ ObliterumForge = 39,
+ ScrappingMachine = 40,
+ ContributionCollector = 41,
+ AzeriteRespec = 42,
+ IslandQueue = 43,
+ ItemInteraction = 44,
+ ChromieTime = 45,
+ CovenantPreview = 46,
+ AnimaDiversion = 47,
+ LegendaryCrafting = 48,
+ WeeklyRewards = 49,
+ Soulbind = 50,
+ CovenantSanctum = 51,
+ NewPlayerGuide = 52,
+ ItemUpgrade = 53,
+ AdventureJournal = 54,
+ Renown = 55,
+ AzeriteForge = 56,
+ PerksProgramVendor = 57,
+ ProfessionsCraftingOrder = 58,
+ Professions = 59,
+ ProfessionsCustomerOrder = 60,
+ TraitSystem = 61,
+ BarbersChoice = 62,
+ JailersTowerBuffs = 63,
+ MajorFactionRenown = 64
+};
+
enum PrestigeLevelInfoFlags : uint8
{
PRESTIGE_FLAG_DISABLED = 0x01 // Prestige levels with this flag won't be included to calculate max prestigelevel.
@@ -1775,6 +1883,24 @@ enum TaxiPathNodeFlags
TAXI_PATH_NODE_FLAG_STOP = 0x2
};
+enum class TraitCombatConfigFlags : int32
+{
+ None = 0x0,
+ ActiveForSpec = 0x1,
+ StarterBuild = 0x2,
+ SharedActionBars = 0x4
+};
+
+DEFINE_ENUM_FLAG(TraitCombatConfigFlags);
+
+enum class TraitConfigType : int32
+{
+ Invalid = 0,
+ Combat = 1,
+ Profession = 2,
+ Generic = 3
+};
+
enum class UiMapFlag : int32
{
None = 0,
diff --git a/src/server/game/DataStores/GameTables.h b/src/server/game/DataStores/GameTables.h
index f0aef35b810..188c9b74a65 100644
--- a/src/server/game/DataStores/GameTables.h
+++ b/src/server/game/DataStores/GameTables.h
@@ -54,6 +54,8 @@ struct GtBaseMPEntry
float DeathKnight = 0.0f;
float Monk = 0.0f;
float DemonHunter = 0.0f;
+ float Evoker = 0.0f;
+ float Adventurer = 0.0f;
};
struct GtBattlePetXPEntry
@@ -135,6 +137,8 @@ struct GtSpellScalingEntry
float DeathKnight = 0.0f;
float Monk = 0.0f;
float DemonHunter = 0.0f;
+ float Evoker = 0.0f;
+ float Adventurer = 0.0f;
float Item = 0.0f;
float Consumable = 0.0f;
float Gem1 = 0.0f;
@@ -143,6 +147,7 @@ struct GtSpellScalingEntry
float Health = 0.0f;
float DamageReplaceStat = 0.0f;
float DamageSecondary = 0.0f;
+ float ManaConsumable = 0.0f;
};
struct GtStaminaMultByILvl
@@ -227,6 +232,10 @@ inline float GetGameTableColumnForClass(T const* row, int32 class_)
return row->Druid;
case CLASS_DEMON_HUNTER:
return row->DemonHunter;
+ case CLASS_EVOKER:
+ return row->Evoker;
+ case CLASS_ADVENTURER:
+ return row->Adventurer;
default:
break;
}
@@ -262,6 +271,10 @@ inline float GetSpellScalingColumnForClass(GtSpellScalingEntry const* row, int32
return row->Druid;
case CLASS_DEMON_HUNTER:
return row->DemonHunter;
+ case CLASS_EVOKER:
+ return row->Evoker;
+ case CLASS_ADVENTURER:
+ return row->Adventurer;
case -1:
case -7:
return row->Item;
@@ -279,6 +292,8 @@ inline float GetSpellScalingColumnForClass(GtSpellScalingEntry const* row, int32
return row->DamageReplaceStat;
case -9:
return row->DamageSecondary;
+ case -10:
+ return row->ManaConsumable;
default:
break;
}
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index 518cad8b3a1..15b175f5c19 100644
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -108,7 +108,7 @@ void Corpse::SaveToDB()
DeleteFromDB(trans);
std::ostringstream items;
- for (uint16 index = 0; index < EQUIPMENT_SLOT_END; ++index)
+ for (size_t index = 0; index < m_corpseData->Items.size(); ++index)
items << m_corpseData->Items[index] << ' ';
uint16 index = 0;
@@ -194,8 +194,8 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields)
SetObjectScale(1.0f);
SetDisplayId(fields[5].GetUInt32());
std::vector<std::string_view> items = Trinity::Tokenize(fields[6].GetStringView(), ' ', false);
- if (items.size() == EQUIPMENT_SLOT_END)
- for (uint32 index = 0; index < EQUIPMENT_SLOT_END; ++index)
+ if (items.size() == m_corpseData->Items.size())
+ for (size_t index = 0; index < m_corpseData->Items.size(); ++index)
SetItem(index, Trinity::StringTo<uint32>(items[index]).value_or(0));
SetRace(fields[7].GetUInt8());
diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp
index 16f54b7c9a4..2cf5aaa47e2 100644
--- a/src/server/game/Entities/Creature/GossipDef.cpp
+++ b/src/server/game/Entities/Creature/GossipDef.cpp
@@ -38,53 +38,66 @@ GossipMenu::GossipMenu()
_locale = DEFAULT_LOCALE;
}
-GossipMenu::~GossipMenu()
-{
- ClearMenu();
-}
+GossipMenu::~GossipMenu() = default;
-uint32 GossipMenu::AddMenuItem(int32 menuItemId, GossipOptionNpc optionNpc, std::string const& message, uint32 sender, uint32 action, std::string const& boxMessage, uint32 boxMoney, bool coded /*= false*/)
+uint32 GossipMenu::AddMenuItem(int32 gossipOptionId, int32 orderIndex, GossipOptionNpc optionNpc, std::string optionText, uint32 language,
+ GossipOptionFlags flags, Optional<int32> gossipNpcOptionId, bool boxCoded, uint32 boxMoney, std::string boxText, Optional<int32> spellId,
+ Optional<int32> overrideIconId, uint32 sender, uint32 action)
{
ASSERT(_menuItems.size() <= GOSSIP_MAX_MENU_ITEMS);
// Find a free new id - script case
- if (menuItemId == -1)
+ if (orderIndex == -1)
{
- menuItemId = 0;
+ orderIndex = 0;
if (_menuId)
{
- // set baseline menuItemId as higher than whatever exists in db
+ // set baseline orderIndex as higher than whatever exists in db
Trinity::IteratorPair bounds = sObjectMgr->GetGossipMenuItemsMapBounds(_menuId);
auto itr = std::max_element(bounds.begin(), bounds.end(), [](GossipMenuItemsContainer::value_type const& a, GossipMenuItemsContainer::value_type const& b)
{
- return a.second.OptionID < b.second.OptionID;
+ return a.second.OrderIndex < b.second.OrderIndex;
});
if (itr != bounds.end())
- menuItemId = itr->second.OptionID + 1;
+ orderIndex = itr->second.OrderIndex + 1;
}
if (!_menuItems.empty())
{
for (GossipMenuItemContainer::const_iterator itr = _menuItems.begin(); itr != _menuItems.end(); ++itr)
{
- if (int32(itr->first) > menuItemId)
+ if (int32(itr->OrderIndex) > orderIndex)
break;
- menuItemId = itr->first + 1;
+ orderIndex = itr->OrderIndex + 1;
}
}
}
- GossipMenuItem& menuItem = _menuItems[menuItemId];
+ if (!gossipOptionId)
+ gossipOptionId = -(int32(_menuId) * 100 + orderIndex);
+
+ auto where = std::lower_bound(_menuItems.begin(), _menuItems.end(), orderIndex, [](GossipMenuItem const& item, int32 index)
+ {
+ return int32(item.OrderIndex) < index;
+ });
- menuItem.OptionNpc = optionNpc;
- menuItem.Message = message;
- menuItem.IsCoded = coded;
- menuItem.Sender = sender;
- menuItem.Action = action;
- menuItem.BoxMessage = boxMessage;
- menuItem.BoxMoney = boxMoney;
- return menuItemId;
+ GossipMenuItem& menuItem = *_menuItems.emplace(where);
+ menuItem.GossipOptionID = gossipOptionId;
+ menuItem.OrderIndex = orderIndex;
+ menuItem.OptionNpc = optionNpc;
+ menuItem.OptionText = std::move(optionText);
+ menuItem.Language = language;
+ menuItem.Flags = flags;
+ menuItem.GossipNpcOptionID = gossipNpcOptionId;
+ menuItem.BoxCoded = boxCoded;
+ menuItem.BoxMoney = boxMoney;
+ menuItem.BoxText = std::move(boxText);
+ menuItem.SpellID = spellId;
+ menuItem.OverrideIconID = overrideIconId;
+ menuItem.Sender = sender;
+ menuItem.Action = action;
+ return orderIndex;
}
/**
@@ -103,80 +116,117 @@ void GossipMenu::AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, ui
/// Find the one with the given menu item id.
auto itr = std::find_if(bounds.begin(), bounds.end(), [menuItemId](std::pair<uint32 const, GossipMenuItems> const& itemPair)
{
- return itemPair.second.OptionID == menuItemId;
+ return itemPair.second.OrderIndex == menuItemId;
});
if (itr == bounds.end())
return;
+ AddMenuItem(itr->second, sender, action);
+}
+
+void GossipMenu::AddMenuItem(GossipMenuItems const& menuItem, uint32 sender, uint32 action)
+{
/// Store texts for localization.
std::string strOptionText, strBoxText;
- BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.OptionBroadcastTextID);
- BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(itr->second.BoxBroadcastTextID);
+ BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(menuItem.OptionBroadcastTextID);
+ BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(menuItem.BoxBroadcastTextID);
/// OptionText
if (optionBroadcastText)
strOptionText = DB2Manager::GetBroadcastTextValue(optionBroadcastText, GetLocale());
else
- strOptionText = itr->second.OptionText;
+ {
+ strOptionText = menuItem.OptionText;
+
+ /// Find localizations from database.
+ if (GetLocale() != LOCALE_enUS)
+ if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuItem.MenuID, menuItem.OrderIndex))
+ ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, GetLocale(), strBoxText);
+ }
/// BoxText
if (boxBroadcastText)
strBoxText = DB2Manager::GetBroadcastTextValue(boxBroadcastText, GetLocale());
else
- strBoxText = itr->second.BoxText;
-
- if (!boxBroadcastText)
{
+ strBoxText = menuItem.BoxText;
+
/// Find localizations from database.
- if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, menuItemId))
- ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, GetLocale(), strBoxText);
+ if (GetLocale() != LOCALE_enUS)
+ if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuItem.MenuID, menuItem.OrderIndex))
+ ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, GetLocale(), strBoxText);
}
- /// Add menu item with existing method. Menu item id -1 is also used in ADD_GOSSIP_ITEM macro.
- AddMenuItem(itr->second.OptionID, itr->second.OptionNpc, strOptionText, sender, action, strBoxText, itr->second.BoxMoney, itr->second.BoxCoded);
- AddGossipMenuItemData(itr->second.OptionID, itr->second.ActionMenuID, itr->second.ActionPoiID);
+ AddMenuItem(menuItem.GossipOptionID, menuItem.OrderIndex, menuItem.OptionNpc, std::move(strOptionText), menuItem.Language, menuItem.Flags,
+ menuItem.GossipNpcOptionID, menuItem.BoxCoded, menuItem.BoxMoney, std::move(strBoxText), menuItem.SpellID, menuItem.OverrideIconID, sender, action);
+ AddGossipMenuItemData(menuItem.OrderIndex, menuItem.ActionMenuID, menuItem.ActionPoiID);
}
void GossipMenu::AddGossipMenuItemData(uint32 menuItemId, uint32 gossipActionMenuId, uint32 gossipActionPoi)
{
- GossipMenuItemData& itemData = _menuItemData[menuItemId];
+ GossipMenuItem& menuItem = _menuItems[menuItemId];
- itemData.GossipActionMenuId = gossipActionMenuId;
- itemData.GossipActionPoi = gossipActionPoi;
+ menuItem.ActionMenuID = gossipActionMenuId;
+ menuItem.ActionPoiID = gossipActionPoi;
}
-uint32 GossipMenu::GetMenuItemSender(uint32 menuItemId) const
+GossipMenuItem const* GossipMenu::GetItem(int32 gossipOptionId) const
{
- GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
- if (itr == _menuItems.end())
- return 0;
+ auto itr = std::find_if(_menuItems.begin(), _menuItems.end(), [gossipOptionId](GossipMenuItem const& item)
+ {
+ return item.GossipOptionID == gossipOptionId;
+ });
- return itr->second.Sender;
+ if (itr != _menuItems.end())
+ return &*itr;
+
+ return nullptr;
}
-uint32 GossipMenu::GetMenuItemAction(uint32 menuItemId) const
+GossipMenuItem const* GossipMenu::GetItemByIndex(uint32 orderIndex) const
{
- GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
- if (itr == _menuItems.end())
- return 0;
+ auto itr = std::find_if(_menuItems.begin(), _menuItems.end(), [orderIndex](GossipMenuItem const& item)
+ {
+ return item.OrderIndex == orderIndex;
+ });
- return itr->second.Action;
+ if (itr != _menuItems.end())
+ return &*itr;
+
+ return nullptr;
}
-bool GossipMenu::IsMenuItemCoded(uint32 menuItemId) const
+uint32 GossipMenu::GetMenuItemSender(uint32 orderIndex) const
{
- GossipMenuItemContainer::const_iterator itr = _menuItems.find(menuItemId);
- if (itr == _menuItems.end())
- return false;
+ GossipMenuItem const* item = GetItemByIndex(orderIndex);
+ if (item)
+ return item->Sender;
- return itr->second.IsCoded;
+ return 0;
+}
+
+uint32 GossipMenu::GetMenuItemAction(uint32 orderIndex) const
+{
+ GossipMenuItem const* item = GetItemByIndex(orderIndex);
+ if (item)
+ return item->Action;
+
+ return 0;
+}
+
+bool GossipMenu::IsMenuItemCoded(uint32 orderIndex) const
+{
+ GossipMenuItem const* item = GetItemByIndex(orderIndex);
+ if (item)
+ return item->BoxCoded;
+
+ return 0;
}
void GossipMenu::ClearMenu()
{
_menuItems.clear();
- _menuItemData.clear();
}
PlayerMenu::PlayerMenu(WorldSession* session) : _session(session)
@@ -185,10 +235,7 @@ PlayerMenu::PlayerMenu(WorldSession* session) : _session(session)
_gossipMenu.SetLocale(_session->GetSessionDbLocaleIndex());
}
-PlayerMenu::~PlayerMenu()
-{
- ClearMenus();
-}
+PlayerMenu::~PlayerMenu() = default;
void PlayerMenu::ClearMenus()
{
@@ -210,25 +257,26 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID)
if (NpcText const* text = sObjectMgr->GetNpcText(titleTextId))
packet.TextID = Trinity::Containers::SelectRandomWeightedContainerElement(text->Data, [](NpcTextData const& data) { return data.Probability; })->BroadcastTextID;
- packet.GossipOptions.resize(_gossipMenu.GetMenuItems().size());
- uint32 count = 0;
- for (GossipMenuItemContainer::const_iterator itr = _gossipMenu.GetMenuItems().begin(); itr != _gossipMenu.GetMenuItems().end(); ++itr)
+ packet.GossipOptions.reserve(_gossipMenu.GetMenuItems().size());
+ for (GossipMenuItem const& item : _gossipMenu.GetMenuItems())
{
- WorldPackets::NPC::ClientGossipOptions& opt = packet.GossipOptions[count];
- GossipMenuItem const& item = itr->second;
- opt.ClientOption = itr->first;
+ WorldPackets::NPC::ClientGossipOptions& opt = packet.GossipOptions.emplace_back();
+ opt.GossipOptionID = item.GossipOptionID;
opt.OptionNPC = item.OptionNpc;
- opt.OptionFlags = item.IsCoded; // makes pop up box password
+ opt.OptionFlags = item.BoxCoded; // makes pop up box password
opt.OptionCost = item.BoxMoney; // money required to open menu, 2.0.3
opt.OptionLanguage = item.Language;
- opt.Text = item.Message; // text for gossip item
- opt.Confirm = item.BoxMessage; // accept text (related to money) pop up box, 2.0.3
+ opt.Flags = item.Flags;
+ opt.OrderIndex = item.OrderIndex;
+ opt.Text = item.OptionText; // text for gossip item
+ opt.Confirm = item.BoxText; // accept text (related to money) pop up box, 2.0.3
opt.Status = GossipOptionStatus::Available;
- ++count;
+ opt.SpellID = item.SpellID;
+ opt.OverrideIconID = item.OverrideIconID;
}
packet.GossipText.resize(_questMenu.GetMenuItemCount());
- count = 0;
+ uint32 count = 0;
for (uint8 i = 0; i < _questMenu.GetMenuItemCount(); ++i)
{
QuestMenuItem const& item = _questMenu.GetItem(i);
@@ -300,13 +348,10 @@ void PlayerMenu::SendPointOfInterest(uint32 id) const
QuestMenu::QuestMenu()
{
- _questMenuItems.reserve(16); // can be set for max from most often sizes to speedup push_back and less memory use
+ _questMenuItems.reserve(4); // can be set for max from most often sizes to speedup push_back and less memory use
}
-QuestMenu::~QuestMenu()
-{
- ClearMenu();
-}
+QuestMenu::~QuestMenu() = default;
void QuestMenu::AddMenuItem(uint32 QuestId, uint8 Icon)
{
@@ -408,6 +453,13 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
packet.PortraitTurnInName = quest->GetPortraitTurnInName();
LocaleConstant localeConstant = _session->GetSessionDbLocaleIndex();
+ std::transform(quest->GetConditionalQuestDescription().begin(), quest->GetConditionalQuestDescription().end(), std::back_inserter(packet.ConditionalDescriptionText), [localeConstant](QuestConditionalText const& text)
+ {
+ std::string_view content = text.Text[LOCALE_enUS];
+ ObjectMgr::GetLocaleString(text.Text, localeConstant, content);
+ return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
+ });
+
if (localeConstant != LOCALE_enUS)
{
if (QuestTemplateLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
@@ -435,6 +487,7 @@ void PlayerMenu::SendQuestGiverQuestDetails(Quest const* quest, ObjectGuid npcGU
packet.DisplayPopup = displayPopup;
packet.QuestFlags[0] = quest->GetFlags() & (sWorld->getBoolConfig(CONFIG_QUEST_IGNORE_AUTO_ACCEPT) ? ~QUEST_FLAGS_AUTO_ACCEPT : ~0);
packet.QuestFlags[1] = quest->GetFlagsEx();
+ packet.QuestFlags[2] = quest->GetFlagsEx2();
packet.SuggestedPartyMembers = quest->GetSuggestedPlayers();
// RewardSpell can teach multiple spells in trigger spell effects. But not all effects must be SPELL_EFFECT_LEARN_SPELL. See example spell 33950
@@ -492,6 +545,13 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
packet.PortraitTurnInName = quest->GetPortraitTurnInName();
LocaleConstant locale = _session->GetSessionDbLocaleIndex();
+ std::transform(quest->GetConditionalOfferRewardText().begin(), quest->GetConditionalOfferRewardText().end(), std::back_inserter(packet.ConditionalRewardText), [locale](QuestConditionalText const& text)
+ {
+ std::string_view content = text.Text[LOCALE_enUS];
+ ObjectMgr::GetLocaleString(text.Text, locale, content);
+ return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
+ });
+
if (locale != LOCALE_enUS)
{
if (QuestTemplateLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
@@ -514,7 +574,10 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
// Is there a better way? what about game objects?
if (Creature const* creature = ObjectAccessor::GetCreature(*_session->GetPlayer(), npcGUID))
+ {
+ packet.QuestGiverCreatureID = creature->GetEntry();
offer.QuestGiverCreatureID = creature->GetCreatureTemplate()->Entry;
+ }
offer.QuestID = quest->GetQuestId();
offer.AutoLaunched = autoLaunched;
@@ -525,6 +588,7 @@ void PlayerMenu::SendQuestGiverOfferReward(Quest const* quest, ObjectGuid npcGUI
offer.QuestFlags[0] = quest->GetFlags();
offer.QuestFlags[1] = quest->GetFlagsEx();
+ offer.QuestFlags[2] = quest->GetFlagsEx2();
packet.PortraitTurnIn = quest->GetQuestTurnInPortrait();
packet.PortraitGiver = quest->GetQuestGiverPortrait();
@@ -553,6 +617,13 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU
packet.CompletionText = quest->GetRequestItemsText();
LocaleConstant locale = _session->GetSessionDbLocaleIndex();
+ std::transform(quest->GetConditionalRequestItemsText().begin(), quest->GetConditionalRequestItemsText().end(), std::back_inserter(packet.ConditionalCompletionText), [locale](QuestConditionalText const& text)
+ {
+ std::string_view content = text.Text[LOCALE_enUS];
+ ObjectMgr::GetLocaleString(text.Text, locale, content);
+ return WorldPackets::Quest::ConditionalQuestText{ text.PlayerConditionId, text.QuestgiverCreatureId, content };
+ });
+
if (locale != LOCALE_enUS)
{
if (QuestTemplateLocale const* questTemplateLocale = sObjectMgr->GetQuestLocale(quest->GetQuestId()))
@@ -583,6 +654,7 @@ void PlayerMenu::SendQuestGiverRequestItems(Quest const* quest, ObjectGuid npcGU
packet.QuestFlags[0] = quest->GetFlags();
packet.QuestFlags[1] = quest->GetFlagsEx();
+ packet.QuestFlags[2] = quest->GetFlagsEx2();
packet.SuggestPartyMembers = quest->GetSuggestedPlayers();
// incomplete: FD
diff --git a/src/server/game/Entities/Creature/GossipDef.h b/src/server/game/Entities/Creature/GossipDef.h
index 5151bbdafdc..b4f0cd61136 100644
--- a/src/server/game/Entities/Creature/GossipDef.h
+++ b/src/server/game/Entities/Creature/GossipDef.h
@@ -20,11 +20,12 @@
#include "Common.h"
#include "ObjectGuid.h"
-#include <map>
+#include "Optional.h"
class Object;
class Quest;
class WorldSession;
+struct GossipMenuItems;
enum class QuestGiverStatus : uint32;
#define GOSSIP_MAX_MENU_ITEMS 32
@@ -34,24 +35,24 @@ enum class GossipOptionNpc : uint8
{
None = 0, // White chat bubble. Default
Vendor = 1, // Brown bag
- TaxiNode = 2, // White wing
+ Taxinode = 2, // White wing
Trainer = 3, // Brown book
SpiritHealer = 4, // Golden interaction wheel (with red center)
Binder = 5, // Golden interaction wheel
Banker = 6, // Brown bag (with gold coin in lower corner)
PetitionVendor = 7, // White chat bubble (with "..." inside)
TabardVendor = 8, // White tabard
- BattleMaster = 9, // Two crossed swords
+ Battlemaster = 9, // Two crossed swords
Auctioneer = 10, // Stack of gold coins
TalentMaster = 11, // White chat bubble
- StableMaster = 12, // White chat bubble
+ Stablemaster = 12, // White chat bubble
PetSpecializationMaster = 13, /*DEPRECATED*/ // White chat bubble
- GuildBanker = 14, /*NYI*/ // White chat bubble
- SpellClick = 15, /*NYI*/ // White chat bubble
+ GuildBanker = 14, // White chat bubble
+ Spellclick = 15, // White chat bubble
DisableXPGain = 16, // White chat bubble
EnableXPGain = 17, // White chat bubble
Mailbox = 18, // White chat bubble
- WorldPVPQueue = 19, /*NYI*/ // White chat bubble
+ WorldPvPQueue = 19, /*NYI*/ // White chat bubble
LFGDungeon = 20, /*NYI*/ // White chat bubble
ArtifactRespec = 21, /*NYI*/ // White chat bubble
CemeterySelect = 22, /*DEPRECATED*/ // White chat bubble
@@ -59,25 +60,33 @@ enum class GossipOptionNpc : uint8
GlyphMaster = 24, /*DEPRECATED*/ // White chat bubble
QueueScenario = 25, /*NYI*/ // White chat bubble
GarrisonArchitect = 26, /*NYI*/ // White chat bubble
- GarrisonMission = 27, /*NYI*/ // White chat bubble
+ GarrisonMissionNpc = 27, /*NYI*/ // White chat bubble
ShipmentCrafter = 28, /*NYI*/ // Brown document
- GarrisonTradeskill = 29, /*NYI*/ // White chat bubble
+ GarrisonTradeskillNpc = 29, /*NYI*/ // White chat bubble
GarrisonRecruitment = 30, /*NYI*/ // White chat bubble
AdventureMap = 31, /*NYI*/ // White chat bubble
GarrisonTalent = 32, // White chat bubble
ContributionCollector = 33, /*NYI*/ // White chat bubble
Transmogrify = 34, // Purple helm
AzeriteRespec = 35, // White chat bubble
- IslandsMission = 36, /*NYI*/ // White chat bubble
+ IslandsMissionNpc = 36, /*NYI*/ // White chat bubble
UIItemInteraction = 37, /*NYI*/ // White chat bubble
WorldMap = 38, /*NYI*/ // White chat bubble
Soulbind = 39, /*NYI*/ // White chat bubble
- ChromieTime = 40, /*NYI*/ // White chat bubble
- CovenantPreview = 41, /*NYI*/ // White chat bubble
+ ChromieTimeNpc = 40, /*NYI*/ // White chat bubble
+ CovenantPreviewNpc = 41, /*NYI*/ // White chat bubble
RuneforgeLegendaryCrafting = 42, /*NYI*/ // White chat bubble
NewPlayerGuide = 43, /*NYI*/ // White chat bubble
RuneforgeLegendaryUpgrade = 44, /*NYI*/ // White chat bubble
- CovenantRenown = 45, /*NYI*/ // White chat bubble
+ CovenantRenownNpc = 45, /*NYI*/ // White chat bubble
+ BlackMarketAuctionHouse = 46,
+ PerksProgramVendor = 47,
+ ProfessionsCraftingOrder = 48,
+ ProfessionsOpen = 49,
+ ProfessionsCustomerOrder = 50,
+ TraitSystem = 51,
+ BarbersChoice = 52,
+ MajorFactionRenown = 53,
Count
};
@@ -96,29 +105,38 @@ enum class GossipOptionRewardType : uint8
Currency = 1
};
-struct GossipMenuItem
+enum class GossipOptionFlags : int32
{
- GossipOptionNpc OptionNpc;
- bool IsCoded;
- std::string Message;
- uint32 Sender;
- uint32 Action;
- std::string BoxMessage;
- uint32 BoxMoney;
- uint32 Language;
+ None = 0x0,
+ QuestLabelPrepend = 0x1
};
-// need an ordered container
-typedef std::map<uint32, GossipMenuItem> GossipMenuItemContainer;
-
-struct GossipMenuItemData
+struct GossipMenuItem
{
- uint32 GossipActionMenuId; // MenuId of the gossip triggered by this action
- uint32 GossipActionPoi;
+ int32 GossipOptionID;
+ uint32 OrderIndex;
+ GossipOptionNpc OptionNpc;
+ std::string OptionText;
+ uint32 Language;
+ GossipOptionFlags Flags;
+ Optional<int32> GossipNpcOptionID;
+ bool BoxCoded;
+ uint32 BoxMoney;
+ std::string BoxText;
+ Optional<int32> SpellID;
+ Optional<int32> OverrideIconID;
+
+ // action data
+ uint32 ActionMenuID;
+ uint32 ActionPoiID;
+
+ // additional scripting identifiers
+ uint32 Sender;
+ uint32 Action;
};
// need an ordered container
-typedef std::map<uint32, GossipMenuItemData> GossipMenuItemDataContainer;
+typedef std::vector<GossipMenuItem> GossipMenuItemContainer;
struct QuestMenuItem
{
@@ -132,10 +150,17 @@ class TC_GAME_API GossipMenu
{
public:
GossipMenu();
+ GossipMenu(GossipMenu const&) = delete;
+ GossipMenu(GossipMenu&&) = delete;
+ GossipMenu& operator=(GossipMenu const&) = delete;
+ GossipMenu& operator=(GossipMenu&&) = delete;
~GossipMenu();
- uint32 AddMenuItem(int32 menuItemId, GossipOptionNpc optionNpc, std::string const& message, uint32 sender, uint32 action, std::string const& boxMessage, uint32 boxMoney, bool coded = false);
+ uint32 AddMenuItem(int32 gossipOptionId, int32 orderIndex, GossipOptionNpc optionNpc, std::string optionText, uint32 language, GossipOptionFlags flags,
+ Optional<int32> gossipNpcOptionId, bool boxCoded, uint32 boxMoney, std::string boxText, Optional<int32> spellId,
+ Optional<int32> overrideIconId, uint32 sender, uint32 action);
void AddMenuItem(uint32 menuId, uint32 menuItemId, uint32 sender, uint32 action);
+ void AddMenuItem(GossipMenuItems const& menuItem, uint32 sender, uint32 action);
void SetMenuId(uint32 menu_id) { _menuId = menu_id; }
uint32 GetMenuId() const { return _menuId; }
@@ -154,27 +179,12 @@ class TC_GAME_API GossipMenu
return _menuItems.empty();
}
- GossipMenuItem const* GetItem(uint32 id) const
- {
- GossipMenuItemContainer::const_iterator itr = _menuItems.find(id);
- if (itr != _menuItems.end())
- return &itr->second;
-
- return nullptr;
- }
-
- GossipMenuItemData const* GetItemData(uint32 indexId) const
- {
- GossipMenuItemDataContainer::const_iterator itr = _menuItemData.find(indexId);
- if (itr != _menuItemData.end())
- return &itr->second;
-
- return nullptr;
- }
+ GossipMenuItem const* GetItem(int32 gossipOptionId) const;
+ GossipMenuItem const* GetItemByIndex(uint32 orderIndex) const;
- uint32 GetMenuItemSender(uint32 menuItemId) const;
- uint32 GetMenuItemAction(uint32 menuItemId) const;
- bool IsMenuItemCoded(uint32 menuItemId) const;
+ uint32 GetMenuItemSender(uint32 orderIndex) const;
+ uint32 GetMenuItemAction(uint32 orderIndex) const;
+ bool IsMenuItemCoded(uint32 orderIndex) const;
void ClearMenu();
@@ -185,7 +195,6 @@ class TC_GAME_API GossipMenu
private:
GossipMenuItemContainer _menuItems;
- GossipMenuItemDataContainer _menuItemData;
uint32 _menuId;
LocaleConstant _locale;
};
@@ -194,6 +203,10 @@ class TC_GAME_API QuestMenu
{
public:
QuestMenu();
+ QuestMenu(QuestMenu const&) = delete;
+ QuestMenu(QuestMenu&&) = delete;
+ QuestMenu& operator=(QuestMenu const&) = delete;
+ QuestMenu& operator=(QuestMenu&&) = delete;
~QuestMenu();
void AddMenuItem(uint32 QuestId, uint8 Icon);
@@ -210,8 +223,6 @@ class TC_GAME_API QuestMenu
class InteractionData
{
public:
- InteractionData() { Reset(); }
-
void Reset()
{
SourceGuid.Clear();
@@ -220,14 +231,18 @@ class InteractionData
}
ObjectGuid SourceGuid;
- uint32 TrainerId;
- uint32 PlayerChoiceId;
+ uint32 TrainerId = 0;
+ uint32 PlayerChoiceId = 0;
};
class TC_GAME_API PlayerMenu
{
public:
explicit PlayerMenu(WorldSession* session);
+ PlayerMenu(PlayerMenu const&) = delete;
+ PlayerMenu(PlayerMenu&&) = delete;
+ PlayerMenu& operator=(PlayerMenu const&) = delete;
+ PlayerMenu& operator=(PlayerMenu&&) = delete;
~PlayerMenu();
GossipMenu& GetGossipMenu() { return _gossipMenu; }
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 70e088a23ea..8b3946d22c5 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2927,8 +2927,9 @@ void GameObject::Use(Unit* user)
if (!item)
return;
- WorldPackets::Azerite::OpenHeartForge openHeartForge;
- openHeartForge.ForgeGUID = GetGUID();
+ WorldPackets::GameObject::GameObjectInteraction openHeartForge;
+ openHeartForge.ObjectGUID = GetGUID();
+ openHeartForge.InteractionType = PlayerInteractionType::AzeriteForge;
player->SendDirectMessage(openHeartForge.Write());
break;
}
@@ -2943,9 +2944,25 @@ void GameObject::Use(Unit* user)
if (!player)
return;
- WorldPackets::GameObject::GameObjectUILink gameObjectUILink;
+ WorldPackets::GameObject::GameObjectInteraction gameObjectUILink;
gameObjectUILink.ObjectGUID = GetGUID();
- gameObjectUILink.UILink = GetGOInfo()->UILink.UILinkType;
+ switch (GetGOInfo()->UILink.UILinkType)
+ {
+ case 0:
+ gameObjectUILink.InteractionType = PlayerInteractionType::AdventureJournal;
+ break;
+ case 1:
+ gameObjectUILink.InteractionType = PlayerInteractionType::ObliterumForge;
+ break;
+ case 2:
+ gameObjectUILink.InteractionType = PlayerInteractionType::ScrappingMachine;
+ break;
+ case 3:
+ gameObjectUILink.InteractionType = PlayerInteractionType::ItemInteraction;
+ break;
+ default:
+ break;
+ }
player->SendDirectMessage(gameObjectUILink.Write());
return;
}
diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h
index 8521e460cd6..0e08bb26fea 100644
--- a/src/server/game/Entities/GameObject/GameObjectData.h
+++ b/src/server/game/Entities/GameObject/GameObjectData.h
@@ -40,7 +40,7 @@ struct GameObjectTemplate
int32 ContentTuningId;
union
{
- // 0 GAMEOBJECT_TYPE_DOOR
+ // 0 GAMEOBJECT_TYPE_DOOR
struct
{
uint32 startOpen; // 0 startOpen, enum { false, true, }; Default: false
@@ -56,6 +56,7 @@ struct GameObjectTemplate
uint32 InfiniteAOI; // 10 Infinite AOI, enum { false, true, }; Default: false
uint32 NotLOSBlocking; // 11 Not LOS Blocking, enum { false, true, }; Default: false
uint32 InteractRadiusOverride; // 12 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 Collisionupdatedelayafteropen; // 13 Collision update delay(ms) after open, int, Min value: 0, Max value: 2147483647, Default value: 0
} door;
// 1 GAMEOBJECT_TYPE_BUTTON
struct
@@ -196,6 +197,13 @@ struct GameObjectTemplate
uint32 floatOnWater; // 7 floatOnWater, enum { false, true, }; Default: false
uint32 conditionID1; // 8 conditionID1, References: PlayerCondition, NoValue = 0
uint32 InteractRadiusOverride; // 9 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 gossipID; // 10 gossipID, References: Gossip, NoValue = 0
+ uint32 spellFocusType2; // 11 spellFocusType 2, References: SpellFocusObject, NoValue = 0
+ uint32 spellFocusType3; // 12 spellFocusType 3, References: SpellFocusObject, NoValue = 0
+ uint32 spellFocusType4; // 13 spellFocusType 4, References: SpellFocusObject, NoValue = 0
+ uint32 Profession; // 14 Profession, enum { First Aid, Blacksmithing, Leatherworking, Alchemy, Herbalism, Cooking, Mining, Tailoring, Engineering, Enchanting, Fishing, Skinning, Jewelcrafting, Inscription, Archaeology, }; Default: Blacksmithing
+ uint32 Profession2; // 15 Profession 2, enum { First Aid, Blacksmithing, Leatherworking, Alchemy, Herbalism, Cooking, Mining, Tailoring, Engineering, Enchanting, Fishing, Skinning, Jewelcrafting, Inscription, Archaeology, }; Default: Blacksmithing
+ uint32 Profession3; // 16 Profession 3, enum { First Aid, Blacksmithing, Leatherworking, Alchemy, Herbalism, Cooking, Mining, Tailoring, Engineering, Enchanting, Fishing, Skinning, Jewelcrafting, Inscription, Archaeology, }; Default: Blacksmithing
} spellFocus;
// 9 GAMEOBJECT_TYPE_TEXT
struct
@@ -483,7 +491,7 @@ struct GameObjectTemplate
// 31 GAMEOBJECT_TYPE_DUNGEON_DIFFICULTY
struct
{
- uint32 InstanceType; // 0 Instance Type, enum { Not Instanced, Party Dungeon, Raid Dungeon, PVP Battlefield, Arena Battlefield, Scenario, }; Default: Party Dungeon
+ uint32 InstanceType; // 0 Instance Type, enum { Not Instanced, Party Dungeon, Raid Dungeon, PVP Battlefield, Arena Battlefield, Scenario, WoWLabs, }; Default: Party Dungeon
uint32 DifficultyNormal; // 1 Difficulty Normal, References: animationdata, NoValue = 0
uint32 DifficultyHeroic; // 2 Difficulty Heroic, References: animationdata, NoValue = 0
uint32 DifficultyEpic; // 3 Difficulty Epic, References: animationdata, NoValue = 0
@@ -503,6 +511,7 @@ struct GameObjectTemplate
int32 HeightOffset; // 1 Height Offset (inches), int, Min value: -100, Max value: 100, Default value: 0
uint32 SitAnimKit; // 2 Sit Anim Kit, References: AnimKit, NoValue = 0
uint32 InteractRadiusOverride; // 3 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 CustomizationScope; // 4 Customization Scope, int, Min value: 0, Max value: 2147483647, Default value: 0
} barberChair;
// 33 GAMEOBJECT_TYPE_DESTRUCTIBLE_BUILDING
struct
@@ -794,6 +803,7 @@ struct GameObjectTemplate
uint32 WhenAvailable; // 0 When Available, References: GameObjectDisplayInfo, NoValue = 0
uint32 open; // 1 open, References: Lock_, NoValue = 0
uint32 InteractRadiusOverride; // 2 Interact Radius Override (in hundredths), int, Min value: 0, Max value: 2147483647, Default value: 0
+ uint32 ExpansionLevel; // 3 Expansion Level, int, Min value: 0, Max value: 2147483647, Default value: 0
} weeklyRewardChest;
// 60 GAMEOBJECT_TYPE_CLIENT_MODEL
struct
@@ -803,6 +813,11 @@ struct GameObjectTemplate
uint32 InfiniteAOI; // 2 Infinite AOI, enum { false, true, }; Default: false
uint32 TrueInfiniteAOI; // 3 True Infinite AOI (programmer only!), enum { false, true, }; Default: false
} clientModel;
+ // 61 GAMEOBJECT_TYPE_CRAFTING_TABLE
+ struct
+ {
+ uint32 Profession; // 0 Profession, enum { First Aid, Blacksmithing, Leatherworking, Alchemy, Herbalism, Cooking, Mining, Tailoring, Engineering, Enchanting, Fishing, Skinning, Jewelcrafting, Inscription, Archaeology, }; Default: Blacksmithing
+ } craftingTable;
struct
{
uint32 data[MAX_GAMEOBJECT_DATA];
diff --git a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp
index 552e5075603..36a01947955 100644
--- a/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp
+++ b/src/server/game/Entities/Item/AzeriteItem/AzeriteEmpoweredItem.cpp
@@ -142,7 +142,7 @@ void AzeriteEmpoweredItem::ClearSelectedAzeritePowers()
SetUpdateFieldValue(m_values.ModifyValue(&AzeriteEmpoweredItem::m_azeriteEmpoweredItemData).ModifyValue(&UF::AzeriteEmpoweredItemData::Selections, i), 0);
_bonusData.Initialize(GetTemplate());
- for (int32 bonusListID : *m_itemData->BonusListIDs)
+ for (int32 bonusListID : GetBonusListIDs())
_bonusData.AddBonusList(bonusListID);
}
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 96399f9c00f..3a2e55bb412 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -256,6 +256,8 @@ bool ItemCanGoIntoBag(ItemTemplate const* pProto, ItemTemplate const* pBagProto)
if (!(pProto->GetBagFamily() & BAG_FAMILY_MASK_COOKING_SUPP))
return false;
return true;
+ case ITEM_SUBCLASS_REAGENT_CONTAINER:
+ return pProto->IsCraftingReagent();
default:
return false;
}
@@ -610,7 +612,7 @@ void Item::SaveToDB(CharacterDatabaseTransaction trans)
stmt->setUInt8(++index, uint8(m_itemData->Context));
std::ostringstream bonusListIDs;
- for (int32 bonusListID : *m_itemData->BonusListIDs)
+ for (int32 bonusListID : GetBonusListIDs())
bonusListIDs << bonusListID << ' ';
stmt->setString(++index, bonusListIDs.str());
@@ -1240,7 +1242,8 @@ uint8 Item::GetBagSlot() const
bool Item::IsEquipped() const
{
- return !IsInBag() && m_slot < EQUIPMENT_SLOT_END;
+ return !IsInBag() && ((m_slot >= EQUIPMENT_SLOT_START && m_slot < EQUIPMENT_SLOT_END)
+ || (m_slot >= PROFESSION_SLOT_START && m_slot < PROFESSION_SLOT_END));
}
bool Item::CanBeTraded(bool mail, bool trade) const
@@ -2043,6 +2046,12 @@ int32 const ItemTransmogrificationSlots[MAX_INVTYPE] =
EQUIPMENT_SLOT_MAINHAND, // INVTYPE_RANGEDRIGHT
-1, // INVTYPE_QUIVER
-1 // INVTYPE_RELIC
+ -1, // INVTYPE_PROFESSION_TOOL
+ -1, // INVTYPE_PROFESSION_GEAR
+ -1, // INVTYPE_EQUIPABLE_SPELL_OFFENSIVE
+ -1, // INVTYPE_EQUIPABLE_SPELL_UTILITY
+ -1, // INVTYPE_EQUIPABLE_SPELL_DEFENSIVE
+ -1 // INVTYPE_EQUIPABLE_SPELL_MOBILITY
};
bool Item::CanTransmogrifyItemWithItem(Item const* item, ItemModifiedAppearanceEntry const* itemModifiedAppearance)
@@ -2501,14 +2510,16 @@ uint16 Item::GetVisibleItemVisual(Player const* owner) const
void Item::AddBonuses(uint32 bonusListID)
{
- if (std::find(m_itemData->BonusListIDs->begin(), m_itemData->BonusListIDs->end(), int32(bonusListID)) != m_itemData->BonusListIDs->end())
+ if (std::find(GetBonusListIDs().begin(), GetBonusListIDs().end(), int32(bonusListID)) != GetBonusListIDs().end())
return;
if (DB2Manager::ItemBonusList const* bonuses = sDB2Manager.GetItemBonusList(bonusListID))
{
- std::vector<int32> bonusListIDs = m_itemData->BonusListIDs;
- bonusListIDs.push_back(bonusListID);
- SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::BonusListIDs), std::move(bonusListIDs));
+ WorldPackets::Item::ItemBonusKey itemBonusKey;
+ itemBonusKey.ItemID = GetEntry();
+ itemBonusKey.BonusListIDs = GetBonusListIDs();
+ itemBonusKey.BonusListIDs.push_back(bonusListID);
+ SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ItemBonusKey), std::move(itemBonusKey));
for (ItemBonusEntry const* bonus : *bonuses)
_bonusData.AddBonus(bonus->Type, bonus->Value);
SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ItemAppearanceModID), _bonusData.AppearanceModID);
@@ -2517,9 +2528,12 @@ void Item::AddBonuses(uint32 bonusListID)
void Item::SetBonuses(std::vector<int32> bonusListIDs)
{
- SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::BonusListIDs), std::move(bonusListIDs));
+ WorldPackets::Item::ItemBonusKey itemBonusKey;
+ itemBonusKey.ItemID = GetEntry();
+ itemBonusKey.BonusListIDs = std::move(bonusListIDs);
+ SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ItemBonusKey), std::move(itemBonusKey));
- for (int32 bonusListID : *m_itemData->BonusListIDs)
+ for (int32 bonusListID : GetBonusListIDs())
_bonusData.AddBonusList(bonusListID);
SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ItemAppearanceModID), _bonusData.AppearanceModID);
@@ -2527,7 +2541,9 @@ void Item::SetBonuses(std::vector<int32> bonusListIDs)
void Item::ClearBonuses()
{
- SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::BonusListIDs), std::vector<int32>());
+ WorldPackets::Item::ItemBonusKey itemBonusKey;
+ itemBonusKey.ItemID = GetEntry();
+ SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ItemBonusKey), std::move(itemBonusKey));
_bonusData.Initialize(GetTemplate());
SetUpdateFieldValue(m_values.ModifyValue(&Item::m_itemData).ModifyValue(&UF::ItemData::ItemAppearanceModID), _bonusData.AppearanceModID);
}
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 6a778e0fe65..565c51fd34f 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -226,6 +226,7 @@ class TC_GAME_API Item : public Object
void CheckArtifactRelicSlotUnlock(Player const* owner);
void AddBonuses(uint32 bonusListID);
+ std::vector<int32> const& GetBonusListIDs() const { return m_itemData->ItemBonusKey->BonusListIDs; }
void SetBonuses(std::vector<int32> bonusListIDs);
void ClearBonuses();
diff --git a/src/server/game/Entities/Item/ItemDefines.h b/src/server/game/Entities/Item/ItemDefines.h
index d3b65653d1f..318b78c8d00 100644
--- a/src/server/game/Entities/Item/ItemDefines.h
+++ b/src/server/game/Entities/Item/ItemDefines.h
@@ -136,6 +136,11 @@ enum InventoryResult : uint8
EQUIP_ERR_NOT_IN_NPE = 110,// Not available during the tutorial
EQUIP_ERR_ITEM_COOLDOWN = 111,// Item is not ready yet.
EQUIP_ERR_NOT_IN_RATED_BATTLEGROUND = 112,// You can't do that in a rated battleground.
+ EQUIP_ERR_EQUIPABLESPELLS_SLOTS_FULL = 113,
+ EQUIP_ERR_CANT_BE_RECRAFTED = 114,// You can't recraft that itemv
+ EQUIP_ERR_REAGENTBAG_WRONG_SLOT = 115,// Reagent Bags can only be placed in the reagent bag slot.
+ EQUIP_ERR_SLOT_ONLY_REAGENTBAG = 116,// Only Reagent Bags can be placed in the reagent bag slot.
+ EQUIP_ERR_REAGENTBAG_ITEM_TYPE = 117,// Only Reagents can be placed in Reagent Bags.
};
// EnumUtils: DESCRIBE THIS
diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h
index d2fa2029fa8..842dbe2f4bb 100644
--- a/src/server/game/Entities/Item/ItemTemplate.h
+++ b/src/server/game/Entities/Item/ItemTemplate.h
@@ -402,10 +402,16 @@ enum InventoryType : uint8
INVTYPE_THROWN = 25,
INVTYPE_RANGEDRIGHT = 26,
INVTYPE_QUIVER = 27,
- INVTYPE_RELIC = 28
+ INVTYPE_RELIC = 28,
+ INVTYPE_PROFESSION_TOOL = 29,
+ INVTYPE_PROFESSION_GEAR = 30,
+ INVTYPE_EQUIPABLE_SPELL_OFFENSIVE = 31,
+ INVTYPE_EQUIPABLE_SPELL_UTILITY = 32,
+ INVTYPE_EQUIPABLE_SPELL_DEFENSIVE = 33,
+ INVTYPE_EQUIPABLE_SPELL_MOBILITY = 34
};
-#define MAX_INVTYPE 29
+#define MAX_INVTYPE 35
enum ItemClass : uint8
{
@@ -427,10 +433,11 @@ enum ItemClass : uint8
ITEM_CLASS_MISCELLANEOUS = 15,
ITEM_CLASS_GLYPH = 16,
ITEM_CLASS_BATTLE_PETS = 17,
- ITEM_CLASS_WOW_TOKEN = 18
+ ITEM_CLASS_WOW_TOKEN = 18,
+ ITEM_CLASS_PROFESSION = 19
};
-#define MAX_ITEM_CLASS 19
+#define MAX_ITEM_CLASS 20
enum ItemSubclassConsumable
{
@@ -460,10 +467,11 @@ enum ItemSubclassContainer
ITEM_SUBCLASS_LEATHERWORKING_CONTAINER = 7,
ITEM_SUBCLASS_INSCRIPTION_CONTAINER = 8,
ITEM_SUBCLASS_TACKLE_CONTAINER = 9,
- ITEM_SUBCLASS_COOKING_CONTAINER = 10
+ ITEM_SUBCLASS_COOKING_CONTAINER = 10,
+ ITEM_SUBCLASS_REAGENT_CONTAINER = 11
};
-#define MAX_ITEM_SUBCLASS_CONTAINER 11
+#define MAX_ITEM_SUBCLASS_CONTAINER 12
enum ItemSubclassWeapon
{
@@ -535,10 +543,11 @@ enum ItemSubclassArmor
enum ItemSubclassReagent
{
ITEM_SUBCLASS_REAGENT = 0,
- ITEM_SUBCLASS_KEYSTONE = 1
+ ITEM_SUBCLASS_KEYSTONE = 1,
+ ITEM_SUBCLASS_CONTEXT_TOKEN = 2
};
-#define MAX_ITEM_SUBCLASS_REAGENT 2
+#define MAX_ITEM_SUBCLASS_REAGENT 3
enum ItemSubclassProjectile
{
@@ -570,10 +579,12 @@ enum ItemSubclassTradeGoods
ITEM_SUBCLASS_ENCHANTMENT = 14,
ITEM_SUBCLASS_WEAPON_ENCHANTMENT = 15,
ITEM_SUBCLASS_INSCRIPTION = 16,
- ITEM_SUBCLASS_EXPLOSIVES_DEVICES = 17
+ ITEM_SUBCLASS_EXPLOSIVES_DEVICES = 17,
+ ITEM_SUBCLASS_OPTIONAL_REAGENT = 18,
+ ITEM_SUBCLASS_FINISHING_REAGENT = 19,
};
-#define MAX_ITEM_SUBCLASS_TRADE_GOODS 18
+#define MAX_ITEM_SUBCLASS_TRADE_GOODS 20
enum ItemSubclassItemEnhancement
{
@@ -590,10 +601,11 @@ enum ItemSubclassItemEnhancement
ITEM_SUBCLASS_ITEM_ENHANCEMENT_FINGER = 10,
ITEM_SUBCLASS_ITEM_ENHANCEMENT_WEAPON = 11,
ITEM_SUBCLASS_ITEM_ENHANCEMENT_TWO_HANDED_WEAPON = 12,
- ITEM_SUBCLASS_ITEM_ENHANCEMENT_SHIELD_OFF_HAND = 13
+ ITEM_SUBCLASS_ITEM_ENHANCEMENT_SHIELD_OFF_HAND = 13,
+ ITEM_SUBCLASS_ITEM_ENHANCEMENT_MISC = 14
};
-#define MAX_ITEM_SUBCLASS_ITEM_ENHANCEMENT 14
+#define MAX_ITEM_SUBCLASS_ITEM_ENHANCEMENT 15
enum ItemSubclassRecipe
{
@@ -662,9 +674,10 @@ enum ItemSubclassJunk
ITEM_SUBCLASS_MISCELLANEOUS_HOLIDAY = 3,
ITEM_SUBCLASS_MISCELLANEOUS_OTHER = 4,
ITEM_SUBCLASS_MISCELLANEOUS_MOUNT = 5,
+ ITEM_SUBCLASS_MISCELLANEOUS_MOUNT_EQUIPMENT = 6
};
-#define MAX_ITEM_SUBCLASS_MISCELLANEOUS 6
+#define MAX_ITEM_SUBCLASS_MISCELLANEOUS 7
enum ItemSubclassGlyph
{
@@ -698,6 +711,26 @@ enum ItemSubclassWowToken
#define MAX_ITEM_SUBCLASS_WOW_TOKEN 1
+enum ItemSubclassPorfession
+{
+ ITEM_SUBCLASS_PROFESSION_BLACKSMITHING = 0,
+ ITEM_SUBCLASS_PROFESSION_LEATHERWORKING = 1,
+ ITEM_SUBCLASS_PROFESSION_ALCHEMY = 2,
+ ITEM_SUBCLASS_PROFESSION_HERBALISM = 3,
+ ITEM_SUBCLASS_PROFESSION_COOKING = 4,
+ ITEM_SUBCLASS_PROFESSION_MINING = 5,
+ ITEM_SUBCLASS_PROFESSION_TAILORING = 6,
+ ITEM_SUBCLASS_PROFESSION_ENGINEERING = 7,
+ ITEM_SUBCLASS_PROFESSION_ENCHANTING = 8,
+ ITEM_SUBCLASS_PROFESSION_FISHING = 9,
+ ITEM_SUBCLASS_PROFESSION_SKINNING = 10,
+ ITEM_SUBCLASS_PROFESSION_JEWELCRAFTING = 11,
+ ITEM_SUBCLASS_PROFESSION_INSCRIPTION = 12,
+ ITEM_SUBCLASS_PROFESSION_ARCHAEOLOGY = 13
+};
+
+#define MAX_ITEM_SUBCLASS_PROFESSION 14
+
const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] =
{
MAX_ITEM_SUBCLASS_CONSUMABLE,
@@ -718,7 +751,8 @@ const uint32 MaxItemSubclassValues[MAX_ITEM_CLASS] =
MAX_ITEM_SUBCLASS_MISCELLANEOUS,
MAX_ITEM_SUBCLASS_GLYPH,
MAX_ITEM_SUBCLASS_BATTLE_PET,
- MAX_ITEM_SUBCLASS_WOW_TOKEN
+ MAX_ITEM_SUBCLASS_WOW_TOKEN,
+ MAX_ITEM_SUBCLASS_PROFESSION
};
#define MAX_ITEM_SUBCLASS_TOTAL 21
diff --git a/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp b/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp
index e52b1abcc88..d186091229b 100644
--- a/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp
+++ b/src/server/game/Entities/Item/enuminfo_ItemDefines.cpp
@@ -144,12 +144,17 @@ TC_API_EXPORT EnumText EnumUtils<InventoryResult>::ToString(InventoryResult valu
case EQUIP_ERR_NOT_IN_NPE: return { "EQUIP_ERR_NOT_IN_NPE", "EQUIP_ERR_NOT_IN_NPE", "Not available during the tutorial" };
case EQUIP_ERR_ITEM_COOLDOWN: return { "EQUIP_ERR_ITEM_COOLDOWN", "EQUIP_ERR_ITEM_COOLDOWN", "Item is not ready yet." };
case EQUIP_ERR_NOT_IN_RATED_BATTLEGROUND: return { "EQUIP_ERR_NOT_IN_RATED_BATTLEGROUND", "EQUIP_ERR_NOT_IN_RATED_BATTLEGROUND", "You can't do that in a rated battleground." };
+ case EQUIP_ERR_EQUIPABLESPELLS_SLOTS_FULL: return { "EQUIP_ERR_EQUIPABLESPELLS_SLOTS_FULL", "EQUIP_ERR_EQUIPABLESPELLS_SLOTS_FULL", "" };
+ case EQUIP_ERR_CANT_BE_RECRAFTED: return { "EQUIP_ERR_CANT_BE_RECRAFTED", "EQUIP_ERR_CANT_BE_RECRAFTED", "You can't recraft that itemv" };
+ case EQUIP_ERR_REAGENTBAG_WRONG_SLOT: return { "EQUIP_ERR_REAGENTBAG_WRONG_SLOT", "EQUIP_ERR_REAGENTBAG_WRONG_SLOT", "Reagent Bags can only be placed in the reagent bag slot." };
+ case EQUIP_ERR_SLOT_ONLY_REAGENTBAG: return { "EQUIP_ERR_SLOT_ONLY_REAGENTBAG", "EQUIP_ERR_SLOT_ONLY_REAGENTBAG", "Only Reagent Bags can be placed in the reagent bag slot." };
+ case EQUIP_ERR_REAGENTBAG_ITEM_TYPE: return { "EQUIP_ERR_REAGENTBAG_ITEM_TYPE", "EQUIP_ERR_REAGENTBAG_ITEM_TYPE", "Only Reagents can be placed in Reagent Bags." };
default: throw std::out_of_range("value");
}
}
template <>
-TC_API_EXPORT size_t EnumUtils<InventoryResult>::Count() { return 113; }
+TC_API_EXPORT size_t EnumUtils<InventoryResult>::Count() { return 118; }
template <>
TC_API_EXPORT InventoryResult EnumUtils<InventoryResult>::FromIndex(size_t index)
@@ -269,6 +274,11 @@ TC_API_EXPORT InventoryResult EnumUtils<InventoryResult>::FromIndex(size_t index
case 110: return EQUIP_ERR_NOT_IN_NPE;
case 111: return EQUIP_ERR_ITEM_COOLDOWN;
case 112: return EQUIP_ERR_NOT_IN_RATED_BATTLEGROUND;
+ case 113: return EQUIP_ERR_EQUIPABLESPELLS_SLOTS_FULL;
+ case 114: return EQUIP_ERR_CANT_BE_RECRAFTED;
+ case 115: return EQUIP_ERR_REAGENTBAG_WRONG_SLOT;
+ case 116: return EQUIP_ERR_SLOT_ONLY_REAGENTBAG;
+ case 117: return EQUIP_ERR_REAGENTBAG_ITEM_TYPE;
default: throw std::out_of_range("index");
}
}
@@ -391,6 +401,11 @@ TC_API_EXPORT size_t EnumUtils<InventoryResult>::ToIndex(InventoryResult value)
case EQUIP_ERR_NOT_IN_NPE: return 110;
case EQUIP_ERR_ITEM_COOLDOWN: return 111;
case EQUIP_ERR_NOT_IN_RATED_BATTLEGROUND: return 112;
+ case EQUIP_ERR_EQUIPABLESPELLS_SLOTS_FULL: return 113;
+ case EQUIP_ERR_CANT_BE_RECRAFTED: return 114;
+ case EQUIP_ERR_REAGENTBAG_WRONG_SLOT: return 115;
+ case EQUIP_ERR_SLOT_ONLY_REAGENTBAG: return 116;
+ case EQUIP_ERR_REAGENTBAG_ITEM_TYPE: return 117;
default: throw std::out_of_range("value");
}
}
diff --git a/src/server/game/Entities/Object/MovementInfo.h b/src/server/game/Entities/Object/MovementInfo.h
index 15b4af8ebfa..9e8c3909b36 100644
--- a/src/server/game/Entities/Object/MovementInfo.h
+++ b/src/server/game/Entities/Object/MovementInfo.h
@@ -60,9 +60,9 @@ struct MovementInfo
struct Inertia
{
- Inertia() : lifetime(0) { }
+ Inertia() : id(0), lifetime(0) { }
- ObjectGuid guid;
+ int32 id;
Position force;
uint32 lifetime;
};
@@ -86,6 +86,15 @@ struct MovementInfo
float stepUpStartElevation;
+ // advflying
+ struct AdvFlying
+ {
+ float forwardVelocity;
+ float upVelocity;
+ };
+
+ Optional<AdvFlying> advFlying;
+
MovementInfo() :
flags(0), flags2(0), flags3(0), time(0), pitch(0.0f), stepUpStartElevation(0.0f)
{
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 1059e2d7686..cca7c5fe890 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -293,6 +293,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
bool HasFall = HasFallDirection || unit->m_movementInfo.jump.fallTime != 0;
bool HasSpline = unit->IsSplineEnabled();
bool HasInertia = unit->m_movementInfo.inertia.has_value();
+ bool HasAdvFlying = unit->m_movementInfo.advFlying.has_value();
*data << GetGUID(); // MoverGUID
@@ -321,17 +322,24 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
data->WriteBit(false); // HeightChangeFailed
data->WriteBit(false); // RemoteTimeValid
data->WriteBit(HasInertia); // HasInertia
+ data->WriteBit(HasAdvFlying); // HasAdvFlying
if (!unit->m_movementInfo.transport.guid.IsEmpty())
*data << unit->m_movementInfo.transport;
if (HasInertia)
{
- *data << unit->m_movementInfo.inertia->guid;
+ *data << unit->m_movementInfo.inertia->id;
*data << unit->m_movementInfo.inertia->force.PositionXYZStream();
*data << uint32(unit->m_movementInfo.inertia->lifetime);
}
+ if (HasAdvFlying)
+ {
+ *data << float(unit->m_movementInfo.advFlying->forwardVelocity);
+ *data << float(unit->m_movementInfo.advFlying->upVelocity);
+ }
+
if (HasFall)
{
*data << uint32(unit->m_movementInfo.jump.fallTime); // Time
@@ -366,6 +374,24 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
*data << float(1.0f); // MovementForcesModMagnitude
}
+ *data << float(2.0f); // advFlyingAirFriction
+ *data << float(65.0f); // advFlyingMaxVel
+ *data << float(1.0f); // advFlyingLiftCoefficient
+ *data << float(3.0f); // advFlyingDoubleJumpVelMod
+ *data << float(10.0f); // advFlyingGlideStartMinHeight
+ *data << float(100.0f); // advFlyingAddImpulseMaxSpeed
+ *data << float(90.0f); // advFlyingMinBankingRate
+ *data << float(140.0f); // advFlyingMaxBankingRate
+ *data << float(180.0f); // advFlyingMinPitchingRateDown
+ *data << float(360.0f); // advFlyingMaxPitchingRateDown
+ *data << float(90.0f); // advFlyingMinPitchingRateUp
+ *data << float(270.0f); // advFlyingMaxPitchingRateUp
+ *data << float(30.0f); // advFlyingMinTurnVelocityThreshold
+ *data << float(80.0f); // advFlyingMaxTurnVelocityThreshold
+ *data << float(2.75f); // advFlyingSurfaceFriction
+ *data << float(7.0f); // advFlyingOverMaxDeceleration
+ *data << float(0.4f); // advFlyingLaunchSpeedCoefficient
+
data->WriteBit(HasSpline);
data->FlushBits();
@@ -438,6 +464,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
bool hasFaceMovementDir = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FACE_MOVEMENT_DIR);
bool hasFollowsTerrain = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_FOLLOWS_TERRAIN);
bool hasUnk1 = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_UNK1);
+ bool hasUnk2 = false;
bool hasTargetRollPitchYaw = areaTriggerTemplate && areaTrigger->GetTemplate()->HasFlag(AREATRIGGER_FLAG_HAS_TARGET_ROLL_PITCH_YAW);
bool hasScaleCurveID = createProperties && createProperties->ScaleCurveId != 0;
bool hasMorphCurveID = createProperties && createProperties->MorphCurveId != 0;
@@ -448,6 +475,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
bool hasAreaTriggerPolygon = createProperties && shape.IsPolygon();
bool hasAreaTriggerCylinder = shape.IsCylinder();
bool hasDisk = shape.IsDisk();
+ bool hasBoundedPlane = shape.IsBoudedPlane();
bool hasAreaTriggerSpline = areaTrigger->HasSplines();
bool hasOrbit = areaTrigger->HasOrbit();
bool hasMovementScript = false;
@@ -458,6 +486,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
data->WriteBit(hasFaceMovementDir);
data->WriteBit(hasFollowsTerrain);
data->WriteBit(hasUnk1);
+ data->WriteBit(hasUnk2);
data->WriteBit(hasTargetRollPitchYaw);
data->WriteBit(hasScaleCurveID);
data->WriteBit(hasMorphCurveID);
@@ -468,6 +497,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
data->WriteBit(hasAreaTriggerPolygon);
data->WriteBit(hasAreaTriggerCylinder);
data->WriteBit(hasDisk);
+ data->WriteBit(hasBoundedPlane);
data->WriteBit(hasAreaTriggerSpline);
data->WriteBit(hasOrbit);
data->WriteBit(hasMovementScript);
@@ -549,6 +579,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags, Playe
*data << float(shape.DiskDatas.LocationZOffsetTarget);
}
+ if (hasBoundedPlane)
+ {
+ *data << float(shape.BoundedPlaneDatas.Extents[0]);
+ *data << float(shape.BoundedPlaneDatas.Extents[1]);
+ *data << float(shape.BoundedPlaneDatas.ExtentsTarget[0]);
+ *data << float(shape.BoundedPlaneDatas.ExtentsTarget[1]);
+ }
+
//if (hasMovementScript)
// *data << *areaTrigger->GetMovementScript(); // AreaTriggerMovementScriptInfo
@@ -2300,10 +2338,10 @@ int32 WorldObject::ModSpellDuration(SpellInfo const* spellInfo, WorldObject cons
if (!positive)
{
- int32 mechanicMask = spellInfo->GetSpellMechanicMaskByEffectMask(effectMask);
+ uint64 mechanicMask = spellInfo->GetSpellMechanicMaskByEffectMask(effectMask);
auto mechanicCheck = [mechanicMask](AuraEffect const* aurEff) -> bool
{
- if (mechanicMask & (1 << aurEff->GetMiscValue()))
+ if (mechanicMask & (UI64LIT(1) << aurEff->GetMiscValue()))
return true;
return false;
};
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index c38670e91ff..1b7632da868 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -268,11 +268,6 @@ void SocketedGem::ClearChangesMask()
void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
- data << uint32(BonusListIDs->size());
- for (uint32 i = 0; i < BonusListIDs->size(); ++i)
- {
- data << int32((*BonusListIDs)[i]);
- }
data << Owner;
data << ContainedIn;
data << Creator;
@@ -309,6 +304,10 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
{
data << uint32(DynamicFlags2);
+ }
+ data << ItemBonusKey;
+ if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
+ {
data << uint16(DEBUGItemLevel);
}
for (uint32 i = 0; i < ArtifactPowers.size(); ++i)
@@ -324,7 +323,7 @@ void ItemData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Item const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xF804E4FFu, 0x000001FFu });
+ Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -332,12 +331,12 @@ void ItemData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void ItemData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
- allowedMaskForTarget |= { 0x07FB1B00u, 0x00000000u };
+ allowedMaskForTarget |= { 0x07F58D80u, 0x00000000u };
}
void ItemData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xF804E4FFu, 0x000001FFu });
+ Mask allowedMaskForTarget({ 0xF80A727Fu, 0x000001FFu });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -353,24 +352,12 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
{
if (changesMask[1])
{
- data.WriteBits(BonusListIDs->size(), 32);
- for (uint32 i = 0; i < BonusListIDs->size(); ++i)
- {
- data << int32((*BonusListIDs)[i]);
- }
- }
- }
- data.FlushBits();
- if (changesMask[0])
- {
- if (changesMask[2])
- {
if (!ignoreNestedChangesMask)
ArtifactPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ArtifactPowers.size(), data);
}
- if (changesMask[3])
+ if (changesMask[2])
{
if (!ignoreNestedChangesMask)
Gems.WriteUpdateMask(data);
@@ -381,7 +368,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[2])
+ if (changesMask[1])
{
for (uint32 i = 0; i < ArtifactPowers.size(); ++i)
{
@@ -391,7 +378,7 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[3])
+ if (changesMask[2])
{
for (uint32 i = 0; i < Gems.size(); ++i)
{
@@ -401,71 +388,75 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
}
}
- if (changesMask[4])
+ if (changesMask[3])
{
data << Owner;
}
- if (changesMask[5])
+ if (changesMask[4])
{
data << ContainedIn;
}
- if (changesMask[6])
+ if (changesMask[5])
{
data << Creator;
}
- if (changesMask[7])
+ if (changesMask[6])
{
data << GiftCreator;
}
- if (changesMask[8])
+ if (changesMask[7])
{
data << uint32(StackCount);
}
- if (changesMask[9])
+ if (changesMask[8])
{
data << uint32(Expiration);
}
- if (changesMask[10])
+ if (changesMask[9])
{
data << uint32(DynamicFlags);
}
- if (changesMask[11])
+ if (changesMask[10])
{
data << uint32(Durability);
}
- if (changesMask[12])
+ if (changesMask[11])
{
data << uint32(MaxDurability);
}
- if (changesMask[13])
+ if (changesMask[12])
{
data << uint32(CreatePlayedTime);
}
- if (changesMask[14])
+ if (changesMask[13])
{
data << int32(Context);
}
- if (changesMask[15])
+ if (changesMask[14])
{
data << int64(CreateTime);
}
- if (changesMask[16])
+ if (changesMask[15])
{
data << uint64(ArtifactXP);
}
- if (changesMask[17])
+ if (changesMask[16])
{
data << uint8(ItemAppearanceModID);
}
- if (changesMask[19])
+ if (changesMask[18])
{
data << uint32(DynamicFlags2);
}
+ if (changesMask[19])
+ {
+ data << ItemBonusKey;
+ }
if (changesMask[20])
{
data << uint16(DEBUGItemLevel);
}
- if (changesMask[18])
+ if (changesMask[17])
{
Modifiers->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
@@ -494,7 +485,6 @@ void ItemData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
void ItemData::ClearChangesMask()
{
- Base::ClearChangesMask(BonusListIDs);
Base::ClearChangesMask(ArtifactPowers);
Base::ClearChangesMask(Gems);
Base::ClearChangesMask(Owner);
@@ -513,6 +503,7 @@ void ItemData::ClearChangesMask()
Base::ClearChangesMask(ItemAppearanceModID);
Base::ClearChangesMask(Modifiers);
Base::ClearChangesMask(DynamicFlags2);
+ Base::ClearChangesMask(ItemBonusKey);
Base::ClearChangesMask(DEBUGItemLevel);
Base::ClearChangesMask(SpellCharges);
Base::ClearChangesMask(Enchantment);
@@ -968,6 +959,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << BattlePetCompanionGUID;
data << uint64(BattlePetDBID);
ChannelData->WriteCreate(data, owner, receiver);
+ data << int8(SpellEmpowerStage);
data << uint32(SummonedByHomeRealm);
data << uint8(Race);
data << uint8(ClassId);
@@ -1120,6 +1112,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
data << uint32(PassiveSpells.size());
data << uint32(WorldEffects.size());
data << uint32(ChannelObjects.size());
+ data << int32(FlightCapabilityID);
data << uint32(SilencedSchoolMask);
data << NameplateAttachToGUID;
for (uint32 i = 0; i < PassiveSpells.size(); ++i)
@@ -1138,7 +1131,7 @@ void UnitData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xFC000FFFu, 0x00000001u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -1146,16 +1139,16 @@ void UnitData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisi
void UnitData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Owner))
- allowedMaskForTarget |= { 0x00002000u, 0x1E008000u, 0xFFE10000u, 0x0800007Eu, 0x80FFFC00u, 0xFFFFFFFFu, 0x00000003u };
+ allowedMaskForTarget |= { 0x00002000u, 0x3C010000u, 0xFFC20000u, 0x200000FEu, 0x03FFF000u, 0xFFFFFFFEu, 0x0000000Fu };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::UnitAll))
- allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x08000000u, 0x00FFFC00u, 0x00000000u, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x00000000u, 0x00000000u, 0x20000000u, 0x03FFF000u, 0x00000000u, 0x00000000u };
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::Empath))
- allowedMaskForTarget |= { 0x00000000u, 0x1E000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x000FF000u, 0x00000000u };
+ allowedMaskForTarget |= { 0x00000000u, 0x3C000000u, 0x00000000u, 0x00000000u, 0x00000000u, 0x003FC000u, 0x00000000u };
}
void UnitData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xE1FF7FFFu, 0x001EFFFFu, 0xFFFFFF81u, 0x7F0003FFu, 0x00000000u, 0x00000000u });
+ Mask allowedMaskForTarget({ 0xFFFFDFFFu, 0xC3FEFFFFu, 0x003DFFFFu, 0xFFFFFF01u, 0xFC000FFFu, 0x00000001u, 0x00000000u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -1310,473 +1303,481 @@ void UnitData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignor
}
if (changesMask[23])
{
- data << uint32(SummonedByHomeRealm);
+ data << int8(SpellEmpowerStage);
}
if (changesMask[24])
{
- data << uint8(Race);
+ data << uint32(SummonedByHomeRealm);
}
if (changesMask[25])
{
- data << uint8(ClassId);
+ data << uint8(Race);
}
if (changesMask[26])
{
- data << uint8(PlayerClassId);
+ data << uint8(ClassId);
}
if (changesMask[27])
{
- data << uint8(Sex);
+ data << uint8(PlayerClassId);
}
if (changesMask[28])
{
- data << uint8(DisplayPower);
+ data << uint8(Sex);
}
if (changesMask[29])
{
- data << uint32(OverrideDisplayPowerID);
+ data << uint8(DisplayPower);
}
if (changesMask[30])
{
- data << int64(Health);
+ data << uint32(OverrideDisplayPowerID);
}
if (changesMask[31])
{
- data << int64(MaxHealth);
+ data << int64(Health);
}
}
if (changesMask[32])
{
if (changesMask[33])
{
- data << int32(Level);
+ data << int64(MaxHealth);
}
if (changesMask[34])
{
- data << int32(EffectiveLevel);
+ data << int32(Level);
}
if (changesMask[35])
{
- data << int32(ContentTuningID);
+ data << int32(EffectiveLevel);
}
if (changesMask[36])
{
- data << int32(ScalingLevelMin);
+ data << int32(ContentTuningID);
}
if (changesMask[37])
{
- data << int32(ScalingLevelMax);
+ data << int32(ScalingLevelMin);
}
if (changesMask[38])
{
- data << int32(ScalingLevelDelta);
+ data << int32(ScalingLevelMax);
}
if (changesMask[39])
{
- data << int32(ScalingFactionGroup);
+ data << int32(ScalingLevelDelta);
}
if (changesMask[40])
{
- data << int32(ScalingHealthItemLevelCurveID);
+ data << int32(ScalingFactionGroup);
}
if (changesMask[41])
{
- data << int32(ScalingDamageItemLevelCurveID);
+ data << int32(ScalingHealthItemLevelCurveID);
}
if (changesMask[42])
{
- data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver));
+ data << int32(ScalingDamageItemLevelCurveID);
}
if (changesMask[43])
{
- data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
+ data << int32(ViewerDependentValue<FactionTemplateTag>::GetValue(this, owner, receiver));
}
if (changesMask[44])
{
- data << uint32(Flags2);
+ data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[45])
{
- data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
+ data << uint32(Flags2);
}
if (changesMask[46])
{
- data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver));
+ data << uint32(ViewerDependentValue<Flags3Tag>::GetValue(this, owner, receiver));
}
if (changesMask[47])
{
- data << uint32(RangedAttackRoundBaseTime);
+ data << uint32(ViewerDependentValue<AuraStateTag>::GetValue(this, owner, receiver));
}
if (changesMask[48])
{
- data << float(BoundingRadius);
+ data << uint32(RangedAttackRoundBaseTime);
}
if (changesMask[49])
{
- data << float(CombatReach);
+ data << float(BoundingRadius);
}
if (changesMask[50])
{
- data << float(DisplayScale);
+ data << float(CombatReach);
}
if (changesMask[51])
{
- data << int32(CreatureFamily);
+ data << float(DisplayScale);
}
if (changesMask[52])
{
- data << int32(CreatureType);
+ data << int32(CreatureFamily);
}
if (changesMask[53])
{
- data << int32(NativeDisplayID);
+ data << int32(CreatureType);
}
if (changesMask[54])
{
- data << float(NativeXDisplayScale);
+ data << int32(NativeDisplayID);
}
if (changesMask[55])
{
- data << int32(MountDisplayID);
+ data << float(NativeXDisplayScale);
}
if (changesMask[56])
{
- data << int32(CosmeticMountDisplayID);
+ data << int32(MountDisplayID);
}
if (changesMask[57])
{
- data << float(MinDamage);
+ data << int32(CosmeticMountDisplayID);
}
if (changesMask[58])
{
- data << float(MaxDamage);
+ data << float(MinDamage);
}
if (changesMask[59])
{
- data << float(MinOffHandDamage);
+ data << float(MaxDamage);
}
if (changesMask[60])
{
- data << float(MaxOffHandDamage);
+ data << float(MinOffHandDamage);
}
if (changesMask[61])
{
- data << uint8(StandState);
+ data << float(MaxOffHandDamage);
}
if (changesMask[62])
{
- data << uint8(PetTalentPoints);
+ data << uint8(StandState);
}
if (changesMask[63])
{
- data << uint8(VisFlags);
+ data << uint8(PetTalentPoints);
}
}
if (changesMask[64])
{
if (changesMask[65])
{
- data << uint8(AnimTier);
+ data << uint8(VisFlags);
}
if (changesMask[66])
{
- data << uint32(PetNumber);
+ data << uint8(AnimTier);
}
if (changesMask[67])
{
- data << uint32(PetNameTimestamp);
+ data << uint32(PetNumber);
}
if (changesMask[68])
{
- data << uint32(PetExperience);
+ data << uint32(PetNameTimestamp);
}
if (changesMask[69])
{
- data << uint32(PetNextLevelExperience);
+ data << uint32(PetExperience);
}
if (changesMask[70])
{
- data << float(ModCastingSpeed);
+ data << uint32(PetNextLevelExperience);
}
if (changesMask[71])
{
- data << float(ModCastingSpeedNeg);
+ data << float(ModCastingSpeed);
}
if (changesMask[72])
{
- data << float(ModSpellHaste);
+ data << float(ModCastingSpeedNeg);
}
if (changesMask[73])
{
- data << float(ModHaste);
+ data << float(ModSpellHaste);
}
if (changesMask[74])
{
- data << float(ModRangedHaste);
+ data << float(ModHaste);
}
if (changesMask[75])
{
- data << float(ModHasteRegen);
+ data << float(ModRangedHaste);
}
if (changesMask[76])
{
- data << float(ModTimeRate);
+ data << float(ModHasteRegen);
}
if (changesMask[77])
{
- data << int32(CreatedBySpell);
+ data << float(ModTimeRate);
}
if (changesMask[78])
{
- data << int32(EmoteState);
+ data << int32(CreatedBySpell);
}
if (changesMask[79])
{
- data << int32(BaseMana);
+ data << int32(EmoteState);
}
if (changesMask[80])
{
- data << int32(BaseHealth);
+ data << int32(BaseMana);
}
if (changesMask[81])
{
- data << uint8(SheatheState);
+ data << int32(BaseHealth);
}
if (changesMask[82])
{
- data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver));
+ data << uint8(SheatheState);
}
if (changesMask[83])
{
- data << uint8(PetFlags);
+ data << uint8(ViewerDependentValue<PvpFlagsTag>::GetValue(this, owner, receiver));
}
if (changesMask[84])
{
- data << uint8(ShapeshiftForm);
+ data << uint8(PetFlags);
}
if (changesMask[85])
{
- data << int32(AttackPower);
+ data << uint8(ShapeshiftForm);
}
if (changesMask[86])
{
- data << int32(AttackPowerModPos);
+ data << int32(AttackPower);
}
if (changesMask[87])
{
- data << int32(AttackPowerModNeg);
+ data << int32(AttackPowerModPos);
}
if (changesMask[88])
{
- data << float(AttackPowerMultiplier);
+ data << int32(AttackPowerModNeg);
}
if (changesMask[89])
{
- data << int32(RangedAttackPower);
+ data << float(AttackPowerMultiplier);
}
if (changesMask[90])
{
- data << int32(RangedAttackPowerModPos);
+ data << int32(RangedAttackPower);
}
if (changesMask[91])
{
- data << int32(RangedAttackPowerModNeg);
+ data << int32(RangedAttackPowerModPos);
}
if (changesMask[92])
{
- data << float(RangedAttackPowerMultiplier);
+ data << int32(RangedAttackPowerModNeg);
}
if (changesMask[93])
{
- data << int32(MainHandWeaponAttackPower);
+ data << float(RangedAttackPowerMultiplier);
}
if (changesMask[94])
{
- data << int32(OffHandWeaponAttackPower);
+ data << int32(MainHandWeaponAttackPower);
}
if (changesMask[95])
{
- data << int32(RangedWeaponAttackPower);
+ data << int32(OffHandWeaponAttackPower);
}
}
if (changesMask[96])
{
if (changesMask[97])
{
- data << int32(SetAttackSpeedAura);
+ data << int32(RangedWeaponAttackPower);
}
if (changesMask[98])
{
- data << float(Lifesteal);
+ data << int32(SetAttackSpeedAura);
}
if (changesMask[99])
{
- data << float(MinRangedDamage);
+ data << float(Lifesteal);
}
if (changesMask[100])
{
- data << float(MaxRangedDamage);
+ data << float(MinRangedDamage);
}
if (changesMask[101])
{
- data << float(ManaCostMultiplier);
+ data << float(MaxRangedDamage);
}
if (changesMask[102])
{
- data << float(MaxHealthModifier);
+ data << float(ManaCostMultiplier);
}
if (changesMask[103])
{
- data << float(HoverHeight);
+ data << float(MaxHealthModifier);
}
if (changesMask[104])
{
- data << int32(MinItemLevelCutoff);
+ data << float(HoverHeight);
}
if (changesMask[105])
{
- data << int32(MinItemLevel);
+ data << int32(MinItemLevelCutoff);
}
if (changesMask[106])
{
- data << int32(MaxItemLevel);
+ data << int32(MinItemLevel);
}
if (changesMask[107])
{
- data << int32(AzeriteItemLevel);
+ data << int32(MaxItemLevel);
}
if (changesMask[108])
{
- data << int32(WildBattlePetLevel);
+ data << int32(AzeriteItemLevel);
}
if (changesMask[109])
{
- data << int32(BattlePetCompanionExperience);
+ data << int32(WildBattlePetLevel);
}
if (changesMask[110])
{
- data << uint32(BattlePetCompanionNameTimestamp);
+ data << int32(BattlePetCompanionExperience);
}
if (changesMask[111])
{
- data << int32(InteractSpellID);
+ data << uint32(BattlePetCompanionNameTimestamp);
}
if (changesMask[112])
{
- data << int32(ScaleDuration);
+ data << int32(InteractSpellID);
}
if (changesMask[113])
{
- data << int32(LooksLikeMountID);
+ data << int32(ScaleDuration);
}
if (changesMask[114])
{
- data << int32(LooksLikeCreatureID);
+ data << int32(LooksLikeMountID);
}
if (changesMask[115])
{
- data << int32(LookAtControllerID);
+ data << int32(LooksLikeCreatureID);
}
if (changesMask[116])
{
- data << int32(TaxiNodesID);
+ data << int32(LookAtControllerID);
}
if (changesMask[117])
{
- data << GuildGUID;
+ data << int32(TaxiNodesID);
}
if (changesMask[118])
{
- data << uint32(SilencedSchoolMask);
+ data << GuildGUID;
}
if (changesMask[119])
{
+ data << int32(FlightCapabilityID);
+ }
+ if (changesMask[120])
+ {
+ data << uint32(SilencedSchoolMask);
+ }
+ if (changesMask[121])
+ {
data << NameplateAttachToGUID;
}
}
- if (changesMask[120])
+ if (changesMask[122])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[121 + i])
+ if (changesMask[123 + i])
{
data << uint32(ViewerDependentValue<NpcFlagsTag>::GetValue(this, i, owner, receiver));
}
}
}
- if (changesMask[123])
+ if (changesMask[125])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[124 + i])
+ if (changesMask[126 + i])
{
data << int32(Power[i]);
}
- if (changesMask[131 + i])
+ if (changesMask[133 + i])
{
data << int32(MaxPower[i]);
}
- if (changesMask[138 + i])
+ if (changesMask[140 + i])
{
data << float(PowerRegenFlatModifier[i]);
}
- if (changesMask[145 + i])
+ if (changesMask[147 + i])
{
data << float(PowerRegenInterruptedFlatModifier[i]);
}
}
}
- if (changesMask[152])
+ if (changesMask[154])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[153 + i])
+ if (changesMask[155 + i])
{
VirtualItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[156])
+ if (changesMask[158])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[157 + i])
+ if (changesMask[159 + i])
{
data << uint32(AttackRoundBaseTime[i]);
}
}
}
- if (changesMask[159])
+ if (changesMask[161])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[160 + i])
+ if (changesMask[162 + i])
{
data << int32(Stats[i]);
}
- if (changesMask[164 + i])
+ if (changesMask[166 + i])
{
data << int32(StatPosBuff[i]);
}
- if (changesMask[168 + i])
+ if (changesMask[170 + i])
{
data << int32(StatNegBuff[i]);
}
}
}
- if (changesMask[172])
+ if (changesMask[174])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[173 + i])
+ if (changesMask[175 + i])
{
data << int32(Resistances[i]);
}
- if (changesMask[180 + i])
+ if (changesMask[182 + i])
{
data << int32(BonusResistanceMods[i]);
}
- if (changesMask[187 + i])
+ if (changesMask[189 + i])
{
data << int32(ManaCostModifier[i]);
}
@@ -1808,6 +1809,7 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(BattlePetCompanionGUID);
Base::ClearChangesMask(BattlePetDBID);
Base::ClearChangesMask(ChannelData);
+ Base::ClearChangesMask(SpellEmpowerStage);
Base::ClearChangesMask(SummonedByHomeRealm);
Base::ClearChangesMask(Race);
Base::ClearChangesMask(ClassId);
@@ -1900,6 +1902,7 @@ void UnitData::ClearChangesMask()
Base::ClearChangesMask(LookAtControllerID);
Base::ClearChangesMask(TaxiNodesID);
Base::ClearChangesMask(GuildGUID);
+ Base::ClearChangesMask(FlightCapabilityID);
Base::ClearChangesMask(SilencedSchoolMask);
Base::ClearChangesMask(NameplateAttachToGUID);
Base::ClearChangesMask(NpcFlags);
@@ -2133,12 +2136,14 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
}
data << uint8(CurrentBattlePetBreedQuality);
data << int32(HonorLevel);
+ data << int64(LogoutTime);
data << uint32(ArenaCooldowns.size());
data << int32(Field_B0);
data << int32(Field_B4);
CtrOptions->WriteCreate(data, owner, receiver);
data << int32(CovenantID);
data << int32(SoulbindID);
+ data << uint32(VisualItemReplacements.size());
for (uint32 i = 0; i < Customizations.size(); ++i)
{
Customizations[i].WriteCreate(data, owner, receiver);
@@ -2154,6 +2159,10 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
{
ArenaCooldowns[i].WriteCreate(data, owner, receiver);
}
+ for (uint32 i = 0; i < VisualItemReplacements.size(); ++i)
+ {
+ data << int32(VisualItemReplacements[i]);
+ }
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
{
data.WriteBit(HasQuestSession);
@@ -2165,7 +2174,7 @@ void PlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
- Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu });
+ Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x3FFFFFF8u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
WriteUpdate(data, _changesMask & allowedMaskForTarget, false, owner, receiver);
}
@@ -2173,12 +2182,12 @@ void PlayerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
void PlayerData::AppendAllowedFieldsMaskForFlag(Mask& allowedMaskForTarget, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
if (fieldVisibilityFlags.HasFlag(UpdateFieldFlag::PartyMember))
- allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFF8u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000001u };
+ allowedMaskForTarget |= { 0x00000012u, 0xFFFFFFE0u, 0xFFFFFFFFu, 0xFFFFFFFFu, 0xFFFFFFFFu, 0x00000007u };
}
void PlayerData::FilterDisallowedFieldsMaskForFlag(Mask& changesMask, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags)
{
- Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x00000007u, 0x00000000u, 0x00000000u, 0x00000000u, 0x0FFFFFFEu });
+ Mask allowedMaskForTarget({ 0xFFFFFFEDu, 0x0000001Fu, 0x00000000u, 0x00000000u, 0x00000000u, 0x3FFFFFF8u });
AppendAllowedFieldsMaskForFlag(allowedMaskForTarget, fieldVisibilityFlags);
changesMask &= allowedMaskForTarget;
}
@@ -2222,6 +2231,13 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign
else
WriteCompleteDynamicFieldUpdateMask(ArenaCooldowns.size(), data);
}
+ if (changesMask[6])
+ {
+ if (!ignoreNestedChangesMask)
+ VisualItemReplacements.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(VisualItemReplacements.size(), data);
+ }
}
data.FlushBits();
if (changesMask[0])
@@ -2261,125 +2277,139 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign
}
if (changesMask[6])
{
- data << DuelArbiter;
+ for (uint32 i = 0; i < VisualItemReplacements.size(); ++i)
+ {
+ if (VisualItemReplacements.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ data << int32(VisualItemReplacements[i]);
+ }
+ }
}
if (changesMask[7])
{
- data << WowAccount;
+ data << DuelArbiter;
}
if (changesMask[8])
{
- data << LootTargetGUID;
+ data << WowAccount;
}
if (changesMask[9])
{
- data << uint32(PlayerFlags);
+ data << LootTargetGUID;
}
if (changesMask[10])
{
- data << uint32(PlayerFlagsEx);
+ data << uint32(PlayerFlags);
}
if (changesMask[11])
{
- data << uint32(GuildRankID);
+ data << uint32(PlayerFlagsEx);
}
if (changesMask[12])
{
- data << uint32(GuildDeleteDate);
+ data << uint32(GuildRankID);
}
if (changesMask[13])
{
- data << int32(GuildLevel);
+ data << uint32(GuildDeleteDate);
}
if (changesMask[14])
{
- data << uint8(PartyType);
+ data << int32(GuildLevel);
}
if (changesMask[15])
{
- data << uint8(NativeSex);
+ data << uint8(PartyType);
}
if (changesMask[16])
{
- data << uint8(Inebriation);
+ data << uint8(NativeSex);
}
if (changesMask[17])
{
- data << uint8(PvpTitle);
+ data << uint8(Inebriation);
}
if (changesMask[18])
{
- data << uint8(ArenaFaction);
+ data << uint8(PvpTitle);
}
if (changesMask[19])
{
- data << uint32(DuelTeam);
+ data << uint8(ArenaFaction);
}
if (changesMask[20])
{
- data << int32(GuildTimeStamp);
+ data << uint32(DuelTeam);
}
if (changesMask[21])
{
- data << int32(PlayerTitle);
+ data << int32(GuildTimeStamp);
}
if (changesMask[22])
{
- data << int32(FakeInebriation);
+ data << int32(PlayerTitle);
}
if (changesMask[23])
{
- data << uint32(VirtualPlayerRealm);
+ data << int32(FakeInebriation);
}
if (changesMask[24])
{
- data << uint32(CurrentSpecID);
+ data << uint32(VirtualPlayerRealm);
}
if (changesMask[25])
{
- data << int32(TaxiMountAnimKitID);
+ data << uint32(CurrentSpecID);
}
if (changesMask[26])
{
- data << uint8(CurrentBattlePetBreedQuality);
+ data << int32(TaxiMountAnimKitID);
}
if (changesMask[27])
{
- data << int32(HonorLevel);
+ data << uint8(CurrentBattlePetBreedQuality);
}
if (changesMask[28])
{
- data << int32(Field_B0);
+ data << int32(HonorLevel);
}
if (changesMask[29])
{
- data << int32(Field_B4);
+ data << int64(LogoutTime);
}
if (changesMask[30])
{
- CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << int32(Field_B0);
}
if (changesMask[31])
{
- data << int32(CovenantID);
+ data << int32(Field_B4);
}
}
if (changesMask[32])
{
if (changesMask[33])
{
- data << int32(SoulbindID);
+ CtrOptions->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[34])
{
+ data << int32(CovenantID);
+ }
+ if (changesMask[35])
+ {
+ data << int32(SoulbindID);
+ }
+ if (changesMask[36])
+ {
data << DungeonScore;
}
}
- if (changesMask[35])
+ if (changesMask[37])
{
for (uint32 i = 0; i < 125; ++i)
{
- if (changesMask[36 + i])
+ if (changesMask[38 + i])
{
if (noQuestLogChangesMask)
QuestLog[i].WriteCreate(data, owner, receiver);
@@ -2388,21 +2418,21 @@ void PlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ign
}
}
}
- if (changesMask[161])
+ if (changesMask[163])
{
for (uint32 i = 0; i < 19; ++i)
{
- if (changesMask[162 + i])
+ if (changesMask[164 + i])
{
VisibleItems[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[181])
+ if (changesMask[183])
{
for (uint32 i = 0; i < 6; ++i)
{
- if (changesMask[182 + i])
+ if (changesMask[184 + i])
{
data << float(AvgItemLevel[i]);
}
@@ -2418,6 +2448,7 @@ void PlayerData::ClearChangesMask()
Base::ClearChangesMask(Customizations);
Base::ClearChangesMask(QuestSessionQuestLog);
Base::ClearChangesMask(ArenaCooldowns);
+ Base::ClearChangesMask(VisualItemReplacements);
Base::ClearChangesMask(DuelArbiter);
Base::ClearChangesMask(WowAccount);
Base::ClearChangesMask(LootTargetGUID);
@@ -2440,6 +2471,7 @@ void PlayerData::ClearChangesMask()
Base::ClearChangesMask(TaxiMountAnimKitID);
Base::ClearChangesMask(CurrentBattlePetBreedQuality);
Base::ClearChangesMask(HonorLevel);
+ Base::ClearChangesMask(LogoutTime);
Base::ClearChangesMask(Field_B0);
Base::ClearChangesMask(Field_B4);
Base::ClearChangesMask(CtrOptions);
@@ -2565,6 +2597,8 @@ void RestInfo::ClearChangesMask()
void PVPInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
{
+ data << int8(Bracket);
+ data << int32(PvpRatingID);
data << uint32(WeeklyPlayed);
data << uint32(WeeklyWon);
data << uint32(SeasonPlayed);
@@ -2576,6 +2610,10 @@ void PVPInfo::WriteCreate(ByteBuffer& data, Player const* owner, Player const* r
data << uint32(WeeklyBestWinPvpTierID);
data << uint32(Field_28);
data << uint32(Field_2C);
+ data << uint32(WeeklyRoundsPlayed);
+ data << uint32(WeeklyRoundsWon);
+ data << uint32(SeasonRoundsPlayed);
+ data << uint32(SeasonRoundsWon);
data.WriteBit(Disqualified);
data.FlushBits();
}
@@ -2586,7 +2624,7 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const
if (ignoreChangesMask)
changesMask.SetAll();
- data.WriteBits(changesMask.GetBlock(0), 13);
+ data.WriteBits(changesMask.GetBlock(0), 19);
if (changesMask[0])
{
@@ -2600,48 +2638,72 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const
{
if (changesMask[2])
{
- data << uint32(WeeklyPlayed);
+ data << int8(Bracket);
}
if (changesMask[3])
{
- data << uint32(WeeklyWon);
+ data << int32(PvpRatingID);
}
if (changesMask[4])
{
- data << uint32(SeasonPlayed);
+ data << uint32(WeeklyPlayed);
}
if (changesMask[5])
{
- data << uint32(SeasonWon);
+ data << uint32(WeeklyWon);
}
if (changesMask[6])
{
- data << uint32(Rating);
+ data << uint32(SeasonPlayed);
}
if (changesMask[7])
{
- data << uint32(WeeklyBestRating);
+ data << uint32(SeasonWon);
}
if (changesMask[8])
{
- data << uint32(SeasonBestRating);
+ data << uint32(Rating);
}
if (changesMask[9])
{
- data << uint32(PvpTierID);
+ data << uint32(WeeklyBestRating);
}
if (changesMask[10])
{
- data << uint32(WeeklyBestWinPvpTierID);
+ data << uint32(SeasonBestRating);
}
if (changesMask[11])
{
- data << uint32(Field_28);
+ data << uint32(PvpTierID);
}
if (changesMask[12])
{
+ data << uint32(WeeklyBestWinPvpTierID);
+ }
+ if (changesMask[13])
+ {
+ data << uint32(Field_28);
+ }
+ if (changesMask[14])
+ {
data << uint32(Field_2C);
}
+ if (changesMask[15])
+ {
+ data << uint32(WeeklyRoundsPlayed);
+ }
+ if (changesMask[16])
+ {
+ data << uint32(WeeklyRoundsWon);
+ }
+ if (changesMask[17])
+ {
+ data << uint32(SeasonRoundsPlayed);
+ }
+ if (changesMask[18])
+ {
+ data << uint32(SeasonRoundsWon);
+ }
}
data.FlushBits();
}
@@ -2649,6 +2711,8 @@ void PVPInfo::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const
void PVPInfo::ClearChangesMask()
{
Base::ClearChangesMask(Disqualified);
+ Base::ClearChangesMask(Bracket);
+ Base::ClearChangesMask(PvpRatingID);
Base::ClearChangesMask(WeeklyPlayed);
Base::ClearChangesMask(WeeklyWon);
Base::ClearChangesMask(SeasonPlayed);
@@ -2660,6 +2724,10 @@ void PVPInfo::ClearChangesMask()
Base::ClearChangesMask(WeeklyBestWinPvpTierID);
Base::ClearChangesMask(Field_28);
Base::ClearChangesMask(Field_2C);
+ Base::ClearChangesMask(WeeklyRoundsPlayed);
+ Base::ClearChangesMask(WeeklyRoundsWon);
+ Base::ClearChangesMask(SeasonRoundsPlayed);
+ Base::ClearChangesMask(SeasonRoundsWon);
_changesMask.ResetAll();
}
@@ -2926,9 +2994,514 @@ void ReplayedQuest::ClearChangesMask()
_changesMask.ResetAll();
}
+void TraitEntry::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int32(TraitNodeID);
+ data << int32(TraitNodeEntryID);
+ data << int32(Rank);
+ data << int32(GrantedRanks);
+}
+
+void TraitEntry::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ data << int32(TraitNodeID);
+ data << int32(TraitNodeEntryID);
+ data << int32(Rank);
+ data << int32(GrantedRanks);
+}
+
+bool TraitEntry::operator==(TraitEntry const& right) const
+{
+ return TraitNodeID == right.TraitNodeID
+ && TraitNodeEntryID == right.TraitNodeEntryID
+ && Rank == right.Rank
+ && GrantedRanks == right.GrantedRanks;
+}
+
+void TraitConfig::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int32(ID);
+ data << int32(Type);
+ data << uint32(Entries.size());
+ if (Type == 2)
+ {
+ data << int32(SkillLineID);
+ }
+ if (Type == 1)
+ {
+ data << int32(ChrSpecializationID);
+ data << int32(CombatConfigFlags);
+ data << int32(LocalIdentifier);
+ }
+ if (Type == 3)
+ {
+ data << int32(TraitSystemID);
+ }
+ for (uint32 i = 0; i < Entries.size(); ++i)
+ {
+ Entries[i].WriteCreate(data, owner, receiver);
+ }
+ data.WriteBits(Name->size(), 9);
+ data.WriteString(Name);
+ data.FlushBits();
+}
+
+void TraitConfig::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 12);
+
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ if (!ignoreChangesMask)
+ Entries.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Entries.size(), data);
+ }
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ for (uint32 i = 0; i < Entries.size(); ++i)
+ {
+ if (Entries.HasChanged(i) || ignoreChangesMask)
+ {
+ Entries[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[2])
+ {
+ data << int32(ID);
+ }
+ }
+ if (changesMask[4])
+ {
+ if (changesMask[5])
+ {
+ data << int32(Type);
+ }
+ if (changesMask[6])
+ {
+ if (Type == 2)
+ {
+ data << int32(SkillLineID);
+ }
+ }
+ if (changesMask[7])
+ {
+ if (Type == 1)
+ {
+ data << int32(ChrSpecializationID);
+ }
+ }
+ }
+ if (changesMask[8])
+ {
+ if (changesMask[9])
+ {
+ if (Type == 1)
+ {
+ data << int32(CombatConfigFlags);
+ }
+ }
+ if (changesMask[10])
+ {
+ if (Type == 1)
+ {
+ data << int32(LocalIdentifier);
+ }
+ }
+ if (changesMask[11])
+ {
+ if (Type == 3)
+ {
+ data << int32(TraitSystemID);
+ }
+ }
+ }
+ if (changesMask[0])
+ {
+ if (changesMask[3])
+ {
+ data.WriteBits(Name->size(), 9);
+ data.WriteString(Name);
+ }
+ }
+ data.FlushBits();
+}
+
+void TraitConfig::ClearChangesMask()
+{
+ Base::ClearChangesMask(Entries);
+ Base::ClearChangesMask(ID);
+ Base::ClearChangesMask(Name);
+ Base::ClearChangesMask(Type);
+ Base::ClearChangesMask(SkillLineID);
+ Base::ClearChangesMask(ChrSpecializationID);
+ Base::ClearChangesMask(CombatConfigFlags);
+ Base::ClearChangesMask(LocalIdentifier);
+ Base::ClearChangesMask(TraitSystemID);
+ _changesMask.ResetAll();
+}
+
+void CraftingOrderItem::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << uint64(Field_0);
+ data << ItemGUID;
+ data << OwnerGUID;
+ data << int32(ItemID);
+ data << uint32(Quantity);
+ data << int32(ReagentQuality);
+ data.WriteBits(DataSlotIndex.has_value(), 1);
+ if (DataSlotIndex.has_value())
+ {
+ data << uint8(DataSlotIndex);
+ }
+}
+
+void CraftingOrderItem::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 7);
+
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ data << uint64(Field_0);
+ }
+ if (changesMask[1])
+ {
+ data << ItemGUID;
+ }
+ if (changesMask[2])
+ {
+ data << OwnerGUID;
+ }
+ if (changesMask[3])
+ {
+ data << int32(ItemID);
+ }
+ if (changesMask[4])
+ {
+ data << uint32(Quantity);
+ }
+ if (changesMask[5])
+ {
+ data << int32(ReagentQuality);
+ }
+ data.WriteBits(DataSlotIndex.has_value(), 1);
+ if (changesMask[6])
+ {
+ if (DataSlotIndex.has_value())
+ {
+ data << uint8(DataSlotIndex);
+ }
+ }
+}
+
+void CraftingOrderItem::ClearChangesMask()
+{
+ Base::ClearChangesMask(Field_0);
+ Base::ClearChangesMask(ItemGUID);
+ Base::ClearChangesMask(OwnerGUID);
+ Base::ClearChangesMask(ItemID);
+ Base::ClearChangesMask(Quantity);
+ Base::ClearChangesMask(ReagentQuality);
+ Base::ClearChangesMask(DataSlotIndex);
+ _changesMask.ResetAll();
+}
+
+void CraftingOrderData::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ data << int32(Field_0);
+ data << uint64(OrderID);
+ data << int32(SkillLineAbilityID);
+ data << uint8(OrderState);
+ data << uint8(OrderType);
+ data << uint8(MinQuality);
+ data << int64(ExpirationTime);
+ data << int64(ClaimEndTime);
+ data << int64(TipAmount);
+ data << int64(ConsortiumCut);
+ data << uint32(Flags);
+ data << CustomerGUID;
+ data << CustomerAccountGUID;
+ data << CrafterGUID;
+ data << PersonalCrafterGUID;
+ data << uint32(Reagents.size());
+ data.WriteBits(CustomerNotes->size(), 10);
+ data.WriteBits(OutputItem.has_value(), 1);
+ data.WriteBits(OutputItemData.has_value(), 1);
+ for (uint32 i = 0; i < Reagents.size(); ++i)
+ {
+ Reagents[i].WriteCreate(data, owner, receiver);
+ }
+ data.WriteString(CustomerNotes);
+ if (OutputItem.has_value())
+ {
+ OutputItem->WriteCreate(data, owner, receiver);
+ }
+ if (OutputItemData.has_value())
+ {
+ data << OutputItemData;
+ }
+ data.FlushBits();
+}
+
+void CraftingOrderData::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 24);
+
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ if (!ignoreChangesMask)
+ Reagents.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Reagents.size(), data);
+ }
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ if (changesMask[1])
+ {
+ for (uint32 i = 0; i < Reagents.size(); ++i)
+ {
+ if (Reagents.HasChanged(i) || ignoreChangesMask)
+ {
+ Reagents[i].WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[2])
+ {
+ data << int32(Field_0);
+ }
+ if (changesMask[3])
+ {
+ data << uint64(OrderID);
+ }
+ if (changesMask[4])
+ {
+ data << int32(SkillLineAbilityID);
+ }
+ }
+ if (changesMask[5])
+ {
+ if (changesMask[6])
+ {
+ data << uint8(OrderState);
+ }
+ if (changesMask[7])
+ {
+ data << uint8(OrderType);
+ }
+ if (changesMask[8])
+ {
+ data << uint8(MinQuality);
+ }
+ if (changesMask[9])
+ {
+ data << int64(ExpirationTime);
+ }
+ }
+ if (changesMask[10])
+ {
+ if (changesMask[11])
+ {
+ data << int64(ClaimEndTime);
+ }
+ if (changesMask[12])
+ {
+ data << int64(TipAmount);
+ }
+ if (changesMask[13])
+ {
+ data << int64(ConsortiumCut);
+ }
+ if (changesMask[14])
+ {
+ data << uint32(Flags);
+ }
+ }
+ if (changesMask[15])
+ {
+ if (changesMask[16])
+ {
+ data << CustomerGUID;
+ }
+ if (changesMask[17])
+ {
+ data << CustomerAccountGUID;
+ }
+ if (changesMask[18])
+ {
+ data << CrafterGUID;
+ }
+ if (changesMask[19])
+ {
+ data << PersonalCrafterGUID;
+ }
+ }
+ if (changesMask[20])
+ {
+ if (changesMask[21])
+ {
+ data.WriteBits(CustomerNotes->size(), 10);
+ data.WriteString(CustomerNotes);
+ }
+ data.WriteBits(OutputItem.has_value(), 1);
+ data.WriteBits(OutputItemData.has_value(), 1);
+ if (changesMask[22])
+ {
+ if (OutputItem.has_value())
+ {
+ OutputItem->WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ }
+ if (changesMask[23])
+ {
+ if (OutputItemData.has_value())
+ {
+ data << OutputItemData;
+ }
+ }
+ }
+ data.FlushBits();
+}
+
+void CraftingOrderData::ClearChangesMask()
+{
+ Base::ClearChangesMask(Reagents);
+ Base::ClearChangesMask(Field_0);
+ Base::ClearChangesMask(OrderID);
+ Base::ClearChangesMask(SkillLineAbilityID);
+ Base::ClearChangesMask(OrderState);
+ Base::ClearChangesMask(OrderType);
+ Base::ClearChangesMask(MinQuality);
+ Base::ClearChangesMask(ExpirationTime);
+ Base::ClearChangesMask(ClaimEndTime);
+ Base::ClearChangesMask(TipAmount);
+ Base::ClearChangesMask(ConsortiumCut);
+ Base::ClearChangesMask(Flags);
+ Base::ClearChangesMask(CustomerGUID);
+ Base::ClearChangesMask(CustomerAccountGUID);
+ Base::ClearChangesMask(CrafterGUID);
+ Base::ClearChangesMask(PersonalCrafterGUID);
+ Base::ClearChangesMask(CustomerNotes);
+ Base::ClearChangesMask(OutputItem);
+ Base::ClearChangesMask(OutputItemData);
+ _changesMask.ResetAll();
+}
+
+void CraftingOrder::WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const
+{
+ Data->WriteCreate(data, owner, receiver);
+ data.WriteBits(RecraftItemInfo.has_value(), 1);
+ data.WriteBits(Enchantments.size(), 4);
+ data.WriteBits(Gems.size(), 2);
+ if (RecraftItemInfo.has_value())
+ {
+ data << RecraftItemInfo;
+ }
+ for (uint32 i = 0; i < Enchantments.size(); ++i)
+ {
+ data << Enchantments[i];
+ }
+ for (uint32 i = 0; i < Gems.size(); ++i)
+ {
+ data << Gems[i];
+ }
+ data.FlushBits();
+}
+
+void CraftingOrder::WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const
+{
+ Mask changesMask = _changesMask;
+ if (ignoreChangesMask)
+ changesMask.SetAll();
+
+ data.WriteBits(changesMask.GetBlock(0), 4);
+
+ if (changesMask[0])
+ {
+ if (!ignoreChangesMask)
+ Enchantments.WriteUpdateMask(data, 4);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Enchantments.size(), data, 4);
+ }
+ if (changesMask[1])
+ {
+ if (!ignoreChangesMask)
+ Gems.WriteUpdateMask(data, 2);
+ else
+ WriteCompleteDynamicFieldUpdateMask(Gems.size(), data, 2);
+ }
+ data.FlushBits();
+ if (changesMask[0])
+ {
+ for (uint32 i = 0; i < Enchantments.size(); ++i)
+ {
+ if (Enchantments.HasChanged(i) || ignoreChangesMask)
+ {
+ data << Enchantments[i];
+ }
+ }
+ }
+ if (changesMask[1])
+ {
+ for (uint32 i = 0; i < Gems.size(); ++i)
+ {
+ if (Gems.HasChanged(i) || ignoreChangesMask)
+ {
+ data << Gems[i];
+ }
+ }
+ }
+ if (changesMask[2])
+ {
+ Data->WriteUpdate(data, ignoreChangesMask, owner, receiver);
+ }
+ data.WriteBits(RecraftItemInfo.has_value(), 1);
+ if (changesMask[3])
+ {
+ if (RecraftItemInfo.has_value())
+ {
+ data << RecraftItemInfo;
+ }
+ }
+ data.FlushBits();
+}
+
+void CraftingOrder::ClearChangesMask()
+{
+ Base::ClearChangesMask(Enchantments);
+ Base::ClearChangesMask(Gems);
+ Base::ClearChangesMask(Data);
+ Base::ClearChangesMask(RecraftItemInfo);
+ _changesMask.ResetAll();
+}
+
void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const
{
- for (uint32 i = 0; i < 199; ++i)
+ for (uint32 i = 0; i < 218; ++i)
{
data << InvSlots[i];
}
@@ -3014,6 +3587,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
data << int32(CombatRatings[i]);
}
+ data << uint32(PvpInfo.size());
data << int32(MaxLevel);
data << int32(ScalingPlayerLevelDelta);
data << int32(MaxCreatureScalingLevel);
@@ -3040,7 +3614,7 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << uint32(OverrideZonePVPType);
data << BnetAccount;
data << uint64(GuildClubMemberID);
- for (uint32 i = 0; i < 4; ++i)
+ for (uint32 i = 0; i < 5; ++i)
{
data << uint32(BagSlotFlags[i]);
}
@@ -3088,6 +3662,9 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
data << int32(TransportServerTime);
data << uint32(WeeklyRewardsPeriodSinceOrigin);
data << int16(DEBUGSoulbindConduitRank);
+ data << uint32(TraitConfigs.size());
+ data << uint32(ActiveCombatTraitConfigID);
+ data << uint32(CraftingOrders.size());
for (uint32 i = 0; i < KnownTitles.size(); ++i)
{
data << uint64(KnownTitles[i]);
@@ -3172,10 +3749,6 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
{
data << int32(DisabledSpells[i]);
}
- for (uint32 i = 0; i < 6; ++i)
- {
- PvpInfo[i].WriteCreate(data, owner, receiver);
- }
data.FlushBits();
data.WriteBit(BackpackAutoSortDisabled);
data.WriteBit(BankAutoSortDisabled);
@@ -3188,10 +3761,22 @@ void ActivePlayerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> f
QuestSession->WriteCreate(data, owner, receiver);
}
data << DungeonScore;
+ for (uint32 i = 0; i < PvpInfo.size(); ++i)
+ {
+ PvpInfo[i].WriteCreate(data, owner, receiver);
+ }
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
CharacterRestrictions[i].WriteCreate(data, owner, receiver);
}
+ for (uint32 i = 0; i < TraitConfigs.size(); ++i)
+ {
+ TraitConfigs[i].WriteCreate(data, owner, receiver);
+ }
+ for (uint32 i = 0; i < CraftingOrders.size(); ++i)
+ {
+ CraftingOrders[i].WriteCreate(data, owner, receiver);
+ }
data.FlushBits();
}
@@ -3204,8 +3789,8 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
{
for (uint32 i = 0; i < 1; ++i)
data << uint32(changesMask.GetBlocksMask(i));
- data.WriteBits(changesMask.GetBlocksMask(1), 17);
- for (uint32 i = 0; i < 49; ++i)
+ data.WriteBits(changesMask.GetBlocksMask(1), 18);
+ for (uint32 i = 0; i < 50; ++i)
if (changesMask.GetBlock(i))
data.WriteBits(changesMask.GetBlock(i), 32);
@@ -3237,109 +3822,116 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
if (changesMask[6])
{
if (!ignoreNestedChangesMask)
+ PvpInfo.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(PvpInfo.size(), data);
+ }
+ if (changesMask[7])
+ {
+ if (!ignoreNestedChangesMask)
ResearchSites.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ResearchSites.size(), data);
}
- if (changesMask[7])
+ if (changesMask[8])
{
if (!ignoreNestedChangesMask)
ResearchSiteProgress.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ResearchSiteProgress.size(), data);
}
- if (changesMask[8])
+ if (changesMask[9])
{
if (!ignoreNestedChangesMask)
DailyQuestsCompleted.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DailyQuestsCompleted.size(), data);
}
- if (changesMask[9])
+ if (changesMask[10])
{
if (!ignoreNestedChangesMask)
AvailableQuestLineXQuestIDs.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(AvailableQuestLineXQuestIDs.size(), data);
}
- if (changesMask[10])
+ if (changesMask[11])
{
if (!ignoreNestedChangesMask)
Heirlooms.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Heirlooms.size(), data);
}
- if (changesMask[11])
+ if (changesMask[12])
{
if (!ignoreNestedChangesMask)
HeirloomFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(HeirloomFlags.size(), data);
}
- if (changesMask[12])
+ if (changesMask[13])
{
if (!ignoreNestedChangesMask)
Toys.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Toys.size(), data);
}
- if (changesMask[13])
+ if (changesMask[14])
{
if (!ignoreNestedChangesMask)
ToyFlags.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ToyFlags.size(), data);
}
- if (changesMask[14])
+ if (changesMask[15])
{
if (!ignoreNestedChangesMask)
Transmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(Transmog.size(), data);
}
- if (changesMask[15])
+ if (changesMask[16])
{
if (!ignoreNestedChangesMask)
ConditionalTransmog.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ConditionalTransmog.size(), data);
}
- if (changesMask[16])
+ if (changesMask[17])
{
if (!ignoreNestedChangesMask)
SelfResSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SelfResSpells.size(), data);
}
- if (changesMask[17])
+ if (changesMask[18])
{
if (!ignoreNestedChangesMask)
RuneforgePowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RuneforgePowers.size(), data);
}
- if (changesMask[18])
+ if (changesMask[19])
{
if (!ignoreNestedChangesMask)
TransmogIllusions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(TransmogIllusions.size(), data);
}
- if (changesMask[19])
+ if (changesMask[20])
{
if (!ignoreNestedChangesMask)
CharacterRestrictions.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(CharacterRestrictions.size(), data);
}
- if (changesMask[20])
+ if (changesMask[21])
{
if (!ignoreNestedChangesMask)
SpellPctModByLabel.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(SpellPctModByLabel.size(), data);
}
- if (changesMask[21])
+ if (changesMask[22])
{
if (!ignoreNestedChangesMask)
SpellFlatModByLabel.WriteUpdateMask(data);
@@ -3347,11 +3939,11 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
WriteCompleteDynamicFieldUpdateMask(SpellFlatModByLabel.size(), data);
}
}
- if (changesMask[27])
+ if (changesMask[30])
{
for (uint32 i = 0; i < 1; ++i)
{
- if (changesMask[28 + i])
+ if (changesMask[31 + i])
{
if (!ignoreNestedChangesMask)
Research[i].WriteUpdateMask(data);
@@ -3370,41 +3962,55 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
data.FlushBits();
if (changesMask[0])
{
- if (changesMask[22])
+ if (changesMask[23])
{
if (!ignoreNestedChangesMask)
MawPowers.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MawPowers.size(), data);
}
- if (changesMask[23])
+ if (changesMask[24])
{
if (!ignoreNestedChangesMask)
MultiFloorExploration.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(MultiFloorExploration.size(), data);
}
- if (changesMask[24])
+ if (changesMask[25])
{
if (!ignoreNestedChangesMask)
RecipeProgression.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(RecipeProgression.size(), data);
}
- if (changesMask[25])
+ if (changesMask[26])
{
if (!ignoreNestedChangesMask)
ReplayedQuests.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(ReplayedQuests.size(), data);
}
- if (changesMask[26])
+ if (changesMask[27])
{
if (!ignoreNestedChangesMask)
DisabledSpells.WriteUpdateMask(data);
else
WriteCompleteDynamicFieldUpdateMask(DisabledSpells.size(), data);
}
+ if (changesMask[28])
+ {
+ if (!ignoreNestedChangesMask)
+ TraitConfigs.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(TraitConfigs.size(), data);
+ }
+ if (changesMask[29])
+ {
+ if (!ignoreNestedChangesMask)
+ CraftingOrders.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(CraftingOrders.size(), data);
+ }
}
data.FlushBits();
if (changesMask[0])
@@ -3419,7 +4025,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[6])
+ if (changesMask[7])
{
for (uint32 i = 0; i < ResearchSites.size(); ++i)
{
@@ -3429,7 +4035,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[7])
+ if (changesMask[8])
{
for (uint32 i = 0; i < ResearchSiteProgress.size(); ++i)
{
@@ -3439,7 +4045,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[8])
+ if (changesMask[9])
{
for (uint32 i = 0; i < DailyQuestsCompleted.size(); ++i)
{
@@ -3449,7 +4055,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[9])
+ if (changesMask[10])
{
for (uint32 i = 0; i < AvailableQuestLineXQuestIDs.size(); ++i)
{
@@ -3459,7 +4065,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[10])
+ if (changesMask[11])
{
for (uint32 i = 0; i < Heirlooms.size(); ++i)
{
@@ -3469,7 +4075,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[11])
+ if (changesMask[12])
{
for (uint32 i = 0; i < HeirloomFlags.size(); ++i)
{
@@ -3479,7 +4085,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[12])
+ if (changesMask[13])
{
for (uint32 i = 0; i < Toys.size(); ++i)
{
@@ -3489,7 +4095,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[13])
+ if (changesMask[14])
{
for (uint32 i = 0; i < ToyFlags.size(); ++i)
{
@@ -3499,7 +4105,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[14])
+ if (changesMask[15])
{
for (uint32 i = 0; i < Transmog.size(); ++i)
{
@@ -3509,7 +4115,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[15])
+ if (changesMask[16])
{
for (uint32 i = 0; i < ConditionalTransmog.size(); ++i)
{
@@ -3519,7 +4125,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[16])
+ if (changesMask[17])
{
for (uint32 i = 0; i < SelfResSpells.size(); ++i)
{
@@ -3529,7 +4135,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[17])
+ if (changesMask[18])
{
for (uint32 i = 0; i < RuneforgePowers.size(); ++i)
{
@@ -3539,7 +4145,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[18])
+ if (changesMask[19])
{
for (uint32 i = 0; i < TransmogIllusions.size(); ++i)
{
@@ -3549,7 +4155,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[20])
+ if (changesMask[21])
{
for (uint32 i = 0; i < SpellPctModByLabel.size(); ++i)
{
@@ -3559,7 +4165,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[21])
+ if (changesMask[22])
{
for (uint32 i = 0; i < SpellFlatModByLabel.size(); ++i)
{
@@ -3569,7 +4175,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[22])
+ if (changesMask[23])
{
for (uint32 i = 0; i < MawPowers.size(); ++i)
{
@@ -3579,7 +4185,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[23])
+ if (changesMask[24])
{
for (uint32 i = 0; i < MultiFloorExploration.size(); ++i)
{
@@ -3589,7 +4195,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[24])
+ if (changesMask[25])
{
for (uint32 i = 0; i < RecipeProgression.size(); ++i)
{
@@ -3599,7 +4205,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[25])
+ if (changesMask[26])
{
for (uint32 i = 0; i < ReplayedQuests.size(); ++i)
{
@@ -3609,7 +4215,7 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[26])
+ if (changesMask[27])
{
for (uint32 i = 0; i < DisabledSpells.size(); ++i)
{
@@ -3619,7 +4225,17 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[19])
+ if (changesMask[6])
+ {
+ for (uint32 i = 0; i < PvpInfo.size(); ++i)
+ {
+ if (PvpInfo.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
+ }
+ if (changesMask[20])
{
for (uint32 i = 0; i < CharacterRestrictions.size(); ++i)
{
@@ -3629,493 +4245,507 @@ void ActivePlayerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bo
}
}
}
- if (changesMask[29])
- {
- data << FarsightObject;
- }
- if (changesMask[30])
+ if (changesMask[28])
{
- data << SummonedBattlePetGUID;
+ for (uint32 i = 0; i < TraitConfigs.size(); ++i)
+ {
+ if (TraitConfigs.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ TraitConfigs[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
}
- if (changesMask[31])
+ if (changesMask[29])
{
- data << uint64(Coinage);
+ for (uint32 i = 0; i < CraftingOrders.size(); ++i)
+ {
+ if (CraftingOrders.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ CraftingOrders[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ }
}
if (changesMask[32])
{
- data << int32(XP);
+ data << FarsightObject;
}
if (changesMask[33])
{
- data << int32(NextLevelXP);
+ data << SummonedBattlePetGUID;
}
}
if (changesMask[34])
{
if (changesMask[35])
{
- data << int32(TrialXP);
+ data << uint64(Coinage);
}
if (changesMask[36])
{
- Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ data << int32(XP);
}
if (changesMask[37])
{
- data << int32(CharacterPoints);
+ data << int32(NextLevelXP);
}
if (changesMask[38])
{
- data << int32(MaxTalentTiers);
+ data << int32(TrialXP);
}
if (changesMask[39])
{
- data << uint32(TrackCreatureMask);
+ Skill->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
if (changesMask[40])
{
- data << float(MainhandExpertise);
+ data << int32(CharacterPoints);
}
if (changesMask[41])
{
- data << float(OffhandExpertise);
+ data << int32(MaxTalentTiers);
}
if (changesMask[42])
{
- data << float(RangedExpertise);
+ data << uint32(TrackCreatureMask);
}
if (changesMask[43])
{
- data << float(CombatRatingExpertise);
+ data << float(MainhandExpertise);
}
if (changesMask[44])
{
- data << float(BlockPercentage);
+ data << float(OffhandExpertise);
}
if (changesMask[45])
{
- data << float(DodgePercentage);
+ data << float(RangedExpertise);
}
if (changesMask[46])
{
- data << float(DodgePercentageFromAttribute);
+ data << float(CombatRatingExpertise);
}
if (changesMask[47])
{
- data << float(ParryPercentage);
+ data << float(BlockPercentage);
}
if (changesMask[48])
{
- data << float(ParryPercentageFromAttribute);
+ data << float(DodgePercentage);
}
if (changesMask[49])
{
- data << float(CritPercentage);
+ data << float(DodgePercentageFromAttribute);
}
if (changesMask[50])
{
- data << float(RangedCritPercentage);
+ data << float(ParryPercentage);
}
if (changesMask[51])
{
- data << float(OffhandCritPercentage);
+ data << float(ParryPercentageFromAttribute);
}
if (changesMask[52])
{
- data << float(SpellCritPercentage);
+ data << float(CritPercentage);
}
if (changesMask[53])
{
- data << int32(ShieldBlock);
+ data << float(RangedCritPercentage);
}
if (changesMask[54])
{
- data << float(ShieldBlockCritPercentage);
+ data << float(OffhandCritPercentage);
}
if (changesMask[55])
{
- data << float(Mastery);
+ data << float(SpellCritPercentage);
}
if (changesMask[56])
{
- data << float(Speed);
+ data << int32(ShieldBlock);
}
if (changesMask[57])
{
- data << float(Avoidance);
+ data << float(ShieldBlockCritPercentage);
}
if (changesMask[58])
{
- data << float(Sturdiness);
+ data << float(Mastery);
}
if (changesMask[59])
{
- data << int32(Versatility);
+ data << float(Speed);
}
if (changesMask[60])
{
- data << float(VersatilityBonus);
+ data << float(Avoidance);
}
if (changesMask[61])
{
- data << float(PvpPowerDamage);
+ data << float(Sturdiness);
}
if (changesMask[62])
{
- data << float(PvpPowerHealing);
+ data << int32(Versatility);
}
if (changesMask[63])
{
- data << int32(ModHealingDonePos);
+ data << float(VersatilityBonus);
}
if (changesMask[64])
{
- data << float(ModHealingPercent);
+ data << float(PvpPowerDamage);
}
if (changesMask[65])
{
- data << float(ModPeriodicHealingDonePercent);
+ data << float(PvpPowerHealing);
}
}
if (changesMask[66])
{
if (changesMask[67])
{
- data << float(ModSpellPowerPercent);
+ data << int32(ModHealingDonePos);
}
if (changesMask[68])
{
- data << float(ModResiliencePercent);
+ data << float(ModHealingPercent);
}
if (changesMask[69])
{
- data << float(OverrideSpellPowerByAPPercent);
+ data << float(ModPeriodicHealingDonePercent);
}
if (changesMask[70])
{
- data << float(OverrideAPBySpellPowerPercent);
+ data << float(ModSpellPowerPercent);
}
if (changesMask[71])
{
- data << int32(ModTargetResistance);
+ data << float(ModResiliencePercent);
}
if (changesMask[72])
{
- data << int32(ModTargetPhysicalResistance);
+ data << float(OverrideSpellPowerByAPPercent);
}
if (changesMask[73])
{
- data << uint32(LocalFlags);
+ data << float(OverrideAPBySpellPowerPercent);
}
if (changesMask[74])
{
- data << uint8(GrantableLevels);
+ data << int32(ModTargetResistance);
}
if (changesMask[75])
{
- data << uint8(MultiActionBars);
+ data << int32(ModTargetPhysicalResistance);
}
if (changesMask[76])
{
- data << uint8(LifetimeMaxRank);
+ data << uint32(LocalFlags);
}
if (changesMask[77])
{
- data << uint8(NumRespecs);
+ data << uint8(GrantableLevels);
}
if (changesMask[78])
{
- data << uint32(PvpMedals);
+ data << uint8(MultiActionBars);
}
if (changesMask[79])
{
- data << uint16(TodayHonorableKills);
+ data << uint8(LifetimeMaxRank);
}
if (changesMask[80])
{
- data << uint16(YesterdayHonorableKills);
+ data << uint8(NumRespecs);
}
if (changesMask[81])
{
- data << uint32(LifetimeHonorableKills);
+ data << uint32(PvpMedals);
}
if (changesMask[82])
{
- data << int32(WatchedFactionIndex);
+ data << uint16(TodayHonorableKills);
}
if (changesMask[83])
{
- data << int32(MaxLevel);
+ data << uint16(YesterdayHonorableKills);
}
if (changesMask[84])
{
- data << int32(ScalingPlayerLevelDelta);
+ data << uint32(LifetimeHonorableKills);
}
if (changesMask[85])
{
- data << int32(MaxCreatureScalingLevel);
+ data << int32(WatchedFactionIndex);
}
if (changesMask[86])
{
- data << int32(PetSpellPower);
+ data << int32(MaxLevel);
}
if (changesMask[87])
{
- data << float(UiHitModifier);
+ data << int32(ScalingPlayerLevelDelta);
}
if (changesMask[88])
{
- data << float(UiSpellHitModifier);
+ data << int32(MaxCreatureScalingLevel);
}
if (changesMask[89])
{
- data << int32(HomeRealmTimeOffset);
+ data << int32(PetSpellPower);
}
if (changesMask[90])
{
- data << float(ModPetHaste);
+ data << float(UiHitModifier);
}
if (changesMask[91])
{
- data << int8(JailersTowerLevelMax);
+ data << float(UiSpellHitModifier);
}
if (changesMask[92])
{
- data << int8(JailersTowerLevel);
+ data << int32(HomeRealmTimeOffset);
}
if (changesMask[93])
{
- data << uint8(LocalRegenFlags);
+ data << float(ModPetHaste);
}
if (changesMask[94])
{
- data << uint8(AuraVision);
+ data << int8(JailersTowerLevelMax);
}
if (changesMask[95])
{
- data << uint8(NumBackpackSlots);
+ data << int8(JailersTowerLevel);
}
if (changesMask[96])
{
- data << int32(OverrideSpellsID);
+ data << uint8(LocalRegenFlags);
}
if (changesMask[97])
{
- data << uint16(LootSpecID);
+ data << uint8(AuraVision);
}
}
if (changesMask[98])
{
if (changesMask[99])
{
- data << uint32(OverrideZonePVPType);
+ data << uint8(NumBackpackSlots);
}
if (changesMask[100])
{
- data << BnetAccount;
+ data << int32(OverrideSpellsID);
}
if (changesMask[101])
{
- data << uint64(GuildClubMemberID);
+ data << uint16(LootSpecID);
}
if (changesMask[102])
{
- data << int32(Honor);
+ data << uint32(OverrideZonePVPType);
}
if (changesMask[103])
{
- data << int32(HonorNextLevel);
+ data << BnetAccount;
}
if (changesMask[104])
{
- data << uint8(NumBankSlots);
+ data << uint64(GuildClubMemberID);
+ }
+ if (changesMask[105])
+ {
+ data << int32(Honor);
+ }
+ if (changesMask[106])
+ {
+ data << int32(HonorNextLevel);
}
if (changesMask[107])
{
+ data << uint8(NumBankSlots);
+ }
+ if (changesMask[110])
+ {
data << int32(UiChromieTimeExpansionID);
}
- if (changesMask[108])
+ if (changesMask[111])
{
data << int32(TransportServerTime);
}
- if (changesMask[109])
+ if (changesMask[112])
{
data << uint32(WeeklyRewardsPeriodSinceOrigin);
}
- if (changesMask[110])
+ if (changesMask[113])
{
data << int16(DEBUGSoulbindConduitRank);
}
+ if (changesMask[115])
+ {
+ data << uint32(ActiveCombatTraitConfigID);
+ }
}
if (changesMask[98])
{
data.WriteBits(QuestSession.has_value(), 1);
- if (changesMask[106])
+ if (changesMask[109])
{
Field_1410->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[105])
+ if (changesMask[108])
{
if (QuestSession.has_value())
{
QuestSession->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
- if (changesMask[111])
+ if (changesMask[114])
{
data << DungeonScore;
}
}
- if (changesMask[112])
+ if (changesMask[116])
{
- for (uint32 i = 0; i < 199; ++i)
+ for (uint32 i = 0; i < 218; ++i)
{
- if (changesMask[113 + i])
+ if (changesMask[117 + i])
{
data << InvSlots[i];
}
}
}
- if (changesMask[312])
+ if (changesMask[335])
{
for (uint32 i = 0; i < 240; ++i)
{
- if (changesMask[313 + i])
+ if (changesMask[336 + i])
{
data << uint64(ExploredZones[i]);
}
}
}
- if (changesMask[553])
+ if (changesMask[576])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[554 + i])
+ if (changesMask[577 + i])
{
RestInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
}
}
- if (changesMask[556])
+ if (changesMask[579])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[557 + i])
+ if (changesMask[580 + i])
{
data << int32(ModDamageDonePos[i]);
}
- if (changesMask[564 + i])
+ if (changesMask[587 + i])
{
data << int32(ModDamageDoneNeg[i]);
}
- if (changesMask[571 + i])
+ if (changesMask[594 + i])
{
data << float(ModDamageDonePercent[i]);
}
- if (changesMask[578 + i])
+ if (changesMask[601 + i])
{
data << float(ModHealingDonePercent[i]);
}
}
}
- if (changesMask[585])
+ if (changesMask[608])
{
for (uint32 i = 0; i < 3; ++i)
{
- if (changesMask[586 + i])
+ if (changesMask[609 + i])
{
data << float(WeaponDmgMultipliers[i]);
}
- if (changesMask[589 + i])
+ if (changesMask[612 + i])
{
data << float(WeaponAtkSpeedMultipliers[i]);
}
}
}
- if (changesMask[592])
+ if (changesMask[615])
{
for (uint32 i = 0; i < 12; ++i)
{
- if (changesMask[593 + i])
+ if (changesMask[616 + i])
{
data << uint32(BuybackPrice[i]);
}
- if (changesMask[605 + i])
+ if (changesMask[628 + i])
{
data << int64(BuybackTimestamp[i]);
}
}
}
- if (changesMask[617])
+ if (changesMask[640])
{
for (uint32 i = 0; i < 32; ++i)
{
- if (changesMask[618 + i])
+ if (changesMask[641 + i])
{
data << int32(CombatRatings[i]);
}
}
}
- if (changesMask[657])
+ if (changesMask[673])
{
for (uint32 i = 0; i < 4; ++i)
{
- if (changesMask[658 + i])
+ if (changesMask[674 + i])
{
data << uint32(NoReagentCostMask[i]);
}
}
}
- if (changesMask[662])
+ if (changesMask[678])
{
for (uint32 i = 0; i < 2; ++i)
{
- if (changesMask[663 + i])
+ if (changesMask[679 + i])
{
data << int32(ProfessionSkillLine[i]);
}
}
}
- if (changesMask[665])
+ if (changesMask[681])
{
- for (uint32 i = 0; i < 4; ++i)
+ for (uint32 i = 0; i < 5; ++i)
{
- if (changesMask[666 + i])
+ if (changesMask[682 + i])
{
data << uint32(BagSlotFlags[i]);
}
}
}
- if (changesMask[670])
+ if (changesMask[687])
{
for (uint32 i = 0; i < 7; ++i)
{
- if (changesMask[671 + i])
+ if (changesMask[688 + i])
{
data << uint32(BankBagSlotFlags[i]);
}
}
}
- if (changesMask[678])
+ if (changesMask[695])
{
for (uint32 i = 0; i < 875; ++i)
{
- if (changesMask[679 + i])
+ if (changesMask[696 + i])
{
data << uint64(QuestCompleted[i]);
}
}
}
- if (changesMask[650])
- {
- for (uint32 i = 0; i < 6; ++i)
- {
- if (changesMask[651 + i])
- {
- PvpInfo[i].WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
- }
- }
- }
data.FlushBits();
}
@@ -4147,7 +4777,10 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(RecipeProgression);
Base::ClearChangesMask(ReplayedQuests);
Base::ClearChangesMask(DisabledSpells);
+ Base::ClearChangesMask(PvpInfo);
Base::ClearChangesMask(CharacterRestrictions);
+ Base::ClearChangesMask(TraitConfigs);
+ Base::ClearChangesMask(CraftingOrders);
Base::ClearChangesMask(FarsightObject);
Base::ClearChangesMask(SummonedBattlePetGUID);
Base::ClearChangesMask(Coinage);
@@ -4228,6 +4861,7 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(WeeklyRewardsPeriodSinceOrigin);
Base::ClearChangesMask(DEBUGSoulbindConduitRank);
Base::ClearChangesMask(DungeonScore);
+ Base::ClearChangesMask(ActiveCombatTraitConfigID);
Base::ClearChangesMask(InvSlots);
Base::ClearChangesMask(ExploredZones);
Base::ClearChangesMask(RestInfo);
@@ -4240,7 +4874,6 @@ void ActivePlayerData::ClearChangesMask()
Base::ClearChangesMask(BuybackPrice);
Base::ClearChangesMask(BuybackTimestamp);
Base::ClearChangesMask(CombatRatings);
- Base::ClearChangesMask(PvpInfo);
Base::ClearChangesMask(NoReagentCostMask);
Base::ClearChangesMask(ProfessionSkillLine);
Base::ClearChangesMask(BagSlotFlags);
@@ -4278,10 +4911,18 @@ void GameObjectData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie
data << uint32(CustomParam);
data << int32(Level);
data << uint32(AnimGroupInstance);
+ data << uint32(UiWidgetItemID);
+ data << uint32(UiWidgetItemQuality);
+ data << uint32(UiWidgetItemUnknown1000);
+ data << uint32(WorldEffects.size());
for (uint32 i = 0; i < EnableDoodadSets.size(); ++i)
{
data << int32(EnableDoodadSets[i]);
}
+ for (uint32 i = 0; i < WorldEffects.size(); ++i)
+ {
+ data << int32(WorldEffects[i]);
+ }
}
void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const
@@ -4291,7 +4932,7 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fie
void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, GameObject const* owner, Player const* receiver) const
{
- data.WriteBits(changesMask.GetBlock(0), 21);
+ data.WriteBits(changesMask.GetBlock(0), 25);
if (changesMask[0])
{
@@ -4314,6 +4955,13 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool
else
WriteCompleteDynamicFieldUpdateMask(EnableDoodadSets.size(), data);
}
+ if (changesMask[3])
+ {
+ if (!ignoreNestedChangesMask)
+ WorldEffects.WriteUpdateMask(data);
+ else
+ WriteCompleteDynamicFieldUpdateMask(WorldEffects.size(), data);
+ }
}
data.FlushBits();
if (changesMask[0])
@@ -4330,79 +4978,101 @@ void GameObjectData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool
}
if (changesMask[3])
{
- data << int32(DisplayID);
+ for (uint32 i = 0; i < WorldEffects.size(); ++i)
+ {
+ if (WorldEffects.HasChanged(i) || ignoreNestedChangesMask)
+ {
+ data << int32(WorldEffects[i]);
+ }
+ }
}
if (changesMask[4])
{
- data << uint32(SpellVisualID);
+ data << int32(DisplayID);
}
if (changesMask[5])
{
- data << uint32(StateSpellVisualID);
+ data << uint32(SpellVisualID);
}
if (changesMask[6])
{
- data << uint32(SpawnTrackingStateAnimID);
+ data << uint32(StateSpellVisualID);
}
if (changesMask[7])
{
- data << uint32(SpawnTrackingStateAnimKitID);
+ data << uint32(SpawnTrackingStateAnimID);
}
if (changesMask[8])
{
- data << uint32(StateWorldEffectsQuestObjectiveID);
+ data << uint32(SpawnTrackingStateAnimKitID);
}
if (changesMask[9])
{
- data << CreatedBy;
+ data << uint32(StateWorldEffectsQuestObjectiveID);
}
if (changesMask[10])
{
- data << GuildGUID;
+ data << CreatedBy;
}
if (changesMask[11])
{
- data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
+ data << GuildGUID;
}
if (changesMask[12])
{
+ data << uint32(ViewerDependentValue<FlagsTag>::GetValue(this, owner, receiver));
+ }
+ if (changesMask[13])
+ {
data << float(ParentRotation->x);
data << float(ParentRotation->y);
data << float(ParentRotation->z);
data << float(ParentRotation->w);
}
- if (changesMask[13])
+ if (changesMask[14])
{
data << int32(FactionTemplate);
}
- if (changesMask[14])
+ if (changesMask[15])
{
data << int8(ViewerDependentValue<StateTag>::GetValue(this, owner, receiver));
}
- if (changesMask[15])
+ if (changesMask[16])
{
data << int8(TypeID);
}
- if (changesMask[16])
+ if (changesMask[17])
{
data << uint8(PercentHealth);
}
- if (changesMask[17])
+ if (changesMask[18])
{
data << uint32(ArtKit);
}
- if (changesMask[18])
+ if (changesMask[19])
{
data << uint32(CustomParam);
}
- if (changesMask[19])
+ if (changesMask[20])
{
data << int32(Level);
}
- if (changesMask[20])
+ if (changesMask[21])
{
data << uint32(AnimGroupInstance);
}
+ if (changesMask[22])
+ {
+ data << uint32(UiWidgetItemID);
+ }
+ if (changesMask[23])
+ {
+ data << uint32(UiWidgetItemQuality);
+ }
+ if (changesMask[24])
+ {
+ data << uint32(UiWidgetItemUnknown1000);
+ }
}
}
@@ -4410,6 +5080,7 @@ void GameObjectData::ClearChangesMask()
{
Base::ClearChangesMask(StateWorldEffectIDs);
Base::ClearChangesMask(EnableDoodadSets);
+ Base::ClearChangesMask(WorldEffects);
Base::ClearChangesMask(DisplayID);
Base::ClearChangesMask(SpellVisualID);
Base::ClearChangesMask(StateSpellVisualID);
@@ -4428,6 +5099,9 @@ void GameObjectData::ClearChangesMask()
Base::ClearChangesMask(CustomParam);
Base::ClearChangesMask(Level);
Base::ClearChangesMask(AnimGroupInstance);
+ Base::ClearChangesMask(UiWidgetItemID);
+ Base::ClearChangesMask(UiWidgetItemQuality);
+ Base::ClearChangesMask(UiWidgetItemUnknown1000);
_changesMask.ResetAll();
}
@@ -4746,6 +5420,7 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
data << uint32(TimeToTarget);
data << uint32(TimeToTargetScale);
data << uint32(TimeToTargetExtraScale);
+ data << uint32(Field_B0);
data << int32(SpellID);
data << int32(SpellForVisuals);
SpellVisual->WriteCreate(data, owner, receiver);
@@ -4755,7 +5430,11 @@ void AreaTriggerData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
data << uint32(Field_80);
data << uint32(Field_84);
data << Field_88;
+ data << Field_F8;
ExtraScaleCurve->WriteCreate(data, owner, receiver);
+ Field_C38->WriteCreate(data, owner, receiver);
+ Field_C54->WriteCreate(data, owner, receiver);
+ Field_C70->WriteCreate(data, owner, receiver);
VisualAnim->WriteCreate(data, owner, receiver);
}
@@ -4766,7 +5445,7 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fi
void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, bool ignoreNestedChangesMask, AreaTrigger const* owner, Player const* receiver) const
{
- data.WriteBits(changesMask.GetBlock(0), 18);
+ data.WriteBits(changesMask.GetBlock(0), 23);
data.FlushBits();
if (changesMask[0])
@@ -4775,67 +5454,87 @@ void AreaTriggerData::WriteUpdate(ByteBuffer& data, Mask const& changesMask, boo
{
OverrideScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[3])
+ if (changesMask[6])
{
data << Caster;
}
- if (changesMask[4])
+ if (changesMask[7])
{
data << uint32(Duration);
}
- if (changesMask[5])
+ if (changesMask[8])
{
data << uint32(TimeToTarget);
}
- if (changesMask[6])
+ if (changesMask[9])
{
data << uint32(TimeToTargetScale);
}
- if (changesMask[7])
+ if (changesMask[10])
{
data << uint32(TimeToTargetExtraScale);
}
- if (changesMask[8])
+ if (changesMask[11])
+ {
+ data << uint32(Field_B0);
+ }
+ if (changesMask[12])
{
data << int32(SpellID);
}
- if (changesMask[9])
+ if (changesMask[13])
{
data << int32(SpellForVisuals);
}
- if (changesMask[10])
+ if (changesMask[14])
{
SpellVisual->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[11])
+ if (changesMask[15])
{
data << float(BoundsRadius2D);
}
- if (changesMask[12])
+ if (changesMask[16])
{
data << uint32(DecalPropertiesID);
}
- if (changesMask[13])
+ if (changesMask[17])
{
data << CreatingEffectGUID;
}
- if (changesMask[14])
+ if (changesMask[18])
{
data << uint32(Field_80);
}
- if (changesMask[15])
+ if (changesMask[19])
{
data << uint32(Field_84);
}
- if (changesMask[16])
+ if (changesMask[20])
{
data << Field_88;
}
+ if (changesMask[21])
+ {
+ data << Field_F8;
+ }
if (changesMask[2])
{
ExtraScaleCurve->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
- if (changesMask[17])
+ if (changesMask[3])
+ {
+ Field_C38->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ if (changesMask[4])
+ {
+ Field_C54->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ if (changesMask[5])
+ {
+ Field_C70->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
+ }
+ if (changesMask[22])
{
VisualAnim->WriteUpdate(data, ignoreNestedChangesMask, owner, receiver);
}
@@ -4846,11 +5545,15 @@ void AreaTriggerData::ClearChangesMask()
{
Base::ClearChangesMask(OverrideScaleCurve);
Base::ClearChangesMask(ExtraScaleCurve);
+ Base::ClearChangesMask(Field_C38);
+ Base::ClearChangesMask(Field_C54);
+ Base::ClearChangesMask(Field_C70);
Base::ClearChangesMask(Caster);
Base::ClearChangesMask(Duration);
Base::ClearChangesMask(TimeToTarget);
Base::ClearChangesMask(TimeToTargetScale);
Base::ClearChangesMask(TimeToTargetExtraScale);
+ Base::ClearChangesMask(Field_B0);
Base::ClearChangesMask(SpellID);
Base::ClearChangesMask(SpellForVisuals);
Base::ClearChangesMask(SpellVisual);
@@ -4860,6 +5563,7 @@ void AreaTriggerData::ClearChangesMask()
Base::ClearChangesMask(Field_80);
Base::ClearChangesMask(Field_84);
Base::ClearChangesMask(Field_88);
+ Base::ClearChangesMask(Field_F8);
Base::ClearChangesMask(VisualAnim);
_changesMask.ResetAll();
}
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 1d6d1499df8..a075a11ab81 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -19,6 +19,7 @@
#define UpdateFields_h__
#include "EnumFlag.h"
+#include "ItemPacketsCommon.h"
#include "MythicPlusPacketsCommon.h"
#include "ObjectGuid.h"
#include "Position.h"
@@ -115,25 +116,25 @@ struct SocketedGem : public IsUpdateFieldStructureTag, public HasChangesMask<20>
struct ItemData : public IsUpdateFieldStructureTag, public HasChangesMask<41>
{
- UpdateField<std::vector<int32>, 0, 1> BonusListIDs;
- DynamicUpdateField<UF::ArtifactPower, 0, 2> ArtifactPowers;
- DynamicUpdateField<UF::SocketedGem, 0, 3> Gems;
- UpdateField<ObjectGuid, 0, 4> Owner;
- UpdateField<ObjectGuid, 0, 5> ContainedIn;
- UpdateField<ObjectGuid, 0, 6> Creator;
- UpdateField<ObjectGuid, 0, 7> GiftCreator;
- UpdateField<uint32, 0, 8> StackCount;
- UpdateField<uint32, 0, 9> Expiration;
- UpdateField<uint32, 0, 10> DynamicFlags;
- UpdateField<uint32, 0, 11> Durability;
- UpdateField<uint32, 0, 12> MaxDurability;
- UpdateField<uint32, 0, 13> CreatePlayedTime;
- UpdateField<int32, 0, 14> Context;
- UpdateField<int64, 0, 15> CreateTime;
- UpdateField<uint64, 0, 16> ArtifactXP;
- UpdateField<uint8, 0, 17> ItemAppearanceModID;
- UpdateField<UF::ItemModList, 0, 18> Modifiers;
- UpdateField<uint32, 0, 19> DynamicFlags2;
+ DynamicUpdateField<UF::ArtifactPower, 0, 1> ArtifactPowers;
+ DynamicUpdateField<UF::SocketedGem, 0, 2> Gems;
+ UpdateField<ObjectGuid, 0, 3> Owner;
+ UpdateField<ObjectGuid, 0, 4> ContainedIn;
+ UpdateField<ObjectGuid, 0, 5> Creator;
+ UpdateField<ObjectGuid, 0, 6> GiftCreator;
+ UpdateField<uint32, 0, 7> StackCount;
+ UpdateField<uint32, 0, 8> Expiration;
+ UpdateField<uint32, 0, 9> DynamicFlags;
+ UpdateField<uint32, 0, 10> Durability;
+ UpdateField<uint32, 0, 11> MaxDurability;
+ UpdateField<uint32, 0, 12> CreatePlayedTime;
+ UpdateField<int32, 0, 13> Context;
+ UpdateField<int64, 0, 14> CreateTime;
+ UpdateField<uint64, 0, 15> ArtifactXP;
+ UpdateField<uint8, 0, 16> ItemAppearanceModID;
+ UpdateField<UF::ItemModList, 0, 17> Modifiers;
+ UpdateField<uint32, 0, 18> DynamicFlags2;
+ UpdateField<WorldPackets::Item::ItemBonusKey, 0, 19> ItemBonusKey;
UpdateField<uint16, 0, 20> DEBUGItemLevel;
UpdateFieldArray<int32, 5, 21, 22> SpellCharges;
UpdateFieldArray<UF::ItemEnchantment, 13, 27, 28> Enchantment;
@@ -254,7 +255,7 @@ struct PassiveSpellHistory : public IsUpdateFieldStructureTag
bool operator!=(PassiveSpellHistory const& right) const { return !(*this == right); }
};
-struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<194>
+struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<196>
{
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
DynamicUpdateField<UF::PassiveSpellHistory, 0, 2> PassiveSpells;
@@ -279,119 +280,121 @@ struct UnitData : public IsUpdateFieldStructureTag, public HasChangesMask<194>
UpdateField<ObjectGuid, 0, 20> BattlePetCompanionGUID;
UpdateField<uint64, 0, 21> BattlePetDBID;
UpdateField<UF::UnitChannel, 0, 22> ChannelData;
- UpdateField<uint32, 0, 23> SummonedByHomeRealm;
- UpdateField<uint8, 0, 24> Race;
- UpdateField<uint8, 0, 25> ClassId;
- UpdateField<uint8, 0, 26> PlayerClassId;
- UpdateField<uint8, 0, 27> Sex;
- UpdateField<uint8, 0, 28> DisplayPower;
- UpdateField<uint32, 0, 29> OverrideDisplayPowerID;
- UpdateField<int64, 0, 30> Health;
- UpdateField<int64, 0, 31> MaxHealth;
- UpdateField<int32, 32, 33> Level;
- UpdateField<int32, 32, 34> EffectiveLevel;
- UpdateField<int32, 32, 35> ContentTuningID;
- UpdateField<int32, 32, 36> ScalingLevelMin;
- UpdateField<int32, 32, 37> ScalingLevelMax;
- UpdateField<int32, 32, 38> ScalingLevelDelta;
- UpdateField<int32, 32, 39> ScalingFactionGroup;
- UpdateField<int32, 32, 40> ScalingHealthItemLevelCurveID;
- UpdateField<int32, 32, 41> ScalingDamageItemLevelCurveID;
- UpdateField<int32, 32, 42> FactionTemplate;
+ UpdateField<int8, 0, 23> SpellEmpowerStage;
+ UpdateField<uint32, 0, 24> SummonedByHomeRealm;
+ UpdateField<uint8, 0, 25> Race;
+ UpdateField<uint8, 0, 26> ClassId;
+ UpdateField<uint8, 0, 27> PlayerClassId;
+ UpdateField<uint8, 0, 28> Sex;
+ UpdateField<uint8, 0, 29> DisplayPower;
+ UpdateField<uint32, 0, 30> OverrideDisplayPowerID;
+ UpdateField<int64, 0, 31> Health;
+ UpdateField<int64, 32, 33> MaxHealth;
+ UpdateField<int32, 32, 34> Level;
+ UpdateField<int32, 32, 35> EffectiveLevel;
+ UpdateField<int32, 32, 36> ContentTuningID;
+ UpdateField<int32, 32, 37> ScalingLevelMin;
+ UpdateField<int32, 32, 38> ScalingLevelMax;
+ UpdateField<int32, 32, 39> ScalingLevelDelta;
+ UpdateField<int32, 32, 40> ScalingFactionGroup;
+ UpdateField<int32, 32, 41> ScalingHealthItemLevelCurveID;
+ UpdateField<int32, 32, 42> ScalingDamageItemLevelCurveID;
+ UpdateField<int32, 32, 43> FactionTemplate;
struct FactionTemplateTag : ViewerDependentValueTag<int32> {};
- UpdateField<uint32, 32, 43> Flags;
+ UpdateField<uint32, 32, 44> Flags;
struct FlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 44> Flags2;
- UpdateField<uint32, 32, 45> Flags3;
+ UpdateField<uint32, 32, 45> Flags2;
+ UpdateField<uint32, 32, 46> Flags3;
struct Flags3Tag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 46> AuraState;
+ UpdateField<uint32, 32, 47> AuraState;
struct AuraStateTag : ViewerDependentValueTag<uint32> {};
- UpdateField<uint32, 32, 47> RangedAttackRoundBaseTime;
- UpdateField<float, 32, 48> BoundingRadius;
- UpdateField<float, 32, 49> CombatReach;
- UpdateField<float, 32, 50> DisplayScale;
- UpdateField<int32, 32, 51> CreatureFamily;
- UpdateField<int32, 32, 52> CreatureType;
- UpdateField<int32, 32, 53> NativeDisplayID;
- UpdateField<float, 32, 54> NativeXDisplayScale;
- UpdateField<int32, 32, 55> MountDisplayID;
- UpdateField<int32, 32, 56> CosmeticMountDisplayID;
- UpdateField<float, 32, 57> MinDamage;
- UpdateField<float, 32, 58> MaxDamage;
- UpdateField<float, 32, 59> MinOffHandDamage;
- UpdateField<float, 32, 60> MaxOffHandDamage;
- UpdateField<uint8, 32, 61> StandState;
- UpdateField<uint8, 32, 62> PetTalentPoints;
- UpdateField<uint8, 32, 63> VisFlags;
- UpdateField<uint8, 64, 65> AnimTier;
- UpdateField<uint32, 64, 66> PetNumber;
- UpdateField<uint32, 64, 67> PetNameTimestamp;
- UpdateField<uint32, 64, 68> PetExperience;
- UpdateField<uint32, 64, 69> PetNextLevelExperience;
- UpdateField<float, 64, 70> ModCastingSpeed;
- UpdateField<float, 64, 71> ModCastingSpeedNeg;
- UpdateField<float, 64, 72> ModSpellHaste;
- UpdateField<float, 64, 73> ModHaste;
- UpdateField<float, 64, 74> ModRangedHaste;
- UpdateField<float, 64, 75> ModHasteRegen;
- UpdateField<float, 64, 76> ModTimeRate;
- UpdateField<int32, 64, 77> CreatedBySpell;
- UpdateField<int32, 64, 78> EmoteState;
- UpdateField<int32, 64, 79> BaseMana;
- UpdateField<int32, 64, 80> BaseHealth;
- UpdateField<uint8, 64, 81> SheatheState;
- UpdateField<uint8, 64, 82> PvpFlags;
+ UpdateField<uint32, 32, 48> RangedAttackRoundBaseTime;
+ UpdateField<float, 32, 49> BoundingRadius;
+ UpdateField<float, 32, 50> CombatReach;
+ UpdateField<float, 32, 51> DisplayScale;
+ UpdateField<int32, 32, 52> CreatureFamily;
+ UpdateField<int32, 32, 53> CreatureType;
+ UpdateField<int32, 32, 54> NativeDisplayID;
+ UpdateField<float, 32, 55> NativeXDisplayScale;
+ UpdateField<int32, 32, 56> MountDisplayID;
+ UpdateField<int32, 32, 57> CosmeticMountDisplayID;
+ UpdateField<float, 32, 58> MinDamage;
+ UpdateField<float, 32, 59> MaxDamage;
+ UpdateField<float, 32, 60> MinOffHandDamage;
+ UpdateField<float, 32, 61> MaxOffHandDamage;
+ UpdateField<uint8, 32, 62> StandState;
+ UpdateField<uint8, 32, 63> PetTalentPoints;
+ UpdateField<uint8, 64, 65> VisFlags;
+ UpdateField<uint8, 64, 66> AnimTier;
+ UpdateField<uint32, 64, 67> PetNumber;
+ UpdateField<uint32, 64, 68> PetNameTimestamp;
+ UpdateField<uint32, 64, 69> PetExperience;
+ UpdateField<uint32, 64, 70> PetNextLevelExperience;
+ UpdateField<float, 64, 71> ModCastingSpeed;
+ UpdateField<float, 64, 72> ModCastingSpeedNeg;
+ UpdateField<float, 64, 73> ModSpellHaste;
+ UpdateField<float, 64, 74> ModHaste;
+ UpdateField<float, 64, 75> ModRangedHaste;
+ UpdateField<float, 64, 76> ModHasteRegen;
+ UpdateField<float, 64, 77> ModTimeRate;
+ UpdateField<int32, 64, 78> CreatedBySpell;
+ UpdateField<int32, 64, 79> EmoteState;
+ UpdateField<int32, 64, 80> BaseMana;
+ UpdateField<int32, 64, 81> BaseHealth;
+ UpdateField<uint8, 64, 82> SheatheState;
+ UpdateField<uint8, 64, 83> PvpFlags;
struct PvpFlagsTag : ViewerDependentValueTag<uint8> {};
- UpdateField<uint8, 64, 83> PetFlags;
- UpdateField<uint8, 64, 84> ShapeshiftForm;
- UpdateField<int32, 64, 85> AttackPower;
- UpdateField<int32, 64, 86> AttackPowerModPos;
- UpdateField<int32, 64, 87> AttackPowerModNeg;
- UpdateField<float, 64, 88> AttackPowerMultiplier;
- UpdateField<int32, 64, 89> RangedAttackPower;
- UpdateField<int32, 64, 90> RangedAttackPowerModPos;
- UpdateField<int32, 64, 91> RangedAttackPowerModNeg;
- UpdateField<float, 64, 92> RangedAttackPowerMultiplier;
- UpdateField<int32, 64, 93> MainHandWeaponAttackPower;
- UpdateField<int32, 64, 94> OffHandWeaponAttackPower;
- UpdateField<int32, 64, 95> RangedWeaponAttackPower;
- UpdateField<int32, 96, 97> SetAttackSpeedAura;
- UpdateField<float, 96, 98> Lifesteal;
- UpdateField<float, 96, 99> MinRangedDamage;
- UpdateField<float, 96, 100> MaxRangedDamage;
- UpdateField<float, 96, 101> ManaCostMultiplier;
- UpdateField<float, 96, 102> MaxHealthModifier;
- UpdateField<float, 96, 103> HoverHeight;
- UpdateField<int32, 96, 104> MinItemLevelCutoff;
- UpdateField<int32, 96, 105> MinItemLevel;
- UpdateField<int32, 96, 106> MaxItemLevel;
- UpdateField<int32, 96, 107> AzeriteItemLevel;
- UpdateField<int32, 96, 108> WildBattlePetLevel;
- UpdateField<int32, 96, 109> BattlePetCompanionExperience;
- UpdateField<uint32, 96, 110> BattlePetCompanionNameTimestamp;
- UpdateField<int32, 96, 111> InteractSpellID;
- UpdateField<int32, 96, 112> ScaleDuration;
- UpdateField<int32, 96, 113> LooksLikeMountID;
- UpdateField<int32, 96, 114> LooksLikeCreatureID;
- UpdateField<int32, 96, 115> LookAtControllerID;
- UpdateField<int32, 96, 116> TaxiNodesID;
- UpdateField<ObjectGuid, 96, 117> GuildGUID;
- UpdateField<uint32, 96, 118> SilencedSchoolMask;
- UpdateField<ObjectGuid, 96, 119> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
- UpdateFieldArray<uint32, 2, 120, 121> NpcFlags;
+ UpdateField<uint8, 64, 84> PetFlags;
+ UpdateField<uint8, 64, 85> ShapeshiftForm;
+ UpdateField<int32, 64, 86> AttackPower;
+ UpdateField<int32, 64, 87> AttackPowerModPos;
+ UpdateField<int32, 64, 88> AttackPowerModNeg;
+ UpdateField<float, 64, 89> AttackPowerMultiplier;
+ UpdateField<int32, 64, 90> RangedAttackPower;
+ UpdateField<int32, 64, 91> RangedAttackPowerModPos;
+ UpdateField<int32, 64, 92> RangedAttackPowerModNeg;
+ UpdateField<float, 64, 93> RangedAttackPowerMultiplier;
+ UpdateField<int32, 64, 94> MainHandWeaponAttackPower;
+ UpdateField<int32, 64, 95> OffHandWeaponAttackPower;
+ UpdateField<int32, 96, 97> RangedWeaponAttackPower;
+ UpdateField<int32, 96, 98> SetAttackSpeedAura;
+ UpdateField<float, 96, 99> Lifesteal;
+ UpdateField<float, 96, 100> MinRangedDamage;
+ UpdateField<float, 96, 101> MaxRangedDamage;
+ UpdateField<float, 96, 102> ManaCostMultiplier;
+ UpdateField<float, 96, 103> MaxHealthModifier;
+ UpdateField<float, 96, 104> HoverHeight;
+ UpdateField<int32, 96, 105> MinItemLevelCutoff;
+ UpdateField<int32, 96, 106> MinItemLevel;
+ UpdateField<int32, 96, 107> MaxItemLevel;
+ UpdateField<int32, 96, 108> AzeriteItemLevel;
+ UpdateField<int32, 96, 109> WildBattlePetLevel;
+ UpdateField<int32, 96, 110> BattlePetCompanionExperience;
+ UpdateField<uint32, 96, 111> BattlePetCompanionNameTimestamp;
+ UpdateField<int32, 96, 112> InteractSpellID;
+ UpdateField<int32, 96, 113> ScaleDuration;
+ UpdateField<int32, 96, 114> LooksLikeMountID;
+ UpdateField<int32, 96, 115> LooksLikeCreatureID;
+ UpdateField<int32, 96, 116> LookAtControllerID;
+ UpdateField<int32, 96, 117> TaxiNodesID;
+ UpdateField<ObjectGuid, 96, 118> GuildGUID;
+ UpdateField<int32, 96, 119> FlightCapabilityID;
+ UpdateField<uint32, 96, 120> SilencedSchoolMask;
+ UpdateField<ObjectGuid, 96, 121> NameplateAttachToGUID; // When set, nameplate of this unit will instead appear on that object
+ UpdateFieldArray<uint32, 2, 122, 123> NpcFlags;
struct NpcFlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateFieldArray<int32, 7, 123, 124> Power;
- UpdateFieldArray<int32, 7, 123, 131> MaxPower;
- UpdateFieldArray<float, 7, 123, 138> PowerRegenFlatModifier;
- UpdateFieldArray<float, 7, 123, 145> PowerRegenInterruptedFlatModifier;
- UpdateFieldArray<UF::VisibleItem, 3, 152, 153> VirtualItems;
- UpdateFieldArray<uint32, 2, 156, 157> AttackRoundBaseTime;
- UpdateFieldArray<int32, 4, 159, 160> Stats;
- UpdateFieldArray<int32, 4, 159, 164> StatPosBuff;
- UpdateFieldArray<int32, 4, 159, 168> StatNegBuff;
- UpdateFieldArray<int32, 7, 172, 173> Resistances;
- UpdateFieldArray<int32, 7, 172, 180> BonusResistanceMods;
- UpdateFieldArray<int32, 7, 172, 187> ManaCostModifier;
+ UpdateFieldArray<int32, 7, 125, 126> Power;
+ UpdateFieldArray<int32, 7, 125, 133> MaxPower;
+ UpdateFieldArray<float, 7, 125, 140> PowerRegenFlatModifier;
+ UpdateFieldArray<float, 7, 125, 147> PowerRegenInterruptedFlatModifier;
+ UpdateFieldArray<UF::VisibleItem, 3, 154, 155> VirtualItems;
+ UpdateFieldArray<uint32, 2, 158, 159> AttackRoundBaseTime;
+ UpdateFieldArray<int32, 4, 161, 162> Stats;
+ UpdateFieldArray<int32, 4, 161, 166> StatPosBuff;
+ UpdateFieldArray<int32, 4, 161, 170> StatNegBuff;
+ UpdateFieldArray<int32, 7, 174, 175> Resistances;
+ UpdateFieldArray<int32, 7, 174, 182> BonusResistanceMods;
+ UpdateFieldArray<int32, 7, 174, 189> ManaCostModifier;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Unit const* owner, Player const* receiver) const;
@@ -453,44 +456,46 @@ struct CTROptions : public IsUpdateFieldStructureTag
bool operator!=(CTROptions const& right) const { return !(*this == right); }
};
-struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<188>
+struct PlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<190>
{
UpdateField<bool, 0, 1> HasQuestSession;
UpdateField<bool, 0, 2> HasLevelLink;
DynamicUpdateField<UF::ChrCustomizationChoice, 0, 3> Customizations;
DynamicUpdateField<UF::QuestLog, 0, 4> QuestSessionQuestLog;
DynamicUpdateField<UF::ArenaCooldown, 0, 5> ArenaCooldowns;
- UpdateField<ObjectGuid, 0, 6> DuelArbiter;
- UpdateField<ObjectGuid, 0, 7> WowAccount;
- UpdateField<ObjectGuid, 0, 8> LootTargetGUID;
- UpdateField<uint32, 0, 9> PlayerFlags;
- UpdateField<uint32, 0, 10> PlayerFlagsEx;
- UpdateField<uint32, 0, 11> GuildRankID;
- UpdateField<uint32, 0, 12> GuildDeleteDate;
- UpdateField<int32, 0, 13> GuildLevel;
- UpdateField<uint8, 0, 14> PartyType;
- UpdateField<uint8, 0, 15> NativeSex;
- UpdateField<uint8, 0, 16> Inebriation;
- UpdateField<uint8, 0, 17> PvpTitle;
- UpdateField<uint8, 0, 18> ArenaFaction;
- UpdateField<uint32, 0, 19> DuelTeam;
- UpdateField<int32, 0, 20> GuildTimeStamp;
- UpdateField<int32, 0, 21> PlayerTitle;
- UpdateField<int32, 0, 22> FakeInebriation;
- UpdateField<uint32, 0, 23> VirtualPlayerRealm;
- UpdateField<uint32, 0, 24> CurrentSpecID;
- UpdateField<int32, 0, 25> TaxiMountAnimKitID;
- UpdateField<uint8, 0, 26> CurrentBattlePetBreedQuality;
- UpdateField<int32, 0, 27> HonorLevel;
- UpdateField<int32, 0, 28> Field_B0;
- UpdateField<int32, 0, 29> Field_B4;
- UpdateField<UF::CTROptions, 0, 30> CtrOptions;
- UpdateField<int32, 0, 31> CovenantID;
- UpdateField<int32, 32, 33> SoulbindID;
- UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 34> DungeonScore;
- UpdateFieldArray<UF::QuestLog, 125, 35, 36> QuestLog;
- UpdateFieldArray<UF::VisibleItem, 19, 161, 162> VisibleItems;
- UpdateFieldArray<float, 6, 181, 182> AvgItemLevel;
+ DynamicUpdateField<int32, 0, 6> VisualItemReplacements;
+ UpdateField<ObjectGuid, 0, 7> DuelArbiter;
+ UpdateField<ObjectGuid, 0, 8> WowAccount;
+ UpdateField<ObjectGuid, 0, 9> LootTargetGUID;
+ UpdateField<uint32, 0, 10> PlayerFlags;
+ UpdateField<uint32, 0, 11> PlayerFlagsEx;
+ UpdateField<uint32, 0, 12> GuildRankID;
+ UpdateField<uint32, 0, 13> GuildDeleteDate;
+ UpdateField<int32, 0, 14> GuildLevel;
+ UpdateField<uint8, 0, 15> PartyType;
+ UpdateField<uint8, 0, 16> NativeSex;
+ UpdateField<uint8, 0, 17> Inebriation;
+ UpdateField<uint8, 0, 18> PvpTitle;
+ UpdateField<uint8, 0, 19> ArenaFaction;
+ UpdateField<uint32, 0, 20> DuelTeam;
+ UpdateField<int32, 0, 21> GuildTimeStamp;
+ UpdateField<int32, 0, 22> PlayerTitle;
+ UpdateField<int32, 0, 23> FakeInebriation;
+ UpdateField<uint32, 0, 24> VirtualPlayerRealm;
+ UpdateField<uint32, 0, 25> CurrentSpecID;
+ UpdateField<int32, 0, 26> TaxiMountAnimKitID;
+ UpdateField<uint8, 0, 27> CurrentBattlePetBreedQuality;
+ UpdateField<int32, 0, 28> HonorLevel;
+ UpdateField<int64, 0, 29> LogoutTime;
+ UpdateField<int32, 0, 30> Field_B0;
+ UpdateField<int32, 0, 31> Field_B4;
+ UpdateField<UF::CTROptions, 32, 33> CtrOptions;
+ UpdateField<int32, 32, 34> CovenantID;
+ UpdateField<int32, 32, 35> SoulbindID;
+ UpdateField<WorldPackets::MythicPlus::DungeonScoreSummary, 32, 36> DungeonScore;
+ UpdateFieldArray<UF::QuestLog, 125, 37, 38> QuestLog;
+ UpdateFieldArray<UF::VisibleItem, 19, 163, 164> VisibleItems;
+ UpdateFieldArray<float, 6, 183, 184> AvgItemLevel;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
@@ -526,20 +531,26 @@ struct RestInfo : public IsUpdateFieldStructureTag, public HasChangesMask<3>
void ClearChangesMask();
};
-struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<13>
+struct PVPInfo : public IsUpdateFieldStructureTag, public HasChangesMask<19>
{
UpdateField<bool, 0, 1> Disqualified;
- UpdateField<uint32, 0, 2> WeeklyPlayed;
- UpdateField<uint32, 0, 3> WeeklyWon;
- UpdateField<uint32, 0, 4> SeasonPlayed;
- UpdateField<uint32, 0, 5> SeasonWon;
- UpdateField<uint32, 0, 6> Rating;
- UpdateField<uint32, 0, 7> WeeklyBestRating;
- UpdateField<uint32, 0, 8> SeasonBestRating;
- UpdateField<uint32, 0, 9> PvpTierID;
- UpdateField<uint32, 0, 10> WeeklyBestWinPvpTierID;
- UpdateField<uint32, 0, 11> Field_28;
- UpdateField<uint32, 0, 12> Field_2C;
+ UpdateField<int8, 0, 2> Bracket;
+ UpdateField<int32, 0, 3> PvpRatingID;
+ UpdateField<uint32, 0, 4> WeeklyPlayed;
+ UpdateField<uint32, 0, 5> WeeklyWon;
+ UpdateField<uint32, 0, 6> SeasonPlayed;
+ UpdateField<uint32, 0, 7> SeasonWon;
+ UpdateField<uint32, 0, 8> Rating;
+ UpdateField<uint32, 0, 9> WeeklyBestRating;
+ UpdateField<uint32, 0, 10> SeasonBestRating;
+ UpdateField<uint32, 0, 11> PvpTierID;
+ UpdateField<uint32, 0, 12> WeeklyBestWinPvpTierID;
+ UpdateField<uint32, 0, 13> Field_28;
+ UpdateField<uint32, 0, 14> Field_2C;
+ UpdateField<uint32, 0, 15> WeeklyRoundsPlayed;
+ UpdateField<uint32, 0, 16> WeeklyRoundsWon;
+ UpdateField<uint32, 0, 17> SeasonRoundsPlayed;
+ UpdateField<uint32, 0, 18> SeasonRoundsWon;
void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
@@ -656,133 +667,220 @@ struct ReplayedQuest : public IsUpdateFieldStructureTag, public HasChangesMask<3
void ClearChangesMask();
};
-struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1554>
+struct TraitEntry : public IsUpdateFieldStructureTag
+{
+ int32 TraitNodeID;
+ int32 TraitNodeEntryID;
+ int32 Rank;
+ int32 GrantedRanks;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ bool operator==(TraitEntry const& right) const;
+ bool operator!=(TraitEntry const& right) const { return !(*this == right); }
+};
+
+struct TraitConfig : public IsUpdateFieldStructureTag, public HasChangesMask<12>
+{
+ DynamicUpdateField<UF::TraitEntry, 0, 1> Entries;
+ UpdateField<int32, 0, 2> ID;
+ UpdateField<std::string, 0, 3> Name;
+ UpdateField<int32, 4, 5> Type;
+ UpdateField<int32, 4, 6> SkillLineID;
+ UpdateField<int32, 4, 7> ChrSpecializationID;
+ UpdateField<int32, 8, 9> CombatConfigFlags;
+ UpdateField<int32, 8, 10> LocalIdentifier;
+ UpdateField<int32, 8, 11> TraitSystemID;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct CraftingOrderItem : public IsUpdateFieldStructureTag, public HasChangesMask<7>
+{
+ UpdateField<uint64, -1, 0> Field_0;
+ UpdateField<ObjectGuid, -1, 1> ItemGUID;
+ UpdateField<ObjectGuid, -1, 2> OwnerGUID;
+ UpdateField<int32, -1, 3> ItemID;
+ UpdateField<uint32, -1, 4> Quantity;
+ UpdateField<int32, -1, 5> ReagentQuality;
+ OptionalUpdateField<uint8, -1, 6> DataSlotIndex;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct CraftingOrderData : public IsUpdateFieldStructureTag, public HasChangesMask<24>
+{
+ DynamicUpdateField<UF::CraftingOrderItem, 0, 1> Reagents;
+ UpdateField<int32, 0, 2> Field_0;
+ UpdateField<uint64, 0, 3> OrderID;
+ UpdateField<int32, 0, 4> SkillLineAbilityID;
+ UpdateField<uint8, 5, 6> OrderState;
+ UpdateField<uint8, 5, 7> OrderType;
+ UpdateField<uint8, 5, 8> MinQuality;
+ UpdateField<int64, 5, 9> ExpirationTime;
+ UpdateField<int64, 10, 11> ClaimEndTime;
+ UpdateField<int64, 10, 12> TipAmount;
+ UpdateField<int64, 10, 13> ConsortiumCut;
+ UpdateField<uint32, 10, 14> Flags;
+ UpdateField<ObjectGuid, 15, 16> CustomerGUID;
+ UpdateField<ObjectGuid, 15, 17> CustomerAccountGUID;
+ UpdateField<ObjectGuid, 15, 18> CrafterGUID;
+ UpdateField<ObjectGuid, 15, 19> PersonalCrafterGUID;
+ UpdateField<std::string, 20, 21> CustomerNotes;
+ OptionalUpdateField<UF::CraftingOrderItem, 20, 22> OutputItem;
+ OptionalUpdateField<WorldPackets::Item::ItemInstance, 20, 23> OutputItemData;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct CraftingOrder : public IsUpdateFieldStructureTag, public HasChangesMask<4>
+{
+ DynamicUpdateField<WorldPackets::Item::ItemEnchantData, -1, 0> Enchantments;
+ DynamicUpdateField<WorldPackets::Item::ItemGemData, -1, 1> Gems;
+ UpdateField<UF::CraftingOrderData, -1, 2> Data;
+ OptionalUpdateField<WorldPackets::Item::ItemInstance, -1, 3> RecraftItemInfo;
+
+ void WriteCreate(ByteBuffer& data, Player const* owner, Player const* receiver) const;
+ void WriteUpdate(ByteBuffer& data, bool ignoreChangesMask, Player const* owner, Player const* receiver) const;
+ void ClearChangesMask();
+};
+
+struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMask<1571>
{
UpdateField<bool, 0, 1> BackpackAutoSortDisabled;
UpdateField<bool, 0, 2> BankAutoSortDisabled;
UpdateField<bool, 0, 3> SortBagsRightToLeft;
UpdateField<bool, 0, 4> InsertItemsLeftToRight;
- UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 27, 28> Research;
+ UpdateFieldArray<DynamicUpdateFieldBase<UF::Research>, 1, 30, 31> Research;
DynamicUpdateField<uint64, 0, 5> KnownTitles;
- DynamicUpdateField<uint16, 0, 6> ResearchSites;
- DynamicUpdateField<uint32, 0, 7> ResearchSiteProgress;
- DynamicUpdateField<int32, 0, 8> DailyQuestsCompleted;
- DynamicUpdateField<int32, 0, 9> AvailableQuestLineXQuestIDs;
- DynamicUpdateField<int32, 0, 10> Heirlooms;
- DynamicUpdateField<uint32, 0, 11> HeirloomFlags;
- DynamicUpdateField<int32, 0, 12> Toys;
- DynamicUpdateField<uint32, 0, 13> ToyFlags;
- DynamicUpdateField<uint32, 0, 14> Transmog;
- DynamicUpdateField<int32, 0, 15> ConditionalTransmog;
- DynamicUpdateField<int32, 0, 16> SelfResSpells;
- DynamicUpdateField<uint32, 0, 17> RuneforgePowers;
- DynamicUpdateField<uint32, 0, 18> TransmogIllusions;
- DynamicUpdateField<UF::SpellPctModByLabel, 0, 20> SpellPctModByLabel;
- DynamicUpdateField<UF::SpellFlatModByLabel, 0, 21> SpellFlatModByLabel;
- DynamicUpdateField<UF::MawPower, 0, 22> MawPowers;
- DynamicUpdateField<UF::MultiFloorExplore, 0, 23> MultiFloorExploration;
- DynamicUpdateField<UF::RecipeProgressionInfo, 0, 24> RecipeProgression;
- DynamicUpdateField<UF::ReplayedQuest, 0, 25> ReplayedQuests;
- DynamicUpdateField<int32, 0, 26> DisabledSpells;
- DynamicUpdateField<UF::CharacterRestriction, 0, 19> CharacterRestrictions;
- UpdateField<ObjectGuid, 0, 29> FarsightObject;
- UpdateField<ObjectGuid, 0, 30> SummonedBattlePetGUID;
- UpdateField<uint64, 0, 31> Coinage;
- UpdateField<int32, 0, 32> XP;
- UpdateField<int32, 0, 33> NextLevelXP;
- UpdateField<int32, 34, 35> TrialXP;
- UpdateField<UF::SkillInfo, 34, 36> Skill;
- UpdateField<int32, 34, 37> CharacterPoints;
- UpdateField<int32, 34, 38> MaxTalentTiers;
- UpdateField<uint32, 34, 39> TrackCreatureMask;
- UpdateField<float, 34, 40> MainhandExpertise;
- UpdateField<float, 34, 41> OffhandExpertise;
- UpdateField<float, 34, 42> RangedExpertise;
- UpdateField<float, 34, 43> CombatRatingExpertise;
- UpdateField<float, 34, 44> BlockPercentage;
- UpdateField<float, 34, 45> DodgePercentage;
- UpdateField<float, 34, 46> DodgePercentageFromAttribute;
- UpdateField<float, 34, 47> ParryPercentage;
- UpdateField<float, 34, 48> ParryPercentageFromAttribute;
- UpdateField<float, 34, 49> CritPercentage;
- UpdateField<float, 34, 50> RangedCritPercentage;
- UpdateField<float, 34, 51> OffhandCritPercentage;
- UpdateField<float, 34, 52> SpellCritPercentage;
- UpdateField<int32, 34, 53> ShieldBlock;
- UpdateField<float, 34, 54> ShieldBlockCritPercentage;
- UpdateField<float, 34, 55> Mastery;
- UpdateField<float, 34, 56> Speed;
- UpdateField<float, 34, 57> Avoidance;
- UpdateField<float, 34, 58> Sturdiness;
- UpdateField<int32, 34, 59> Versatility;
- UpdateField<float, 34, 60> VersatilityBonus;
- UpdateField<float, 34, 61> PvpPowerDamage;
- UpdateField<float, 34, 62> PvpPowerHealing;
- UpdateField<int32, 34, 63> ModHealingDonePos;
- UpdateField<float, 34, 64> ModHealingPercent;
- UpdateField<float, 34, 65> ModPeriodicHealingDonePercent;
- UpdateField<float, 66, 67> ModSpellPowerPercent;
- UpdateField<float, 66, 68> ModResiliencePercent;
- UpdateField<float, 66, 69> OverrideSpellPowerByAPPercent;
- UpdateField<float, 66, 70> OverrideAPBySpellPowerPercent;
- UpdateField<int32, 66, 71> ModTargetResistance;
- UpdateField<int32, 66, 72> ModTargetPhysicalResistance;
- UpdateField<uint32, 66, 73> LocalFlags;
- UpdateField<uint8, 66, 74> GrantableLevels;
- UpdateField<uint8, 66, 75> MultiActionBars;
- UpdateField<uint8, 66, 76> LifetimeMaxRank;
- UpdateField<uint8, 66, 77> NumRespecs;
- UpdateField<uint32, 66, 78> PvpMedals;
- UpdateField<uint16, 66, 79> TodayHonorableKills;
- UpdateField<uint16, 66, 80> YesterdayHonorableKills;
- UpdateField<uint32, 66, 81> LifetimeHonorableKills;
- UpdateField<int32, 66, 82> WatchedFactionIndex;
- UpdateField<int32, 66, 83> MaxLevel;
- UpdateField<int32, 66, 84> ScalingPlayerLevelDelta;
- UpdateField<int32, 66, 85> MaxCreatureScalingLevel;
- UpdateField<int32, 66, 86> PetSpellPower;
- UpdateField<float, 66, 87> UiHitModifier;
- UpdateField<float, 66, 88> UiSpellHitModifier;
- UpdateField<int32, 66, 89> HomeRealmTimeOffset;
- UpdateField<float, 66, 90> ModPetHaste;
- UpdateField<int8, 66, 91> JailersTowerLevelMax;
- UpdateField<int8, 66, 92> JailersTowerLevel;
- UpdateField<uint8, 66, 93> LocalRegenFlags;
- UpdateField<uint8, 66, 94> AuraVision;
- UpdateField<uint8, 66, 95> NumBackpackSlots;
- UpdateField<int32, 66, 96> OverrideSpellsID;
- UpdateField<uint16, 66, 97> LootSpecID;
- UpdateField<uint32, 98, 99> OverrideZonePVPType;
- UpdateField<ObjectGuid, 98, 100> BnetAccount;
- UpdateField<uint64, 98, 101> GuildClubMemberID;
- UpdateField<int32, 98, 102> Honor;
- UpdateField<int32, 98, 103> HonorNextLevel;
- UpdateField<uint8, 98, 104> NumBankSlots;
- UpdateField<UF::ActivePlayerUnk901, 98, 106> Field_1410;
- OptionalUpdateField<UF::QuestSession, 98, 105> QuestSession;
- UpdateField<int32, 98, 107> UiChromieTimeExpansionID;
- UpdateField<int32, 98, 108> TransportServerTime;
- UpdateField<uint32, 98, 109> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
- UpdateField<int16, 98, 110> DEBUGSoulbindConduitRank;
- UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 111> DungeonScore;
- UpdateFieldArray<ObjectGuid, 199, 112, 113> InvSlots;
- UpdateFieldArray<uint64, 240, 312, 313> ExploredZones;
- UpdateFieldArray<UF::RestInfo, 2, 553, 554> RestInfo;
- UpdateFieldArray<int32, 7, 556, 557> ModDamageDonePos;
- UpdateFieldArray<int32, 7, 556, 564> ModDamageDoneNeg;
- UpdateFieldArray<float, 7, 556, 571> ModDamageDonePercent;
- UpdateFieldArray<float, 7, 556, 578> ModHealingDonePercent;
- UpdateFieldArray<float, 3, 585, 586> WeaponDmgMultipliers;
- UpdateFieldArray<float, 3, 585, 589> WeaponAtkSpeedMultipliers;
- UpdateFieldArray<uint32, 12, 592, 593> BuybackPrice;
- UpdateFieldArray<int64, 12, 592, 605> BuybackTimestamp;
- UpdateFieldArray<int32, 32, 617, 618> CombatRatings;
- UpdateFieldArray<UF::PVPInfo, 6, 650, 651> PvpInfo;
- UpdateFieldArray<uint32, 4, 657, 658> NoReagentCostMask;
- UpdateFieldArray<int32, 2, 662, 663> ProfessionSkillLine;
- UpdateFieldArray<uint32, 4, 665, 666> BagSlotFlags;
- UpdateFieldArray<uint32, 7, 670, 671> BankBagSlotFlags;
- UpdateFieldArray<uint64, 875, 678, 679> QuestCompleted;
+ DynamicUpdateField<uint16, 0, 7> ResearchSites;
+ DynamicUpdateField<uint32, 0, 8> ResearchSiteProgress;
+ DynamicUpdateField<int32, 0, 9> DailyQuestsCompleted;
+ DynamicUpdateField<int32, 0, 10> AvailableQuestLineXQuestIDs;
+ DynamicUpdateField<int32, 0, 11> Heirlooms;
+ DynamicUpdateField<uint32, 0, 12> HeirloomFlags;
+ DynamicUpdateField<int32, 0, 13> Toys;
+ DynamicUpdateField<uint32, 0, 14> ToyFlags;
+ DynamicUpdateField<uint32, 0, 15> Transmog;
+ DynamicUpdateField<int32, 0, 16> ConditionalTransmog;
+ DynamicUpdateField<int32, 0, 17> SelfResSpells;
+ DynamicUpdateField<uint32, 0, 18> RuneforgePowers;
+ DynamicUpdateField<uint32, 0, 19> TransmogIllusions;
+ DynamicUpdateField<UF::SpellPctModByLabel, 0, 21> SpellPctModByLabel;
+ DynamicUpdateField<UF::SpellFlatModByLabel, 0, 22> SpellFlatModByLabel;
+ DynamicUpdateField<UF::MawPower, 0, 23> MawPowers;
+ DynamicUpdateField<UF::MultiFloorExplore, 0, 24> MultiFloorExploration;
+ DynamicUpdateField<UF::RecipeProgressionInfo, 0, 25> RecipeProgression;
+ DynamicUpdateField<UF::ReplayedQuest, 0, 26> ReplayedQuests;
+ DynamicUpdateField<int32, 0, 27> DisabledSpells;
+ DynamicUpdateField<UF::PVPInfo, 0, 6> PvpInfo;
+ DynamicUpdateField<UF::CharacterRestriction, 0, 20> CharacterRestrictions;
+ DynamicUpdateField<UF::TraitConfig, 0, 28> TraitConfigs;
+ DynamicUpdateField<UF::CraftingOrder, 0, 29> CraftingOrders;
+ UpdateField<ObjectGuid, 0, 32> FarsightObject;
+ UpdateField<ObjectGuid, 0, 33> SummonedBattlePetGUID;
+ UpdateField<uint64, 34, 35> Coinage;
+ UpdateField<int32, 34, 36> XP;
+ UpdateField<int32, 34, 37> NextLevelXP;
+ UpdateField<int32, 34, 38> TrialXP;
+ UpdateField<UF::SkillInfo, 34, 39> Skill;
+ UpdateField<int32, 34, 40> CharacterPoints;
+ UpdateField<int32, 34, 41> MaxTalentTiers;
+ UpdateField<uint32, 34, 42> TrackCreatureMask;
+ UpdateField<float, 34, 43> MainhandExpertise;
+ UpdateField<float, 34, 44> OffhandExpertise;
+ UpdateField<float, 34, 45> RangedExpertise;
+ UpdateField<float, 34, 46> CombatRatingExpertise;
+ UpdateField<float, 34, 47> BlockPercentage;
+ UpdateField<float, 34, 48> DodgePercentage;
+ UpdateField<float, 34, 49> DodgePercentageFromAttribute;
+ UpdateField<float, 34, 50> ParryPercentage;
+ UpdateField<float, 34, 51> ParryPercentageFromAttribute;
+ UpdateField<float, 34, 52> CritPercentage;
+ UpdateField<float, 34, 53> RangedCritPercentage;
+ UpdateField<float, 34, 54> OffhandCritPercentage;
+ UpdateField<float, 34, 55> SpellCritPercentage;
+ UpdateField<int32, 34, 56> ShieldBlock;
+ UpdateField<float, 34, 57> ShieldBlockCritPercentage;
+ UpdateField<float, 34, 58> Mastery;
+ UpdateField<float, 34, 59> Speed;
+ UpdateField<float, 34, 60> Avoidance;
+ UpdateField<float, 34, 61> Sturdiness;
+ UpdateField<int32, 34, 62> Versatility;
+ UpdateField<float, 34, 63> VersatilityBonus;
+ UpdateField<float, 34, 64> PvpPowerDamage;
+ UpdateField<float, 34, 65> PvpPowerHealing;
+ UpdateField<int32, 66, 67> ModHealingDonePos;
+ UpdateField<float, 66, 68> ModHealingPercent;
+ UpdateField<float, 66, 69> ModPeriodicHealingDonePercent;
+ UpdateField<float, 66, 70> ModSpellPowerPercent;
+ UpdateField<float, 66, 71> ModResiliencePercent;
+ UpdateField<float, 66, 72> OverrideSpellPowerByAPPercent;
+ UpdateField<float, 66, 73> OverrideAPBySpellPowerPercent;
+ UpdateField<int32, 66, 74> ModTargetResistance;
+ UpdateField<int32, 66, 75> ModTargetPhysicalResistance;
+ UpdateField<uint32, 66, 76> LocalFlags;
+ UpdateField<uint8, 66, 77> GrantableLevels;
+ UpdateField<uint8, 66, 78> MultiActionBars;
+ UpdateField<uint8, 66, 79> LifetimeMaxRank;
+ UpdateField<uint8, 66, 80> NumRespecs;
+ UpdateField<uint32, 66, 81> PvpMedals;
+ UpdateField<uint16, 66, 82> TodayHonorableKills;
+ UpdateField<uint16, 66, 83> YesterdayHonorableKills;
+ UpdateField<uint32, 66, 84> LifetimeHonorableKills;
+ UpdateField<int32, 66, 85> WatchedFactionIndex;
+ UpdateField<int32, 66, 86> MaxLevel;
+ UpdateField<int32, 66, 87> ScalingPlayerLevelDelta;
+ UpdateField<int32, 66, 88> MaxCreatureScalingLevel;
+ UpdateField<int32, 66, 89> PetSpellPower;
+ UpdateField<float, 66, 90> UiHitModifier;
+ UpdateField<float, 66, 91> UiSpellHitModifier;
+ UpdateField<int32, 66, 92> HomeRealmTimeOffset;
+ UpdateField<float, 66, 93> ModPetHaste;
+ UpdateField<int8, 66, 94> JailersTowerLevelMax;
+ UpdateField<int8, 66, 95> JailersTowerLevel;
+ UpdateField<uint8, 66, 96> LocalRegenFlags;
+ UpdateField<uint8, 66, 97> AuraVision;
+ UpdateField<uint8, 98, 99> NumBackpackSlots;
+ UpdateField<int32, 98, 100> OverrideSpellsID;
+ UpdateField<uint16, 98, 101> LootSpecID;
+ UpdateField<uint32, 98, 102> OverrideZonePVPType;
+ UpdateField<ObjectGuid, 98, 103> BnetAccount;
+ UpdateField<uint64, 98, 104> GuildClubMemberID;
+ UpdateField<int32, 98, 105> Honor;
+ UpdateField<int32, 98, 106> HonorNextLevel;
+ UpdateField<uint8, 98, 107> NumBankSlots;
+ UpdateField<UF::ActivePlayerUnk901, 98, 109> Field_1410;
+ OptionalUpdateField<UF::QuestSession, 98, 108> QuestSession;
+ UpdateField<int32, 98, 110> UiChromieTimeExpansionID;
+ UpdateField<int32, 98, 111> TransportServerTime;
+ UpdateField<uint32, 98, 112> WeeklyRewardsPeriodSinceOrigin; // week count since Cfg_RegionsEntry::ChallengeOrigin
+ UpdateField<int16, 98, 113> DEBUGSoulbindConduitRank;
+ UpdateField<WorldPackets::MythicPlus::DungeonScoreData, 98, 114> DungeonScore;
+ UpdateField<uint32, 98, 115> ActiveCombatTraitConfigID;
+ UpdateFieldArray<ObjectGuid, 218, 116, 117> InvSlots;
+ UpdateFieldArray<uint64, 240, 335, 336> ExploredZones;
+ UpdateFieldArray<UF::RestInfo, 2, 576, 577> RestInfo;
+ UpdateFieldArray<int32, 7, 579, 580> ModDamageDonePos;
+ UpdateFieldArray<int32, 7, 579, 587> ModDamageDoneNeg;
+ UpdateFieldArray<float, 7, 579, 594> ModDamageDonePercent;
+ UpdateFieldArray<float, 7, 579, 601> ModHealingDonePercent;
+ UpdateFieldArray<float, 3, 608, 609> WeaponDmgMultipliers;
+ UpdateFieldArray<float, 3, 608, 612> WeaponAtkSpeedMultipliers;
+ UpdateFieldArray<uint32, 12, 615, 616> BuybackPrice;
+ UpdateFieldArray<int64, 12, 615, 628> BuybackTimestamp;
+ UpdateFieldArray<int32, 32, 640, 641> CombatRatings;
+ UpdateFieldArray<uint32, 4, 673, 674> NoReagentCostMask;
+ UpdateFieldArray<int32, 2, 678, 679> ProfessionSkillLine;
+ UpdateFieldArray<uint32, 5, 681, 682> BagSlotFlags;
+ UpdateFieldArray<uint32, 7, 687, 688> BankBagSlotFlags;
+ UpdateFieldArray<uint64, 875, 695, 696> QuestCompleted;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, Player const* owner, Player const* receiver) const;
@@ -790,30 +888,34 @@ struct ActivePlayerData : public IsUpdateFieldStructureTag, public HasChangesMas
void ClearChangesMask();
};
-struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<21>
+struct GameObjectData : public IsUpdateFieldStructureTag, public HasChangesMask<25>
{
UpdateField<std::vector<uint32>, 0, 1> StateWorldEffectIDs;
DynamicUpdateField<int32, 0, 2> EnableDoodadSets;
- UpdateField<int32, 0, 3> DisplayID;
- UpdateField<uint32, 0, 4> SpellVisualID;
- UpdateField<uint32, 0, 5> StateSpellVisualID;
- UpdateField<uint32, 0, 6> SpawnTrackingStateAnimID;
- UpdateField<uint32, 0, 7> SpawnTrackingStateAnimKitID;
- UpdateField<uint32, 0, 8> StateWorldEffectsQuestObjectiveID;
- UpdateField<ObjectGuid, 0, 9> CreatedBy;
- UpdateField<ObjectGuid, 0, 10> GuildGUID;
- UpdateField<uint32, 0, 11> Flags;
+ DynamicUpdateField<int32, 0, 3> WorldEffects;
+ UpdateField<int32, 0, 4> DisplayID;
+ UpdateField<uint32, 0, 5> SpellVisualID;
+ UpdateField<uint32, 0, 6> StateSpellVisualID;
+ UpdateField<uint32, 0, 7> SpawnTrackingStateAnimID;
+ UpdateField<uint32, 0, 8> SpawnTrackingStateAnimKitID;
+ UpdateField<uint32, 0, 9> StateWorldEffectsQuestObjectiveID;
+ UpdateField<ObjectGuid, 0, 10> CreatedBy;
+ UpdateField<ObjectGuid, 0, 11> GuildGUID;
+ UpdateField<uint32, 0, 12> Flags;
struct FlagsTag : ViewerDependentValueTag<uint32> {};
- UpdateField<QuaternionData, 0, 12> ParentRotation;
- UpdateField<int32, 0, 13> FactionTemplate;
- UpdateField<int8, 0, 14> State;
+ UpdateField<QuaternionData, 0, 13> ParentRotation;
+ UpdateField<int32, 0, 14> FactionTemplate;
+ UpdateField<int8, 0, 15> State;
struct StateTag : ViewerDependentValueTag<int8> {};
- UpdateField<int8, 0, 15> TypeID;
- UpdateField<uint8, 0, 16> PercentHealth;
- UpdateField<uint32, 0, 17> ArtKit;
- UpdateField<uint32, 0, 18> CustomParam;
- UpdateField<int32, 0, 19> Level;
- UpdateField<uint32, 0, 20> AnimGroupInstance;
+ UpdateField<int8, 0, 16> TypeID;
+ UpdateField<uint8, 0, 17> PercentHealth;
+ UpdateField<uint32, 0, 18> ArtKit;
+ UpdateField<uint32, 0, 19> CustomParam;
+ UpdateField<int32, 0, 20> Level;
+ UpdateField<uint32, 0, 21> AnimGroupInstance;
+ UpdateField<uint32, 0, 22> UiWidgetItemID;
+ UpdateField<uint32, 0, 23> UiWidgetItemQuality;
+ UpdateField<uint32, 0, 24> UiWidgetItemUnknown1000;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, GameObject const* owner, Player const* receiver) const;
@@ -882,25 +984,30 @@ struct VisualAnim : public IsUpdateFieldStructureTag, public HasChangesMask<5>
void ClearChangesMask();
};
-struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<18>
+struct AreaTriggerData : public IsUpdateFieldStructureTag, public HasChangesMask<23>
{
UpdateField<UF::ScaleCurve, 0, 1> OverrideScaleCurve;
UpdateField<UF::ScaleCurve, 0, 2> ExtraScaleCurve;
- UpdateField<ObjectGuid, 0, 3> Caster;
- UpdateField<uint32, 0, 4> Duration;
- UpdateField<uint32, 0, 5> TimeToTarget;
- UpdateField<uint32, 0, 6> TimeToTargetScale;
- UpdateField<uint32, 0, 7> TimeToTargetExtraScale;
- UpdateField<int32, 0, 8> SpellID;
- UpdateField<int32, 0, 9> SpellForVisuals;
- UpdateField<UF::SpellCastVisual, 0, 10> SpellVisual;
- UpdateField<float, 0, 11> BoundsRadius2D;
- UpdateField<uint32, 0, 12> DecalPropertiesID;
- UpdateField<ObjectGuid, 0, 13> CreatingEffectGUID;
- UpdateField<uint32, 0, 14> Field_80;
- UpdateField<uint32, 0, 15> Field_84;
- UpdateField<ObjectGuid, 0, 16> Field_88;
- UpdateField<UF::VisualAnim, 0, 17> VisualAnim;
+ UpdateField<UF::ScaleCurve, 0, 3> Field_C38;
+ UpdateField<UF::ScaleCurve, 0, 4> Field_C54;
+ UpdateField<UF::ScaleCurve, 0, 5> Field_C70;
+ UpdateField<ObjectGuid, 0, 6> Caster;
+ UpdateField<uint32, 0, 7> Duration;
+ UpdateField<uint32, 0, 8> TimeToTarget;
+ UpdateField<uint32, 0, 9> TimeToTargetScale;
+ UpdateField<uint32, 0, 10> TimeToTargetExtraScale;
+ UpdateField<uint32, 0, 11> Field_B0;
+ UpdateField<int32, 0, 12> SpellID;
+ UpdateField<int32, 0, 13> SpellForVisuals;
+ UpdateField<UF::SpellCastVisual, 0, 14> SpellVisual;
+ UpdateField<float, 0, 15> BoundsRadius2D;
+ UpdateField<uint32, 0, 16> DecalPropertiesID;
+ UpdateField<ObjectGuid, 0, 17> CreatingEffectGUID;
+ UpdateField<uint32, 0, 18> Field_80;
+ UpdateField<uint32, 0, 19> Field_84;
+ UpdateField<ObjectGuid, 0, 20> Field_88;
+ UpdateField<TaggedPosition<Position::XYZ>, 0, 21> Field_F8;
+ UpdateField<UF::VisualAnim, 0, 22> VisualAnim;
void WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const;
void WriteUpdate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVisibilityFlags, AreaTrigger const* owner, Player const* receiver) const;
diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp
index 296b03b6720..17603908065 100644
--- a/src/server/game/Entities/Player/CollectionMgr.cpp
+++ b/src/server/game/Entities/Player/CollectionMgr.cpp
@@ -322,9 +322,9 @@ void CollectionMgr::CheckHeirloomUpgrades(Item* item)
return;
}
- auto const& bonusListIDs = item->m_itemData->BonusListIDs;
+ std::vector<int32> const& bonusListIDs = item->GetBonusListIDs();
- for (uint32 bonusId : *bonusListIDs)
+ for (uint32 bonusId : bonusListIDs)
{
if (bonusId != itr->second.bonusId)
{
@@ -333,7 +333,7 @@ void CollectionMgr::CheckHeirloomUpgrades(Item* item)
}
}
- if (std::find(bonusListIDs->begin(), bonusListIDs->end(), int32(itr->second.bonusId)) == bonusListIDs->end())
+ if (std::find(bonusListIDs.begin(), bonusListIDs.end(), int32(itr->second.bonusId)) == bonusListIDs.end())
item->AddBonuses(itr->second.bonusId);
}
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 90a414e6ad7..e2cdadfb468 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -537,7 +537,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
// original items
for (PlayerCreateInfoItem initialItem : info->item)
- StoreNewItemInBestSlots(initialItem.item_id, initialItem.item_amount);
+ StoreNewItemInBestSlots(initialItem.item_id, initialItem.item_amount, info->itemContext);
// bags and main-hand weapon must equipped at this moment
// now second pass for not equipped (offhand weapon/shield if it attempt equipped before main-hand weapon)
@@ -581,46 +581,45 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac
return true;
}
-bool Player::StoreNewItemInBestSlots(uint32 titem_id, uint32 titem_amount)
+bool Player::StoreNewItemInBestSlots(uint32 itemId, uint32 amount, ItemContext context)
{
TC_LOG_DEBUG("entities.player.items", "Player::StoreNewItemInBestSlots: Player '%s' (%s) creates initial item (ItemID: %u, Count: %u)",
- GetName().c_str(), GetGUID().ToString().c_str(), titem_id, titem_amount);
+ GetName().c_str(), GetGUID().ToString().c_str(), itemId, amount);
- ItemContext itemContext = ItemContext::New_Character;
std::vector<int32> bonusListIDs;
- std::set<uint32> contextBonuses = sDB2Manager.GetDefaultItemBonusTree(titem_id, itemContext);
+ std::set<uint32> contextBonuses = sDB2Manager.GetDefaultItemBonusTree(itemId, context);
bonusListIDs.insert(bonusListIDs.begin(), contextBonuses.begin(), contextBonuses.end());
// attempt equip by one
- while (titem_amount > 0)
+ while (amount > 0)
{
uint16 eDest;
- InventoryResult msg = CanEquipNewItem(NULL_SLOT, eDest, titem_id, false);
+ InventoryResult msg = CanEquipNewItem(NULL_SLOT, eDest, itemId, false);
if (msg != EQUIP_ERR_OK)
break;
- Item* item = EquipNewItem(eDest, titem_id, itemContext, true);
+ Item* item = EquipNewItem(eDest, itemId, context, true);
item->SetBonuses(bonusListIDs);
AutoUnequipOffhandIfNeed();
- --titem_amount;
+ --amount;
}
- if (titem_amount == 0)
+ if (amount == 0)
return true; // equipped
// attempt store
ItemPosCountVec sDest;
// store in main bag to simplify second pass (special bags can be not equipped yet at this moment)
- InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, titem_id, titem_amount);
+ InventoryResult msg = CanStoreNewItem(INVENTORY_SLOT_BAG_0, NULL_SLOT, sDest, itemId, amount);
if (msg == EQUIP_ERR_OK)
{
- StoreNewItem(sDest, titem_id, true, GenerateItemRandomBonusListId(titem_id), GuidSet(), itemContext, bonusListIDs);
+ StoreNewItem(sDest, itemId, true, GenerateItemRandomBonusListId(itemId), GuidSet(), context, bonusListIDs);
return true; // stored
}
// item can't be added
TC_LOG_ERROR("entities.player.items", "Player::StoreNewItemInBestSlots: Player '%s' (%s) can't equip or store initial item (ItemID: %u, Race: %u, Class: %u, InventoryResult: %u)",
- GetName().c_str(), GetGUID().ToString().c_str(), titem_id, GetRace(), GetClass(), msg);
+ GetName().c_str(), GetGUID().ToString().c_str(), itemId, GetRace(), GetClass(), msg);
return false;
}
@@ -2292,7 +2291,6 @@ void Player::GiveXP(uint32 xp, Unit* victim, float group_rate)
packet.Reason = victim ? LOG_XP_REASON_KILL : LOG_XP_REASON_NO_KILL;
packet.Amount = xp;
packet.GroupBonus = group_rate;
- packet.ReferAFriendBonusType = recruitAFriend ? 1 : 0;
SendDirectMessage(packet.Write());
uint32 nextLvlXP = GetXPForNextLevel();
@@ -3182,10 +3180,11 @@ void Player::LearnSpell(uint32 spell_id, bool dependent, int32 fromSkill /*= 0*/
// prevent duplicated entires in spell book, also not send if not in world (loading)
if (learning && IsInWorld())
{
- WorldPackets::Spells::LearnedSpells packet;
- packet.SpellID.push_back(spell_id);
- packet.SuppressMessaging = suppressMessaging;
- SendDirectMessage(packet.Write());
+ WorldPackets::Spells::LearnedSpells learnedSpells;
+ WorldPackets::Spells::LearnedSpellInfo& learnedSpellInfo = learnedSpells.ClientLearnedSpellData.emplace_back();
+ learnedSpellInfo.SpellID = spell_id;
+ learnedSpells.SuppressMessaging = suppressMessaging;
+ SendDirectMessage(learnedSpells.Write());
}
// learn all disabled higher ranks and required spells (recursive)
@@ -3519,23 +3518,7 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
{
if (target == this)
{
- for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
- {
- if (m_items[i] == nullptr)
- continue;
-
- m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
- }
-
- for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
- {
- if (m_items[i] == nullptr)
- continue;
-
- m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
- }
-
- for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
+ for (uint8 i = EQUIPMENT_SLOT_START; i < BANK_SLOT_BAG_END; ++i)
{
if (m_items[i] == nullptr)
continue;
@@ -3543,7 +3526,7 @@ void Player::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c
m_items[i]->BuildCreateUpdateBlockForPlayer(data, target);
}
- for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = REAGENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
{
if (m_items[i] == nullptr)
continue;
@@ -3684,7 +3667,7 @@ void Player::DestroyForPlayer(Player* target) const
if (target == this)
{
- for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = EQUIPMENT_SLOT_START; i < BANK_SLOT_BAG_END; ++i)
{
if (m_items[i] == nullptr)
continue;
@@ -3692,23 +3675,7 @@ void Player::DestroyForPlayer(Player* target) const
m_items[i]->DestroyForPlayer(target);
}
- for (uint8 i = INVENTORY_SLOT_BAG_START; i < BANK_SLOT_BAG_END; ++i)
- {
- if (m_items[i] == nullptr)
- continue;
-
- m_items[i]->DestroyForPlayer(target);
- }
-
- for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
- {
- if (m_items[i] == nullptr)
- continue;
-
- m_items[i]->DestroyForPlayer(target);
- }
-
- for (uint8 i = CHILD_EQUIPMENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = REAGENT_SLOT_START; i < CHILD_EQUIPMENT_SLOT_END; ++i)
{
if (m_items[i] == nullptr)
continue;
@@ -4493,7 +4460,7 @@ Corpse* Player::CreateCorpse()
corpse->SetDisplayId(GetNativeDisplayId());
corpse->SetFactionTemplate(sChrRacesStore.AssertEntry(GetRace())->FactionID);
- for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++)
+ for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; i++)
{
if (m_items[i])
{
@@ -8211,8 +8178,9 @@ void Player::ApplyArtifactPowerRank(Item* artifact, ArtifactPowerRankEntry const
{
AddTemporarySpell(artifactPowerRank->SpellID);
WorldPackets::Spells::LearnedSpells learnedSpells;
+ WorldPackets::Spells::LearnedSpellInfo& learnedSpellInfo = learnedSpells.ClientLearnedSpellData.emplace_back();
+ learnedSpellInfo.SpellID = artifactPowerRank->SpellID;
learnedSpells.SuppressMessaging = true;
- learnedSpells.SpellID.push_back(artifactPowerRank->SpellID);
SendDirectMessage(learnedSpells.Write());
}
else if (!apply)
@@ -8898,8 +8866,11 @@ void Player::SendInitWorldStates(uint32 zoneId, uint32 areaId)
void Player::SetBindPoint(ObjectGuid guid) const
{
- WorldPackets::Misc::BinderConfirm packet(guid);
- SendDirectMessage(packet.Write());
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = guid;
+ npcInteraction.InteractionType = PlayerInteractionType::Binder;
+ npcInteraction.Success = true;
+ SendDirectMessage(npcInteraction.Write());
}
void Player::SendRespecWipeConfirm(ObjectGuid const& guid, uint32 cost, SpecResetType respecType) const
@@ -9064,10 +9035,16 @@ uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location /
uint32 freeSlotCount = 0;
if (location.HasFlag(ItemSearchLocation::Equipment))
+ {
for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
++freeSlotCount;
+ for (uint8 i = PROFESSION_SLOT_START; i < PROFESSION_SLOT_END; ++i)
+ if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
+ ++freeSlotCount;
+ }
+
if (location.HasFlag(ItemSearchLocation::Inventory))
{
uint8 inventoryEnd = INVENTORY_SLOT_ITEM_START + GetInventorySlotCount();
@@ -9096,9 +9073,17 @@ uint32 Player::GetFreeInventorySlotCount(EnumFlag<ItemSearchLocation> location /
}
if (location.HasFlag(ItemSearchLocation::ReagentBank))
+ {
+ for (uint8 i = REAGENT_BAG_SLOT_START; i < REAGENT_BAG_SLOT_END; ++i)
+ if (Bag* bag = GetBagByPos(i))
+ for (uint32 j = 0; j < GetBagSize(bag); ++j)
+ if (!GetItemInBag(bag, j))
+ ++freeSlotCount;
+
for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
if (!GetItemByPos(INVENTORY_SLOT_BAG_0, i))
++freeSlotCount;
+ }
return freeSlotCount;
}
@@ -9233,7 +9218,8 @@ Item* Player::GetUseableItemByPos(uint8 bag, uint8 slot) const
Bag* Player::GetBagByPos(uint8 bag) const
{
if ((bag >= INVENTORY_SLOT_BAG_START && bag < INVENTORY_SLOT_BAG_END)
- || (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END))
+ || (bag >= BANK_SLOT_BAG_START && bag < BANK_SLOT_BAG_END)
+ || (bag >= REAGENT_BAG_SLOT_START && bag < REAGENT_BAG_SLOT_END))
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, bag))
return item->ToBag();
return nullptr;
@@ -9355,8 +9341,12 @@ bool Player::IsEquipmentPos(uint8 bag, uint8 slot)
{
if (bag == INVENTORY_SLOT_BAG_0 && (slot < EQUIPMENT_SLOT_END))
return true;
+ if (bag == INVENTORY_SLOT_BAG_0 && (slot >= PROFESSION_SLOT_START && slot < PROFESSION_SLOT_END))
+ return true;
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= INVENTORY_SLOT_BAG_START && slot < INVENTORY_SLOT_BAG_END))
return true;
+ if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_BAG_SLOT_START && slot < REAGENT_BAG_SLOT_END))
+ return true;
return false;
}
@@ -9388,6 +9378,8 @@ bool Player::IsBagPos(uint16 pos)
return true;
if (bag == INVENTORY_SLOT_BAG_0 && (slot >= BANK_SLOT_BAG_START && slot < BANK_SLOT_BAG_END))
return true;
+ if (bag == INVENTORY_SLOT_BAG_0 && (slot >= REAGENT_BAG_SLOT_START && slot < REAGENT_BAG_SLOT_END))
+ return true;
return false;
}
@@ -9412,10 +9404,18 @@ bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const
if (slot < EQUIPMENT_SLOT_END)
return true;
+ // profession equipment
+ if (slot >= PROFESSION_SLOT_START && slot < PROFESSION_SLOT_END)
+ return true;
+
// bag equip slots
if (slot >= INVENTORY_SLOT_BAG_START && slot < INVENTORY_SLOT_BAG_END)
return true;
+ // reagent bag equip slots
+ if (slot >= REAGENT_BAG_SLOT_START && slot < REAGENT_BAG_SLOT_END)
+ return true;
+
// backpack slots
if (slot >= INVENTORY_SLOT_ITEM_START && slot < INVENTORY_SLOT_ITEM_START + GetInventorySlotCount())
return true;
@@ -11663,7 +11663,7 @@ void Player::RemoveItem(uint8 bag, uint8 slot, bool update)
pItem->RemoveItemFlag2(ITEM_FIELD_FLAG2_EQUIPPED);
// remove item dependent auras and casts (only weapon and armor slots)
- if (slot < EQUIPMENT_SLOT_END)
+ if (slot < PROFESSION_SLOT_END)
{
// update expertise
if (slot == EQUIPMENT_SLOT_MAINHAND)
@@ -13648,7 +13648,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQues
{
switch (gossipMenuItem.OptionNpc)
{
- case GossipOptionNpc::TaxiNode:
+ case GossipOptionNpc::Taxinode:
if (GetSession()->SendLearnNewTaxiNode(creature))
return;
break;
@@ -13656,7 +13656,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQues
if (!isDead())
canTalk = false;
break;
- case GossipOptionNpc::BattleMaster:
+ case GossipOptionNpc::Battlemaster:
if (!creature->isCanInteractWithBattleMaster(this, false))
canTalk = false;
break;
@@ -13666,7 +13666,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQues
if (!creature->CanResetTalents(this))
canTalk = false;
break;
- case GossipOptionNpc::StableMaster:
+ case GossipOptionNpc::Stablemaster:
case GossipOptionNpc::PetSpecializationMaster:
if (GetClass() != CLASS_HUNTER)
canTalk = false;
@@ -13695,29 +13695,29 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQues
canTalk = false; // Deprecated
break;
case GossipOptionNpc::GuildBanker:
- case GossipOptionNpc::SpellClick:
- case GossipOptionNpc::WorldPVPQueue:
+ case GossipOptionNpc::Spellclick:
+ case GossipOptionNpc::WorldPvPQueue:
case GossipOptionNpc::LFGDungeon:
case GossipOptionNpc::ArtifactRespec:
case GossipOptionNpc::QueueScenario:
case GossipOptionNpc::GarrisonArchitect:
- case GossipOptionNpc::GarrisonMission:
+ case GossipOptionNpc::GarrisonMissionNpc:
case GossipOptionNpc::ShipmentCrafter:
- case GossipOptionNpc::GarrisonTradeskill:
+ case GossipOptionNpc::GarrisonTradeskillNpc:
case GossipOptionNpc::GarrisonRecruitment:
case GossipOptionNpc::AdventureMap:
case GossipOptionNpc::GarrisonTalent:
case GossipOptionNpc::ContributionCollector:
- case GossipOptionNpc::IslandsMission:
+ case GossipOptionNpc::IslandsMissionNpc:
case GossipOptionNpc::UIItemInteraction:
case GossipOptionNpc::WorldMap:
case GossipOptionNpc::Soulbind:
- case GossipOptionNpc::ChromieTime:
- case GossipOptionNpc::CovenantPreview:
+ case GossipOptionNpc::ChromieTimeNpc:
+ case GossipOptionNpc::CovenantPreviewNpc:
case GossipOptionNpc::RuneforgeLegendaryCrafting:
case GossipOptionNpc::NewPlayerGuide:
case GossipOptionNpc::RuneforgeLegendaryUpgrade:
- case GossipOptionNpc::CovenantRenown:
+ case GossipOptionNpc::CovenantRenownNpc:
break; // NYI
default:
TC_LOG_ERROR("sql.sql", "Creature entry %u has an unknown gossip option icon %u for menu %u.", creature->GetEntry(), AsUnderlyingType(gossipMenuItem.OptionNpc), gossipMenuItem.MenuID);
@@ -13740,42 +13740,7 @@ void Player::PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQues
}
if (canTalk)
- {
- std::string strOptionText, strBoxText;
- BroadcastTextEntry const* optionBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuItem.OptionBroadcastTextID);
- BroadcastTextEntry const* boxBroadcastText = sBroadcastTextStore.LookupEntry(gossipMenuItem.BoxBroadcastTextID);
- LocaleConstant locale = GetSession()->GetSessionDbLocaleIndex();
-
- if (optionBroadcastText)
- strOptionText = DB2Manager::GetBroadcastTextValue(optionBroadcastText, locale, GetGender());
- else
- strOptionText = gossipMenuItem.OptionText;
-
- if (boxBroadcastText)
- strBoxText = DB2Manager::GetBroadcastTextValue(boxBroadcastText, locale, GetGender());
- else
- strBoxText = gossipMenuItem.BoxText;
-
- if (locale != DEFAULT_LOCALE)
- {
- if (!optionBroadcastText)
- {
- /// Find localizations from database.
- if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, gossipMenuItem.OptionID))
- ObjectMgr::GetLocaleString(gossipMenuLocale->OptionText, locale, strOptionText);
- }
-
- if (!boxBroadcastText)
- {
- /// Find localizations from database.
- if (GossipMenuItemsLocale const* gossipMenuLocale = sObjectMgr->GetGossipMenuItemsLocale(menuId, gossipMenuItem.OptionID))
- ObjectMgr::GetLocaleString(gossipMenuLocale->BoxText, locale, strBoxText);
- }
- }
-
- menu->GetGossipMenu().AddMenuItem(gossipMenuItem.OptionID, gossipMenuItem.OptionNpc, strOptionText, 0, AsUnderlyingType(gossipMenuItem.OptionNpc), strBoxText, gossipMenuItem.BoxMoney, gossipMenuItem.BoxCoded);
- menu->GetGossipMenu().AddGossipMenuItemData(gossipMenuItem.OptionID, gossipMenuItem.ActionMenuID, gossipMenuItem.ActionPoiID);
- }
+ menu->GetGossipMenu().AddMenuItem(gossipMenuItem, gossipMenuItem.MenuID, gossipMenuItem.OrderIndex);
}
}
@@ -13804,7 +13769,7 @@ void Player::SendPreparedGossip(WorldObject* source)
PlayerTalkClass->SendGossipMenu(textId, source->GetGUID());
}
-void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 menuId)
+void Player::OnGossipSelect(WorldObject* source, int32 gossipOptionId, uint32 menuId)
{
GossipMenu& gossipMenu = PlayerTalkClass->GetGossipMenu();
@@ -13812,7 +13777,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
if (menuId != gossipMenu.GetMenuId())
return;
- GossipMenuItem const* item = gossipMenu.GetItem(gossipListId);
+ GossipMenuItem const* item = gossipMenu.GetItem(gossipOptionId);
if (!item)
return;
@@ -13829,10 +13794,6 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
}
}
- GossipMenuItemData const* menuItemData = gossipMenu.GetItemData(gossipListId);
- if (!menuItemData)
- return;
-
int64 cost = int64(item->BoxMoney);
if (!HasEnoughMoney(cost))
{
@@ -13841,51 +13802,37 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
return;
}
- switch (gossipOptionNpc)
- {
- case GossipOptionNpc::None:
- {
- if (menuItemData->GossipActionPoi)
- PlayerTalkClass->SendPointOfInterest(menuItemData->GossipActionPoi);
+ if (item->ActionPoiID)
+ PlayerTalkClass->SendPointOfInterest(item->ActionPoiID);
- if (menuItemData->GossipActionMenuId)
- {
- PrepareGossipMenu(source, menuItemData->GossipActionMenuId);
- SendPreparedGossip(source);
- }
+ if (item->ActionMenuID)
+ {
+ PrepareGossipMenu(source, item->ActionMenuID);
+ SendPreparedGossip(source);
+ }
- break;
- }
+ // types that have their dedicated open opcode dont send WorldPackets::NPC::GossipOptionNPCInteraction
+ bool handled = true;
+ switch (gossipOptionNpc)
+ {
case GossipOptionNpc::Vendor:
GetSession()->SendListInventory(guid);
break;
- case GossipOptionNpc::TaxiNode:
+ case GossipOptionNpc::Taxinode:
GetSession()->SendTaxiMenu(source->ToCreature());
break;
case GossipOptionNpc::Trainer:
- GetSession()->SendTrainerList(source->ToCreature(), sObjectMgr->GetCreatureTrainerForGossipOption(source->GetEntry(), menuId, gossipListId));
+ GetSession()->SendTrainerList(source->ToCreature(), sObjectMgr->GetCreatureTrainerForGossipOption(source->GetEntry(), menuId, gossipOptionId));
break;
case GossipOptionNpc::SpiritHealer:
- if (isDead())
- source->ToCreature()->CastSpell(source->ToCreature(), 17251, CastSpellExtraArgs(TRIGGERED_FULL_MASK)
- .SetOriginalCaster(GetGUID()));
- break;
- case GossipOptionNpc::Binder:
- PlayerTalkClass->SendCloseGossip();
- SetBindPoint(guid);
- break;
- case GossipOptionNpc::Banker:
- GetSession()->SendShowBank(guid);
+ source->CastSpell(source->ToCreature(), 17251, CastSpellExtraArgs(TRIGGERED_FULL_MASK).SetOriginalCaster(GetGUID()));
+ handled = false;
break;
case GossipOptionNpc::PetitionVendor:
PlayerTalkClass->SendCloseGossip();
GetSession()->SendPetitionShowList(guid);
break;
- case GossipOptionNpc::TabardVendor:
- PlayerTalkClass->SendCloseGossip();
- GetSession()->SendTabardVendorActivate(guid);
- break;
- case GossipOptionNpc::BattleMaster:
+ case GossipOptionNpc::Battlemaster:
{
BattlegroundTypeId bgTypeId = sBattlegroundMgr->GetBattleMasterBG(source->GetEntry());
@@ -13906,13 +13853,23 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
PlayerTalkClass->SendCloseGossip();
SendRespecWipeConfirm(guid, sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : GetNextResetTalentsCost(), SPEC_RESET_TALENTS);
break;
- case GossipOptionNpc::StableMaster:
+ case GossipOptionNpc::Stablemaster:
GetSession()->SendStablePet(guid);
break;
case GossipOptionNpc::PetSpecializationMaster:
PlayerTalkClass->SendCloseGossip();
SendRespecWipeConfirm(guid, sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : GetNextResetTalentsCost(), SPEC_RESET_PET_TALENTS);
break;
+ case GossipOptionNpc::GuildBanker:
+ if (Guild* const guild = GetGuild())
+ guild->SendBankList(GetSession(), 0, true);
+ else
+ Guild::SendCommandResult(GetSession(), GUILD_COMMAND_VIEW_TAB, ERR_GUILD_PLAYER_NOT_IN_GUILD);
+ break;
+ case GossipOptionNpc::Spellclick:
+ if (Unit* sourceUnit = source->ToUnit())
+ sourceUnit->HandleSpellClick(this);
+ break;
case GossipOptionNpc::DisableXPGain:
PlayerTalkClass->SendCloseGossip();
CastSpell(nullptr, SPELL_EXPERIENCE_ELIMINATED, true);
@@ -13923,9 +13880,6 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
RemoveAurasDueToSpell(SPELL_EXPERIENCE_ELIMINATED);
RemovePlayerFlag(PLAYER_FLAGS_NO_XP_GAIN);
break;
- case GossipOptionNpc::Mailbox:
- GetSession()->SendShowMailBox(guid);
- break;
case GossipOptionNpc::SpecializationMaster:
PlayerTalkClass->SendCloseGossip();
SendRespecWipeConfirm(guid, 0, SPEC_RESET_SPECIALIZATION);
@@ -13934,24 +13888,77 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
PlayerTalkClass->SendCloseGossip();
SendRespecWipeConfirm(guid, 0, SPEC_RESET_GLYPHS);
break;
- case GossipOptionNpc::GarrisonTalent:
- {
- GossipMenuAddon const* addon = sObjectMgr->GetGossipMenuAddon(menuId);
- GossipMenuItemAddon const* itemAddon = sObjectMgr->GetGossipMenuItemAddon(menuId, gossipListId);
- SendGarrisonOpenTalentNpc(guid, itemAddon ? itemAddon->GarrTalentTreeID.value_or(0) : 0, addon ? addon->FriendshipFactionID : 0);
+ case GossipOptionNpc::GarrisonTradeskillNpc: // NYI
break;
- }
- case GossipOptionNpc::Transmogrify:
- GetSession()->SendOpenTransmogrifier(guid);
+ case GossipOptionNpc::GarrisonRecruitment: // NYI
break;
- case GossipOptionNpc::AzeriteRespec:
- PlayerTalkClass->SendCloseGossip();
- GetSession()->SendAzeriteRespecNPC(guid);
+ case GossipOptionNpc::ChromieTimeNpc: // NYI
+ break;
+ case GossipOptionNpc::RuneforgeLegendaryCrafting: // NYI
+ break;
+ case GossipOptionNpc::RuneforgeLegendaryUpgrade: // NYI
+ break;
+ case GossipOptionNpc::ProfessionsCraftingOrder: // NYI
+ break;
+ case GossipOptionNpc::ProfessionsCustomerOrder: // NYI
+ break;
+ case GossipOptionNpc::BarbersChoice: // NYI - unknown if needs sending
break;
default:
+ handled = false;
break;
}
+ if (!handled)
+ {
+ if (item->GossipNpcOptionID)
+ {
+ GossipMenuAddon const* addon = sObjectMgr->GetGossipMenuAddon(menuId);
+
+ WorldPackets::NPC::GossipOptionNPCInteraction npcInteraction;
+ npcInteraction.GossipGUID = source->GetGUID();
+ npcInteraction.GossipNpcOptionID = *item->GossipNpcOptionID;
+ if (addon && addon->FriendshipFactionID)
+ npcInteraction.FriendshipFactionID = addon->FriendshipFactionID;
+
+ SendDirectMessage(npcInteraction.Write());
+ }
+ else
+ {
+ static constexpr std::array<PlayerInteractionType, AsUnderlyingType(GossipOptionNpc::Count)> GossipOptionNpcToInteractionType =
+ {
+ PlayerInteractionType::None, PlayerInteractionType::Vendor, PlayerInteractionType::TaxiNode,
+ PlayerInteractionType::Trainer, PlayerInteractionType::SpiritHealer, PlayerInteractionType::Binder,
+ PlayerInteractionType::Banker, PlayerInteractionType::PetitionVendor, PlayerInteractionType::TabardVendor,
+ PlayerInteractionType::BattleMaster, PlayerInteractionType::Auctioneer, PlayerInteractionType::TalentMaster,
+ PlayerInteractionType::StableMaster, PlayerInteractionType::None, PlayerInteractionType::GuildBanker,
+ PlayerInteractionType::None, PlayerInteractionType::None, PlayerInteractionType::None,
+ PlayerInteractionType::MailInfo, PlayerInteractionType::None, PlayerInteractionType::LFGDungeon,
+ PlayerInteractionType::ArtifactForge, PlayerInteractionType::None, PlayerInteractionType::SpecializationMaster,
+ PlayerInteractionType::None, PlayerInteractionType::None, PlayerInteractionType::GarrArchitect,
+ PlayerInteractionType::GarrMission, PlayerInteractionType::ShipmentCrafter, PlayerInteractionType::GarrTradeskill,
+ PlayerInteractionType::GarrRecruitment, PlayerInteractionType::AdventureMap, PlayerInteractionType::GarrTalent,
+ PlayerInteractionType::ContributionCollector, PlayerInteractionType::Transmogrifier, PlayerInteractionType::AzeriteRespec,
+ PlayerInteractionType::IslandQueue, PlayerInteractionType::ItemInteraction, PlayerInteractionType::WorldMap,
+ PlayerInteractionType::Soulbind, PlayerInteractionType::ChromieTime, PlayerInteractionType::CovenantPreview,
+ PlayerInteractionType::LegendaryCrafting, PlayerInteractionType::NewPlayerGuide, PlayerInteractionType::LegendaryCrafting,
+ PlayerInteractionType::Renown, PlayerInteractionType::BlackMarketAuctioneer, PlayerInteractionType::PerksProgramVendor,
+ PlayerInteractionType::ProfessionsCraftingOrder, PlayerInteractionType::Professions, PlayerInteractionType::ProfessionsCustomerOrder,
+ PlayerInteractionType::TraitSystem, PlayerInteractionType::BarbersChoice, PlayerInteractionType::MajorFactionRenown
+ };
+
+ PlayerInteractionType interactionType = GossipOptionNpcToInteractionType[AsUnderlyingType(gossipOptionNpc)];
+ if (interactionType != PlayerInteractionType::None)
+ {
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = source->GetGUID();
+ npcInteraction.InteractionType = interactionType;
+ npcInteraction.Success = true;
+ SendDirectMessage(npcInteraction.Write());
+ }
+ }
+ }
+
ModifyMoney(-cost);
}
@@ -16781,7 +16788,7 @@ void Player::_LoadEquipmentSets(PreparedQueryResult result)
eqSet.Data.AssignedSpecIndex = fields[5].GetInt32();
eqSet.State = EQUIPMENT_SET_UNCHANGED;
- for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint32 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
if (ObjectGuid::LowType guid = fields[6 + i].GetUInt64())
eqSet.Data.Pieces[i] = ObjectGuid::Create<HighGuid::Item>(guid);
@@ -16820,7 +16827,7 @@ void Player::_LoadTransmogOutfits(PreparedQueryResult result)
eqSet.State = EQUIPMENT_SET_UNCHANGED;
eqSet.Data.Pieces.fill(ObjectGuid::Empty);
- for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint32 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
eqSet.Data.Appearances[i] = fields[5 + i].GetInt32();
for (std::size_t i = 0; i < eqSet.Data.Enchants.size(); ++i)
@@ -17185,16 +17192,6 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
InitDisplayIds();
- // cleanup inventory related item value fields (it will be filled correctly in _LoadInventory)
- for (uint8 slot = EQUIPMENT_SLOT_START; slot < EQUIPMENT_SLOT_END; ++slot)
- {
- SetInvSlot(slot, ObjectGuid::Empty);
- SetVisibleItemSlot(slot, nullptr);
-
- delete m_items[slot];
- m_items[slot] = nullptr;
- }
-
TC_LOG_DEBUG("entities.player.loading", "Player::LoadFromDB: Load Basic value of player '%s' is: ", m_name.c_str());
outDebugValues();
@@ -17489,6 +17486,8 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
time_t now = GameTime::GetGameTime();
time_t logoutTime = time_t(fields.logout_time);
+ SetUpdateFieldValue(m_values.ModifyValue(&Player::m_playerData).ModifyValue(&UF::PlayerData::LogoutTime), logoutTime);
+
// since last logout (in seconds)
uint32 time_diff = uint32(now - logoutTime); //uint64 is excessive for a time_diff in seconds.. uint32 allows for 136~ year difference.
@@ -19353,7 +19352,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba
ss.str("");
// cache equipment...
- for (uint32 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
+ for (uint32 i = 0; i < REAGENT_BAG_SLOT_END; ++i)
{
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
{
@@ -19501,7 +19500,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba
ss.str("");
// cache equipment...
- for (uint32 i = 0; i < INVENTORY_SLOT_BAG_END; ++i)
+ for (uint32 i = 0; i < REAGENT_BAG_SLOT_END; ++i)
{
if (Item* item = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
{
@@ -22350,7 +22349,7 @@ bool Player::BuyItemFromVendorSlot(ObjectGuid vendorguid, uint32 vendorslot, uin
return false;
}
- if (iece->MinFactionID && uint32(GetReputationRank(iece->MinFactionID)) < iece->MinReputation)
+ if (iece->MinFactionID && int32(GetReputationRank(iece->MinFactionID)) < iece->MinReputation)
{
SendBuyError(BUY_ERR_REPUTATION_REQUIRE, creature, item, 0);
return false;
@@ -25897,6 +25896,10 @@ TalentLearnResult Player::LearnPvpTalent(uint32 talentID, uint8 slot, int32* spe
if (HasPvpTalent(talentID, GetActiveTalentGroup()))
return TALENT_FAILED_UNKNOWN;
+ if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(talentInfo->PlayerConditionID))
+ if (!ConditionMgr::IsPlayerMeetingCondition(this, playerCondition))
+ return TALENT_FAILED_CANT_DO_THAT_RIGHT_NOW;
+
if (PvpTalentEntry const* talent = sPvpTalentStore.LookupEntry(GetPvpTalentMap(GetActiveTalentGroup())[slot]))
{
if (!HasPlayerFlag(PLAYER_FLAGS_RESTING) && !HasUnitFlag2(UNIT_FLAG2_ALLOW_CHANGING_TALENTS))
@@ -26283,7 +26286,7 @@ void Player::_SaveEquipmentSets(CharacterDatabaseTransaction trans)
stmt->setString(j++, eqSet.Data.SetIcon);
stmt->setUInt32(j++, eqSet.Data.IgnoreMask);
stmt->setInt32(j++, eqSet.Data.AssignedSpecIndex);
- for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter());
stmt->setUInt64(j++, GetGUID().GetCounter());
stmt->setUInt64(j++, eqSet.Data.Guid);
@@ -26295,7 +26298,7 @@ void Player::_SaveEquipmentSets(CharacterDatabaseTransaction trans)
stmt->setString(j++, eqSet.Data.SetName);
stmt->setString(j++, eqSet.Data.SetIcon);
stmt->setUInt32(j++, eqSet.Data.IgnoreMask);
- for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
stmt->setInt32(j++, eqSet.Data.Appearances[i]);
for (std::size_t i = 0; i < eqSet.Data.Enchants.size(); ++i)
stmt->setInt32(j++, eqSet.Data.Enchants[i]);
@@ -26320,7 +26323,7 @@ void Player::_SaveEquipmentSets(CharacterDatabaseTransaction trans)
stmt->setString(j++, eqSet.Data.SetIcon);
stmt->setUInt32(j++, eqSet.Data.IgnoreMask);
stmt->setInt32(j++, eqSet.Data.AssignedSpecIndex);
- for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
stmt->setUInt64(j++, eqSet.Data.Pieces[i].GetCounter());
}
else
@@ -26332,7 +26335,7 @@ void Player::_SaveEquipmentSets(CharacterDatabaseTransaction trans)
stmt->setString(j++, eqSet.Data.SetName);
stmt->setString(j++, eqSet.Data.SetIcon);
stmt->setUInt32(j++, eqSet.Data.IgnoreMask);
- for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i)
+ for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
stmt->setInt32(j++, eqSet.Data.Appearances[i]);
for (std::size_t i = 0; i < eqSet.Data.Enchants.size(); ++i)
stmt->setInt32(j++, eqSet.Data.Enchants[i]);
@@ -27639,8 +27642,9 @@ void Player::ValidateMovementInfo(MovementInfo* mi)
void Player::SendSupercededSpell(uint32 oldSpell, uint32 newSpell) const
{
WorldPackets::Spells::SupercededSpells supercededSpells;
- supercededSpells.SpellID.push_back(newSpell);
- supercededSpells.Superceded.push_back(oldSpell);
+ WorldPackets::Spells::LearnedSpellInfo& learnedSpellInfo = supercededSpells.ClientLearnedSpellData.emplace_back();
+ learnedSpellInfo.SpellID = newSpell;
+ learnedSpellInfo.Superceded = oldSpell;
SendDirectMessage(supercededSpells.Write());
}
@@ -27934,7 +27938,7 @@ void Player::UpdateAverageItemLevelTotal()
ForEachItem(ItemSearchLocation::Everywhere, [this, &bestItemLevels, &sum](Item* item)
{
ItemTemplate const* itemTemplate = item->GetTemplate();
- if (itemTemplate)
+ if (itemTemplate && itemTemplate->GetInventoryType() < INVTYPE_PROFESSION_TOOL)
{
uint16 dest;
if (item->IsEquipped())
@@ -28133,12 +28137,3 @@ void Player::SendDisplayToast(uint32 entry, DisplayToastType type, bool isBonusR
SendDirectMessage(displayToast.Write());
}
-
-void Player::SendGarrisonOpenTalentNpc(ObjectGuid guid, int32 garrTalentTreeId, int32 friendshipFactionId)
-{
- WorldPackets::Garrison::GarrisonOpenTalentNpc openTalentNpc;
- openTalentNpc.NpcGUID = guid;
- openTalentNpc.GarrTalentTreeID = garrTalentTreeId;
- openTalentNpc.FriendshipFactionID = friendshipFactionId;
- SendDirectMessage(openTalentNpc.Write());
-}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index c155ccd6d01..ff4b3b1afa9 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -358,7 +358,7 @@ struct ActionButton
}
};
-#define MAX_ACTION_BUTTONS 132
+#define MAX_ACTION_BUTTONS 180
typedef std::map<uint8, ActionButton> ActionButtonList;
@@ -637,7 +637,7 @@ enum PlayerSlots
// first slot for item stored (in any way in player m_items data)
PLAYER_SLOT_START = 0,
// last+1 slot for item stored (in any way in player m_items data)
- PLAYER_SLOT_END = 199,
+ PLAYER_SLOT_END = 218,
PLAYER_SLOTS_COUNT = (PLAYER_SLOT_END - PLAYER_SLOT_START)
};
@@ -671,50 +671,82 @@ enum EquipmentSlots : uint8 // 19 slots
EQUIPMENT_SLOT_END = 19
};
-#define VISIBLE_ITEM_ENTRY_OFFSET 0
-#define VISIBLE_ITEM_ENCHANTMENT_OFFSET 1
+enum ProfessionSlots : uint8
+{
+ PROFESSION_SLOT_PROFESSION1_TOOL = 19,
+ PROFESSION_SLOT_PROFESSION1_GEAR1 = 20,
+ PROFESSION_SLOT_PROFESSION1_GEAR2 = 21,
+ PROFESSION_SLOT_PROFESSION2_TOOL = 22,
+ PROFESSION_SLOT_PROFESSION2_GEAR1 = 23,
+ PROFESSION_SLOT_PROFESSION2_GEAR2 = 24,
+ PROFESSION_SLOT_COOKING_TOOL = 25,
+ PROFESSION_SLOT_COOKING_GEAR1 = 26,
+ PROFESSION_SLOT_FISHING_TOOL = 27,
+ PROFESSION_SLOT_FISHING_GEAR1 = 28,
+ PROFESSION_SLOT_FISHING_GEAR2 = 29,
+
+ PROFESSION_SLOT_END,
+ PROFESSION_SLOT_START = PROFESSION_SLOT_PROFESSION1_TOOL
+};
enum InventorySlots : uint8 // 4 slots
{
- INVENTORY_SLOT_BAG_START = 19,
- INVENTORY_SLOT_BAG_END = 23
+ INVENTORY_SLOT_BAG_START = 30,
+ INVENTORY_SLOT_BAG_END = 34
+};
+
+enum ReagentBagSlots : uint8 // 1 slot
+{
+ REAGENT_BAG_SLOT_START = 34,
+ REAGENT_BAG_SLOT_END = 35
};
enum InventoryPackSlots : uint8 // 28 slots
{
- INVENTORY_SLOT_ITEM_START = 23,
- INVENTORY_SLOT_ITEM_END = 51
+ INVENTORY_SLOT_ITEM_START = 35,
+ INVENTORY_SLOT_ITEM_END = 63
};
enum BankItemSlots // 28 slots
{
- BANK_SLOT_ITEM_START = 51,
- BANK_SLOT_ITEM_END = 79
+ BANK_SLOT_ITEM_START = 63,
+ BANK_SLOT_ITEM_END = 91
};
enum BankBagSlots // 7 slots
{
- BANK_SLOT_BAG_START = 79,
- BANK_SLOT_BAG_END = 86
+ BANK_SLOT_BAG_START = 91,
+ BANK_SLOT_BAG_END = 98
};
enum BuyBackSlots // 12 slots
{
// stored in m_buybackitems
- BUYBACK_SLOT_START = 86,
- BUYBACK_SLOT_END = 98
+ BUYBACK_SLOT_START = 98,
+ BUYBACK_SLOT_END = 110
};
enum ReagentSlots // 98 slots
{
- REAGENT_SLOT_START = 98,
- REAGENT_SLOT_END = 196,
+ REAGENT_SLOT_START = 110,
+ REAGENT_SLOT_END = 208,
};
enum ChildEquipmentSlots
{
- CHILD_EQUIPMENT_SLOT_START = 196,
- CHILD_EQUIPMENT_SLOT_END = 199,
+ CHILD_EQUIPMENT_SLOT_START = 208,
+ CHILD_EQUIPMENT_SLOT_END = 211,
+};
+
+enum EquipableSpellSlots
+{
+ EQUIPABLE_SPELL_OFFENSIVE_SLOT1 = 211,
+ EQUIPABLE_SPELL_OFFENSIVE_SLOT2 = 212,
+ EQUIPABLE_SPELL_OFFENSIVE_SLOT3 = 213,
+ EQUIPABLE_SPELL_OFFENSIVE_SLOT4 = 214,
+ EQUIPABLE_SPELL_UTILITY_SLOT1 = 215,
+ EQUIPABLE_SPELL_DEFENSIVE_SLOT1 = 216,
+ EQUIPABLE_SPELL_MOBILITY_SLOT1 = 217
};
struct ItemPosCount
@@ -1037,7 +1069,9 @@ enum TalentLearnResult
TALENT_FAILED_AFFECTING_COMBAT = 5,
TALENT_FAILED_CANT_REMOVE_TALENT = 6,
TALENT_FAILED_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 7,
- TALENT_FAILED_REST_AREA = 8
+ TALENT_FAILED_REST_AREA = 8,
+ TALENT_FAILED_UNSPENT_TALENT_POINTS = 9,
+ TALENT_FAILED_IN_PVP_MATCH = 10
};
struct TC_GAME_API SpecializationInfo
@@ -1236,11 +1270,18 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
EnumFlag<ItemSearchLocation> flag = location;
if (flag.HasFlag(ItemSearchLocation::Equipment))
+ {
for (uint8 i = EQUIPMENT_SLOT_START; i < EQUIPMENT_SLOT_END; ++i)
if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
if (callback(pItem) == ItemSearchCallbackResult::Stop)
return false;
+ for (uint8 i = PROFESSION_SLOT_START; i < PROFESSION_SLOT_END; ++i)
+ if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
+ if (callback(pItem) == ItemSearchCallbackResult::Stop)
+ return false;
+ }
+
if (flag.HasFlag(ItemSearchLocation::Inventory))
{
uint8 inventoryEnd = INVENTORY_SLOT_ITEM_START + GetInventorySlotCount();
@@ -1278,10 +1319,19 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
}
if (flag.HasFlag(ItemSearchLocation::ReagentBank))
+ {
+ for (uint8 i = REAGENT_BAG_SLOT_START; i < REAGENT_BAG_SLOT_END; ++i)
+ if (Bag* bag = GetBagByPos(i))
+ for (uint32 j = 0; j < GetBagSize(bag); ++j)
+ if (Item* pItem = GetItemInBag(bag, j))
+ if (callback(pItem) == ItemSearchCallbackResult::Stop)
+ return false;
+
for (uint8 i = REAGENT_SLOT_START; i < REAGENT_SLOT_END; ++i)
if (Item* pItem = GetItemByPos(INVENTORY_SLOT_BAG_0, i))
if (callback(pItem) == ItemSearchCallbackResult::Stop)
return false;
+ }
return true;
}
@@ -1363,7 +1413,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void AutoUnequipOffhandIfNeed(bool force = false);
void EquipChildItem(uint8 parentBag, uint8 parentSlot, Item* parentItem);
void AutoUnequipChildItem(Item* parentItem);
- bool StoreNewItemInBestSlots(uint32 item_id, uint32 item_count);
+ bool StoreNewItemInBestSlots(uint32 itemId, uint32 amount, ItemContext context);
void AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore const& store, ItemContext context = ItemContext::NONE, bool broadcast = false, bool createdByPlayer = false);
void AutoStoreLoot(uint32 loot_id, LootStore const& store, ItemContext context = ItemContext::NONE, bool broadcast = false, bool createdByPlayer = false) { AutoStoreLoot(NULL_BAG, NULL_SLOT, loot_id, store, context, broadcast, createdByPlayer); }
void StoreLootItem(ObjectGuid lootWorldObjectGuid, uint8 lootSlot, Loot* loot, AELootResult* aeResult = nullptr);
@@ -1481,7 +1531,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void PrepareGossipMenu(WorldObject* source, uint32 menuId, bool showQuests = false);
void SendPreparedGossip(WorldObject* source);
- void OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 menuId);
+ void OnGossipSelect(WorldObject* source, int32 gossipOptionId, uint32 menuId);
uint32 GetGossipTextId(uint32 menuId, WorldObject* source);
uint32 GetGossipTextId(WorldObject* source);
@@ -2770,8 +2820,6 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool CanEnableWarModeInArea() const;
void UpdateWarModeAuras();
- void SendGarrisonOpenTalentNpc(ObjectGuid guid, int32 garrTalentTreeId, int32 friendshipFactionId);
-
std::string GetDebugInfo() const override;
UF::UpdateField<UF::PlayerData, 0, TYPEID_PLAYER> m_playerData;
diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp
index 38fec84894d..bb35bf3db24 100644
--- a/src/server/game/Entities/Unit/StatSystem.cpp
+++ b/src/server/game/Entities/Unit/StatSystem.cpp
@@ -595,7 +595,9 @@ float const m_diminishing_k[MAX_CLASSES] =
0.9830f, // Warlock
0.9830f, // Monk
0.9720f, // Druid
- 0.9830f // Demon Hunter
+ 0.9830f, // Demon Hunter
+ 0.9880f, // Evoker
+ 1.0f, // Adventurer
};
// helper function
@@ -634,7 +636,9 @@ float const parry_cap[MAX_CLASSES] =
0.0f, // Warlock
90.6425f, // Monk
0.0f, // Druid
- 65.631440f // Demon Hunter
+ 65.631440f, // Demon Hunter
+ 0.0f, // Evoker
+ 0.0f, // Adventurer
};
void Player::UpdateParryPercentage()
@@ -673,7 +677,9 @@ float const dodge_cap[MAX_CLASSES] =
150.375940f, // Warlock
145.560408f, // Monk
116.890707f, // Druid
- 145.560408f // Demon Hunter
+ 145.560408f, // Demon Hunter
+ 145.560408f, // Evoker
+ 0.0f, // Adventurer
};
void Player::UpdateDodgePercentage()
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 3580a5c2824..96e0da89968 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -6645,6 +6645,11 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui
{
return aurEff->GetCasterGUID() == caster->GetGUID() && aurEff->IsAffectingSpell(spellProto);
});
+
+ TakenTotalMod *= GetTotalAuraMultiplier(SPELL_AURA_MOD_DAMAGE_TAKEN_FROM_CASTER_BY_LABEL, [caster, spellProto](AuraEffect const* aurEff) -> bool
+ {
+ return aurEff->GetCasterGUID() == caster->GetGUID() && spellProto->HasLabel(aurEff->GetMiscValue());
+ });
}
if (damagetype == DOT)
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 9f8c2fbafcb..cd0c4858597 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -188,6 +188,7 @@ enum UnitMods
UNIT_MOD_ARCANE_CHARGES,
UNIT_MOD_FURY,
UNIT_MOD_PAIN,
+ UNIT_MOD_ESSENCE,
UNIT_MOD_ARMOR, // UNIT_MOD_ARMOR..UNIT_MOD_RESISTANCE_ARCANE must be in existed order, it's accessed by index values of SpellSchools enum.
UNIT_MOD_RESISTANCE_HOLY,
UNIT_MOD_RESISTANCE_FIRE,
@@ -207,7 +208,7 @@ enum UnitMods
UNIT_MOD_RESISTANCE_START = UNIT_MOD_ARMOR,
UNIT_MOD_RESISTANCE_END = UNIT_MOD_RESISTANCE_ARCANE + 1,
UNIT_MOD_POWER_START = UNIT_MOD_MANA,
- UNIT_MOD_POWER_END = UNIT_MOD_PAIN + 1
+ UNIT_MOD_POWER_END = UNIT_MOD_ESSENCE + 1
};
static_assert(UNIT_MOD_POWER_END - UNIT_MOD_POWER_START == MAX_POWERS, "UnitMods powers section does not match Powers enum!");
diff --git a/src/server/game/Entities/Unit/UnitDefines.h b/src/server/game/Entities/Unit/UnitDefines.h
index c71b061b07e..0f9b5e35032 100644
--- a/src/server/game/Entities/Unit/UnitDefines.h
+++ b/src/server/game/Entities/Unit/UnitDefines.h
@@ -418,6 +418,8 @@ enum MovementFlags3 : uint32
{
MOVEMENTFLAG3_NONE = 0x00000000,
MOVEMENTFLAG3_DISABLE_INERTIA = 0x00000001,
+ MOVEMENTFLAG3_CAN_ADV_FLY = 0x00000002,
+ MOVEMENTFLAG3_ADV_FLYING = 0x00000004,
};
enum HitInfo
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index 4a3f3ee4464..03ecfec1d82 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -3036,6 +3036,12 @@ uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventory
0.00f, // INVTYPE_RANGEDRIGHT
0.00f, // INVTYPE_QUIVER
0.00f, // INVTYPE_RELIC
+ 0.00f, // INVTYPE_PROFESSION_TOOL
+ 0.00f, // INVTYPE_PROFESSION_GEAR
+ 0.00f, // INVTYPE_EQUIPABLE_SPELL_OFFENSIVE
+ 0.00f, // INVTYPE_EQUIPABLE_SPELL_UTILITY
+ 0.00f, // INVTYPE_EQUIPABLE_SPELL_DEFENSIVE
+ 0.00f, // INVTYPE_EQUIPABLE_SPELL_MOBILITY
};
static float const weaponMultipliers[MAX_ITEM_SUBCLASS_WEAPON] =
@@ -3743,17 +3749,18 @@ PetLevelInfo const* ObjectMgr::GetPetLevelInfo(uint32 creature_id, uint8 level)
void ObjectMgr::PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint32 itemId, int32 count)
{
- if (!_playerInfo[race_][class_])
+ std::unique_ptr<PlayerInfo>* playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race_), Classes(class_) });
+ if (!playerInfo)
return;
if (count > 0)
- _playerInfo[race_][class_]->item.emplace_back(itemId, count);
+ playerInfo->get()->item.emplace_back(itemId, count);
else
{
if (count < -1)
TC_LOG_ERROR("sql.sql", "Invalid count %i specified on item %u be removed from original player create info (use -1)!", count, itemId);
- PlayerCreateInfoItems& items = _playerInfo[race_][class_]->item;
+ PlayerCreateInfoItems& items = playerInfo->get()->item;
auto erased = std::remove_if(items.begin(), items.end(), [itemId](PlayerCreateInfoItem const& item) { return item.item_id == itemId; });
if (erased == items.end())
@@ -3888,7 +3895,7 @@ void ObjectMgr::LoadPlayerInfo()
introSceneId, current_class, current_race);
}
- _playerInfo[current_race][current_class] = std::move(info);
+ _playerInfo[{ Races(current_race), Classes(current_class) }] = std::move(info);
++count;
}
@@ -3920,8 +3927,10 @@ void ObjectMgr::LoadPlayerInfo()
if (!characterLoadout->RaceMask.HasRace(raceIndex))
continue;
- if (auto& playerInfo = _playerInfo[raceIndex][characterLoadout->ChrClassID])
+ if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(characterLoadout->ChrClassID) }))
{
+ playerInfo->get()->itemContext = ItemContext(characterLoadout->ItemContext);
+
for (ItemTemplate const* itemTemplate : *items)
{
// BuyCount by default
@@ -3946,7 +3955,7 @@ void ObjectMgr::LoadPlayerInfo()
count = itemTemplate->GetMaxStackSize();
}
- playerInfo->item.emplace_back(itemTemplate->GetId(), count);
+ playerInfo->get()->item.emplace_back(itemTemplate->GetId(), count);
}
}
}
@@ -4033,8 +4042,8 @@ void ObjectMgr::LoadPlayerInfo()
if (rcInfo->RaceMask.HasRace(raceIndex))
for (uint32 classIndex = CLASS_WARRIOR; classIndex < MAX_CLASSES; ++classIndex)
if (rcInfo->ClassMask == -1 || ((1 << (classIndex - 1)) & rcInfo->ClassMask))
- if (auto& info = _playerInfo[raceIndex][classIndex])
- info->skills.push_back(rcInfo);
+ if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
+ playerInfo->get()->skills.push_back(rcInfo);
TC_LOG_INFO("server.loading", ">> Loaded player create skills in %u ms", GetMSTimeDiffToNow(oldMSTime));
}
@@ -4081,9 +4090,9 @@ void ObjectMgr::LoadPlayerInfo()
{
if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
{
- if (auto& info = _playerInfo[raceIndex][classIndex])
+ if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
{
- info->customSpells.push_back(spellId);
+ playerInfo->get()->customSpells.push_back(spellId);
++count;
}
// We need something better here, the check is not accounting for spells used by multiple races/classes but not all of them.
@@ -4148,9 +4157,9 @@ void ObjectMgr::LoadPlayerInfo()
{
if (classMask == 0 || ((1 << (classIndex - 1)) & classMask))
{
- if (auto& info = _playerInfo[raceIndex][classIndex])
+ if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(raceIndex), Classes(classIndex) }))
{
- info->castSpells[playerCreateMode].push_back(spellId);
+ playerInfo->get()->castSpells[playerCreateMode].push_back(spellId);
++count;
}
}
@@ -4197,8 +4206,8 @@ void ObjectMgr::LoadPlayerInfo()
continue;
}
- if (auto& info = _playerInfo[current_race][current_class])
- info->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16()));
+ if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(current_race), Classes(current_class) }))
+ playerInfo->get()->action.push_back(PlayerCreateInfoAction(fields[2].GetUInt16(), fields[3].GetUInt32(), fields[4].GetUInt16()));
++count;
}
@@ -4279,12 +4288,12 @@ void ObjectMgr::LoadPlayerInfo()
for (std::size_t race = 0; race < raceStatModifiers.size(); ++race)
{
- if (auto& info = _playerInfo[race][current_class])
+ if (auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(current_class) }))
{
- if (!info->levelInfo)
- info->levelInfo = std::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
+ if (!playerInfo->get()->levelInfo)
+ playerInfo->get()->levelInfo = std::make_unique<PlayerLevelInfo[]>(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
- PlayerLevelInfo& levelInfo = info->levelInfo[current_level - 1];
+ PlayerLevelInfo& levelInfo = playerInfo->get()->levelInfo[current_level - 1];
for (uint8 i = 0; i < MAX_STATS; ++i)
levelInfo.stats[i] = fields[i + 2].GetUInt16() + raceStatModifiers[race].StatModifier[i];
}
@@ -4307,8 +4316,8 @@ void ObjectMgr::LoadPlayerInfo()
if (!sChrClassesStore.LookupEntry(class_))
continue;
- auto& info = _playerInfo[race][class_];
- if (!info)
+ auto const& playerInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
+ if (!playerInfo)
continue;
// skip expansion races if not playing with expansion
@@ -4330,7 +4339,7 @@ void ObjectMgr::LoadPlayerInfo()
continue;
// fatal error if no level 1 data
- if (!info->levelInfo || info->levelInfo[0].stats[0] == 0)
+ if (!playerInfo->get()->levelInfo || playerInfo->get()->levelInfo[0].stats[0] == 0)
{
TC_LOG_ERROR("sql.sql", "Race %i Class %i Level 1 does not have stats data!", race, class_);
ABORT();
@@ -4339,10 +4348,10 @@ void ObjectMgr::LoadPlayerInfo()
// fill level gaps
for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
{
- if (info->levelInfo[level].stats[0] == 0)
+ if (playerInfo->get()->levelInfo[level].stats[0] == 0)
{
TC_LOG_ERROR("sql.sql", "Race %i Class %i Level %i does not have stats data. Using stats data of level %i.", race, class_, level + 1, level);
- info->levelInfo[level] = info->levelInfo[level - 1];
+ playerInfo->get()->levelInfo[level] = playerInfo->get()->levelInfo[level - 1];
}
}
}
@@ -4431,12 +4440,12 @@ void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, Play
if (level < 1 || race >= MAX_RACES || class_ >= MAX_CLASSES)
return;
- auto const& pInfo = _playerInfo[race][class_];
+ auto const& pInfo = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
if (!pInfo)
return;
if (level <= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
- *info = pInfo->levelInfo[level - 1];
+ *info = pInfo->get()->levelInfo[level - 1];
else
BuildPlayerLevelInfo(race, class_, level, info);
}
@@ -4444,7 +4453,7 @@ void ObjectMgr::GetPlayerLevelInfo(uint32 race, uint32 class_, uint8 level, Play
void ObjectMgr::BuildPlayerLevelInfo(uint8 race, uint8 _class, uint8 level, PlayerLevelInfo* info) const
{
// base data (last known level)
- *info = _playerInfo[race][_class]->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
+ *info = ASSERT_NOTNULL(Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(_class) }))->get()->levelInfo[sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1];
// if conversion from uint32 to uint8 causes unexpected behaviour, change lvl to uint32
for (uint8 lvl = sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL) - 1; lvl < level; ++lvl)
@@ -4614,7 +4623,19 @@ void ObjectMgr::LoadQuests()
{ "QuestId, RewardMailSenderEntry", "quest_mail_sender", "", "mail sender entries", &Quest::LoadQuestMailSender },
// 0 1 2 3 4 5 6 7 8 9
- { "QuestID, ID, Type, StorageIndex, ObjectID, Amount, Flags, Flags2, ProgressBarWeight, Description", "quest_objectives", "ORDER BY `Order` ASC, StorageIndex ASC", "quest objectives", &Quest::LoadQuestObjective }
+ { "QuestID, ID, Type, StorageIndex, ObjectID, Amount, Flags, Flags2, ProgressBarWeight, Description", "quest_objectives", "ORDER BY `Order` ASC, StorageIndex ASC", "quest objectives", &Quest::LoadQuestObjective },
+
+ // 0 1 2 3 4
+ { "QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale", "quest_description_conditional", "ORDER BY OrderIndex", "conditional details", &Quest::LoadConditionalConditionalQuestDescription },
+
+ // 0 1 2 3 4
+ { "QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale", "quest_request_items_conditional", "ORDER BY OrderIndex", "conditional request items", &Quest::LoadConditionalConditionalRequestItemsText },
+
+ // 0 1 2 3 4
+ { "QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale", "quest_offer_reward_conditional", "ORDER BY OrderIndex", "conditional reward", &Quest::LoadConditionalConditionalOfferRewardText },
+
+ // 0 1 2 3 4
+ { "QuestId, PlayerConditionId, QuestgiverCreatureId, Text, locale", "quest_completion_log_conditional", "ORDER BY OrderIndex", "conditional completion log", &Quest::LoadConditionalConditionalQuestCompletionLog }
};
for (QuestLoaderHelper const& loader : QuestLoaderHelpers)
@@ -9462,7 +9483,7 @@ void ObjectMgr::LoadCreatureTrainers()
Trinity::IteratorPair<GossipMenuItemsContainer::const_iterator> gossipMenuItems = GetGossipMenuItemsMapBounds(gossipMenuId);
auto gossipOptionItr = std::find_if(gossipMenuItems.begin(), gossipMenuItems.end(), [gossipOptionId](std::pair<uint32 const, GossipMenuItems> const& entry)
{
- return entry.second.OptionID == gossipOptionId;
+ return entry.second.OrderIndex == gossipOptionId;
});
if (gossipOptionItr == gossipMenuItems.end())
{
@@ -9627,8 +9648,10 @@ void ObjectMgr::LoadGossipMenuItems()
_gossipMenuItemsStore.clear();
QueryResult result = WorldDatabase.Query(
- // 0 1 2 3 4 5 6 7 8 9 10 11
- "SELECT MenuID, OptionID, OptionNpc, OptionText, OptionBroadcastTextID, Language, ActionMenuID, ActionPoiID, BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID "
+ // 0 1 2 3 4 5 6 7 8 9 10
+ "SELECT MenuID, GossipOptionID, OptionID, OptionNpc, OptionText, OptionBroadcastTextID, Language, Flags, ActionMenuID, ActionPoiID, GossipNpcOptionID, "
+ //11 12 13 14 15 16
+ "BoxCoded, BoxMoney, BoxText, BoxBroadcastTextID, SpellID, OverrideIconID "
"FROM gossip_menu_option ORDER BY MenuID, OptionID");
if (!result)
@@ -9637,6 +9660,10 @@ void ObjectMgr::LoadGossipMenuItems()
return;
}
+ std::unordered_map<int32, int32> optionToNpcOption;
+ for (GossipNPCOptionEntry const* npcOption : sGossipNPCOptionStore)
+ optionToNpcOption[npcOption->GossipOptionID] = npcOption->ID;
+
do
{
Field* fields = result->Fetch();
@@ -9644,21 +9671,31 @@ void ObjectMgr::LoadGossipMenuItems()
GossipMenuItems gMenuItem;
gMenuItem.MenuID = fields[0].GetUInt32();
- gMenuItem.OptionID = fields[1].GetUInt32();
- gMenuItem.OptionNpc = GossipOptionNpc(fields[2].GetUInt8());
- gMenuItem.OptionText = fields[3].GetString();
- gMenuItem.OptionBroadcastTextID = fields[4].GetUInt32();
- gMenuItem.Language = fields[5].GetUInt32();
- gMenuItem.ActionMenuID = fields[6].GetUInt32();
- gMenuItem.ActionPoiID = fields[7].GetUInt32();
- gMenuItem.BoxCoded = fields[8].GetBool();
- gMenuItem.BoxMoney = fields[9].GetUInt32();
- gMenuItem.BoxText = fields[10].GetString();
- gMenuItem.BoxBroadcastTextID = fields[11].GetUInt32();
+ gMenuItem.GossipOptionID = fields[1].GetInt32();
+ gMenuItem.OrderIndex = fields[2].GetUInt32();
+ gMenuItem.OptionNpc = GossipOptionNpc(fields[3].GetUInt8());
+ gMenuItem.OptionText = fields[4].GetString();
+ gMenuItem.OptionBroadcastTextID = fields[5].GetUInt32();
+ gMenuItem.Language = fields[6].GetUInt32();
+ gMenuItem.Flags = GossipOptionFlags(fields[7].GetInt32());
+ gMenuItem.ActionMenuID = fields[8].GetUInt32();
+ gMenuItem.ActionPoiID = fields[9].GetUInt32();
+ if (!fields[10].IsNull())
+ gMenuItem.GossipNpcOptionID = fields[10].GetInt32();
+
+ gMenuItem.BoxCoded = fields[11].GetBool();
+ gMenuItem.BoxMoney = fields[12].GetUInt32();
+ gMenuItem.BoxText = fields[13].GetString();
+ gMenuItem.BoxBroadcastTextID = fields[14].GetUInt32();
+ if (!fields[15].IsNull())
+ gMenuItem.SpellID = fields[15].GetInt32();
+
+ if (!fields[16].IsNull())
+ gMenuItem.OverrideIconID = fields[16].GetInt32();
if (gMenuItem.OptionNpc >= GossipOptionNpc::Count)
{
- TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has unknown NPC option id %u. Replacing with GossipOptionNpc::None", gMenuItem.MenuID, gMenuItem.OptionID, AsUnderlyingType(gMenuItem.OptionNpc));
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has unknown NPC option id %u. Replacing with GossipOptionNpc::None", gMenuItem.MenuID, gMenuItem.OrderIndex, AsUnderlyingType(gMenuItem.OptionNpc));
gMenuItem.OptionNpc = GossipOptionNpc::None;
}
@@ -9666,20 +9703,20 @@ void ObjectMgr::LoadGossipMenuItems()
{
if (!sBroadcastTextStore.LookupEntry(gMenuItem.OptionBroadcastTextID))
{
- TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has non-existing or incompatible OptionBroadcastTextID %u, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.OptionBroadcastTextID);
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has non-existing or incompatible OptionBroadcastTextID %u, ignoring.", gMenuItem.MenuID, gMenuItem.OrderIndex, gMenuItem.OptionBroadcastTextID);
gMenuItem.OptionBroadcastTextID = 0;
}
}
if (gMenuItem.Language && !sLanguagesStore.LookupEntry(gMenuItem.Language))
{
- TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u use non-existing Language %u, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.Language);
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u use non-existing Language %u, ignoring", gMenuItem.MenuID, gMenuItem.OrderIndex, gMenuItem.Language);
gMenuItem.Language = 0;
}
if (gMenuItem.ActionMenuID && gMenuItem.OptionNpc != GossipOptionNpc::None)
{
- TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u can not use ActionMenuID for GossipOptionNpc different from GossipOptionNpc::None, ignoring", gMenuItem.MenuID, gMenuItem.OptionID);
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u can not use ActionMenuID for GossipOptionNpc different from GossipOptionNpc::None, ignoring", gMenuItem.MenuID, gMenuItem.OrderIndex);
gMenuItem.ActionMenuID = 0;
}
@@ -9687,25 +9724,47 @@ void ObjectMgr::LoadGossipMenuItems()
{
if (gMenuItem.OptionNpc != GossipOptionNpc::None)
{
- TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u can not use ActionPoiID for GossipOptionNpc different from GossipOptionNpc::None, ignoring", gMenuItem.MenuID, gMenuItem.OptionID);
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u can not use ActionPoiID for GossipOptionNpc different from GossipOptionNpc::None, ignoring", gMenuItem.MenuID, gMenuItem.OrderIndex);
gMenuItem.ActionPoiID = 0;
}
else if (!GetPointOfInterest(gMenuItem.ActionPoiID))
{
- TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u use non-existing ActionPoiID %u, ignoring", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.ActionPoiID);
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u use non-existing ActionPoiID %u, ignoring", gMenuItem.MenuID, gMenuItem.OrderIndex, gMenuItem.ActionPoiID);
gMenuItem.ActionPoiID = 0;
}
}
+ if (gMenuItem.GossipNpcOptionID)
+ {
+ if (!sGossipNPCOptionStore.LookupEntry(*gMenuItem.GossipNpcOptionID))
+ {
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u use non-existing GossipNPCOption %u, ignoring",
+ gMenuItem.MenuID, gMenuItem.OrderIndex, *gMenuItem.GossipNpcOptionID);
+ gMenuItem.GossipNpcOptionID.reset();
+ }
+ }
+ else if (int32 const* npcOptionId = Trinity::Containers::MapGetValuePtr(optionToNpcOption, gMenuItem.GossipOptionID))
+ gMenuItem.GossipNpcOptionID = *npcOptionId;
+
if (gMenuItem.BoxBroadcastTextID)
{
if (!sBroadcastTextStore.LookupEntry(gMenuItem.BoxBroadcastTextID))
{
- TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has non-existing or incompatible BoxBroadcastTextID %u, ignoring.", gMenuItem.MenuID, gMenuItem.OptionID, gMenuItem.BoxBroadcastTextID);
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u has non-existing or incompatible BoxBroadcastTextID %u, ignoring.", gMenuItem.MenuID, gMenuItem.OrderIndex, gMenuItem.BoxBroadcastTextID);
gMenuItem.BoxBroadcastTextID = 0;
}
}
+ if (gMenuItem.SpellID)
+ {
+ if (!sSpellMgr->GetSpellInfo(*gMenuItem.SpellID, DIFFICULTY_NONE))
+ {
+ TC_LOG_ERROR("sql.sql", "Table `gossip_menu_option` for menu %u, id %u use non-existing Spell %u, ignoring",
+ gMenuItem.MenuID, gMenuItem.OrderIndex, *gMenuItem.SpellID);
+ gMenuItem.SpellID.reset();
+ }
+ }
+
_gossipMenuItemsStore.insert(GossipMenuItemsContainer::value_type(gMenuItem.MenuID, gMenuItem));
} while (result->NextRow());
@@ -9755,44 +9814,6 @@ void ObjectMgr::LoadGossipMenuAddon()
TC_LOG_INFO("server.loading", ">> Loaded %u gossip_menu_addon IDs in %u ms", uint32(_gossipMenuAddonStore.size()), GetMSTimeDiffToNow(oldMSTime));
}
-void ObjectMgr::LoadGossipMenuItemAddon()
-{
- uint32 oldMSTime = getMSTime();
-
- _gossipMenuItemAddonStore.clear();
-
- // 0 1 2
- QueryResult result = WorldDatabase.Query("SELECT MenuID, OptionId, GarrTalentTreeID FROM gossip_menu_option_addon");
-
- if (!result)
- {
- TC_LOG_INFO("server.loading", ">> Loaded 0 gossip_menu_option_addon IDs. DB table `gossip_menu_option_addon` is empty!");
- return;
- }
-
- do
- {
- Field* fields = result->Fetch();
-
- uint32 menuId = fields[0].GetUInt32();
- uint32 optionId = fields[1].GetUInt32();
- GossipMenuItemAddon& addon = _gossipMenuItemAddonStore[{ menuId, optionId }];
- if (!fields[2].IsNull())
- {
- addon.GarrTalentTreeID = fields[2].GetInt32();
-
- if (!sGarrTalentTreeStore.LookupEntry(*addon.GarrTalentTreeID))
- {
- TC_LOG_ERROR("sql.sql", "Table gossip_menu_option_addon: MenuID %u OptionID %u is using non-existing GarrTalentTree %d",
- menuId, optionId, *addon.GarrTalentTreeID);
- addon.GarrTalentTreeID.reset();
- }
- }
- } while (result->NextRow());
-
- TC_LOG_INFO("server.loading", ">> Loaded %u gossip_menu_option_addon IDs in %u ms", uint32(_gossipMenuItemAddonStore.size()), GetMSTimeDiffToNow(oldMSTime));
-}
-
Trainer::Trainer const* ObjectMgr::GetTrainer(uint32 trainerId) const
{
return Trinity::Containers::MapGetValuePtr(_trainers, trainerId);
@@ -10594,10 +10615,10 @@ PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const
return nullptr;
if (class_ >= MAX_CLASSES)
return nullptr;
- auto const& info = _playerInfo[race][class_];
+ auto const& info = Trinity::Containers::MapGetValuePtr(_playerInfo, { Races(race), Classes(class_) });
if (!info)
return nullptr;
- return info.get();
+ return info->get();
}
void ObjectMgr::LoadRaceAndClassExpansionRequirements()
@@ -10659,6 +10680,8 @@ void ObjectMgr::LoadRaceAndClassExpansionRequirements()
if (result)
{
std::map<uint8, std::map<uint8, std::pair<uint8, uint8>>> temp;
+ std::array<uint8, MAX_CLASSES> minRequirementForClass = { };
+ minRequirementForClass.fill(MAX_ACCOUNT_EXPANSIONS);
uint32 count = 0;
do
{
@@ -10700,6 +10723,7 @@ void ObjectMgr::LoadRaceAndClassExpansionRequirements()
}
temp[raceID][classID] = { activeExpansionLevel, accountExpansionLevel };
+ minRequirementForClass[classID] = std::min(minRequirementForClass[classID], activeExpansionLevel);
++count;
}
@@ -10707,19 +10731,18 @@ void ObjectMgr::LoadRaceAndClassExpansionRequirements()
for (auto&& race : temp)
{
- _classExpansionRequirementStore.emplace_back();
+ RaceClassAvailability& raceClassAvailability = _classExpansionRequirementStore.emplace_back();
- RaceClassAvailability& raceClassAvailability = _classExpansionRequirementStore.back();
raceClassAvailability.RaceID = race.first;
for (auto&& class_ : race.second)
{
- raceClassAvailability.Classes.emplace_back();
+ ClassAvailability& classAvailability = raceClassAvailability.Classes.emplace_back();
- ClassAvailability& classAvailability = raceClassAvailability.Classes.back();
classAvailability.ClassID = class_.first;
classAvailability.ActiveExpansionLevel = class_.second.first;
classAvailability.AccountExpansionLevel = class_.second.second;
+ classAvailability.MinActiveExpansionLevel = minRequirementForClass[class_.first];
}
}
@@ -10804,6 +10827,16 @@ ClassAvailability const* ObjectMgr::GetClassExpansionRequirement(uint8 raceId, u
return &(*classItr);
}
+ClassAvailability const* ObjectMgr::GetClassExpansionRequirementFallback(uint8 classId) const
+{
+ for (RaceClassAvailability const& raceClassAvailability : _classExpansionRequirementStore)
+ for (ClassAvailability const& classAvailability : raceClassAvailability.Classes)
+ if (classAvailability.ClassID == classId)
+ return &classAvailability;
+
+ return nullptr;
+}
+
PlayerChoice const* ObjectMgr::GetPlayerChoice(int32 choiceId) const
{
return Trinity::Containers::MapGetValuePtr(_playerChoices, choiceId);
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index ff49968a296..fe5cb6877c5 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -44,6 +44,7 @@ class Item;
class Unit;
class Vehicle;
class Map;
+enum class GossipOptionFlags : int32;
enum class GossipOptionNpc : uint8;
struct AccessRequirement;
struct DeclinedName;
@@ -662,6 +663,7 @@ struct PlayerInfo
CreatePosition createPosition;
Optional<CreatePosition> createPositionNPE;
+ ItemContext itemContext;
PlayerCreateInfoItems item;
PlayerCreateInfoSpells customSpells;
PlayerCreateInfoSpells castSpells[size_t(PlayerCreateMode::Max)];
@@ -743,25 +745,25 @@ struct PointOfInterest
struct GossipMenuItems
{
uint32 MenuID;
- uint32 OptionID;
+ int32 GossipOptionID;
+ uint32 OrderIndex;
GossipOptionNpc OptionNpc;
std::string OptionText;
uint32 OptionBroadcastTextID;
uint32 Language;
+ GossipOptionFlags Flags;
uint32 ActionMenuID;
uint32 ActionPoiID;
+ Optional<int32> GossipNpcOptionID;
bool BoxCoded;
uint32 BoxMoney;
std::string BoxText;
uint32 BoxBroadcastTextID;
+ Optional<int32> SpellID;
+ Optional<int32> OverrideIconID;
ConditionContainer Conditions;
};
-struct GossipMenuItemAddon
-{
- Optional<int32> GarrTalentTreeID;
-};
-
struct GossipMenus
{
uint32 MenuID;
@@ -779,7 +781,6 @@ typedef std::pair<GossipMenusContainer::const_iterator, GossipMenusContainer::co
typedef std::pair<GossipMenusContainer::iterator, GossipMenusContainer::iterator> GossipMenusMapBoundsNonConst;
typedef std::multimap<uint32, GossipMenuItems> GossipMenuItemsContainer;
typedef std::unordered_map<uint32, GossipMenuAddon> GossipMenuAddonContainer;
-typedef std::unordered_map<std::pair<uint32, uint32>, GossipMenuItemAddon> GossipMenuItemAddonContainer;
struct QuestPOIBlobPoint
{
@@ -1043,6 +1044,7 @@ struct ClassAvailability
uint8 ClassID = 0;
uint8 ActiveExpansionLevel = 0;
uint8 AccountExpansionLevel = 0;
+ uint8 MinActiveExpansionLevel = 0;
};
struct RaceClassAvailability
@@ -1401,7 +1403,6 @@ class TC_GAME_API ObjectMgr
void LoadGossipMenu();
void LoadGossipMenuItems();
void LoadGossipMenuAddon();
- void LoadGossipMenuItemAddon();
void LoadVendors();
void LoadTrainers();
@@ -1704,13 +1705,6 @@ class TC_GAME_API ObjectMgr
return &itr->second;
return nullptr;
}
- GossipMenuItemAddon const* GetGossipMenuItemAddon(uint32 menuId, uint32 optionId) const
- {
- auto itr = _gossipMenuItemAddonStore.find({ menuId, optionId });
- if (itr != _gossipMenuItemAddonStore.end())
- return &itr->second;
- return nullptr;
- }
// for wintergrasp only
GraveyardContainer GraveyardStore;
@@ -1781,6 +1775,7 @@ class TC_GAME_API ObjectMgr
std::vector<RaceClassAvailability> const& GetClassExpansionRequirements() const { return _classExpansionRequirementStore; }
ClassAvailability const* GetClassExpansionRequirement(uint8 raceId, uint8 classId) const;
+ ClassAvailability const* GetClassExpansionRequirementFallback(uint8 classId) const;
SceneTemplate const* GetSceneTemplate(uint32 sceneId) const
{
@@ -1845,7 +1840,6 @@ class TC_GAME_API ObjectMgr
GossipMenusContainer _gossipMenusStore;
GossipMenuItemsContainer _gossipMenuItemsStore;
GossipMenuAddonContainer _gossipMenuAddonStore;
- GossipMenuItemAddonContainer _gossipMenuItemAddonStore;
PointOfInterestContainer _pointsOfInterestStore;
QuestPOIContainer _questPOIStore;
@@ -1913,7 +1907,7 @@ class TC_GAME_API ObjectMgr
void BuildPlayerLevelInfo(uint8 race, uint8 class_, uint8 level, PlayerLevelInfo* plinfo) const;
- std::unique_ptr<PlayerInfo> _playerInfo[MAX_RACES][MAX_CLASSES];
+ std::unordered_map<std::pair<Races, Classes>, std::unique_ptr<PlayerInfo>> _playerInfo;
typedef std::vector<uint32> PlayerXPperLevel; // [level]
PlayerXPperLevel _playerXPperLevel;
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index 3b565aa9c6c..a3333319b29 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -100,6 +100,7 @@ enum GroupFlags
GROUP_FLAG_ONE_PERSON_PARTY = 0x020, // Script_IsOnePersonParty()
GROUP_FLAG_EVERYONE_ASSISTANT = 0x040, // Script_IsEveryoneAssistant()
GROUP_FLAG_GUILD_GROUP = 0x100,
+ GROUP_FLAG_CROSS_FACTION = 0x200,
GROUP_MASK_BGRAID = GROUP_FLAG_FAKE_RAID | GROUP_FLAG_RAID,
};
diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp
index 6afd1b5d476..7be557d368b 100644
--- a/src/server/game/Handlers/AuthHandler.cpp
+++ b/src/server/game/Handlers/AuthHandler.cpp
@@ -93,6 +93,7 @@ void WorldSession::SendSetTimeZoneInformation()
WorldPackets::System::SetTimeZoneInformation packet;
packet.ServerTimeTZ = "Europe/Paris";
packet.GameTimeTZ = "Europe/Paris";
+ packet.ServerRegionalTZ = "Europe/Paris";
SendPacket(packet.Write());
}
diff --git a/src/server/game/Handlers/AzeriteHandler.cpp b/src/server/game/Handlers/AzeriteHandler.cpp
index 376ad24bd62..a6d951b1a65 100644
--- a/src/server/game/Handlers/AzeriteHandler.cpp
+++ b/src/server/game/Handlers/AzeriteHandler.cpp
@@ -20,6 +20,7 @@
#include "AzeriteItem.h"
#include "AzeritePackets.h"
#include "DB2Stores.h"
+#include "NPCPackets.h"
#include "Player.h"
#include "SpellHistory.h"
@@ -236,5 +237,9 @@ void WorldSession::HandleAzeriteEmpoweredItemSelectPower(WorldPackets::Azerite::
void WorldSession::SendAzeriteRespecNPC(ObjectGuid npc)
{
- SendPacket(WorldPackets::Azerite::AzeriteRespecNPC(npc).Write());
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = npc;
+ npcInteraction.InteractionType = PlayerInteractionType::AzeriteRespec;
+ npcInteraction.Success = true;
+ SendPacket(npcInteraction.Write());
}
diff --git a/src/server/game/Handlers/BankHandler.cpp b/src/server/game/Handlers/BankHandler.cpp
index 84f13afff83..4c300b01e35 100644
--- a/src/server/game/Handlers/BankHandler.cpp
+++ b/src/server/game/Handlers/BankHandler.cpp
@@ -197,13 +197,13 @@ void WorldSession::HandleReagentBankDepositOpcode(WorldPackets::Bank::ReagentBan
if (msg != EQUIP_ERR_OK)
{
if (msg != EQUIP_ERR_REAGENT_BANK_FULL || !anyDeposited)
- _player->SendEquipError(msg, item, NULL);
+ _player->SendEquipError(msg, item, nullptr);
break;
}
if (dest.size() == 1 && dest[0].pos == item->GetPos())
{
- _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, NULL);
+ _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, nullptr);
continue;
}
@@ -236,13 +236,13 @@ void WorldSession::HandleAutoBankReagentOpcode(WorldPackets::Bank::AutoBankReage
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, item, false, true, true);
if (msg != EQUIP_ERR_OK)
{
- _player->SendEquipError(msg, item, NULL);
+ _player->SendEquipError(msg, item, nullptr);
return;
}
if (dest.size() == 1 && dest[0].pos == item->GetPos())
{
- _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, NULL);
+ _player->SendEquipError(EQUIP_ERR_CANT_SWAP, item, nullptr);
return;
}
@@ -274,7 +274,7 @@ void WorldSession::HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStor
InventoryResult msg = _player->CanStoreItem(NULL_BAG, NULL_SLOT, dest, pItem, false);
if (msg != EQUIP_ERR_OK)
{
- _player->SendEquipError(msg, pItem, NULL);
+ _player->SendEquipError(msg, pItem, nullptr);
return;
}
@@ -287,7 +287,7 @@ void WorldSession::HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStor
InventoryResult msg = _player->CanBankItem(NULL_BAG, NULL_SLOT, dest, pItem, false, true, true);
if (msg != EQUIP_ERR_OK)
{
- _player->SendEquipError(msg, pItem, NULL);
+ _player->SendEquipError(msg, pItem, nullptr);
return;
}
@@ -299,7 +299,9 @@ void WorldSession::HandleAutoStoreBankReagentOpcode(WorldPackets::Bank::AutoStor
void WorldSession::SendShowBank(ObjectGuid guid)
{
m_currentBankerGUID = guid;
- WorldPackets::NPC::ShowBank packet;
- packet.Guid = guid;
- SendPacket(packet.Write());
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = guid;
+ npcInteraction.InteractionType = PlayerInteractionType::Banker;
+ npcInteraction.Success = true;
+ SendPacket(npcInteraction.Write());
}
diff --git a/src/server/game/Handlers/BlackMarketHandler.cpp b/src/server/game/Handlers/BlackMarketHandler.cpp
index ea3052a7953..88353f9c735 100644
--- a/src/server/game/Handlers/BlackMarketHandler.cpp
+++ b/src/server/game/Handlers/BlackMarketHandler.cpp
@@ -21,8 +21,8 @@
#include "DatabaseEnv.h"
#include "Item.h"
#include "Log.h"
+#include "NPCPackets.h"
#include "Player.h"
-#include "WorldPacket.h"
void WorldSession::HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen& blackMarketOpen)
{
@@ -42,10 +42,11 @@ void WorldSession::HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketO
void WorldSession::SendBlackMarketOpenResult(ObjectGuid guid, Creature* /*auctioneer*/)
{
- WorldPackets::BlackMarket::BlackMarketOpenResult packet;
- packet.Guid = guid;
- packet.Enable = sBlackMarketMgr->IsEnabled();
- SendPacket(packet.Write());
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = guid;
+ npcInteraction.InteractionType = PlayerInteractionType::BlackMarketAuctioneer;
+ npcInteraction.Success = sBlackMarketMgr->IsEnabled();
+ SendPacket(npcInteraction.Write());
}
void WorldSession::HandleBlackMarketRequestItems(WorldPackets::BlackMarket::BlackMarketRequestItems& blackMarketRequestItems)
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index d02d01f512b..98adc84d6fe 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -515,6 +515,15 @@ bool WorldSession::MeetsChrCustomizationReq(ChrCustomizationReqEntry const* req,
if (req->ItemModifiedAppearanceID && !GetCollectionMgr()->HasItemAppearance(req->ItemModifiedAppearanceID).first)
return false;
+ if (req->QuestID)
+ {
+ if (!_player)
+ return false;
+
+ if (!_player->IsQuestRewarded(req->QuestID))
+ return false;
+ }
+
if (checkRequiredDependentChoices)
{
if (std::unordered_map<uint32, std::vector<uint32>> const* requiredChoices = sDB2Manager.GetRequiredCustomizationChoices(req->ID))
@@ -667,20 +676,32 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
//}
// prevent character creating Expansion class without Expansion account
- ClassAvailability const* classExpansionRequirement = sObjectMgr->GetClassExpansionRequirement(charCreate.CreateInfo->Race, charCreate.CreateInfo->Class);
- if (!classExpansionRequirement)
+ if (ClassAvailability const* raceClassExpansionRequirement = sObjectMgr->GetClassExpansionRequirement(charCreate.CreateInfo->Race, charCreate.CreateInfo->Class))
{
- TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character for race/class combination that is missing requirements in db (%u/%u)",
- GetAccountExpansion(), GetAccountId(), uint32(charCreate.CreateInfo->Race), uint32(charCreate.CreateInfo->Class));
- SendCharCreate(CHAR_CREATE_EXPANSION_CLASS);
- return;
+ if (raceClassExpansionRequirement->ActiveExpansionLevel > GetExpansion() || raceClassExpansionRequirement->AccountExpansionLevel > GetAccountExpansion())
+ {
+ TC_LOG_ERROR("entities.player.cheat", "Account:[%d] tried to create character with race/class %u/%u without required expansion (had %u/%u, required %u/%u)",
+ GetAccountId(), uint32(charCreate.CreateInfo->Race), uint32(charCreate.CreateInfo->Class), GetExpansion(), GetAccountExpansion(),
+ raceClassExpansionRequirement->ActiveExpansionLevel, raceClassExpansionRequirement->AccountExpansionLevel);
+ SendCharCreate(CHAR_CREATE_EXPANSION_CLASS);
+ return;
+ }
}
-
- if (classExpansionRequirement->ActiveExpansionLevel > GetExpansion() || classExpansionRequirement->AccountExpansionLevel > GetAccountExpansion())
+ else if (ClassAvailability const* classExpansionRequirement = sObjectMgr->GetClassExpansionRequirementFallback(charCreate.CreateInfo->Class))
+ {
+ if (classExpansionRequirement->MinActiveExpansionLevel > GetExpansion() || classExpansionRequirement->AccountExpansionLevel > GetAccountExpansion())
+ {
+ TC_LOG_ERROR("entities.player.cheat", "Account:[%d] tried to create character with race/class %u/%u without required expansion (had %u/%u, required %u/%u)",
+ GetAccountId(), uint32(charCreate.CreateInfo->Race), uint32(charCreate.CreateInfo->Class), GetExpansion(), GetAccountExpansion(),
+ classExpansionRequirement->ActiveExpansionLevel, classExpansionRequirement->AccountExpansionLevel);
+ SendCharCreate(CHAR_CREATE_EXPANSION_CLASS);
+ return;
+ }
+ }
+ else
{
- TC_LOG_ERROR("entities.player.cheat", "Account:[%d] tried to create character with race/class %u/%u without required expansion (had %u/%u, required %u/%u)",
- GetAccountId(), uint32(charCreate.CreateInfo->Race), uint32(charCreate.CreateInfo->Class), GetExpansion(), GetAccountExpansion(),
- classExpansionRequirement->ActiveExpansionLevel, classExpansionRequirement->AccountExpansionLevel);
+ TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character for race/class combination that is missing requirements in db (%u/%u)",
+ GetAccountExpansion(), GetAccountId(), uint32(charCreate.CreateInfo->Race), uint32(charCreate.CreateInfo->Class));
SendCharCreate(CHAR_CREATE_EXPANSION_CLASS);
return;
}
@@ -792,9 +813,14 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
bool haveSameRace = false;
uint32 demonHunterReqLevel = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER);
bool hasDemonHunterReqLevel = (demonHunterReqLevel == 0);
+ uint32 evokerReqLevel = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_EVOKER);
+ bool hasEvokerReqLevel = (evokerReqLevel == 0);
bool allowTwoSideAccounts = !sWorld->IsPvPRealm() || HasPermission(rbac::RBAC_PERM_TWO_SIDE_CHARACTER_CREATION);
uint32 skipCinematics = sWorld->getIntConfig(CONFIG_SKIP_CINEMATICS);
- bool checkDemonHunterReqs = createInfo->Class == CLASS_DEMON_HUNTER && !HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEMON_HUNTER);
+ bool checkClassLevelReqs = (createInfo->Class == CLASS_DEMON_HUNTER || createInfo->Class == CLASS_EVOKER)
+ && !HasPermission(rbac::RBAC_PERM_SKIP_CHECK_CHARACTER_CREATION_DEMON_HUNTER);
+ int32 evokerLimit = sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM);
+ bool hasEvokerLimit = evokerLimit != 0;
if (result)
{
@@ -802,8 +828,9 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
Field* field = result->Fetch();
uint8 accRace = field[1].GetUInt8();
+ uint8 accClass = field[2].GetUInt8();
- if (checkDemonHunterReqs)
+ if (checkClassLevelReqs)
{
if (!hasDemonHunterReqLevel)
{
@@ -811,8 +838,17 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
if (accLevel >= demonHunterReqLevel)
hasDemonHunterReqLevel = true;
}
+ if (!hasEvokerReqLevel)
+ {
+ uint8 accLevel = field[0].GetUInt8();
+ if (accLevel >= evokerReqLevel)
+ hasEvokerReqLevel = true;
+ }
}
+ if (accClass == CLASS_EVOKER)
+ --evokerLimit;
+
// need to check team only for first character
/// @todo what to if account already has characters of both races?
if (!allowTwoSideAccounts)
@@ -830,18 +866,19 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
// search same race for cinematic or same class if need
/// @todo check if cinematic already shown? (already logged in?; cinematic field)
- while ((skipCinematics == 1 && !haveSameRace) || createInfo->Class == CLASS_DEMON_HUNTER)
+ while ((skipCinematics == 1 && !haveSameRace) || createInfo->Class == CLASS_DEMON_HUNTER || createInfo->Class == CLASS_EVOKER)
{
if (!result->NextRow())
break;
field = result->Fetch();
accRace = field[1].GetUInt8();
+ accClass = field[2].GetUInt8();
if (!haveSameRace)
haveSameRace = createInfo->Race == accRace;
- if (checkDemonHunterReqs)
+ if (checkClassLevelReqs)
{
if (!hasDemonHunterReqLevel)
{
@@ -849,13 +886,36 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
if (accLevel >= demonHunterReqLevel)
hasDemonHunterReqLevel = true;
}
+ if (!hasEvokerReqLevel)
+ {
+ uint8 accLevel = field[0].GetUInt8();
+ if (accLevel >= evokerReqLevel)
+ hasEvokerReqLevel = true;
+ }
}
+
+ if (accClass == CLASS_EVOKER)
+ --evokerLimit;
+ }
+ }
+
+ if (checkClassLevelReqs)
+ {
+ if (!hasDemonHunterReqLevel)
+ {
+ SendCharCreate(CHAR_CREATE_NEW_PLAYER);
+ return;
+ }
+ if (!hasEvokerReqLevel)
+ {
+ SendCharCreate(CHAR_CREATE_DRACTHYR_LEVEL_REQUIREMENT);
+ return;
}
}
- if (checkDemonHunterReqs && !hasDemonHunterReqLevel)
+ if (createInfo->Class == CLASS_EVOKER && hasEvokerLimit && evokerLimit < 1)
{
- SendCharCreate(CHAR_CREATE_NEW_PLAYER);
+ SendCharCreate(CHAR_CREATE_DRACTHYR_DUPLICATE);
return;
}
@@ -922,7 +982,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_CREATE_INFO);
stmt->setUInt32(0, GetAccountId());
- stmt->setUInt32(1, (skipCinematics == 1 || createInfo->Class == CLASS_DEMON_HUNTER) ? 1200 : 1); // 200 (max chars per realm) + 1000 (max deleted chars per realm)
+ stmt->setUInt32(1, (skipCinematics == 1 || createInfo->Class == CLASS_DEMON_HUNTER || createInfo->Class == CLASS_EVOKER) ? 1200 : 1); // 200 (max chars per realm) + 1000 (max deleted chars per realm)
queryCallback.WithPreparedCallback(std::move(finalizeCharacterCreation)).SetNextQuery(CharacterDatabase.AsyncQuery(stmt));
}));
}
diff --git a/src/server/game/Handlers/ChatHandler.cpp b/src/server/game/Handlers/ChatHandler.cpp
index d5c92e8cf63..b6b89f9b0b4 100644
--- a/src/server/game/Handlers/ChatHandler.cpp
+++ b/src/server/game/Handlers/ChatHandler.cpp
@@ -217,7 +217,7 @@ void WorldSession::HandleChatMessage(ChatMsg type, Language lang, std::string ms
return;
}
- if (msg.size() > 255)
+ if (msg.size() > 511)
return;
if (msg.empty())
@@ -564,7 +564,7 @@ void WorldSession::HandleChatMessageAFKOpcode(WorldPackets::Chat::ChatMessageAFK
if (sender->IsInCombat())
return;
- if (chatMessageAFK.Text.length() > 255)
+ if (chatMessageAFK.Text.length() > 511)
return;
// do message validity checks
@@ -610,7 +610,7 @@ void WorldSession::HandleChatMessageDNDOpcode(WorldPackets::Chat::ChatMessageDND
if (sender->IsInCombat())
return;
- if (chatMessageDND.Text.length() > 255)
+ if (chatMessageDND.Text.length() > 511)
return;
// do message validity checks
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 554dc5038ae..2f102c2304c 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -955,8 +955,8 @@ void WorldSession::HandleSocketGems(WorldPackets::Item::SocketGems& socketGems)
gems[i] = gem;
gemData[i].ItemId = gem->GetEntry();
gemData[i].Context = gem->m_itemData->Context;
- for (std::size_t b = 0; b < gem->m_itemData->BonusListIDs->size() && b < 16; ++b)
- gemData[i].BonusListIDs[b] = (*gem->m_itemData->BonusListIDs)[b];
+ for (std::size_t b = 0; b < gem->GetBonusListIDs().size() && b < 16; ++b)
+ gemData[i].BonusListIDs[b] = gem->GetBonusListIDs()[b];
gemProperties[i] = sGemPropertiesStore.LookupEntry(gem->GetTemplate()->GetGemProperties());
}
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index d19a83da7a7..644ae8e9881 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -29,7 +29,6 @@
#include "Item.h"
#include "ItemPackets.h"
#include "Log.h"
-#include "MailPackets.h"
#include "Map.h"
#include "NPCPackets.h"
#include "ObjectMgr.h"
@@ -39,7 +38,6 @@
#include "ReputationMgr.h"
#include "SpellInfo.h"
#include "Trainer.h"
-#include "World.h"
#include "WorldPacket.h"
enum class StableResult : uint8
@@ -71,16 +69,20 @@ void WorldSession::HandleTabardVendorActivateOpcode(WorldPackets::NPC::Hello& pa
void WorldSession::SendTabardVendorActivate(ObjectGuid guid)
{
- WorldPackets::NPC::PlayerTabardVendorActivate packet;
- packet.Vendor = guid;
- SendPacket(packet.Write());
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = guid;
+ npcInteraction.InteractionType = PlayerInteractionType::TabardVendor;
+ npcInteraction.Success = true;
+ SendPacket(npcInteraction.Write());
}
void WorldSession::SendShowMailBox(ObjectGuid guid)
{
- WorldPackets::Mail::ShowMailbox packet;
- packet.PostmasterGUID = guid;
- SendPacket(packet.Write());
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = guid;
+ npcInteraction.InteractionType = PlayerInteractionType::MailInfo;
+ npcInteraction.Success = true;
+ SendPacket(npcInteraction.Write());
}
void WorldSession::HandleTrainerListOpcode(WorldPackets::NPC::Hello& packet)
@@ -188,7 +190,8 @@ void WorldSession::HandleGossipHelloOpcode(WorldPackets::NPC::Hello& packet)
void WorldSession::HandleGossipSelectOptionOpcode(WorldPackets::NPC::GossipSelectOption& packet)
{
- if (!_player->PlayerTalkClass->GetGossipMenu().GetItem(packet.GossipIndex))
+ GossipMenuItem const* gossipMenuItem = _player->PlayerTalkClass->GetGossipMenu().GetItem(packet.GossipOptionID);
+ if (!gossipMenuItem)
return;
// Prevent cheating on C++ scripted menus
@@ -242,26 +245,26 @@ void WorldSession::HandleGossipSelectOptionOpcode(WorldPackets::NPC::GossipSelec
{
if (unit)
{
- if (!unit->AI()->OnGossipSelectCode(_player, packet.GossipID, packet.GossipIndex, packet.PromotionCode.c_str()))
- _player->OnGossipSelect(unit, packet.GossipIndex, packet.GossipID);
+ if (!unit->AI()->OnGossipSelectCode(_player, packet.GossipID, gossipMenuItem->OrderIndex, packet.PromotionCode.c_str()))
+ _player->OnGossipSelect(unit, packet.GossipOptionID, packet.GossipID);
}
else
{
- if (!go->AI()->OnGossipSelectCode(_player, packet.GossipID, packet.GossipIndex, packet.PromotionCode.c_str()))
- _player->OnGossipSelect(go, packet.GossipIndex, packet.GossipID);
+ if (!go->AI()->OnGossipSelectCode(_player, packet.GossipID, gossipMenuItem->OrderIndex, packet.PromotionCode.c_str()))
+ _player->OnGossipSelect(go, packet.GossipOptionID, packet.GossipID);
}
}
else
{
if (unit)
{
- if (!unit->AI()->OnGossipSelect(_player, packet.GossipID, packet.GossipIndex))
- _player->OnGossipSelect(unit, packet.GossipIndex, packet.GossipID);
+ if (!unit->AI()->OnGossipSelect(_player, packet.GossipID, gossipMenuItem->OrderIndex))
+ _player->OnGossipSelect(unit, packet.GossipOptionID, packet.GossipID);
}
else
{
- if (!go->AI()->OnGossipSelect(_player, packet.GossipID, packet.GossipIndex))
- _player->OnGossipSelect(go, packet.GossipIndex, packet.GossipID);
+ if (!go->AI()->OnGossipSelect(_player, packet.GossipID, gossipMenuItem->OrderIndex))
+ _player->OnGossipSelect(go, packet.GossipOptionID, packet.GossipID);
}
}
}
diff --git a/src/server/game/Handlers/TransmogrificationHandler.cpp b/src/server/game/Handlers/TransmogrificationHandler.cpp
index 855fd3bebb3..21606cc4bde 100644
--- a/src/server/game/Handlers/TransmogrificationHandler.cpp
+++ b/src/server/game/Handlers/TransmogrificationHandler.cpp
@@ -20,6 +20,7 @@
#include "DB2Stores.h"
#include "Item.h"
#include "Log.h"
+#include "NPCPackets.h"
#include "ObjectMgr.h"
#include "Player.h"
#include "TransmogrificationPackets.h"
@@ -331,5 +332,9 @@ void WorldSession::HandleTransmogrifyItems(WorldPackets::Transmogrification::Tra
void WorldSession::SendOpenTransmogrifier(ObjectGuid const& guid)
{
- SendPacket(WorldPackets::Transmogrification::TransmogrifyNPC(guid).Write());
+ WorldPackets::NPC::NPCInteractionOpenResult npcInteraction;
+ npcInteraction.Npc = guid;
+ npcInteraction.InteractionType = PlayerInteractionType::Transmogrifier;
+ npcInteraction.Success = true;
+ SendPacket(npcInteraction.Write());
}
diff --git a/src/server/game/Handlers/VoidStorageHandler.cpp b/src/server/game/Handlers/VoidStorageHandler.cpp
index a586e64672c..cf9eb5b307a 100644
--- a/src/server/game/Handlers/VoidStorageHandler.cpp
+++ b/src/server/game/Handlers/VoidStorageHandler.cpp
@@ -155,7 +155,7 @@ void WorldSession::HandleVoidStorageTransfer(WorldPackets::VoidStorage::VoidStor
VoidStorageItem itemVS(sObjectMgr->GenerateVoidStorageItemId(), item->GetEntry(), item->GetCreator(),
item->GetItemRandomBonusListId(), item->GetModifier(ITEM_MODIFIER_TIMEWALKER_LEVEL), item->GetModifier(ITEM_MODIFIER_ARTIFACT_KNOWLEDGE_LEVEL),
- item->GetContext(), item->m_itemData->BonusListIDs);
+ item->GetContext(), item->GetBonusListIDs());
WorldPackets::VoidStorage::VoidItem voidItem;
voidItem.Guid = ObjectGuid::Create<HighGuid::Item>(itemVS.ItemId);
diff --git a/src/server/game/Loot/Loot.h b/src/server/game/Loot/Loot.h
index 29eabb373d9..b13ae06ff9d 100644
--- a/src/server/game/Loot/Loot.h
+++ b/src/server/game/Loot/Loot.h
@@ -159,6 +159,17 @@ enum LootSlotType
LOOT_SLOT_TYPE_OWNER = 4 // ignore binding confirmation and etc, for single player looting
};
+enum class LootRollIneligibilityReason : uint32
+{
+ None = 0,
+ UnusableByClass = 1, // Your class may not roll need on this item.
+ MaxUniqueItemCount = 2, // You already have the maximum amount of this item.
+ CannotBeDisenchanted = 3, // This item may not be disenchanted.
+ EnchantingSkillTooLow = 4, // You do not have an Enchanter of skill %d in your group.
+ NeedDisabled = 5, // Need rolls are disabled for this item.
+ OwnBetterItem = 6 // You already have a powerful version of this item.
+};
+
struct TC_GAME_API LootItem
{
uint32 itemid;
diff --git a/src/server/game/Loot/LootItemStorage.h b/src/server/game/Loot/LootItemStorage.h
index 9ff9ff55310..3a0c635e96b 100644
--- a/src/server/game/Loot/LootItemStorage.h
+++ b/src/server/game/Loot/LootItemStorage.h
@@ -63,7 +63,7 @@ class StoredLootContainer
void RemoveMoney();
void RemoveItem(uint32 itemId, uint32 count, uint32 itemIndex);
- uint32 GetContainer() const { return _containerId; }
+ uint64 GetContainer() const { return _containerId; }
uint32 GetMoney() const { return _money; }
StoredLootItemContainer const& GetLootItems() const { return _lootItems; }
diff --git a/src/server/game/Maps/TransportMgr.cpp b/src/server/game/Maps/TransportMgr.cpp
index 59835a201f5..5c597960fc6 100644
--- a/src/server/game/Maps/TransportMgr.cpp
+++ b/src/server/game/Maps/TransportMgr.cpp
@@ -531,15 +531,9 @@ void TransportMgr::GeneratePath(GameObjectTemplate const* goInfo, TransportTempl
InitializeLeg(leg, &transport->Events, pathPoints, pauses, events, goInfo, totalTime);
if (transport->MapIds.size() > 1)
- {
for (uint32 mapId : transport->MapIds)
ASSERT(!sMapStore.LookupEntry(mapId)->Instanceable());
- transport->InInstance = false;
- }
- else
- transport->InInstance = sMapStore.LookupEntry(*transport->MapIds.begin())->Instanceable();
-
transport->TotalPathTime = totalTime;
}
@@ -578,6 +572,12 @@ Transport* TransportMgr::CreateTransport(uint32 entry, Map* map, ObjectGuid::Low
return nullptr;
}
+ if (tInfo->MapIds.find(map->GetId()) == tInfo->MapIds.end())
+ {
+ TC_LOG_ERROR("entities.transport", "Transport %u attempted creation on map it has no path for %u!", entry, map->GetId());
+ return nullptr;
+ }
+
Optional<Position> startingPosition = tInfo->ComputePosition(0, nullptr, nullptr);
if (!startingPosition)
{
@@ -589,7 +589,6 @@ Transport* TransportMgr::CreateTransport(uint32 entry, Map* map, ObjectGuid::Low
Transport* trans = new Transport();
// ...at first waypoint
- uint32 mapId = tInfo->PathLegs.front().MapId;
float x = startingPosition->GetPositionX();
float y = startingPosition->GetPositionY();
float z = startingPosition->GetPositionZ();
@@ -605,16 +604,6 @@ Transport* TransportMgr::CreateTransport(uint32 entry, Map* map, ObjectGuid::Low
PhasingHandler::InitDbPhaseShift(trans->GetPhaseShift(), phaseUseFlags, phaseId, phaseGroupId);
- if (MapEntry const* mapEntry = sMapStore.LookupEntry(mapId))
- {
- if (mapEntry->Instanceable() != tInfo->InInstance)
- {
- TC_LOG_ERROR("entities.transport", "Transport %u (name: %s) attempted creation in instance map (id: %u) but it is not an instanced transport!", entry, trans->GetName().c_str(), mapId);
- delete trans;
- return nullptr;
- }
- }
-
// use preset map for instances (need to know which instance)
trans->SetMap(map);
if (InstanceMap* instanceMap = map->ToInstanceMap())
diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h
index cdf5841a851..0c576cf9a02 100644
--- a/src/server/game/Maps/TransportMgr.h
+++ b/src/server/game/Maps/TransportMgr.h
@@ -103,7 +103,6 @@ struct TransportTemplate
double CalculateDistanceMoved(double timePassedInSegment, double segmentDuration, bool isFirstSegment, bool isLastSegment) const;
std::set<uint32> MapIds;
- bool InInstance = false;
};
struct TC_GAME_API TransportAnimation
diff --git a/src/server/game/Miscellaneous/RaceMask.h b/src/server/game/Miscellaneous/RaceMask.h
index 673cd8af26c..2c1e1a29932 100644
--- a/src/server/game/Miscellaneous/RaceMask.h
+++ b/src/server/game/Miscellaneous/RaceMask.h
@@ -61,18 +61,27 @@ enum Races
RACE_DARK_IRON_DWARF = 34, // TITLE Dark Iron Dwarf DESCRIPTION Dark Iron Dwarf (RaceMask bit 11)
RACE_VULPERA = 35, // TITLE Vulpera DESCRIPTION Vulpera (RaceMask bit 12)
RACE_MAGHAR_ORC = 36, // TITLE Mag'har Orc DESCRIPTION Mag'har Orc (RaceMask bit 13)
- RACE_MECHAGNOME = 37 // TITLE Mechagnome DESCRIPTION Mechagnome (RaceMask bit 14)
+ RACE_MECHAGNOME = 37, // TITLE Mechagnome DESCRIPTION Mechagnome (RaceMask bit 14)
+ RACE_DRACTHYR_ALLIANCE = 52, // TITLE Dracthyr DESCRIPTION Dracthyr (Alliance) (RaceMask bit 16)
+ RACE_DRACTHYR_HORDE = 70, // TITLE Dracthyr DESCRIPTION Dracthyr (Horde) (RaceMask bit 15)
+ //RACE_COMPANION_DRAKE = 71,
+ //RACE_COMPANION_PROTO_DRAGON = 72,
+ //RACE_COMPANION_SERPENT = 73,
+ //RACE_COMPANION_WYVERN = 74,
+ //RACE_DRACTHYR_VISAGE_ALLIANCE = 75,
+ //RACE_DRACTHYR_VISAGE_HORDE= 76,
+ //RACE_COMPANION_PTERRODAX = 77
};
// max+1 for player race
-#define MAX_RACES 38
+#define MAX_RACES 78
namespace Trinity
{
template<typename T>
struct RaceMask
{
- static_assert(std::is_integral<T>::value, "RaceMask<T> must be integral");
+ static_assert(std::is_integral_v<T>, "RaceMask<T> must be integral");
T RawValue;
@@ -81,16 +90,54 @@ struct RaceMask
return (RawValue & GetMaskForRace(raceId)) != 0;
}
- static constexpr T GetMaskForRace(uint8 raceId)
+ static constexpr int32 GetRaceBit(uint8 raceId)
{
- constexpr int32 raceBits[MAX_RACES] =
+ switch (raceId)
{
- 0, 0, 1, 2, 3, 4, 5, 6, 7, 8,
- 9, 10, -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 21, -1, 23, 24, 25, 26, 27, 28,
- 29, 30, 31, -1, 11, 12, 13, 14
- };
- return raceId < MAX_RACES && raceBits[raceId] >= 0 && raceBits[raceId] < 64 ? (T(1) << raceBits[raceId]) : T(0);
+ case RACE_HUMAN:
+ case RACE_ORC:
+ case RACE_DWARF:
+ case RACE_NIGHTELF:
+ case RACE_UNDEAD_PLAYER:
+ case RACE_TAUREN:
+ case RACE_GNOME:
+ case RACE_TROLL:
+ case RACE_GOBLIN:
+ case RACE_BLOODELF:
+ case RACE_DRAENEI:
+ case RACE_WORGEN:
+ case RACE_PANDAREN_NEUTRAL:
+ case RACE_PANDAREN_ALLIANCE:
+ case RACE_PANDAREN_HORDE:
+ case RACE_NIGHTBORNE:
+ case RACE_HIGHMOUNTAIN_TAUREN:
+ case RACE_VOID_ELF:
+ case RACE_LIGHTFORGED_DRAENEI:
+ case RACE_ZANDALARI_TROLL:
+ case RACE_KUL_TIRAN:
+ return raceId - 1;
+ case RACE_DARK_IRON_DWARF:
+ return 11;
+ case RACE_VULPERA:
+ return 12;
+ case RACE_MAGHAR_ORC:
+ return 13;
+ case RACE_MECHAGNOME:
+ return 14;
+ case RACE_DRACTHYR_ALLIANCE:
+ return 16;
+ case RACE_DRACTHYR_HORDE:
+ return 15;
+ default:
+ break;
+ }
+ return -1;
+ }
+
+ static constexpr T GetMaskForRace(uint8 raceId)
+ {
+ int32 raceBit = GetRaceBit(raceId);
+ return raceBit >= 0 && uint32(raceBit) < sizeof(T) * 8 ? (T(1) << raceBit) : T(0);
}
constexpr bool IsEmpty() const { return RawValue == T(0); }
@@ -127,7 +174,9 @@ constexpr Trinity::RaceMask<uint64> RACEMASK_ALL_PLAYABLE = { std::integral_cons
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DARK_IRON_DWARF) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_VULPERA) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MAGHAR_ORC) |
- Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME)>::value };
+ Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME) |
+ Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_ALLIANCE) |
+ Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_HORDE)>::value };
constexpr Trinity::RaceMask<uint64> RACEMASK_NEUTRAL = { std::integral_constant<uint64, Trinity::RaceMask<uint64>::GetMaskForRace(RACE_PANDAREN_NEUTRAL)>::value };
@@ -143,7 +192,8 @@ constexpr Trinity::RaceMask<uint64> RACEMASK_ALLIANCE = { std::integral_constant
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_LIGHTFORGED_DRAENEI) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_KUL_TIRAN) |
Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DARK_IRON_DWARF) |
- Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME)>::value };
+ Trinity::RaceMask<uint64>::GetMaskForRace(RACE_MECHAGNOME) |
+ Trinity::RaceMask<uint64>::GetMaskForRace(RACE_DRACTHYR_ALLIANCE)>::value };
constexpr Trinity::RaceMask<uint64> RACEMASK_HORDE = { std::integral_constant<uint64, (RACEMASK_ALL_PLAYABLE & ~(RACEMASK_NEUTRAL | RACEMASK_ALLIANCE)).RawValue>::value };
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index c7a9f4ee74b..02bf5a512fb 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -89,12 +89,13 @@ enum Expansions
EXPANSION_LEGION = 6,
EXPANSION_BATTLE_FOR_AZEROTH = 7,
EXPANSION_SHADOWLANDS = 8,
+ EXPANSION_DRAGONFLIGHT = 9,
MAX_EXPANSIONS,
MAX_ACCOUNT_EXPANSIONS
};
-#define CURRENT_EXPANSION EXPANSION_SHADOWLANDS
+#define CURRENT_EXPANSION EXPANSION_DRAGONFLIGHT
constexpr uint32 GetMaxLevelForExpansion(uint32 expansion)
{
@@ -118,6 +119,8 @@ constexpr uint32 GetMaxLevelForExpansion(uint32 expansion)
return 50;
case EXPANSION_SHADOWLANDS:
return 60;
+ case EXPANSION_DRAGONFLIGHT:
+ return 70;
default:
break;
}
@@ -148,11 +151,13 @@ enum Classes : uint8
CLASS_WARLOCK = 9, // TITLE Warlock
CLASS_MONK = 10, // TITLE Monk
CLASS_DRUID = 11, // TITLE Druid
- CLASS_DEMON_HUNTER = 12 // TITLE Demon Hunter
+ CLASS_DEMON_HUNTER = 12, // TITLE Demon Hunter
+ CLASS_EVOKER = 13, // TITLE Evoker
+ CLASS_ADVENTURER = 14 // TITLE Adventurer
};
// max+1 for player class
-#define MAX_CLASSES 13
+#define MAX_CLASSES 15
#define CLASSMASK_ALL_PLAYABLE \
((1<<(CLASS_WARRIOR-1)) | \
@@ -166,7 +171,8 @@ enum Classes : uint8
(1<<(CLASS_WARLOCK-1)) | \
(1<<(CLASS_MONK-1)) | \
(1<<(CLASS_DRUID-1)) | \
- (1<<(CLASS_DEMON_HUNTER-1)))
+ (1<<(CLASS_DEMON_HUNTER-1)) | \
+ (1<<(CLASS_EVOKER-1)))
// valid classes for creature_template.unit_class
enum UnitClass
@@ -288,7 +294,8 @@ enum Powers : int8
POWER_ARCANE_CHARGES = 16, // TITLE Arcane Charges
POWER_FURY = 17, // TITLE Fury
POWER_PAIN = 18, // TITLE Pain
- MAX_POWERS = 19, // SKIP
+ POWER_ESSENCE = 19, // TITLE Essence
+ MAX_POWERS = 20, // SKIP
POWER_ALL = 127 // SKIP
};
@@ -1050,32 +1057,6 @@ enum CharacterFlags4 : uint32
CHARACTER_FLAG_4_EXPANSION_TRIAL = 0x00080000,
};
-#define PLAYER_CUSTOM_DISPLAY_SIZE 3
-
-enum CharacterSlot
-{
- SLOT_HEAD = 0,
- SLOT_NECK = 1,
- SLOT_SHOULDERS = 2,
- SLOT_SHIRT = 3,
- SLOT_CHEST = 4,
- SLOT_WAIST = 5,
- SLOT_LEGS = 6,
- SLOT_FEET = 7,
- SLOT_WRISTS = 8,
- SLOT_HANDS = 9,
- SLOT_FINGER1 = 10,
- SLOT_FINGER2 = 11,
- SLOT_TRINKET1 = 12,
- SLOT_TRINKET2 = 13,
- SLOT_BACK = 14,
- SLOT_MAIN_HAND = 15,
- SLOT_OFF_HAND = 16,
- SLOT_RANGED = 17,
- SLOT_TABARD = 18,
- SLOT_EMPTY = 19
-};
-
// Languages.db2 (9.2.0.42423)
enum Language
{
@@ -1433,8 +1414,23 @@ enum SpellEffectName
SPELL_EFFECT_MODIFY_KEYSTONE_2 = 285,
SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE = 286,
SPELL_EFFECT_SET_GARRISON_FOLLOWER_LEVEL = 287,
- SPELL_EFFECT_288 = 288,
- SPELL_EFFECT_289 = 289,
+ SPELL_EFFECT_CRAFT_ITEM = 288, // MiscValue[0] = CraftingDataID
+ SPELL_EFFECT_MODIFY_AURA_STACKS = 289, // MiscValue[0] = 0 means add, = 1 means set
+ SPELL_EFFECT_MODIFY_COOLDOWN = 290,
+ SPELL_EFFECT_MODIFY_COOLDOWNS = 291, // MiscValue[0] = SpellFamily, MiscValue[1] = maybe bit index for family flags? off by 1 for the only spell using this effect
+ SPELL_EFFECT_MODIFY_COOLDOWNS_BY_CATEGORY = 292, // MiscValue[0] = category
+ SPELL_EFFECT_MODIFY_CHARGES = 293, // MiscValue[0] = charge category
+ SPELL_EFFECT_CRAFT_LOOT = 294, // MiscValue[0] = CraftingDataID
+ SPELL_EFFECT_SALVAGE_ITEM = 295, // MiscValue[0] = ItemSalvageID
+ SPELL_EFFECT_CRAFT_SALVAGE_ITEM = 296, // MiscValue[0] = ItemSalvageID, MiscValue[1] = CraftingDataID
+ SPELL_EFFECT_RECRAFT_ITEM = 297,
+ SPELL_EFFECT_CANCEL_ALL_PRIVATE_CONVERSATIONS = 298,
+ SPELL_EFFECT_299 = 299, // something with items, as of 10.0.2 all spells are named "Downgrading"
+ SPELL_EFFECT_300 = 300,
+ SPELL_EFFECT_CRAFT_ENCHANT = 301, // MiscValue[0] = CraftingDataID, MiscValue[1] = ?
+ SPELL_EFFECT_GATHERING = 302,
+ SPELL_EFFECT_CREATE_TRAIT_TREE_CONFIG = 303, // MiscValue[0] = TraitTreeID
+ SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG = 304,
TOTAL_SPELL_EFFECTS
};
@@ -1457,8 +1453,8 @@ enum SpellCastResult
SPELL_FAILED_BAD_TARGETS = 13,
SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED = 14,
SPELL_FAILED_CANT_BE_CHARMED = 15,
- SPELL_FAILED_CANT_BE_DISENCHANTED = 16,
- SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 17,
+ SPELL_FAILED_CANT_BE_SALVAGED = 16,
+ SPELL_FAILED_CANT_BE_SALVAGED_SKILL = 17,
SPELL_FAILED_CANT_BE_ENCHANTED = 18,
SPELL_FAILED_CANT_BE_MILLED = 19,
SPELL_FAILED_CANT_BE_PROSPECTED = 20,
@@ -1751,13 +1747,16 @@ enum SpellCastResult
SPELL_FAILED_INELIGIBLE_WEAPON_APPEARANCE = 307,
SPELL_FAILED_PLAYER_CONDITION = 308,
SPELL_FAILED_NOT_WHILE_CHROMIE_TIMED = 309,
- SPELL_FAILED_OPTIONAL_REAGENTS = 310,
+ SPELL_FAILED_CRAFTING_REAGENTS = 310,
SPELL_FAILED_SPECTATOR_OR_COMMENTATOR = 311,
SPELL_FAILED_SOULBIND_CONDUIT_LEARN_FAILED_INVALID_COVENANT = 312,
SPELL_FAILED_SHADOWLANDS_RIDING_REQUIREMENT = 313,
SPELL_FAILED_NOT_IN_MAGE_TOWER = 314,
SPELL_FAILED_GARRISON_FOLLOWER_AT_MIN_LEVEL = 315,
- SPELL_FAILED_UNKNOWN = 316,
+ SPELL_FAILED_CANT_BE_RECRAFTED = 316,
+ SPELL_FAILED_PASSIVE_REPLACED = 317,
+ SPELL_FAILED_CANT_FLY_HERE = 318,
+ SPELL_FAILED_UNKNOWN = 319,
// ok cast value - here in case a future version removes SPELL_FAILED_SUCCESS and we need to use a custom value (not sent to client either way)
SPELL_CAST_OK = SPELL_FAILED_SUCCESS // SKIP
@@ -2341,7 +2340,45 @@ enum SpellCustomErrors
SPELL_CUSTOM_ERROR_YOU_HAVE_OTHER_WAYS_TO_SUMMON_POCOPOC = 635, // You have other ways to summon Pocopoc while in Zereth Mortis.
SPELL_CUSTOM_ERROR_REQUIRES_MORE_SYLLABIC_RECALL = 636, // Requires more Syllabic Recall.
SPELL_CUSTOM_ERROR_THIS_BATTLE_PET_CANNOT_RIDE_ON_MAGIC_SAUCER = 637, // This battle pet is unable to ride on the Magic Saucer.
+ SPELL_CUSTOM_ERROR_YOU_CAN_ONLY_DO_THIS_WHILE_MIDAIR = 638, // You can only do this while midair.
+ SPELL_CUSTOM_ERROR_YOU_CANNOT_DO_THAT_WHILE_AIRBORNE = 639, // You cannot do that while airborne.
SPELL_CUSTOM_ERROR_POCOPOC_IS_UNAVAILABLE_ON_QUESTLINE = 640, // Pocopoc is unavailable to summon during the questline A Means to an End.
+ SPELL_CUSTOM_ERROR_REQUIRES_SULFURON_SLAMMER = 711, // Requires Sulfuron Slammer
+ SPELL_CUSTOM_ERROR_NOT_READY_YET = 788, // Not ready yet.
+ SPELL_CUSTOM_ERROR_QUALITY_OF_TIERED_MEDALLION_SETTING_IS_TOO_LOW = 789, // The quality of your Tiered Medallion Setting is too low to add another socket to this item.
+ SPELL_CUSTOM_ERROR_YOU_HAVE_NOT_LEARNED_BARREL_ROLL = 790, // You have not learned Barrel Roll.
+ SPELL_CUSTOM_ERROR_TARGET_MUST_BE_AN_ELITE_ELEMENTAL = 791, // Target must be an Elite Elemental.
+ SPELL_CUSTOM_ERROR_SKILL_CHECK_ALREADY_FAILED = 792, // Skill check already failed.
+ SPELL_CUSTOM_ERROR_YOUR_TARGET_WAS_RECENTLY_FED = 793, // Your target was recently fed.
+ SPELL_CUSTOM_ERROR_CANNOT_LURE_ELUSIVE_CREATURE_TOWARDS_TOWN = 794, // You cannot lure an elusive creature towards a town.
+ SPELL_CUSTOM_ERROR_NO_WORTHWHILE_CREATURES_IN_AREA_TO_LURE_OUT = 795, // There are no worthwhile creatures in this area to lure out.
+ SPELL_CUSTOM_ERROR_CANNOT_LURE_WILD_BEAST = 796, // This is a daycare for whelps. Why would you try to lure a wild beast here...?
+ SPELL_CUSTOM_ERROR_YOU_HAVE_NO_ARCANE_ESSENCES_IN_YOUR_INVENTORY = 797, // You have no Arcane Essences in your inventory.
+ SPELL_CUSTOM_ERROR_THAT_PLAYER_IS_CURRENTLY_NOT_INTERESTED_IN_ENGAGING_WITH_YOUR_SHENANIGANS = 798, // That player is currently not interested in engaging with your shenanigans.
+ SPELL_CUSTOM_ERROR_CANT_BE_CAST_ON_NON_PLAYER_CHARACTERS = 799, // Can't be cast on Non Player Characters.
+ SPELL_CUSTOM_ERROR_A_SIGNAL_FLARE_WAS_RECENTLY_FIRED_AT_THIS_LOCATION = 800, // A signal flare was recently fired at this location.
+ SPELL_CUSTOM_ERROR_THIS_TINKER_IS_TOO_COMPLICATED_FOR_YOU = 801, // This tinker is too complicated for you.
+ SPELL_CUSTOM_ERROR_THE_DUCK_REFUSES_TO_PLAY_WHILE_ANOTHER_MAESTRO_IS_NEARBY = 802, // The duck refuses to play while another maestro is nearby.
+ SPELL_CUSTOM_ERROR_YOU_HAVE_STUDIED_THESE_NOTES_EXTENSIVELYAND_THERE_IS_NOTHING_NEW_TO_LEARN_FROM_THEM = 803, // You have studied these notes extensively and there is nothing new to learn from them.
+ SPELL_CUSTOM_ERROR_YOU_DONT_HAVE_ENOUGH_GOLD = 804, // You don't have enough gold.
+ SPELL_CUSTOM_ERROR_YOU_DO_NOT_KNOW_HOW_TO_TAME_OTTUK = 805, // You do not know how to tame Ottuk.
+ SPELL_CUSTOM_ERROR_CLAN_AYLAAG_IS_CURRENTLY_TRAVELLINGAND_CANNOT_BE_TELEPORTED_TO = 806, // Clan Aylaag is currently travelling and cannot be teleported to.
+ SPELL_CUSTOM_ERROR_NOT_ENOUGH_INSANITY = 807, // Not enough insanity
+ SPELL_CUSTOM_ERROR_YOU_MUST_WAIT_TO_ACCESS_THIS_AGAIN = 808, // You must wait to access this again.
+ SPELL_CUSTOM_ERROR_YOU_DO_NOT_KNOW_HOW_TO_TAME_DRAGONKIN = 809, // You do not know how to tame Dragonkin.
+ SPELL_CUSTOM_ERROR_REQUIRES_AN_EMPTY_SOUL_CAGE = 810, // Requires an Empty Soul Cage.
+ SPELL_CUSTOM_ERROR_YOU_ALREADY_HAVE_A_CAGED_SOUL_OF_THAT_TYPE = 811, // You already have a caged soul of that type.
+ SPELL_CUSTOM_ERROR_YOU_CANT_DO_THAT_HERE = 812, // You can't do that here.
+ SPELL_CUSTOM_ERROR_YOU_DO_NOT_HAVE_ANY_ELEMENTAL_GEMS_SOCKETED = 813, // You do not have any elemental gems socketed.
+ SPELL_CUSTOM_ERROR_YOU_MUST_BE_IN_THE_DRAGON_ISLES = 814, // You must be in the Dragon Isles.
+ SPELL_CUSTOM_ERROR_YOU_CANNOT_DO_THAT_WHILE_UNDERWATER = 815, // You cannot do that while underwater.
+ SPELL_CUSTOM_ERROR_YOU_MUST_BE_RIDING_A_STOLEN_TAME_MAGMAMMOTH = 816, // You must be riding a stolen Tame Magmammoth.
+ SPELL_CUSTOM_ERROR_YOU_MUST_BE_FLYING_ABOVE_WATER_INSIDE_AN_ACTIVE_TUSKARR_FISHING_HOLE = 817, // You must be flying above water inside an active Tuskarr Fishing Hole.
+ SPELL_CUSTOM_ERROR_YOU_ARE_ALREADY_BRAVE_ENOUGH_TO_CONTINUE_WITH_YOUR_EXPERIMENTATION = 818, // You are already brave enough to continue with your experimentation.
+ SPELL_CUSTOM_ERROR_YOU_DONT_KNOW_HOW_TO_REPAIR_THIS_ITEM = 819, // You don't know how to repair this item.
+ SPELL_CUSTOM_ERROR_THERE_IS_NO_MORE_ROOM_ON_THAT_HANDHOLD = 820, // There is no more room on that handhold.
+ SPELL_CUSTOM_ERROR_YOU_MUST_UNBLOCK_THIS_SPOT_BY_COMPLETING_A_DAILY_QUest = 821, // You must unblock this spot by completing a daily quest.
+ SPELL_CUSTOM_ERROR_YOU_MUST_BE_CLOSER_TO_AN_ICE_HOLE_TO_DO_THAT = 822, // You must be closer to an ice hole to do that.
};
enum StealthType
@@ -3543,6 +3580,12 @@ enum Emote : uint32
EMOTE_ONESHOT_FLYCUSTOMSPELL01 = 992,
EMOTE_ONESHOT_SPELLEFFECT_DECAY = 993,
EMOTE_STATE_CREATURE_SPECIAL = 994,
+ EMOTE_ONESHOT_WAREACT01 = 1001,
+ EMOTE_ONESHOT_FLYCUSTOMSPELL04 = 1004,
+ EMOTE_ONESHOT_TALK_SUBDUED = 1005,
+ EMOTE_STATE_EMOTETALK = 1006,
+ EMOTE_STATE_WAINTERACTION = 1007,
+ EMOTE_ONESHOT_TAKE_OFF_START = 1009,
};
// AnimationData.db2 (6.0.2.18988)
@@ -5776,14 +5819,16 @@ enum ChatMsg : int32
enum ChatFlags
{
- CHAT_FLAG_NONE = 0x00,
- CHAT_FLAG_AFK = 0x01,
- CHAT_FLAG_DND = 0x02,
- CHAT_FLAG_GM = 0x04,
- CHAT_FLAG_COM = 0x08, // Commentator
- CHAT_FLAG_DEV = 0x10,
- CHAT_FLAG_BOSS_SOUND = 0x20, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper
- CHAT_FLAG_MOBILE = 0x40
+ CHAT_FLAG_NONE = 0x0000,
+ CHAT_FLAG_AFK = 0x0001,
+ CHAT_FLAG_DND = 0x0002,
+ CHAT_FLAG_GM = 0x0004,
+ CHAT_FLAG_COM = 0x0008, // Commentator
+ CHAT_FLAG_DEV = 0x0010,
+ CHAT_FLAG_BOSS_SOUND = 0x0020, // Plays "RaidBossEmoteWarning" sound on raid boss emote/whisper
+ CHAT_FLAG_MOBILE = 0x0040,
+ CHAT_FLAG_GUIDE = 0x1000,
+ CHAT_FLAG_NEWCOMER = 0x2000
};
enum ChatLinkColors : uint32
@@ -6007,60 +6052,64 @@ enum ResponseCodes
CHAR_CREATE_CHARACTER_IN_COMMUNITY = 49,
CHAR_CREATE_NEW_PLAYER = 50,
CHAR_CREATE_NAME_RESERVATION_FULL = 51,
- CHAR_CREATE_CLASS_TRIAL_NEWCOMER = 52,
- CHAR_CREATE_CLASS_TRIAL_THROTTLE_HOUR = 53,
- CHAR_CREATE_CLASS_TRIAL_THROTTLE_DAY = 54,
- CHAR_CREATE_CLASS_TRIAL_THROTTLE_WEEK = 55,
- CHAR_CREATE_CLASS_TRIAL_THROTTLE_ACCOUNT = 56,
-
- CHAR_DELETE_IN_PROGRESS = 57,
- CHAR_DELETE_SUCCESS = 58,
- CHAR_DELETE_FAILED = 59,
- CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 60,
- CHAR_DELETE_FAILED_GUILD_LEADER = 61,
- CHAR_DELETE_FAILED_ARENA_CAPTAIN = 62,
- CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 63,
- CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 64,
- CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 65,
- CHAR_DELETE_FAILED_VAS_TRANSACTION_IN_PROGRESS = 66,
- CHAR_DELETE_FAILED_COMMUNITY_OWNER = 67,
-
- CHAR_LOGIN_IN_PROGRESS = 68,
- CHAR_LOGIN_SUCCESS = 69,
- CHAR_LOGIN_NO_WORLD = 70,
- CHAR_LOGIN_DUPLICATE_CHARACTER = 71,
- CHAR_LOGIN_NO_INSTANCES = 72,
- CHAR_LOGIN_FAILED = 73,
- CHAR_LOGIN_DISABLED = 74,
- CHAR_LOGIN_NO_CHARACTER = 75,
- CHAR_LOGIN_LOCKED_FOR_TRANSFER = 76,
- CHAR_LOGIN_LOCKED_BY_BILLING = 77,
- CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 78,
- CHAR_LOGIN_TEMPORARY_GM_LOCK = 79,
- CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 80,
- CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 81,
- CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 82,
- CHAR_LOGIN_LOCKED_BY_RESTRICTION = 83,
- CHAR_LOGIN_LOCKED_FOR_REALM_PLAYTYPE = 84,
-
- CHAR_NAME_SUCCESS = 85,
- CHAR_NAME_FAILURE = 86,
- CHAR_NAME_NO_NAME = 87,
- CHAR_NAME_TOO_SHORT = 88,
- CHAR_NAME_TOO_LONG = 89,
- CHAR_NAME_INVALID_CHARACTER = 90,
- CHAR_NAME_MIXED_LANGUAGES = 91,
- CHAR_NAME_PROFANE = 92,
- CHAR_NAME_RESERVED = 93,
- CHAR_NAME_INVALID_APOSTROPHE = 94,
- CHAR_NAME_MULTIPLE_APOSTROPHES = 95,
- CHAR_NAME_THREE_CONSECUTIVE = 96,
- CHAR_NAME_INVALID_SPACE = 97,
- CHAR_NAME_CONSECUTIVE_SPACES = 98,
- CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 99,
- CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 100,
- CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 101,
- CHAR_NAME_SPACES_DISALLOWED = 102,
+ CHAR_CREATE_DRACTHYR_DUPLICATE = 52,
+ CHAR_CREATE_DRACTHYR_LEVEL_REQUIREMENT = 53,
+ CHAR_CREATE_DEATHKNIGHT_DUPLICATE = 54,
+ CHAR_CREATE_DEATHKNIGHT_LEVEL_REQUIREMENT = 55,
+ CHAR_CREATE_CLASS_TRIAL_NEWCOMER = 56,
+ CHAR_CREATE_CLASS_TRIAL_THROTTLE_HOUR = 57,
+ CHAR_CREATE_CLASS_TRIAL_THROTTLE_DAY = 58,
+ CHAR_CREATE_CLASS_TRIAL_THROTTLE_WEEK = 59,
+ CHAR_CREATE_CLASS_TRIAL_THROTTLE_ACCOUNT = 60,
+
+ CHAR_DELETE_IN_PROGRESS = 61,
+ CHAR_DELETE_SUCCESS = 62,
+ CHAR_DELETE_FAILED = 63,
+ CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 64,
+ CHAR_DELETE_FAILED_GUILD_LEADER = 65,
+ CHAR_DELETE_FAILED_ARENA_CAPTAIN = 66,
+ CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 67,
+ CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 68,
+ CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 69,
+ CHAR_DELETE_FAILED_VAS_TRANSACTION_IN_PROGRESS = 70,
+ CHAR_DELETE_FAILED_COMMUNITY_OWNER = 71,
+
+ CHAR_LOGIN_IN_PROGRESS = 72,
+ CHAR_LOGIN_SUCCESS = 73,
+ CHAR_LOGIN_NO_WORLD = 74,
+ CHAR_LOGIN_DUPLICATE_CHARACTER = 75,
+ CHAR_LOGIN_NO_INSTANCES = 76,
+ CHAR_LOGIN_FAILED = 77,
+ CHAR_LOGIN_DISABLED = 78,
+ CHAR_LOGIN_NO_CHARACTER = 79,
+ CHAR_LOGIN_LOCKED_FOR_TRANSFER = 80,
+ CHAR_LOGIN_LOCKED_BY_BILLING = 81,
+ CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 82,
+ CHAR_LOGIN_TEMPORARY_GM_LOCK = 83,
+ CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 84,
+ CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 85,
+ CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 86,
+ CHAR_LOGIN_LOCKED_BY_RESTRICTION = 87,
+ CHAR_LOGIN_LOCKED_FOR_REALM_PLAYTYPE = 88,
+
+ CHAR_NAME_SUCCESS = 89,
+ CHAR_NAME_FAILURE = 90,
+ CHAR_NAME_NO_NAME = 91,
+ CHAR_NAME_TOO_SHORT = 92,
+ CHAR_NAME_TOO_LONG = 93,
+ CHAR_NAME_INVALID_CHARACTER = 94,
+ CHAR_NAME_MIXED_LANGUAGES = 95,
+ CHAR_NAME_PROFANE = 96,
+ CHAR_NAME_RESERVED = 97,
+ CHAR_NAME_INVALID_APOSTROPHE = 98,
+ CHAR_NAME_MULTIPLE_APOSTROPHES = 99,
+ CHAR_NAME_THREE_CONSECUTIVE = 100,
+ CHAR_NAME_INVALID_SPACE = 101,
+ CHAR_NAME_CONSECUTIVE_SPACES = 102,
+ CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 103,
+ CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 104,
+ CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 105,
+ CHAR_NAME_SPACES_DISALLOWED = 106,
};
enum CharacterUndeleteResult
@@ -6274,6 +6323,7 @@ enum SpellFamilyNames : uint8
SPELLFAMILY_UNK91 = 91,
SPELLFAMILY_UNK100 = 100,
SPELLFAMILY_DEMON_HUNTER = 107,
+ SPELLFAMILY_EVOKER = 224
};
enum TradeStatus
@@ -6669,1074 +6719,1098 @@ enum class GameError : uint32
ERR_AMMO_ONLY = 19,
ERR_NO_SLOT_AVAILABLE = 20,
ERR_WRONG_BAG_TYPE = 21,
- ERR_ITEM_MAX_COUNT = 22,
- ERR_NOT_EQUIPPABLE = 23,
- ERR_CANT_STACK = 24,
- ERR_CANT_SWAP = 25,
- ERR_SLOT_EMPTY = 26,
- ERR_ITEM_NOT_FOUND = 27,
- ERR_TOO_FEW_TO_SPLIT = 28,
- ERR_SPLIT_FAILED = 29,
- ERR_NOT_A_BAG = 30,
- ERR_NOT_OWNER = 31,
- ERR_ONLY_ONE_QUIVER = 32,
- ERR_NO_BANK_SLOT = 33,
- ERR_NO_BANK_HERE = 34,
- ERR_ITEM_LOCKED = 35,
- ERR_2HANDED_EQUIPPED = 36,
- ERR_VENDOR_NOT_INTERESTED = 37,
- ERR_VENDOR_REFUSE_SCRAPPABLE_AZERITE = 38,
- ERR_VENDOR_HATES_YOU = 39,
- ERR_VENDOR_SOLD_OUT = 40,
- ERR_VENDOR_TOO_FAR = 41,
- ERR_VENDOR_DOESNT_BUY = 42,
- ERR_NOT_ENOUGH_MONEY = 43,
- ERR_RECEIVE_ITEM_S = 44,
- ERR_DROP_BOUND_ITEM = 45,
- ERR_TRADE_BOUND_ITEM = 46,
- ERR_TRADE_QUEST_ITEM = 47,
- ERR_TRADE_TEMP_ENCHANT_BOUND = 48,
- ERR_TRADE_GROUND_ITEM = 49,
- ERR_TRADE_BAG = 50,
- ERR_TRADE_FACTION_SPECIFIC = 51,
- ERR_SPELL_FAILED_S = 52,
- ERR_ITEM_COOLDOWN = 53,
- ERR_POTION_COOLDOWN = 54,
- ERR_FOOD_COOLDOWN = 55,
- ERR_SPELL_COOLDOWN = 56,
- ERR_ABILITY_COOLDOWN = 57,
- ERR_SPELL_ALREADY_KNOWN_S = 58,
- ERR_PET_SPELL_ALREADY_KNOWN_S = 59,
- ERR_PROFICIENCY_GAINED_S = 60,
- ERR_SKILL_GAINED_S = 61,
- ERR_SKILL_UP_SI = 62,
- ERR_LEARN_SPELL_S = 63,
- ERR_LEARN_ABILITY_S = 64,
- ERR_LEARN_PASSIVE_S = 65,
- ERR_LEARN_RECIPE_S = 66,
- ERR_LEARN_COMPANION_S = 67,
- ERR_LEARN_MOUNT_S = 68,
- ERR_LEARN_TOY_S = 69,
- ERR_LEARN_HEIRLOOM_S = 70,
- ERR_LEARN_TRANSMOG_S = 71,
- ERR_COMPLETED_TRANSMOG_SET_S = 72,
- ERR_APPEARANCE_ALREADY_LEARNED = 73,
- ERR_REVOKE_TRANSMOG_S = 74,
- ERR_INVITE_PLAYER_S = 75,
- ERR_INVITE_SELF = 76,
- ERR_INVITED_TO_GROUP_SS = 77,
- ERR_INVITED_ALREADY_IN_GROUP_SS = 78,
- ERR_ALREADY_IN_GROUP_S = 79,
- ERR_CROSS_REALM_RAID_INVITE = 80,
- ERR_PLAYER_BUSY_S = 81,
- ERR_NEW_LEADER_S = 82,
- ERR_NEW_LEADER_YOU = 83,
- ERR_NEW_GUIDE_S = 84,
- ERR_NEW_GUIDE_YOU = 85,
- ERR_LEFT_GROUP_S = 86,
- ERR_LEFT_GROUP_YOU = 87,
- ERR_GROUP_DISBANDED = 88,
- ERR_DECLINE_GROUP_S = 89,
- ERR_JOINED_GROUP_S = 90,
- ERR_UNINVITE_YOU = 91,
- ERR_BAD_PLAYER_NAME_S = 92,
- ERR_NOT_IN_GROUP = 93,
- ERR_TARGET_NOT_IN_GROUP_S = 94,
- ERR_TARGET_NOT_IN_INSTANCE_S = 95,
- ERR_NOT_IN_INSTANCE_GROUP = 96,
- ERR_GROUP_FULL = 97,
- ERR_NOT_LEADER = 98,
- ERR_PLAYER_DIED_S = 99,
- ERR_GUILD_CREATE_S = 100,
- ERR_GUILD_INVITE_S = 101,
- ERR_INVITED_TO_GUILD_SSS = 102,
- ERR_ALREADY_IN_GUILD_S = 103,
- ERR_ALREADY_INVITED_TO_GUILD_S = 104,
- ERR_INVITED_TO_GUILD = 105,
- ERR_ALREADY_IN_GUILD = 106,
- ERR_GUILD_ACCEPT = 107,
- ERR_GUILD_DECLINE_S = 108,
- ERR_GUILD_DECLINE_AUTO_S = 109,
- ERR_GUILD_PERMISSIONS = 110,
- ERR_GUILD_JOIN_S = 111,
- ERR_GUILD_FOUNDER_S = 112,
- ERR_GUILD_PROMOTE_SSS = 113,
- ERR_GUILD_DEMOTE_SS = 114,
- ERR_GUILD_DEMOTE_SSS = 115,
- ERR_GUILD_INVITE_SELF = 116,
- ERR_GUILD_QUIT_S = 117,
- ERR_GUILD_LEAVE_S = 118,
- ERR_GUILD_REMOVE_SS = 119,
- ERR_GUILD_REMOVE_SELF = 120,
- ERR_GUILD_DISBAND_S = 121,
- ERR_GUILD_DISBAND_SELF = 122,
- ERR_GUILD_LEADER_S = 123,
- ERR_GUILD_LEADER_SELF = 124,
- ERR_GUILD_PLAYER_NOT_FOUND_S = 125,
- ERR_GUILD_PLAYER_NOT_IN_GUILD_S = 126,
- ERR_GUILD_PLAYER_NOT_IN_GUILD = 127,
- ERR_GUILD_CANT_PROMOTE_S = 128,
- ERR_GUILD_CANT_DEMOTE_S = 129,
- ERR_GUILD_NOT_IN_A_GUILD = 130,
- ERR_GUILD_INTERNAL = 131,
- ERR_GUILD_LEADER_IS_S = 132,
- ERR_GUILD_LEADER_CHANGED_SS = 133,
- ERR_GUILD_DISBANDED = 134,
- ERR_GUILD_NOT_ALLIED = 135,
- ERR_GUILD_LEADER_LEAVE = 136,
- ERR_GUILD_RANKS_LOCKED = 137,
- ERR_GUILD_RANK_IN_USE = 138,
- ERR_GUILD_RANK_TOO_HIGH_S = 139,
- ERR_GUILD_RANK_TOO_LOW_S = 140,
- ERR_GUILD_NAME_EXISTS_S = 141,
- ERR_GUILD_WITHDRAW_LIMIT = 142,
- ERR_GUILD_NOT_ENOUGH_MONEY = 143,
- ERR_GUILD_TOO_MUCH_MONEY = 144,
- ERR_GUILD_BANK_CONJURED_ITEM = 145,
- ERR_GUILD_BANK_EQUIPPED_ITEM = 146,
- ERR_GUILD_BANK_BOUND_ITEM = 147,
- ERR_GUILD_BANK_QUEST_ITEM = 148,
- ERR_GUILD_BANK_WRAPPED_ITEM = 149,
- ERR_GUILD_BANK_FULL = 150,
- ERR_GUILD_BANK_WRONG_TAB = 151,
- ERR_NO_GUILD_CHARTER = 152,
- ERR_OUT_OF_RANGE = 153,
- ERR_PLAYER_DEAD = 154,
- ERR_CLIENT_LOCKED_OUT = 155,
- ERR_CLIENT_ON_TRANSPORT = 156,
- ERR_KILLED_BY_S = 157,
- ERR_LOOT_LOCKED = 158,
- ERR_LOOT_TOO_FAR = 159,
- ERR_LOOT_DIDNT_KILL = 160,
- ERR_LOOT_BAD_FACING = 161,
- ERR_LOOT_NOTSTANDING = 162,
- ERR_LOOT_STUNNED = 163,
- ERR_LOOT_NO_UI = 164,
- ERR_LOOT_WHILE_INVULNERABLE = 165,
- ERR_NO_LOOT = 166,
- ERR_QUEST_ACCEPTED_S = 167,
- ERR_QUEST_COMPLETE_S = 168,
- ERR_QUEST_FAILED_S = 169,
- ERR_QUEST_FAILED_BAG_FULL_S = 170,
- ERR_QUEST_FAILED_MAX_COUNT_S = 171,
- ERR_QUEST_FAILED_LOW_LEVEL = 172,
- ERR_QUEST_FAILED_MISSING_ITEMS = 173,
- ERR_QUEST_FAILED_WRONG_RACE = 174,
- ERR_QUEST_FAILED_NOT_ENOUGH_MONEY = 175,
- ERR_QUEST_FAILED_EXPANSION = 176,
- ERR_QUEST_ONLY_ONE_TIMED = 177,
- ERR_QUEST_NEED_PREREQS = 178,
- ERR_QUEST_NEED_PREREQS_CUSTOM = 179,
- ERR_QUEST_ALREADY_ON = 180,
- ERR_QUEST_ALREADY_DONE = 181,
- ERR_QUEST_ALREADY_DONE_DAILY = 182,
- ERR_QUEST_HAS_IN_PROGRESS = 183,
- ERR_QUEST_REWARD_EXP_I = 184,
- ERR_QUEST_REWARD_MONEY_S = 185,
- ERR_QUEST_MUST_CHOOSE = 186,
- ERR_QUEST_LOG_FULL = 187,
- ERR_COMBAT_DAMAGE_SSI = 188,
- ERR_INSPECT_S = 189,
- ERR_CANT_USE_ITEM = 190,
- ERR_CANT_USE_ITEM_IN_ARENA = 191,
- ERR_CANT_USE_ITEM_IN_RATED_BATTLEGROUND = 192,
- ERR_MUST_EQUIP_ITEM = 193,
- ERR_PASSIVE_ABILITY = 194,
- ERR_2HSKILLNOTFOUND = 195,
- ERR_NO_ATTACK_TARGET = 196,
- ERR_INVALID_ATTACK_TARGET = 197,
- ERR_ATTACK_PVP_TARGET_WHILE_UNFLAGGED = 198,
- ERR_ATTACK_STUNNED = 199,
- ERR_ATTACK_PACIFIED = 200,
- ERR_ATTACK_MOUNTED = 201,
- ERR_ATTACK_FLEEING = 202,
- ERR_ATTACK_CONFUSED = 203,
- ERR_ATTACK_CHARMED = 204,
- ERR_ATTACK_DEAD = 205,
- ERR_ATTACK_PREVENTED_BY_MECHANIC_S = 206,
- ERR_ATTACK_CHANNEL = 207,
- ERR_TAXISAMENODE = 208,
- ERR_TAXINOSUCHPATH = 209,
- ERR_TAXIUNSPECIFIEDSERVERERROR = 210,
- ERR_TAXINOTENOUGHMONEY = 211,
- ERR_TAXITOOFARAWAY = 212,
- ERR_TAXINOVENDORNEARBY = 213,
- ERR_TAXINOTVISITED = 214,
- ERR_TAXIPLAYERBUSY = 215,
- ERR_TAXIPLAYERALREADYMOUNTED = 216,
- ERR_TAXIPLAYERSHAPESHIFTED = 217,
- ERR_TAXIPLAYERMOVING = 218,
- ERR_TAXINOPATHS = 219,
- ERR_TAXINOTELIGIBLE = 220,
- ERR_TAXINOTSTANDING = 221,
- ERR_NO_REPLY_TARGET = 222,
- ERR_GENERIC_NO_TARGET = 223,
- ERR_INITIATE_TRADE_S = 224,
- ERR_TRADE_REQUEST_S = 225,
- ERR_TRADE_BLOCKED_S = 226,
- ERR_TRADE_TARGET_DEAD = 227,
- ERR_TRADE_TOO_FAR = 228,
- ERR_TRADE_CANCELLED = 229,
- ERR_TRADE_COMPLETE = 230,
- ERR_TRADE_BAG_FULL = 231,
- ERR_TRADE_TARGET_BAG_FULL = 232,
- ERR_TRADE_MAX_COUNT_EXCEEDED = 233,
- ERR_TRADE_TARGET_MAX_COUNT_EXCEEDED = 234,
- ERR_INVENTORY_TRADE_TOO_MANY_UNIQUE_ITEM = 235,
- ERR_ALREADY_TRADING = 236,
- ERR_MOUNT_INVALIDMOUNTEE = 237,
- ERR_MOUNT_TOOFARAWAY = 238,
- ERR_MOUNT_ALREADYMOUNTED = 239,
- ERR_MOUNT_NOTMOUNTABLE = 240,
- ERR_MOUNT_NOTYOURPET = 241,
- ERR_MOUNT_OTHER = 242,
- ERR_MOUNT_LOOTING = 243,
- ERR_MOUNT_RACECANTMOUNT = 244,
- ERR_MOUNT_SHAPESHIFTED = 245,
- ERR_MOUNT_NO_FAVORITES = 246,
- ERR_MOUNT_NO_MOUNTS = 247,
- ERR_DISMOUNT_NOPET = 248,
- ERR_DISMOUNT_NOTMOUNTED = 249,
- ERR_DISMOUNT_NOTYOURPET = 250,
- ERR_SPELL_FAILED_TOTEMS = 251,
- ERR_SPELL_FAILED_REAGENTS = 252,
- ERR_SPELL_FAILED_REAGENTS_GENERIC = 253,
- ERR_SPELL_FAILED_OPTIONAL_REAGENTS = 254,
- ERR_CANT_TRADE_GOLD = 255,
- ERR_SPELL_FAILED_EQUIPPED_ITEM = 256,
- ERR_SPELL_FAILED_EQUIPPED_ITEM_CLASS_S = 257,
- ERR_SPELL_FAILED_SHAPESHIFT_FORM_S = 258,
- ERR_SPELL_FAILED_ANOTHER_IN_PROGRESS = 259,
- ERR_BADATTACKFACING = 260,
- ERR_BADATTACKPOS = 261,
- ERR_CHEST_IN_USE = 262,
- ERR_USE_CANT_OPEN = 263,
- ERR_USE_LOCKED = 264,
- ERR_DOOR_LOCKED = 265,
- ERR_BUTTON_LOCKED = 266,
- ERR_USE_LOCKED_WITH_ITEM_S = 267,
- ERR_USE_LOCKED_WITH_SPELL_S = 268,
- ERR_USE_LOCKED_WITH_SPELL_KNOWN_SI = 269,
- ERR_USE_TOO_FAR = 270,
- ERR_USE_BAD_ANGLE = 271,
- ERR_USE_OBJECT_MOVING = 272,
- ERR_USE_SPELL_FOCUS = 273,
- ERR_USE_DESTROYED = 274,
- ERR_SET_LOOT_FREEFORALL = 275,
- ERR_SET_LOOT_ROUNDROBIN = 276,
- ERR_SET_LOOT_MASTER = 277,
- ERR_SET_LOOT_GROUP = 278,
- ERR_SET_LOOT_THRESHOLD_S = 279,
- ERR_NEW_LOOT_MASTER_S = 280,
- ERR_SPECIFY_MASTER_LOOTER = 281,
- ERR_LOOT_SPEC_CHANGED_S = 282,
- ERR_TAME_FAILED = 283,
- ERR_CHAT_WHILE_DEAD = 284,
- ERR_CHAT_PLAYER_NOT_FOUND_S = 285,
- ERR_NEWTAXIPATH = 286,
- ERR_NO_PET = 287,
- ERR_NOTYOURPET = 288,
- ERR_PET_NOT_RENAMEABLE = 289,
- ERR_QUEST_OBJECTIVE_COMPLETE_S = 290,
- ERR_QUEST_UNKNOWN_COMPLETE = 291,
- ERR_QUEST_ADD_KILL_SII = 292,
- ERR_QUEST_ADD_FOUND_SII = 293,
- ERR_QUEST_ADD_ITEM_SII = 294,
- ERR_QUEST_ADD_PLAYER_KILL_SII = 295,
- ERR_CANNOTCREATEDIRECTORY = 296,
- ERR_CANNOTCREATEFILE = 297,
- ERR_PLAYER_WRONG_FACTION = 298,
- ERR_PLAYER_IS_NEUTRAL = 299,
- ERR_BANKSLOT_FAILED_TOO_MANY = 300,
- ERR_BANKSLOT_INSUFFICIENT_FUNDS = 301,
- ERR_BANKSLOT_NOTBANKER = 302,
- ERR_FRIEND_DB_ERROR = 303,
- ERR_FRIEND_LIST_FULL = 304,
- ERR_FRIEND_ADDED_S = 305,
- ERR_BATTLETAG_FRIEND_ADDED_S = 306,
- ERR_FRIEND_ONLINE_SS = 307,
- ERR_FRIEND_OFFLINE_S = 308,
- ERR_FRIEND_NOT_FOUND = 309,
- ERR_FRIEND_WRONG_FACTION = 310,
- ERR_FRIEND_REMOVED_S = 311,
- ERR_BATTLETAG_FRIEND_REMOVED_S = 312,
- ERR_FRIEND_ERROR = 313,
- ERR_FRIEND_ALREADY_S = 314,
- ERR_FRIEND_SELF = 315,
- ERR_FRIEND_DELETED = 316,
- ERR_IGNORE_FULL = 317,
- ERR_IGNORE_SELF = 318,
- ERR_IGNORE_NOT_FOUND = 319,
- ERR_IGNORE_ALREADY_S = 320,
- ERR_IGNORE_ADDED_S = 321,
- ERR_IGNORE_REMOVED_S = 322,
- ERR_IGNORE_AMBIGUOUS = 323,
- ERR_IGNORE_DELETED = 324,
- ERR_ONLY_ONE_BOLT = 325,
- ERR_ONLY_ONE_AMMO = 326,
- ERR_SPELL_FAILED_EQUIPPED_SPECIFIC_ITEM = 327,
- ERR_WRONG_BAG_TYPE_SUBCLASS = 328,
- ERR_CANT_WRAP_STACKABLE = 329,
- ERR_CANT_WRAP_EQUIPPED = 330,
- ERR_CANT_WRAP_WRAPPED = 331,
- ERR_CANT_WRAP_BOUND = 332,
- ERR_CANT_WRAP_UNIQUE = 333,
- ERR_CANT_WRAP_BAGS = 334,
- ERR_OUT_OF_MANA = 335,
- ERR_OUT_OF_RAGE = 336,
- ERR_OUT_OF_FOCUS = 337,
- ERR_OUT_OF_ENERGY = 338,
- ERR_OUT_OF_CHI = 339,
- ERR_OUT_OF_HEALTH = 340,
- ERR_OUT_OF_RUNES = 341,
- ERR_OUT_OF_RUNIC_POWER = 342,
- ERR_OUT_OF_SOUL_SHARDS = 343,
- ERR_OUT_OF_LUNAR_POWER = 344,
- ERR_OUT_OF_HOLY_POWER = 345,
- ERR_OUT_OF_MAELSTROM = 346,
- ERR_OUT_OF_COMBO_POINTS = 347,
- ERR_OUT_OF_INSANITY = 348,
- ERR_OUT_OF_ARCANE_CHARGES = 349,
- ERR_OUT_OF_FURY = 350,
- ERR_OUT_OF_PAIN = 351,
- ERR_OUT_OF_POWER_DISPLAY = 352,
- ERR_LOOT_GONE = 353,
- ERR_MOUNT_FORCEDDISMOUNT = 354,
- ERR_AUTOFOLLOW_TOO_FAR = 355,
- ERR_UNIT_NOT_FOUND = 356,
- ERR_INVALID_FOLLOW_TARGET = 357,
- ERR_INVALID_FOLLOW_PVP_COMBAT = 358,
- ERR_INVALID_FOLLOW_TARGET_PVP_COMBAT = 359,
- ERR_INVALID_INSPECT_TARGET = 360,
- ERR_GUILDEMBLEM_SUCCESS = 361,
- ERR_GUILDEMBLEM_INVALID_TABARD_COLORS = 362,
- ERR_GUILDEMBLEM_NOGUILD = 363,
- ERR_GUILDEMBLEM_NOTGUILDMASTER = 364,
- ERR_GUILDEMBLEM_NOTENOUGHMONEY = 365,
- ERR_GUILDEMBLEM_INVALIDVENDOR = 366,
- ERR_EMBLEMERROR_NOTABARDGEOSET = 367,
- ERR_SPELL_OUT_OF_RANGE = 368,
- ERR_COMMAND_NEEDS_TARGET = 369,
- ERR_NOAMMO_S = 370,
- ERR_TOOBUSYTOFOLLOW = 371,
- ERR_DUEL_REQUESTED = 372,
- ERR_DUEL_CANCELLED = 373,
- ERR_DEATHBINDALREADYBOUND = 374,
- ERR_DEATHBIND_SUCCESS_S = 375,
- ERR_NOEMOTEWHILERUNNING = 376,
- ERR_ZONE_EXPLORED = 377,
- ERR_ZONE_EXPLORED_XP = 378,
- ERR_INVALID_ITEM_TARGET = 379,
- ERR_INVALID_QUEST_TARGET = 380,
- ERR_IGNORING_YOU_S = 381,
- ERR_FISH_NOT_HOOKED = 382,
- ERR_FISH_ESCAPED = 383,
- ERR_SPELL_FAILED_NOTUNSHEATHED = 384,
- ERR_PETITION_OFFERED_S = 385,
- ERR_PETITION_SIGNED = 386,
- ERR_PETITION_SIGNED_S = 387,
- ERR_PETITION_DECLINED_S = 388,
- ERR_PETITION_ALREADY_SIGNED = 389,
- ERR_PETITION_RESTRICTED_ACCOUNT_TRIAL = 390,
- ERR_PETITION_ALREADY_SIGNED_OTHER = 391,
- ERR_PETITION_IN_GUILD = 392,
- ERR_PETITION_CREATOR = 393,
- ERR_PETITION_NOT_ENOUGH_SIGNATURES = 394,
- ERR_PETITION_NOT_SAME_SERVER = 395,
- ERR_PETITION_FULL = 396,
- ERR_PETITION_ALREADY_SIGNED_BY_S = 397,
- ERR_GUILD_NAME_INVALID = 398,
- ERR_SPELL_UNLEARNED_S = 399,
- ERR_PET_SPELL_ROOTED = 400,
- ERR_PET_SPELL_AFFECTING_COMBAT = 401,
- ERR_PET_SPELL_OUT_OF_RANGE = 402,
- ERR_PET_SPELL_NOT_BEHIND = 403,
- ERR_PET_SPELL_TARGETS_DEAD = 404,
- ERR_PET_SPELL_DEAD = 405,
- ERR_PET_SPELL_NOPATH = 406,
- ERR_ITEM_CANT_BE_DESTROYED = 407,
- ERR_TICKET_ALREADY_EXISTS = 408,
- ERR_TICKET_CREATE_ERROR = 409,
- ERR_TICKET_UPDATE_ERROR = 410,
- ERR_TICKET_DB_ERROR = 411,
- ERR_TICKET_NO_TEXT = 412,
- ERR_TICKET_TEXT_TOO_LONG = 413,
- ERR_OBJECT_IS_BUSY = 414,
- ERR_EXHAUSTION_WELLRESTED = 415,
- ERR_EXHAUSTION_RESTED = 416,
- ERR_EXHAUSTION_NORMAL = 417,
- ERR_EXHAUSTION_TIRED = 418,
- ERR_EXHAUSTION_EXHAUSTED = 419,
- ERR_NO_ITEMS_WHILE_SHAPESHIFTED = 420,
- ERR_CANT_INTERACT_SHAPESHIFTED = 421,
- ERR_REALM_NOT_FOUND = 422,
- ERR_MAIL_QUEST_ITEM = 423,
- ERR_MAIL_BOUND_ITEM = 424,
- ERR_MAIL_CONJURED_ITEM = 425,
- ERR_MAIL_BAG = 426,
- ERR_MAIL_TO_SELF = 427,
- ERR_MAIL_TARGET_NOT_FOUND = 428,
- ERR_MAIL_DATABASE_ERROR = 429,
- ERR_MAIL_DELETE_ITEM_ERROR = 430,
- ERR_MAIL_WRAPPED_COD = 431,
- ERR_MAIL_CANT_SEND_REALM = 432,
- ERR_MAIL_TEMP_RETURN_OUTAGE = 433,
- ERR_MAIL_RECEPIENT_CANT_RECEIVE_MAIL = 434,
- ERR_MAIL_SENT = 435,
- ERR_MAIL_TARGET_IS_TRIAL = 436,
- ERR_NOT_HAPPY_ENOUGH = 437,
- ERR_USE_CANT_IMMUNE = 438,
- ERR_CANT_BE_DISENCHANTED = 439,
- ERR_CANT_USE_DISARMED = 440,
- ERR_AUCTION_DATABASE_ERROR = 441,
- ERR_AUCTION_HIGHER_BID = 442,
- ERR_AUCTION_ALREADY_BID = 443,
- ERR_AUCTION_OUTBID_S = 444,
- ERR_AUCTION_WON_S = 445,
- ERR_AUCTION_REMOVED_S = 446,
- ERR_AUCTION_BID_PLACED = 447,
- ERR_LOGOUT_FAILED = 448,
- ERR_QUEST_PUSH_SUCCESS_S = 449,
- ERR_QUEST_PUSH_INVALID_S = 450,
- ERR_QUEST_PUSH_INVALID_TO_RECIPIENT_S = 451,
- ERR_QUEST_PUSH_ACCEPTED_S = 452,
- ERR_QUEST_PUSH_DECLINED_S = 453,
- ERR_QUEST_PUSH_BUSY_S = 454,
- ERR_QUEST_PUSH_DEAD_S = 455,
- ERR_QUEST_PUSH_DEAD_TO_RECIPIENT_S = 456,
- ERR_QUEST_PUSH_LOG_FULL_S = 457,
- ERR_QUEST_PUSH_LOG_FULL_TO_RECIPIENT_S = 458,
- ERR_QUEST_PUSH_ONQUEST_S = 459,
- ERR_QUEST_PUSH_ONQUEST_TO_RECIPIENT_S = 460,
- ERR_QUEST_PUSH_ALREADY_DONE_S = 461,
- ERR_QUEST_PUSH_ALREADY_DONE_TO_RECIPIENT_S = 462,
- ERR_QUEST_PUSH_NOT_DAILY_S = 463,
- ERR_QUEST_PUSH_TIMER_EXPIRED_S = 464,
- ERR_QUEST_PUSH_NOT_IN_PARTY_S = 465,
- ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_S = 466,
- ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_TO_RECIPIENT_S = 467,
- ERR_QUEST_PUSH_NOT_ALLOWED_S = 468,
- ERR_QUEST_PUSH_PREREQUISITE_S = 469,
- ERR_QUEST_PUSH_PREREQUISITE_TO_RECIPIENT_S = 470,
- ERR_QUEST_PUSH_LOW_LEVEL_S = 471,
- ERR_QUEST_PUSH_LOW_LEVEL_TO_RECIPIENT_S = 472,
- ERR_QUEST_PUSH_HIGH_LEVEL_S = 473,
- ERR_QUEST_PUSH_HIGH_LEVEL_TO_RECIPIENT_S = 474,
- ERR_QUEST_PUSH_CLASS_S = 475,
- ERR_QUEST_PUSH_CLASS_TO_RECIPIENT_S = 476,
- ERR_QUEST_PUSH_RACE_S = 477,
- ERR_QUEST_PUSH_RACE_TO_RECIPIENT_S = 478,
- ERR_QUEST_PUSH_LOW_FACTION_S = 479,
- ERR_QUEST_PUSH_LOW_FACTION_TO_RECIPIENT_S = 480,
- ERR_QUEST_PUSH_EXPANSION_S = 481,
- ERR_QUEST_PUSH_EXPANSION_TO_RECIPIENT_S = 482,
- ERR_QUEST_PUSH_NOT_GARRISON_OWNER_S = 483,
- ERR_QUEST_PUSH_NOT_GARRISON_OWNER_TO_RECIPIENT_S = 484,
- ERR_QUEST_PUSH_WRONG_COVENANT_S = 485,
- ERR_QUEST_PUSH_WRONG_COVENANT_TO_RECIPIENT_S = 486,
- ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_S = 487,
- ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_TO_RECIPIENT_S = 488,
- ERR_QUEST_PUSH_WRONG_FACTION_S = 489,
- ERR_QUEST_PUSH_WRONG_FACTION_TO_RECIPIENT_S = 490,
- ERR_QUEST_PUSH_CROSS_FACTION_RESTRICTED_S = 491,
- ERR_RAID_GROUP_LOWLEVEL = 492,
- ERR_RAID_GROUP_ONLY = 493,
- ERR_RAID_GROUP_FULL = 494,
- ERR_RAID_GROUP_REQUIREMENTS_UNMATCH = 495,
- ERR_CORPSE_IS_NOT_IN_INSTANCE = 496,
- ERR_PVP_KILL_HONORABLE = 497,
- ERR_PVP_KILL_DISHONORABLE = 498,
- ERR_SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 499,
- ERR_SPELL_FAILED_ALREADY_AT_FULL_MANA = 500,
- ERR_SPELL_FAILED_ALREADY_AT_FULL_POWER_S = 501,
- ERR_AUTOLOOT_MONEY_S = 502,
- ERR_GENERIC_STUNNED = 503,
- ERR_GENERIC_THROTTLE = 504,
- ERR_CLUB_FINDER_SEARCHING_TOO_FAST = 505,
- ERR_TARGET_STUNNED = 506,
- ERR_MUST_REPAIR_DURABILITY = 507,
- ERR_RAID_YOU_JOINED = 508,
- ERR_RAID_YOU_LEFT = 509,
- ERR_INSTANCE_GROUP_JOINED_WITH_PARTY = 510,
- ERR_INSTANCE_GROUP_JOINED_WITH_RAID = 511,
- ERR_RAID_MEMBER_ADDED_S = 512,
- ERR_RAID_MEMBER_REMOVED_S = 513,
- ERR_INSTANCE_GROUP_ADDED_S = 514,
- ERR_INSTANCE_GROUP_REMOVED_S = 515,
- ERR_CLICK_ON_ITEM_TO_FEED = 516,
- ERR_TOO_MANY_CHAT_CHANNELS = 517,
- ERR_LOOT_ROLL_PENDING = 518,
- ERR_LOOT_PLAYER_NOT_FOUND = 519,
- ERR_NOT_IN_RAID = 520,
- ERR_LOGGING_OUT = 521,
- ERR_TARGET_LOGGING_OUT = 522,
- ERR_NOT_WHILE_MOUNTED = 523,
- ERR_NOT_WHILE_SHAPESHIFTED = 524,
- ERR_NOT_IN_COMBAT = 525,
- ERR_NOT_WHILE_DISARMED = 526,
- ERR_PET_BROKEN = 527,
- ERR_TALENT_WIPE_ERROR = 528,
- ERR_SPEC_WIPE_ERROR = 529,
- ERR_GLYPH_WIPE_ERROR = 530,
- ERR_PET_SPEC_WIPE_ERROR = 531,
- ERR_FEIGN_DEATH_RESISTED = 532,
- ERR_MEETING_STONE_IN_QUEUE_S = 533,
- ERR_MEETING_STONE_LEFT_QUEUE_S = 534,
- ERR_MEETING_STONE_OTHER_MEMBER_LEFT = 535,
- ERR_MEETING_STONE_PARTY_KICKED_FROM_QUEUE = 536,
- ERR_MEETING_STONE_MEMBER_STILL_IN_QUEUE = 537,
- ERR_MEETING_STONE_SUCCESS = 538,
- ERR_MEETING_STONE_IN_PROGRESS = 539,
- ERR_MEETING_STONE_MEMBER_ADDED_S = 540,
- ERR_MEETING_STONE_GROUP_FULL = 541,
- ERR_MEETING_STONE_NOT_LEADER = 542,
- ERR_MEETING_STONE_INVALID_LEVEL = 543,
- ERR_MEETING_STONE_TARGET_NOT_IN_PARTY = 544,
- ERR_MEETING_STONE_TARGET_INVALID_LEVEL = 545,
- ERR_MEETING_STONE_MUST_BE_LEADER = 546,
- ERR_MEETING_STONE_NO_RAID_GROUP = 547,
- ERR_MEETING_STONE_NEED_PARTY = 548,
- ERR_MEETING_STONE_NOT_FOUND = 549,
- ERR_MEETING_STONE_TARGET_IN_VEHICLE = 550,
- ERR_GUILDEMBLEM_SAME = 551,
- ERR_EQUIP_TRADE_ITEM = 552,
- ERR_PVP_TOGGLE_ON = 553,
- ERR_PVP_TOGGLE_OFF = 554,
- ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS = 555,
- ERR_GROUP_JOIN_BATTLEGROUND_DEAD = 556,
- ERR_GROUP_JOIN_BATTLEGROUND_S = 557,
- ERR_GROUP_JOIN_BATTLEGROUND_FAIL = 558,
- ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY = 559,
- ERR_SOLO_JOIN_BATTLEGROUND_S = 560,
- ERR_JOIN_SINGLE_SCENARIO_S = 561,
- ERR_BATTLEGROUND_TOO_MANY_QUEUES = 562,
- ERR_BATTLEGROUND_CANNOT_QUEUE_FOR_RATED = 563,
- ERR_BATTLEDGROUND_QUEUED_FOR_RATED = 564,
- ERR_BATTLEGROUND_TEAM_LEFT_QUEUE = 565,
- ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND = 566,
- ERR_ALREADY_IN_ARENA_TEAM_S = 567,
- ERR_INVALID_PROMOTION_CODE = 568,
- ERR_BG_PLAYER_JOINED_SS = 569,
- ERR_BG_PLAYER_LEFT_S = 570,
- ERR_RESTRICTED_ACCOUNT = 571,
- ERR_RESTRICTED_ACCOUNT_TRIAL = 572,
- ERR_PLAY_TIME_EXCEEDED = 573,
- ERR_APPROACHING_PARTIAL_PLAY_TIME = 574,
- ERR_APPROACHING_PARTIAL_PLAY_TIME_2 = 575,
- ERR_APPROACHING_NO_PLAY_TIME = 576,
- ERR_APPROACHING_NO_PLAY_TIME_2 = 577,
- ERR_UNHEALTHY_TIME = 578,
- ERR_CHAT_RESTRICTED_TRIAL = 579,
- ERR_CHAT_THROTTLED = 580,
- ERR_MAIL_REACHED_CAP = 581,
- ERR_INVALID_RAID_TARGET = 582,
- ERR_RAID_LEADER_READY_CHECK_START_S = 583,
- ERR_READY_CHECK_IN_PROGRESS = 584,
- ERR_READY_CHECK_THROTTLED = 585,
- ERR_DUNGEON_DIFFICULTY_FAILED = 586,
- ERR_DUNGEON_DIFFICULTY_CHANGED_S = 587,
- ERR_TRADE_WRONG_REALM = 588,
- ERR_TRADE_NOT_ON_TAPLIST = 589,
- ERR_CHAT_PLAYER_AMBIGUOUS_S = 590,
- ERR_LOOT_CANT_LOOT_THAT_NOW = 591,
- ERR_LOOT_MASTER_INV_FULL = 592,
- ERR_LOOT_MASTER_UNIQUE_ITEM = 593,
- ERR_LOOT_MASTER_OTHER = 594,
- ERR_FILTERING_YOU_S = 595,
- ERR_USE_PREVENTED_BY_MECHANIC_S = 596,
- ERR_ITEM_UNIQUE_EQUIPPABLE = 597,
- ERR_LFG_LEADER_IS_LFM_S = 598,
- ERR_LFG_PENDING = 599,
- ERR_CANT_SPEAK_LANGAGE = 600,
- ERR_VENDOR_MISSING_TURNINS = 601,
- ERR_BATTLEGROUND_NOT_IN_TEAM = 602,
- ERR_NOT_IN_BATTLEGROUND = 603,
- ERR_NOT_ENOUGH_HONOR_POINTS = 604,
- ERR_NOT_ENOUGH_ARENA_POINTS = 605,
- ERR_SOCKETING_REQUIRES_META_GEM = 606,
- ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT = 607,
- ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM = 608,
- ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT = 609,
- ERR_SOCKETING_REQUIRES_COGWHEEL_GEM = 610,
- ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT = 611,
- ERR_SOCKETING_ITEM_TOO_LOW_LEVEL = 612,
- ERR_ITEM_MAX_COUNT_SOCKETED = 613,
- ERR_SYSTEM_DISABLED = 614,
- ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I = 615,
- ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 616,
- ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 617,
- ERR_USER_SQUELCHED = 618,
- ERR_ACCOUNT_SILENCED = 619,
- ERR_PARTY_MEMBER_SILENCED = 620,
- ERR_PARTY_MEMBER_SILENCED_LFG_DELIST = 621,
- ERR_TOO_MUCH_GOLD = 622,
- ERR_NOT_BARBER_SITTING = 623,
- ERR_QUEST_FAILED_CAIS = 624,
- ERR_INVITE_RESTRICTED_TRIAL = 625,
- ERR_VOICE_IGNORE_FULL = 626,
- ERR_VOICE_IGNORE_SELF = 627,
- ERR_VOICE_IGNORE_NOT_FOUND = 628,
- ERR_VOICE_IGNORE_ALREADY_S = 629,
- ERR_VOICE_IGNORE_ADDED_S = 630,
- ERR_VOICE_IGNORE_REMOVED_S = 631,
- ERR_VOICE_IGNORE_AMBIGUOUS = 632,
- ERR_VOICE_IGNORE_DELETED = 633,
- ERR_UNKNOWN_MACRO_OPTION_S = 634,
- ERR_NOT_DURING_ARENA_MATCH = 635,
- ERR_NOT_IN_RATED_BATTLEGROUND = 636,
- ERR_PLAYER_SILENCED = 637,
- ERR_PLAYER_UNSILENCED = 638,
- ERR_COMSAT_DISCONNECT = 639,
- ERR_COMSAT_RECONNECT_ATTEMPT = 640,
- ERR_COMSAT_CONNECT_FAIL = 641,
- ERR_MAIL_INVALID_ATTACHMENT_SLOT = 642,
- ERR_MAIL_TOO_MANY_ATTACHMENTS = 643,
- ERR_MAIL_INVALID_ATTACHMENT = 644,
- ERR_MAIL_ATTACHMENT_EXPIRED = 645,
- ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC = 646,
- ERR_PROFANE_CHAT_NAME = 647,
- ERR_PLAYER_SILENCED_ECHO = 648,
- ERR_PLAYER_UNSILENCED_ECHO = 649,
- ERR_LOOT_CANT_LOOT_THAT = 650,
- ERR_ARENA_EXPIRED_CAIS = 651,
- ERR_GROUP_ACTION_THROTTLED = 652,
- ERR_ALREADY_PICKPOCKETED = 653,
- ERR_NAME_INVALID = 654,
- ERR_NAME_NO_NAME = 655,
- ERR_NAME_TOO_SHORT = 656,
- ERR_NAME_TOO_LONG = 657,
- ERR_NAME_MIXED_LANGUAGES = 658,
- ERR_NAME_PROFANE = 659,
- ERR_NAME_RESERVED = 660,
- ERR_NAME_THREE_CONSECUTIVE = 661,
- ERR_NAME_INVALID_SPACE = 662,
- ERR_NAME_CONSECUTIVE_SPACES = 663,
- ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 664,
- ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 665,
- ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 666,
- ERR_RECRUIT_A_FRIEND_NOT_LINKED = 667,
- ERR_RECRUIT_A_FRIEND_NOT_NOW = 668,
- ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX = 669,
- ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN = 670,
- ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE = 671,
- ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL = 672,
- ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED = 673,
- ERR_NOT_SAME_ACCOUNT = 674,
- ERR_BAD_ON_USE_ENCHANT = 675,
- ERR_TRADE_SELF = 676,
- ERR_TOO_MANY_SOCKETS = 677,
- ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 678,
- ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 679,
- ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 680,
- ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 681,
- ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 682,
- ERR_ITEM_INVENTORY_FULL_SATCHEL = 683,
- ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 684,
- ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 685,
- ERR_PURCHASE_LEVEL_TOO_LOW = 686,
- ERR_GROUP_SWAP_FAILED = 687,
- ERR_INVITE_IN_COMBAT = 688,
- ERR_INVALID_GLYPH_SLOT = 689,
- ERR_GENERIC_NO_VALID_TARGETS = 690,
- ERR_CALENDAR_EVENT_ALERT_S = 691,
- ERR_PET_LEARN_SPELL_S = 692,
- ERR_PET_LEARN_ABILITY_S = 693,
- ERR_PET_SPELL_UNLEARNED_S = 694,
- ERR_INVITE_UNKNOWN_REALM = 695,
- ERR_INVITE_NO_PARTY_SERVER = 696,
- ERR_INVITE_PARTY_BUSY = 697,
- ERR_PARTY_TARGET_AMBIGUOUS = 698,
- ERR_PARTY_LFG_INVITE_RAID_LOCKED = 699,
- ERR_PARTY_LFG_BOOT_LIMIT = 700,
- ERR_PARTY_LFG_BOOT_COOLDOWN_S = 701,
- ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S = 702,
- ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S = 703,
- ERR_PARTY_LFG_BOOT_IN_PROGRESS = 704,
- ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS = 705,
- ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED = 706,
- ERR_PARTY_LFG_BOOT_VOTE_FAILED = 707,
- ERR_PARTY_LFG_BOOT_IN_COMBAT = 708,
- ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE = 709,
- ERR_PARTY_LFG_BOOT_LOOT_ROLLS = 710,
- ERR_PARTY_LFG_BOOT_VOTE_REGISTERED = 711,
- ERR_PARTY_PRIVATE_GROUP_ONLY = 712,
- ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 713,
- ERR_RAID_DISALLOWED_BY_LEVEL = 714,
- ERR_RAID_DISALLOWED_BY_CROSS_REALM = 715,
- ERR_PARTY_ROLE_NOT_AVAILABLE = 716,
- ERR_JOIN_LFG_OBJECT_FAILED = 717,
- ERR_LFG_REMOVED_LEVELUP = 718,
- ERR_LFG_REMOVED_XP_TOGGLE = 719,
- ERR_LFG_REMOVED_FACTION_CHANGE = 720,
- ERR_BATTLEGROUND_INFO_THROTTLED = 721,
- ERR_BATTLEGROUND_ALREADY_IN = 722,
- ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED = 723,
- ERR_ARENA_TEAM_PERMISSIONS = 724,
- ERR_NOT_WHILE_FALLING = 725,
- ERR_NOT_WHILE_MOVING = 726,
- ERR_NOT_WHILE_FATIGUED = 727,
- ERR_MAX_SOCKETS = 728,
- ERR_MULTI_CAST_ACTION_TOTEM_S = 729,
- ERR_BATTLEGROUND_JOIN_LEVELUP = 730,
- ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN = 731,
- ERR_BATTLEGROUND_JOIN_XP_GAIN = 732,
- ERR_BATTLEGROUND_JOIN_MERCENARY = 733,
- ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS = 734,
- ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS = 735,
- ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS = 736,
- ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE = 737,
- ERR_RAID_DIFFICULTY_FAILED = 738,
- ERR_RAID_DIFFICULTY_CHANGED_S = 739,
- ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S = 740,
- ERR_RAID_LOCKOUT_CHANGED_S = 741,
- ERR_RAID_CONVERTED_TO_PARTY = 742,
- ERR_PARTY_CONVERTED_TO_RAID = 743,
- ERR_PLAYER_DIFFICULTY_CHANGED_S = 744,
- ERR_GMRESPONSE_DB_ERROR = 745,
- ERR_BATTLEGROUND_JOIN_RANGE_INDEX = 746,
- ERR_ARENA_JOIN_RANGE_INDEX = 747,
- ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE = 748,
- ERR_BATTLEGROUND_JOIN_FAILED = 749,
- ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE = 750,
- ERR_BATTLEGROUND_JOIN_RESPEC = 751,
- ERR_BATTLEGROUND_INVITATION_DECLINED = 752,
- ERR_BATTLEGROUND_JOIN_TIMED_OUT = 753,
- ERR_BATTLEGROUND_DUPE_QUEUE = 754,
- ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST = 755,
- ERR_IN_BATTLEGROUND_RESPEC = 756,
- ERR_MAIL_LIMITED_DURATION_ITEM = 757,
- ERR_YELL_RESTRICTED_TRIAL = 758,
- ERR_CHAT_RAID_RESTRICTED_TRIAL = 759,
- ERR_LFG_ROLE_CHECK_FAILED = 760,
- ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT = 761,
- ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE = 762,
- ERR_LFG_READY_CHECK_FAILED = 763,
- ERR_LFG_READY_CHECK_FAILED_TIMEOUT = 764,
- ERR_LFG_GROUP_FULL = 765,
- ERR_LFG_NO_LFG_OBJECT = 766,
- ERR_LFG_NO_SLOTS_PLAYER = 767,
- ERR_LFG_NO_SLOTS_PARTY = 768,
- ERR_LFG_NO_SPEC = 769,
- ERR_LFG_MISMATCHED_SLOTS = 770,
- ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM = 771,
- ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 772,
- ERR_LFG_MEMBERS_NOT_PRESENT = 773,
- ERR_LFG_GET_INFO_TIMEOUT = 774,
- ERR_LFG_INVALID_SLOT = 775,
- ERR_LFG_DESERTER_PLAYER = 776,
- ERR_LFG_DESERTER_PARTY = 777,
- ERR_LFG_DEAD = 778,
- ERR_LFG_RANDOM_COOLDOWN_PLAYER = 779,
- ERR_LFG_RANDOM_COOLDOWN_PARTY = 780,
- ERR_LFG_TOO_MANY_MEMBERS = 781,
- ERR_LFG_TOO_FEW_MEMBERS = 782,
- ERR_LFG_PROPOSAL_FAILED = 783,
- ERR_LFG_PROPOSAL_DECLINED_SELF = 784,
- ERR_LFG_PROPOSAL_DECLINED_PARTY = 785,
- ERR_LFG_NO_SLOTS_SELECTED = 786,
- ERR_LFG_NO_ROLES_SELECTED = 787,
- ERR_LFG_ROLE_CHECK_INITIATED = 788,
- ERR_LFG_READY_CHECK_INITIATED = 789,
- ERR_LFG_PLAYER_DECLINED_ROLE_CHECK = 790,
- ERR_LFG_PLAYER_DECLINED_READY_CHECK = 791,
- ERR_LFG_JOINED_QUEUE = 792,
- ERR_LFG_JOINED_FLEX_QUEUE = 793,
- ERR_LFG_JOINED_RF_QUEUE = 794,
- ERR_LFG_JOINED_SCENARIO_QUEUE = 795,
- ERR_LFG_JOINED_WORLD_PVP_QUEUE = 796,
- ERR_LFG_JOINED_BATTLEFIELD_QUEUE = 797,
- ERR_LFG_JOINED_LIST = 798,
- ERR_LFG_LEFT_QUEUE = 799,
- ERR_LFG_LEFT_LIST = 800,
- ERR_LFG_ROLE_CHECK_ABORTED = 801,
- ERR_LFG_READY_CHECK_ABORTED = 802,
- ERR_LFG_CANT_USE_BATTLEGROUND = 803,
- ERR_LFG_CANT_USE_DUNGEONS = 804,
- ERR_LFG_REASON_TOO_MANY_LFG = 805,
- ERR_LFG_FARM_LIMIT = 806,
- ERR_LFG_NO_CROSS_FACTION_PARTIES = 807,
- ERR_INVALID_TELEPORT_LOCATION = 808,
- ERR_TOO_FAR_TO_INTERACT = 809,
- ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS = 810,
- ERR_DIFFICULTY_CHANGE_COOLDOWN_S = 811,
- ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S = 812,
- ERR_DIFFICULTY_CHANGE_WORLDSTATE = 813,
- ERR_DIFFICULTY_CHANGE_ENCOUNTER = 814,
- ERR_DIFFICULTY_CHANGE_COMBAT = 815,
- ERR_DIFFICULTY_CHANGE_PLAYER_BUSY = 816,
- ERR_DIFFICULTY_CHANGE_ALREADY_STARTED = 817,
- ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S = 818,
- ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING = 819,
- ERR_ARENA_TEAM_PARTY_SIZE = 820,
- ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE = 821,
- ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP = 822,
- ERR_PVP_PLAYER_ABANDONED = 823,
- ERR_QUEST_FORCE_REMOVED_S = 824,
- ERR_ATTACK_NO_ACTIONS = 825,
- ERR_IN_RANDOM_BG = 826,
- ERR_IN_NON_RANDOM_BG = 827,
- ERR_BN_FRIEND_SELF = 828,
- ERR_BN_FRIEND_ALREADY = 829,
- ERR_BN_FRIEND_BLOCKED = 830,
- ERR_BN_FRIEND_LIST_FULL = 831,
- ERR_BN_FRIEND_REQUEST_SENT = 832,
- ERR_BN_BROADCAST_THROTTLE = 833,
- ERR_BG_DEVELOPER_ONLY = 834,
- ERR_CURRENCY_SPELL_SLOT_MISMATCH = 835,
- ERR_CURRENCY_NOT_TRADABLE = 836,
- ERR_REQUIRES_EXPANSION_S = 837,
- ERR_QUEST_FAILED_SPELL = 838,
- ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 839,
- ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 840,
- ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 841,
- ERR_TALENT_FAILED_UNKNOWN = 842,
- ERR_WARGAME_REQUEST_FAILURE = 843,
- ERR_RANK_REQUIRES_AUTHENTICATOR = 844,
- ERR_GUILD_BANK_VOUCHER_FAILED = 845,
- ERR_WARGAME_REQUEST_SENT = 846,
- ERR_REQUIRES_ACHIEVEMENT_I = 847,
- ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 848,
- ERR_CANT_BUY_QUANTITY = 849,
- ERR_ITEM_IS_BATTLE_PAY_LOCKED = 850,
- ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 851,
- ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 852,
- ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 853,
- ERR_INSUFF_TRACKED_CURRENCY_IS = 854,
- ERR_NOT_ON_TOURNAMENT_REALM = 855,
- ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 856,
- ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 857,
- ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 858,
- ERR_CANT_DO_THAT_IN_A_GROUP = 859,
- ERR_GUILD_LEADER_REPLACED = 860,
- ERR_TRANSMOGRIFY_CANT_EQUIP = 861,
- ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 862,
- ERR_TRANSMOGRIFY_NOT_SOULBOUND = 863,
- ERR_TRANSMOGRIFY_INVALID_SOURCE = 864,
- ERR_TRANSMOGRIFY_INVALID_DESTINATION = 865,
- ERR_TRANSMOGRIFY_MISMATCH = 866,
- ERR_TRANSMOGRIFY_LEGENDARY = 867,
- ERR_TRANSMOGRIFY_SAME_ITEM = 868,
- ERR_TRANSMOGRIFY_SAME_APPEARANCE = 869,
- ERR_TRANSMOGRIFY_NOT_EQUIPPED = 870,
- ERR_VOID_DEPOSIT_FULL = 871,
- ERR_VOID_WITHDRAW_FULL = 872,
- ERR_VOID_STORAGE_WRAPPED = 873,
- ERR_VOID_STORAGE_STACKABLE = 874,
- ERR_VOID_STORAGE_UNBOUND = 875,
- ERR_VOID_STORAGE_REPAIR = 876,
- ERR_VOID_STORAGE_CHARGES = 877,
- ERR_VOID_STORAGE_QUEST = 878,
- ERR_VOID_STORAGE_CONJURED = 879,
- ERR_VOID_STORAGE_MAIL = 880,
- ERR_VOID_STORAGE_BAG = 881,
- ERR_VOID_TRANSFER_STORAGE_FULL = 882,
- ERR_VOID_TRANSFER_INV_FULL = 883,
- ERR_VOID_TRANSFER_INTERNAL_ERROR = 884,
- ERR_VOID_TRANSFER_ITEM_INVALID = 885,
- ERR_DIFFICULTY_DISABLED_IN_LFG = 886,
- ERR_VOID_STORAGE_UNIQUE = 887,
- ERR_VOID_STORAGE_LOOT = 888,
- ERR_VOID_STORAGE_HOLIDAY = 889,
- ERR_VOID_STORAGE_DURATION = 890,
- ERR_VOID_STORAGE_LOAD_FAILED = 891,
- ERR_VOID_STORAGE_INVALID_ITEM = 892,
- ERR_PARENTAL_CONTROLS_CHAT_MUTED = 893,
- ERR_SOR_START_EXPERIENCE_INCOMPLETE = 894,
- ERR_SOR_INVALID_EMAIL = 895,
- ERR_SOR_INVALID_COMMENT = 896,
- ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 897,
- ERR_CHALLENGE_MODE_RESET_KEYSTONE = 898,
- ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 899,
- ERR_REPORT_SUBMITTED_SUCCESSFULLY = 900,
- ERR_REPORT_SUBMISSION_FAILED = 901,
- ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 902,
- ERR_BUG_SUBMITTED_SUCCESSFULLY = 903,
- ERR_CHALLENGE_MODE_ENABLED = 904,
- ERR_CHALLENGE_MODE_DISABLED = 905,
- ERR_PETBATTLE_CREATE_FAILED = 906,
- ERR_PETBATTLE_NOT_HERE = 907,
- ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 908,
- ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 909,
- ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 910,
- ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 911,
- ERR_PETBATTLE_NOT_WHILE_DEAD = 912,
- ERR_PETBATTLE_NOT_WHILE_FLYING = 913,
- ERR_PETBATTLE_TARGET_INVALID = 914,
- ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 915,
- ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 916,
- ERR_PETBATTLE_NOT_A_TRAINER = 917,
- ERR_PETBATTLE_DECLINED = 918,
- ERR_PETBATTLE_IN_BATTLE = 919,
- ERR_PETBATTLE_INVALID_LOADOUT = 920,
- ERR_PETBATTLE_ALL_PETS_DEAD = 921,
- ERR_PETBATTLE_NO_PETS_IN_SLOTS = 922,
- ERR_PETBATTLE_NO_ACCOUNT_LOCK = 923,
- ERR_PETBATTLE_WILD_PET_TAPPED = 924,
- ERR_PETBATTLE_RESTRICTED_ACCOUNT = 925,
- ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 926,
- ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 927,
- ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 928,
- ERR_CANT_HAVE_MORE_PETS = 929,
- ERR_PVP_MAP_NOT_FOUND = 930,
- ERR_PVP_MAP_NOT_SET = 931,
- ERR_PETBATTLE_QUEUE_QUEUED = 932,
- ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 933,
- ERR_PETBATTLE_QUEUE_JOIN_FAILED = 934,
- ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 935,
- ERR_PETBATTLE_QUEUE_REMOVED = 936,
- ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 937,
- ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 938,
- ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 939,
- ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 940,
- ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 941,
- ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 942,
- ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 943,
- ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 944,
- ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 945,
- ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 946,
- ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 947,
- ERR_PETBATTLE_QUEUE_SLOT_DEAD = 948,
- ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 949,
- ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 950,
- ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 951,
- ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 952,
- ERR_HAS_RESTRICTION = 953,
- ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 954,
- ERR_ITEM_UPGRADE_NO_PATH = 955,
- ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 956,
- ERR_BONUS_ROLL_EMPTY = 957,
- ERR_CHALLENGE_MODE_FULL = 958,
- ERR_CHALLENGE_MODE_IN_PROGRESS = 959,
- ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 960,
- ERR_BATTLETAG_FRIEND_NOT_FOUND = 961,
- ERR_BATTLETAG_FRIEND_NOT_VALID = 962,
- ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 963,
- ERR_BATTLETAG_FRIEND_THROTTLED = 964,
- ERR_BATTLETAG_FRIEND_SUCCESS = 965,
- ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 966,
- ERR_PETBATTLE_INTERNAL = 967,
- ERR_CANT_CAGE_PET_YET = 968,
- ERR_NO_LOOT_IN_CHALLENGE_MODE = 969,
- ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 970,
- ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 971,
- ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 972,
- ERR_RECRUIT_A_FRIEND_FAILED = 973,
- ERR_SET_LOOT_PERSONAL = 974,
- ERR_SET_LOOT_METHOD_FAILED_COMBAT = 975,
- ERR_REAGENT_BANK_FULL = 976,
- ERR_REAGENT_BANK_LOCKED = 977,
- ERR_GARRISON_BUILDING_EXISTS = 978,
- ERR_GARRISON_INVALID_PLOT = 979,
- ERR_GARRISON_INVALID_BUILDINGID = 980,
- ERR_GARRISON_INVALID_PLOT_BUILDING = 981,
- ERR_GARRISON_REQUIRES_BLUEPRINT = 982,
- ERR_GARRISON_NOT_ENOUGH_CURRENCY = 983,
- ERR_GARRISON_NOT_ENOUGH_GOLD = 984,
- ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 985,
- ERR_ALREADY_USING_LFG_LIST = 986,
- ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 987,
- ERR_TOY_USE_LIMIT_REACHED = 988,
- ERR_TOY_ALREADY_KNOWN = 989,
- ERR_TRANSMOG_SET_ALREADY_KNOWN = 990,
- ERR_NOT_ENOUGH_CURRENCY = 991,
- ERR_SPEC_IS_DISABLED = 992,
- ERR_FEATURE_RESTRICTED_TRIAL = 993,
- ERR_CANT_BE_OBLITERATED = 994,
- ERR_CANT_BE_SCRAPPED = 995,
- ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 996,
- ERR_MUST_EQUIP_ARTIFACT = 997,
- ERR_CANT_DO_THAT_RIGHT_NOW = 998,
- ERR_AFFECTING_COMBAT = 999,
- ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1000,
- ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1001,
- ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1002,
- ERR_MOVIE_RECORDING_WARNING_PERF = 1003,
- ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1004,
- ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1005,
- ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1006,
- ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1007,
- ERR_NO_CHALLENGE_MODE_REWARD = 1008,
- ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1009,
- ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1010,
- ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1011,
- ERR_TALENT_FAILED_REST_AREA = 1012,
- ERR_CANNOT_ABANDON_LAST_PET = 1013,
- ERR_TEST_CVAR_SET_SSS = 1014,
- ERR_QUEST_TURN_IN_FAIL_REASON = 1015,
- ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1016,
- ERR_TALENT_GRANTED_BY_AURA = 1017,
- ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1018,
- ERR_GLYPH_TARGET_NOT_AVAILABLE = 1019,
- ERR_PVP_WARMODE_TOGGLE_ON = 1020,
- ERR_PVP_WARMODE_TOGGLE_OFF = 1021,
- ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1022,
- ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1023,
- ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1024,
- ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1025,
- ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1026,
- ERR_VOICE_CHAT_SERVICE_LOST = 1027,
- ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1028,
- ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1029,
- ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1030,
- ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1031,
- ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1032,
- ERR_VOICE_CHAT_PLAYER_SILENCED = 1033,
- ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1034,
- ERR_VOICE_CHAT_DISABLED = 1035,
- ERR_NO_PVP_REWARD = 1036,
- ERR_CLAIMED_PVP_REWARD = 1037,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1038,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1039,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1040,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1041,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1042,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1043,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1044,
- ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1045,
- ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1046,
- ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1047,
- ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1048,
- ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1049,
- ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1050,
- ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1051,
- ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1052,
- ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1053,
- ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1054,
- ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1055,
- ERR_LEVEL_LINKING_RESULT_LINKED = 1056,
- ERR_LEVEL_LINKING_RESULT_UNLINKED = 1057,
- ERR_CLUB_FINDER_ERROR_POST_CLUB = 1058,
- ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1059,
- ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1060,
- ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1061,
- ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1062,
- ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1063,
- ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1064,
- ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1065,
- ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1066,
- ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1067,
- ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1068,
- ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1069,
- ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1070,
- ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1071,
- ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1072,
- ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1073,
- ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1074,
- ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1075,
- ERR_SOULBIND_INVALID_CONDUIT = 1076,
- ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1077,
- ERR_SOULBIND_INVALID_TALENT = 1078,
- ERR_SOULBIND_DUPLICATE_CONDUIT = 1079,
- ERR_ACTIVATE_SOULBIND_S = 1080,
- ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1081,
- ERR_CANT_USE_PROFANITY = 1082,
- ERR_NOT_IN_PET_BATTLE = 1083,
- ERR_NOT_IN_NPE = 1084,
- ERR_NO_SPEC = 1085,
- ERR_NO_DOMINATIONSHARD_OVERWRITE = 1086,
- ERR_USE_WEEKLY_REWARDS_DISABLED = 1087,
- ERR_CROSS_FACTION_GROUP_JOINED = 1088,
- ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1089,
+ ERR_REAGENTBAG_WRONG_SLOT = 22,
+ ERR_SLOT_ONLY_REAGENTBAG = 23,
+ ERR_REAGENTBAG_ITEM_TYPE = 24,
+ ERR_ITEM_MAX_COUNT = 25,
+ ERR_NOT_EQUIPPABLE = 26,
+ ERR_CANT_STACK = 27,
+ ERR_CANT_SWAP = 28,
+ ERR_SLOT_EMPTY = 29,
+ ERR_ITEM_NOT_FOUND = 30,
+ ERR_TOO_FEW_TO_SPLIT = 31,
+ ERR_SPLIT_FAILED = 32,
+ ERR_NOT_A_BAG = 33,
+ ERR_NOT_OWNER = 34,
+ ERR_ONLY_ONE_QUIVER = 35,
+ ERR_NO_BANK_SLOT = 36,
+ ERR_NO_BANK_HERE = 37,
+ ERR_ITEM_LOCKED = 38,
+ ERR_2HANDED_EQUIPPED = 39,
+ ERR_VENDOR_NOT_INTERESTED = 40,
+ ERR_VENDOR_REFUSE_SCRAPPABLE_AZERITE = 41,
+ ERR_VENDOR_HATES_YOU = 42,
+ ERR_VENDOR_SOLD_OUT = 43,
+ ERR_VENDOR_TOO_FAR = 44,
+ ERR_VENDOR_DOESNT_BUY = 45,
+ ERR_NOT_ENOUGH_MONEY = 46,
+ ERR_RECEIVE_ITEM_S = 47,
+ ERR_DROP_BOUND_ITEM = 48,
+ ERR_TRADE_BOUND_ITEM = 49,
+ ERR_TRADE_QUEST_ITEM = 50,
+ ERR_TRADE_TEMP_ENCHANT_BOUND = 51,
+ ERR_TRADE_GROUND_ITEM = 52,
+ ERR_TRADE_BAG = 53,
+ ERR_TRADE_FACTION_SPECIFIC = 54,
+ ERR_SPELL_FAILED_S = 55,
+ ERR_ITEM_COOLDOWN = 56,
+ ERR_POTION_COOLDOWN = 57,
+ ERR_FOOD_COOLDOWN = 58,
+ ERR_SPELL_COOLDOWN = 59,
+ ERR_ABILITY_COOLDOWN = 60,
+ ERR_SPELL_ALREADY_KNOWN_S = 61,
+ ERR_PET_SPELL_ALREADY_KNOWN_S = 62,
+ ERR_PROFICIENCY_GAINED_S = 63,
+ ERR_SKILL_GAINED_S = 64,
+ ERR_SKILL_UP_SI = 65,
+ ERR_LEARN_SPELL_S = 66,
+ ERR_LEARN_ABILITY_S = 67,
+ ERR_LEARN_PASSIVE_S = 68,
+ ERR_LEARN_RECIPE_S = 69,
+ ERR_PROFESSIONS_RECIPE_DISCOVERY_S = 70,
+ ERR_LEARN_COMPANION_S = 71,
+ ERR_LEARN_MOUNT_S = 72,
+ ERR_LEARN_TOY_S = 73,
+ ERR_LEARN_HEIRLOOM_S = 74,
+ ERR_LEARN_TRANSMOG_S = 75,
+ ERR_COMPLETED_TRANSMOG_SET_S = 76,
+ ERR_APPEARANCE_ALREADY_LEARNED = 77,
+ ERR_REVOKE_TRANSMOG_S = 78,
+ ERR_INVITE_PLAYER_S = 79,
+ ERR_SUGGEST_INVITE_PLAYER_S = 80,
+ ERR_INFORM_SUGGEST_INVITE_S = 81,
+ ERR_INFORM_SUGGEST_INVITE_SS = 82,
+ ERR_REQUEST_JOIN_PLAYER_S = 83,
+ ERR_INVITE_SELF = 84,
+ ERR_INVITED_TO_GROUP_SS = 85,
+ ERR_INVITED_ALREADY_IN_GROUP_SS = 86,
+ ERR_ALREADY_IN_GROUP_S = 87,
+ ERR_REQUESTED_INVITE_TO_GROUP_SS = 88,
+ ERR_CROSS_REALM_RAID_INVITE = 89,
+ ERR_PLAYER_BUSY_S = 90,
+ ERR_NEW_LEADER_S = 91,
+ ERR_NEW_LEADER_YOU = 92,
+ ERR_NEW_GUIDE_S = 93,
+ ERR_NEW_GUIDE_YOU = 94,
+ ERR_LEFT_GROUP_S = 95,
+ ERR_LEFT_GROUP_YOU = 96,
+ ERR_GROUP_DISBANDED = 97,
+ ERR_DECLINE_GROUP_S = 98,
+ ERR_DECLINE_GROUP_REQUEST_S = 99,
+ ERR_JOINED_GROUP_S = 100,
+ ERR_UNINVITE_YOU = 101,
+ ERR_BAD_PLAYER_NAME_S = 102,
+ ERR_NOT_IN_GROUP = 103,
+ ERR_TARGET_NOT_IN_GROUP_S = 104,
+ ERR_TARGET_NOT_IN_INSTANCE_S = 105,
+ ERR_NOT_IN_INSTANCE_GROUP = 106,
+ ERR_GROUP_FULL = 107,
+ ERR_NOT_LEADER = 108,
+ ERR_PLAYER_DIED_S = 109,
+ ERR_GUILD_CREATE_S = 110,
+ ERR_GUILD_INVITE_S = 111,
+ ERR_INVITED_TO_GUILD_SSS = 112,
+ ERR_ALREADY_IN_GUILD_S = 113,
+ ERR_ALREADY_INVITED_TO_GUILD_S = 114,
+ ERR_INVITED_TO_GUILD = 115,
+ ERR_ALREADY_IN_GUILD = 116,
+ ERR_GUILD_ACCEPT = 117,
+ ERR_GUILD_DECLINE_S = 118,
+ ERR_GUILD_DECLINE_AUTO_S = 119,
+ ERR_GUILD_PERMISSIONS = 120,
+ ERR_GUILD_JOIN_S = 121,
+ ERR_GUILD_FOUNDER_S = 122,
+ ERR_GUILD_PROMOTE_SSS = 123,
+ ERR_GUILD_DEMOTE_SS = 124,
+ ERR_GUILD_DEMOTE_SSS = 125,
+ ERR_GUILD_INVITE_SELF = 126,
+ ERR_GUILD_QUIT_S = 127,
+ ERR_GUILD_LEAVE_S = 128,
+ ERR_GUILD_REMOVE_SS = 129,
+ ERR_GUILD_REMOVE_SELF = 130,
+ ERR_GUILD_DISBAND_S = 131,
+ ERR_GUILD_DISBAND_SELF = 132,
+ ERR_GUILD_LEADER_S = 133,
+ ERR_GUILD_LEADER_SELF = 134,
+ ERR_GUILD_PLAYER_NOT_FOUND_S = 135,
+ ERR_GUILD_PLAYER_NOT_IN_GUILD_S = 136,
+ ERR_GUILD_PLAYER_NOT_IN_GUILD = 137,
+ ERR_GUILD_CANT_PROMOTE_S = 138,
+ ERR_GUILD_CANT_DEMOTE_S = 139,
+ ERR_GUILD_NOT_IN_A_GUILD = 140,
+ ERR_GUILD_INTERNAL = 141,
+ ERR_GUILD_LEADER_IS_S = 142,
+ ERR_GUILD_LEADER_CHANGED_SS = 143,
+ ERR_GUILD_DISBANDED = 144,
+ ERR_GUILD_NOT_ALLIED = 145,
+ ERR_GUILD_LEADER_LEAVE = 146,
+ ERR_GUILD_RANKS_LOCKED = 147,
+ ERR_GUILD_RANK_IN_USE = 148,
+ ERR_GUILD_RANK_TOO_HIGH_S = 149,
+ ERR_GUILD_RANK_TOO_LOW_S = 150,
+ ERR_GUILD_NAME_EXISTS_S = 151,
+ ERR_GUILD_WITHDRAW_LIMIT = 152,
+ ERR_GUILD_NOT_ENOUGH_MONEY = 153,
+ ERR_GUILD_TOO_MUCH_MONEY = 154,
+ ERR_GUILD_BANK_CONJURED_ITEM = 155,
+ ERR_GUILD_BANK_EQUIPPED_ITEM = 156,
+ ERR_GUILD_BANK_BOUND_ITEM = 157,
+ ERR_GUILD_BANK_QUEST_ITEM = 158,
+ ERR_GUILD_BANK_WRAPPED_ITEM = 159,
+ ERR_GUILD_BANK_FULL = 160,
+ ERR_GUILD_BANK_WRONG_TAB = 161,
+ ERR_NO_GUILD_CHARTER = 162,
+ ERR_OUT_OF_RANGE = 163,
+ ERR_PLAYER_DEAD = 164,
+ ERR_CLIENT_LOCKED_OUT = 165,
+ ERR_CLIENT_ON_TRANSPORT = 166,
+ ERR_KILLED_BY_S = 167,
+ ERR_LOOT_LOCKED = 168,
+ ERR_LOOT_TOO_FAR = 169,
+ ERR_LOOT_DIDNT_KILL = 170,
+ ERR_LOOT_BAD_FACING = 171,
+ ERR_LOOT_NOTSTANDING = 172,
+ ERR_LOOT_STUNNED = 173,
+ ERR_LOOT_NO_UI = 174,
+ ERR_LOOT_WHILE_INVULNERABLE = 175,
+ ERR_NO_LOOT = 176,
+ ERR_QUEST_ACCEPTED_S = 177,
+ ERR_QUEST_COMPLETE_S = 178,
+ ERR_QUEST_FAILED_S = 179,
+ ERR_QUEST_FAILED_BAG_FULL_S = 180,
+ ERR_QUEST_FAILED_MAX_COUNT_S = 181,
+ ERR_QUEST_FAILED_LOW_LEVEL = 182,
+ ERR_QUEST_FAILED_MISSING_ITEMS = 183,
+ ERR_QUEST_FAILED_WRONG_RACE = 184,
+ ERR_QUEST_FAILED_NOT_ENOUGH_MONEY = 185,
+ ERR_QUEST_FAILED_EXPANSION = 186,
+ ERR_QUEST_ONLY_ONE_TIMED = 187,
+ ERR_QUEST_NEED_PREREQS = 188,
+ ERR_QUEST_NEED_PREREQS_CUSTOM = 189,
+ ERR_QUEST_ALREADY_ON = 190,
+ ERR_QUEST_ALREADY_DONE = 191,
+ ERR_QUEST_ALREADY_DONE_DAILY = 192,
+ ERR_QUEST_HAS_IN_PROGRESS = 193,
+ ERR_QUEST_REWARD_EXP_I = 194,
+ ERR_QUEST_REWARD_MONEY_S = 195,
+ ERR_QUEST_MUST_CHOOSE = 196,
+ ERR_QUEST_LOG_FULL = 197,
+ ERR_COMBAT_DAMAGE_SSI = 198,
+ ERR_INSPECT_S = 199,
+ ERR_CANT_USE_ITEM = 200,
+ ERR_CANT_USE_ITEM_IN_ARENA = 201,
+ ERR_CANT_USE_ITEM_IN_RATED_BATTLEGROUND = 202,
+ ERR_MUST_EQUIP_ITEM = 203,
+ ERR_PASSIVE_ABILITY = 204,
+ ERR_2HSKILLNOTFOUND = 205,
+ ERR_NO_ATTACK_TARGET = 206,
+ ERR_INVALID_ATTACK_TARGET = 207,
+ ERR_ATTACK_PVP_TARGET_WHILE_UNFLAGGED = 208,
+ ERR_ATTACK_STUNNED = 209,
+ ERR_ATTACK_PACIFIED = 210,
+ ERR_ATTACK_MOUNTED = 211,
+ ERR_ATTACK_FLEEING = 212,
+ ERR_ATTACK_CONFUSED = 213,
+ ERR_ATTACK_CHARMED = 214,
+ ERR_ATTACK_DEAD = 215,
+ ERR_ATTACK_PREVENTED_BY_MECHANIC_S = 216,
+ ERR_ATTACK_CHANNEL = 217,
+ ERR_TAXISAMENODE = 218,
+ ERR_TAXINOSUCHPATH = 219,
+ ERR_TAXIUNSPECIFIEDSERVERERROR = 220,
+ ERR_TAXINOTENOUGHMONEY = 221,
+ ERR_TAXITOOFARAWAY = 222,
+ ERR_TAXINOVENDORNEARBY = 223,
+ ERR_TAXINOTVISITED = 224,
+ ERR_TAXIPLAYERBUSY = 225,
+ ERR_TAXIPLAYERALREADYMOUNTED = 226,
+ ERR_TAXIPLAYERSHAPESHIFTED = 227,
+ ERR_TAXIPLAYERMOVING = 228,
+ ERR_TAXINOPATHS = 229,
+ ERR_TAXINOTELIGIBLE = 230,
+ ERR_TAXINOTSTANDING = 231,
+ ERR_TAXIINCOMBAT = 232,
+ ERR_NO_REPLY_TARGET = 233,
+ ERR_GENERIC_NO_TARGET = 234,
+ ERR_INITIATE_TRADE_S = 235,
+ ERR_TRADE_REQUEST_S = 236,
+ ERR_TRADE_BLOCKED_S = 237,
+ ERR_TRADE_TARGET_DEAD = 238,
+ ERR_TRADE_TOO_FAR = 239,
+ ERR_TRADE_CANCELLED = 240,
+ ERR_TRADE_COMPLETE = 241,
+ ERR_TRADE_BAG_FULL = 242,
+ ERR_TRADE_TARGET_BAG_FULL = 243,
+ ERR_TRADE_MAX_COUNT_EXCEEDED = 244,
+ ERR_TRADE_TARGET_MAX_COUNT_EXCEEDED = 245,
+ ERR_INVENTORY_TRADE_TOO_MANY_UNIQUE_ITEM = 246,
+ ERR_ALREADY_TRADING = 247,
+ ERR_MOUNT_INVALIDMOUNTEE = 248,
+ ERR_MOUNT_TOOFARAWAY = 249,
+ ERR_MOUNT_ALREADYMOUNTED = 250,
+ ERR_MOUNT_NOTMOUNTABLE = 251,
+ ERR_MOUNT_NOTYOURPET = 252,
+ ERR_MOUNT_OTHER = 253,
+ ERR_MOUNT_LOOTING = 254,
+ ERR_MOUNT_RACECANTMOUNT = 255,
+ ERR_MOUNT_SHAPESHIFTED = 256,
+ ERR_MOUNT_NO_FAVORITES = 257,
+ ERR_MOUNT_NO_MOUNTS = 258,
+ ERR_DISMOUNT_NOPET = 259,
+ ERR_DISMOUNT_NOTMOUNTED = 260,
+ ERR_DISMOUNT_NOTYOURPET = 261,
+ ERR_SPELL_FAILED_TOTEMS = 262,
+ ERR_SPELL_FAILED_REAGENTS = 263,
+ ERR_SPELL_FAILED_REAGENTS_GENERIC = 264,
+ ERR_SPELL_FAILED_OPTIONAL_REAGENTS = 265,
+ ERR_CANT_TRADE_GOLD = 266,
+ ERR_SPELL_FAILED_EQUIPPED_ITEM = 267,
+ ERR_SPELL_FAILED_EQUIPPED_ITEM_CLASS_S = 268,
+ ERR_SPELL_FAILED_SHAPESHIFT_FORM_S = 269,
+ ERR_SPELL_FAILED_ANOTHER_IN_PROGRESS = 270,
+ ERR_BADATTACKFACING = 271,
+ ERR_BADATTACKPOS = 272,
+ ERR_CHEST_IN_USE = 273,
+ ERR_USE_CANT_OPEN = 274,
+ ERR_USE_LOCKED = 275,
+ ERR_DOOR_LOCKED = 276,
+ ERR_BUTTON_LOCKED = 277,
+ ERR_USE_LOCKED_WITH_ITEM_S = 278,
+ ERR_USE_LOCKED_WITH_SPELL_S = 279,
+ ERR_USE_LOCKED_WITH_SPELL_KNOWN_SI = 280,
+ ERR_USE_TOO_FAR = 281,
+ ERR_USE_BAD_ANGLE = 282,
+ ERR_USE_OBJECT_MOVING = 283,
+ ERR_USE_SPELL_FOCUS = 284,
+ ERR_USE_DESTROYED = 285,
+ ERR_SET_LOOT_FREEFORALL = 286,
+ ERR_SET_LOOT_ROUNDROBIN = 287,
+ ERR_SET_LOOT_MASTER = 288,
+ ERR_SET_LOOT_GROUP = 289,
+ ERR_SET_LOOT_THRESHOLD_S = 290,
+ ERR_NEW_LOOT_MASTER_S = 291,
+ ERR_SPECIFY_MASTER_LOOTER = 292,
+ ERR_LOOT_SPEC_CHANGED_S = 293,
+ ERR_TAME_FAILED = 294,
+ ERR_CHAT_WHILE_DEAD = 295,
+ ERR_CHAT_PLAYER_NOT_FOUND_S = 296,
+ ERR_NEWTAXIPATH = 297,
+ ERR_NO_PET = 298,
+ ERR_NOTYOURPET = 299,
+ ERR_PET_NOT_RENAMEABLE = 300,
+ ERR_QUEST_OBJECTIVE_COMPLETE_S = 301,
+ ERR_QUEST_UNKNOWN_COMPLETE = 302,
+ ERR_QUEST_ADD_KILL_SII = 303,
+ ERR_QUEST_ADD_FOUND_SII = 304,
+ ERR_QUEST_ADD_ITEM_SII = 305,
+ ERR_QUEST_ADD_PLAYER_KILL_SII = 306,
+ ERR_CANNOTCREATEDIRECTORY = 307,
+ ERR_CANNOTCREATEFILE = 308,
+ ERR_PLAYER_WRONG_FACTION = 309,
+ ERR_PLAYER_IS_NEUTRAL = 310,
+ ERR_BANKSLOT_FAILED_TOO_MANY = 311,
+ ERR_BANKSLOT_INSUFFICIENT_FUNDS = 312,
+ ERR_BANKSLOT_NOTBANKER = 313,
+ ERR_FRIEND_DB_ERROR = 314,
+ ERR_FRIEND_LIST_FULL = 315,
+ ERR_FRIEND_ADDED_S = 316,
+ ERR_BATTLETAG_FRIEND_ADDED_S = 317,
+ ERR_FRIEND_ONLINE_SS = 318,
+ ERR_FRIEND_OFFLINE_S = 319,
+ ERR_FRIEND_NOT_FOUND = 320,
+ ERR_FRIEND_WRONG_FACTION = 321,
+ ERR_FRIEND_REMOVED_S = 322,
+ ERR_BATTLETAG_FRIEND_REMOVED_S = 323,
+ ERR_FRIEND_ERROR = 324,
+ ERR_FRIEND_ALREADY_S = 325,
+ ERR_FRIEND_SELF = 326,
+ ERR_FRIEND_DELETED = 327,
+ ERR_IGNORE_FULL = 328,
+ ERR_IGNORE_SELF = 329,
+ ERR_IGNORE_NOT_FOUND = 330,
+ ERR_IGNORE_ALREADY_S = 331,
+ ERR_IGNORE_ADDED_S = 332,
+ ERR_IGNORE_REMOVED_S = 333,
+ ERR_IGNORE_AMBIGUOUS = 334,
+ ERR_IGNORE_DELETED = 335,
+ ERR_ONLY_ONE_BOLT = 336,
+ ERR_ONLY_ONE_AMMO = 337,
+ ERR_SPELL_FAILED_EQUIPPED_SPECIFIC_ITEM = 338,
+ ERR_WRONG_BAG_TYPE_SUBCLASS = 339,
+ ERR_CANT_WRAP_STACKABLE = 340,
+ ERR_CANT_WRAP_EQUIPPED = 341,
+ ERR_CANT_WRAP_WRAPPED = 342,
+ ERR_CANT_WRAP_BOUND = 343,
+ ERR_CANT_WRAP_UNIQUE = 344,
+ ERR_CANT_WRAP_BAGS = 345,
+ ERR_OUT_OF_MANA = 346,
+ ERR_OUT_OF_RAGE = 347,
+ ERR_OUT_OF_FOCUS = 348,
+ ERR_OUT_OF_ENERGY = 349,
+ ERR_OUT_OF_CHI = 350,
+ ERR_OUT_OF_HEALTH = 351,
+ ERR_OUT_OF_RUNES = 352,
+ ERR_OUT_OF_RUNIC_POWER = 353,
+ ERR_OUT_OF_SOUL_SHARDS = 354,
+ ERR_OUT_OF_LUNAR_POWER = 355,
+ ERR_OUT_OF_HOLY_POWER = 356,
+ ERR_OUT_OF_MAELSTROM = 357,
+ ERR_OUT_OF_COMBO_POINTS = 358,
+ ERR_OUT_OF_INSANITY = 359,
+ ERR_OUT_OF_ESSENCE = 360,
+ ERR_OUT_OF_ARCANE_CHARGES = 361,
+ ERR_OUT_OF_FURY = 362,
+ ERR_OUT_OF_PAIN = 363,
+ ERR_OUT_OF_POWER_DISPLAY = 364,
+ ERR_LOOT_GONE = 365,
+ ERR_MOUNT_FORCEDDISMOUNT = 366,
+ ERR_AUTOFOLLOW_TOO_FAR = 367,
+ ERR_UNIT_NOT_FOUND = 368,
+ ERR_INVALID_FOLLOW_TARGET = 369,
+ ERR_INVALID_FOLLOW_PVP_COMBAT = 370,
+ ERR_INVALID_FOLLOW_TARGET_PVP_COMBAT = 371,
+ ERR_INVALID_INSPECT_TARGET = 372,
+ ERR_GUILDEMBLEM_SUCCESS = 373,
+ ERR_GUILDEMBLEM_INVALID_TABARD_COLORS = 374,
+ ERR_GUILDEMBLEM_NOGUILD = 375,
+ ERR_GUILDEMBLEM_NOTGUILDMASTER = 376,
+ ERR_GUILDEMBLEM_NOTENOUGHMONEY = 377,
+ ERR_GUILDEMBLEM_INVALIDVENDOR = 378,
+ ERR_EMBLEMERROR_NOTABARDGEOSET = 379,
+ ERR_SPELL_OUT_OF_RANGE = 380,
+ ERR_COMMAND_NEEDS_TARGET = 381,
+ ERR_NOAMMO_S = 382,
+ ERR_TOOBUSYTOFOLLOW = 383,
+ ERR_DUEL_REQUESTED = 384,
+ ERR_DUEL_CANCELLED = 385,
+ ERR_DEATHBINDALREADYBOUND = 386,
+ ERR_DEATHBIND_SUCCESS_S = 387,
+ ERR_NOEMOTEWHILERUNNING = 388,
+ ERR_ZONE_EXPLORED = 389,
+ ERR_ZONE_EXPLORED_XP = 390,
+ ERR_INVALID_ITEM_TARGET = 391,
+ ERR_INVALID_QUEST_TARGET = 392,
+ ERR_IGNORING_YOU_S = 393,
+ ERR_FISH_NOT_HOOKED = 394,
+ ERR_FISH_ESCAPED = 395,
+ ERR_SPELL_FAILED_NOTUNSHEATHED = 396,
+ ERR_PETITION_OFFERED_S = 397,
+ ERR_PETITION_SIGNED = 398,
+ ERR_PETITION_SIGNED_S = 399,
+ ERR_PETITION_DECLINED_S = 400,
+ ERR_PETITION_ALREADY_SIGNED = 401,
+ ERR_PETITION_RESTRICTED_ACCOUNT_TRIAL = 402,
+ ERR_PETITION_ALREADY_SIGNED_OTHER = 403,
+ ERR_PETITION_IN_GUILD = 404,
+ ERR_PETITION_CREATOR = 405,
+ ERR_PETITION_NOT_ENOUGH_SIGNATURES = 406,
+ ERR_PETITION_NOT_SAME_SERVER = 407,
+ ERR_PETITION_FULL = 408,
+ ERR_PETITION_ALREADY_SIGNED_BY_S = 409,
+ ERR_GUILD_NAME_INVALID = 410,
+ ERR_SPELL_UNLEARNED_S = 411,
+ ERR_PET_SPELL_ROOTED = 412,
+ ERR_PET_SPELL_AFFECTING_COMBAT = 413,
+ ERR_PET_SPELL_OUT_OF_RANGE = 414,
+ ERR_PET_SPELL_NOT_BEHIND = 415,
+ ERR_PET_SPELL_TARGETS_DEAD = 416,
+ ERR_PET_SPELL_DEAD = 417,
+ ERR_PET_SPELL_NOPATH = 418,
+ ERR_ITEM_CANT_BE_DESTROYED = 419,
+ ERR_TICKET_ALREADY_EXISTS = 420,
+ ERR_TICKET_CREATE_ERROR = 421,
+ ERR_TICKET_UPDATE_ERROR = 422,
+ ERR_TICKET_DB_ERROR = 423,
+ ERR_TICKET_NO_TEXT = 424,
+ ERR_TICKET_TEXT_TOO_LONG = 425,
+ ERR_OBJECT_IS_BUSY = 426,
+ ERR_EXHAUSTION_WELLRESTED = 427,
+ ERR_EXHAUSTION_RESTED = 428,
+ ERR_EXHAUSTION_NORMAL = 429,
+ ERR_EXHAUSTION_TIRED = 430,
+ ERR_EXHAUSTION_EXHAUSTED = 431,
+ ERR_NO_ITEMS_WHILE_SHAPESHIFTED = 432,
+ ERR_CANT_INTERACT_SHAPESHIFTED = 433,
+ ERR_REALM_NOT_FOUND = 434,
+ ERR_MAIL_QUEST_ITEM = 435,
+ ERR_MAIL_BOUND_ITEM = 436,
+ ERR_MAIL_CONJURED_ITEM = 437,
+ ERR_MAIL_BAG = 438,
+ ERR_MAIL_TO_SELF = 439,
+ ERR_MAIL_TARGET_NOT_FOUND = 440,
+ ERR_MAIL_DATABASE_ERROR = 441,
+ ERR_MAIL_DELETE_ITEM_ERROR = 442,
+ ERR_MAIL_WRAPPED_COD = 443,
+ ERR_MAIL_CANT_SEND_REALM = 444,
+ ERR_MAIL_TEMP_RETURN_OUTAGE = 445,
+ ERR_MAIL_RECEPIENT_CANT_RECEIVE_MAIL = 446,
+ ERR_MAIL_SENT = 447,
+ ERR_MAIL_TARGET_IS_TRIAL = 448,
+ ERR_NOT_HAPPY_ENOUGH = 449,
+ ERR_USE_CANT_IMMUNE = 450,
+ ERR_CANT_BE_DISENCHANTED = 451,
+ ERR_CANT_USE_DISARMED = 452,
+ ERR_AUCTION_DATABASE_ERROR = 453,
+ ERR_AUCTION_HIGHER_BID = 454,
+ ERR_AUCTION_ALREADY_BID = 455,
+ ERR_AUCTION_OUTBID_S = 456,
+ ERR_AUCTION_WON_S = 457,
+ ERR_AUCTION_REMOVED_S = 458,
+ ERR_AUCTION_BID_PLACED = 459,
+ ERR_LOGOUT_FAILED = 460,
+ ERR_QUEST_PUSH_SUCCESS_S = 461,
+ ERR_QUEST_PUSH_INVALID_S = 462,
+ ERR_QUEST_PUSH_INVALID_TO_RECIPIENT_S = 463,
+ ERR_QUEST_PUSH_ACCEPTED_S = 464,
+ ERR_QUEST_PUSH_DECLINED_S = 465,
+ ERR_QUEST_PUSH_BUSY_S = 466,
+ ERR_QUEST_PUSH_DEAD_S = 467,
+ ERR_QUEST_PUSH_DEAD_TO_RECIPIENT_S = 468,
+ ERR_QUEST_PUSH_LOG_FULL_S = 469,
+ ERR_QUEST_PUSH_LOG_FULL_TO_RECIPIENT_S = 470,
+ ERR_QUEST_PUSH_ONQUEST_S = 471,
+ ERR_QUEST_PUSH_ONQUEST_TO_RECIPIENT_S = 472,
+ ERR_QUEST_PUSH_ALREADY_DONE_S = 473,
+ ERR_QUEST_PUSH_ALREADY_DONE_TO_RECIPIENT_S = 474,
+ ERR_QUEST_PUSH_NOT_DAILY_S = 475,
+ ERR_QUEST_PUSH_TIMER_EXPIRED_S = 476,
+ ERR_QUEST_PUSH_NOT_IN_PARTY_S = 477,
+ ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_S = 478,
+ ERR_QUEST_PUSH_DIFFERENT_SERVER_DAILY_TO_RECIPIENT_S = 479,
+ ERR_QUEST_PUSH_NOT_ALLOWED_S = 480,
+ ERR_QUEST_PUSH_PREREQUISITE_S = 481,
+ ERR_QUEST_PUSH_PREREQUISITE_TO_RECIPIENT_S = 482,
+ ERR_QUEST_PUSH_LOW_LEVEL_S = 483,
+ ERR_QUEST_PUSH_LOW_LEVEL_TO_RECIPIENT_S = 484,
+ ERR_QUEST_PUSH_HIGH_LEVEL_S = 485,
+ ERR_QUEST_PUSH_HIGH_LEVEL_TO_RECIPIENT_S = 486,
+ ERR_QUEST_PUSH_CLASS_S = 487,
+ ERR_QUEST_PUSH_CLASS_TO_RECIPIENT_S = 488,
+ ERR_QUEST_PUSH_RACE_S = 489,
+ ERR_QUEST_PUSH_RACE_TO_RECIPIENT_S = 490,
+ ERR_QUEST_PUSH_LOW_FACTION_S = 491,
+ ERR_QUEST_PUSH_LOW_FACTION_TO_RECIPIENT_S = 492,
+ ERR_QUEST_PUSH_EXPANSION_S = 493,
+ ERR_QUEST_PUSH_EXPANSION_TO_RECIPIENT_S = 494,
+ ERR_QUEST_PUSH_NOT_GARRISON_OWNER_S = 495,
+ ERR_QUEST_PUSH_NOT_GARRISON_OWNER_TO_RECIPIENT_S = 496,
+ ERR_QUEST_PUSH_WRONG_COVENANT_S = 497,
+ ERR_QUEST_PUSH_WRONG_COVENANT_TO_RECIPIENT_S = 498,
+ ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_S = 499,
+ ERR_QUEST_PUSH_NEW_PLAYER_EXPERIENCE_TO_RECIPIENT_S = 500,
+ ERR_QUEST_PUSH_WRONG_FACTION_S = 501,
+ ERR_QUEST_PUSH_WRONG_FACTION_TO_RECIPIENT_S = 502,
+ ERR_QUEST_PUSH_CROSS_FACTION_RESTRICTED_S = 503,
+ ERR_RAID_GROUP_LOWLEVEL = 504,
+ ERR_RAID_GROUP_ONLY = 505,
+ ERR_RAID_GROUP_FULL = 506,
+ ERR_RAID_GROUP_REQUIREMENTS_UNMATCH = 507,
+ ERR_CORPSE_IS_NOT_IN_INSTANCE = 508,
+ ERR_PVP_KILL_HONORABLE = 509,
+ ERR_PVP_KILL_DISHONORABLE = 510,
+ ERR_SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 511,
+ ERR_SPELL_FAILED_ALREADY_AT_FULL_MANA = 512,
+ ERR_SPELL_FAILED_ALREADY_AT_FULL_POWER_S = 513,
+ ERR_AUTOLOOT_MONEY_S = 514,
+ ERR_GENERIC_STUNNED = 515,
+ ERR_GENERIC_THROTTLE = 516,
+ ERR_CLUB_FINDER_SEARCHING_TOO_FAST = 517,
+ ERR_TARGET_STUNNED = 518,
+ ERR_MUST_REPAIR_DURABILITY = 519,
+ ERR_RAID_YOU_JOINED = 520,
+ ERR_RAID_YOU_LEFT = 521,
+ ERR_INSTANCE_GROUP_JOINED_WITH_PARTY = 522,
+ ERR_INSTANCE_GROUP_JOINED_WITH_RAID = 523,
+ ERR_RAID_MEMBER_ADDED_S = 524,
+ ERR_RAID_MEMBER_REMOVED_S = 525,
+ ERR_INSTANCE_GROUP_ADDED_S = 526,
+ ERR_INSTANCE_GROUP_REMOVED_S = 527,
+ ERR_CLICK_ON_ITEM_TO_FEED = 528,
+ ERR_TOO_MANY_CHAT_CHANNELS = 529,
+ ERR_LOOT_ROLL_PENDING = 530,
+ ERR_LOOT_PLAYER_NOT_FOUND = 531,
+ ERR_NOT_IN_RAID = 532,
+ ERR_LOGGING_OUT = 533,
+ ERR_TARGET_LOGGING_OUT = 534,
+ ERR_NOT_WHILE_MOUNTED = 535,
+ ERR_NOT_WHILE_SHAPESHIFTED = 536,
+ ERR_NOT_IN_COMBAT = 537,
+ ERR_NOT_WHILE_DISARMED = 538,
+ ERR_PET_BROKEN = 539,
+ ERR_TALENT_WIPE_ERROR = 540,
+ ERR_SPEC_WIPE_ERROR = 541,
+ ERR_GLYPH_WIPE_ERROR = 542,
+ ERR_PET_SPEC_WIPE_ERROR = 543,
+ ERR_FEIGN_DEATH_RESISTED = 544,
+ ERR_MEETING_STONE_IN_QUEUE_S = 545,
+ ERR_MEETING_STONE_LEFT_QUEUE_S = 546,
+ ERR_MEETING_STONE_OTHER_MEMBER_LEFT = 547,
+ ERR_MEETING_STONE_PARTY_KICKED_FROM_QUEUE = 548,
+ ERR_MEETING_STONE_MEMBER_STILL_IN_QUEUE = 549,
+ ERR_MEETING_STONE_SUCCESS = 550,
+ ERR_MEETING_STONE_IN_PROGRESS = 551,
+ ERR_MEETING_STONE_MEMBER_ADDED_S = 552,
+ ERR_MEETING_STONE_GROUP_FULL = 553,
+ ERR_MEETING_STONE_NOT_LEADER = 554,
+ ERR_MEETING_STONE_INVALID_LEVEL = 555,
+ ERR_MEETING_STONE_TARGET_NOT_IN_PARTY = 556,
+ ERR_MEETING_STONE_TARGET_INVALID_LEVEL = 557,
+ ERR_MEETING_STONE_MUST_BE_LEADER = 558,
+ ERR_MEETING_STONE_NO_RAID_GROUP = 559,
+ ERR_MEETING_STONE_NEED_PARTY = 560,
+ ERR_MEETING_STONE_NOT_FOUND = 561,
+ ERR_MEETING_STONE_TARGET_IN_VEHICLE = 562,
+ ERR_GUILDEMBLEM_SAME = 563,
+ ERR_EQUIP_TRADE_ITEM = 564,
+ ERR_PVP_TOGGLE_ON = 565,
+ ERR_PVP_TOGGLE_OFF = 566,
+ ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS = 567,
+ ERR_GROUP_JOIN_BATTLEGROUND_DEAD = 568,
+ ERR_GROUP_JOIN_BATTLEGROUND_S = 569,
+ ERR_GROUP_JOIN_BATTLEGROUND_FAIL = 570,
+ ERR_GROUP_JOIN_BATTLEGROUND_TOO_MANY = 571,
+ ERR_SOLO_JOIN_BATTLEGROUND_S = 572,
+ ERR_JOIN_SINGLE_SCENARIO_S = 573,
+ ERR_BATTLEGROUND_TOO_MANY_QUEUES = 574,
+ ERR_BATTLEGROUND_CANNOT_QUEUE_FOR_RATED = 575,
+ ERR_BATTLEDGROUND_QUEUED_FOR_RATED = 576,
+ ERR_BATTLEGROUND_TEAM_LEFT_QUEUE = 577,
+ ERR_BATTLEGROUND_NOT_IN_BATTLEGROUND = 578,
+ ERR_ALREADY_IN_ARENA_TEAM_S = 579,
+ ERR_INVALID_PROMOTION_CODE = 580,
+ ERR_BG_PLAYER_JOINED_SS = 581,
+ ERR_BG_PLAYER_LEFT_S = 582,
+ ERR_RESTRICTED_ACCOUNT = 583,
+ ERR_RESTRICTED_ACCOUNT_TRIAL = 584,
+ ERR_PLAY_TIME_EXCEEDED = 585,
+ ERR_APPROACHING_PARTIAL_PLAY_TIME = 586,
+ ERR_APPROACHING_PARTIAL_PLAY_TIME_2 = 587,
+ ERR_APPROACHING_NO_PLAY_TIME = 588,
+ ERR_APPROACHING_NO_PLAY_TIME_2 = 589,
+ ERR_UNHEALTHY_TIME = 590,
+ ERR_CHAT_RESTRICTED_TRIAL = 591,
+ ERR_CHAT_THROTTLED = 592,
+ ERR_MAIL_REACHED_CAP = 593,
+ ERR_INVALID_RAID_TARGET = 594,
+ ERR_RAID_LEADER_READY_CHECK_START_S = 595,
+ ERR_READY_CHECK_IN_PROGRESS = 596,
+ ERR_READY_CHECK_THROTTLED = 597,
+ ERR_DUNGEON_DIFFICULTY_FAILED = 598,
+ ERR_DUNGEON_DIFFICULTY_CHANGED_S = 599,
+ ERR_TRADE_WRONG_REALM = 600,
+ ERR_TRADE_NOT_ON_TAPLIST = 601,
+ ERR_CHAT_PLAYER_AMBIGUOUS_S = 602,
+ ERR_LOOT_CANT_LOOT_THAT_NOW = 603,
+ ERR_LOOT_MASTER_INV_FULL = 604,
+ ERR_LOOT_MASTER_UNIQUE_ITEM = 605,
+ ERR_LOOT_MASTER_OTHER = 606,
+ ERR_FILTERING_YOU_S = 607,
+ ERR_USE_PREVENTED_BY_MECHANIC_S = 608,
+ ERR_ITEM_UNIQUE_EQUIPPABLE = 609,
+ ERR_LFG_LEADER_IS_LFM_S = 610,
+ ERR_LFG_PENDING = 611,
+ ERR_CANT_SPEAK_LANGAGE = 612,
+ ERR_VENDOR_MISSING_TURNINS = 613,
+ ERR_BATTLEGROUND_NOT_IN_TEAM = 614,
+ ERR_NOT_IN_BATTLEGROUND = 615,
+ ERR_NOT_ENOUGH_HONOR_POINTS = 616,
+ ERR_NOT_ENOUGH_ARENA_POINTS = 617,
+ ERR_SOCKETING_REQUIRES_META_GEM = 618,
+ ERR_SOCKETING_META_GEM_ONLY_IN_METASLOT = 619,
+ ERR_SOCKETING_REQUIRES_HYDRAULIC_GEM = 620,
+ ERR_SOCKETING_HYDRAULIC_GEM_ONLY_IN_HYDRAULICSLOT = 621,
+ ERR_SOCKETING_REQUIRES_COGWHEEL_GEM = 622,
+ ERR_SOCKETING_COGWHEEL_GEM_ONLY_IN_COGWHEELSLOT = 623,
+ ERR_SOCKETING_ITEM_TOO_LOW_LEVEL = 624,
+ ERR_ITEM_MAX_COUNT_SOCKETED = 625,
+ ERR_SYSTEM_DISABLED = 626,
+ ERR_QUEST_FAILED_TOO_MANY_DAILY_QUESTS_I = 627,
+ ERR_ITEM_MAX_COUNT_EQUIPPED_SOCKETED = 628,
+ ERR_ITEM_UNIQUE_EQUIPPABLE_SOCKETED = 629,
+ ERR_USER_SQUELCHED = 630,
+ ERR_ACCOUNT_SILENCED = 631,
+ ERR_PARTY_MEMBER_SILENCED = 632,
+ ERR_PARTY_MEMBER_SILENCED_LFG_DELIST = 633,
+ ERR_TOO_MUCH_GOLD = 634,
+ ERR_NOT_BARBER_SITTING = 635,
+ ERR_QUEST_FAILED_CAIS = 636,
+ ERR_INVITE_RESTRICTED_TRIAL = 637,
+ ERR_VOICE_IGNORE_FULL = 638,
+ ERR_VOICE_IGNORE_SELF = 639,
+ ERR_VOICE_IGNORE_NOT_FOUND = 640,
+ ERR_VOICE_IGNORE_ALREADY_S = 641,
+ ERR_VOICE_IGNORE_ADDED_S = 642,
+ ERR_VOICE_IGNORE_REMOVED_S = 643,
+ ERR_VOICE_IGNORE_AMBIGUOUS = 644,
+ ERR_VOICE_IGNORE_DELETED = 645,
+ ERR_UNKNOWN_MACRO_OPTION_S = 646,
+ ERR_NOT_DURING_ARENA_MATCH = 647,
+ ERR_NOT_IN_RATED_BATTLEGROUND = 648,
+ ERR_PLAYER_SILENCED = 649,
+ ERR_PLAYER_UNSILENCED = 650,
+ ERR_COMSAT_DISCONNECT = 651,
+ ERR_COMSAT_RECONNECT_ATTEMPT = 652,
+ ERR_COMSAT_CONNECT_FAIL = 653,
+ ERR_MAIL_INVALID_ATTACHMENT_SLOT = 654,
+ ERR_MAIL_TOO_MANY_ATTACHMENTS = 655,
+ ERR_MAIL_INVALID_ATTACHMENT = 656,
+ ERR_MAIL_ATTACHMENT_EXPIRED = 657,
+ ERR_VOICE_CHAT_PARENTAL_DISABLE_MIC = 658,
+ ERR_PROFANE_CHAT_NAME = 659,
+ ERR_PLAYER_SILENCED_ECHO = 660,
+ ERR_PLAYER_UNSILENCED_ECHO = 661,
+ ERR_LOOT_CANT_LOOT_THAT = 662,
+ ERR_ARENA_EXPIRED_CAIS = 663,
+ ERR_GROUP_ACTION_THROTTLED = 664,
+ ERR_ALREADY_PICKPOCKETED = 665,
+ ERR_NAME_INVALID = 666,
+ ERR_NAME_NO_NAME = 667,
+ ERR_NAME_TOO_SHORT = 668,
+ ERR_NAME_TOO_LONG = 669,
+ ERR_NAME_MIXED_LANGUAGES = 670,
+ ERR_NAME_PROFANE = 671,
+ ERR_NAME_RESERVED = 672,
+ ERR_NAME_THREE_CONSECUTIVE = 673,
+ ERR_NAME_INVALID_SPACE = 674,
+ ERR_NAME_CONSECUTIVE_SPACES = 675,
+ ERR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 676,
+ ERR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 677,
+ ERR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 678,
+ ERR_RECRUIT_A_FRIEND_NOT_LINKED = 679,
+ ERR_RECRUIT_A_FRIEND_NOT_NOW = 680,
+ ERR_RECRUIT_A_FRIEND_SUMMON_LEVEL_MAX = 681,
+ ERR_RECRUIT_A_FRIEND_SUMMON_COOLDOWN = 682,
+ ERR_RECRUIT_A_FRIEND_SUMMON_OFFLINE = 683,
+ ERR_RECRUIT_A_FRIEND_INSUF_EXPAN_LVL = 684,
+ ERR_RECRUIT_A_FRIEND_MAP_INCOMING_TRANSFER_NOT_ALLOWED = 685,
+ ERR_NOT_SAME_ACCOUNT = 686,
+ ERR_BAD_ON_USE_ENCHANT = 687,
+ ERR_TRADE_SELF = 688,
+ ERR_TOO_MANY_SOCKETS = 689,
+ ERR_ITEM_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 690,
+ ERR_TRADE_TARGET_MAX_LIMIT_CATEGORY_COUNT_EXCEEDED_IS = 691,
+ ERR_ITEM_MAX_LIMIT_CATEGORY_SOCKETED_EXCEEDED_IS = 692,
+ ERR_ITEM_MAX_LIMIT_CATEGORY_EQUIPPED_EXCEEDED_IS = 693,
+ ERR_SHAPESHIFT_FORM_CANNOT_EQUIP = 694,
+ ERR_ITEM_INVENTORY_FULL_SATCHEL = 695,
+ ERR_SCALING_STAT_ITEM_LEVEL_EXCEEDED = 696,
+ ERR_SCALING_STAT_ITEM_LEVEL_TOO_LOW = 697,
+ ERR_PURCHASE_LEVEL_TOO_LOW = 698,
+ ERR_GROUP_SWAP_FAILED = 699,
+ ERR_INVITE_IN_COMBAT = 700,
+ ERR_INVALID_GLYPH_SLOT = 701,
+ ERR_GENERIC_NO_VALID_TARGETS = 702,
+ ERR_CALENDAR_EVENT_ALERT_S = 703,
+ ERR_PET_LEARN_SPELL_S = 704,
+ ERR_PET_LEARN_ABILITY_S = 705,
+ ERR_PET_SPELL_UNLEARNED_S = 706,
+ ERR_INVITE_UNKNOWN_REALM = 707,
+ ERR_INVITE_NO_PARTY_SERVER = 708,
+ ERR_INVITE_PARTY_BUSY = 709,
+ ERR_INVITE_PARTY_BUSY_PENDING_REQUEST = 710,
+ ERR_INVITE_PARTY_BUSY_PENDING_SUGGEST = 711,
+ ERR_PARTY_TARGET_AMBIGUOUS = 712,
+ ERR_PARTY_LFG_INVITE_RAID_LOCKED = 713,
+ ERR_PARTY_LFG_BOOT_LIMIT = 714,
+ ERR_PARTY_LFG_BOOT_COOLDOWN_S = 715,
+ ERR_PARTY_LFG_BOOT_NOT_ELIGIBLE_S = 716,
+ ERR_PARTY_LFG_BOOT_INPATIENT_TIMER_S = 717,
+ ERR_PARTY_LFG_BOOT_IN_PROGRESS = 718,
+ ERR_PARTY_LFG_BOOT_TOO_FEW_PLAYERS = 719,
+ ERR_PARTY_LFG_BOOT_VOTE_SUCCEEDED = 720,
+ ERR_PARTY_LFG_BOOT_VOTE_FAILED = 721,
+ ERR_PARTY_LFG_BOOT_IN_COMBAT = 722,
+ ERR_PARTY_LFG_BOOT_DUNGEON_COMPLETE = 723,
+ ERR_PARTY_LFG_BOOT_LOOT_ROLLS = 724,
+ ERR_PARTY_LFG_BOOT_VOTE_REGISTERED = 725,
+ ERR_PARTY_PRIVATE_GROUP_ONLY = 726,
+ ERR_PARTY_LFG_TELEPORT_IN_COMBAT = 727,
+ ERR_RAID_DISALLOWED_BY_LEVEL = 728,
+ ERR_RAID_DISALLOWED_BY_CROSS_REALM = 729,
+ ERR_PARTY_ROLE_NOT_AVAILABLE = 730,
+ ERR_JOIN_LFG_OBJECT_FAILED = 731,
+ ERR_LFG_REMOVED_LEVELUP = 732,
+ ERR_LFG_REMOVED_XP_TOGGLE = 733,
+ ERR_LFG_REMOVED_FACTION_CHANGE = 734,
+ ERR_BATTLEGROUND_INFO_THROTTLED = 735,
+ ERR_BATTLEGROUND_ALREADY_IN = 736,
+ ERR_ARENA_TEAM_CHANGE_FAILED_QUEUED = 737,
+ ERR_ARENA_TEAM_PERMISSIONS = 738,
+ ERR_NOT_WHILE_FALLING = 739,
+ ERR_NOT_WHILE_MOVING = 740,
+ ERR_NOT_WHILE_FATIGUED = 741,
+ ERR_MAX_SOCKETS = 742,
+ ERR_MULTI_CAST_ACTION_TOTEM_S = 743,
+ ERR_BATTLEGROUND_JOIN_LEVELUP = 744,
+ ERR_REMOVE_FROM_PVP_QUEUE_XP_GAIN = 745,
+ ERR_BATTLEGROUND_JOIN_XP_GAIN = 746,
+ ERR_BATTLEGROUND_JOIN_MERCENARY = 747,
+ ERR_BATTLEGROUND_JOIN_TOO_MANY_HEALERS = 748,
+ ERR_BATTLEGROUND_JOIN_RATED_TOO_MANY_HEALERS = 749,
+ ERR_BATTLEGROUND_JOIN_TOO_MANY_TANKS = 750,
+ ERR_BATTLEGROUND_JOIN_TOO_MANY_DAMAGE = 751,
+ ERR_RAID_DIFFICULTY_FAILED = 752,
+ ERR_RAID_DIFFICULTY_CHANGED_S = 753,
+ ERR_LEGACY_RAID_DIFFICULTY_CHANGED_S = 754,
+ ERR_RAID_LOCKOUT_CHANGED_S = 755,
+ ERR_RAID_CONVERTED_TO_PARTY = 756,
+ ERR_PARTY_CONVERTED_TO_RAID = 757,
+ ERR_PLAYER_DIFFICULTY_CHANGED_S = 758,
+ ERR_GMRESPONSE_DB_ERROR = 759,
+ ERR_BATTLEGROUND_JOIN_RANGE_INDEX = 760,
+ ERR_ARENA_JOIN_RANGE_INDEX = 761,
+ ERR_REMOVE_FROM_PVP_QUEUE_FACTION_CHANGE = 762,
+ ERR_BATTLEGROUND_JOIN_FAILED = 763,
+ ERR_BATTLEGROUND_JOIN_NO_VALID_SPEC_FOR_ROLE = 764,
+ ERR_BATTLEGROUND_JOIN_RESPEC = 765,
+ ERR_BATTLEGROUND_INVITATION_DECLINED = 766,
+ ERR_BATTLEGROUND_JOIN_TIMED_OUT = 767,
+ ERR_BATTLEGROUND_DUPE_QUEUE = 768,
+ ERR_BATTLEGROUND_JOIN_MUST_COMPLETE_QUEST = 769,
+ ERR_IN_BATTLEGROUND_RESPEC = 770,
+ ERR_MAIL_LIMITED_DURATION_ITEM = 771,
+ ERR_YELL_RESTRICTED_TRIAL = 772,
+ ERR_CHAT_RAID_RESTRICTED_TRIAL = 773,
+ ERR_LFG_ROLE_CHECK_FAILED = 774,
+ ERR_LFG_ROLE_CHECK_FAILED_TIMEOUT = 775,
+ ERR_LFG_ROLE_CHECK_FAILED_NOT_VIABLE = 776,
+ ERR_LFG_READY_CHECK_FAILED = 777,
+ ERR_LFG_READY_CHECK_FAILED_TIMEOUT = 778,
+ ERR_LFG_GROUP_FULL = 779,
+ ERR_LFG_NO_LFG_OBJECT = 780,
+ ERR_LFG_NO_SLOTS_PLAYER = 781,
+ ERR_LFG_NO_SLOTS_PARTY = 782,
+ ERR_LFG_NO_SPEC = 783,
+ ERR_LFG_MISMATCHED_SLOTS = 784,
+ ERR_LFG_MISMATCHED_SLOTS_LOCAL_XREALM = 785,
+ ERR_LFG_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 786,
+ ERR_LFG_MEMBERS_NOT_PRESENT = 787,
+ ERR_LFG_GET_INFO_TIMEOUT = 788,
+ ERR_LFG_INVALID_SLOT = 789,
+ ERR_LFG_DESERTER_PLAYER = 790,
+ ERR_LFG_DESERTER_PARTY = 791,
+ ERR_LFG_DEAD = 792,
+ ERR_LFG_RANDOM_COOLDOWN_PLAYER = 793,
+ ERR_LFG_RANDOM_COOLDOWN_PARTY = 794,
+ ERR_LFG_TOO_MANY_MEMBERS = 795,
+ ERR_LFG_TOO_FEW_MEMBERS = 796,
+ ERR_LFG_PROPOSAL_FAILED = 797,
+ ERR_LFG_PROPOSAL_DECLINED_SELF = 798,
+ ERR_LFG_PROPOSAL_DECLINED_PARTY = 799,
+ ERR_LFG_NO_SLOTS_SELECTED = 800,
+ ERR_LFG_NO_ROLES_SELECTED = 801,
+ ERR_LFG_ROLE_CHECK_INITIATED = 802,
+ ERR_LFG_READY_CHECK_INITIATED = 803,
+ ERR_LFG_PLAYER_DECLINED_ROLE_CHECK = 804,
+ ERR_LFG_PLAYER_DECLINED_READY_CHECK = 805,
+ ERR_LFG_JOINED_QUEUE = 806,
+ ERR_LFG_JOINED_FLEX_QUEUE = 807,
+ ERR_LFG_JOINED_RF_QUEUE = 808,
+ ERR_LFG_JOINED_SCENARIO_QUEUE = 809,
+ ERR_LFG_JOINED_WORLD_PVP_QUEUE = 810,
+ ERR_LFG_JOINED_BATTLEFIELD_QUEUE = 811,
+ ERR_LFG_JOINED_LIST = 812,
+ ERR_LFG_LEFT_QUEUE = 813,
+ ERR_LFG_LEFT_LIST = 814,
+ ERR_LFG_ROLE_CHECK_ABORTED = 815,
+ ERR_LFG_READY_CHECK_ABORTED = 816,
+ ERR_LFG_CANT_USE_BATTLEGROUND = 817,
+ ERR_LFG_CANT_USE_DUNGEONS = 818,
+ ERR_LFG_REASON_TOO_MANY_LFG = 819,
+ ERR_LFG_FARM_LIMIT = 820,
+ ERR_LFG_NO_CROSS_FACTION_PARTIES = 821,
+ ERR_INVALID_TELEPORT_LOCATION = 822,
+ ERR_TOO_FAR_TO_INTERACT = 823,
+ ERR_BATTLEGROUND_PLAYERS_FROM_DIFFERENT_REALMS = 824,
+ ERR_DIFFICULTY_CHANGE_COOLDOWN_S = 825,
+ ERR_DIFFICULTY_CHANGE_COMBAT_COOLDOWN_S = 826,
+ ERR_DIFFICULTY_CHANGE_WORLDSTATE = 827,
+ ERR_DIFFICULTY_CHANGE_ENCOUNTER = 828,
+ ERR_DIFFICULTY_CHANGE_COMBAT = 829,
+ ERR_DIFFICULTY_CHANGE_PLAYER_BUSY = 830,
+ ERR_DIFFICULTY_CHANGE_ALREADY_STARTED = 831,
+ ERR_DIFFICULTY_CHANGE_OTHER_HEROIC_S = 832,
+ ERR_DIFFICULTY_CHANGE_HEROIC_INSTANCE_ALREADY_RUNNING = 833,
+ ERR_ARENA_TEAM_PARTY_SIZE = 834,
+ ERR_SOLO_SHUFFLE_WARGAME_GROUP_SIZE = 835,
+ ERR_SOLO_SHUFFLE_WARGAME_GROUP_COMP = 836,
+ ERR_SOLO_SHUFFLE_MIN_ITEM_LEVEL = 837,
+ ERR_PVP_PLAYER_ABANDONED = 838,
+ ERR_QUEST_FORCE_REMOVED_S = 839,
+ ERR_ATTACK_NO_ACTIONS = 840,
+ ERR_IN_RANDOM_BG = 841,
+ ERR_IN_NON_RANDOM_BG = 842,
+ ERR_BN_FRIEND_SELF = 843,
+ ERR_BN_FRIEND_ALREADY = 844,
+ ERR_BN_FRIEND_BLOCKED = 845,
+ ERR_BN_FRIEND_LIST_FULL = 846,
+ ERR_BN_FRIEND_REQUEST_SENT = 847,
+ ERR_BN_BROADCAST_THROTTLE = 848,
+ ERR_BG_DEVELOPER_ONLY = 849,
+ ERR_CURRENCY_SPELL_SLOT_MISMATCH = 850,
+ ERR_CURRENCY_NOT_TRADABLE = 851,
+ ERR_REQUIRES_EXPANSION_S = 852,
+ ERR_QUEST_FAILED_SPELL = 853,
+ ERR_TALENT_FAILED_UNSPENT_TALENT_POINTS = 854,
+ ERR_TALENT_FAILED_NOT_ENOUGH_TALENTS_IN_PRIMARY_TREE = 855,
+ ERR_TALENT_FAILED_NO_PRIMARY_TREE_SELECTED = 856,
+ ERR_TALENT_FAILED_CANT_REMOVE_TALENT = 857,
+ ERR_TALENT_FAILED_UNKNOWN = 858,
+ ERR_TALENT_FAILED_IN_COMBAT = 859,
+ ERR_TALENT_FAILED_IN_PVP_MATCH = 860,
+ ERR_TALENT_FAILED_IN_MYTHIC_PLUS = 861,
+ ERR_WARGAME_REQUEST_FAILURE = 862,
+ ERR_RANK_REQUIRES_AUTHENTICATOR = 863,
+ ERR_GUILD_BANK_VOUCHER_FAILED = 864,
+ ERR_WARGAME_REQUEST_SENT = 865,
+ ERR_REQUIRES_ACHIEVEMENT_I = 866,
+ ERR_REFUND_RESULT_EXCEED_MAX_CURRENCY = 867,
+ ERR_CANT_BUY_QUANTITY = 868,
+ ERR_ITEM_IS_BATTLE_PAY_LOCKED = 869,
+ ERR_PARTY_ALREADY_IN_BATTLEGROUND_QUEUE = 870,
+ ERR_PARTY_CONFIRMING_BATTLEGROUND_QUEUE = 871,
+ ERR_BATTLEFIELD_TEAM_PARTY_SIZE = 872,
+ ERR_INSUFF_TRACKED_CURRENCY_IS = 873,
+ ERR_NOT_ON_TOURNAMENT_REALM = 874,
+ ERR_GUILD_TRIAL_ACCOUNT_TRIAL = 875,
+ ERR_GUILD_TRIAL_ACCOUNT_VETERAN = 876,
+ ERR_GUILD_UNDELETABLE_DUE_TO_LEVEL = 877,
+ ERR_CANT_DO_THAT_IN_A_GROUP = 878,
+ ERR_GUILD_LEADER_REPLACED = 879,
+ ERR_TRANSMOGRIFY_CANT_EQUIP = 880,
+ ERR_TRANSMOGRIFY_INVALID_ITEM_TYPE = 881,
+ ERR_TRANSMOGRIFY_NOT_SOULBOUND = 882,
+ ERR_TRANSMOGRIFY_INVALID_SOURCE = 883,
+ ERR_TRANSMOGRIFY_INVALID_DESTINATION = 884,
+ ERR_TRANSMOGRIFY_MISMATCH = 885,
+ ERR_TRANSMOGRIFY_LEGENDARY = 886,
+ ERR_TRANSMOGRIFY_SAME_ITEM = 887,
+ ERR_TRANSMOGRIFY_SAME_APPEARANCE = 888,
+ ERR_TRANSMOGRIFY_NOT_EQUIPPED = 889,
+ ERR_VOID_DEPOSIT_FULL = 890,
+ ERR_VOID_WITHDRAW_FULL = 891,
+ ERR_VOID_STORAGE_WRAPPED = 892,
+ ERR_VOID_STORAGE_STACKABLE = 893,
+ ERR_VOID_STORAGE_UNBOUND = 894,
+ ERR_VOID_STORAGE_REPAIR = 895,
+ ERR_VOID_STORAGE_CHARGES = 896,
+ ERR_VOID_STORAGE_QUEST = 897,
+ ERR_VOID_STORAGE_CONJURED = 898,
+ ERR_VOID_STORAGE_MAIL = 899,
+ ERR_VOID_STORAGE_BAG = 900,
+ ERR_VOID_TRANSFER_STORAGE_FULL = 901,
+ ERR_VOID_TRANSFER_INV_FULL = 902,
+ ERR_VOID_TRANSFER_INTERNAL_ERROR = 903,
+ ERR_VOID_TRANSFER_ITEM_INVALID = 904,
+ ERR_DIFFICULTY_DISABLED_IN_LFG = 905,
+ ERR_VOID_STORAGE_UNIQUE = 906,
+ ERR_VOID_STORAGE_LOOT = 907,
+ ERR_VOID_STORAGE_HOLIDAY = 908,
+ ERR_VOID_STORAGE_DURATION = 909,
+ ERR_VOID_STORAGE_LOAD_FAILED = 910,
+ ERR_VOID_STORAGE_INVALID_ITEM = 911,
+ ERR_PARENTAL_CONTROLS_CHAT_MUTED = 912,
+ ERR_SOR_START_EXPERIENCE_INCOMPLETE = 913,
+ ERR_SOR_INVALID_EMAIL = 914,
+ ERR_SOR_INVALID_COMMENT = 915,
+ ERR_CHALLENGE_MODE_RESET_COOLDOWN_S = 916,
+ ERR_CHALLENGE_MODE_RESET_KEYSTONE = 917,
+ ERR_PET_JOURNAL_ALREADY_IN_LOADOUT = 918,
+ ERR_REPORT_SUBMITTED_SUCCESSFULLY = 919,
+ ERR_REPORT_SUBMISSION_FAILED = 920,
+ ERR_SUGGESTION_SUBMITTED_SUCCESSFULLY = 921,
+ ERR_BUG_SUBMITTED_SUCCESSFULLY = 922,
+ ERR_CHALLENGE_MODE_ENABLED = 923,
+ ERR_CHALLENGE_MODE_DISABLED = 924,
+ ERR_PETBATTLE_CREATE_FAILED = 925,
+ ERR_PETBATTLE_NOT_HERE = 926,
+ ERR_PETBATTLE_NOT_HERE_ON_TRANSPORT = 927,
+ ERR_PETBATTLE_NOT_HERE_UNEVEN_GROUND = 928,
+ ERR_PETBATTLE_NOT_HERE_OBSTRUCTED = 929,
+ ERR_PETBATTLE_NOT_WHILE_IN_COMBAT = 930,
+ ERR_PETBATTLE_NOT_WHILE_DEAD = 931,
+ ERR_PETBATTLE_NOT_WHILE_FLYING = 932,
+ ERR_PETBATTLE_TARGET_INVALID = 933,
+ ERR_PETBATTLE_TARGET_OUT_OF_RANGE = 934,
+ ERR_PETBATTLE_TARGET_NOT_CAPTURABLE = 935,
+ ERR_PETBATTLE_NOT_A_TRAINER = 936,
+ ERR_PETBATTLE_DECLINED = 937,
+ ERR_PETBATTLE_IN_BATTLE = 938,
+ ERR_PETBATTLE_INVALID_LOADOUT = 939,
+ ERR_PETBATTLE_ALL_PETS_DEAD = 940,
+ ERR_PETBATTLE_NO_PETS_IN_SLOTS = 941,
+ ERR_PETBATTLE_NO_ACCOUNT_LOCK = 942,
+ ERR_PETBATTLE_WILD_PET_TAPPED = 943,
+ ERR_PETBATTLE_RESTRICTED_ACCOUNT = 944,
+ ERR_PETBATTLE_OPPONENT_NOT_AVAILABLE = 945,
+ ERR_PETBATTLE_NOT_WHILE_IN_MATCHED_BATTLE = 946,
+ ERR_CANT_HAVE_MORE_PETS_OF_THAT_TYPE = 947,
+ ERR_CANT_HAVE_MORE_PETS = 948,
+ ERR_PVP_MAP_NOT_FOUND = 949,
+ ERR_PVP_MAP_NOT_SET = 950,
+ ERR_PETBATTLE_QUEUE_QUEUED = 951,
+ ERR_PETBATTLE_QUEUE_ALREADY_QUEUED = 952,
+ ERR_PETBATTLE_QUEUE_JOIN_FAILED = 953,
+ ERR_PETBATTLE_QUEUE_JOURNAL_LOCK = 954,
+ ERR_PETBATTLE_QUEUE_REMOVED = 955,
+ ERR_PETBATTLE_QUEUE_PROPOSAL_DECLINED = 956,
+ ERR_PETBATTLE_QUEUE_PROPOSAL_TIMEOUT = 957,
+ ERR_PETBATTLE_QUEUE_OPPONENT_DECLINED = 958,
+ ERR_PETBATTLE_QUEUE_REQUEUED_INTERNAL = 959,
+ ERR_PETBATTLE_QUEUE_REQUEUED_REMOVED = 960,
+ ERR_PETBATTLE_QUEUE_SLOT_LOCKED = 961,
+ ERR_PETBATTLE_QUEUE_SLOT_EMPTY = 962,
+ ERR_PETBATTLE_QUEUE_SLOT_NO_TRACKER = 963,
+ ERR_PETBATTLE_QUEUE_SLOT_NO_SPECIES = 964,
+ ERR_PETBATTLE_QUEUE_SLOT_CANT_BATTLE = 965,
+ ERR_PETBATTLE_QUEUE_SLOT_REVOKED = 966,
+ ERR_PETBATTLE_QUEUE_SLOT_DEAD = 967,
+ ERR_PETBATTLE_QUEUE_SLOT_NO_PET = 968,
+ ERR_PETBATTLE_QUEUE_NOT_WHILE_NEUTRAL = 969,
+ ERR_PETBATTLE_GAME_TIME_LIMIT_WARNING = 970,
+ ERR_PETBATTLE_GAME_ROUNDS_LIMIT_WARNING = 971,
+ ERR_HAS_RESTRICTION = 972,
+ ERR_ITEM_UPGRADE_ITEM_TOO_LOW_LEVEL = 973,
+ ERR_ITEM_UPGRADE_NO_PATH = 974,
+ ERR_ITEM_UPGRADE_NO_MORE_UPGRADES = 975,
+ ERR_BONUS_ROLL_EMPTY = 976,
+ ERR_CHALLENGE_MODE_FULL = 977,
+ ERR_CHALLENGE_MODE_IN_PROGRESS = 978,
+ ERR_CHALLENGE_MODE_INCORRECT_KEYSTONE = 979,
+ ERR_BATTLETAG_FRIEND_NOT_FOUND = 980,
+ ERR_BATTLETAG_FRIEND_NOT_VALID = 981,
+ ERR_BATTLETAG_FRIEND_NOT_ALLOWED = 982,
+ ERR_BATTLETAG_FRIEND_THROTTLED = 983,
+ ERR_BATTLETAG_FRIEND_SUCCESS = 984,
+ ERR_PET_TOO_HIGH_LEVEL_TO_UNCAGE = 985,
+ ERR_PETBATTLE_INTERNAL = 986,
+ ERR_CANT_CAGE_PET_YET = 987,
+ ERR_NO_LOOT_IN_CHALLENGE_MODE = 988,
+ ERR_QUEST_PET_BATTLE_VICTORIES_PVP_II = 989,
+ ERR_ROLE_CHECK_ALREADY_IN_PROGRESS = 990,
+ ERR_RECRUIT_A_FRIEND_ACCOUNT_LIMIT = 991,
+ ERR_RECRUIT_A_FRIEND_FAILED = 992,
+ ERR_SET_LOOT_PERSONAL = 993,
+ ERR_SET_LOOT_METHOD_FAILED_COMBAT = 994,
+ ERR_REAGENT_BANK_FULL = 995,
+ ERR_REAGENT_BANK_LOCKED = 996,
+ ERR_GARRISON_BUILDING_EXISTS = 997,
+ ERR_GARRISON_INVALID_PLOT = 998,
+ ERR_GARRISON_INVALID_BUILDINGID = 999,
+ ERR_GARRISON_INVALID_PLOT_BUILDING = 1000,
+ ERR_GARRISON_REQUIRES_BLUEPRINT = 1001,
+ ERR_GARRISON_NOT_ENOUGH_CURRENCY = 1002,
+ ERR_GARRISON_NOT_ENOUGH_GOLD = 1003,
+ ERR_GARRISON_COMPLETE_MISSION_WRONG_FOLLOWER_TYPE = 1004,
+ ERR_ALREADY_USING_LFG_LIST = 1005,
+ ERR_RESTRICTED_ACCOUNT_LFG_LIST_TRIAL = 1006,
+ ERR_TOY_USE_LIMIT_REACHED = 1007,
+ ERR_TOY_ALREADY_KNOWN = 1008,
+ ERR_TRANSMOG_SET_ALREADY_KNOWN = 1009,
+ ERR_NOT_ENOUGH_CURRENCY = 1010,
+ ERR_SPEC_IS_DISABLED = 1011,
+ ERR_FEATURE_RESTRICTED_TRIAL = 1012,
+ ERR_CANT_BE_OBLITERATED = 1013,
+ ERR_CANT_BE_SCRAPPED = 1014,
+ ERR_CANT_BE_RECRAFTED = 1015,
+ ERR_ARTIFACT_RELIC_DOES_NOT_MATCH_ARTIFACT = 1016,
+ ERR_MUST_EQUIP_ARTIFACT = 1017,
+ ERR_CANT_DO_THAT_RIGHT_NOW = 1018,
+ ERR_AFFECTING_COMBAT = 1019,
+ ERR_EQUIPMENT_MANAGER_COMBAT_SWAP_S = 1020,
+ ERR_EQUIPMENT_MANAGER_BAGS_FULL = 1021,
+ ERR_EQUIPMENT_MANAGER_MISSING_ITEM_S = 1022,
+ ERR_MOVIE_RECORDING_WARNING_PERF = 1023,
+ ERR_MOVIE_RECORDING_WARNING_DISK_FULL = 1024,
+ ERR_MOVIE_RECORDING_WARNING_NO_MOVIE = 1025,
+ ERR_MOVIE_RECORDING_WARNING_REQUIREMENTS = 1026,
+ ERR_MOVIE_RECORDING_WARNING_COMPRESSING = 1027,
+ ERR_NO_CHALLENGE_MODE_REWARD = 1028,
+ ERR_CLAIMED_CHALLENGE_MODE_REWARD = 1029,
+ ERR_CHALLENGE_MODE_PERIOD_RESET_SS = 1030,
+ ERR_CANT_DO_THAT_CHALLENGE_MODE_ACTIVE = 1031,
+ ERR_TALENT_FAILED_REST_AREA = 1032,
+ ERR_CANNOT_ABANDON_LAST_PET = 1033,
+ ERR_TEST_CVAR_SET_SSS = 1034,
+ ERR_QUEST_TURN_IN_FAIL_REASON = 1035,
+ ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 1036,
+ ERR_TALENT_GRANTED_BY_AURA = 1037,
+ ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 1038,
+ ERR_GLYPH_TARGET_NOT_AVAILABLE = 1039,
+ ERR_PVP_WARMODE_TOGGLE_ON = 1040,
+ ERR_PVP_WARMODE_TOGGLE_OFF = 1041,
+ ERR_SPELL_FAILED_LEVEL_REQUIREMENT = 1042,
+ ERR_SPELL_FAILED_CANT_FLY_HERE = 1043,
+ ERR_BATTLEGROUND_JOIN_REQUIRES_LEVEL = 1044,
+ ERR_BATTLEGROUND_JOIN_DISQUALIFIED = 1045,
+ ERR_BATTLEGROUND_JOIN_DISQUALIFIED_NO_NAME = 1046,
+ ERR_VOICE_CHAT_GENERIC_UNABLE_TO_CONNECT = 1047,
+ ERR_VOICE_CHAT_SERVICE_LOST = 1048,
+ ERR_VOICE_CHAT_CHANNEL_NAME_TOO_SHORT = 1049,
+ ERR_VOICE_CHAT_CHANNEL_NAME_TOO_LONG = 1050,
+ ERR_VOICE_CHAT_CHANNEL_ALREADY_EXISTS = 1051,
+ ERR_VOICE_CHAT_TARGET_NOT_FOUND = 1052,
+ ERR_VOICE_CHAT_TOO_MANY_REQUESTS = 1053,
+ ERR_VOICE_CHAT_PLAYER_SILENCED = 1054,
+ ERR_VOICE_CHAT_PARENTAL_DISABLE_ALL = 1055,
+ ERR_VOICE_CHAT_DISABLED = 1056,
+ ERR_NO_PVP_REWARD = 1057,
+ ERR_CLAIMED_PVP_REWARD = 1058,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_ESSENCE_NOT_UNLOCKED = 1059,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_CANT_REMOVE_ESSENCE = 1060,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_CONDITION_FAILED = 1061,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_REST_AREA = 1062,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_SLOT_LOCKED = 1063,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_AT_FORGE = 1064,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_HEART_LEVEL_TOO_LOW = 1065,
+ ERR_AZERITE_ESSENCE_SELECTION_FAILED_NOT_EQUIPPED = 1066,
+ ERR_SOCKETING_REQUIRES_PUNCHCARDRED_GEM = 1067,
+ ERR_SOCKETING_PUNCHCARDRED_GEM_ONLY_IN_PUNCHCARDREDSLOT = 1068,
+ ERR_SOCKETING_REQUIRES_PUNCHCARDYELLOW_GEM = 1069,
+ ERR_SOCKETING_PUNCHCARDYELLOW_GEM_ONLY_IN_PUNCHCARDYELLOWSLOT = 1070,
+ ERR_SOCKETING_REQUIRES_PUNCHCARDBLUE_GEM = 1071,
+ ERR_SOCKETING_PUNCHCARDBLUE_GEM_ONLY_IN_PUNCHCARDBLUESLOT = 1072,
+ ERR_SOCKETING_REQUIRES_DOMINATION_SHARD = 1073,
+ ERR_SOCKETING_DOMINATION_SHARD_ONLY_IN_DOMINATIONSLOT = 1074,
+ ERR_SOCKETING_REQUIRES_CYPHER_GEM = 1075,
+ ERR_SOCKETING_CYPHER_GEM_ONLY_IN_CYPHERSLOT = 1076,
+ ERR_SOCKETING_REQUIRES_TINKER_GEM = 1077,
+ ERR_SOCKETING_TINKER_GEM_ONLY_IN_TINKERSLOT = 1078,
+ ERR_LEVEL_LINKING_RESULT_LINKED = 1079,
+ ERR_LEVEL_LINKING_RESULT_UNLINKED = 1080,
+ ERR_CLUB_FINDER_ERROR_POST_CLUB = 1081,
+ ERR_CLUB_FINDER_ERROR_APPLY_CLUB = 1082,
+ ERR_CLUB_FINDER_ERROR_RESPOND_APPLICANT = 1083,
+ ERR_CLUB_FINDER_ERROR_CANCEL_APPLICATION = 1084,
+ ERR_CLUB_FINDER_ERROR_TYPE_ACCEPT_APPLICATION = 1085,
+ ERR_CLUB_FINDER_ERROR_TYPE_NO_INVITE_PERMISSIONS = 1086,
+ ERR_CLUB_FINDER_ERROR_TYPE_NO_POSTING_PERMISSIONS = 1087,
+ ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST = 1088,
+ ERR_CLUB_FINDER_ERROR_TYPE_APPLICANT_LIST_NO_PERM = 1089,
+ ERR_CLUB_FINDER_ERROR_TYPE_FINDER_NOT_AVAILABLE = 1090,
+ ERR_CLUB_FINDER_ERROR_TYPE_GET_POSTING_IDS = 1091,
+ ERR_CLUB_FINDER_ERROR_TYPE_JOIN_APPLICATION = 1092,
+ ERR_CLUB_FINDER_ERROR_TYPE_REALM_NOT_ELIGIBLE = 1093,
+ ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_RENAME = 1094,
+ ERR_CLUB_FINDER_ERROR_TYPE_FLAGGED_DESCRIPTION_CHANGE = 1095,
+ ERR_ITEM_INTERACTION_NOT_ENOUGH_GOLD = 1096,
+ ERR_ITEM_INTERACTION_NOT_ENOUGH_CURRENCY = 1097,
+ ERR_PLAYER_CHOICE_ERROR_PENDING_CHOICE = 1098,
+ ERR_SOULBIND_INVALID_CONDUIT = 1099,
+ ERR_SOULBIND_INVALID_CONDUIT_ITEM = 1100,
+ ERR_SOULBIND_INVALID_TALENT = 1101,
+ ERR_SOULBIND_DUPLICATE_CONDUIT = 1102,
+ ERR_ACTIVATE_SOULBIND_S = 1103,
+ ERR_ACTIVATE_SOULBIND_FAILED_REST_AREA = 1104,
+ ERR_CANT_USE_PROFANITY = 1105,
+ ERR_NOT_IN_PET_BATTLE = 1106,
+ ERR_NOT_IN_NPE = 1107,
+ ERR_NO_SPEC = 1108,
+ ERR_NO_DOMINATIONSHARD_OVERWRITE = 1109,
+ ERR_USE_WEEKLY_REWARDS_DISABLED = 1110,
+ ERR_CROSS_FACTION_GROUP_JOINED = 1111,
+ ERR_CANT_TARGET_UNFRIENDLY_IN_OVERWORLD = 1112,
+ ERR_EQUIPABLESPELLS_SLOTS_FULL = 1113,
};
enum class MountResult : uint32
diff --git a/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp b/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp
index b5eb76a3025..1ca68bada9c 100644
--- a/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp
+++ b/src/server/game/Miscellaneous/enuminfo_RaceMask.cpp
@@ -56,12 +56,14 @@ TC_API_EXPORT EnumText EnumUtils<Races>::ToString(Races value)
case RACE_VULPERA: return { "RACE_VULPERA", "Vulpera", "Vulpera (RaceMask bit 12)" };
case RACE_MAGHAR_ORC: return { "RACE_MAGHAR_ORC", "Mag'har Orc", "Mag'har Orc (RaceMask bit 13)" };
case RACE_MECHAGNOME: return { "RACE_MECHAGNOME", "Mechagnome", "Mechagnome (RaceMask bit 14)" };
+ case RACE_DRACTHYR_ALLIANCE: return { "RACE_DRACTHYR_ALLIANCE", "Dracthyr", "Dracthyr (Alliance) (RaceMask bit 16)" };
+ case RACE_DRACTHYR_HORDE: return { "RACE_DRACTHYR_HORDE", "Dracthyr", "Dracthyr (Horde) (RaceMask bit 15)" };
default: throw std::out_of_range("value");
}
}
template <>
-TC_API_EXPORT size_t EnumUtils<Races>::Count() { return 25; }
+TC_API_EXPORT size_t EnumUtils<Races>::Count() { return 27; }
template <>
TC_API_EXPORT Races EnumUtils<Races>::FromIndex(size_t index)
@@ -93,6 +95,8 @@ TC_API_EXPORT Races EnumUtils<Races>::FromIndex(size_t index)
case 22: return RACE_VULPERA;
case 23: return RACE_MAGHAR_ORC;
case 24: return RACE_MECHAGNOME;
+ case 25: return RACE_DRACTHYR_ALLIANCE;
+ case 26: return RACE_DRACTHYR_HORDE;
default: throw std::out_of_range("index");
}
}
@@ -127,6 +131,8 @@ TC_API_EXPORT size_t EnumUtils<Races>::ToIndex(Races value)
case RACE_VULPERA: return 22;
case RACE_MAGHAR_ORC: return 23;
case RACE_MECHAGNOME: return 24;
+ case RACE_DRACTHYR_ALLIANCE: return 25;
+ case RACE_DRACTHYR_HORDE: return 26;
default: throw std::out_of_range("value");
}
}
diff --git a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
index d5300a4832a..60be1fd2ddd 100644
--- a/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
+++ b/src/server/game/Miscellaneous/enuminfo_SharedDefines.cpp
@@ -43,12 +43,14 @@ TC_API_EXPORT EnumText EnumUtils<Classes>::ToString(Classes value)
case CLASS_MONK: return { "CLASS_MONK", "Monk", "" };
case CLASS_DRUID: return { "CLASS_DRUID", "Druid", "" };
case CLASS_DEMON_HUNTER: return { "CLASS_DEMON_HUNTER", "Demon Hunter", "" };
+ case CLASS_EVOKER: return { "CLASS_EVOKER", "Evoker", "" };
+ case CLASS_ADVENTURER: return { "CLASS_ADVENTURER", "Adventurer", "" };
default: throw std::out_of_range("value");
}
}
template <>
-TC_API_EXPORT size_t EnumUtils<Classes>::Count() { return 12; }
+TC_API_EXPORT size_t EnumUtils<Classes>::Count() { return 14; }
template <>
TC_API_EXPORT Classes EnumUtils<Classes>::FromIndex(size_t index)
@@ -67,6 +69,8 @@ TC_API_EXPORT Classes EnumUtils<Classes>::FromIndex(size_t index)
case 9: return CLASS_MONK;
case 10: return CLASS_DRUID;
case 11: return CLASS_DEMON_HUNTER;
+ case 12: return CLASS_EVOKER;
+ case 13: return CLASS_ADVENTURER;
default: throw std::out_of_range("index");
}
}
@@ -88,6 +92,8 @@ TC_API_EXPORT size_t EnumUtils<Classes>::ToIndex(Classes value)
case CLASS_MONK: return 9;
case CLASS_DRUID: return 10;
case CLASS_DEMON_HUNTER: return 11;
+ case CLASS_EVOKER: return 12;
+ case CLASS_ADVENTURER: return 13;
default: throw std::out_of_range("value");
}
}
@@ -120,12 +126,13 @@ TC_API_EXPORT EnumText EnumUtils<Powers>::ToString(Powers value)
case POWER_ARCANE_CHARGES: return { "POWER_ARCANE_CHARGES", "Arcane Charges", "" };
case POWER_FURY: return { "POWER_FURY", "Fury", "" };
case POWER_PAIN: return { "POWER_PAIN", "Pain", "" };
+ case POWER_ESSENCE: return { "POWER_ESSENCE", "Essence", "" };
default: throw std::out_of_range("value");
}
}
template <>
-TC_API_EXPORT size_t EnumUtils<Powers>::Count() { return 20; }
+TC_API_EXPORT size_t EnumUtils<Powers>::Count() { return 21; }
template <>
TC_API_EXPORT Powers EnumUtils<Powers>::FromIndex(size_t index)
@@ -152,6 +159,7 @@ TC_API_EXPORT Powers EnumUtils<Powers>::FromIndex(size_t index)
case 17: return POWER_ARCANE_CHARGES;
case 18: return POWER_FURY;
case 19: return POWER_PAIN;
+ case 20: return POWER_ESSENCE;
default: throw std::out_of_range("index");
}
}
@@ -181,6 +189,7 @@ TC_API_EXPORT size_t EnumUtils<Powers>::ToIndex(Powers value)
case POWER_ARCANE_CHARGES: return 17;
case POWER_FURY: return 18;
case POWER_PAIN: return 19;
+ case POWER_ESSENCE: return 20;
default: throw std::out_of_range("value");
}
}
@@ -2198,8 +2207,8 @@ TC_API_EXPORT EnumText EnumUtils<SpellCastResult>::ToString(SpellCastResult valu
case SPELL_FAILED_BAD_TARGETS: return { "SPELL_FAILED_BAD_TARGETS", "SPELL_FAILED_BAD_TARGETS", "" };
case SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED: return { "SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED", "SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED", "" };
case SPELL_FAILED_CANT_BE_CHARMED: return { "SPELL_FAILED_CANT_BE_CHARMED", "SPELL_FAILED_CANT_BE_CHARMED", "" };
- case SPELL_FAILED_CANT_BE_DISENCHANTED: return { "SPELL_FAILED_CANT_BE_DISENCHANTED", "SPELL_FAILED_CANT_BE_DISENCHANTED", "" };
- case SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL: return { "SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL", "SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL", "" };
+ case SPELL_FAILED_CANT_BE_SALVAGED: return { "SPELL_FAILED_CANT_BE_SALVAGED", "SPELL_FAILED_CANT_BE_SALVAGED", "" };
+ case SPELL_FAILED_CANT_BE_SALVAGED_SKILL: return { "SPELL_FAILED_CANT_BE_SALVAGED_SKILL", "SPELL_FAILED_CANT_BE_SALVAGED_SKILL", "" };
case SPELL_FAILED_CANT_BE_ENCHANTED: return { "SPELL_FAILED_CANT_BE_ENCHANTED", "SPELL_FAILED_CANT_BE_ENCHANTED", "" };
case SPELL_FAILED_CANT_BE_MILLED: return { "SPELL_FAILED_CANT_BE_MILLED", "SPELL_FAILED_CANT_BE_MILLED", "" };
case SPELL_FAILED_CANT_BE_PROSPECTED: return { "SPELL_FAILED_CANT_BE_PROSPECTED", "SPELL_FAILED_CANT_BE_PROSPECTED", "" };
@@ -2492,19 +2501,22 @@ TC_API_EXPORT EnumText EnumUtils<SpellCastResult>::ToString(SpellCastResult valu
case SPELL_FAILED_INELIGIBLE_WEAPON_APPEARANCE: return { "SPELL_FAILED_INELIGIBLE_WEAPON_APPEARANCE", "SPELL_FAILED_INELIGIBLE_WEAPON_APPEARANCE", "" };
case SPELL_FAILED_PLAYER_CONDITION: return { "SPELL_FAILED_PLAYER_CONDITION", "SPELL_FAILED_PLAYER_CONDITION", "" };
case SPELL_FAILED_NOT_WHILE_CHROMIE_TIMED: return { "SPELL_FAILED_NOT_WHILE_CHROMIE_TIMED", "SPELL_FAILED_NOT_WHILE_CHROMIE_TIMED", "" };
- case SPELL_FAILED_OPTIONAL_REAGENTS: return { "SPELL_FAILED_OPTIONAL_REAGENTS", "SPELL_FAILED_OPTIONAL_REAGENTS", "" };
+ case SPELL_FAILED_CRAFTING_REAGENTS: return { "SPELL_FAILED_CRAFTING_REAGENTS", "SPELL_FAILED_CRAFTING_REAGENTS", "" };
case SPELL_FAILED_SPECTATOR_OR_COMMENTATOR: return { "SPELL_FAILED_SPECTATOR_OR_COMMENTATOR", "SPELL_FAILED_SPECTATOR_OR_COMMENTATOR", "" };
case SPELL_FAILED_SOULBIND_CONDUIT_LEARN_FAILED_INVALID_COVENANT: return { "SPELL_FAILED_SOULBIND_CONDUIT_LEARN_FAILED_INVALID_COVENANT", "SPELL_FAILED_SOULBIND_CONDUIT_LEARN_FAILED_INVALID_COVENANT", "" };
case SPELL_FAILED_SHADOWLANDS_RIDING_REQUIREMENT: return { "SPELL_FAILED_SHADOWLANDS_RIDING_REQUIREMENT", "SPELL_FAILED_SHADOWLANDS_RIDING_REQUIREMENT", "" };
case SPELL_FAILED_NOT_IN_MAGE_TOWER: return { "SPELL_FAILED_NOT_IN_MAGE_TOWER", "SPELL_FAILED_NOT_IN_MAGE_TOWER", "" };
case SPELL_FAILED_GARRISON_FOLLOWER_AT_MIN_LEVEL: return { "SPELL_FAILED_GARRISON_FOLLOWER_AT_MIN_LEVEL", "SPELL_FAILED_GARRISON_FOLLOWER_AT_MIN_LEVEL", "" };
+ case SPELL_FAILED_CANT_BE_RECRAFTED: return { "SPELL_FAILED_CANT_BE_RECRAFTED", "SPELL_FAILED_CANT_BE_RECRAFTED", "" };
+ case SPELL_FAILED_PASSIVE_REPLACED: return { "SPELL_FAILED_PASSIVE_REPLACED", "SPELL_FAILED_PASSIVE_REPLACED", "" };
+ case SPELL_FAILED_CANT_FLY_HERE: return { "SPELL_FAILED_CANT_FLY_HERE", "SPELL_FAILED_CANT_FLY_HERE", "" };
case SPELL_FAILED_UNKNOWN: return { "SPELL_FAILED_UNKNOWN", "SPELL_FAILED_UNKNOWN", "" };
default: throw std::out_of_range("value");
}
}
template <>
-TC_API_EXPORT size_t EnumUtils<SpellCastResult>::Count() { return 317; }
+TC_API_EXPORT size_t EnumUtils<SpellCastResult>::Count() { return 320; }
template <>
TC_API_EXPORT SpellCastResult EnumUtils<SpellCastResult>::FromIndex(size_t index)
@@ -2527,8 +2539,8 @@ TC_API_EXPORT SpellCastResult EnumUtils<SpellCastResult>::FromIndex(size_t index
case 13: return SPELL_FAILED_BAD_TARGETS;
case 14: return SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED;
case 15: return SPELL_FAILED_CANT_BE_CHARMED;
- case 16: return SPELL_FAILED_CANT_BE_DISENCHANTED;
- case 17: return SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL;
+ case 16: return SPELL_FAILED_CANT_BE_SALVAGED;
+ case 17: return SPELL_FAILED_CANT_BE_SALVAGED_SKILL;
case 18: return SPELL_FAILED_CANT_BE_ENCHANTED;
case 19: return SPELL_FAILED_CANT_BE_MILLED;
case 20: return SPELL_FAILED_CANT_BE_PROSPECTED;
@@ -2821,13 +2833,16 @@ TC_API_EXPORT SpellCastResult EnumUtils<SpellCastResult>::FromIndex(size_t index
case 307: return SPELL_FAILED_INELIGIBLE_WEAPON_APPEARANCE;
case 308: return SPELL_FAILED_PLAYER_CONDITION;
case 309: return SPELL_FAILED_NOT_WHILE_CHROMIE_TIMED;
- case 310: return SPELL_FAILED_OPTIONAL_REAGENTS;
+ case 310: return SPELL_FAILED_CRAFTING_REAGENTS;
case 311: return SPELL_FAILED_SPECTATOR_OR_COMMENTATOR;
case 312: return SPELL_FAILED_SOULBIND_CONDUIT_LEARN_FAILED_INVALID_COVENANT;
case 313: return SPELL_FAILED_SHADOWLANDS_RIDING_REQUIREMENT;
case 314: return SPELL_FAILED_NOT_IN_MAGE_TOWER;
case 315: return SPELL_FAILED_GARRISON_FOLLOWER_AT_MIN_LEVEL;
- case 316: return SPELL_FAILED_UNKNOWN;
+ case 316: return SPELL_FAILED_CANT_BE_RECRAFTED;
+ case 317: return SPELL_FAILED_PASSIVE_REPLACED;
+ case 318: return SPELL_FAILED_CANT_FLY_HERE;
+ case 319: return SPELL_FAILED_UNKNOWN;
default: throw std::out_of_range("index");
}
}
@@ -2853,8 +2868,8 @@ TC_API_EXPORT size_t EnumUtils<SpellCastResult>::ToIndex(SpellCastResult value)
case SPELL_FAILED_BAD_TARGETS: return 13;
case SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED: return 14;
case SPELL_FAILED_CANT_BE_CHARMED: return 15;
- case SPELL_FAILED_CANT_BE_DISENCHANTED: return 16;
- case SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL: return 17;
+ case SPELL_FAILED_CANT_BE_SALVAGED: return 16;
+ case SPELL_FAILED_CANT_BE_SALVAGED_SKILL: return 17;
case SPELL_FAILED_CANT_BE_ENCHANTED: return 18;
case SPELL_FAILED_CANT_BE_MILLED: return 19;
case SPELL_FAILED_CANT_BE_PROSPECTED: return 20;
@@ -3147,13 +3162,16 @@ TC_API_EXPORT size_t EnumUtils<SpellCastResult>::ToIndex(SpellCastResult value)
case SPELL_FAILED_INELIGIBLE_WEAPON_APPEARANCE: return 307;
case SPELL_FAILED_PLAYER_CONDITION: return 308;
case SPELL_FAILED_NOT_WHILE_CHROMIE_TIMED: return 309;
- case SPELL_FAILED_OPTIONAL_REAGENTS: return 310;
+ case SPELL_FAILED_CRAFTING_REAGENTS: return 310;
case SPELL_FAILED_SPECTATOR_OR_COMMENTATOR: return 311;
case SPELL_FAILED_SOULBIND_CONDUIT_LEARN_FAILED_INVALID_COVENANT: return 312;
case SPELL_FAILED_SHADOWLANDS_RIDING_REQUIREMENT: return 313;
case SPELL_FAILED_NOT_IN_MAGE_TOWER: return 314;
case SPELL_FAILED_GARRISON_FOLLOWER_AT_MIN_LEVEL: return 315;
- case SPELL_FAILED_UNKNOWN: return 316;
+ case SPELL_FAILED_CANT_BE_RECRAFTED: return 316;
+ case SPELL_FAILED_PASSIVE_REPLACED: return 317;
+ case SPELL_FAILED_CANT_FLY_HERE: return 318;
+ case SPELL_FAILED_UNKNOWN: return 319;
default: throw std::out_of_range("value");
}
}
@@ -3912,12 +3930,18 @@ TC_API_EXPORT EnumText EnumUtils<Emote>::ToString(Emote value)
case EMOTE_ONESHOT_FLYCUSTOMSPELL01: return { "EMOTE_ONESHOT_FLYCUSTOMSPELL01", "EMOTE_ONESHOT_FLYCUSTOMSPELL01", "" };
case EMOTE_ONESHOT_SPELLEFFECT_DECAY: return { "EMOTE_ONESHOT_SPELLEFFECT_DECAY", "EMOTE_ONESHOT_SPELLEFFECT_DECAY", "" };
case EMOTE_STATE_CREATURE_SPECIAL: return { "EMOTE_STATE_CREATURE_SPECIAL", "EMOTE_STATE_CREATURE_SPECIAL", "" };
+ case EMOTE_ONESHOT_WAREACT01: return { "EMOTE_ONESHOT_WAREACT01", "EMOTE_ONESHOT_WAREACT01", "" };
+ case EMOTE_ONESHOT_FLYCUSTOMSPELL04: return { "EMOTE_ONESHOT_FLYCUSTOMSPELL04", "EMOTE_ONESHOT_FLYCUSTOMSPELL04", "" };
+ case EMOTE_ONESHOT_TALK_SUBDUED: return { "EMOTE_ONESHOT_TALK_SUBDUED", "EMOTE_ONESHOT_TALK_SUBDUED", "" };
+ case EMOTE_STATE_EMOTETALK: return { "EMOTE_STATE_EMOTETALK", "EMOTE_STATE_EMOTETALK", "" };
+ case EMOTE_STATE_WAINTERACTION: return { "EMOTE_STATE_WAINTERACTION", "EMOTE_STATE_WAINTERACTION", "" };
+ case EMOTE_ONESHOT_TAKE_OFF_START: return { "EMOTE_ONESHOT_TAKE_OFF_START", "EMOTE_ONESHOT_TAKE_OFF_START", "" };
default: throw std::out_of_range("value");
}
}
template <>
-TC_API_EXPORT size_t EnumUtils<Emote>::Count() { return 404; }
+TC_API_EXPORT size_t EnumUtils<Emote>::Count() { return 410; }
template <>
TC_API_EXPORT Emote EnumUtils<Emote>::FromIndex(size_t index)
@@ -4328,6 +4352,12 @@ TC_API_EXPORT Emote EnumUtils<Emote>::FromIndex(size_t index)
case 401: return EMOTE_ONESHOT_FLYCUSTOMSPELL01;
case 402: return EMOTE_ONESHOT_SPELLEFFECT_DECAY;
case 403: return EMOTE_STATE_CREATURE_SPECIAL;
+ case 404: return EMOTE_ONESHOT_WAREACT01;
+ case 405: return EMOTE_ONESHOT_FLYCUSTOMSPELL04;
+ case 406: return EMOTE_ONESHOT_TALK_SUBDUED;
+ case 407: return EMOTE_STATE_EMOTETALK;
+ case 408: return EMOTE_STATE_WAINTERACTION;
+ case 409: return EMOTE_ONESHOT_TAKE_OFF_START;
default: throw std::out_of_range("index");
}
}
@@ -4741,6 +4771,12 @@ TC_API_EXPORT size_t EnumUtils<Emote>::ToIndex(Emote value)
case EMOTE_ONESHOT_FLYCUSTOMSPELL01: return 401;
case EMOTE_ONESHOT_SPELLEFFECT_DECAY: return 402;
case EMOTE_STATE_CREATURE_SPECIAL: return 403;
+ case EMOTE_ONESHOT_WAREACT01: return 404;
+ case EMOTE_ONESHOT_FLYCUSTOMSPELL04: return 405;
+ case EMOTE_ONESHOT_TALK_SUBDUED: return 406;
+ case EMOTE_STATE_EMOTETALK: return 407;
+ case EMOTE_STATE_WAINTERACTION: return 408;
+ case EMOTE_ONESHOT_TAKE_OFF_START: return 409;
default: throw std::out_of_range("value");
}
}
@@ -5068,12 +5104,13 @@ TC_API_EXPORT EnumText EnumUtils<SpellFamilyNames>::ToString(SpellFamilyNames va
case SPELLFAMILY_UNK91: return { "SPELLFAMILY_UNK91", "SPELLFAMILY_UNK91", "" };
case SPELLFAMILY_UNK100: return { "SPELLFAMILY_UNK100", "SPELLFAMILY_UNK100", "" };
case SPELLFAMILY_DEMON_HUNTER: return { "SPELLFAMILY_DEMON_HUNTER", "SPELLFAMILY_DEMON_HUNTER", "" };
+ case SPELLFAMILY_EVOKER: return { "SPELLFAMILY_EVOKER", "SPELLFAMILY_EVOKER", "" };
default: throw std::out_of_range("value");
}
}
template <>
-TC_API_EXPORT size_t EnumUtils<SpellFamilyNames>::Count() { return 24; }
+TC_API_EXPORT size_t EnumUtils<SpellFamilyNames>::Count() { return 25; }
template <>
TC_API_EXPORT SpellFamilyNames EnumUtils<SpellFamilyNames>::FromIndex(size_t index)
@@ -5104,6 +5141,7 @@ TC_API_EXPORT SpellFamilyNames EnumUtils<SpellFamilyNames>::FromIndex(size_t ind
case 21: return SPELLFAMILY_UNK91;
case 22: return SPELLFAMILY_UNK100;
case 23: return SPELLFAMILY_DEMON_HUNTER;
+ case 24: return SPELLFAMILY_EVOKER;
default: throw std::out_of_range("index");
}
}
@@ -5137,6 +5175,7 @@ TC_API_EXPORT size_t EnumUtils<SpellFamilyNames>::ToIndex(SpellFamilyNames value
case SPELLFAMILY_UNK91: return 21;
case SPELLFAMILY_UNK100: return 22;
case SPELLFAMILY_DEMON_HUNTER: return 23;
+ case SPELLFAMILY_EVOKER: return 24;
default: throw std::out_of_range("value");
}
}
diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp
index f04d4dd2255..e402dc6c214 100644
--- a/src/server/game/Quests/QuestDef.cpp
+++ b/src/server/game/Quests/QuestDef.cpp
@@ -275,6 +275,86 @@ void Quest::LoadQuestObjectiveVisualEffect(Field* fields)
}
}
+void Quest::LoadConditionalConditionalQuestDescription(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_description_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalQuestDescription.begin(), _conditionalQuestDescription.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalQuestDescription.end() ? *itr : _conditionalQuestDescription.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
+void Quest::LoadConditionalConditionalRequestItemsText(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_request_items_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalRequestItemsText.begin(), _conditionalRequestItemsText.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalRequestItemsText.end() ? *itr : _conditionalRequestItemsText.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
+void Quest::LoadConditionalConditionalOfferRewardText(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_offer_reward_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalOfferRewardText.begin(), _conditionalOfferRewardText.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalOfferRewardText.end() ? *itr : _conditionalOfferRewardText.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
+void Quest::LoadConditionalConditionalQuestCompletionLog(Field* fields)
+{
+ LocaleConstant locale = GetLocaleByName(fields[4].GetStringView());
+ if (locale >= TOTAL_LOCALES)
+ {
+ TC_LOG_ERROR("sql.sql", "Table `quest_completion_log_conditional` has invalid locale %s set for quest %u. Skipped.", fields[4].GetCString(), fields[0].GetUInt32());
+ return;
+ }
+
+ auto itr = std::find_if(_conditionalQuestCompletionLog.begin(), _conditionalQuestCompletionLog.end(), [fields](QuestConditionalText const& text)
+ {
+ return text.PlayerConditionId == fields[1].GetInt32() && text.QuestgiverCreatureId == fields[2].GetInt32();
+ });
+
+ QuestConditionalText& text = itr != _conditionalQuestCompletionLog.end() ? *itr : _conditionalQuestCompletionLog.emplace_back();
+ text.PlayerConditionId = fields[1].GetInt32();
+ text.QuestgiverCreatureId = fields[2].GetInt32();
+ ObjectMgr::AddLocaleString(fields[3].GetString(), locale, text.Text);
+}
+
uint32 Quest::XPValue(Player const* player) const
{
if (player)
@@ -496,6 +576,19 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const
response.Info.PortraitGiverName = GetPortraitGiverName();
response.Info.PortraitTurnInText = GetPortraitTurnInText();
response.Info.PortraitTurnInName = GetPortraitTurnInName();
+ std::transform(GetConditionalQuestDescription().begin(), GetConditionalQuestDescription().end(), std::back_inserter(response.Info.ConditionalQuestDescription), [loc](QuestConditionalText const& text)
+ {
+ std::string_view content = text.Text[LOCALE_enUS];
+ ObjectMgr::GetLocaleString(text.Text, loc, content);
+ return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content };
+ });
+
+ std::transform(GetConditionalQuestCompletionLog().begin(), GetConditionalQuestCompletionLog().end(), std::back_inserter(response.Info.ConditionalQuestCompletionLog), [loc](QuestConditionalText const& text)
+ {
+ std::string_view content = text.Text[LOCALE_enUS];
+ ObjectMgr::GetLocaleString(text.Text, loc, content);
+ return WorldPackets::Quest::ConditionalQuestText { text.PlayerConditionId, text.QuestgiverCreatureId, content };
+ });
if (loc != LOCALE_enUS)
{
@@ -594,6 +687,7 @@ WorldPacket Quest::BuildQueryData(LocaleConstant loc, Player* player) const
response.Info.Expansion = GetExpansion();
response.Info.ManagedWorldStateID = GetManagedWorldStateId();
response.Info.QuestSessionBonus = 0; //GetQuestSessionBonus(); // this is only sent while quest session is active
+ response.Info.QuestGiverCreatureID = 0; // only sent during npc interaction
for (QuestObjective const& questObjective : GetObjectives())
{
diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h
index ec3d3333119..e0bbc363226 100644
--- a/src/server/game/Quests/QuestDef.h
+++ b/src/server/game/Quests/QuestDef.h
@@ -40,7 +40,7 @@ namespace WorldPackets
}
}
-#define MAX_QUEST_LOG_SIZE 25
+#define MAX_QUEST_LOG_SIZE 35
#define QUEST_ITEM_DROP_COUNT 4
#define QUEST_REWARD_CHOICES_COUNT 6
@@ -472,6 +472,13 @@ struct QuestRewardDisplaySpell
uint32 PlayerConditionId;
};
+struct QuestConditionalText
+{
+ int32 PlayerConditionId = 0;
+ int32 QuestgiverCreatureId = 0;
+ std::vector<std::string> Text;
+};
+
// This Quest class provides a convenient way to access a few pretotaled (cached) quest details,
// all base quest information, and any utility functions such as generating the amount of
// xp to give
@@ -492,6 +499,10 @@ class TC_GAME_API Quest
void LoadQuestMailSender(Field* fields);
void LoadQuestObjective(Field* fields);
void LoadQuestObjectiveVisualEffect(Field* fields);
+ void LoadConditionalConditionalQuestDescription(Field* fields);
+ void LoadConditionalConditionalRequestItemsText(Field* fields);
+ void LoadConditionalConditionalOfferRewardText(Field* fields);
+ void LoadConditionalConditionalQuestCompletionLog(Field* fields);
uint32 XPValue(Player const* player) const;
uint32 MoneyValue(Player const* player) const;
@@ -549,10 +560,14 @@ class TC_GAME_API Quest
std::string const& GetLogTitle() const { return _logTitle; }
std::string const& GetLogDescription() const { return _logDescription; }
std::string const& GetQuestDescription() const { return _questDescription; }
+ std::vector<QuestConditionalText> const& GetConditionalQuestDescription() const { return _conditionalQuestDescription; }
std::string const& GetAreaDescription() const { return _areaDescription; }
std::string const& GetOfferRewardText() const { return _offerRewardText; }
+ std::vector<QuestConditionalText> const& GetConditionalOfferRewardText() const { return _conditionalOfferRewardText; }
std::string const& GetRequestItemsText() const { return _requestItemsText; }
+ std::vector<QuestConditionalText> const& GetConditionalRequestItemsText() const { return _conditionalRequestItemsText; }
std::string const& GetQuestCompletionLog() const { return _questCompletionLog; }
+ std::vector<QuestConditionalText> const& GetConditionalQuestCompletionLog() const { return _conditionalQuestCompletionLog; }
std::string const& GetPortraitGiverText() const { return _portraitGiverText; }
std::string const& GetPortraitGiverName() const { return _portraitGiverName; }
std::string const& GetPortraitTurnInText() const { return _portraitTurnInText; }
@@ -714,6 +729,12 @@ class TC_GAME_API Quest
std::string _portraitTurnInName;
std::string _questCompletionLog;
+ // quest_description_conditional
+ std::vector<QuestConditionalText> _conditionalQuestDescription;
+
+ // quest_completion_log_conditional
+ std::vector<QuestConditionalText> _conditionalQuestCompletionLog;
+
// quest_request_items table
uint32 _emoteOnComplete = 0;
uint32 _emoteOnIncomplete = 0;
@@ -721,9 +742,15 @@ class TC_GAME_API Quest
uint32 _emoteOnIncompleteDelay = 0;
std::string _requestItemsText;
+ // quest_request_items_conditional
+ std::vector<QuestConditionalText> _conditionalRequestItemsText;
+
// quest_offer_reward table
std::string _offerRewardText;
+ // quest_offer_reward_conditional
+ std::vector<QuestConditionalText> _conditionalOfferRewardText;
+
// quest_template_addon table (custom data)
uint32 _maxLevel = 0;
uint32 _allowableClasses = 0;
diff --git a/src/server/game/Reputation/ReputationMgr.cpp b/src/server/game/Reputation/ReputationMgr.cpp
index 33e8c881f95..d479e75aed9 100644
--- a/src/server/game/Reputation/ReputationMgr.cpp
+++ b/src/server/game/Reputation/ReputationMgr.cpp
@@ -277,7 +277,6 @@ void ReputationMgr::SendForceReactions()
void ReputationMgr::SendState(FactionState const* faction)
{
WorldPackets::Reputation::SetFactionStanding setFactionStanding;
- setFactionStanding.ReferAFriendBonus = 0.0f;
setFactionStanding.BonusFromAchievementSystem = 0.0f;
if (faction)
diff --git a/src/server/game/Server/Packets/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp
index 08478565728..e3eec9efc7e 100644
--- a/src/server/game/Server/Packets/AuctionHousePackets.cpp
+++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp
@@ -80,8 +80,8 @@ ByteBuffer& operator<<(ByteBuffer& data, AuctionBucketKey const& itemKey)
ByteBuffer& operator>>(ByteBuffer& data, AuctionListFilterSubClass& filterSubClass)
{
- data >> filterSubClass.ItemSubclass;
data >> filterSubClass.InvTypeMask;
+ data >> filterSubClass.ItemSubclass;
return data;
}
@@ -595,7 +595,7 @@ WorldPacket const* AuctionHelloResponse::Write()
WorldPacket const* AuctionListBiddedItemsResult::Write()
{
- _worldPacket << int32(Items.size());
+ _worldPacket << uint32(Items.size());
_worldPacket << uint32(DesiredDelay);
_worldPacket.WriteBit(HasMoreResults);
_worldPacket.FlushBits();
diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h
index 795565c6fa0..da5a2a6570f 100644
--- a/src/server/game/Server/Packets/AuctionHousePackets.h
+++ b/src/server/game/Server/Packets/AuctionHousePackets.h
@@ -51,7 +51,7 @@ namespace WorldPackets
struct AuctionListFilterSubClass
{
int32 ItemSubclass = 0;
- uint32 InvTypeMask = 0;
+ uint64 InvTypeMask = 0;
};
struct AuctionListFilterClass
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp
index f05643e807e..3809c421c86 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.cpp
+++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp
@@ -138,6 +138,7 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket << uint8(classAvailability.ClassID);
_worldPacket << uint8(classAvailability.ActiveExpansionLevel);
_worldPacket << uint8(classAvailability.AccountExpansionLevel);
+ _worldPacket << uint8(classAvailability.MinActiveExpansionLevel);
}
}
@@ -166,7 +167,7 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write()
_worldPacket << uint16(*SuccessInfo->NumPlayersAlliance);
if (SuccessInfo->ExpansionTrialExpiration)
- _worldPacket << int32(*SuccessInfo->ExpansionTrialExpiration);
+ _worldPacket << *SuccessInfo->ExpansionTrialExpiration;
for (VirtualRealmInfo const& virtualRealm : SuccessInfo->VirtualRealms)
_worldPacket << virtualRealm;
diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h
index 0e6b2b65331..7999186ed3d 100644
--- a/src/server/game/Server/Packets/AuthenticationPackets.h
+++ b/src/server/game/Server/Packets/AuthenticationPackets.h
@@ -162,7 +162,7 @@ namespace WorldPackets
bool ForceCharacterTemplate = false; ///< forces the client to always use a character template when creating a new character. @see Templates. @todo implement
Optional<uint16> NumPlayersHorde; ///< number of horde players in this realm. @todo implement
Optional<uint16> NumPlayersAlliance; ///< number of alliance players in this realm. @todo implement
- Optional<int32> ExpansionTrialExpiration; ///< expansion trial expiration unix timestamp
+ Optional<Timestamp<>> ExpansionTrialExpiration; ///< expansion trial expiration unix timestamp
};
AuthResponse() : ServerPacket(SMSG_AUTH_RESPONSE, 132) { }
diff --git a/src/server/game/Server/Packets/AzeritePackets.cpp b/src/server/game/Server/Packets/AzeritePackets.cpp
index 13222e3175e..87406b757dc 100644
--- a/src/server/game/Server/Packets/AzeritePackets.cpp
+++ b/src/server/game/Server/Packets/AzeritePackets.cpp
@@ -26,13 +26,6 @@ WorldPacket const* WorldPackets::Azerite::PlayerAzeriteItemGains::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Azerite::OpenHeartForge::Write()
-{
- _worldPacket << ForgeGUID;
-
- return &_worldPacket;
-}
-
void WorldPackets::Azerite::AzeriteEssenceUnlockMilestone::Read()
{
_worldPacket >> AzeriteItemMilestonePowerID;
@@ -76,10 +69,3 @@ WorldPacket const* WorldPackets::Azerite::PlayerAzeriteItemEquippedStatusChanged
return &_worldPacket;
}
-
-WorldPacket const* WorldPackets::Azerite::AzeriteRespecNPC::Write()
-{
- _worldPacket << NpcGUID;
-
- return &_worldPacket;
-}
diff --git a/src/server/game/Server/Packets/AzeritePackets.h b/src/server/game/Server/Packets/AzeritePackets.h
index 487c5d2bced..0a0204c61e7 100644
--- a/src/server/game/Server/Packets/AzeritePackets.h
+++ b/src/server/game/Server/Packets/AzeritePackets.h
@@ -38,24 +38,6 @@ namespace WorldPackets
uint64 XP = 0;
};
- class OpenHeartForge final : public ServerPacket
- {
- public:
- OpenHeartForge() : ServerPacket(SMSG_OPEN_HEART_FORGE, 16) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid ForgeGUID;
- };
-
- class CloseHeartForge final : public ServerPacket
- {
- public:
- CloseHeartForge() : ServerPacket(SMSG_CLOSE_HEART_FORGE, 0) { }
-
- WorldPacket const* Write() override { return &_worldPacket; }
- };
-
class AzeriteEssenceUnlockMilestone final : public ClientPacket
{
public:
@@ -122,16 +104,6 @@ namespace WorldPackets
bool IsHeartEquipped = false;
};
-
- class AzeriteRespecNPC final : public ServerPacket
- {
- public:
- AzeriteRespecNPC(ObjectGuid npcGuid) : ServerPacket(SMSG_AZERITE_RESPEC_NPC, 16), NpcGUID(npcGuid) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid NpcGUID;
- };
}
}
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp
index 1c8abe81261..2fa88ef4901 100644
--- a/src/server/game/Server/Packets/BattlegroundPackets.cpp
+++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp
@@ -323,12 +323,15 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Battleground::RatedPvpInf
data << int32(bracketInfo.Unused2);
data << int32(bracketInfo.WeeklyPlayed);
data << int32(bracketInfo.WeeklyWon);
+ data << int32(bracketInfo.RoundsSeasonPlayed);
+ data << int32(bracketInfo.RoundsSeasonWon);
+ data << int32(bracketInfo.RoundsWeeklyPlayed);
+ data << int32(bracketInfo.RoundsWeeklyWon);
data << int32(bracketInfo.BestWeeklyRating);
data << int32(bracketInfo.LastWeeksBestRating);
data << int32(bracketInfo.BestSeasonRating);
data << int32(bracketInfo.PvpTierID);
data << int32(bracketInfo.Unused3);
- data << int32(bracketInfo.WeeklyBestWinPvpTierID);
data << int32(bracketInfo.Unused4);
data << int32(bracketInfo.Rank);
data.WriteBit(bracketInfo.Disqualified);
diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h
index fcc98786fa6..587efc4e224 100644
--- a/src/server/game/Server/Packets/BattlegroundPackets.h
+++ b/src/server/game/Server/Packets/BattlegroundPackets.h
@@ -450,12 +450,15 @@ namespace WorldPackets
int32 Unused2 = 0;
int32 WeeklyPlayed = 0;
int32 WeeklyWon = 0;
+ int32 RoundsSeasonPlayed = 0;
+ int32 RoundsSeasonWon = 0;
+ int32 RoundsWeeklyPlayed = 0;
+ int32 RoundsWeeklyWon = 0;
int32 BestWeeklyRating = 0;
int32 LastWeeksBestRating = 0;
int32 BestSeasonRating = 0;
int32 PvpTierID = 0;
int32 Unused3 = 0;
- int32 WeeklyBestWinPvpTierID = 0;
int32 Unused4 = 0;
int32 Rank = 0;
bool Disqualified = false;
diff --git a/src/server/game/Server/Packets/BlackMarketPackets.cpp b/src/server/game/Server/Packets/BlackMarketPackets.cpp
index aac7626632a..d24019ec693 100644
--- a/src/server/game/Server/Packets/BlackMarketPackets.cpp
+++ b/src/server/game/Server/Packets/BlackMarketPackets.cpp
@@ -22,15 +22,6 @@ void WorldPackets::BlackMarket::BlackMarketOpen::Read()
_worldPacket >> Guid;
}
-WorldPacket const* WorldPackets::BlackMarket::BlackMarketOpenResult::Write()
-{
- _worldPacket << Guid;
- _worldPacket.WriteBit(Enable);
- _worldPacket.FlushBits();
-
- return &_worldPacket;
-}
-
void WorldPackets::BlackMarket::BlackMarketRequestItems::Read()
{
_worldPacket >> Guid;
diff --git a/src/server/game/Server/Packets/BlackMarketPackets.h b/src/server/game/Server/Packets/BlackMarketPackets.h
index 5c51cb5f095..aa400617008 100644
--- a/src/server/game/Server/Packets/BlackMarketPackets.h
+++ b/src/server/game/Server/Packets/BlackMarketPackets.h
@@ -50,17 +50,6 @@ namespace WorldPackets
ObjectGuid Guid;
};
- class BlackMarketOpenResult final : public ServerPacket
- {
- public:
- BlackMarketOpenResult() : ServerPacket(SMSG_BLACK_MARKET_OPEN_RESULT, 15) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid Guid;
- bool Enable = true;
- };
-
class BlackMarketRequestItems final : public ClientPacket
{
public:
diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp
index 92de494024c..9eae2466da9 100644
--- a/src/server/game/Server/Packets/CharacterPackets.cpp
+++ b/src/server/game/Server/Packets/CharacterPackets.cpp
@@ -141,7 +141,7 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field* fields)
LastLoginVersion = fields[22].GetUInt32();
- for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot)
+ for (uint8 slot = 0; slot < REAGENT_BAG_SLOT_END; ++slot)
{
uint32 visualBase = slot * 5;
VisualItems[slot].InvType = Trinity::StringTo<uint8>(equipment[visualBase + 0]).value_or(0);
@@ -193,9 +193,9 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::CharacterInfo con
data << visualItem;
data << charInfo.LastPlayedTime;
- data << uint16(charInfo.SpecID);
- data << uint32(charInfo.Unknown703);
- data << uint32(charInfo.LastLoginVersion);
+ data << int16(charInfo.SpecID);
+ data << int32(charInfo.Unknown703);
+ data << int32(charInfo.LastLoginVersion);
data << uint32(charInfo.Flags4);
data << uint32(charInfo.MailSenders.size());
data << uint32(charInfo.MailSenderTypes.size());
@@ -245,6 +245,14 @@ ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::UnlockedCondition
return data;
}
+ByteBuffer& operator<<(ByteBuffer& data, EnumCharactersResult::RaceLimitDisableInfo const& raceLimitDisableInfo)
+{
+ data << int32(raceLimitDisableInfo.RaceID);
+ data << int32(raceLimitDisableInfo.BlockReason);
+
+ return data;
+}
+
WorldPacket const* EnumCharactersResult::Write()
{
_worldPacket.reserve(9 + Characters.size() * sizeof(CharacterInfo) + RaceUnlockData.size() * sizeof(RaceUnlock));
@@ -254,12 +262,14 @@ WorldPacket const* EnumCharactersResult::Write()
_worldPacket.WriteBit(IsNewPlayerRestrictionSkipped);
_worldPacket.WriteBit(IsNewPlayerRestricted);
_worldPacket.WriteBit(IsNewPlayer);
+ _worldPacket.WriteBit(IsTrialAccountRestricted);
_worldPacket.WriteBit(DisabledClassesMask.has_value());
_worldPacket.WriteBit(IsAlliedRacesCreationAllowed);
_worldPacket << uint32(Characters.size());
_worldPacket << int32(MaxCharacterLevel);
_worldPacket << uint32(RaceUnlockData.size());
_worldPacket << uint32(UnlockedConditionalAppearances.size());
+ _worldPacket << uint32(RaceLimitDisables.size());
if (DisabledClassesMask)
_worldPacket << uint32(*DisabledClassesMask);
@@ -267,6 +277,9 @@ WorldPacket const* EnumCharactersResult::Write()
for (UnlockedConditionalAppearance const& unlockedConditionalAppearance : UnlockedConditionalAppearances)
_worldPacket << unlockedConditionalAppearance;
+ for (RaceLimitDisableInfo const& raceLimitDisableInfo : RaceLimitDisables)
+ _worldPacket << raceLimitDisableInfo;
+
for (CharacterInfo const& charInfo : Characters)
_worldPacket << charInfo;
@@ -377,6 +390,7 @@ void CharRaceOrFactionChange::Read()
_worldPacket >> RaceOrFactionChangeInfo->Guid;
_worldPacket >> RaceOrFactionChangeInfo->SexID;
_worldPacket >> RaceOrFactionChangeInfo->RaceID;
+ _worldPacket >> RaceOrFactionChangeInfo->InitialRaceID;
RaceOrFactionChangeInfo->Customizations.resize(_worldPacket.read<uint32>());
RaceOrFactionChangeInfo->Name = _worldPacket.ReadString(nameLength);
for (ChrCustomizationChoice& customization : RaceOrFactionChangeInfo->Customizations)
@@ -537,6 +551,7 @@ void AlterApperance::Read()
{
Customizations.resize(_worldPacket.read<uint32>());
_worldPacket >> NewSex;
+ _worldPacket >> CustomizedRace;
for (ChrCustomizationChoice& customization : Customizations)
_worldPacket >> customization;
@@ -556,7 +571,6 @@ WorldPacket const* LogXPGain::Write()
_worldPacket << uint8(Reason);
_worldPacket << int32(Amount);
_worldPacket << float(GroupBonus);
- _worldPacket << uint8(ReferAFriendBonusType);
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index d4eff75626a..cf7b14a81ff 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -87,6 +87,7 @@ namespace WorldPackets
struct CharRaceOrFactionChangeInfo
{
uint8 RaceID = RACE_NONE;
+ uint8 InitialRaceID = RACE_NONE;
uint8 SexID = GENDER_NONE;
ObjectGuid Guid;
bool FactionChange = false;
@@ -159,7 +160,7 @@ namespace WorldPackets
uint8 Subclass = 0;
};
- std::array<VisualItemInfo, 23> VisualItems = { };
+ std::array<VisualItemInfo, 35> VisualItems = { };
std::vector<std::string> MailSenders;
std::vector<uint32> MailSenderTypes;
};
@@ -178,6 +179,18 @@ namespace WorldPackets
int32 Unused = 0;
};
+ struct RaceLimitDisableInfo
+ {
+ enum
+ {
+ Server,
+ Level
+ };
+
+ int32 RaceID = 0;
+ int32 BlockReason = 0;
+ };
+
EnumCharactersResult() : ServerPacket(SMSG_ENUM_CHARACTERS_RESULT) { }
WorldPacket const* Write() override;
@@ -187,6 +200,7 @@ namespace WorldPackets
bool IsNewPlayerRestrictionSkipped = false; ///< allows client to skip new player restrictions
bool IsNewPlayerRestricted = false; ///< forbids using level boost and class trials
bool IsNewPlayer = false; ///< forbids hero classes and allied races
+ bool IsTrialAccountRestricted = false;
bool IsAlliedRacesCreationAllowed = false;
int32 MaxCharacterLevel = 1;
@@ -195,6 +209,7 @@ namespace WorldPackets
std::vector<CharacterInfo> Characters; ///< all characters on the list
std::vector<RaceUnlock> RaceUnlockData; ///<
std::vector<UnlockedConditionalAppearance> UnlockedConditionalAppearances;
+ std::vector<RaceLimitDisableInfo> RaceLimitDisables;
};
class CheckCharacterNameAvailability final : public ClientPacket
@@ -623,6 +638,7 @@ namespace WorldPackets
uint8 NewSex = 0;
Array<ChrCustomizationChoice, 50> Customizations;
+ int32 CustomizedRace = 0;
};
class BarberShopResult final : public ServerPacket
@@ -646,7 +662,7 @@ namespace WorldPackets
class LogXPGain final : public ServerPacket
{
public:
- LogXPGain() : ServerPacket(SMSG_LOG_XP_GAIN, 30) { }
+ LogXPGain() : ServerPacket(SMSG_LOG_XP_GAIN, 16 + 4 + 1 + 4 + 4) { }
WorldPacket const* Write() override;
@@ -654,8 +670,7 @@ namespace WorldPackets
int32 Original = 0;
uint8 Reason = 0;
int32 Amount = 0;
- float GroupBonus = 0;
- uint8 ReferAFriendBonusType = 0; // 1 - 300% of normal XP; 2 - 150% of normal XP
+ float GroupBonus = 0.0f;
};
class TitleEarned final : public ServerPacket
diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp
index 2cf1eec9701..c99a5f1b577 100644
--- a/src/server/game/Server/Packets/ChatPackets.cpp
+++ b/src/server/game/Server/Packets/ChatPackets.cpp
@@ -25,7 +25,7 @@
void WorldPackets::Chat::ChatMessage::Read()
{
_worldPacket >> Language;
- uint32 len = _worldPacket.ReadBits(9);
+ uint32 len = _worldPacket.ReadBits(11);
Text = _worldPacket.ReadString(len);
}
@@ -33,7 +33,7 @@ void WorldPackets::Chat::ChatMessageWhisper::Read()
{
_worldPacket >> Language;
uint32 targetLen = _worldPacket.ReadBits(9);
- uint32 textLen = _worldPacket.ReadBits(9);
+ uint32 textLen = _worldPacket.ReadBits(11);
Target = _worldPacket.ReadString(targetLen);
Text = _worldPacket.ReadString(textLen);
}
@@ -43,7 +43,7 @@ void WorldPackets::Chat::ChatMessageChannel::Read()
_worldPacket >> Language;
_worldPacket >> ChannelGUID;
uint32 targetLen = _worldPacket.ReadBits(9);
- uint32 textLen = _worldPacket.ReadBits(9);
+ uint32 textLen = _worldPacket.ReadBits(11);
Target = _worldPacket.ReadString(targetLen);
Text = _worldPacket.ReadString(textLen);
}
@@ -77,19 +77,19 @@ void WorldPackets::Chat::ChatAddonMessageTargeted::Read()
void WorldPackets::Chat::ChatMessageDND::Read()
{
- uint32 len = _worldPacket.ReadBits(9);
+ uint32 len = _worldPacket.ReadBits(11);
Text = _worldPacket.ReadString(len);
}
void WorldPackets::Chat::ChatMessageAFK::Read()
{
- uint32 len = _worldPacket.ReadBits(9);
+ uint32 len = _worldPacket.ReadBits(11);
Text = _worldPacket.ReadString(len);
}
void WorldPackets::Chat::ChatMessageEmote::Read()
{
- uint32 len = _worldPacket.ReadBits(9);
+ uint32 len = _worldPacket.ReadBits(11);
Text = _worldPacket.ReadString(len);
}
diff --git a/src/server/game/Server/Packets/CraftingPacketsCommon.cpp b/src/server/game/Server/Packets/CraftingPacketsCommon.cpp
new file mode 100644
index 00000000000..d06b0e21e7d
--- /dev/null
+++ b/src/server/game/Server/Packets/CraftingPacketsCommon.cpp
@@ -0,0 +1,61 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "CraftingPacketsCommon.h"
+
+namespace WorldPackets::Crafting
+{
+ByteBuffer& operator<<(ByteBuffer& data, SpellReducedReagent const& spellReducedReagent)
+{
+ data << int32(spellReducedReagent.ItemID);
+ data << int32(spellReducedReagent.Quantity);
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, CraftingData const& craftingData)
+{
+ data << int32(craftingData.CraftingQualityID);
+ data << int32(craftingData.field_4);
+ data << int32(craftingData.field_8);
+ data << int32(craftingData.Multicraft);
+ data << int32(craftingData.field_10);
+ data << int32(craftingData.field_14);
+ data << int32(craftingData.CritBonusSkill);
+ data << float(craftingData.field_1C);
+ data << uint64(craftingData.field_20);
+ data << uint32(craftingData.ResourcesReturned.size());
+ data << uint32(craftingData.OperationID);
+ data << craftingData.ItemGUID;
+ data << int32(craftingData.Quantity);
+ data << int32(craftingData.EnchantID);
+
+ for (SpellReducedReagent const& spellReducedReagent : craftingData.ResourcesReturned)
+ data << spellReducedReagent;
+
+ data.WriteBit(craftingData.IsCrit);
+ data.WriteBit(craftingData.field_29);
+ data.WriteBit(craftingData.field_2A);
+ data.WriteBit(craftingData.BonusCraft);
+ data.FlushBits();
+
+ data << craftingData.OldItem;
+ data << craftingData.NewItem;
+
+ return data;
+}
+}
diff --git a/src/server/game/Server/Packets/CraftingPacketsCommon.h b/src/server/game/Server/Packets/CraftingPacketsCommon.h
new file mode 100644
index 00000000000..b74d77cda29
--- /dev/null
+++ b/src/server/game/Server/Packets/CraftingPacketsCommon.h
@@ -0,0 +1,59 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITYCORE_CRAFTING_PACKETS_COMMON_H
+#define TRINITYCORE_CRAFTING_PACKETS_COMMON_H
+
+#include "ItemPacketsCommon.h"
+#include "ObjectGuid.h"
+
+namespace WorldPackets::Crafting
+{
+struct SpellReducedReagent
+{
+ int32 ItemID = 0;
+ int32 Quantity = 0;
+};
+
+struct CraftingData
+{
+ int32 CraftingQualityID = 0;
+ int32 field_4 = 0;
+ int32 field_8 = 0;
+ int32 Multicraft = 0;
+ int32 field_10 = 0;
+ int32 field_14 = 0;
+ int32 CritBonusSkill = 0;
+ float field_1C = 0.0f;
+ uint64 field_20 = 0;
+ bool IsCrit = false;
+ bool field_29 = false;
+ bool field_2A = false;
+ bool BonusCraft = false;
+ std::vector<SpellReducedReagent> ResourcesReturned;
+ uint32 OperationID = 0;
+ ObjectGuid ItemGUID;
+ int32 Quantity = 0;
+ Item::ItemInstance OldItem;
+ Item::ItemInstance NewItem;
+ int32 EnchantID = 0;
+};
+
+ByteBuffer& operator<<(ByteBuffer& data, SpellReducedReagent const& spellReducedReagent);
+ByteBuffer& operator<<(ByteBuffer& data, CraftingData const& craftingData);
+}
+#endif // TRINITYCORE_CRAFTING_PACKETS_COMMON_H
diff --git a/src/server/game/Server/Packets/GameObjectPackets.cpp b/src/server/game/Server/Packets/GameObjectPackets.cpp
index fd15e7264cf..987a0e4edac 100644
--- a/src/server/game/Server/Packets/GameObjectPackets.cpp
+++ b/src/server/game/Server/Packets/GameObjectPackets.cpp
@@ -20,11 +20,13 @@
void WorldPackets::GameObject::GameObjUse::Read()
{
_worldPacket >> Guid;
+ IsSoftInteract = _worldPacket.ReadBit();
}
void WorldPackets::GameObject::GameObjReportUse::Read()
{
_worldPacket >> Guid;
+ IsSoftInteract = _worldPacket.ReadBit();
}
WorldPacket const* WorldPackets::GameObject::GameObjectDespawn::Write()
@@ -70,28 +72,34 @@ WorldPacket const* WorldPackets::GameObject::GameObjectCustomAnim::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::GameObject::GameObjectUILink::Write()
+WorldPacket const* WorldPackets::GameObject::GameObjectPlaySpellVisual::Write()
{
_worldPacket << ObjectGUID;
- _worldPacket << int32(UILink);
- _worldPacket << int32(UIItemInteractionID);
+ _worldPacket << ActivatorGUID;
+ _worldPacket << int32(SpellVisualID);
return &_worldPacket;
}
-WorldPacket const* WorldPackets::GameObject::GameObjectPlaySpellVisual::Write()
+WorldPacket const* WorldPackets::GameObject::GameObjectSetStateLocal::Write()
{
_worldPacket << ObjectGUID;
- _worldPacket << ActivatorGUID;
- _worldPacket << int32(SpellVisualID);
+ _worldPacket << uint8(State);
return &_worldPacket;
}
-WorldPacket const* WorldPackets::GameObject::GameObjectSetStateLocal::Write()
+WorldPacket const* WorldPackets::GameObject::GameObjectInteraction::Write()
{
_worldPacket << ObjectGUID;
- _worldPacket << uint8(State);
+ _worldPacket << int32(InteractionType);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::GameObject::GameObjectCloseInteraction::Write()
+{
+ _worldPacket << int32(InteractionType);
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/GameObjectPackets.h b/src/server/game/Server/Packets/GameObjectPackets.h
index 3bd71aba0ab..d7ce351bdab 100644
--- a/src/server/game/Server/Packets/GameObjectPackets.h
+++ b/src/server/game/Server/Packets/GameObjectPackets.h
@@ -21,6 +21,8 @@
#include "Packet.h"
#include "GameObject.h"
+enum class PlayerInteractionType : int32;
+
namespace WorldPackets
{
namespace GameObject
@@ -33,6 +35,7 @@ namespace WorldPackets
void Read() override;
ObjectGuid Guid;
+ bool IsSoftInteract = false;
};
class GameObjReportUse final : public ClientPacket
@@ -43,6 +46,7 @@ namespace WorldPackets
void Read() override;
ObjectGuid Guid;
+ bool IsSoftInteract = false;
};
class GameObjectDespawn final : public ServerPacket
@@ -119,39 +123,48 @@ namespace WorldPackets
bool PlayAsDespawn = false;
};
- class GameObjectUILink final : public ServerPacket
+ class GameObjectPlaySpellVisual final : public ServerPacket
{
public:
- GameObjectUILink() : ServerPacket(SMSG_GAME_OBJECT_UI_LINK, 16 + 4) { }
+ GameObjectPlaySpellVisual() : ServerPacket(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL, 16 + 16 + 4) { }
WorldPacket const* Write() override;
ObjectGuid ObjectGUID;
- int32 UILink = 0;
- int32 UIItemInteractionID = 0;
+ ObjectGuid ActivatorGUID;
+ int32 SpellVisualID = 0;
};
- class GameObjectPlaySpellVisual final : public ServerPacket
+ class GameObjectSetStateLocal final : public ServerPacket
{
public:
- GameObjectPlaySpellVisual() : ServerPacket(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL, 16 + 16 + 4) { }
+ GameObjectSetStateLocal() : ServerPacket(SMSG_GAME_OBJECT_SET_STATE_LOCAL, 16 + 1) { }
WorldPacket const* Write() override;
ObjectGuid ObjectGUID;
- ObjectGuid ActivatorGUID;
- int32 SpellVisualID = 0;
+ uint8 State = 0;
};
- class GameObjectSetStateLocal final : public ServerPacket
+ class GameObjectInteraction final : public ServerPacket
{
public:
- GameObjectSetStateLocal() : ServerPacket(SMSG_GAME_OBJECT_SET_STATE_LOCAL, 16 + 1) { }
+ GameObjectInteraction() : ServerPacket(SMSG_GAME_OBJECT_INTERACTION, 16 + 4) { }
WorldPacket const* Write() override;
ObjectGuid ObjectGUID;
- uint8 State = 0;
+ PlayerInteractionType InteractionType = {};
+ };
+
+ class GameObjectCloseInteraction final : public ServerPacket
+ {
+ public:
+ GameObjectCloseInteraction() : ServerPacket(SMSG_GAME_OBJECT_CLOSE_INTERACTION, 4) { }
+
+ WorldPacket const* Write() override;
+
+ PlayerInteractionType InteractionType = {};
};
}
}
diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp
index 234ce345462..0796748d877 100644
--- a/src/server/game/Server/Packets/GarrisonPackets.cpp
+++ b/src/server/game/Server/Packets/GarrisonPackets.cpp
@@ -481,13 +481,4 @@ WorldPacket const* GarrisonBuildingActivated::Write()
return &_worldPacket;
}
-
-WorldPacket const* GarrisonOpenTalentNpc::Write()
-{
- _worldPacket << NpcGUID;
- _worldPacket << int32(GarrTalentTreeID);
- _worldPacket << int32(FriendshipFactionID);
-
- return &_worldPacket;
-}
}
diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h
index 9b1367a5819..983982842f8 100644
--- a/src/server/game/Server/Packets/GarrisonPackets.h
+++ b/src/server/game/Server/Packets/GarrisonPackets.h
@@ -437,18 +437,6 @@ namespace WorldPackets
uint32 GarrPlotInstanceID = 0;
};
-
- class GarrisonOpenTalentNpc final : public ServerPacket
- {
- public:
- GarrisonOpenTalentNpc() : ServerPacket(SMSG_GARRISON_OPEN_TALENT_NPC, 16 + 4 + 4) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid NpcGUID;
- int32 GarrTalentTreeID = 0;
- int32 FriendshipFactionID = 0; // Always 0 except on The Deaths of Chromie Scenario
- };
}
}
diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp
index 9cd83f4ac62..71cd2daf6d9 100644
--- a/src/server/game/Server/Packets/InspectPackets.cpp
+++ b/src/server/game/Server/Packets/InspectPackets.cpp
@@ -20,12 +20,14 @@
#include "Item.h"
#include "Player.h"
-void WorldPackets::Inspect::Inspect::Read()
+namespace WorldPackets::Inspect
+{
+void Inspect::Read()
{
_worldPacket >> Target;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectEnchantData const& enchantData)
+ByteBuffer& operator<<(ByteBuffer& data, InspectEnchantData const& enchantData)
{
data << uint32(enchantData.Id);
data << uint8(enchantData.Index);
@@ -33,7 +35,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectEnchantDa
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::AzeriteEssenceData const& azeriteEssenceData)
+ByteBuffer& operator<<(ByteBuffer& data, AzeriteEssenceData const& azeriteEssenceData)
{
data << uint32(azeriteEssenceData.Index);
data << uint32(azeriteEssenceData.AzeriteEssenceID);
@@ -44,7 +46,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::AzeriteEssenceDa
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectItemData const& itemData)
+ByteBuffer& operator<<(ByteBuffer& data, InspectItemData const& itemData)
{
data << itemData.CreatorGUID;
data << uint8(itemData.Index);
@@ -60,19 +62,19 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectItemData
data.WriteBits(itemData.Gems.size(), 2);
data.FlushBits();
- for (WorldPackets::Inspect::AzeriteEssenceData const& azeriteEssenceData : itemData.AzeriteEssences)
+ for (AzeriteEssenceData const& azeriteEssenceData : itemData.AzeriteEssences)
data << azeriteEssenceData;
- for (WorldPackets::Inspect::InspectEnchantData const& enchantData : itemData.Enchants)
+ for (InspectEnchantData const& enchantData : itemData.Enchants)
data << enchantData;
- for (WorldPackets::Item::ItemGemData const& gem : itemData.Gems)
+ for (Item::ItemGemData const& gem : itemData.Gems)
data << gem;
return data;
}
-void WorldPackets::Inspect::PlayerModelDisplayInfo::Initialize(Player const* player)
+void PlayerModelDisplayInfo::Initialize(Player const* player)
{
GUID = player->GetGUID();
SpecializationID = player->GetPrimarySpecialization();
@@ -89,7 +91,7 @@ void WorldPackets::Inspect::PlayerModelDisplayInfo::Initialize(Player const* pla
Items.emplace_back(item, i);
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PlayerModelDisplayInfo const& displayInfo)
+ByteBuffer& operator<<(ByteBuffer& data, PlayerModelDisplayInfo const& displayInfo)
{
data << displayInfo.GUID;
data << int32(displayInfo.SpecializationID);
@@ -101,16 +103,16 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PlayerModelDispl
data << uint32(displayInfo.Customizations.size());
data.WriteString(displayInfo.Name);
- for (WorldPackets::Character::ChrCustomizationChoice const& customization : displayInfo.Customizations)
+ for (Character::ChrCustomizationChoice const& customization : displayInfo.Customizations)
data << customization;
- for (WorldPackets::Inspect::InspectItemData const& item : displayInfo.Items)
+ for (InspectItemData const& item : displayInfo.Items)
data << item;
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectGuildData const& guildData)
+ByteBuffer& operator<<(ByteBuffer& data, InspectGuildData const& guildData)
{
data << guildData.GuildGUID;
data << int32(guildData.NumGuildMembers);
@@ -119,9 +121,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectGuildData
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData const& bracket)
+ByteBuffer& operator<<(ByteBuffer& data, PVPBracketData const& bracket)
{
data << uint8(bracket.Bracket);
+ data << int32(bracket.Unused3);
data << int32(bracket.Rating);
data << int32(bracket.Rank);
data << int32(bracket.WeeklyPlayed);
@@ -134,13 +137,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData c
data << int32(bracket.WeeklyBestWinPvpTierID);
data << int32(bracket.Unused1);
data << int32(bracket.Unused2);
+ data << int32(bracket.RoundsSeasonPlayed);
+ data << int32(bracket.RoundsSeasonWon);
+ data << int32(bracket.RoundsWeeklyPlayed);
+ data << int32(bracket.RoundsWeeklyWon);
data.WriteBit(bracket.Disqualified);
data.FlushBits();
return data;
}
-WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint8 index)
+ByteBuffer& operator<<(ByteBuffer& data, TraitInspectInfo const& traits)
+{
+ data << int32(traits.Level);
+ data << int32(traits.ChrSpecializationID);
+ data << traits.Config;
+
+ return data;
+}
+
+InspectItemData::InspectItemData(::Item const* item, uint8 index)
{
CreatorGUID = item->GetCreator();
@@ -159,7 +175,7 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint
{
Gems.emplace_back();
- WorldPackets::Item::ItemGemData& gem = Gems.back();
+ Item::ItemGemData& gem = Gems.back();
gem.Slot = i;
gem.Item.Initialize(&gemData);
}
@@ -174,7 +190,7 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint
{
AzeriteEssences.emplace_back();
- WorldPackets::Inspect::AzeriteEssenceData& essence = AzeriteEssences.back();
+ AzeriteEssenceData& essence = AzeriteEssences.back();
essence.Index = slot;
essence.AzeriteEssenceID = essences->AzeriteEssenceID[slot];
if (essence.AzeriteEssenceID)
@@ -189,7 +205,7 @@ WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint
}
}
-WorldPacket const* WorldPackets::Inspect::InspectResult::Write()
+WorldPacket const* InspectResult::Write()
{
_worldPacket << DisplayInfo;
_worldPacket << uint32(Glyphs.size());
@@ -221,10 +237,13 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write()
if (AzeriteLevel)
_worldPacket << int32(*AzeriteLevel);
+ _worldPacket << TalentTraits;
+
return &_worldPacket;
}
-void WorldPackets::Inspect::QueryInspectAchievements::Read()
+void QueryInspectAchievements::Read()
{
_worldPacket >> Guid;
}
+}
diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h
index 94411ef5e07..ac65e1a0785 100644
--- a/src/server/game/Server/Packets/InspectPackets.h
+++ b/src/server/game/Server/Packets/InspectPackets.h
@@ -24,6 +24,7 @@
#include "ObjectGuid.h"
#include "RaceMask.h"
#include "SharedDefines.h"
+#include "TraitPacketsCommon.h"
class Item;
class Player;
@@ -46,7 +47,7 @@ namespace WorldPackets
{
InspectEnchantData(uint32 id, uint8 index) : Id(id), Index(index) { }
- uint32 Id = 0;
+ uint32 Id = 0;
uint8 Index = 0;
};
@@ -95,20 +96,32 @@ namespace WorldPackets
struct PVPBracketData
{
- int32 Rating = 0;
- int32 Rank = 0;
- int32 WeeklyPlayed = 0;
- int32 WeeklyWon = 0;
- int32 SeasonPlayed = 0;
- int32 SeasonWon = 0;
+ int32 Rating = 0;
+ int32 Rank = 0;
+ int32 WeeklyPlayed = 0;
+ int32 WeeklyWon = 0;
+ int32 SeasonPlayed = 0;
+ int32 SeasonWon = 0;
int32 WeeklyBestRating = 0;
int32 SeasonBestRating = 0;
- int32 PvpTierID = 0;
+ int32 PvpTierID = 0;
int32 WeeklyBestWinPvpTierID = 0;
- int32 Unused1 = 0;
- int32 Unused2 = 0;
- uint8 Bracket = 0;
- bool Disqualified = false;
+ int32 Unused1 = 0;
+ int32 Unused2 = 0;
+ int32 Unused3 = 0;
+ int32 RoundsSeasonPlayed = 0;
+ int32 RoundsSeasonWon = 0;
+ int32 RoundsWeeklyPlayed = 0;
+ int32 RoundsWeeklyWon = 0;
+ uint8 Bracket = 0;
+ bool Disqualified = false;
+ };
+
+ struct TraitInspectInfo
+ {
+ int32 Level = 0;
+ int32 ChrSpecializationID = 0;
+ Traits::TraitConfig Config;
};
class InspectResult final : public ServerPacket
@@ -126,7 +139,7 @@ namespace WorldPackets
std::vector<uint16> Talents;
std::array<uint16, MAX_PVP_TALENT_SLOTS> PvpTalents;
Optional<InspectGuildData> GuildData;
- std::array<PVPBracketData, 6> Bracket;
+ std::array<PVPBracketData, 7> Bracket;
Optional<int32> AzeriteLevel;
int32 ItemLevel = 0;
uint32 LifetimeHK = 0;
@@ -134,6 +147,7 @@ namespace WorldPackets
uint16 TodayHK = 0;
uint16 YesterdayHK = 0;
uint8 LifetimeMaxRank = 0;
+ TraitInspectInfo TalentTraits;
};
class QueryInspectAchievements final : public ClientPacket
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 1c6c2117e76..c747b94a643 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -258,14 +258,27 @@ WorldPacket const* WorldPackets::Item::ItemPushResult::Write()
_worldPacket << uint32(BattlePetBreedQuality);
_worldPacket << int32(BattlePetLevel);
_worldPacket << ItemGUID;
+ _worldPacket << uint32(Toasts.size());
+ for (UiEventToast const& uiEventToast : Toasts)
+ _worldPacket << uiEventToast;
+
_worldPacket.WriteBit(Pushed);
_worldPacket.WriteBit(Created);
_worldPacket.WriteBits(DisplayText, 3);
_worldPacket.WriteBit(IsBonusRoll);
_worldPacket.WriteBit(IsEncounterLoot);
+ _worldPacket.WriteBit(CraftingData.has_value());
+ _worldPacket.WriteBit(FirstCraftOperationID.has_value());
_worldPacket.FlushBits();
+
_worldPacket << Item;
+ if (FirstCraftOperationID)
+ _worldPacket << uint32(*FirstCraftOperationID);
+
+ if (CraftingData)
+ _worldPacket << *CraftingData;
+
return &_worldPacket;
}
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index caa18789635..702ed6c8adf 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -19,6 +19,7 @@
#define ItemPackets_h__
#include "Packet.h"
+#include "CraftingPacketsCommon.h"
#include "DBCEnums.h"
#include "ItemDefines.h"
#include "ItemPacketsCommon.h"
@@ -345,12 +346,15 @@ namespace WorldPackets
// only set if different than real ID (similar to CreatureTemplate.KillCredit)
int32 Quantity = 0;
int32 QuantityInInventory = 0;
- int32 DungeonEncounterID = 0;
+ int32 DungeonEncounterID = 0;
int32 BattlePetSpeciesID = 0;
int32 BattlePetBreedID = 0;
uint32 BattlePetBreedQuality = 0;
int32 BattlePetLevel = 0;
ObjectGuid ItemGUID;
+ std::vector<UiEventToast> Toasts;
+ Optional<Crafting::CraftingData> CraftingData;
+ Optional<uint32> FirstCraftOperationID;
bool Pushed = false;
DisplayType DisplayText = DISPLAY_TYPE_HIDDEN;
bool Created = false;
diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp
index a022a0b3783..70da5777d07 100644
--- a/src/server/game/Server/Packets/ItemPacketsCommon.cpp
+++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp
@@ -20,9 +20,7 @@
#include "Loot.h"
#include "Player.h"
-namespace WorldPackets
-{
-namespace Item
+namespace WorldPackets::Item
{
bool ItemBonuses::operator==(ItemBonuses const& r) const
{
@@ -51,7 +49,7 @@ bool ItemModList::operator==(ItemModList const& r) const
void ItemInstance::Initialize(::Item const* item)
{
ItemID = item->GetEntry();
- std::vector<int32> const& bonusListIds = item->m_itemData->BonusListIDs;
+ std::vector<int32> const& bonusListIds = item->GetBonusListIDs();
if (!bonusListIds.empty())
{
ItemBonus.emplace();
@@ -126,6 +124,20 @@ bool ItemInstance::operator==(ItemInstance const& r) const
return true;
}
+bool ItemBonusKey::operator==(ItemBonusKey const& right) const
+{
+ if (ItemID != right.ItemID)
+ return false;
+
+ if (BonusListIDs != right.BonusListIDs)
+ return false;
+
+ if (Modifications != right.Modifications)
+ return false;
+
+ return true;
+}
+
ByteBuffer& operator<<(ByteBuffer& data, ItemBonuses const& itemBonusInstanceData)
{
data << uint8(itemBonusInstanceData.Context);
@@ -224,6 +236,21 @@ ByteBuffer& operator>>(ByteBuffer& data, ItemInstance& itemInstance)
return data;
}
+ByteBuffer& operator<<(ByteBuffer& data, ItemBonusKey const& itemBonusKey)
+{
+ data << int32(itemBonusKey.ItemID);
+ data << uint32(itemBonusKey.BonusListIDs.size());
+ data << uint32(itemBonusKey.Modifications.size());
+
+ if (!itemBonusKey.BonusListIDs.empty())
+ data.append(itemBonusKey.BonusListIDs.data(), itemBonusKey.BonusListIDs.size());
+
+ for (ItemMod const& modification : itemBonusKey.Modifications)
+ data << modification;
+
+ return data;
+}
+
ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData)
{
data << int32(itemEnchantData.ID);
@@ -259,5 +286,12 @@ ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate)
return data;
}
+
+ByteBuffer& operator<<(ByteBuffer& data, UiEventToast const& uiEventToast)
+{
+ data << int32(uiEventToast.UiEventToastID);
+ data << int32(uiEventToast.Asset);
+
+ return data;
}
}
diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.h b/src/server/game/Server/Packets/ItemPacketsCommon.h
index 2131d8ae7a5..b70cb8b1491 100644
--- a/src/server/game/Server/Packets/ItemPacketsCommon.h
+++ b/src/server/game/Server/Packets/ItemPacketsCommon.h
@@ -82,6 +82,16 @@ namespace WorldPackets
bool operator!=(ItemInstance const& r) const { return !(*this == r); }
};
+ struct ItemBonusKey
+ {
+ int32 ItemID = 0;
+ std::vector<int32> BonusListIDs;
+ std::vector<ItemMod> Modifications;
+
+ bool operator==(ItemBonusKey const& right) const;
+ bool operator!=(ItemBonusKey const& r) const { return !(*this == r); }
+ };
+
struct ItemEnchantData
{
ItemEnchantData(int32 id, uint32 expiration, int32 charges, uint8 slot) : ID(id), Expiration(expiration), Charges(charges), Slot(slot) { }
@@ -107,23 +117,27 @@ namespace WorldPackets
std::vector<InvItem> Items;
};
- }
-}
-namespace WorldPackets
-{
-namespace Item
-{
-ByteBuffer& operator<<(ByteBuffer& data, ItemInstance const& itemInstance);
-ByteBuffer& operator>>(ByteBuffer& data, ItemInstance& itemInstance);
+ struct UiEventToast
+ {
+ int32 UiEventToastID = 0;
+ int32 Asset = 0;
+ };
-ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData);
+ ByteBuffer& operator<<(ByteBuffer& data, ItemEnchantData const& itemEnchantData);
-ByteBuffer& operator<<(ByteBuffer& data, ItemGemData const& itemGemInstanceData);
-ByteBuffer& operator>>(ByteBuffer& data, ItemGemData& itemGemInstanceData);
+ ByteBuffer& operator<<(ByteBuffer& data, ItemGemData const& itemGemInstanceData);
+ ByteBuffer& operator>>(ByteBuffer& data, ItemGemData& itemGemInstanceData);
-ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate);
-}
+ ByteBuffer& operator<<(ByteBuffer& data, ItemInstance const& itemInstance);
+ ByteBuffer& operator>>(ByteBuffer& data, ItemInstance& itemInstance);
+
+ ByteBuffer& operator<<(ByteBuffer& data, ItemBonusKey const& itemBonusKey);
+
+ ByteBuffer& operator>>(ByteBuffer& data, InvUpdate& invUpdate);
+
+ ByteBuffer& operator<<(ByteBuffer& data, UiEventToast const& uiEventToast);
+ }
}
#endif // ItemPacketsCommon_h__
diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp
index 5c06b7bd41f..ee205ab1908 100644
--- a/src/server/game/Server/Packets/LootPackets.cpp
+++ b/src/server/game/Server/Packets/LootPackets.cpp
@@ -33,6 +33,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Loot::LootItemData const&
void WorldPackets::Loot::LootUnit::Read()
{
_worldPacket >> Unit;
+ IsSoftInteract = _worldPacket.ReadBit();
}
WorldPacket const* WorldPackets::Loot::LootResponse::Write()
@@ -168,6 +169,7 @@ WorldPacket const* WorldPackets::Loot::StartLootRoll::Write()
_worldPacket << int32(MapID);
_worldPacket << RollTime;
_worldPacket << uint8(ValidRolls);
+ _worldPacket.append(LootRollIneligibleReason.data(), LootRollIneligibleReason.size());
_worldPacket << uint8(Method);
_worldPacket << Item;
diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h
index 794e5ca3212..a69b36586c9 100644
--- a/src/server/game/Server/Packets/LootPackets.h
+++ b/src/server/game/Server/Packets/LootPackets.h
@@ -22,6 +22,8 @@
#include "ObjectGuid.h"
#include "ItemPacketsCommon.h"
+enum class LootRollIneligibilityReason : uint32;
+
namespace WorldPackets
{
namespace Loot
@@ -34,6 +36,7 @@ namespace WorldPackets
void Read() override;
ObjectGuid Unit;
+ bool IsSoftInteract = false;
};
struct LootItemData
@@ -221,6 +224,7 @@ namespace WorldPackets
Duration<Milliseconds, uint32> RollTime;
uint8 Method = 0;
uint8 ValidRolls = 0;
+ std::array<LootRollIneligibilityReason, 4> LootRollIneligibleReason = { };
LootItemData Item;
};
diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp
index e916410f78b..712f174bd39 100644
--- a/src/server/game/Server/Packets/MailPackets.cpp
+++ b/src/server/game/Server/Packets/MailPackets.cpp
@@ -277,10 +277,3 @@ WorldPacket const* WorldPackets::Mail::NotifyReceivedMail::Write()
return &_worldPacket;
}
-
-WorldPacket const* WorldPackets::Mail::ShowMailbox::Write()
-{
- _worldPacket << PostmasterGUID;
-
- return &_worldPacket;
-}
diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h
index c7cb29bf4c0..5c65dce692e 100644
--- a/src/server/game/Server/Packets/MailPackets.h
+++ b/src/server/game/Server/Packets/MailPackets.h
@@ -235,16 +235,6 @@ namespace WorldPackets
float Delay = 0.0f;
};
-
- class ShowMailbox final : public ServerPacket
- {
- public:
- ShowMailbox() : ServerPacket(SMSG_SHOW_MAILBOX, 16) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid PostmasterGUID;
- };
}
}
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index bfbe9f748a4..dc07825fdf5 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -53,11 +53,13 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write()
_worldPacket.WriteBit(WeeklyQuantity.has_value());
_worldPacket.WriteBit(TrackedQuantity.has_value());
_worldPacket.WriteBit(MaxQuantity.has_value());
- _worldPacket.WriteBit(Unused901.has_value());
+ _worldPacket.WriteBit(TotalEarned.has_value());
_worldPacket.WriteBit(SuppressChatLog);
_worldPacket.WriteBit(QuantityChange.has_value());
- _worldPacket.WriteBit(QuantityGainSource.has_value());
_worldPacket.WriteBit(QuantityLostSource.has_value());
+ _worldPacket.WriteBit(QuantityGainSource.has_value());
+ _worldPacket.WriteBit(FirstCraftOperationID.has_value());
+ _worldPacket.WriteBit(LastSpendTime.has_value());
_worldPacket.FlushBits();
if (WeeklyQuantity)
@@ -69,17 +71,23 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write()
if (MaxQuantity)
_worldPacket << int32(*MaxQuantity);
- if (Unused901)
- _worldPacket << int32(*Unused901);
+ if (TotalEarned)
+ _worldPacket << int32(*TotalEarned);
if (QuantityChange)
_worldPacket << int32(*QuantityChange);
+ if (QuantityLostSource)
+ _worldPacket << int32(*QuantityLostSource);
+
if (QuantityGainSource)
_worldPacket << int32(*QuantityGainSource);
- if (QuantityLostSource)
- _worldPacket << int32(*QuantityLostSource);
+ if (FirstCraftOperationID)
+ _worldPacket << uint32(*FirstCraftOperationID);
+
+ if (LastSpendTime)
+ _worldPacket << *LastSpendTime;
return &_worldPacket;
}
@@ -102,7 +110,8 @@ WorldPacket const* WorldPackets::Misc::SetupCurrency::Write()
_worldPacket.WriteBit(data.MaxWeeklyQuantity.has_value());
_worldPacket.WriteBit(data.TrackedQuantity.has_value());
_worldPacket.WriteBit(data.MaxQuantity.has_value());
- _worldPacket.WriteBit(data.Unused901.has_value());
+ _worldPacket.WriteBit(data.TotalEarned.has_value());
+ _worldPacket.WriteBit(data.LastSpendTime.has_value());
_worldPacket.WriteBits(data.Flags, 5);
_worldPacket.FlushBits();
@@ -114,8 +123,10 @@ WorldPacket const* WorldPackets::Misc::SetupCurrency::Write()
_worldPacket << uint32(*data.TrackedQuantity);
if (data.MaxQuantity)
_worldPacket << int32(*data.MaxQuantity);
- if (data.Unused901)
- _worldPacket << int32(*data.Unused901);
+ if (data.TotalEarned)
+ _worldPacket << int32(*data.TotalEarned);
+ if (data.LastSpendTime)
+ _worldPacket << *data.LastSpendTime;
}
return &_worldPacket;
@@ -321,13 +332,6 @@ WorldPacket const* WorldPackets::Misc::PlayerBound::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Misc::BinderConfirm::Write()
-{
- _worldPacket << Unit;
-
- return &_worldPacket;
-}
-
WorldPacket const* WorldPackets::Misc::StartMirrorTimer::Write()
{
_worldPacket << int32(Timer);
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index ead73143901..f4b089371b7 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -63,17 +63,6 @@ namespace WorldPackets
uint32 AreaID = 0;
};
- class BinderConfirm final : public ServerPacket
- {
- public:
- BinderConfirm() : ServerPacket(SMSG_BINDER_CONFIRM, 16) { }
- BinderConfirm(ObjectGuid unit) : ServerPacket(SMSG_BINDER_CONFIRM, 16), Unit(unit) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid Unit;
- };
-
class InvalidatePlayer final : public ServerPacket
{
public:
@@ -116,13 +105,16 @@ namespace WorldPackets
int32 Type = 0;
int32 Quantity = 0;
uint32 Flags = 0;
+ std::vector<Item::UiEventToast> Toasts;
Optional<int32> WeeklyQuantity;
Optional<int32> TrackedQuantity;
Optional<int32> MaxQuantity;
- Optional<int32> Unused901;
+ Optional<int32> TotalEarned;
Optional<int32> QuantityChange;
Optional<int32> QuantityGainSource;
Optional<int32> QuantityLostSource;
+ Optional<uint32> FirstCraftOperationID;
+ Optional<Timestamp<>> LastSpendTime;
bool SuppressChatLog = false;
};
@@ -147,7 +139,8 @@ namespace WorldPackets
Optional<int32> MaxWeeklyQuantity; // Weekly Currency cap.
Optional<int32> TrackedQuantity;
Optional<int32> MaxQuantity;
- Optional<int32> Unused901;
+ Optional<int32> TotalEarned;
+ Optional<Timestamp<>> LastSpendTime;
uint8 Flags = 0; // 0 = none,
};
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index c631249f01a..391be953ee7 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -29,6 +29,7 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo)
bool hasFallData = hasFallDirection || movementInfo.jump.fallTime != 0;
bool hasSpline = false; // todo 6.x send this infos
bool hasInertia = movementInfo.inertia.has_value();
+ bool hasAdvFlying = movementInfo.advFlying.has_value();
data << movementInfo.guid;
data << uint32(movementInfo.flags);
@@ -57,6 +58,7 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo)
data.WriteBit(false); // HeightChangeFailed
data.WriteBit(false); // RemoteTimeValid
data.WriteBit(hasInertia);
+ data.WriteBit(hasAdvFlying);
data.FlushBits();
@@ -65,11 +67,17 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo const& movementInfo)
if (hasInertia)
{
- data << movementInfo.inertia->guid;
+ data << uint32(movementInfo.inertia->id);
data << movementInfo.inertia->force.PositionXYZStream();
data << uint32(movementInfo.inertia->lifetime);
}
+ if (hasAdvFlying)
+ {
+ data << float(movementInfo.advFlying->forwardVelocity);
+ data << float(movementInfo.advFlying->upVelocity);
+ }
+
if (hasFallData)
{
data << uint32(movementInfo.jump.fallTime);
@@ -120,6 +128,7 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo)
data.ReadBit(); // HeightChangeFailed
data.ReadBit(); // RemoteTimeValid
bool hasInertia = data.ReadBit();
+ bool hasAdvFlying = data.ReadBit();
if (hasTransport)
data >> movementInfo.transport;
@@ -128,11 +137,19 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo)
{
movementInfo.inertia.emplace();
- data >> movementInfo.inertia->guid;
+ data >> movementInfo.inertia->id;
data >> movementInfo.inertia->force.PositionXYZStream();
data >> movementInfo.inertia->lifetime;
}
+ if (hasAdvFlying)
+ {
+ movementInfo.advFlying.emplace();
+
+ data >> movementInfo.advFlying->forwardVelocity;
+ data >> movementInfo.advFlying->upVelocity;
+ }
+
if (hasFall)
{
data >> movementInfo.jump.fallTime;
@@ -1008,12 +1025,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound
data << uint16(stateChange.MessageID);
data << uint32(stateChange.SequenceIndex);
data.WriteBit(stateChange.Speed.has_value());
+ data.WriteBit(stateChange.SpeedRange.has_value());
data.WriteBit(stateChange.KnockBack.has_value());
data.WriteBit(stateChange.VehicleRecID.has_value());
data.WriteBit(stateChange.CollisionHeight.has_value());
data.WriteBit(stateChange.MovementForce_.has_value());
data.WriteBit(stateChange.MovementForceGUID.has_value());
- data.WriteBit(stateChange.MovementInertiaGUID.has_value());
+ data.WriteBit(stateChange.MovementInertiaID.has_value());
data.WriteBit(stateChange.MovementInertiaLifetimeMs.has_value());
data.FlushBits();
@@ -1023,6 +1041,12 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound
if (stateChange.Speed)
data << float(*stateChange.Speed);
+ if (stateChange.SpeedRange)
+ {
+ data << float(stateChange.SpeedRange->Min);
+ data << float(stateChange.SpeedRange->Max);
+ }
+
if (stateChange.KnockBack)
{
data << float(stateChange.KnockBack->HorzSpeed);
@@ -1043,8 +1067,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound
if (stateChange.MovementForceGUID)
data << *stateChange.MovementForceGUID;
- if (stateChange.MovementInertiaGUID)
- data << *stateChange.MovementInertiaGUID;
+ if (stateChange.MovementInertiaID)
+ data << int32(*stateChange.MovementInertiaID);
if (stateChange.MovementInertiaLifetimeMs)
data << uint32(*stateChange.MovementInertiaLifetimeMs);
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index 8b114cb0e1f..e9421952c33 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -670,6 +670,12 @@ namespace WorldPackets
float InitVertSpeed = 0.0f;
};
+ struct SpeedRange
+ {
+ float Min = 0.0f;
+ float Max = 0.0f;
+ };
+
struct MoveStateChange
{
MoveStateChange(OpcodeServer messageId, uint32 sequenceIndex) : MessageID(messageId), SequenceIndex(sequenceIndex) { }
@@ -677,12 +683,13 @@ namespace WorldPackets
uint16 MessageID = 0;
uint32 SequenceIndex = 0;
Optional<float> Speed;
+ Optional<SpeedRange> SpeedRange;
Optional<KnockBackInfo> KnockBack;
Optional<int32> VehicleRecID;
Optional<CollisionHeightInfo> CollisionHeight;
Optional<MovementForce> MovementForce_;
Optional<ObjectGuid> MovementForceGUID;
- Optional<ObjectGuid> MovementInertiaGUID;
+ Optional<int32> MovementInertiaID;
Optional<uint32> MovementInertiaLifetimeMs;
};
diff --git a/src/server/game/Server/Packets/MythicPlusPacketsCommon.h b/src/server/game/Server/Packets/MythicPlusPacketsCommon.h
index eaf56d5344d..c9f921a21ec 100644
--- a/src/server/game/Server/Packets/MythicPlusPacketsCommon.h
+++ b/src/server/game/Server/Packets/MythicPlusPacketsCommon.h
@@ -82,7 +82,6 @@ namespace WorldPackets
int32 MapChallengeModeID = 0;
std::vector<DungeonScoreBestRunForAffix> BestRuns;
float OverAllScore = 0.0f;
-
};
struct DungeonScoreSeasonData
diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp
index 74551b6380b..7a6d003e4a3 100644
--- a/src/server/game/Server/Packets/NPCPackets.cpp
+++ b/src/server/game/Server/Packets/NPCPackets.cpp
@@ -18,10 +18,56 @@
#include "NPCPackets.h"
#include "Util.h"
-namespace WorldPackets
+namespace WorldPackets::NPC
{
-namespace NPC
+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;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, ClientGossipOptions const& gossipOption)
+{
+ data << int32(gossipOption.GossipOptionID);
+ data << uint8(gossipOption.OptionNPC);
+ data << int8(gossipOption.OptionFlags);
+ data << int32(gossipOption.OptionCost);
+ data << uint32(gossipOption.OptionLanguage);
+ data << int32(gossipOption.Flags);
+ data << int32(gossipOption.OrderIndex);
+ data.WriteBits(gossipOption.Text.size(), 12);
+ data.WriteBits(gossipOption.Confirm.size(), 12);
+ data.WriteBits(AsUnderlyingType(gossipOption.Status), 2);
+ data.WriteBit(gossipOption.SpellID.has_value());
+ data.WriteBit(gossipOption.OverrideIconID.has_value());
+ data.FlushBits();
+
+ data << gossipOption.Treasure;
+
+ data.WriteString(gossipOption.Text);
+ data.WriteString(gossipOption.Confirm);
+
+ if (gossipOption.SpellID)
+ data << int32(*gossipOption.SpellID);
+
+ if (*gossipOption.OverrideIconID)
+ data << int32(*gossipOption.OverrideIconID);
+
+ return data;
+}
+
ByteBuffer& operator<<(ByteBuffer& data, ClientGossipText const& gossipText)
{
data << int32(gossipText.QuestID);
@@ -44,22 +90,14 @@ void Hello::Read()
_worldPacket >> Unit;
}
-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)
+WorldPacket const* NPCInteractionOpenResult::Write()
{
- data << uint32(treasureLootList.Items.size());
- for (TreasureItem const& treasureItem : treasureLootList.Items)
- data << treasureItem;
+ _worldPacket << Npc;
+ _worldPacket << int32(InteractionType);
+ _worldPacket.WriteBit(Success);
+ _worldPacket.FlushBits();
- return data;
+ return &_worldPacket;
}
WorldPacket const* GossipMessage::Write()
@@ -67,31 +105,20 @@ WorldPacket const* GossipMessage::Write()
_worldPacket << GossipGUID;
_worldPacket << int32(GossipID);
_worldPacket << int32(FriendshipFactionID);
- _worldPacket << int32(TextID);
_worldPacket << uint32(GossipOptions.size());
_worldPacket << uint32(GossipText.size());
+ _worldPacket.WriteBit(TextID.has_value());
+ _worldPacket.WriteBit(TextID2.has_value());
+ _worldPacket.FlushBits();
for (ClientGossipOptions const& options : GossipOptions)
- {
- _worldPacket << int32(options.ClientOption);
- _worldPacket << uint8(options.OptionNPC);
- _worldPacket << int8(options.OptionFlags);
- _worldPacket << int32(options.OptionCost);
- _worldPacket << uint32(options.OptionLanguage);
- _worldPacket.WriteBits(options.Text.size(), 12);
- _worldPacket.WriteBits(options.Confirm.size(), 12);
- _worldPacket.WriteBits(AsUnderlyingType(options.Status), 2);
- _worldPacket.WriteBit(options.SpellID.has_value());
- _worldPacket.FlushBits();
-
- _worldPacket << options.Treasure;
-
- _worldPacket.WriteString(options.Text);
- _worldPacket.WriteString(options.Confirm);
-
- if (options.SpellID)
- _worldPacket << int32(*options.SpellID);
- }
+ _worldPacket << options;
+
+ if (TextID)
+ _worldPacket << int32(*TextID);
+
+ if (TextID2)
+ _worldPacket << int32(*TextID2);
for (ClientGossipText const& text : GossipText)
_worldPacket << text;
@@ -101,20 +128,21 @@ WorldPacket const* GossipMessage::Write()
ByteBuffer& operator<<(ByteBuffer& data, VendorItem const& item)
{
- data << uint32(item.MuID);
- data << int32(item.Type);
- data << int32(item.Quantity);
data << uint64(item.Price);
+ data << uint32(item.MuID);
data << int32(item.Durability);
data << int32(item.StackCount);
+ data << int32(item.Quantity);
data << int32(item.ExtendedCostID);
data << int32(item.PlayerConditionFailed);
- data << item.Item;
+ data.WriteBits(item.Type, 3);
data.WriteBit(item.Locked);
data.WriteBit(item.DoNotFilterOnVendor);
data.WriteBit(item.Refundable);
data.FlushBits();
+ data << item.Item;
+
return data;
}
@@ -154,34 +182,33 @@ WorldPacket const* TrainerList::Write()
return &_worldPacket;
}
-WorldPacket const* ShowBank::Write()
-{
- _worldPacket << Guid;
-
- return &_worldPacket;
-}
-
void GossipSelectOption::Read()
{
_worldPacket >> GossipUnit;
_worldPacket >> GossipID;
- _worldPacket >> GossipIndex;
+ _worldPacket >> GossipOptionID;
uint32 length = _worldPacket.ReadBits(8);
PromotionCode = _worldPacket.ReadString(length);
}
-WorldPacket const* GossipComplete::Write()
+WorldPacket const* GossipOptionNPCInteraction::Write()
{
- _worldPacket.WriteBit(SuppressSound);
+ _worldPacket << GossipGUID;
+ _worldPacket << int32(GossipNpcOptionID);
+ _worldPacket.WriteBit(FriendshipFactionID.has_value());
_worldPacket.FlushBits();
+ if (FriendshipFactionID)
+ _worldPacket << int32(*FriendshipFactionID);
+
return &_worldPacket;
}
-WorldPacket const* PlayerTabardVendorActivate::Write()
+WorldPacket const* GossipComplete::Write()
{
- _worldPacket << Vendor;
+ _worldPacket.WriteBit(SuppressSound);
+ _worldPacket.FlushBits();
return &_worldPacket;
}
@@ -206,13 +233,6 @@ void SpiritHealerActivate::Read()
_worldPacket >> Healer;
}
-WorldPacket const* SpiritHealerConfirm::Write()
-{
- _worldPacket << Unit;
-
- return &_worldPacket;
-}
-
void TrainerBuySpell::Read()
{
_worldPacket >> TrainerGUID;
@@ -241,4 +261,3 @@ void SetPetSlot::Read()
_worldPacket >> StableMaster;
}
}
-}
diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h
index ab6f04fd4af..cb6666cfa71 100644
--- a/src/server/game/Server/Packets/NPCPackets.h
+++ b/src/server/game/Server/Packets/NPCPackets.h
@@ -24,9 +24,11 @@
#include "Position.h"
#include <array>
+enum class GossipOptionFlags : int32;
enum class GossipOptionNpc : uint8;
enum class GossipOptionStatus : uint8;
enum class GossipOptionRewardType : uint8;
+enum class PlayerInteractionType : int32;
namespace WorldPackets
{
@@ -49,6 +51,18 @@ namespace WorldPackets
ObjectGuid Unit;
};
+ class TC_GAME_API NPCInteractionOpenResult final : public ServerPacket
+ {
+ public:
+ NPCInteractionOpenResult() : ServerPacket(SMSG_NPC_INTERACTION_OPEN_RESULT, 16 + 4 + 1) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Npc;
+ PlayerInteractionType InteractionType = {};
+ bool Success = true;
+ };
+
struct TreasureItem
{
GossipOptionRewardType Type = GossipOptionRewardType(0);
@@ -63,16 +77,19 @@ namespace WorldPackets
struct ClientGossipOptions
{
- int32 ClientOption = 0;
- GossipOptionNpc OptionNPC = GossipOptionNpc(0);
+ int32 GossipOptionID = 0;
+ GossipOptionNpc OptionNPC = {};
uint8 OptionFlags = 0;
int32 OptionCost = 0;
uint32 OptionLanguage = 0;
- GossipOptionStatus Status = GossipOptionStatus(0);
- std::string Text;
- std::string Confirm;
+ GossipOptionFlags Flags = {};
+ int32 OrderIndex = 0;
+ GossipOptionStatus Status = {};
+ std::string_view Text;
+ std::string_view Confirm;
TreasureLootList Treasure;
Optional<int32> SpellID;
+ Optional<int32> OverrideIconID;
};
struct ClientGossipText
@@ -98,7 +115,8 @@ namespace WorldPackets
int32 FriendshipFactionID = 0;
ObjectGuid GossipGUID;
std::vector<ClientGossipText> GossipText;
- int32 TextID = 0;
+ Optional<int32> TextID;
+ Optional<int32> TextID2;
int32 GossipID = 0;
};
@@ -110,11 +128,23 @@ namespace WorldPackets
void Read() override;
ObjectGuid GossipUnit;
- int32 GossipIndex = 0;
+ int32 GossipOptionID = 0;
int32 GossipID = 0;
std::string PromotionCode;
};
+ class GossipOptionNPCInteraction final : public ServerPacket
+ {
+ public:
+ GossipOptionNPCInteraction() : ServerPacket(SMSG_GOSSIP_OPTION_NPC_INTERACTION, 16 + 4 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid GossipGUID;
+ int32 GossipNpcOptionID = 0;
+ Optional<int32> FriendshipFactionID;
+ };
+
class GossipComplete final : public ServerPacket
{
public:
@@ -178,26 +208,6 @@ namespace WorldPackets
std::string Greeting;
};
- class ShowBank final : public ServerPacket
- {
- public:
- ShowBank() : ServerPacket(SMSG_SHOW_BANK, 16) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid Guid;
- };
-
- class PlayerTabardVendorActivate final : public ServerPacket
- {
- public:
- PlayerTabardVendorActivate() : ServerPacket(SMSG_PLAYER_TABARD_VENDOR_ACTIVATE, 16) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid Vendor;
- };
-
class GossipPOI final : public ServerPacket
{
public:
@@ -224,16 +234,6 @@ namespace WorldPackets
ObjectGuid Healer;
};
- class TC_GAME_API SpiritHealerConfirm final : public ServerPacket
- {
- public:
- SpiritHealerConfirm() : ServerPacket(SMSG_SPIRIT_HEALER_CONFIRM, 16) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid Unit;
- };
-
class TrainerBuySpell final : public ClientPacket
{
public:
diff --git a/src/server/game/Server/Packets/PacketUtilities.h b/src/server/game/Server/Packets/PacketUtilities.h
index a4ecc96c08c..f445169784c 100644
--- a/src/server/game/Server/Packets/PacketUtilities.h
+++ b/src/server/game/Server/Packets/PacketUtilities.h
@@ -78,6 +78,7 @@ namespace WorldPackets
public:
bool empty() const { return _storage.empty(); }
+ std::size_t length() const { return _storage.length(); }
char const* c_str() const { return _storage.c_str(); }
operator std::string_view() const { return _storage; }
@@ -132,11 +133,11 @@ namespace WorldPackets
/**
* Utility class for automated prevention of loop counter spoofing in client packets
*/
- template<typename T, std::size_t N>
+ template<typename T, std::size_t N, typename Container = boost::container::static_vector<T, N>>
class Array
{
public:
- typedef boost::container::static_vector<T, N> storage_type;
+ typedef Container storage_type;
typedef std::integral_constant<std::size_t, N> max_capacity;
diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp
index 76d803dbf17..43fd278239f 100644
--- a/src/server/game/Server/Packets/QuestPackets.cpp
+++ b/src/server/game/Server/Packets/QuestPackets.cpp
@@ -18,9 +18,7 @@
#include "QuestPackets.h"
#include "Util.h"
-namespace WorldPackets
-{
-namespace Quest
+namespace WorldPackets::Quest
{
ByteBuffer& operator<<(ByteBuffer& data, QuestCompleteDisplaySpell const& questDisplaySpell)
{
@@ -30,6 +28,18 @@ ByteBuffer& operator<<(ByteBuffer& data, QuestCompleteDisplaySpell const& questD
return data;
}
+ByteBuffer& operator<<(ByteBuffer& data, ConditionalQuestText const& conditionalQuestText)
+{
+ data << int32(conditionalQuestText.PlayerConditionID);
+ data << int32(conditionalQuestText.QuestGiverCreatureID);
+ data.WriteBits(conditionalQuestText.Text.length(), 12);
+ data.FlushBits();
+
+ data.WriteString(conditionalQuestText.Text);
+
+ return data;
+}
+
void QuestGiverStatusQuery::Read()
{
_worldPacket >> QuestGiverGUID;
@@ -159,6 +169,10 @@ WorldPacket const* QueryQuestInfoResponse::Write()
_worldPacket << int32(Info.Expansion);
_worldPacket << int32(Info.ManagedWorldStateID);
_worldPacket << int32(Info.QuestSessionBonus);
+ _worldPacket << int32(Info.QuestGiverCreatureID);
+
+ _worldPacket << uint32(Info.ConditionalQuestDescription.size());
+ _worldPacket << uint32(Info.ConditionalQuestCompletionLog.size());
for (QuestCompleteDisplaySpell const& rewardDisplaySpell : Info.RewardDisplaySpell)
_worldPacket << rewardDisplaySpell;
@@ -205,6 +219,12 @@ WorldPacket const* QueryQuestInfoResponse::Write()
_worldPacket.WriteString(Info.PortraitTurnInText);
_worldPacket.WriteString(Info.PortraitTurnInName);
_worldPacket.WriteString(Info.QuestCompletionLog);
+
+ for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestDescription)
+ _worldPacket << conditionalQuestText;
+
+ for (ConditionalQuestText const& conditionalQuestText : Info.ConditionalQuestCompletionLog)
+ _worldPacket << conditionalQuestText;
}
return &_worldPacket;
@@ -315,6 +335,7 @@ ByteBuffer& operator<<(ByteBuffer& data, QuestGiverOfferReward const& offer)
data << int32(offer.QuestID);
data << int32(offer.QuestFlags[0]); // Flags
data << int32(offer.QuestFlags[1]); // FlagsEx
+ data << int32(offer.QuestFlags[2]); // FlagsEx2
data << int32(offer.SuggestedPartyMembers);
data << int32(offer.Emotes.size());
for (QuestDescEmote const& emote : offer.Emotes)
@@ -340,6 +361,8 @@ WorldPacket const* QuestGiverOfferRewardMessage::Write()
_worldPacket << int32(PortraitGiverMount);
_worldPacket << int32(PortraitGiverModelSceneID);
_worldPacket << int32(PortraitTurnIn);
+ _worldPacket << int32(QuestGiverCreatureID);
+ _worldPacket << uint32(ConditionalRewardText.size());
_worldPacket.WriteBits(QuestTitle.size(), 9);
_worldPacket.WriteBits(RewardText.size(), 12);
@@ -349,6 +372,9 @@ WorldPacket const* QuestGiverOfferRewardMessage::Write()
_worldPacket.WriteBits(PortraitTurnInName.size(), 8);
_worldPacket.FlushBits();
+ for (ConditionalQuestText const& conditionalQuestText : ConditionalRewardText)
+ _worldPacket << conditionalQuestText;
+
_worldPacket.WriteString(QuestTitle);
_worldPacket.WriteString(RewardText);
_worldPacket.WriteString(PortraitGiverText);
@@ -407,12 +433,15 @@ WorldPacket const* QuestGiverQuestDetails::Write()
_worldPacket << int32(PortraitTurnIn);
_worldPacket << uint32(QuestFlags[0]); // Flags
_worldPacket << uint32(QuestFlags[1]); // FlagsEx
+ _worldPacket << uint32(QuestFlags[2]); // FlagsEx
_worldPacket << int32(SuggestedPartyMembers);
_worldPacket << uint32(LearnSpells.size());
_worldPacket << uint32(DescEmotes.size());
_worldPacket << uint32(Objectives.size());
_worldPacket << int32(QuestStartItemID);
_worldPacket << int32(QuestSessionBonus);
+ _worldPacket << int32(QuestGiverCreatureID);
+ _worldPacket << uint32(ConditionalDescriptionText.size());
for (int32 spell : LearnSpells)
_worldPacket << int32(spell);
@@ -453,6 +482,9 @@ WorldPacket const* QuestGiverQuestDetails::Write()
_worldPacket.WriteString(PortraitTurnInText);
_worldPacket.WriteString(PortraitTurnInName);
+ for (ConditionalQuestText const& conditionalQuestText : ConditionalDescriptionText)
+ _worldPacket << conditionalQuestText;
+
return &_worldPacket;
}
@@ -465,6 +497,7 @@ WorldPacket const* QuestGiverRequestItems::Write()
_worldPacket << int32(CompEmoteType);
_worldPacket << uint32(QuestFlags[0]);
_worldPacket << uint32(QuestFlags[1]);
+ _worldPacket << uint32(QuestFlags[2]);
_worldPacket << int32(SuggestPartyMembers);
_worldPacket << int32(MoneyToGet);
_worldPacket << int32(Collect.size());
@@ -487,10 +520,16 @@ WorldPacket const* QuestGiverRequestItems::Write()
_worldPacket.WriteBit(AutoLaunched);
_worldPacket.FlushBits();
+ _worldPacket << int32(QuestGiverCreatureID);
+ _worldPacket << uint32(ConditionalCompletionText.size());
+
_worldPacket.WriteBits(QuestTitle.size(), 9);
_worldPacket.WriteBits(CompletionText.size(), 12);
_worldPacket.FlushBits();
+ for (ConditionalQuestText const& conditionalQuestText : ConditionalCompletionText)
+ _worldPacket << conditionalQuestText;
+
_worldPacket.WriteString(QuestTitle);
_worldPacket.WriteString(CompletionText);
@@ -773,4 +812,3 @@ void ChoiceResponse::Read()
IsReroll = _worldPacket.ReadBit();
}
}
-}
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index 630cb3880cc..14c9f25e981 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -113,6 +113,13 @@ namespace WorldPackets
int32 PlayerConditionID = 0;
};
+ struct ConditionalQuestText
+ {
+ int32 PlayerConditionID = 0;
+ int32 QuestGiverCreatureID = 0;
+ std::string_view Text;
+ };
+
struct QuestInfo
{
int32 QuestID = 0;
@@ -171,7 +178,10 @@ namespace WorldPackets
int32 Expansion = 0;
int32 ManagedWorldStateID = 0;
int32 QuestSessionBonus = 0;
+ int32 QuestGiverCreatureID = 0; // used to select ConditionalQuestText
std::vector<QuestObjective> Objectives;
+ std::vector<ConditionalQuestText> ConditionalQuestDescription;
+ std::vector<ConditionalQuestText> ConditionalQuestCompletionLog;
int32 RewardItems[QUEST_REWARD_ITEM_COUNT] = { };
int32 RewardAmount[QUEST_REWARD_ITEM_COUNT] = { };
int32 ItemDrop[QUEST_ITEM_DROP_COUNT] = { };
@@ -287,7 +297,7 @@ namespace WorldPackets
int32 SuggestedPartyMembers = 0;
QuestRewards Rewards;
std::vector<QuestDescEmote> Emotes;
- int32 QuestFlags[2] = { }; // Flags and FlagsEx
+ int32 QuestFlags[3] = { }; // Flags and FlagsEx
};
class QuestGiverOfferRewardMessage final : public ServerPacket
@@ -301,12 +311,14 @@ namespace WorldPackets
int32 PortraitGiver = 0;
int32 PortraitGiverMount = 0;
int32 PortraitGiverModelSceneID = 0;
+ int32 QuestGiverCreatureID = 0;
std::string QuestTitle;
std::string RewardText;
std::string PortraitGiverText;
std::string PortraitGiverName;
std::string PortraitTurnInText;
std::string PortraitTurnInName;
+ std::vector<ConditionalQuestText> ConditionalRewardText;
QuestGiverOfferReward QuestData;
int32 QuestPackageID = 0;
};
@@ -383,7 +395,7 @@ namespace WorldPackets
ObjectGuid InformUnit;
int32 QuestID = 0;
int32 QuestPackageID = 0;
- uint32 QuestFlags[2] = { };
+ uint32 QuestFlags[3] = { };
int32 SuggestedPartyMembers = 0;
QuestRewards Rewards;
std::vector<QuestObjectiveSimple> Objectives;
@@ -395,6 +407,7 @@ namespace WorldPackets
int32 PortraitGiverModelSceneID = 0;
int32 QuestStartItemID = 0;
int32 QuestSessionBonus = 0;
+ int32 QuestGiverCreatureID = 0;
std::string PortraitGiverText;
std::string PortraitGiverName;
std::string PortraitTurnInText;
@@ -402,6 +415,7 @@ namespace WorldPackets
std::string QuestTitle;
std::string LogDescription;
std::string DescriptionText;
+ std::vector<ConditionalQuestText> ConditionalDescriptionText;
bool DisplayPopup = false;
bool StartCheat = false;
bool AutoLaunched = false;
@@ -440,9 +454,10 @@ namespace WorldPackets
std::vector<QuestObjectiveCollect> Collect;
std::vector<QuestCurrency> Currency;
int32 StatusFlags = 0;
- uint32 QuestFlags[2] = { };
+ uint32 QuestFlags[3] = { };
std::string QuestTitle;
std::string CompletionText;
+ std::vector<ConditionalQuestText> ConditionalCompletionText;
};
class QuestGiverRequestReward final : public ClientPacket
diff --git a/src/server/game/Server/Packets/ReputationPackets.cpp b/src/server/game/Server/Packets/ReputationPackets.cpp
index 5029e785cc6..8896c2071c0 100644
--- a/src/server/game/Server/Packets/ReputationPackets.cpp
+++ b/src/server/game/Server/Packets/ReputationPackets.cpp
@@ -21,7 +21,7 @@ WorldPacket const* WorldPackets::Reputation::InitializeFactions::Write()
{
for (uint16 i = 0; i < FactionCount; ++i)
{
- _worldPacket << uint8(FactionFlags[i]);
+ _worldPacket << uint16(FactionFlags[i]);
_worldPacket << int32(FactionStandings[i]);
}
@@ -58,7 +58,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Reputation::FactionStandi
WorldPacket const* WorldPackets::Reputation::SetFactionStanding::Write()
{
- _worldPacket << float(ReferAFriendBonus);
_worldPacket << float(BonusFromAchievementSystem);
_worldPacket << uint32(Faction.size());
for (FactionStandingData const& factionStanding : Faction)
diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h
index b3eecced951..84fe8f001e8 100644
--- a/src/server/game/Server/Packets/ReputationPackets.h
+++ b/src/server/game/Server/Packets/ReputationPackets.h
@@ -25,23 +25,18 @@ namespace WorldPackets
{
namespace Reputation
{
- static uint16 const FactionCount = 400;
+ static constexpr uint16 FactionCount = 443;
class InitializeFactions final : public ServerPacket
{
public:
- InitializeFactions() : ServerPacket(SMSG_INITIALIZE_FACTIONS, FactionCount * (4 + 1) + FactionCount / 8)
- {
- FactionStandings.fill(0);
- FactionHasBonus.fill(false);
- FactionFlags.fill(0);
- }
+ InitializeFactions() : ServerPacket(SMSG_INITIALIZE_FACTIONS, FactionCount * (4 + 2) + FactionCount / 8) { }
WorldPacket const* Write() override;
- std::array<int32, FactionCount> FactionStandings;
- std::array<bool, FactionCount> FactionHasBonus; ///< @todo: implement faction bonus
- std::array<uint8, FactionCount> FactionFlags; ///< @see enum FactionFlags
+ std::array<int32, FactionCount> FactionStandings = { };
+ std::array<bool, FactionCount> FactionHasBonus = { }; ///< @todo: implement faction bonus
+ std::array<uint16, FactionCount> FactionFlags = { }; ///< @see enum FactionFlags
};
class RequestForcedReactions final : public ClientPacket
@@ -84,7 +79,6 @@ namespace WorldPackets
WorldPacket const* Write() override;
- float ReferAFriendBonus = 0.0f;
float BonusFromAchievementSystem = 0.0f;
std::vector<FactionStandingData> Faction;
bool ShowVisual = false;
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index ebf38bba3ad..84b5066863f 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -19,30 +19,32 @@
#include "CharacterPackets.h"
#include "SpellPackets.h"
-void WorldPackets::Spells::CancelAura::Read()
+namespace WorldPackets::Spells
+{
+void CancelAura::Read()
{
_worldPacket >> SpellID;
_worldPacket >> CasterGUID;
}
-void WorldPackets::Spells::CancelChannelling::Read()
+void CancelChannelling::Read()
{
_worldPacket >> ChannelSpell;
_worldPacket >> Reason;
}
-void WorldPackets::Spells::CancelModSpeedNoControlAuras::Read()
+void CancelModSpeedNoControlAuras::Read()
{
_worldPacket >> TargetGUID;
}
-void WorldPackets::Spells::PetCancelAura::Read()
+void PetCancelAura::Read()
{
_worldPacket >> PetGUID;
_worldPacket >> SpellID;
}
-WorldPacket const* WorldPackets::Spells::CategoryCooldown::Write()
+WorldPacket const* CategoryCooldown::Write()
{
_worldPacket.reserve(4 + 8 * CategoryCooldowns.size());
@@ -57,7 +59,7 @@ WorldPacket const* WorldPackets::Spells::CategoryCooldown::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SendKnownSpells::Write()
+WorldPacket const* SendKnownSpells::Write()
{
_worldPacket.reserve(1 + 4 * KnownSpells.size() + 4 * FavoriteSpells.size());
@@ -74,7 +76,7 @@ WorldPacket const* WorldPackets::Spells::SendKnownSpells::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::UpdateActionButtons::Write()
+WorldPacket const* UpdateActionButtons::Write()
{
_worldPacket.append(ActionButtons.data(), ActionButtons.size());
_worldPacket << Reason;
@@ -82,13 +84,13 @@ WorldPacket const* WorldPackets::Spells::UpdateActionButtons::Write()
return &_worldPacket;
}
-void WorldPackets::Spells::SetActionButton::Read()
+void SetActionButton::Read()
{
_worldPacket >> Action;
_worldPacket >> Index;
}
-WorldPacket const* WorldPackets::Spells::SendUnlearnSpells::Write()
+WorldPacket const* SendUnlearnSpells::Write()
{
_worldPacket << uint32(Spells.size());
for (uint32 spellId : Spells)
@@ -97,7 +99,7 @@ WorldPacket const* WorldPackets::Spells::SendUnlearnSpells::Write()
return &_worldPacket;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraDataInfo const& auraData)
+ByteBuffer& operator<<(ByteBuffer& data, AuraDataInfo const& auraData)
{
data << auraData.CastID;
data << int32(auraData.SpellID);
@@ -139,7 +141,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraDataInfo cons
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraInfo const& aura)
+ByteBuffer& operator<<(ByteBuffer& data, AuraInfo const& aura)
{
data << aura.Slot;
data.WriteBit(aura.AuraData.has_value());
@@ -151,7 +153,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::AuraInfo const& a
return data;
}
-WorldPacket const* WorldPackets::Spells::AuraUpdate::Write()
+WorldPacket const* AuraUpdate::Write()
{
_worldPacket.WriteBit(UpdateAll);
_worldPacket.WriteBits(Auras.size(), 9);
@@ -163,7 +165,7 @@ WorldPacket const* WorldPackets::Spells::AuraUpdate::Write()
return &_worldPacket;
}
-ByteBuffer& operator>>(ByteBuffer& buffer, Optional<WorldPackets::Spells::TargetLocation>& location)
+ByteBuffer& operator>>(ByteBuffer& buffer, Optional<TargetLocation>& location)
{
location.emplace();
buffer >> location->Transport;
@@ -173,11 +175,11 @@ ByteBuffer& operator>>(ByteBuffer& buffer, Optional<WorldPackets::Spells::Target
return buffer;
}
-ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellTargetData& targetData)
+ByteBuffer& operator>>(ByteBuffer& buffer, SpellTargetData& targetData)
{
buffer.ResetBitPos();
- targetData.Flags = buffer.ReadBits(26);
+ targetData.Flags = buffer.ReadBits(28);
bool hasSrcLocation = buffer.ReadBit();
bool hasDstLocation = buffer.ReadBit();
bool hasOrientation = buffer.ReadBit();
@@ -204,28 +206,32 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellTargetData
return buffer;
}
-ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::MissileTrajectoryRequest& trajectory)
+ByteBuffer& operator>>(ByteBuffer& buffer, MissileTrajectoryRequest& trajectory)
{
buffer >> trajectory.Pitch;
buffer >> trajectory.Speed;
return buffer;
}
-ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Spells::SpellOptionalReagent& optionalReagent)
+ByteBuffer& operator>>(ByteBuffer& data, SpellCraftingReagent& optionalReagent)
{
data >> optionalReagent.ItemID;
- data >> optionalReagent.Slot;
+ data >> optionalReagent.DataSlotIndex;
+ data >> optionalReagent.Quantity;
+ if (data.ReadBit())
+ optionalReagent.Unknown_1000 = data.read<uint8>();
+
return data;
}
-ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Spells::SpellExtraCurrencyCost& extraCurrencyCost)
+ByteBuffer& operator>>(ByteBuffer& data, SpellExtraCurrencyCost& extraCurrencyCost)
{
data >> extraCurrencyCost.CurrencyID;
data >> extraCurrencyCost.Count;
return data;
}
-ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastRequest& request)
+ByteBuffer& operator>>(ByteBuffer& buffer, SpellCastRequest& request)
{
buffer >> request.CastID;
buffer >> request.Misc[0];
@@ -234,27 +240,31 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastReques
buffer >> request.Visual;
buffer >> request.MissileTrajectory;
buffer >> request.CraftingNPC;
- request.OptionalReagents.resize(buffer.read<uint32>());
request.OptionalCurrencies.resize(buffer.read<uint32>());
+ request.OptionalReagents.resize(buffer.read<uint32>());
- for (WorldPackets::Spells::SpellOptionalReagent& optionalReagent : request.OptionalReagents)
- buffer >> optionalReagent;
-
- for (WorldPackets::Spells::SpellExtraCurrencyCost& optionalCurrency : request.OptionalCurrencies)
+ for (SpellExtraCurrencyCost& optionalCurrency : request.OptionalCurrencies)
buffer >> optionalCurrency;
request.SendCastFlags = buffer.ReadBits(5);
bool hasMoveUpdate = buffer.ReadBit();
request.Weight.resize(buffer.ReadBits(2));
+ bool hasCraftingOrderID = buffer.ReadBit();
buffer >> request.Target;
+ if (hasCraftingOrderID)
+ request.CraftingOrderID = buffer.read<uint64>();
+
+ for (SpellCraftingReagent& optionalReagent : request.OptionalReagents)
+ buffer >> optionalReagent;
+
if (hasMoveUpdate)
{
request.MoveUpdate.emplace();
buffer >> *request.MoveUpdate;
}
- for (WorldPackets::Spells::SpellWeight& weight : request.Weight)
+ for (SpellWeight& weight : request.Weight)
{
buffer.ResetBitPos();
weight.Type = buffer.ReadBits(2);
@@ -265,18 +275,18 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastReques
return buffer;
}
-void WorldPackets::Spells::CastSpell::Read()
+void CastSpell::Read()
{
_worldPacket >> Cast;
}
-void WorldPackets::Spells::PetCastSpell::Read()
+void PetCastSpell::Read()
{
_worldPacket >> PetGUID;
_worldPacket >> Cast;
}
-void WorldPackets::Spells::UseItem::Read()
+void UseItem::Read()
{
_worldPacket >> PackSlot;
_worldPacket >> Slot;
@@ -284,7 +294,7 @@ void WorldPackets::Spells::UseItem::Read()
_worldPacket >> Cast;
}
-WorldPacket const* WorldPackets::Spells::SpellPrepare::Write()
+WorldPacket const* SpellPrepare::Write()
{
_worldPacket << ClientCastID;
_worldPacket << ServerCastID;
@@ -292,7 +302,7 @@ WorldPacket const* WorldPackets::Spells::SpellPrepare::Write()
return &_worldPacket;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation const& targetLocation)
+ByteBuffer& operator<<(ByteBuffer& data, TargetLocation const& targetLocation)
{
data << targetLocation.Transport;
data << float(targetLocation.Location.m_positionX);
@@ -301,9 +311,9 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation co
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData const& spellTargetData)
+ByteBuffer& operator<<(ByteBuffer& data, SpellTargetData const& spellTargetData)
{
- data.WriteBits(spellTargetData.Flags, 26);
+ data.WriteBits(spellTargetData.Flags, 28);
data.WriteBit(spellTargetData.SrcLocation.has_value());
data.WriteBit(spellTargetData.DstLocation.has_value());
data.WriteBit(spellTargetData.Orientation.has_value());
@@ -331,7 +341,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData c
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus const& spellMissStatus)
+ByteBuffer& operator<<(ByteBuffer& data, SpellMissStatus const& spellMissStatus)
{
data.WriteBits(spellMissStatus.Reason, 4);
if (spellMissStatus.Reason == SPELL_MISS_REFLECT)
@@ -341,20 +351,20 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus c
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHitStatus const& spellHitStatus)
+ByteBuffer& operator<<(ByteBuffer& data, SpellHitStatus const& spellHitStatus)
{
data << uint8(spellHitStatus.Reason);
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellPowerData const& spellPowerData)
+ByteBuffer& operator<<(ByteBuffer& data, SpellPowerData const& spellPowerData)
{
data << int32(spellPowerData.Cost);
data << int8(spellPowerData.Type);
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::RuneData const& runeData)
+ByteBuffer& operator<<(ByteBuffer& data, RuneData const& runeData)
{
data << uint8(runeData.Start);
data << uint8(runeData.Count);
@@ -365,28 +375,28 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::RuneData const& r
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::MissileTrajectoryResult const& missileTrajectory)
+ByteBuffer& operator<<(ByteBuffer& data, MissileTrajectoryResult const& missileTrajectory)
{
data << uint32(missileTrajectory.TravelTime);
data << float(missileTrajectory.Pitch);
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellAmmo const& spellAmmo)
+ByteBuffer& operator<<(ByteBuffer& data, SpellAmmo const& spellAmmo)
{
data << int32(spellAmmo.DisplayID);
data << int8(spellAmmo.InventoryType);
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::CreatureImmunities const& immunities)
+ByteBuffer& operator<<(ByteBuffer& data, CreatureImmunities const& immunities)
{
data << int32(immunities.School);
data << int32(immunities.Value);
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHealPrediction const& spellPred)
+ByteBuffer& operator<<(ByteBuffer& data, SpellHealPrediction const& spellPred)
{
data << int32(spellPred.Points);
data << uint8(spellPred.Type);
@@ -394,7 +404,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHealPredicti
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData const& spellCastData)
+ByteBuffer& operator<<(ByteBuffer& data, SpellCastData const& spellCastData)
{
data << spellCastData.CasterGUID;
data << spellCastData.CasterUnit;
@@ -419,7 +429,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con
data.WriteBits(spellCastData.TargetPoints.size(), 16);
data.FlushBits();
- for (WorldPackets::Spells::SpellMissStatus const& missStatus : spellCastData.MissStatus)
+ for (SpellMissStatus const& missStatus : spellCastData.MissStatus)
data << missStatus;
data << spellCastData.Target;
@@ -430,29 +440,29 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con
for (ObjectGuid const& missTarget : spellCastData.MissTargets)
data << missTarget;
- for (WorldPackets::Spells::SpellHitStatus const& hitStatus : spellCastData.HitStatus)
+ for (SpellHitStatus const& hitStatus : spellCastData.HitStatus)
data << hitStatus;
- for (WorldPackets::Spells::SpellPowerData const& power : spellCastData.RemainingPower)
+ for (SpellPowerData const& power : spellCastData.RemainingPower)
data << power;
if (spellCastData.RemainingRunes)
data << *spellCastData.RemainingRunes;
- for (WorldPackets::Spells::TargetLocation const& targetLoc : spellCastData.TargetPoints)
+ for (TargetLocation const& targetLoc : spellCastData.TargetPoints)
data << targetLoc;
return data;
}
-WorldPacket const* WorldPackets::Spells::SpellStart::Write()
+WorldPacket const* SpellStart::Write()
{
_worldPacket << Cast;
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SpellGo::Write()
+WorldPacket const* SpellGo::Write()
{
*this << Cast;
@@ -464,42 +474,51 @@ WorldPacket const* WorldPackets::Spells::SpellGo::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::LearnedSpells::Write()
+ByteBuffer& operator<<(ByteBuffer& data, LearnedSpellInfo const& learnedSpellInfo)
{
- _worldPacket << uint32(SpellID.size());
- _worldPacket << uint32(FavoriteSpellID.size());
- _worldPacket << uint32(SpecializationID);
- for (int32 spell : SpellID)
- _worldPacket << spell;
+ data << int32(learnedSpellInfo.SpellID);
+ data.WriteBit(learnedSpellInfo.IsFavorite);
+ data.WriteBit(learnedSpellInfo.field_8.has_value());
+ data.WriteBit(learnedSpellInfo.Superceded.has_value());
+ data.WriteBit(learnedSpellInfo.TraitDefinitionID.has_value());
+ data.FlushBits();
- for (int32 spell : FavoriteSpellID)
- _worldPacket << spell;
+ if (learnedSpellInfo.field_8)
+ data << int32(*learnedSpellInfo.field_8);
+
+ if (learnedSpellInfo.Superceded)
+ data << int32(*learnedSpellInfo.Superceded);
+ if (learnedSpellInfo.TraitDefinitionID)
+ data << int32(*learnedSpellInfo.TraitDefinitionID);
+
+ return data;
+}
+
+WorldPacket const* LearnedSpells::Write()
+{
+ _worldPacket << uint32(ClientLearnedSpellData.size());
+ _worldPacket << uint32(SpecializationID);
_worldPacket.WriteBit(SuppressMessaging);
_worldPacket.FlushBits();
+ for (LearnedSpellInfo const& spell : ClientLearnedSpellData)
+ _worldPacket << spell;
+
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SupercededSpells::Write()
+WorldPacket const* SupercededSpells::Write()
{
- _worldPacket << uint32(SpellID.size());
- _worldPacket << uint32(Superceded.size());
- _worldPacket << uint32(FavoriteSpellID.size());
-
- if (!SpellID.empty())
- _worldPacket.append(SpellID.data(), SpellID.size());
+ _worldPacket << uint32(ClientLearnedSpellData.size());
- if (!Superceded.empty())
- _worldPacket.append(Superceded.data(), Superceded.size());
-
- if (!FavoriteSpellID.empty())
- _worldPacket.append(FavoriteSpellID.data(), FavoriteSpellID.size());
+ for (LearnedSpellInfo const& spell : ClientLearnedSpellData)
+ _worldPacket << spell;
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SpellFailure::Write()
+WorldPacket const* SpellFailure::Write()
{
_worldPacket << CasterUnit;
_worldPacket << CastID;
@@ -510,7 +529,7 @@ WorldPacket const* WorldPackets::Spells::SpellFailure::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SpellFailedOther::Write()
+WorldPacket const* SpellFailedOther::Write()
{
_worldPacket << CasterUnit;
_worldPacket << CastID;
@@ -521,7 +540,7 @@ WorldPacket const* WorldPackets::Spells::SpellFailedOther::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::CastFailed::Write()
+WorldPacket const* CastFailed::Write()
{
_worldPacket << CastID;
_worldPacket << int32(SpellID);
@@ -533,7 +552,7 @@ WorldPacket const* WorldPackets::Spells::CastFailed::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::PetCastFailed::Write()
+WorldPacket const* PetCastFailed::Write()
{
_worldPacket << CastID;
_worldPacket << int32(SpellID);
@@ -544,7 +563,7 @@ WorldPacket const* WorldPackets::Spells::PetCastFailed::Write()
return &_worldPacket;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifierData const& spellModifierData)
+ByteBuffer& operator<<(ByteBuffer& data, SpellModifierData const& spellModifierData)
{
data << float(spellModifierData.ModifierValue);
data << uint8(spellModifierData.ClassIndex);
@@ -552,26 +571,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifierData
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellModifier const& spellModifier)
+ByteBuffer& operator<<(ByteBuffer& data, SpellModifier const& spellModifier)
{
data << uint8(spellModifier.ModIndex);
data << uint32(spellModifier.ModifierData.size());
- for (WorldPackets::Spells::SpellModifierData const& modData : spellModifier.ModifierData)
+ for (SpellModifierData const& modData : spellModifier.ModifierData)
data << modData;
return data;
}
-WorldPacket const* WorldPackets::Spells::SetSpellModifier::Write()
+WorldPacket const* SetSpellModifier::Write()
{
_worldPacket << uint32(Modifiers.size());
- for (WorldPackets::Spells::SpellModifier const& spellMod : Modifiers)
+ for (SpellModifier const& spellMod : Modifiers)
_worldPacket << spellMod;
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::UnlearnedSpells::Write()
+WorldPacket const* UnlearnedSpells::Write()
{
_worldPacket << uint32(SpellID.size());
for (uint32 spellId : SpellID)
@@ -583,7 +602,7 @@ WorldPacket const* WorldPackets::Spells::UnlearnedSpells::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::CooldownEvent::Write()
+WorldPacket const* CooldownEvent::Write()
{
_worldPacket << int32(SpellID);
_worldPacket.WriteBit(IsPet);
@@ -592,7 +611,7 @@ WorldPacket const* WorldPackets::Spells::CooldownEvent::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::ClearCooldowns::Write()
+WorldPacket const* ClearCooldowns::Write()
{
_worldPacket << uint32(SpellID.size());
if (!SpellID.empty())
@@ -604,7 +623,7 @@ WorldPacket const* WorldPackets::Spells::ClearCooldowns::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::ClearCooldown::Write()
+WorldPacket const* ClearCooldown::Write()
{
_worldPacket << uint32(SpellID);
_worldPacket.WriteBit(ClearOnHold);
@@ -614,7 +633,7 @@ WorldPacket const* WorldPackets::Spells::ClearCooldown::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::ModifyCooldown::Write()
+WorldPacket const* ModifyCooldown::Write()
{
_worldPacket << int32(SpellID);
_worldPacket << int32(DeltaTime);
@@ -625,7 +644,7 @@ WorldPacket const* WorldPackets::Spells::ModifyCooldown::Write()
return &_worldPacket;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCooldownStruct const& cooldown)
+ByteBuffer& operator<<(ByteBuffer& data, SpellCooldownStruct const& cooldown)
{
data << uint32(cooldown.SrecID);
data << uint32(cooldown.ForcedCooldown);
@@ -633,7 +652,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCooldownStru
return data;
}
-WorldPacket const* WorldPackets::Spells::SpellCooldown::Write()
+WorldPacket const* SpellCooldown::Write()
{
_worldPacket << Caster;
_worldPacket << uint8(Flags);
@@ -644,7 +663,7 @@ WorldPacket const* WorldPackets::Spells::SpellCooldown::Write()
return &_worldPacket;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHistoryEntry const& historyEntry)
+ByteBuffer& operator<<(ByteBuffer& data, SpellHistoryEntry const& historyEntry)
{
data << uint32(historyEntry.SpellID);
data << uint32(historyEntry.ItemID);
@@ -664,7 +683,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHistoryEntry
return data;
}
-WorldPacket const* WorldPackets::Spells::SendSpellHistory::Write()
+WorldPacket const* SendSpellHistory::Write()
{
_worldPacket << uint32(Entries.size());
for (SpellHistoryEntry const& historyEntry : Entries)
@@ -673,7 +692,7 @@ WorldPacket const* WorldPackets::Spells::SendSpellHistory::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::ClearAllSpellCharges::Write()
+WorldPacket const* ClearAllSpellCharges::Write()
{
_worldPacket.WriteBit(IsPet);
_worldPacket.FlushBits();
@@ -681,7 +700,7 @@ WorldPacket const* WorldPackets::Spells::ClearAllSpellCharges::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::ClearSpellCharges::Write()
+WorldPacket const* ClearSpellCharges::Write()
{
_worldPacket << int32(Category);
_worldPacket.WriteBit(IsPet);
@@ -690,7 +709,7 @@ WorldPacket const* WorldPackets::Spells::ClearSpellCharges::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SetSpellCharges::Write()
+WorldPacket const* SetSpellCharges::Write()
{
_worldPacket << int32(Category);
_worldPacket << uint32(NextRecoveryTime);
@@ -702,7 +721,7 @@ WorldPacket const* WorldPackets::Spells::SetSpellCharges::Write()
return &_worldPacket;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellChargeEntry const& chargeEntry)
+ByteBuffer& operator<<(ByteBuffer& data, SpellChargeEntry const& chargeEntry)
{
data << uint32(chargeEntry.Category);
data << uint32(chargeEntry.NextRecoveryTime);
@@ -711,7 +730,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellChargeEntry
return data;
}
-WorldPacket const* WorldPackets::Spells::SendSpellCharges::Write()
+WorldPacket const* SendSpellCharges::Write()
{
_worldPacket << uint32(Entries.size());
for (SpellChargeEntry const& chargeEntry : Entries)
@@ -720,21 +739,21 @@ WorldPacket const* WorldPackets::Spells::SendSpellCharges::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::ClearTarget::Write()
+WorldPacket const* ClearTarget::Write()
{
_worldPacket << Guid;
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::CancelOrphanSpellVisual::Write()
+WorldPacket const* CancelOrphanSpellVisual::Write()
{
_worldPacket << int32(SpellVisualID);
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::CancelSpellVisual::Write()
+WorldPacket const* CancelSpellVisual::Write()
{
_worldPacket << Source;
_worldPacket << int32(SpellVisualID);
@@ -742,7 +761,7 @@ WorldPacket const* WorldPackets::Spells::CancelSpellVisual::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::CancelSpellVisualKit::Write()
+WorldPacket const* CancelSpellVisualKit::Write()
{
_worldPacket << Source;
_worldPacket << int32(SpellVisualKitID);
@@ -752,7 +771,7 @@ WorldPacket const* WorldPackets::Spells::CancelSpellVisualKit::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::PlayOrphanSpellVisual::Write()
+WorldPacket const* PlayOrphanSpellVisual::Write()
{
_worldPacket << SourceLocation;
_worldPacket << SourceRotation;
@@ -768,7 +787,7 @@ WorldPacket const* WorldPackets::Spells::PlayOrphanSpellVisual::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::PlaySpellVisual::Write()
+WorldPacket const* PlaySpellVisual::Write()
{
_worldPacket << Source;
_worldPacket << Target;
@@ -787,7 +806,7 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisual::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::PlaySpellVisualKit::Write()
+WorldPacket const* PlaySpellVisualKit::Write()
{
_worldPacket << Unit;
_worldPacket << int32(KitRecID);
@@ -799,7 +818,7 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisualKit::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SpellVisualLoadScreen::Write()
+WorldPacket const* SpellVisualLoadScreen::Write()
{
_worldPacket << int32(SpellVisualKitID);
_worldPacket << int32(Delay);
@@ -807,33 +826,33 @@ WorldPacket const* WorldPackets::Spells::SpellVisualLoadScreen::Write()
return &_worldPacket;
}
-void WorldPackets::Spells::CancelCast::Read()
+void CancelCast::Read()
{
_worldPacket >> CastID;
_worldPacket >> SpellID;
}
-void WorldPackets::Spells::OpenItem::Read()
+void OpenItem::Read()
{
_worldPacket >> Slot
>> PackSlot;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellChannelStartInterruptImmunities const& interruptImmunities)
+ByteBuffer& operator<<(ByteBuffer& data, SpellChannelStartInterruptImmunities const& interruptImmunities)
{
data << int32(interruptImmunities.SchoolImmunities);
data << int32(interruptImmunities.Immunities);
return data;
}
-ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetedHealPrediction const& targetedHealPrediction)
+ByteBuffer& operator<<(ByteBuffer& data, SpellTargetedHealPrediction const& targetedHealPrediction)
{
data << targetedHealPrediction.TargetGUID;
data << targetedHealPrediction.Predict;
return data;
}
-WorldPacket const* WorldPackets::Spells::SpellChannelStart::Write()
+WorldPacket const* SpellChannelStart::Write()
{
_worldPacket << CasterGUID;
_worldPacket << int32(SpellID);
@@ -852,14 +871,14 @@ WorldPacket const* WorldPackets::Spells::SpellChannelStart::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::SpellChannelUpdate::Write()
+WorldPacket const* SpellChannelUpdate::Write()
{
_worldPacket << CasterGUID;
_worldPacket << int32(TimeRemaining);
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::ResurrectRequest::Write()
+WorldPacket const* ResurrectRequest::Write()
{
_worldPacket << ResurrectOffererGUID;
_worldPacket << uint32(ResurrectOffererVirtualRealmAddress);
@@ -875,30 +894,30 @@ WorldPacket const* WorldPackets::Spells::ResurrectRequest::Write()
return &_worldPacket;
}
-void WorldPackets::Spells::UnlearnSkill::Read()
+void UnlearnSkill::Read()
{
_worldPacket >> SkillLine;
}
-void WorldPackets::Spells::SelfRes::Read()
+void SelfRes::Read()
{
_worldPacket >> SpellID;
}
-void WorldPackets::Spells::GetMirrorImageData::Read()
+void GetMirrorImageData::Read()
{
_worldPacket >> UnitGUID;
_worldPacket >> DisplayID;
}
-WorldPackets::Spells::MirrorImageComponentedData::MirrorImageComponentedData()
+MirrorImageComponentedData::MirrorImageComponentedData()
: ServerPacket(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, 8 + 4 + 8 * 1 + 8 + 11 * 4)
{
}
-WorldPackets::Spells::MirrorImageComponentedData::~MirrorImageComponentedData() = default;
+MirrorImageComponentedData::~MirrorImageComponentedData() = default;
-WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write()
+WorldPacket const* MirrorImageComponentedData::Write()
{
_worldPacket << UnitGUID;
_worldPacket << int32(DisplayID);
@@ -919,7 +938,7 @@ WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write()
+WorldPacket const* MirrorImageCreatureData::Write()
{
_worldPacket << UnitGUID;
_worldPacket << int32(DisplayID);
@@ -928,27 +947,28 @@ WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write()
return &_worldPacket;
}
-void WorldPackets::Spells::SpellClick::Read()
+void SpellClick::Read()
{
_worldPacket >> SpellClickUnitGuid;
TryAutoDismount = _worldPacket.ReadBit();
+ IsSoftInteract = _worldPacket.ReadBit();
}
-WorldPacket const* WorldPackets::Spells::ResyncRunes::Write()
+WorldPacket const* ResyncRunes::Write()
{
_worldPacket << Runes;
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::AddRunePower::Write()
+WorldPacket const* AddRunePower::Write()
{
_worldPacket << uint32(AddedRunesMask);
return &_worldPacket;
}
-void WorldPackets::Spells::MissileTrajectoryCollision::Read()
+void MissileTrajectoryCollision::Read()
{
_worldPacket >> Target;
_worldPacket >> SpellID;
@@ -956,7 +976,7 @@ void WorldPackets::Spells::MissileTrajectoryCollision::Read()
_worldPacket >> CollisionPos;
}
-WorldPacket const* WorldPackets::Spells::NotifyMissileTrajectoryCollision::Write()
+WorldPacket const* NotifyMissileTrajectoryCollision::Write()
{
_worldPacket << Caster;
_worldPacket << CastID;
@@ -965,7 +985,7 @@ WorldPacket const* WorldPackets::Spells::NotifyMissileTrajectoryCollision::Write
return &_worldPacket;
}
-void WorldPackets::Spells::UpdateMissileTrajectory::Read()
+void UpdateMissileTrajectory::Read()
{
_worldPacket >> Guid;
_worldPacket >> CastID;
@@ -985,7 +1005,7 @@ void WorldPackets::Spells::UpdateMissileTrajectory::Read()
}
}
-WorldPacket const* WorldPackets::Spells::SpellDelayed::Write()
+WorldPacket const* SpellDelayed::Write()
{
_worldPacket << Caster;
_worldPacket << uint32(ActualDelay);
@@ -993,7 +1013,7 @@ WorldPacket const* WorldPackets::Spells::SpellDelayed::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::DispelFailed::Write()
+WorldPacket const* DispelFailed::Write()
{
_worldPacket << CasterGUID;
_worldPacket << VictimGUID;
@@ -1005,21 +1025,21 @@ WorldPacket const* WorldPackets::Spells::DispelFailed::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::CustomLoadScreen::Write()
+WorldPacket const* CustomLoadScreen::Write()
{
_worldPacket << uint32(TeleportSpellID);
_worldPacket << uint32(LoadingScreenID);
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::MountResult::Write()
+WorldPacket const* MountResult::Write()
{
_worldPacket << int32(Result);
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Spells::MissileCancel::Write()
+WorldPacket const* MissileCancel::Write()
{
_worldPacket << OwnerGUID;
_worldPacket << int32(SpellID);
@@ -1028,3 +1048,4 @@ WorldPacket const* WorldPackets::Spells::MissileCancel::Write()
return &_worldPacket;
}
+}
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index b5c1bc3edbd..4d2380a964f 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -62,8 +62,8 @@ namespace WorldPackets
void Read() override;
int32 ChannelSpell = 0;
- int32 Reason = 0; // 40 = /run SpellStopCasting(), 16 = movement/SpellAuraInterruptFlags::Moving, 41 = turning/SpellAuraInterruptFlags::Turning
- // does not match SpellCastResult enum
+ int32 Reason = 0; // 40 = /run SpellStopCasting(), 16 = movement/SpellAuraInterruptFlags::Moving, 41 = turning/SpellAuraInterruptFlags::Turning
+ // does not match SpellCastResult enum
};
class CancelGrowthAura final : public ClientPacket
@@ -139,22 +139,19 @@ namespace WorldPackets
bool InitialLogin = false;
std::vector<uint32> KnownSpells;
- std::vector<uint32> FavoriteSpells; // tradeskill recipes
+ std::vector<uint32> FavoriteSpells; // tradeskill recipes
};
class UpdateActionButtons final : public ServerPacket
{
public:
- static std::size_t constexpr NumActionButtons = 132;
+ static std::size_t constexpr NumActionButtons = 180;
- UpdateActionButtons() : ServerPacket(SMSG_UPDATE_ACTION_BUTTONS, NumActionButtons * 8 + 1)
- {
- ActionButtons.fill(0);
- }
+ UpdateActionButtons() : ServerPacket(SMSG_UPDATE_ACTION_BUTTONS, NumActionButtons * 8 + 1) { }
WorldPacket const* Write() override;
- std::array<uint64, NumActionButtons> ActionButtons;
+ std::array<uint64, NumActionButtons> ActionButtons = { };
uint8 Reason = 0;
/*
Reason can be 0, 1, 2
@@ -253,10 +250,12 @@ namespace WorldPackets
uint32 Quantity = 0;
};
- struct SpellOptionalReagent
+ struct SpellCraftingReagent
{
int32 ItemID = 0;
- int32 Slot = 0;
+ int32 DataSlotIndex = 0;
+ int32 Quantity = 0;
+ Optional<uint8> Unknown_1000;
};
struct SpellExtraCurrencyCost
@@ -275,8 +274,9 @@ namespace WorldPackets
MissileTrajectoryRequest MissileTrajectory;
Optional<MovementInfo> MoveUpdate;
std::vector<SpellWeight> Weight;
- Array<SpellOptionalReagent, 3> OptionalReagents;
+ Array<SpellCraftingReagent, 3> OptionalReagents;
Array<SpellExtraCurrencyCost, 5 /*MAX_ITEM_EXT_COST_CURRENCIES*/> OptionalCurrencies;
+ Optional<uint64> CraftingOrderID;
ObjectGuid CraftingNPC;
int32 Misc[2] = { };
};
@@ -331,7 +331,7 @@ namespace WorldPackets
SpellHitStatus() { }
SpellHitStatus(uint8 reason) : Reason(reason) { }
- uint8 Reason;
+ uint8 Reason = 0;
};
struct SpellMissStatus
@@ -427,6 +427,15 @@ namespace WorldPackets
SpellCastData Cast;
};
+ struct LearnedSpellInfo
+ {
+ int32 SpellID = 0;
+ bool IsFavorite = false;
+ Optional<int32> field_8;
+ Optional<int32> Superceded;
+ Optional<int32> TraitDefinitionID;
+ };
+
class LearnedSpells final : public ServerPacket
{
public:
@@ -434,8 +443,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
- std::vector<int32> SpellID;
- std::vector<int32> FavoriteSpellID;
+ std::vector<LearnedSpellInfo> ClientLearnedSpellData;
uint32 SpecializationID = 0;
bool SuppressMessaging = false;
};
@@ -447,9 +455,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
- std::vector<int32> SpellID;
- std::vector<int32> Superceded;
- std::vector<int32> FavoriteSpellID;
+ std::vector<LearnedSpellInfo> ClientLearnedSpellData;
};
class SpellFailure final : public ServerPacket
@@ -551,7 +557,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
bool IsPet = false;
- int32 SpellID;
+ int32 SpellID = 0;
};
class ClearCooldowns final : public ServerPacket
@@ -621,8 +627,8 @@ namespace WorldPackets
int32 CategoryRecoveryTime = 0;
float ModRate = 1.0f;
bool OnHold = false;
- Optional<uint32> unused622_1; ///< This field is not used for anything in the client in 6.2.2.20444
- Optional<uint32> unused622_2; ///< This field is not used for anything in the client in 6.2.2.20444
+ Optional<uint32> unused622_1; ///< This field is not used for anything in the client in 6.2.2.20444
+ Optional<uint32> unused622_2; ///< This field is not used for anything in the client in 6.2.2.20444
};
class SendSpellHistory final : public ServerPacket
@@ -758,7 +764,7 @@ namespace WorldPackets
ObjectGuid Source;
ObjectGuid Target;
- ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0
+ ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0
TaggedPosition<Position::XYZ> TargetPosition; // Overrides missile destination for SpellVisual::SpellVisualMissileSetID
uint32 SpellVisualID = 0;
float TravelSpeed = 0.0f;
@@ -944,6 +950,7 @@ namespace WorldPackets
ObjectGuid SpellClickUnitGuid;
bool TryAutoDismount = false;
+ bool IsSoftInteract = false;
};
class ResyncRunes final : public ServerPacket
@@ -1065,9 +1072,9 @@ namespace WorldPackets
bool Reverse = false;
int32 SpellID = 0;
};
+
+ ByteBuffer& operator>>(ByteBuffer& buffer, SpellCastRequest& request);
}
}
-ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastRequest& request);
-
#endif // SpellPackets_h__
diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp
index 5f6304d4bee..18ad36f7cbb 100644
--- a/src/server/game/Server/Packets/SystemPackets.cpp
+++ b/src/server/game/Server/Packets/SystemPackets.cpp
@@ -18,9 +18,7 @@
#include "SystemPackets.h"
#include "Errors.h"
-namespace WorldPackets
-{
-namespace System
+namespace WorldPackets::System
{
ByteBuffer& operator<<(ByteBuffer& data, SavedThrottleObjectState const& throttleState)
{
@@ -82,6 +80,7 @@ WorldPacket const* FeatureSystemStatus::Write()
_worldPacket << int16(MaxPlayerNameQueriesPerPacket);
_worldPacket << int16(PlayerNameQueryTelemetryInterval);
+ _worldPacket << PlayerNameQueryInterval;
for (GameRuleValuePair const& gameRuleValue : GameRuleValues)
_worldPacket << gameRuleValue;
@@ -94,6 +93,7 @@ WorldPacket const* FeatureSystemStatus::Write()
_worldPacket.WriteBit(BpayStoreDisabledByParentalControls);
_worldPacket.WriteBit(ItemRestorationButtonEnabled);
_worldPacket.WriteBit(BrowserEnabled);
+
_worldPacket.WriteBit(SessionAlert.has_value());
_worldPacket.WriteBit(RAFSystem.Enabled);
_worldPacket.WriteBit(RAFSystem.RecruitingEnabled);
@@ -102,6 +102,7 @@ WorldPacket const* FeatureSystemStatus::Write()
_worldPacket.WriteBit(CommerceSystemEnabled);
_worldPacket.WriteBit(TutorialsEnabled);
_worldPacket.WriteBit(TwitterEnabled);
+
_worldPacket.WriteBit(Unk67);
_worldPacket.WriteBit(WillKickFromWorld);
_worldPacket.WriteBit(KioskModeEnabled);
@@ -110,6 +111,7 @@ WorldPacket const* FeatureSystemStatus::Write()
_worldPacket.WriteBit(WarModeFeatureEnabled);
_worldPacket.WriteBit(ClubsEnabled);
_worldPacket.WriteBit(ClubsBattleNetClubTypeAllowed);
+
_worldPacket.WriteBit(ClubsCharacterClubTypeAllowed);
_worldPacket.WriteBit(ClubsPresenceUpdateEnabled);
_worldPacket.WriteBit(VoiceChatDisabledByParentalControl);
@@ -118,10 +120,13 @@ WorldPacket const* FeatureSystemStatus::Write()
_worldPacket.WriteBit(IsMuted);
_worldPacket.WriteBit(ClubFinderEnabled);
_worldPacket.WriteBit(Unknown901CheckoutRelated);
+
_worldPacket.WriteBit(TextToSpeechFeatureEnabled);
_worldPacket.WriteBit(ChatDisabledByDefault);
_worldPacket.WriteBit(ChatDisabledByPlayer);
_worldPacket.WriteBit(LFGListCustomRequiresAuthenticator);
+ _worldPacket.WriteBit(AddonsDisabled);
+ _worldPacket.WriteBit(Unused1000);
_worldPacket.FlushBits();
@@ -180,6 +185,7 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write()
_worldPacket.WriteBit(Unk14);
_worldPacket.WriteBit(WillKickFromWorld);
_worldPacket.WriteBit(IsExpansionPreorderInStore);
+
_worldPacket.WriteBit(KioskModeEnabled);
_worldPacket.WriteBit(CompetitiveModeEnabled);
_worldPacket.WriteBit(TrialBoostEnabled);
@@ -188,9 +194,12 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write()
_worldPacket.WriteBit(LiveRegionCharacterCopyEnabled);
_worldPacket.WriteBit(LiveRegionAccountCopyEnabled);
_worldPacket.WriteBit(LiveRegionKeyBindingsCopyEnabled);
+
_worldPacket.WriteBit(Unknown901CheckoutRelated);
_worldPacket.WriteBit(EuropaTicketSystemStatus.has_value());
_worldPacket.WriteBit(LaunchETA.has_value());
+ _worldPacket.WriteBit(AddonsDisabled);
+ _worldPacket.WriteBit(Unused1000);
_worldPacket.FlushBits();
if (EuropaTicketSystemStatus)
@@ -210,6 +219,7 @@ WorldPacket const* FeatureSystemStatusGlueScreen::Write()
_worldPacket << uint32(GameRuleValues.size());
_worldPacket << int16(MaxPlayerNameQueriesPerPacket);
_worldPacket << int16(PlayerNameQueryTelemetryInterval);
+ _worldPacket << PlayerNameQueryInterval;
if (LaunchETA)
_worldPacket << int32(*LaunchETA);
@@ -243,12 +253,13 @@ WorldPacket const* SetTimeZoneInformation::Write()
{
_worldPacket.WriteBits(ServerTimeTZ.length(), 7);
_worldPacket.WriteBits(GameTimeTZ.length(), 7);
+ _worldPacket.WriteBits(ServerRegionalTZ.length(), 7);
_worldPacket.FlushBits();
_worldPacket.WriteString(ServerTimeTZ);
_worldPacket.WriteString(GameTimeTZ);
+ _worldPacket.WriteString(ServerRegionalTZ);
return &_worldPacket;
}
}
-}
diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h
index f6a3d37c133..2091940632f 100644
--- a/src/server/game/Server/Packets/SystemPackets.h
+++ b/src/server/game/Server/Packets/SystemPackets.h
@@ -21,6 +21,7 @@
#include "Packet.h"
#include "ObjectGuid.h"
#include "Optional.h"
+#include "PacketUtilities.h"
namespace WorldPackets
{
@@ -131,6 +132,7 @@ namespace WorldPackets
int32 ActiveSeason = 0; ///< Currently active Classic season
int16 MaxPlayerNameQueriesPerPacket = 50;
int16 PlayerNameQueryTelemetryInterval = 600;
+ Duration<Seconds, uint32> PlayerNameQueryInterval = 10s;
bool ItemRestorationButtonEnabled = false;
bool CharUndeleteEnabled = false; ///< Implemented
bool BpayStoreDisabledByParentalControls = false;
@@ -159,6 +161,8 @@ namespace WorldPackets
bool ChatDisabledByDefault = false;
bool ChatDisabledByPlayer = false;
bool LFGListCustomRequiresAuthenticator = false;
+ bool AddonsDisabled = false;
+ bool Unused1000 = false;
SocialQueueConfig QuickJoinConfig;
SquelchInfo Squelch;
@@ -190,6 +194,8 @@ namespace WorldPackets
bool LiveRegionAccountCopyEnabled = false; // NYI
bool LiveRegionKeyBindingsCopyEnabled = false;
bool Unknown901CheckoutRelated = false; // NYI
+ bool AddonsDisabled = false;
+ bool Unused1000 = false;
Optional<EuropaTicketConfig> EuropaTicketSystemStatus;
std::vector<int32> LiveRegionCharacterCopySourceRegions;
uint32 TokenPollTimeSeconds = 0; // NYI
@@ -205,6 +211,7 @@ namespace WorldPackets
std::vector<GameRuleValuePair> GameRuleValues;
int16 MaxPlayerNameQueriesPerPacket = 50;
int16 PlayerNameQueryTelemetryInterval = 600;
+ Duration<Seconds, uint32> PlayerNameQueryInterval = 10s;
Optional<int32> LaunchETA;
};
@@ -227,6 +234,7 @@ namespace WorldPackets
std::string ServerTimeTZ;
std::string GameTimeTZ;
+ std::string ServerRegionalTZ;
};
}
}
diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.cpp b/src/server/game/Server/Packets/TraitPacketsCommon.cpp
new file mode 100644
index 00000000000..482f3b5e91d
--- /dev/null
+++ b/src/server/game/Server/Packets/TraitPacketsCommon.cpp
@@ -0,0 +1,65 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "TraitPacketsCommon.h"
+#include "DBCEnums.h"
+
+namespace WorldPackets::Traits
+{
+ByteBuffer& operator<<(ByteBuffer& data, TraitEntry const& traitEntry)
+{
+ data << int32(traitEntry.TraitNodeID);
+ data << int32(traitEntry.TraitNodeEntryID);
+ data << int32(traitEntry.Rank);
+ data << int32(traitEntry.GrantedRanks);
+
+ return data;
+}
+
+ByteBuffer& operator<<(ByteBuffer& data, TraitConfig const& traitConfig)
+{
+ data << int32(traitConfig.ID);
+ data << int32(traitConfig.Type);
+ data << uint32(traitConfig.Entries.size());
+ switch (traitConfig.Type)
+ {
+ case TraitConfigType::Combat:
+ data << int32(traitConfig.ChrSpecializationID);
+ data << int32(traitConfig.CombatConfigFlags);
+ data << int32(traitConfig.LocalIdentifier);
+ break;
+ case TraitConfigType::Profession:
+ data << int32(traitConfig.SkillLineID);
+ break;
+ case TraitConfigType::Generic:
+ data << int32(traitConfig.TraitSystemID);
+ break;
+ default:
+ break;
+ }
+
+ for (TraitEntry const& traitEntry : traitConfig.Entries)
+ data << traitEntry;
+
+ data.WriteBits(traitConfig.Name.length(), 9);
+ data.FlushBits();
+
+ data.WriteString(static_cast<std::string const&>(traitConfig.Name));
+
+ return data;
+}
+}
diff --git a/src/server/game/Server/Packets/TraitPacketsCommon.h b/src/server/game/Server/Packets/TraitPacketsCommon.h
new file mode 100644
index 00000000000..d61e16ed49b
--- /dev/null
+++ b/src/server/game/Server/Packets/TraitPacketsCommon.h
@@ -0,0 +1,53 @@
+/*
+ * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2 of the License, or (at your
+ * option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef TRINITYCORE_TRAIT_PACKETS_COMMON_H
+#define TRINITYCORE_TRAIT_PACKETS_COMMON_H
+
+#include "PacketUtilities.h"
+
+enum class TraitCombatConfigFlags : int32;
+enum class TraitConfigType : int32;
+
+namespace WorldPackets::Traits
+{
+struct TraitEntry
+{
+ int32 TraitNodeID = 0;
+ int32 TraitNodeEntryID = 0;
+ int32 Rank = 0;
+ int32 GrantedRanks = 0;
+};
+
+struct TraitConfig
+{
+ int32 ID = 0;
+ TraitConfigType Type = {};
+ int32 ChrSpecializationID = 0;
+ TraitCombatConfigFlags CombatConfigFlags = {};
+ int32 LocalIdentifier = 0; // Local to specialization
+ int32 SkillLineID = 0;
+ int32 TraitSystemID = 0;
+ Array<TraitEntry, 100, std::vector<TraitEntry>> Entries;
+ String<259> Name;
+};
+
+ByteBuffer& operator<<(ByteBuffer& data, TraitEntry const& traitEntry);
+ByteBuffer& operator<<(ByteBuffer& data, TraitConfig const& traitConfig);
+}
+
+#endif // TRINITYCORE_TRAIT_PACKETS_COMMON_H
diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.cpp b/src/server/game/Server/Packets/TransmogrificationPackets.cpp
index 3ea86ae6106..5a856fc4805 100644
--- a/src/server/game/Server/Packets/TransmogrificationPackets.cpp
+++ b/src/server/game/Server/Packets/TransmogrificationPackets.cpp
@@ -51,10 +51,3 @@ WorldPacket const* WorldPackets::Transmogrification::AccountTransmogUpdate::Writ
return &_worldPacket;
}
-
-WorldPacket const* WorldPackets::Transmogrification::TransmogrifyNPC::Write()
-{
- _worldPacket << Guid;
-
- return &_worldPacket;
-}
diff --git a/src/server/game/Server/Packets/TransmogrificationPackets.h b/src/server/game/Server/Packets/TransmogrificationPackets.h
index 2f1e22063fa..4ad6b3adbff 100644
--- a/src/server/game/Server/Packets/TransmogrificationPackets.h
+++ b/src/server/game/Server/Packets/TransmogrificationPackets.h
@@ -63,16 +63,6 @@ namespace WorldPackets
std::vector<uint32> FavoriteAppearances;
std::vector<uint32> NewAppearances;
};
-
- class TransmogrifyNPC final : public ServerPacket
- {
- public:
- TransmogrifyNPC(ObjectGuid const& guid) : ServerPacket(SMSG_TRANSMOGRIFY_NPC, 16), Guid(guid) { }
-
- WorldPacket const* Write() override;
-
- ObjectGuid Guid;
- };
}
}
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 75c8222b069..8e197c8b98b 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -30,7 +30,7 @@ public:
void Call(WorldSession* session, WorldPacket& packet) const override
{
- PacketClass nicePacket(std::move(packet));
+ std::remove_cv_t<PacketClass> nicePacket(std::move(packet));
nicePacket.Read();
(session->*HandlerFunction)(nicePacket);
session->LogUnprocessedTail(nicePacket.GetRawPacket());
@@ -65,27 +65,35 @@ OpcodeTable::~OpcodeTable()
}
}
-template<typename Handler, Handler HandlerFunction>
-void OpcodeTable::ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing)
+bool OpcodeTable::ValidateClientOpcode(OpcodeClient opcode, char const* name) const
{
if (uint32(opcode) == NULL_OPCODE)
{
TC_LOG_ERROR("network", "Opcode %s does not have a value", name);
- return;
+ return false;
}
if (uint32(opcode) >= NUM_OPCODE_HANDLERS)
{
TC_LOG_ERROR("network", "Tried to set handler for an invalid opcode %d", opcode);
- return;
+ return false;
}
if (_internalTableClient[opcode] != nullptr)
{
- TC_LOG_ERROR("network", "Tried to override client handler of %s with %s (opcode %u)", opcodeTable[opcode]->Name, name, opcode);
- return;
+ TC_LOG_ERROR("network", "Tried to override client handler of %s with %s (opcode %u)", _internalTableClient[opcode]->Name, name, opcode);
+ return false;
}
+ return true;
+}
+
+template<typename Handler, Handler HandlerFunction>
+void OpcodeTable::ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing)
+{
+ if (!ValidateClientOpcode(opcode, name))
+ return;
+
_internalTableClient[opcode] = new PacketHandler<typename get_packet_class<Handler>::type, HandlerFunction>(name, status, processing);
}
@@ -132,6 +140,7 @@ void OpcodeTable::Initialize()
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_RETURNING_PLAYER_PROMPT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_ACCEPT_SOCIAL_CONTRACT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptTradeOpcode);
DEFINE_HANDLER(CMSG_ACCEPT_WARGAME_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
@@ -198,6 +207,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinOpcode);
DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena);
DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_BRAWL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_SKIRMISH, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BATTLENET_CHALLENGE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_BATTLENET_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlenetRequest);
@@ -319,6 +329,13 @@ void OpcodeTable::Initialize()
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_CLASS_TALENTS_DELETE_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_RENAME_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS, STATUS_UNHANDLED, PROCESS_INPLACE, &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);
@@ -326,6 +343,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CLOSE_INTERACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCloseInteraction);
DEFINE_HANDLER(CMSG_CLOSE_QUEST_CHOICE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLOSE_RUNEFORGE_INTERACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_APPLICATION_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_GET_APPLICANTS_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CLUB_FINDER_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
@@ -366,6 +384,15 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CONVERSATION_LINE_STARTED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleConversationLineStarted);
DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleConvertRaidOpcode);
DEFINE_HANDLER(CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_CANCEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_CLAIM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_CREATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_FULFILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_LIST_MY_ORDERS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_REJECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_RELEASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_CREATE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharCreateOpcode);
DEFINE_HANDLER(CMSG_CREATE_SHIPMENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_DB_QUERY_BULK, STATUS_AUTHED, PROCESS_INPLACE, &WorldSession::HandleDBQueryBulk);
@@ -560,6 +587,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOUNT_CLEAR_FANFARE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOUNT_SET_FAVORITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSetFavorite);
DEFINE_HANDLER(CMSG_MOUNT_SPECIAL_ANIM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode);
+ DEFINE_HANDLER(CMSG_MOVE_ADD_IMPULSE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_APPLY_INERTIA_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
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);
@@ -598,6 +626,21 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOVE_REMOVE_MOVEMENT_FORCES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveRemoveMovementForceAck);
DEFINE_HANDLER(CMSG_MOVE_SEAMLESS_TRANSFER_COMPLETE, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_MOVE_SET_CAN_ADV_FLY_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage);
DEFINE_HANDLER(CMSG_MOVE_SET_COLLISION_HEIGHT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetCollisionHeightAck);
@@ -695,6 +738,7 @@ void OpcodeTable::Initialize()
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_INPLACE, &WorldSession::HandleQueryQuestCompletionNPCs);
DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestQueryOpcode);
+ DEFINE_HANDLER(CMSG_QUERY_QUEST_ITEM_USABILITY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryRealmName);
DEFINE_HANDLER(CMSG_QUERY_SCENARIO_POI, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryScenarioPOI);
DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQueryTimeOpcode);
@@ -738,6 +782,7 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequest);
DEFINE_HANDLER(CMSG_REPORT_CLIENT_VARIABLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_REPORT_ENABLED_ADDONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_REPORT_FROZEN_WHILE_LOADING_MAP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
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);
@@ -803,11 +848,11 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_SET_ASSISTANT_LEADER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetAssistantLeaderOpcode);
DEFINE_HANDLER(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_BANK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
- DEFINE_HANDLER(CMSG_SET_CHAT_DISABLED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_CONTACT_NOTES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetContactNotesOpcode);
DEFINE_HANDLER(CMSG_SET_CURRENCY_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_DIFFICULTY_ID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_DUNGEON_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetDungeonDifficultyOpcode);
+ DEFINE_HANDLER(CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SET_EVERYONE_IS_ASSISTANT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetEveryoneIsAssistant);
DEFINE_HANDLER(CMSG_SET_FACTION_AT_WAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetFactionAtWar);
DEFINE_HANDLER(CMSG_SET_FACTION_INACTIVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSetFactionInactiveOpcode);
@@ -845,6 +890,8 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_SORT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortBankBags);
DEFINE_HANDLER(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSortReagentBankBags);
DEFINE_HANDLER(CMSG_SPELL_CLICK, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleSpellClick);
+ DEFINE_HANDLER(CMSG_SPELL_EMPOWER_RELEASE, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_SPELL_EMPOWER_RESTART, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSpiritHealerActivate);
DEFINE_HANDLER(CMSG_SPLIT_GUILD_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitGuildBankItem);
DEFINE_HANDLER(CMSG_SPLIT_GUILD_BANK_ITEM_TO_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleSplitGuildBankItemToInventory);
@@ -884,6 +931,8 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_TRADE_SKILL_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTrainerBuySpellOpcode);
DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleTrainerListOpcode);
+ DEFINE_HANDLER(CMSG_TRAITS_COMMIT_CONFIG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_TRANSMOGRIFY_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems);
DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetition);
DEFINE_HANDLER(CMSG_TUTORIAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTutorialFlag);
@@ -896,9 +945,11 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleUnlearnSkillOpcode);
DEFINE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UNLOCK_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleVoidStorageUnlock);
+ DEFINE_HANDLER(CMSG_UPDATE_AADC_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateAccountData);
DEFINE_HANDLER(CMSG_UPDATE_AREA_TRIGGER_VISUAL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPDATE_CLIENT_SETTINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
+ DEFINE_HANDLER(CMSG_UPDATE_CRAFTING_NPC_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
DEFINE_HANDLER(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory);
DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateRaidTargetOpcode);
DEFINE_HANDLER(CMSG_UPDATE_SPELL_VISUAL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL);
@@ -958,7 +1009,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADVANCED_COMBAT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE, STATUS_NEVER, 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);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -994,7 +1044,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_CLOSED_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_DISABLE_POSTING_BEFORE_MAINTENANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_DISABLE_NEW_POSTINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_FAVORITE_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1012,7 +1062,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_HOTFIXES, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_RESPEC_NPC, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BAG_CLEANUP_FINISHED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATCH_PRESENCE_SUBSCRIPTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1066,10 +1115,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_REVOKED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_TRAP_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_UPDATES, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BIND_POINT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OPEN_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OUTBID, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_WON, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1107,6 +1154,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_ORPHAN_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_PRELOAD_WORLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SCENE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL_KIT, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1154,7 +1202,6 @@ void OpcodeTable::Initialize()
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);
@@ -1166,8 +1213,6 @@ void OpcodeTable::Initialize()
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);
@@ -1206,8 +1251,18 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_TRANSPORT_QUERY, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COVENANT_PREVIEW_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_COVENANT_RENOWN_OPEN_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_HOUSE_HELLO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_CANCEL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_CLAIM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_CRAFT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_CREATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_FULFILL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_REJECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_RELEASE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFTING_ORDER_UPDATE_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRAFT_ENCHANT_RESULT, 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);
@@ -1251,6 +1306,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_END_LIGHTNING_STORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENSURE_WORLD_LOADED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENTER_ENCRYPTED_MODE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_CHARACTERS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1276,13 +1332,14 @@ void OpcodeTable::Initialize()
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_CLOSE_INTERACTION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_CUSTOM_ANIM, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_DESPAWN, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_INTERACTION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_RESET_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_SET_STATE_LOCAL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_UI_LINK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
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);
@@ -1326,11 +1383,8 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT, 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_NEVER, 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);
@@ -1378,6 +1432,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOD_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
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_OPTION_NPC_INTERACTION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_QUEST_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_REFRESH_OPTIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1386,6 +1441,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_NEW_LEADER, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_REQUEST_DECLINE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1474,7 +1530,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_FIXUP_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_FULL_OVERFLOW, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ISLANDS_MISSION_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ISLAND_AZERITE_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ISLAND_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_IS_QUEST_COMPLETE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1527,6 +1582,7 @@ void OpcodeTable::Initialize()
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_LOBBY_MATCHMAKER_PARTY_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SET_TIME_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_VERIFY_WORLD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_CANCEL_ACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1560,6 +1616,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVEMENT_ENFORCEMENT_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ADD_IMPULSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_INERTIA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1577,6 +1634,20 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_REMOVE_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_MAX_VEL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_ADV_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1628,11 +1699,13 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_ADV_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_ADD_IMPULSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_APPLY_INERTIA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1663,16 +1736,13 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_MONEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_INTERACTION_OPEN_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
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);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1736,9 +1806,9 @@ void OpcodeTable::Initialize()
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_SHOW_GENERIC_WIDGET_DISPLAY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SHOW_UI_EVENT_TOAST, STATUS_UNHANDLED, 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);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_MUSIC, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1754,10 +1824,12 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PONG, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRELOAD_CHILD_MAP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRELOAD_WORLD, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PREPOPULATE_NAME_CACHE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRINT_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROFESSION_GOSSIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PUSH_SPELL_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_MATCH_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1794,6 +1866,7 @@ 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_ITEM_USABILITY_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_NON_LOG_UPDATE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1826,6 +1899,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_LOOKUP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REATTACH_RESURRECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRAFT_ITEM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_COMPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1852,6 +1926,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_TOKEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RETURNING_PLAYER_PROMPT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RETURN_APPLICANT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RETURN_RECRUITING_CLUBS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1919,8 +1994,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHADOWLANDS_CAPACITANCE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
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);
@@ -1938,6 +2011,9 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPELL_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EMPOWER_SET_STAGE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EMPOWER_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EMPOWER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1956,7 +2032,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_VISUAL_LOAD_SCREEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLASH_SCREEN_SHOW_LATEST, STATUS_NEVER, 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);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
@@ -1964,10 +2039,13 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_LOOT_ROLL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_STARTER_BUILD_ACTIVATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_SPEAKERBOT_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STREAMING_MOVIES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUGGEST_INVITE_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1992,9 +2070,9 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAIT_CONFIG_COMMIT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSMOGRIFY_NPC, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TREASURE_PICKER_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -2002,7 +2080,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, CONNECTION_TYPE_REALM);
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);
@@ -2017,6 +2094,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_CRAFTING_NPC_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
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);
@@ -2063,10 +2141,10 @@ void OpcodeTable::Initialize()
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_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);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_ENTITLEMENT_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_AWARDED_FROM_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ABORTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ZONE_UNDER_ATTACK, STATUS_NEVER, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index 02507572377..f819789325b 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -44,34 +44,35 @@ enum OpcodeMisc : uint16
enum OpcodeClient : uint16
{
- CMSG_ABANDON_NPE_RESPONSE = 0x33E1,
+ CMSG_ABANDON_NPE_RESPONSE = 0x33EB,
CMSG_ACCEPT_GUILD_INVITE = 0x35FC,
- CMSG_ACCEPT_SOCIAL_CONTRACT = 0x373B,
+ CMSG_ACCEPT_RETURNING_PLAYER_PROMPT = 0x3395,
+ CMSG_ACCEPT_SOCIAL_CONTRACT = 0x373E,
CMSG_ACCEPT_TRADE = 0x315A,
CMSG_ACCEPT_WARGAME_INVITE = 0x35E0,
- CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED = 0x3731,
- CMSG_ACTIVATE_SOULBIND = 0x33D0,
+ CMSG_ACCOUNT_NOTIFICATION_ACKNOWLEDGED = 0x3733,
+ CMSG_ACTIVATE_SOULBIND = 0x33DA,
CMSG_ACTIVATE_TAXI = 0x34B1,
CMSG_ADDON_LIST = 0x35D8,
- CMSG_ADD_ACCOUNT_COSMETIC = 0x32A9,
- CMSG_ADD_BATTLENET_FRIEND = 0x3659,
- CMSG_ADD_FRIEND = 0x36CC,
- CMSG_ADD_IGNORE = 0x36D0,
- CMSG_ADD_TOY = 0x32A8,
- CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3205,
- CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x33D3,
- CMSG_ADVENTURE_MAP_START_QUEST = 0x3360,
+ CMSG_ADD_ACCOUNT_COSMETIC = 0x32B1,
+ CMSG_ADD_BATTLENET_FRIEND = 0x365A,
+ CMSG_ADD_FRIEND = 0x36CE,
+ CMSG_ADD_IGNORE = 0x36D2,
+ CMSG_ADD_TOY = 0x32B0,
+ CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3204,
+ CMSG_ADVENTURE_JOURNAL_UPDATE_SUGGESTIONS = 0x33DD,
+ CMSG_ADVENTURE_MAP_START_QUEST = 0x3369,
CMSG_ALTER_APPEARANCE = 0x3503,
CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34B6,
CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34B7,
CMSG_AREA_TRIGGER = 0x31D8,
CMSG_ARTIFACT_ADD_POWER = 0x31AB,
CMSG_ARTIFACT_SET_APPEARANCE = 0x31AD,
- CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x3211,
- CMSG_ATTACK_STOP = 0x3260,
- CMSG_ATTACK_SWING = 0x325F,
- CMSG_AUCTIONABLE_TOKEN_SELL = 0x36E2,
- CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x36E3,
+ CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x3210,
+ CMSG_ATTACK_STOP = 0x3263,
+ CMSG_ATTACK_SWING = 0x3262,
+ CMSG_AUCTIONABLE_TOKEN_SELL = 0x36E4,
+ CMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE = 0x36E5,
CMSG_AUCTION_BROWSE_QUERY = 0x34D6,
CMSG_AUCTION_CANCEL_COMMODITIES_PURCHASE = 0x34DE,
CMSG_AUCTION_CONFIRM_COMMODITIES_PURCHASE = 0x34DD,
@@ -85,10 +86,10 @@ enum OpcodeClient : uint16
CMSG_AUCTION_PLACE_BID = 0x34D5,
CMSG_AUCTION_REMOVE_ITEM = 0x34D3,
CMSG_AUCTION_REPLICATE_ITEMS = 0x34D4,
- CMSG_AUCTION_REQUEST_FAVORITE_LIST = 0x3733,
+ CMSG_AUCTION_REQUEST_FAVORITE_LIST = 0x3735,
CMSG_AUCTION_SELL_COMMODITY = 0x34DF,
CMSG_AUCTION_SELL_ITEM = 0x34D2,
- CMSG_AUCTION_SET_FAVORITE_ITEM = 0x3732,
+ CMSG_AUCTION_SET_FAVORITE_ITEM = 0x3734,
CMSG_AUTH_CONTINUED_SESSION = 0x3766,
CMSG_AUTH_SESSION = 0x3765,
CMSG_AUTOBANK_ITEM = 0x3997,
@@ -100,32 +101,33 @@ enum OpcodeClient : uint16
CMSG_AUTO_GUILD_BANK_ITEM = 0x34BD,
CMSG_AUTO_STORE_BAG_ITEM = 0x399B,
CMSG_AUTO_STORE_GUILD_BANK_ITEM = 0x34C6,
- CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x3388,
- CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x336B,
- CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x338A,
- CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x3389,
+ CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x3391,
+ CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x3374,
+ CMSG_AZERITE_ESSENCE_ACTIVATE_ESSENCE = 0x3393,
+ CMSG_AZERITE_ESSENCE_UNLOCK_MILESTONE = 0x3392,
CMSG_BANKER_ACTIVATE = 0x34B9,
CMSG_BATTLEFIELD_LEAVE = 0x3173,
CMSG_BATTLEFIELD_LIST = 0x317F,
- CMSG_BATTLEFIELD_PORT = 0x3537,
- CMSG_BATTLEMASTER_HELLO = 0x32C5,
+ CMSG_BATTLEFIELD_PORT = 0x3538,
+ CMSG_BATTLEMASTER_HELLO = 0x32CD,
CMSG_BATTLEMASTER_JOIN = 0x3530,
CMSG_BATTLEMASTER_JOIN_ARENA = 0x3531,
- CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3535,
- CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3532,
- CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36CF,
- CMSG_BATTLENET_REQUEST = 0x36F1,
- CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36C9,
- CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x370F,
- CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36C8,
- CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36BF,
- CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS = 0x3736,
- CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36B7,
- CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36B8,
- CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x3708,
- CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x3704,
- CMSG_BATTLE_PAY_START_PURCHASE = 0x36C7,
- CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36EE,
+ CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3536,
+ CMSG_BATTLEMASTER_JOIN_RATED_SOLO_SHUFFLE = 0x3532,
+ CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3533,
+ CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D1,
+ CMSG_BATTLENET_REQUEST = 0x36F3,
+ CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CB,
+ CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x3711,
+ CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CA,
+ CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C1,
+ CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS = 0x3738,
+ CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36B9,
+ CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36BA,
+ CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x370A,
+ CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x3706,
+ CMSG_BATTLE_PAY_START_PURCHASE = 0x36C9,
+ CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F0,
CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C,
CMSG_BATTLE_PET_DELETE_PET = 0x3625,
CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3626,
@@ -139,59 +141,59 @@ enum OpcodeClient : uint16
CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31E1,
CMSG_BEGIN_TRADE = 0x3157,
CMSG_BINDER_ACTIVATE = 0x34B8,
- CMSG_BLACK_MARKET_BID_ON_ITEM = 0x353F,
- CMSG_BLACK_MARKET_OPEN = 0x353D,
- CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x353E,
- CMSG_BONUS_ROLL = 0x338B,
- CMSG_BUG_REPORT = 0x3684,
+ CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3540,
+ CMSG_BLACK_MARKET_OPEN = 0x353E,
+ CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x353F,
+ CMSG_BONUS_ROLL = 0x3394,
+ CMSG_BUG_REPORT = 0x3685,
CMSG_BUSY_TRADE = 0x3158,
CMSG_BUY_BACK_ITEM = 0x34AA,
CMSG_BUY_BANK_SLOT = 0x34BA,
CMSG_BUY_ITEM = 0x34A9,
CMSG_BUY_REAGENT_BANK = 0x34BB,
CMSG_CAGE_BATTLE_PET = 0x31F4,
- CMSG_CALENDAR_ADD_EVENT = 0x367C,
- CMSG_CALENDAR_COMMUNITY_INVITE = 0x3670,
- CMSG_CALENDAR_COMPLAIN = 0x3678,
- CMSG_CALENDAR_COPY_EVENT = 0x3677,
- CMSG_CALENDAR_EVENT_SIGN_UP = 0x367A,
- CMSG_CALENDAR_GET = 0x366E,
- CMSG_CALENDAR_GET_EVENT = 0x366F,
- CMSG_CALENDAR_GET_NUM_PENDING = 0x3679,
- CMSG_CALENDAR_INVITE = 0x3671,
- CMSG_CALENDAR_MODERATOR_STATUS = 0x3675,
- CMSG_CALENDAR_REMOVE_EVENT = 0x3676,
- CMSG_CALENDAR_REMOVE_INVITE = 0x3672,
- CMSG_CALENDAR_RSVP = 0x3673,
- CMSG_CALENDAR_STATUS = 0x3674,
- CMSG_CALENDAR_UPDATE_EVENT = 0x367D,
+ CMSG_CALENDAR_ADD_EVENT = 0x367D,
+ CMSG_CALENDAR_COMMUNITY_INVITE = 0x3671,
+ CMSG_CALENDAR_COMPLAIN = 0x3679,
+ CMSG_CALENDAR_COPY_EVENT = 0x3678,
+ CMSG_CALENDAR_EVENT_SIGN_UP = 0x367B,
+ CMSG_CALENDAR_GET = 0x366F,
+ CMSG_CALENDAR_GET_EVENT = 0x3670,
+ CMSG_CALENDAR_GET_NUM_PENDING = 0x367A,
+ CMSG_CALENDAR_INVITE = 0x3672,
+ CMSG_CALENDAR_MODERATOR_STATUS = 0x3676,
+ CMSG_CALENDAR_REMOVE_EVENT = 0x3677,
+ CMSG_CALENDAR_REMOVE_INVITE = 0x3673,
+ CMSG_CALENDAR_RSVP = 0x3674,
+ CMSG_CALENDAR_STATUS = 0x3675,
+ CMSG_CALENDAR_UPDATE_EVENT = 0x367E,
CMSG_CANCEL_AURA = 0x31AF,
CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34F5,
- CMSG_CANCEL_CAST = 0x32AF,
- CMSG_CANCEL_CHANNELLING = 0x3278,
- CMSG_CANCEL_GROWTH_AURA = 0x327D,
- CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3219,
+ CMSG_CANCEL_CAST = 0x32B7,
+ CMSG_CANCEL_CHANNELLING = 0x327B,
+ CMSG_CANCEL_GROWTH_AURA = 0x3283,
+ CMSG_CANCEL_MASTER_LOOT_ROLL = 0x321C,
CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31AE,
- CMSG_CANCEL_MOUNT_AURA = 0x3290,
+ CMSG_CANCEL_MOUNT_AURA = 0x3296,
CMSG_CANCEL_QUEUED_SPELL = 0x3180,
CMSG_CANCEL_TEMP_ENCHANTMENT = 0x3500,
CMSG_CANCEL_TRADE = 0x315C,
- CMSG_CAN_DUEL = 0x3661,
- CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x3703,
- CMSG_CAST_SPELL = 0x32AC,
+ CMSG_CAN_DUEL = 0x3662,
+ CMSG_CAN_REDEEM_TOKEN_FOR_BALANCE = 0x3705,
+ CMSG_CAST_SPELL = 0x32B4,
CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x3090,
- CMSG_CHANGE_BAG_SLOT_FLAG = 0x3345,
- CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x3346,
- CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3326,
- CMSG_CHANGE_REALM_TICKET = 0x36F6,
- CMSG_CHANGE_SUB_GROUP = 0x364B,
- CMSG_CHARACTER_CHECK_UPGRADE = 0x36C2,
- CMSG_CHARACTER_RENAME_REQUEST = 0x36BD,
- CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST = 0x36C0,
- CMSG_CHARACTER_UPGRADE_START = 0x36C1,
- CMSG_CHAR_CUSTOMIZE = 0x368B,
- CMSG_CHAR_DELETE = 0x369A,
- CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3691,
+ CMSG_CHANGE_BAG_SLOT_FLAG = 0x334E,
+ CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x334F,
+ CMSG_CHANGE_MONUMENT_APPEARANCE = 0x332F,
+ CMSG_CHANGE_REALM_TICKET = 0x36F8,
+ CMSG_CHANGE_SUB_GROUP = 0x364C,
+ CMSG_CHARACTER_CHECK_UPGRADE = 0x36C4,
+ CMSG_CHARACTER_RENAME_REQUEST = 0x36BF,
+ CMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_REQUEST = 0x36C2,
+ CMSG_CHARACTER_UPGRADE_START = 0x36C3,
+ CMSG_CHAR_CUSTOMIZE = 0x368C,
+ CMSG_CHAR_DELETE = 0x369C,
+ CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3692,
CMSG_CHAT_ADDON_MESSAGE = 0x37EE,
CMSG_CHAT_ADDON_MESSAGE_TARGETED = 0x37EF,
CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x37E3,
@@ -228,29 +230,37 @@ enum OpcodeClient : uint16
CMSG_CHAT_REPORT_FILTERED = 0x37CC,
CMSG_CHAT_REPORT_IGNORED = 0x37CB,
CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x37CE,
- CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x3644,
- CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x3251,
- CMSG_CHOICE_RESPONSE = 0x32B4,
- CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x33CF,
- CMSG_CLAIM_WEEKLY_REWARD = 0x33AB,
+ CMSG_CHECK_CHARACTER_NAME_AVAILABILITY = 0x3645,
+ CMSG_CHECK_IS_ADVENTURE_MAP_POI_VALID = 0x3254,
+ CMSG_CHOICE_RESPONSE = 0x32BC,
+ CMSG_CHROMIE_TIME_SELECT_EXPANSION = 0x33D9,
+ CMSG_CLAIM_WEEKLY_REWARD = 0x33B5,
+ CMSG_CLASS_TALENTS_DELETE_CONFIG = 0x3408,
+ CMSG_CLASS_TALENTS_NOTIFY_EMPTY_CONFIG = 0x3214,
+ CMSG_CLASS_TALENTS_NOTIFY_VALIDATION_FAILED = 0x340A,
+ CMSG_CLASS_TALENTS_RENAME_CONFIG = 0x3407,
+ CMSG_CLASS_TALENTS_REQUEST_NEW_CONFIG = 0x3406,
+ CMSG_CLASS_TALENTS_SET_STARTER_BUILD_ACTIVE = 0x340B,
+ CMSG_CLASS_TALENTS_SET_USES_SHARED_ACTION_BARS = 0x3213,
CMSG_CLEAR_NEW_APPEARANCE = 0x312F,
CMSG_CLEAR_RAID_MARKER = 0x31A7,
CMSG_CLEAR_TRADE_ITEM = 0x315E,
- CMSG_CLIENT_PORT_GRAVEYARD = 0x3539,
+ CMSG_CLIENT_PORT_GRAVEYARD = 0x353A,
CMSG_CLOSE_INTERACTION = 0x3499,
- CMSG_CLOSE_QUEST_CHOICE = 0x32B5,
- CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x33D7,
- CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x371A,
- CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x3718,
- CMSG_CLUB_FINDER_POST = 0x3715,
- CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x371C,
- CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x3716,
- CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x3717,
- CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x371B,
- CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x371D,
- CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x3719,
- CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST = 0x3739,
- CMSG_CLUB_PRESENCE_SUBSCRIBE = 0x36F3,
+ CMSG_CLOSE_QUEST_CHOICE = 0x32BD,
+ CMSG_CLOSE_RUNEFORGE_INTERACTION = 0x33E1,
+ CMSG_CLOSE_TRAIT_SYSTEM_INTERACTION = 0x340C,
+ CMSG_CLUB_FINDER_APPLICATION_RESPONSE = 0x371C,
+ CMSG_CLUB_FINDER_GET_APPLICANTS_LIST = 0x371A,
+ CMSG_CLUB_FINDER_POST = 0x3717,
+ CMSG_CLUB_FINDER_REQUEST_CLUBS_DATA = 0x371E,
+ CMSG_CLUB_FINDER_REQUEST_CLUBS_LIST = 0x3718,
+ CMSG_CLUB_FINDER_REQUEST_MEMBERSHIP_TO_CLUB = 0x3719,
+ CMSG_CLUB_FINDER_REQUEST_PENDING_CLUBS_LIST = 0x371D,
+ CMSG_CLUB_FINDER_REQUEST_SUBSCRIBED_CLUB_POSTING_IDS = 0x371F,
+ CMSG_CLUB_FINDER_RESPOND_TO_APPLICANT = 0x371B,
+ CMSG_CLUB_FINDER_WHISPER_APPLICANT_REQUEST = 0x373B,
+ CMSG_CLUB_PRESENCE_SUBSCRIBE = 0x36F5,
CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x3633,
CMSG_COMMENTATOR_ENABLE = 0x35F0,
CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F4,
@@ -258,38 +268,47 @@ enum OpcodeClient : uint16
CMSG_COMMENTATOR_GET_MAP_INFO = 0x35F1,
CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x35F3,
CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F2,
- CMSG_COMMENTATOR_SPECTATE = 0x3737,
+ CMSG_COMMENTATOR_SPECTATE = 0x3739,
CMSG_COMMENTATOR_START_WARGAME = 0x35EF,
- CMSG_COMMERCE_TOKEN_GET_COUNT = 0x36E0,
- CMSG_COMMERCE_TOKEN_GET_LOG = 0x36EA,
- CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x36E1,
- CMSG_COMPLAINT = 0x366B,
- CMSG_COMPLETE_CINEMATIC = 0x3557,
+ CMSG_COMMERCE_TOKEN_GET_COUNT = 0x36E2,
+ CMSG_COMMERCE_TOKEN_GET_LOG = 0x36EC,
+ CMSG_COMMERCE_TOKEN_GET_MARKET_PRICE = 0x36E3,
+ CMSG_COMPLAINT = 0x366C,
+ CMSG_COMPLETE_CINEMATIC = 0x3558,
CMSG_COMPLETE_MOVIE = 0x34EB,
CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31AC,
- CMSG_CONFIRM_RESPEC_WIPE = 0x3213,
+ CMSG_CONFIRM_RESPEC_WIPE = 0x3216,
CMSG_CONNECT_TO_FAILED = 0x35D4,
- CMSG_CONSUMABLE_TOKEN_BUY = 0x36E5,
- CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x36E6,
- CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x36E4,
- CMSG_CONSUMABLE_TOKEN_REDEEM = 0x36E8,
- CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x36E9,
- CMSG_CONTRIBUTION_CONTRIBUTE = 0x356B,
- CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x356C,
- CMSG_CONVERSATION_CINEMATIC_READY = 0x3559,
- CMSG_CONVERSATION_LINE_STARTED = 0x3558,
- CMSG_CONVERT_RAID = 0x364D,
- CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x357F,
- CMSG_CREATE_CHARACTER = 0x3643,
- CMSG_CREATE_SHIPMENT = 0x3312,
+ CMSG_CONSUMABLE_TOKEN_BUY = 0x36E7,
+ CMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE = 0x36E8,
+ CMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY = 0x36E6,
+ CMSG_CONSUMABLE_TOKEN_REDEEM = 0x36EA,
+ CMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRMATION = 0x36EB,
+ CMSG_CONTRIBUTION_CONTRIBUTE = 0x356C,
+ CMSG_CONTRIBUTION_LAST_UPDATE_REQUEST = 0x356D,
+ CMSG_CONVERSATION_CINEMATIC_READY = 0x355A,
+ CMSG_CONVERSATION_LINE_STARTED = 0x3559,
+ CMSG_CONVERT_RAID = 0x364E,
+ CMSG_COVENANT_RENOWN_REQUEST_CATCHUP_STATE = 0x3580,
+ CMSG_CRAFTING_ORDER_CANCEL = 0x358B,
+ CMSG_CRAFTING_ORDER_CLAIM = 0x3588,
+ CMSG_CRAFTING_ORDER_CREATE = 0x3585,
+ CMSG_CRAFTING_ORDER_FULFILL = 0x358A,
+ CMSG_CRAFTING_ORDER_LIST_CRAFTER_ORDERS = 0x3587,
+ CMSG_CRAFTING_ORDER_LIST_MY_ORDERS = 0x3586,
+ CMSG_CRAFTING_ORDER_REJECT = 0x358C,
+ CMSG_CRAFTING_ORDER_RELEASE = 0x3589,
+ CMSG_CRAFTING_ORDER_UPDATE_IGNORE_LIST = 0x358D,
+ CMSG_CREATE_CHARACTER = 0x3644,
+ CMSG_CREATE_SHIPMENT = 0x331A,
CMSG_DB_QUERY_BULK = 0x35E4,
CMSG_DECLINE_GUILD_INVITES = 0x352D,
- CMSG_DECLINE_PETITION = 0x3546,
+ CMSG_DECLINE_PETITION = 0x3547,
CMSG_DELETE_EQUIPMENT_SET = 0x3519,
- CMSG_DEL_FRIEND = 0x36CD,
- CMSG_DEL_IGNORE = 0x36D1,
- CMSG_DEPOSIT_REAGENT_BANK = 0x334E,
- CMSG_DESTROY_ITEM = 0x32A2,
+ CMSG_DEL_FRIEND = 0x36CF,
+ CMSG_DEL_IGNORE = 0x36D3,
+ CMSG_DEPOSIT_REAGENT_BANK = 0x3357,
+ CMSG_DESTROY_ITEM = 0x32AA,
CMSG_DF_BOOT_PLAYER_VOTE = 0x3616,
CMSG_DF_CONFIRM_EXPAND_SEARCH = 0x3608,
CMSG_DF_GET_JOIN_STATUS = 0x3614,
@@ -300,70 +319,70 @@ enum OpcodeClient : uint16
CMSG_DF_READY_CHECK_RESPONSE = 0x3619,
CMSG_DF_SET_ROLES = 0x3615,
CMSG_DF_TELEPORT = 0x3617,
- CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A42,
+ CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A41,
CMSG_DISMISS_CRITTER = 0x3507,
- CMSG_DO_COUNTDOWN = 0x3714,
- CMSG_DO_MASTER_LOOT_ROLL = 0x3218,
+ CMSG_DO_COUNTDOWN = 0x3716,
+ CMSG_DO_MASTER_LOOT_ROLL = 0x321B,
CMSG_DO_READY_CHECK = 0x3634,
CMSG_DUEL_RESPONSE = 0x34F0,
- CMSG_EJECT_PASSENGER = 0x3246,
- CMSG_EMOTE = 0x3553,
+ CMSG_EJECT_PASSENGER = 0x3249,
+ CMSG_EMOTE = 0x3554,
CMSG_ENABLE_NAGLE = 0x376B,
CMSG_ENABLE_TAXI_NODE = 0x34AF,
- CMSG_ENGINE_SURVEY = 0x36DF,
+ CMSG_ENGINE_SURVEY = 0x36E1,
CMSG_ENTER_ENCRYPTED_MODE_ACK = 0x3767,
CMSG_ENUM_CHARACTERS = 0x35E8,
- CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36D9,
+ CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36DB,
CMSG_FAR_SIGHT = 0x34F6,
CMSG_GAME_EVENT_DEBUG_DISABLE = 0x31B3,
CMSG_GAME_EVENT_DEBUG_ENABLE = 0x31B2,
CMSG_GAME_OBJ_REPORT_USE = 0x34FD,
CMSG_GAME_OBJ_USE = 0x34FC,
- CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x330D,
- CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32F3,
- CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32E0,
- CMSG_GARRISON_CHECK_UPGRADEABLE = 0x3341,
- CMSG_GARRISON_COMPLETE_MISSION = 0x3333,
- CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x330E,
- CMSG_GARRISON_GENERATE_RECRUITS = 0x32F6,
- CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x3305,
- CMSG_GARRISON_GET_MAP_DATA = 0x330C,
- CMSG_GARRISON_GET_MISSION_REWARD = 0x3364,
- CMSG_GARRISON_LEARN_TALENT = 0x3301,
- CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3335,
- CMSG_GARRISON_PURCHASE_BUILDING = 0x32DC,
- CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32F8,
- CMSG_GARRISON_REMOVE_FOLLOWER = 0x332A,
- CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32F4,
- CMSG_GARRISON_RENAME_FOLLOWER = 0x32F5,
- CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32DB,
- CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x3310,
- CMSG_GARRISON_RESEARCH_TALENT = 0x32F9,
- CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32DD,
- CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32F1,
- CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32E9,
- CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32F7,
- CMSG_GARRISON_SOCKET_TALENT = 0x33E4,
- CMSG_GARRISON_START_MISSION = 0x3332,
- CMSG_GARRISON_SWAP_BUILDINGS = 0x32E1,
+ CMSG_GARRISON_ADD_FOLLOWER_HEALTH = 0x3315,
+ CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32FB,
+ CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32E8,
+ CMSG_GARRISON_CHECK_UPGRADEABLE = 0x334A,
+ CMSG_GARRISON_COMPLETE_MISSION = 0x333C,
+ CMSG_GARRISON_FULLY_HEAL_ALL_FOLLOWERS = 0x3316,
+ CMSG_GARRISON_GENERATE_RECRUITS = 0x32FE,
+ CMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO = 0x330D,
+ CMSG_GARRISON_GET_MAP_DATA = 0x3314,
+ CMSG_GARRISON_GET_MISSION_REWARD = 0x336D,
+ CMSG_GARRISON_LEARN_TALENT = 0x3309,
+ CMSG_GARRISON_MISSION_BONUS_ROLL = 0x333E,
+ CMSG_GARRISON_PURCHASE_BUILDING = 0x32E4,
+ CMSG_GARRISON_RECRUIT_FOLLOWER = 0x3300,
+ CMSG_GARRISON_REMOVE_FOLLOWER = 0x3333,
+ CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32FC,
+ CMSG_GARRISON_RENAME_FOLLOWER = 0x32FD,
+ CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32E3,
+ CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x3318,
+ CMSG_GARRISON_RESEARCH_TALENT = 0x3301,
+ CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32E5,
+ CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32F9,
+ CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32F1,
+ CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32FF,
+ CMSG_GARRISON_SOCKET_TALENT = 0x33EE,
+ CMSG_GARRISON_START_MISSION = 0x333B,
+ CMSG_GARRISON_SWAP_BUILDINGS = 0x32E9,
CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E7,
- CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x36B2,
- CMSG_GET_ACCOUNT_NOTIFICATIONS = 0x3730,
- CMSG_GET_GARRISON_INFO = 0x32D6,
- CMSG_GET_ITEM_PURCHASE_DATA = 0x3541,
- CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x3311,
- CMSG_GET_MIRROR_IMAGE_DATA = 0x32A6,
+ CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x36B4,
+ CMSG_GET_ACCOUNT_NOTIFICATIONS = 0x3732,
+ CMSG_GET_GARRISON_INFO = 0x32DE,
+ CMSG_GET_ITEM_PURCHASE_DATA = 0x3542,
+ CMSG_GET_LANDING_PAGE_SHIPMENTS = 0x3319,
+ CMSG_GET_MIRROR_IMAGE_DATA = 0x32AE,
CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EE,
- CMSG_GET_RAF_ACCOUNT_INFO = 0x371E,
- CMSG_GET_REMAINING_GAME_TIME = 0x36E7,
- CMSG_GET_TROPHY_LIST = 0x3323,
- CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36DB,
- CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x36EC,
- CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x36ED,
- CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x368F,
- CMSG_GM_TICKET_GET_CASE_STATUS = 0x368E,
- CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x368D,
- CMSG_GOSSIP_REFRESH_OPTIONS = 0x357E,
+ CMSG_GET_RAF_ACCOUNT_INFO = 0x3720,
+ CMSG_GET_REMAINING_GAME_TIME = 0x36E9,
+ CMSG_GET_TROPHY_LIST = 0x332C,
+ CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36DD,
+ CMSG_GET_VAS_ACCOUNT_CHARACTER_LIST = 0x36EE,
+ CMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST = 0x36EF,
+ CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3690,
+ CMSG_GM_TICKET_GET_CASE_STATUS = 0x368F,
+ CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x368E,
+ CMSG_GOSSIP_REFRESH_OPTIONS = 0x357F,
CMSG_GOSSIP_SELECT_OPTION = 0x349A,
CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308E,
CMSG_GUILD_ADD_RANK = 0x3065,
@@ -402,31 +421,31 @@ enum OpcodeClient : uint16
CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3089,
CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x3070,
CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3071,
- CMSG_GUILD_SET_GUILD_MASTER = 0x36C4,
+ CMSG_GUILD_SET_GUILD_MASTER = 0x36C6,
CMSG_GUILD_SET_MEMBER_NOTE = 0x3073,
CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3068,
CMSG_GUILD_SHIFT_RANK = 0x3067,
CMSG_GUILD_UPDATE_INFO_TEXT = 0x3076,
CMSG_GUILD_UPDATE_MOTD_TEXT = 0x3075,
CMSG_HEARTH_AND_RESURRECT = 0x3515,
- CMSG_HIDE_QUEST_CHOICE = 0x32B6,
+ CMSG_HIDE_QUEST_CHOICE = 0x32BE,
CMSG_HOTFIX_REQUEST = 0x35E5,
CMSG_IGNORE_TRADE = 0x3159,
CMSG_INITIATE_ROLE_POLL = 0x35DA,
CMSG_INITIATE_TRADE = 0x3156,
- CMSG_INSPECT = 0x353B,
+ CMSG_INSPECT = 0x353C,
CMSG_INSTANCE_LOCK_RESPONSE = 0x351A,
- CMSG_ISLAND_QUEUE = 0x33A7,
- CMSG_ITEM_PURCHASE_REFUND = 0x3542,
- CMSG_ITEM_TEXT_QUERY = 0x3342,
+ CMSG_ISLAND_QUEUE = 0x33B1,
+ CMSG_ITEM_PURCHASE_REFUND = 0x3543,
+ CMSG_ITEM_TEXT_QUERY = 0x334B,
CMSG_JOIN_PET_BATTLE_QUEUE = 0x31DF,
CMSG_JOIN_RATED_BATTLEGROUND = 0x3179,
- CMSG_KEEP_ALIVE = 0x367E,
- CMSG_KEYBOUND_OVERRIDE = 0x322B,
+ CMSG_KEEP_ALIVE = 0x367F,
+ CMSG_KEYBOUND_OVERRIDE = 0x322E,
CMSG_LATENCY_REPORT = 0x3771,
- CMSG_LEARN_PVP_TALENTS = 0x356A,
- CMSG_LEARN_TALENTS = 0x3568,
- CMSG_LEAVE_GROUP = 0x3648,
+ CMSG_LEARN_PVP_TALENTS = 0x356B,
+ CMSG_LEARN_TALENTS = 0x3569,
+ CMSG_LEAVE_GROUP = 0x3649,
CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31E0,
CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360D,
CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360E,
@@ -434,101 +453,117 @@ enum OpcodeClient : uint16
CMSG_LFG_LIST_GET_STATUS = 0x360B,
CMSG_LFG_LIST_INVITE_APPLICANT = 0x3610,
CMSG_LFG_LIST_INVITE_RESPONSE = 0x3611,
- CMSG_LFG_LIST_JOIN = 0x3386,
+ CMSG_LFG_LIST_JOIN = 0x338F,
CMSG_LFG_LIST_LEAVE = 0x360A,
CMSG_LFG_LIST_SEARCH = 0x360C,
- CMSG_LFG_LIST_UPDATE_REQUEST = 0x3387,
+ CMSG_LFG_LIST_UPDATE_REQUEST = 0x3390,
CMSG_LIST_INVENTORY = 0x34A7,
- CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36B5,
- CMSG_LIVE_REGION_CHARACTER_COPY = 0x36B4,
- CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B3,
- CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x36B6,
+ CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36B7,
+ CMSG_LIVE_REGION_CHARACTER_COPY = 0x36B6,
+ CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B5,
+ CMSG_LIVE_REGION_KEY_BINDINGS_COPY = 0x36B8,
CMSG_LOADING_SCREEN_NOTIFY = 0x35F8,
- CMSG_LOAD_SELECTED_TROPHY = 0x3324,
+ CMSG_LOAD_SELECTED_TROPHY = 0x332D,
CMSG_LOGOUT_CANCEL = 0x34E6,
CMSG_LOGOUT_INSTANT = 0x34E7,
CMSG_LOGOUT_REQUEST = 0x34E4,
CMSG_LOG_DISCONNECT = 0x3769,
CMSG_LOG_STREAMING_ERROR = 0x376D,
- CMSG_LOOT_ITEM = 0x3216,
- CMSG_LOOT_MONEY = 0x3215,
- CMSG_LOOT_RELEASE = 0x321A,
- CMSG_LOOT_ROLL = 0x321B,
- CMSG_LOOT_UNIT = 0x3214,
- CMSG_LOW_LEVEL_RAID1 = 0x369E,
+ CMSG_LOOT_ITEM = 0x3219,
+ CMSG_LOOT_MONEY = 0x3218,
+ CMSG_LOOT_RELEASE = 0x321D,
+ CMSG_LOOT_ROLL = 0x321E,
+ CMSG_LOOT_UNIT = 0x3217,
+ CMSG_LOW_LEVEL_RAID1 = 0x36A0,
CMSG_LOW_LEVEL_RAID2 = 0x3521,
- CMSG_MAIL_CREATE_TEXT_ITEM = 0x354D,
- CMSG_MAIL_DELETE = 0x322D,
- CMSG_MAIL_GET_LIST = 0x3548,
- CMSG_MAIL_MARK_AS_READ = 0x354C,
- CMSG_MAIL_RETURN_TO_SENDER = 0x3654,
- CMSG_MAIL_TAKE_ITEM = 0x354A,
- CMSG_MAIL_TAKE_MONEY = 0x3549,
- CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x322F,
- CMSG_MASTER_LOOT_ITEM = 0x3217,
+ CMSG_MAIL_CREATE_TEXT_ITEM = 0x354E,
+ CMSG_MAIL_DELETE = 0x3230,
+ CMSG_MAIL_GET_LIST = 0x3549,
+ CMSG_MAIL_MARK_AS_READ = 0x354D,
+ CMSG_MAIL_RETURN_TO_SENDER = 0x3655,
+ CMSG_MAIL_TAKE_ITEM = 0x354B,
+ CMSG_MAIL_TAKE_MONEY = 0x354A,
+ CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x3232,
+ CMSG_MASTER_LOOT_ITEM = 0x321A,
CMSG_MERGE_GUILD_BANK_ITEM_WITH_GUILD_BANK_ITEM = 0x34C7,
CMSG_MERGE_GUILD_BANK_ITEM_WITH_ITEM = 0x34C4,
CMSG_MERGE_ITEM_WITH_GUILD_BANK_ITEM = 0x34C2,
- CMSG_MINIMAP_PING = 0x364A,
+ CMSG_MINIMAP_PING = 0x364B,
CMSG_MISSILE_TRAJECTORY_COLLISION = 0x318B,
CMSG_MOUNT_CLEAR_FANFARE = 0x312D,
CMSG_MOUNT_SET_FAVORITE = 0x3632,
- CMSG_MOUNT_SPECIAL_ANIM = 0x3291,
- CMSG_MOVE_APPLY_INERTIA_ACK = 0x3A4F,
- CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A16,
- CMSG_MOVE_CHANGE_TRANSPORT = 0x3A30,
- CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A35,
- CMSG_MOVE_COLLISION_DISABLE_ACK = 0x3A3A,
- CMSG_MOVE_COLLISION_ENABLE_ACK = 0x3A3B,
- CMSG_MOVE_DISMISS_VEHICLE = 0x3A34,
+ CMSG_MOUNT_SPECIAL_ANIM = 0x3297,
+ CMSG_MOVE_ADD_IMPULSE_ACK = 0x3A50,
+ CMSG_MOVE_APPLY_INERTIA_ACK = 0x3A4E,
+ CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A15,
+ CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2F,
+ CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A34,
+ CMSG_MOVE_COLLISION_DISABLE_ACK = 0x3A39,
+ CMSG_MOVE_COLLISION_ENABLE_ACK = 0x3A3A,
+ CMSG_MOVE_DISMISS_VEHICLE = 0x3A33,
CMSG_MOVE_DOUBLE_JUMP = 0x39EB,
- CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x3A1F,
- CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3A25,
+ CMSG_MOVE_ENABLE_DOUBLE_JUMP_ACK = 0x3A1E,
+ CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x3A24,
CMSG_MOVE_FALL_LAND = 0x39FB,
- CMSG_MOVE_FALL_RESET = 0x3A1A,
- CMSG_MOVE_FEATHER_FALL_ACK = 0x3A1D,
- CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x3A2F,
- CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x3A2E,
- CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x3A33,
- CMSG_MOVE_FORCE_ROOT_ACK = 0x3A0F,
- CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x3A0D,
- CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3A0C,
- CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3A23,
- CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x3A0E,
- CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3A24,
- CMSG_MOVE_FORCE_UNROOT_ACK = 0x3A10,
- CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x3A22,
- CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x3A36,
- CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x3A37,
+ CMSG_MOVE_FALL_RESET = 0x3A19,
+ CMSG_MOVE_FEATHER_FALL_ACK = 0x3A1C,
+ CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x3A2E,
+ CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x3A2D,
+ CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x3A32,
+ CMSG_MOVE_FORCE_ROOT_ACK = 0x3A0E,
+ CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x3A0C,
+ CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3A0B,
+ CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3A22,
+ CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x3A0D,
+ CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3A23,
+ CMSG_MOVE_FORCE_UNROOT_ACK = 0x3A0F,
+ CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x3A21,
+ CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x3A35,
+ CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x3A36,
CMSG_MOVE_GUILD_BANK_ITEM = 0x34C1,
- CMSG_MOVE_HEARTBEAT = 0x3A11,
- CMSG_MOVE_HOVER_ACK = 0x3A14,
- CMSG_MOVE_INERTIA_DISABLE_ACK = 0x3A38,
- CMSG_MOVE_INERTIA_ENABLE_ACK = 0x3A39,
- CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE = 0x3A47,
+ CMSG_MOVE_HEARTBEAT = 0x3A10,
+ CMSG_MOVE_HOVER_ACK = 0x3A13,
+ CMSG_MOVE_INERTIA_DISABLE_ACK = 0x3A37,
+ CMSG_MOVE_INERTIA_ENABLE_ACK = 0x3A38,
+ CMSG_MOVE_INIT_ACTIVE_MOVER_COMPLETE = 0x3A46,
CMSG_MOVE_JUMP = 0x39EA,
- CMSG_MOVE_KNOCK_BACK_ACK = 0x3A13,
- CMSG_MOVE_REMOVE_INERTIA_ACK = 0x3A50,
- CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x3A18,
- CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x3A17,
- CMSG_MOVE_SEAMLESS_TRANSFER_COMPLETE = 0x3A45,
- CMSG_MOVE_SET_CAN_FLY_ACK = 0x3A28,
- CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x3A26,
- CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x3A3C,
- CMSG_MOVE_SET_FACING = 0x3A0A,
- CMSG_MOVE_SET_FACING_HEARTBEAT = 0x3A09,
- CMSG_MOVE_SET_FLY = 0x3A29,
- CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x3A27,
- CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x3A43,
- CMSG_MOVE_SET_PITCH = 0x3A0B,
+ CMSG_MOVE_KNOCK_BACK_ACK = 0x3A12,
+ CMSG_MOVE_REMOVE_INERTIA_ACK = 0x3A4F,
+ CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x3A17,
+ CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x3A16,
+ CMSG_MOVE_SEAMLESS_TRANSFER_COMPLETE = 0x3A44,
+ CMSG_MOVE_SET_ADV_FLY = 0x3A52,
+ CMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED_ACK = 0x3A58,
+ CMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION_ACK = 0x3A53,
+ CMSG_MOVE_SET_ADV_FLYING_BANKING_RATE_ACK = 0x3A59,
+ CMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD_ACK = 0x3A56,
+ CMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT_ACK = 0x3A57,
+ CMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT_ACK = 0x3A60,
+ CMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT_ACK = 0x3A55,
+ CMSG_MOVE_SET_ADV_FLYING_MAX_VEL_ACK = 0x3A54,
+ CMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION_ACK = 0x3A5E,
+ CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN_ACK = 0x3A5A,
+ CMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP_ACK = 0x3A5B,
+ CMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION_ACK = 0x3A5D,
+ CMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD_ACK = 0x3A5C,
+ CMSG_MOVE_SET_CAN_ADV_FLY_ACK = 0x3A51,
+ CMSG_MOVE_SET_CAN_FLY_ACK = 0x3A27,
+ CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x3A25,
+ CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x3A3B,
+ CMSG_MOVE_SET_FACING = 0x3A09,
+ CMSG_MOVE_SET_FACING_HEARTBEAT = 0x3A5F,
+ CMSG_MOVE_SET_FLY = 0x3A28,
+ CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x3A26,
+ CMSG_MOVE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x3A42,
+ CMSG_MOVE_SET_PITCH = 0x3A0A,
CMSG_MOVE_SET_RUN_MODE = 0x39F2,
CMSG_MOVE_SET_TURN_RATE_CHEAT = 0x3A06,
- CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x3A15,
+ CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x3A14,
CMSG_MOVE_SET_WALK_MODE = 0x39F3,
- CMSG_MOVE_SPLINE_DONE = 0x3A19,
- CMSG_MOVE_START_ASCEND = 0x3A2A,
+ CMSG_MOVE_SPLINE_DONE = 0x3A18,
+ CMSG_MOVE_START_ASCEND = 0x3A29,
CMSG_MOVE_START_BACKWARD = 0x39E5,
- CMSG_MOVE_START_DESCEND = 0x3A31,
+ CMSG_MOVE_START_DESCEND = 0x3A30,
CMSG_MOVE_START_FORWARD = 0x39E4,
CMSG_MOVE_START_PITCH_DOWN = 0x39F0,
CMSG_MOVE_START_PITCH_UP = 0x39EF,
@@ -538,51 +573,51 @@ enum OpcodeClient : uint16
CMSG_MOVE_START_TURN_LEFT = 0x39EC,
CMSG_MOVE_START_TURN_RIGHT = 0x39ED,
CMSG_MOVE_STOP = 0x39E6,
- CMSG_MOVE_STOP_ASCEND = 0x3A2B,
+ CMSG_MOVE_STOP_ASCEND = 0x3A2A,
CMSG_MOVE_STOP_PITCH = 0x39F1,
CMSG_MOVE_STOP_STRAFE = 0x39E9,
CMSG_MOVE_STOP_SWIM = 0x39FD,
CMSG_MOVE_STOP_TURN = 0x39EE,
CMSG_MOVE_TELEPORT_ACK = 0x39FA,
- CMSG_MOVE_TIME_SKIPPED = 0x3A1C,
- CMSG_MOVE_UPDATE_FALL_SPEED = 0x3A1B,
- CMSG_MOVE_WATER_WALK_ACK = 0x3A1E,
+ CMSG_MOVE_TIME_SKIPPED = 0x3A1B,
+ CMSG_MOVE_UPDATE_FALL_SPEED = 0x3A1A,
+ CMSG_MOVE_WATER_WALK_ACK = 0x3A1D,
CMSG_MYTHIC_PLUS_REQUEST_MAP_STATS = 0x308F,
CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31D5,
- CMSG_NEXT_CINEMATIC_CAMERA = 0x3556,
+ CMSG_NEXT_CINEMATIC_CAMERA = 0x3557,
CMSG_OBJECT_UPDATE_FAILED = 0x3181,
CMSG_OBJECT_UPDATE_RESCUED = 0x3182,
- CMSG_OFFER_PETITION = 0x33CE,
- CMSG_OPENING_CINEMATIC = 0x3555,
- CMSG_OPEN_ITEM = 0x3343,
- CMSG_OPEN_MISSION_NPC = 0x3307,
- CMSG_OPEN_SHIPMENT_NPC = 0x330F,
- CMSG_OPEN_TRADESKILL_NPC = 0x331A,
+ CMSG_OFFER_PETITION = 0x33D8,
+ CMSG_OPENING_CINEMATIC = 0x3556,
+ CMSG_OPEN_ITEM = 0x334C,
+ CMSG_OPEN_MISSION_NPC = 0x330F,
+ CMSG_OPEN_SHIPMENT_NPC = 0x3317,
+ CMSG_OPEN_TRADESKILL_NPC = 0x3322,
CMSG_OPT_OUT_OF_LOOT = 0x3504,
CMSG_OVERRIDE_SCREEN_FLASH = 0x352E,
CMSG_PARTY_INVITE = 0x3602,
CMSG_PARTY_INVITE_RESPONSE = 0x3604,
- CMSG_PARTY_UNINVITE = 0x3646,
- CMSG_PERFORM_ITEM_INTERACTION = 0x3237,
+ CMSG_PARTY_UNINVITE = 0x3647,
+ CMSG_PERFORM_ITEM_INTERACTION = 0x323A,
CMSG_PETITION_BUY = 0x34CF,
- CMSG_PETITION_RENAME_GUILD = 0x36C5,
+ CMSG_PETITION_RENAME_GUILD = 0x36C7,
CMSG_PETITION_SHOW_LIST = 0x34CE,
CMSG_PETITION_SHOW_SIGNATURES = 0x34D0,
CMSG_PET_ABANDON = 0x3493,
CMSG_PET_ACTION = 0x3491,
CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31E4,
- CMSG_PET_BATTLE_INPUT = 0x3640,
- CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x322C,
+ CMSG_PET_BATTLE_INPUT = 0x3641,
+ CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x322F,
CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31E3,
- CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3641,
+ CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3642,
CMSG_PET_BATTLE_REQUEST_PVP = 0x31DD,
CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31DE,
CMSG_PET_BATTLE_REQUEST_WILD = 0x31DB,
CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31E5,
CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31DC,
CMSG_PET_CANCEL_AURA = 0x3494,
- CMSG_PET_CAST_SPELL = 0x32AB,
- CMSG_PET_RENAME = 0x3683,
+ CMSG_PET_CAST_SPELL = 0x32B3,
+ CMSG_PET_RENAME = 0x3684,
CMSG_PET_SET_ACTION = 0x3490,
CMSG_PET_SPELL_AUTOCAST = 0x3495,
CMSG_PET_STOP_ATTACK = 0x3492,
@@ -590,189 +625,193 @@ enum OpcodeClient : uint16
CMSG_PLAYER_LOGIN = 0x35EA,
CMSG_PUSH_QUEST_TO_PARTY = 0x34A5,
CMSG_PVP_LOG_DATA = 0x317C,
- CMSG_QUERY_BATTLE_PET_NAME = 0x3284,
- CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x365F,
- CMSG_QUERY_CORPSE_TRANSPORT = 0x3660,
+ CMSG_QUERY_BATTLE_PET_NAME = 0x328A,
+ CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3660,
+ CMSG_QUERY_CORPSE_TRANSPORT = 0x3661,
CMSG_QUERY_COUNTDOWN_TIMER = 0x31AA,
- CMSG_QUERY_CREATURE = 0x327E,
- CMSG_QUERY_GAME_OBJECT = 0x327F,
- CMSG_QUERY_GARRISON_PET_NAME = 0x3285,
- CMSG_QUERY_GUILD_INFO = 0x3689,
+ CMSG_QUERY_CREATURE = 0x3284,
+ CMSG_QUERY_GAME_OBJECT = 0x3285,
+ CMSG_QUERY_GARRISON_PET_NAME = 0x328B,
+ CMSG_QUERY_GUILD_INFO = 0x368A,
CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x350E,
- CMSG_QUERY_NEXT_MAIL_TIME = 0x354B,
- CMSG_QUERY_NPC_TEXT = 0x3280,
- CMSG_QUERY_PAGE_TEXT = 0x3282,
- CMSG_QUERY_PETITION = 0x3286,
- CMSG_QUERY_PET_NAME = 0x3283,
+ CMSG_QUERY_NEXT_MAIL_TIME = 0x354C,
+ CMSG_QUERY_NPC_TEXT = 0x3286,
+ CMSG_QUERY_PAGE_TEXT = 0x3288,
+ CMSG_QUERY_PETITION = 0x328C,
+ CMSG_QUERY_PET_NAME = 0x3289,
CMSG_QUERY_PLAYER_NAMES = 0x3772,
CMSG_QUERY_PLAYER_NAMES_FOR_COMMUNITY = 0x3770,
CMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID = 0x376F,
CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3175,
- CMSG_QUERY_QUEST_INFO = 0x3281,
- CMSG_QUERY_REALM_NAME = 0x3688,
- CMSG_QUERY_SCENARIO_POI = 0x3655,
+ CMSG_QUERY_QUEST_INFO = 0x3287,
+ CMSG_QUERY_QUEST_ITEM_USABILITY = 0x3176,
+ CMSG_QUERY_REALM_NAME = 0x3689,
+ CMSG_QUERY_SCENARIO_POI = 0x3656,
CMSG_QUERY_TIME = 0x34E3,
- CMSG_QUERY_TREASURE_PICKER = 0x3367,
+ CMSG_QUERY_TREASURE_PICKER = 0x3370,
CMSG_QUERY_VOID_STORAGE = 0x31A3,
CMSG_QUEST_CONFIRM_ACCEPT = 0x34A4,
CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x349E,
CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x34A0,
- CMSG_QUEST_GIVER_CLOSE_QUEST = 0x355C,
+ CMSG_QUEST_GIVER_CLOSE_QUEST = 0x355D,
CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x349F,
CMSG_QUEST_GIVER_HELLO = 0x349C,
CMSG_QUEST_GIVER_QUERY_QUEST = 0x349D,
CMSG_QUEST_GIVER_REQUEST_REWARD = 0x34A1,
CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x34A3,
CMSG_QUEST_GIVER_STATUS_QUERY = 0x34A2,
- CMSG_QUEST_LOG_REMOVE_QUEST = 0x3540,
- CMSG_QUEST_POI_QUERY = 0x36AC,
+ CMSG_QUEST_LOG_REMOVE_QUEST = 0x3541,
+ CMSG_QUEST_POI_QUERY = 0x36AE,
CMSG_QUEST_PUSH_RESULT = 0x34A6,
- CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x33BF,
- CMSG_QUEST_SESSION_REQUEST_START = 0x33BE,
- CMSG_QUEST_SESSION_REQUEST_STOP = 0x3729,
+ CMSG_QUEST_SESSION_BEGIN_RESPONSE = 0x33C9,
+ CMSG_QUEST_SESSION_REQUEST_START = 0x33C8,
+ CMSG_QUEST_SESSION_REQUEST_STOP = 0x372B,
CMSG_QUEUED_MESSAGES_END = 0x376C,
- CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3702,
- CMSG_QUICK_JOIN_REQUEST_INVITE = 0x3701,
- CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x372E,
- CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x3700,
- CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x36FF,
+ CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3704,
+ CMSG_QUICK_JOIN_REQUEST_INVITE = 0x3703,
+ CMSG_QUICK_JOIN_REQUEST_INVITE_WITH_CONFIRMATION = 0x3730,
+ CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x3702,
+ CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x3701,
CMSG_RAF_CLAIM_ACTIVITY_REWARD = 0x3512,
- CMSG_RAF_CLAIM_NEXT_REWARD = 0x371F,
- CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x3721,
- CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x3720,
- CMSG_RANDOM_ROLL = 0x3653,
+ CMSG_RAF_CLAIM_NEXT_REWARD = 0x3721,
+ CMSG_RAF_GENERATE_RECRUITMENT_LINK = 0x3723,
+ CMSG_RAF_UPDATE_RECRUITMENT_INFO = 0x3722,
+ CMSG_RANDOM_ROLL = 0x3654,
CMSG_READY_CHECK_RESPONSE = 0x3635,
- CMSG_READ_ITEM = 0x3344,
+ CMSG_READ_ITEM = 0x334D,
CMSG_RECLAIM_CORPSE = 0x34E9,
- CMSG_REMOVE_NEW_ITEM = 0x336A,
- CMSG_REMOVE_RAF_RECRUIT = 0x3722,
+ CMSG_REMOVE_NEW_ITEM = 0x3373,
+ CMSG_REMOVE_RAF_RECRUIT = 0x3724,
CMSG_REORDER_CHARACTERS = 0x35E9,
CMSG_REPAIR_ITEM = 0x34FA,
- CMSG_REPLACE_TROPHY = 0x3325,
- CMSG_REPOP_REQUEST = 0x3538,
- CMSG_REPORT_CLIENT_VARIABLES = 0x36FC,
- CMSG_REPORT_ENABLED_ADDONS = 0x36FB,
- CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x36FD,
+ CMSG_REPLACE_TROPHY = 0x332E,
+ CMSG_REPOP_REQUEST = 0x3539,
+ CMSG_REPORT_CLIENT_VARIABLES = 0x36FE,
+ CMSG_REPORT_ENABLED_ADDONS = 0x36FD,
+ CMSG_REPORT_FROZEN_WHILE_LOADING_MAP = 0x36A6,
+ CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x36FF,
CMSG_REPORT_PVP_PLAYER_AFK = 0x3502,
- CMSG_REPORT_SERVER_LAG = 0x33B7,
- CMSG_REPORT_STUCK_IN_COMBAT = 0x33B8,
- CMSG_REQUEST_ACCOUNT_DATA = 0x3693,
- CMSG_REQUEST_AREA_POI_UPDATE = 0x3369,
+ CMSG_REPORT_SERVER_LAG = 0x33C1,
+ CMSG_REPORT_STUCK_IN_COMBAT = 0x33C2,
+ CMSG_REQUEST_ACCOUNT_DATA = 0x3694,
+ CMSG_REQUEST_AREA_POI_UPDATE = 0x3372,
CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DC,
CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317E,
CMSG_REQUEST_CEMETERY_LIST = 0x3177,
- CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x368A,
- CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32C8,
- CMSG_REQUEST_COVENANT_CALLINGS = 0x33A9,
- CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x353C,
- CMSG_REQUEST_FORCED_REACTIONS = 0x320F,
- CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x33E3,
+ CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x368B,
+ CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32D0,
+ CMSG_REQUEST_COVENANT_CALLINGS = 0x33B3,
+ CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x353D,
+ CMSG_REQUEST_FORCED_REACTIONS = 0x320E,
+ CMSG_REQUEST_GARRISON_TALENT_WORLD_QUEST_UNLOCKS = 0x33ED,
CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A9,
CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A8,
- CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x33B9,
- CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x32B7,
- CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x3209,
- CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x320A,
+ CMSG_REQUEST_LATEST_SPLASH_SCREEN = 0x33C3,
+ CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x32BF,
+ CMSG_REQUEST_MYTHIC_PLUS_AFFIXES = 0x3208,
+ CMSG_REQUEST_MYTHIC_PLUS_SEASON_DATA = 0x3209,
CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F7,
- CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3652,
+ CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3653,
CMSG_REQUEST_PET_INFO = 0x3496,
- CMSG_REQUEST_PLAYED_TIME = 0x3289,
+ CMSG_REQUEST_PLAYED_TIME = 0x328F,
CMSG_REQUEST_PVP_REWARDS = 0x3196,
- CMSG_REQUEST_RAID_INFO = 0x36C6,
+ CMSG_REQUEST_RAID_INFO = 0x36C8,
CMSG_REQUEST_RATED_PVP_INFO = 0x35E3,
CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0x309B,
CMSG_REQUEST_RESEARCH_HISTORY = 0x3167,
CMSG_REQUEST_SCHEDULED_PVP_INFO = 0x3197,
CMSG_REQUEST_STABLED_PETS = 0x3497,
- CMSG_REQUEST_VEHICLE_EXIT = 0x3241,
- CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x3243,
- CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3242,
- CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x3244,
- CMSG_REQUEST_WEEKLY_REWARDS = 0x33AC,
- CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3368,
- CMSG_RESET_CHALLENGE_MODE = 0x3207,
- CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3208,
- CMSG_RESET_INSTANCES = 0x3667,
- CMSG_RESURRECT_RESPONSE = 0x3682,
- CMSG_REVERT_MONUMENT_APPEARANCE = 0x3327,
- CMSG_RIDE_VEHICLE_INTERACT = 0x3245,
+ CMSG_REQUEST_VEHICLE_EXIT = 0x3244,
+ CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x3246,
+ CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3245,
+ CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x3247,
+ CMSG_REQUEST_WEEKLY_REWARDS = 0x33B6,
+ CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3371,
+ CMSG_RESET_CHALLENGE_MODE = 0x3206,
+ CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3207,
+ CMSG_RESET_INSTANCES = 0x3668,
+ CMSG_RESURRECT_RESPONSE = 0x3683,
+ CMSG_REVERT_MONUMENT_APPEARANCE = 0x3330,
+ CMSG_RIDE_VEHICLE_INTERACT = 0x3248,
CMSG_SAVE_CUF_PROFILES = 0x318C,
CMSG_SAVE_EQUIPMENT_SET = 0x3518,
- CMSG_SAVE_GUILD_EMBLEM = 0x32BB,
- CMSG_SCENE_PLAYBACK_CANCELED = 0x3228,
- CMSG_SCENE_PLAYBACK_COMPLETE = 0x3227,
- CMSG_SCENE_TRIGGER_EVENT = 0x3229,
- CMSG_SELF_RES = 0x3543,
+ CMSG_SAVE_GUILD_EMBLEM = 0x32C3,
+ CMSG_SCENE_PLAYBACK_CANCELED = 0x322B,
+ CMSG_SCENE_PLAYBACK_COMPLETE = 0x322A,
+ CMSG_SCENE_TRIGGER_EVENT = 0x322C,
+ CMSG_SELF_RES = 0x3544,
CMSG_SELL_ITEM = 0x34A8,
- CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x36F5,
- CMSG_SEND_CONTACT_LIST = 0x36CB,
+ CMSG_SEND_CHARACTER_CLUB_INVITATION = 0x36F7,
+ CMSG_SEND_CONTACT_LIST = 0x36CD,
CMSG_SEND_MAIL = 0x35FA,
CMSG_SEND_TEXT_EMOTE = 0x348E,
- CMSG_SERVER_TIME_OFFSET_REQUEST = 0x3699,
- CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x322E,
- CMSG_SET_ACTION_BAR_TOGGLES = 0x3544,
+ CMSG_SERVER_TIME_OFFSET_REQUEST = 0x369B,
+ CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x3231,
+ CMSG_SET_ACTION_BAR_TOGGLES = 0x3545,
CMSG_SET_ACTION_BUTTON = 0x3636,
- CMSG_SET_ACTIVE_MOVER = 0x3A3D,
- CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32C9,
- CMSG_SET_ASSISTANT_LEADER = 0x364E,
- CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3347,
- CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3348,
- CMSG_SET_CHAT_DISABLED = 0x3735,
- CMSG_SET_CONTACT_NOTES = 0x36CE,
+ CMSG_SET_ACTIVE_MOVER = 0x3A3C,
+ CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32D1,
+ CMSG_SET_ASSISTANT_LEADER = 0x364F,
+ CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3350,
+ CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3351,
+ CMSG_SET_CONTACT_NOTES = 0x36D0,
CMSG_SET_CURRENCY_FLAGS = 0x3169,
- CMSG_SET_DIFFICULTY_ID = 0x322A,
- CMSG_SET_DUNGEON_DIFFICULTY = 0x3681,
+ CMSG_SET_DIFFICULTY_ID = 0x322D,
+ CMSG_SET_DUNGEON_DIFFICULTY = 0x3682,
+ CMSG_SET_EMPOWER_MIN_HOLD_STAGE_PERCENT = 0x327E,
CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3618,
CMSG_SET_FACTION_AT_WAR = 0x34EC,
CMSG_SET_FACTION_INACTIVE = 0x34EE,
CMSG_SET_FACTION_NOT_AT_WAR = 0x34ED,
CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x31BA,
- CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x334A,
- CMSG_SET_LOOT_METHOD = 0x3647,
- CMSG_SET_LOOT_SPECIALIZATION = 0x3551,
- CMSG_SET_PARTY_ASSIGNMENT = 0x3650,
- CMSG_SET_PARTY_LEADER = 0x3649,
+ CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3353,
+ CMSG_SET_LOOT_METHOD = 0x3648,
+ CMSG_SET_LOOT_SPECIALIZATION = 0x3552,
+ CMSG_SET_PARTY_ASSIGNMENT = 0x3651,
+ CMSG_SET_PARTY_LEADER = 0x364A,
CMSG_SET_PET_SLOT = 0x3168,
- CMSG_SET_PLAYER_DECLINED_NAMES = 0x3687,
+ CMSG_SET_PLAYER_DECLINED_NAMES = 0x3688,
CMSG_SET_PREFERRED_CEMETERY = 0x3178,
- CMSG_SET_PVP = 0x32BF,
- CMSG_SET_RAID_DIFFICULTY = 0x36D7,
+ CMSG_SET_PVP = 0x32C7,
+ CMSG_SET_RAID_DIFFICULTY = 0x36D9,
CMSG_SET_ROLE = 0x35D9,
- CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3685,
- CMSG_SET_SELECTION = 0x353A,
+ CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3686,
+ CMSG_SET_SELECTION = 0x353B,
CMSG_SET_SHEATHED = 0x348F,
- CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3349,
+ CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3352,
CMSG_SET_TAXI_BENCHMARK_MODE = 0x3501,
- CMSG_SET_TITLE = 0x328F,
+ CMSG_SET_TITLE = 0x3295,
CMSG_SET_TRADE_CURRENCY = 0x3160,
CMSG_SET_TRADE_GOLD = 0x315F,
CMSG_SET_TRADE_ITEM = 0x315D,
- CMSG_SET_USING_PARTY_GARRISON = 0x3309,
- CMSG_SET_WAR_MODE = 0x32C0,
+ CMSG_SET_USING_PARTY_GARRISON = 0x3311,
+ CMSG_SET_WAR_MODE = 0x32C8,
CMSG_SET_WATCHED_FACTION = 0x34EF,
- CMSG_SHOW_TRADE_SKILL = 0x36BE,
- CMSG_SIGN_PETITION = 0x3545,
- CMSG_SILENCE_PARTY_TALKER = 0x3651,
- CMSG_SOCIAL_CONTRACT_REQUEST = 0x373A,
+ CMSG_SHOW_TRADE_SKILL = 0x36C0,
+ CMSG_SIGN_PETITION = 0x3546,
+ CMSG_SILENCE_PARTY_TALKER = 0x3652,
+ CMSG_SOCIAL_CONTRACT_REQUEST = 0x373D,
CMSG_SOCKET_GEMS = 0x34F9,
- CMSG_SORT_BAGS = 0x334B,
- CMSG_SORT_BANK_BAGS = 0x334C,
- CMSG_SORT_REAGENT_BANK_BAGS = 0x334D,
+ CMSG_SORT_BAGS = 0x3354,
+ CMSG_SORT_BANK_BAGS = 0x3355,
+ CMSG_SORT_REAGENT_BANK_BAGS = 0x3356,
CMSG_SPELL_CLICK = 0x349B,
+ CMSG_SPELL_EMPOWER_RELEASE = 0x327C,
+ CMSG_SPELL_EMPOWER_RESTART = 0x327D,
CMSG_SPIRIT_HEALER_ACTIVATE = 0x34B5,
CMSG_SPLIT_GUILD_BANK_ITEM = 0x34C8,
CMSG_SPLIT_GUILD_BANK_ITEM_TO_INVENTORY = 0x34C5,
CMSG_SPLIT_ITEM = 0x399E,
CMSG_SPLIT_ITEM_TO_GUILD_BANK = 0x34C3,
CMSG_STAND_STATE_CHANGE = 0x318A,
- CMSG_START_CHALLENGE_MODE = 0x355D,
+ CMSG_START_CHALLENGE_MODE = 0x355E,
CMSG_START_SPECTATOR_WAR_GAME = 0x35DF,
CMSG_START_WAR_GAME = 0x35DE,
CMSG_STORE_GUILD_BANK_ITEM = 0x34BE,
- CMSG_SUBMIT_USER_FEEDBACK = 0x3692,
- CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x33D8,
- CMSG_SUMMON_RESPONSE = 0x3669,
- CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3645,
+ CMSG_SUBMIT_USER_FEEDBACK = 0x3693,
+ CMSG_SUBSCRIPTION_INTERSTITIAL_RESPONSE = 0x33E2,
+ CMSG_SUMMON_RESPONSE = 0x366A,
+ CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3646,
CMSG_SURRENDER_ARENA = 0x3174,
CMSG_SUSPEND_COMMS_ACK = 0x3764,
CMSG_SUSPEND_TOKEN_RESPONSE = 0x376A,
@@ -780,148 +819,150 @@ enum OpcodeClient : uint16
CMSG_SWAP_INV_ITEM = 0x399D,
CMSG_SWAP_ITEM = 0x399C,
CMSG_SWAP_ITEM_WITH_GUILD_BANK_ITEM = 0x34BF,
- CMSG_SWAP_SUB_GROUPS = 0x364C,
+ CMSG_SWAP_SUB_GROUPS = 0x364D,
CMSG_SWAP_VOID_ITEM = 0x31A5,
- CMSG_TABARD_VENDOR_ACTIVATE = 0x32BC,
+ CMSG_TABARD_VENDOR_ACTIVATE = 0x32C4,
CMSG_TALK_TO_GOSSIP = 0x3498,
CMSG_TAXI_NODE_STATUS_QUERY = 0x34AE,
CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34B0,
CMSG_TAXI_REQUEST_EARLY_LANDING = 0x34B2,
- CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A41,
- CMSG_TIME_SYNC_RESPONSE = 0x3A3E,
- CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A40,
- CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A3F,
- CMSG_TOGGLE_DIFFICULTY = 0x3656,
- CMSG_TOGGLE_PVP = 0x32BE,
+ CMSG_TIME_ADJUSTMENT_RESPONSE = 0x3A40,
+ CMSG_TIME_SYNC_RESPONSE = 0x3A3D,
+ CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3F,
+ CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A3E,
+ CMSG_TOGGLE_DIFFICULTY = 0x3657,
+ CMSG_TOGGLE_PVP = 0x32C6,
CMSG_TOTEM_DESTROYED = 0x3506,
CMSG_TOY_CLEAR_FANFARE = 0x312E,
- CMSG_TRADE_SKILL_SET_FAVORITE = 0x3366,
+ CMSG_TRADE_SKILL_SET_FAVORITE = 0x336F,
CMSG_TRAINER_BUY_SPELL = 0x34B4,
CMSG_TRAINER_LIST = 0x34B3,
+ CMSG_TRAITS_COMMIT_CONFIG = 0x3401,
+ CMSG_TRAITS_TALENT_TEST_UNLEARN_SPELLS = 0x33FF,
CMSG_TRANSMOGRIFY_ITEMS = 0x3198,
- CMSG_TURN_IN_PETITION = 0x3547,
- CMSG_TUTORIAL = 0x36D8,
+ CMSG_TURN_IN_PETITION = 0x3548,
+ CMSG_TUTORIAL = 0x36DA,
CMSG_TWITTER_CHECK_STATUS = 0x312A,
CMSG_TWITTER_CONNECT = 0x3127,
CMSG_TWITTER_DISCONNECT = 0x312B,
- CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x33A8,
+ CMSG_UI_MAP_QUEST_LINES_REQUEST = 0x33B2,
CMSG_UNACCEPT_TRADE = 0x315B,
- CMSG_UNDELETE_CHARACTER = 0x36DA,
+ CMSG_UNDELETE_CHARACTER = 0x36DC,
CMSG_UNLEARN_SKILL = 0x34F3,
CMSG_UNLEARN_SPECIALIZATION = 0x31A6,
CMSG_UNLOCK_VOID_STORAGE = 0x31A2,
- CMSG_UPDATE_ACCOUNT_DATA = 0x3694,
- CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x32AE,
- CMSG_UPDATE_CLIENT_SETTINGS = 0x3663,
- CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A44,
- CMSG_UPDATE_RAID_TARGET = 0x364F,
- CMSG_UPDATE_SPELL_VISUAL = 0x32AD,
- CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36EF,
- CMSG_UPGRADE_GARRISON = 0x32D1,
- CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x33D6,
+ CMSG_UPDATE_AADC_STATUS = 0x3737,
+ CMSG_UPDATE_ACCOUNT_DATA = 0x3695,
+ CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x32B6,
+ CMSG_UPDATE_CLIENT_SETTINGS = 0x3664,
+ CMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x3323,
+ CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A43,
+ CMSG_UPDATE_RAID_TARGET = 0x3650,
+ CMSG_UPDATE_SPELL_VISUAL = 0x32B5,
+ CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F1,
+ CMSG_UPGRADE_GARRISON = 0x32D9,
+ CMSG_UPGRADE_RUNEFORGE_LEGENDARY = 0x33E0,
CMSG_USED_FOLLOW = 0x3187,
- CMSG_USE_CRITTER_ITEM = 0x324B,
+ CMSG_USE_CRITTER_ITEM = 0x324E,
CMSG_USE_EQUIPMENT_SET = 0x3995,
- CMSG_USE_ITEM = 0x32A7,
- CMSG_USE_TOY = 0x32AA,
- CMSG_VAS_CHECK_TRANSFER_OK = 0x3707,
- CMSG_VAS_GET_QUEUE_MINUTES = 0x3706,
- CMSG_VAS_GET_SERVICE_STATUS = 0x3705,
+ CMSG_USE_ITEM = 0x32AF,
+ CMSG_USE_TOY = 0x32B2,
+ CMSG_VAS_CHECK_TRANSFER_OK = 0x3709,
+ CMSG_VAS_GET_QUEUE_MINUTES = 0x3708,
+ CMSG_VAS_GET_SERVICE_STATUS = 0x3707,
CMSG_VIOLENCE_LEVEL = 0x3185,
- CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST = 0x370B,
- CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x370C,
- CMSG_VOICE_CHAT_LOGIN = 0x370A,
+ CMSG_VOICE_CHANNEL_STT_TOKEN_REQUEST = 0x370D,
+ CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x370E,
+ CMSG_VOICE_CHAT_LOGIN = 0x370C,
CMSG_VOID_STORAGE_TRANSFER = 0x31A4,
CMSG_WARDEN3_DATA = 0x35EC,
- CMSG_WHO = 0x3680,
- CMSG_WHO_IS = 0x367F,
+ CMSG_WHO = 0x3681,
+ CMSG_WHO_IS = 0x3680,
CMSG_WORLD_PORT_RESPONSE = 0x35F9,
CMSG_WRAP_ITEM = 0x3994,
};
enum OpcodeServer : uint16
{
- SMSG_ABORT_NEW_WORLD = 0x259A,
- SMSG_ACCOUNT_COSMETIC_ADDED = 0x2872,
- SMSG_ACCOUNT_CRITERIA_UPDATE = 0x2858,
- SMSG_ACCOUNT_DATA_TIMES = 0x26FE,
- SMSG_ACCOUNT_MOUNT_UPDATE = 0x25AC,
- SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE = 0x2871,
- SMSG_ACCOUNT_TOY_UPDATE = 0x25AD,
- SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x25B0,
- SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x25AF,
- SMSG_ACHIEVEMENT_DELETED = 0x26DD,
- SMSG_ACHIEVEMENT_EARNED = 0x263B,
+ SMSG_ABORT_NEW_WORLD = 0x259C,
+ SMSG_ACCOUNT_COSMETIC_ADDED = 0x287B,
+ SMSG_ACCOUNT_CRITERIA_UPDATE = 0x2861,
+ SMSG_ACCOUNT_DATA_TIMES = 0x2704,
+ SMSG_ACCOUNT_MOUNT_UPDATE = 0x25AF,
+ SMSG_ACCOUNT_NOTIFICATIONS_RESPONSE = 0x287A,
+ SMSG_ACCOUNT_TOY_UPDATE = 0x25B0,
+ SMSG_ACCOUNT_TRANSMOG_SET_FAVORITES_UPDATE = 0x25B3,
+ SMSG_ACCOUNT_TRANSMOG_UPDATE = 0x25B2,
+ SMSG_ACHIEVEMENT_DELETED = 0x26E2,
+ SMSG_ACHIEVEMENT_EARNED = 0x2640,
SMSG_ACTIVATE_ESSENCE_FAILED = 0x3015,
SMSG_ACTIVATE_SOULBIND_FAILED = 0x3017,
- SMSG_ACTIVATE_TAXI_REPLY = 0x2675,
- SMSG_ACTIVE_GLYPHS = 0x2C54,
- SMSG_ADDON_LIST_REQUEST = 0x263A,
- SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x2635,
- SMSG_ADD_ITEM_PASSIVE = 0x25A8,
- SMSG_ADD_LOSS_OF_CONTROL = 0x2669,
- SMSG_ADD_RUNE_POWER = 0x26AF,
- SMSG_ADJUST_SPLINE_DURATION = 0x25CC,
- SMSG_ADVANCED_COMBAT_LOG = 0x286E,
- SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x2868,
- SMSG_ADVENTURE_MAP_OPEN_NPC = 0x27E5,
- SMSG_AE_LOOT_TARGETS = 0x2610,
- SMSG_AE_LOOT_TARGET_ACK = 0x2611,
- SMSG_AI_REACTION = 0x26AC,
- SMSG_ALLIED_RACE_DETAILS = 0x27EB,
+ SMSG_ACTIVATE_TAXI_REPLY = 0x267A,
+ SMSG_ACTIVE_GLYPHS = 0x2C57,
+ SMSG_ADDON_LIST_REQUEST = 0x263F,
+ SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x263A,
+ SMSG_ADD_ITEM_PASSIVE = 0x25AB,
+ SMSG_ADD_LOSS_OF_CONTROL = 0x266E,
+ SMSG_ADD_RUNE_POWER = 0x26B4,
+ SMSG_ADJUST_SPLINE_DURATION = 0x25CF,
+ SMSG_ADVANCED_COMBAT_LOG = 0x2877,
+ SMSG_ADVENTURE_JOURNAL_DATA_RESPONSE = 0x2871,
+ SMSG_AE_LOOT_TARGETS = 0x2615,
+ SMSG_AE_LOOT_TARGET_ACK = 0x2616,
+ SMSG_AI_REACTION = 0x26B1,
+ SMSG_ALLIED_RACE_DETAILS = 0x27F4,
SMSG_ALL_ACCOUNT_CRITERIA = 0x2571,
SMSG_ALL_ACHIEVEMENT_DATA = 0x2570,
SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8,
- SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x2845,
+ SMSG_APPLY_MOUNT_EQUIPMENT_RESULT = 0x284E,
SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2588,
SMSG_AREA_POI_UPDATE_RESPONSE = 0x3010,
- SMSG_AREA_SPIRIT_HEALER_TIME = 0x2733,
+ SMSG_AREA_SPIRIT_HEALER_TIME = 0x2739,
SMSG_AREA_TRIGGER_DENIED = 0x2902,
SMSG_AREA_TRIGGER_FORCE_SET_POSITION_AND_FACING = 0x28FF,
- SMSG_AREA_TRIGGER_NO_CORPSE = 0x270A,
+ SMSG_AREA_TRIGGER_NO_CORPSE = 0x2710,
SMSG_AREA_TRIGGER_PLAY_SPELL_VISUAL = 0x28FE,
SMSG_AREA_TRIGGER_RE_PATH = 0x28FD,
SMSG_AREA_TRIGGER_RE_SHAPE = 0x2901,
SMSG_AREA_TRIGGER_UNATTACH = 0x2900,
- SMSG_ARENA_CLEAR_OPPONENTS = 0x2641,
- SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x262A,
- SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2640,
- SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x2796,
- SMSG_ARTIFACT_FORGE_ERROR = 0x2794,
- SMSG_ARTIFACT_RESPEC_PROMPT = 0x2795,
- SMSG_ARTIFACT_XP_GAIN = 0x27DE,
+ SMSG_ARENA_CLEAR_OPPONENTS = 0x2646,
+ SMSG_ARENA_CROWD_CONTROL_SPELL_RESULT = 0x262F,
+ SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2645,
+ SMSG_ARTIFACT_ENDGAME_POWERS_REFUNDED = 0x279E,
+ SMSG_ARTIFACT_FORGE_ERROR = 0x279C,
+ SMSG_ARTIFACT_RESPEC_PROMPT = 0x279D,
+ SMSG_ARTIFACT_XP_GAIN = 0x27E7,
SMSG_ATTACKER_STATE_UPDATE = 0x294D,
SMSG_ATTACK_START = 0x2938,
SMSG_ATTACK_STOP = 0x2939,
SMSG_ATTACK_SWING_ERROR = 0x2947,
SMSG_ATTACK_SWING_LANDED_LOG = 0x2948,
- SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x27C7,
- SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x27C6,
- SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x27C5,
- SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26E7,
- SMSG_AUCTION_COMMAND_RESULT = 0x26E4,
- SMSG_AUCTION_DISABLE_POSTING_BEFORE_MAINTENANCE = 0x287F,
- SMSG_AUCTION_FAVORITE_LIST = 0x285F,
- SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x2856,
- SMSG_AUCTION_HELLO_RESPONSE = 0x26E2,
- SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x2855,
- SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x2852,
- SMSG_AUCTION_LIST_ITEMS_RESULT = 0x2853,
- SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x2854,
- SMSG_AUCTION_OUTBID_NOTIFICATION = 0x26E6,
- SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x26E8,
- SMSG_AUCTION_REPLICATE_RESPONSE = 0x26E3,
- SMSG_AUCTION_WON_NOTIFICATION = 0x26E5,
+ SMSG_AUCTIONABLE_TOKEN_AUCTION_SOLD = 0x27D0,
+ SMSG_AUCTIONABLE_TOKEN_SELL_AT_MARKET_PRICE_RESPONSE = 0x27CF,
+ SMSG_AUCTIONABLE_TOKEN_SELL_CONFIRM_REQUIRED = 0x27CE,
+ SMSG_AUCTION_CLOSED_NOTIFICATION = 0x26ED,
+ SMSG_AUCTION_COMMAND_RESULT = 0x26EA,
+ SMSG_AUCTION_DISABLE_NEW_POSTINGS = 0x288D,
+ SMSG_AUCTION_FAVORITE_LIST = 0x2868,
+ SMSG_AUCTION_GET_COMMODITY_QUOTE_RESULT = 0x285F,
+ SMSG_AUCTION_HELLO_RESPONSE = 0x26E8,
+ SMSG_AUCTION_LIST_BIDDED_ITEMS_RESULT = 0x285E,
+ SMSG_AUCTION_LIST_BUCKETS_RESULT = 0x285B,
+ SMSG_AUCTION_LIST_ITEMS_RESULT = 0x285C,
+ SMSG_AUCTION_LIST_OWNED_ITEMS_RESULT = 0x285D,
+ SMSG_AUCTION_OUTBID_NOTIFICATION = 0x26EC,
+ SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x26EE,
+ SMSG_AUCTION_REPLICATE_RESPONSE = 0x26E9,
+ SMSG_AUCTION_WON_NOTIFICATION = 0x26EB,
SMSG_AURA_POINTS_DEPLETED = 0x2C23,
SMSG_AURA_UPDATE = 0x2C22,
SMSG_AUTH_CHALLENGE = 0x3048,
SMSG_AUTH_FAILED = 0x256C,
SMSG_AUTH_RESPONSE = 0x256D,
SMSG_AVAILABLE_HOTFIXES = 0x290F,
- SMSG_AZERITE_RESPEC_NPC = 0x27E8,
SMSG_BAG_CLEANUP_FINISHED = 0x2DA7,
- SMSG_BARBER_SHOP_RESULT = 0x26B4,
- SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x2836,
+ SMSG_BARBER_SHOP_RESULT = 0x26B9,
+ SMSG_BATCH_PRESENCE_SUBSCRIPTION = 0x283F,
SMSG_BATTLEFIELD_LIST = 0x2927,
SMSG_BATTLEFIELD_PORT_DENIED = 0x292D,
SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2923,
@@ -937,113 +978,112 @@ enum OpcodeServer : uint16
SMSG_BATTLEGROUND_PLAYER_LEFT = 0x292C,
SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2928,
SMSG_BATTLEGROUND_POINTS = 0x2949,
- SMSG_BATTLENET_CHALLENGE_ABORT = 0x277D,
- SMSG_BATTLENET_CHALLENGE_START = 0x277C,
- SMSG_BATTLENET_NOTIFICATION = 0x27F6,
- SMSG_BATTLENET_RESPONSE = 0x27F5,
- SMSG_BATTLE_NET_CONNECTION_STATUS = 0x27F7,
- SMSG_BATTLE_PAY_ACK_FAILED = 0x2777,
- SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x276C,
- SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x276D,
- SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x2776,
- SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x276A,
- SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x2769,
- SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE = 0x2877,
- SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x2767,
- SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x2768,
- SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x2766,
- SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x2764,
- SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x2765,
- SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x276B,
- SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x2775,
- SMSG_BATTLE_PAY_START_CHECKOUT = 0x2812,
- SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x2773,
- SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x2772,
- SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x2806,
- SMSG_BATTLE_PETS_HEALED = 0x25EC,
- SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x2670,
- SMSG_BATTLE_PET_DELETED = 0x25E9,
- SMSG_BATTLE_PET_ERROR = 0x2630,
- SMSG_BATTLE_PET_JOURNAL = 0x25E8,
- SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x25E6,
- SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x25E7,
- SMSG_BATTLE_PET_LICENSE_CHANGED = 0x25ED,
- SMSG_BATTLE_PET_RESTORED = 0x25EB,
- SMSG_BATTLE_PET_REVOKED = 0x25EA,
- SMSG_BATTLE_PET_TRAP_LEVEL = 0x25E4,
- SMSG_BATTLE_PET_UPDATES = 0x25E3,
- SMSG_BINDER_CONFIRM = 0x26F1,
+ SMSG_BATTLENET_CHALLENGE_ABORT = 0x2783,
+ SMSG_BATTLENET_CHALLENGE_START = 0x2782,
+ SMSG_BATTLENET_NOTIFICATION = 0x2800,
+ SMSG_BATTLENET_RESPONSE = 0x27FF,
+ SMSG_BATTLE_NET_CONNECTION_STATUS = 0x2801,
+ SMSG_BATTLE_PAY_ACK_FAILED = 0x277D,
+ SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x2772,
+ SMSG_BATTLE_PAY_COLLECTION_ITEM_DELIVERED = 0x2773,
+ SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x277C,
+ SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x2770,
+ SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x276F,
+ SMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_VAS_RESPONSE = 0x2880,
+ SMSG_BATTLE_PAY_DISTRIBUTION_UNREVOKED = 0x276D,
+ SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x276E,
+ SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x276C,
+ SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x276A,
+ SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x276B,
+ SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x2771,
+ SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x277B,
+ SMSG_BATTLE_PAY_START_CHECKOUT = 0x281C,
+ SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x2779,
+ SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x2778,
+ SMSG_BATTLE_PAY_VALIDATE_PURCHASE_RESPONSE = 0x2810,
+ SMSG_BATTLE_PETS_HEALED = 0x25F1,
+ SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x2675,
+ SMSG_BATTLE_PET_DELETED = 0x25EE,
+ SMSG_BATTLE_PET_ERROR = 0x2635,
+ SMSG_BATTLE_PET_JOURNAL = 0x25ED,
+ SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x25EB,
+ SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x25EC,
+ SMSG_BATTLE_PET_LICENSE_CHANGED = 0x25F2,
+ SMSG_BATTLE_PET_RESTORED = 0x25F0,
+ SMSG_BATTLE_PET_REVOKED = 0x25EF,
+ SMSG_BATTLE_PET_TRAP_LEVEL = 0x25E9,
+ SMSG_BATTLE_PET_UPDATES = 0x25E8,
SMSG_BIND_POINT_UPDATE = 0x257D,
- SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2620,
- SMSG_BLACK_MARKET_OPEN_RESULT = 0x261E,
- SMSG_BLACK_MARKET_OUTBID = 0x2621,
- SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x261F,
- SMSG_BLACK_MARKET_WON = 0x2622,
- SMSG_BONUS_ROLL_EMPTY = 0x263D,
+ SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2625,
+ SMSG_BLACK_MARKET_OUTBID = 0x2626,
+ SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2624,
+ SMSG_BLACK_MARKET_WON = 0x2627,
+ SMSG_BONUS_ROLL_EMPTY = 0x2642,
SMSG_BOSS_KILL = 0x294C,
SMSG_BREAK_TARGET = 0x2937,
SMSG_BROADCAST_ACHIEVEMENT = 0x2BBC,
- SMSG_BROADCAST_SUMMON_CAST = 0x2838,
- SMSG_BROADCAST_SUMMON_RESPONSE = 0x2839,
- SMSG_BUY_FAILED = 0x26BD,
- SMSG_BUY_SUCCEEDED = 0x26BC,
+ SMSG_BROADCAST_SUMMON_CAST = 0x2841,
+ SMSG_BROADCAST_SUMMON_RESPONSE = 0x2842,
+ SMSG_BUY_FAILED = 0x26C2,
+ SMSG_BUY_SUCCEEDED = 0x26C1,
SMSG_CACHE_INFO = 0x291D,
SMSG_CACHE_VERSION = 0x291C,
- SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x2695,
- SMSG_CALENDAR_COMMAND_RESULT = 0x2696,
- SMSG_CALENDAR_COMMUNITY_INVITE = 0x2685,
- SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x268D,
- SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x268E,
- SMSG_CALENDAR_INVITE_ADDED = 0x2686,
- SMSG_CALENDAR_INVITE_ALERT = 0x268A,
- SMSG_CALENDAR_INVITE_NOTES = 0x268F,
- SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x2690,
- SMSG_CALENDAR_INVITE_REMOVED = 0x2687,
- SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x268C,
- SMSG_CALENDAR_INVITE_STATUS = 0x2688,
- SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x268B,
- SMSG_CALENDAR_MODERATOR_STATUS = 0x2689,
- SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x2691,
- SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x2692,
- SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x2693,
- SMSG_CALENDAR_SEND_CALENDAR = 0x2683,
- SMSG_CALENDAR_SEND_EVENT = 0x2684,
- SMSG_CALENDAR_SEND_NUM_PENDING = 0x2694,
- SMSG_CAMERA_EFFECT = 0x2719,
- SMSG_CANCEL_AUTO_REPEAT = 0x26D3,
+ SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x269A,
+ SMSG_CALENDAR_COMMAND_RESULT = 0x269B,
+ SMSG_CALENDAR_COMMUNITY_INVITE = 0x268A,
+ SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x2692,
+ SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x2693,
+ SMSG_CALENDAR_INVITE_ADDED = 0x268B,
+ SMSG_CALENDAR_INVITE_ALERT = 0x268F,
+ SMSG_CALENDAR_INVITE_NOTES = 0x2694,
+ SMSG_CALENDAR_INVITE_NOTES_ALERT = 0x2695,
+ SMSG_CALENDAR_INVITE_REMOVED = 0x268C,
+ SMSG_CALENDAR_INVITE_REMOVED_ALERT = 0x2691,
+ SMSG_CALENDAR_INVITE_STATUS = 0x268D,
+ SMSG_CALENDAR_INVITE_STATUS_ALERT = 0x2690,
+ SMSG_CALENDAR_MODERATOR_STATUS = 0x268E,
+ SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x2696,
+ SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x2697,
+ SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x2698,
+ SMSG_CALENDAR_SEND_CALENDAR = 0x2688,
+ SMSG_CALENDAR_SEND_EVENT = 0x2689,
+ SMSG_CALENDAR_SEND_NUM_PENDING = 0x2699,
+ SMSG_CAMERA_EFFECT = 0x271F,
+ SMSG_CANCEL_AUTO_REPEAT = 0x26D8,
SMSG_CANCEL_COMBAT = 0x2946,
- SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C46,
- SMSG_CANCEL_SCENE = 0x262F,
- SMSG_CANCEL_SPELL_VISUAL = 0x2C44,
- SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C48,
+ SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C49,
+ SMSG_CANCEL_PRELOAD_WORLD = 0x259A,
+ SMSG_CANCEL_SCENE = 0x2634,
+ SMSG_CANCEL_SPELL_VISUAL = 0x2C47,
+ SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C4B,
SMSG_CAN_DUEL_RESULT = 0x2942,
- SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x2805,
+ SMSG_CAN_REDEEM_TOKEN_FOR_BALANCE_RESPONSE = 0x280F,
SMSG_CAPTURE_POINT_REMOVED = 0x292A,
- SMSG_CAST_FAILED = 0x2C57,
+ SMSG_CAST_FAILED = 0x2C5A,
SMSG_CATEGORY_COOLDOWN = 0x2C16,
- SMSG_CHAIN_MISSILE_BOUNCE = 0x25C4,
- SMSG_CHALLENGE_MODE_COMPLETE = 0x2604,
- SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2608,
- SMSG_CHALLENGE_MODE_RESET = 0x2603,
- SMSG_CHALLENGE_MODE_START = 0x2601,
- SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x2602,
+ SMSG_CHAIN_MISSILE_BOUNCE = 0x25C7,
+ SMSG_CHALLENGE_MODE_COMPLETE = 0x2609,
+ SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x260D,
+ SMSG_CHALLENGE_MODE_RESET = 0x2608,
+ SMSG_CHALLENGE_MODE_START = 0x2606,
+ SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x2607,
SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x3004,
- SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x27F8,
+ SMSG_CHANGE_REALM_TICKET_RESPONSE = 0x2802,
SMSG_CHANNEL_LIST = 0x2BC3,
SMSG_CHANNEL_NOTIFY = 0x2BC0,
SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC1,
SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC2,
- SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x27B0,
- SMSG_CHARACTER_LOGIN_FAILED = 0x26F9,
- SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x277B,
- SMSG_CHARACTER_RENAME_RESULT = 0x2756,
- SMSG_CHARACTER_UPGRADE_ABORTED = 0x27AF,
- SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27AE,
- SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x27B1,
- SMSG_CHARACTER_UPGRADE_STARTED = 0x27AD,
- SMSG_CHAR_CUSTOMIZE_FAILURE = 0x26D7,
- SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x26D8,
- SMSG_CHAR_FACTION_CHANGE_RESULT = 0x279A,
+ SMSG_CHARACTER_CHECK_UPGRADE_RESULT = 0x27B9,
+ SMSG_CHARACTER_LOGIN_FAILED = 0x26FF,
+ SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x2781,
+ SMSG_CHARACTER_RENAME_RESULT = 0x275C,
+ SMSG_CHARACTER_UPGRADE_ABORTED = 0x27B8,
+ SMSG_CHARACTER_UPGRADE_COMPLETE = 0x27B7,
+ SMSG_CHARACTER_UPGRADE_MANUAL_UNREVOKE_RESULT = 0x27BA,
+ SMSG_CHARACTER_UPGRADE_STARTED = 0x27B6,
+ SMSG_CHAR_CUSTOMIZE_FAILURE = 0x26DC,
+ SMSG_CHAR_CUSTOMIZE_SUCCESS = 0x26DD,
+ SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27A3,
SMSG_CHAT = 0x2BAD,
SMSG_CHAT_AUTO_RESPONDED = 0x2BB8,
SMSG_CHAT_DOWN = 0x2BBD,
@@ -1060,88 +1100,95 @@ enum OpcodeServer : uint16
SMSG_CHECK_ABANDON_NPE = 0x3018,
SMSG_CHECK_CHARACTER_NAME_AVAILABILITY_RESULT = 0x2584,
SMSG_CHECK_WARGAME_ENTRY = 0x2592,
- SMSG_CHROMIE_TIME_OPEN_NPC = 0x27ED,
- SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x2862,
- SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x2849,
+ SMSG_CHROMIE_TIME_SELECT_EXPANSION_SUCCESS = 0x286B,
+ SMSG_CLAIM_RAF_REWARD_RESPONSE = 0x2852,
SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C27,
- SMSG_CLEAR_BOSS_EMOTES = 0x25B7,
- SMSG_CLEAR_COOLDOWN = 0x26B1,
+ SMSG_CLEAR_BOSS_EMOTES = 0x25BA,
+ SMSG_CLEAR_COOLDOWN = 0x26B6,
SMSG_CLEAR_COOLDOWNS = 0x2C26,
SMSG_CLEAR_RESURRECT = 0x257F,
SMSG_CLEAR_SPELL_CHARGES = 0x2C28,
SMSG_CLEAR_TARGET = 0x2943,
SMSG_CLEAR_TREASURE_PICKER_CACHE = 0x2AA1,
- SMSG_CLOSE_ARTIFACT_FORGE = 0x2793,
- SMSG_CLOSE_HEART_FORGE = 0x2818,
- SMSG_CLOSE_ITEM_FORGE = 0x2791,
- SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x2841,
- SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x2844,
- SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x2842,
- SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x283F,
- SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x2843,
- SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x2840,
- SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x287A,
- SMSG_COIN_REMOVED = 0x260F,
+ SMSG_CLOSE_ARTIFACT_FORGE = 0x279B,
+ SMSG_CLUB_FINDER_ERROR_MESSAGE = 0x284A,
+ SMSG_CLUB_FINDER_GET_CLUB_POSTING_IDS_RESPONSE = 0x284D,
+ SMSG_CLUB_FINDER_LOOKUP_CLUB_POSTINGS_LIST = 0x284B,
+ SMSG_CLUB_FINDER_RESPONSE_CHARACTER_APPLICATION_LIST = 0x2848,
+ SMSG_CLUB_FINDER_RESPONSE_POST_RECRUITMENT_MESSAGE = 0x284C,
+ SMSG_CLUB_FINDER_UPDATE_APPLICATIONS = 0x2849,
+ SMSG_CLUB_FINDER_WHISPER_APPLICANT_RESPONSE = 0x2887,
+ SMSG_COIN_REMOVED = 0x2614,
SMSG_COMBAT_EVENT_FAILED = 0x293A,
- SMSG_COMMENTATOR_MAP_INFO = 0x26FB,
- SMSG_COMMENTATOR_PLAYER_INFO = 0x26FC,
- SMSG_COMMENTATOR_STATE_CHANGED = 0x26FA,
- SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x27C2,
- SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x27CE,
- SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x27C4,
- SMSG_COMMERCE_TOKEN_UPDATE = 0x27C3,
- SMSG_COMPLAINT_RESULT = 0x26A3,
- SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x278C,
- SMSG_CONFIRM_PARTY_INVITE = 0x2804,
+ SMSG_COMMENTATOR_MAP_INFO = 0x2701,
+ SMSG_COMMENTATOR_PLAYER_INFO = 0x2702,
+ SMSG_COMMENTATOR_STATE_CHANGED = 0x2700,
+ SMSG_COMMERCE_TOKEN_GET_COUNT_RESPONSE = 0x27CB,
+ SMSG_COMMERCE_TOKEN_GET_LOG_RESPONSE = 0x27D7,
+ SMSG_COMMERCE_TOKEN_GET_MARKET_PRICE_RESPONSE = 0x27CD,
+ SMSG_COMMERCE_TOKEN_UPDATE = 0x27CC,
+ SMSG_COMPLAINT_RESULT = 0x26A8,
+ SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x2794,
+ SMSG_CONFIRM_PARTY_INVITE = 0x280E,
SMSG_CONNECT_TO = 0x304D,
- SMSG_CONQUEST_FORMULA_CONSTANTS = 0x2778,
- SMSG_CONSOLE_WRITE = 0x262D,
- SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x27CA,
- SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x27C9,
- SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x27C8,
- SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x27CC,
- SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x27CD,
- SMSG_CONTACT_LIST = 0x2779,
- SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x280B,
- SMSG_CONTROL_UPDATE = 0x263F,
- SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0x286B,
- SMSG_COOLDOWN_CHEAT = 0x272C,
- SMSG_COOLDOWN_EVENT = 0x26B0,
- SMSG_CORPSE_LOCATION = 0x2647,
- SMSG_CORPSE_RECLAIM_DELAY = 0x273D,
- SMSG_CORPSE_TRANSPORT_QUERY = 0x2706,
+ SMSG_CONQUEST_FORMULA_CONSTANTS = 0x277E,
+ SMSG_CONSOLE_WRITE = 0x2632,
+ SMSG_CONSUMABLE_TOKEN_BUY_AT_MARKET_PRICE_RESPONSE = 0x27D3,
+ SMSG_CONSUMABLE_TOKEN_BUY_CHOICE_REQUIRED = 0x27D2,
+ SMSG_CONSUMABLE_TOKEN_CAN_VETERAN_BUY_RESPONSE = 0x27D1,
+ SMSG_CONSUMABLE_TOKEN_REDEEM_CONFIRM_REQUIRED = 0x27D5,
+ SMSG_CONSUMABLE_TOKEN_REDEEM_RESPONSE = 0x27D6,
+ SMSG_CONTACT_LIST = 0x277F,
+ SMSG_CONTRIBUTION_LAST_UPDATE_RESPONSE = 0x2815,
+ SMSG_CONTROL_UPDATE = 0x2644,
+ SMSG_CONVERT_ITEMS_TO_CURRENCY_VALUE = 0x2874,
+ SMSG_COOLDOWN_CHEAT = 0x2732,
+ SMSG_COOLDOWN_EVENT = 0x26B5,
+ SMSG_CORPSE_LOCATION = 0x264C,
+ SMSG_CORPSE_RECLAIM_DELAY = 0x2743,
+ SMSG_CORPSE_TRANSPORT_QUERY = 0x270C,
SMSG_COVENANT_CALLINGS_AVAILABILITY_RESPONSE = 0x2AA3,
- SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x27EE,
- SMSG_COVENANT_RENOWN_OPEN_NPC = 0x286A,
- SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0x286C,
- SMSG_CREATE_CHAR = 0x26F5,
- SMSG_CREATE_SHIPMENT_RESPONSE = 0x278B,
- SMSG_CRITERIA_DELETED = 0x26DC,
- SMSG_CRITERIA_UPDATE = 0x26D6,
- SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26B8,
- SMSG_CUSTOM_LOAD_SCREEN = 0x25C7,
+ SMSG_COVENANT_PREVIEW_OPEN_NPC = 0x27F7,
+ SMSG_COVENANT_RENOWN_SEND_CATCHUP_STATE = 0x2875,
+ SMSG_CRAFTING_HOUSE_HELLO_RESPONSE = 0x289E,
+ SMSG_CRAFTING_ORDER_CANCEL_RESULT = 0x289A,
+ SMSG_CRAFTING_ORDER_CLAIM_RESULT = 0x2896,
+ SMSG_CRAFTING_ORDER_CRAFT_RESULT = 0x2898,
+ SMSG_CRAFTING_ORDER_CREATE_RESULT = 0x2894,
+ SMSG_CRAFTING_ORDER_FULFILL_RESULT = 0x2899,
+ SMSG_CRAFTING_ORDER_LIST_ORDERS_RESPONSE = 0x2895,
+ SMSG_CRAFTING_ORDER_REJECT_RESULT = 0x289C,
+ SMSG_CRAFTING_ORDER_RELEASE_RESULT = 0x2897,
+ SMSG_CRAFTING_ORDER_UPDATE_STATE = 0x289F,
+ SMSG_CRAFT_ENCHANT_RESULT = 0x289D,
+ SMSG_CREATE_CHAR = 0x26FB,
+ SMSG_CREATE_SHIPMENT_RESPONSE = 0x2793,
+ SMSG_CRITERIA_DELETED = 0x26E1,
+ SMSG_CRITERIA_UPDATE = 0x26DB,
+ SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26BD,
+ SMSG_CUSTOM_LOAD_SCREEN = 0x25CA,
SMSG_DAILY_QUESTS_RESET = 0x2A80,
- SMSG_DAMAGE_CALC_LOG = 0x27B7,
+ SMSG_DAMAGE_CALC_LOG = 0x27C0,
SMSG_DB_REPLY = 0x290E,
- SMSG_DEATH_RELEASE_LOC = 0x26C9,
- SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x264D,
+ SMSG_DEATH_RELEASE_LOC = 0x26CE,
+ SMSG_DEBUG_MENU_MANAGER_FULL_UPDATE = 0x2652,
SMSG_DEFENSE_MESSAGE = 0x2BB6,
- SMSG_DELETE_CHAR = 0x26F6,
+ SMSG_DELETE_CHAR = 0x26FC,
SMSG_DELETE_EXPIRED_MISSIONS_RESULT = 0x2980,
- SMSG_DESTROY_ARENA_UNIT = 0x2735,
- SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x26ED,
+ SMSG_DESTROY_ARENA_UNIT = 0x273B,
+ SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x26F3,
SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258C,
- SMSG_DISENCHANT_CREDIT = 0x25A5,
+ SMSG_DISENCHANT_CREDIT = 0x25A8,
SMSG_DISMOUNT_RESULT = 0x257C,
SMSG_DISPEL_FAILED = 0x2C30,
- SMSG_DISPLAY_GAME_ERROR = 0x259F,
+ SMSG_DISPLAY_GAME_ERROR = 0x25A1,
SMSG_DISPLAY_PLAYER_CHOICE = 0x2FFC,
- SMSG_DISPLAY_PROMOTION = 0x2644,
+ SMSG_DISPLAY_PROMOTION = 0x2649,
SMSG_DISPLAY_QUEST_POPUP = 0x2A9E,
- SMSG_DISPLAY_SOULBIND_UPDATE_MESSAGE = 0x2870,
- SMSG_DISPLAY_TOAST = 0x261C,
- SMSG_DISPLAY_WORLD_TEXT = 0x27DF,
- SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25DA,
+ SMSG_DISPLAY_SOULBIND_UPDATE_MESSAGE = 0x2879,
+ SMSG_DISPLAY_TOAST = 0x2621,
+ SMSG_DISPLAY_WORLD_TEXT = 0x27E8,
+ SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25DF,
SMSG_DROP_NEW_CONNECTION = 0x304C,
SMSG_DUEL_ARRANGED = 0x293C,
SMSG_DUEL_COMPLETE = 0x2940,
@@ -1150,66 +1197,68 @@ enum OpcodeServer : uint16
SMSG_DUEL_OUT_OF_BOUNDS = 0x293D,
SMSG_DUEL_REQUESTED = 0x293B,
SMSG_DUEL_WINNER = 0x2941,
- SMSG_DURABILITY_DAMAGE_DEATH = 0x2739,
- SMSG_EMOTE = 0x27B8,
- SMSG_ENABLE_BARBER_SHOP = 0x26B3,
- SMSG_ENCHANTMENT_LOG = 0x2707,
- SMSG_ENCOUNTER_END = 0x2771,
- SMSG_ENCOUNTER_START = 0x2770,
- SMSG_END_LIGHTNING_STORM = 0x26A0,
+ SMSG_DURABILITY_DAMAGE_DEATH = 0x273F,
+ SMSG_EMOTE = 0x27C1,
+ SMSG_ENABLE_BARBER_SHOP = 0x26B8,
+ SMSG_ENCHANTMENT_LOG = 0x270D,
+ SMSG_ENCOUNTER_END = 0x2777,
+ SMSG_ENCOUNTER_START = 0x2776,
+ SMSG_END_LIGHTNING_STORM = 0x26A5,
+ SMSG_ENSURE_WORLD_LOADED = 0x2881,
SMSG_ENTER_ENCRYPTED_MODE = 0x3049,
SMSG_ENUM_CHARACTERS_RESULT = 0x2583,
- SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x27E4,
+ SMSG_ENUM_VAS_PURCHASE_STATES_RESPONSE = 0x27ED,
SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C21,
- SMSG_EQUIPMENT_SET_ID = 0x26A9,
+ SMSG_EQUIPMENT_SET_ID = 0x26AE,
SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1,
- SMSG_EXPLORATION_EXPERIENCE = 0x2752,
- SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x2869,
- SMSG_FACTION_BONUS_INFO = 0x2718,
+ SMSG_EXPLORATION_EXPERIENCE = 0x2758,
+ SMSG_EXTERNAL_TRANSACTION_ID_GENERATED = 0x2872,
+ SMSG_FACTION_BONUS_INFO = 0x271E,
SMSG_FAILED_PLAYER_CONDITION = 0x2FFA,
- SMSG_FAILED_QUEST_TURN_IN = 0x2801,
- SMSG_FEATURE_SYSTEM_STATUS = 0x25BB,
- SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25BC,
- SMSG_FEIGN_DEATH_RESISTED = 0x2738,
- SMSG_FISH_ESCAPED = 0x26C6,
- SMSG_FISH_NOT_HOOKED = 0x26C5,
+ SMSG_FAILED_QUEST_TURN_IN = 0x280B,
+ SMSG_FEATURE_SYSTEM_STATUS = 0x25BE,
+ SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25BF,
+ SMSG_FEIGN_DEATH_RESISTED = 0x273E,
+ SMSG_FISH_ESCAPED = 0x26CB,
+ SMSG_FISH_NOT_HOOKED = 0x26CA,
SMSG_FLIGHT_SPLINE_SYNC = 0x2E2B,
- SMSG_FORCED_DEATH_UPDATE = 0x26CA,
- SMSG_FORCE_ANIM = 0x2744,
- SMSG_FORCE_ANIMATIONS = 0x2745,
- SMSG_FORCE_OBJECT_RELINK = 0x2643,
- SMSG_FRIEND_STATUS = 0x277A,
- SMSG_GAIN_MAW_POWER = 0x27D3,
- SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25BF,
- SMSG_GAME_OBJECT_BASE = 0x2819,
- SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25C0,
- SMSG_GAME_OBJECT_DESPAWN = 0x25C1,
- SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4B,
- SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C4A,
- SMSG_GAME_OBJECT_RESET_STATE = 0x2712,
- SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x27F4,
- SMSG_GAME_OBJECT_UI_LINK = 0x270E,
- SMSG_GAME_SPEED_SET = 0x2679,
- SMSG_GAME_TIME_SET = 0x2700,
- SMSG_GAME_TIME_UPDATE = 0x26FF,
+ SMSG_FORCED_DEATH_UPDATE = 0x26CF,
+ SMSG_FORCE_ANIM = 0x274A,
+ SMSG_FORCE_ANIMATIONS = 0x274B,
+ SMSG_FORCE_OBJECT_RELINK = 0x2648,
+ SMSG_FRIEND_STATUS = 0x2780,
+ SMSG_GAIN_MAW_POWER = 0x27DC,
+ SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25C2,
+ SMSG_GAME_OBJECT_BASE = 0x2822,
+ SMSG_GAME_OBJECT_CLOSE_INTERACTION = 0x2885,
+ SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25C3,
+ SMSG_GAME_OBJECT_DESPAWN = 0x25C4,
+ SMSG_GAME_OBJECT_INTERACTION = 0x2884,
+ SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4E,
+ SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C4D,
+ SMSG_GAME_OBJECT_RESET_STATE = 0x2718,
+ SMSG_GAME_OBJECT_SET_STATE_LOCAL = 0x27FE,
+ SMSG_GAME_SPEED_SET = 0x267E,
+ SMSG_GAME_TIME_SET = 0x2706,
+ SMSG_GAME_TIME_UPDATE = 0x2705,
SMSG_GARRISON_ACTIVATE_MISSION_BONUS_ABILITY = 0x2982,
- SMSG_GARRISON_ADD_EVENT = 0x29A5,
+ SMSG_GARRISON_ADD_EVENT = 0x29A6,
SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2974,
SMSG_GARRISON_ADD_MISSION_RESULT = 0x2978,
- SMSG_GARRISON_ADD_SPEC_GROUPS = 0x29A8,
- SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = 0x29AC,
+ SMSG_GARRISON_ADD_SPEC_GROUPS = 0x29A9,
+ SMSG_GARRISON_APPLY_TALENT_SOCKET_DATA_CHANGES = 0x29AD,
SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x298A,
- SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = 0x29AE,
+ SMSG_GARRISON_AUTO_TROOP_MIN_LEVEL_UPDATE_RESULT = 0x29AF,
SMSG_GARRISON_BUILDING_ACTIVATED = 0x2969,
SMSG_GARRISON_BUILDING_REMOVED = 0x2962,
SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x2964,
SMSG_GARRISON_CHANGE_MISSION_START_TIME_RESULT = 0x297B,
- SMSG_GARRISON_CLEAR_COLLECTION = 0x29A4,
- SMSG_GARRISON_CLEAR_EVENT_LIST = 0x29A7,
- SMSG_GARRISON_CLEAR_SPEC_GROUPS = 0x29A9,
- SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0x29A3,
- SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0x29A2,
- SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0x299A,
+ SMSG_GARRISON_CLEAR_COLLECTION = 0x29A5,
+ SMSG_GARRISON_CLEAR_EVENT_LIST = 0x29A8,
+ SMSG_GARRISON_CLEAR_SPEC_GROUPS = 0x29AA,
+ SMSG_GARRISON_COLLECTION_REMOVE_ENTRY = 0x29A4,
+ SMSG_GARRISON_COLLECTION_UPDATE_ENTRY = 0x29A3,
+ SMSG_GARRISON_COMPLETE_BUILDING_CONSTRUCTION_RESULT = 0x299B,
SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x297A,
SMSG_GARRISON_CREATE_RESULT = 0x296A,
SMSG_GARRISON_DELETE_MISSION_RESULT = 0x2981,
@@ -1223,26 +1272,23 @@ enum OpcodeServer : uint16
SMSG_GARRISON_GENERATE_FOLLOWERS_RESULT = 0x2991,
SMSG_GARRISON_GET_CLASS_SPEC_CATEGORY_INFO_RESULT = 0x2973,
SMSG_GARRISON_GET_RECALL_PORTAL_LAST_USED_TIME_RESULT = 0x297C,
- SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0x299C,
+ SMSG_GARRISON_IS_UPGRADEABLE_RESPONSE = 0x299D,
SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x2965,
SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x2963,
- SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0x299D,
+ SMSG_GARRISON_LIST_COMPLETED_MISSIONS_CHEAT_RESULT = 0x299E,
SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2977,
- SMSG_GARRISON_MAP_DATA_RESPONSE = 0x299F,
+ SMSG_GARRISON_MAP_DATA_RESPONSE = 0x29A0,
SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x297E,
- SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0x29A0,
+ SMSG_GARRISON_MISSION_REQUEST_REWARD_INFO_RESPONSE = 0x29A1,
SMSG_GARRISON_MISSION_START_CONDITION_UPDATE = 0x2983,
- SMSG_GARRISON_OPEN_ARCHITECT = 0x2994,
SMSG_GARRISON_OPEN_CRAFTER = 0x2995,
- SMSG_GARRISON_OPEN_MISSION_NPC = 0x2996,
SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x298E,
- SMSG_GARRISON_OPEN_TALENT_NPC = 0x298F,
SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x2961,
SMSG_GARRISON_PLOT_PLACED = 0x295F,
SMSG_GARRISON_PLOT_REMOVED = 0x2960,
SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x2992,
SMSG_GARRISON_REMOTE_INFO = 0x2968,
- SMSG_GARRISON_REMOVE_EVENT = 0x29A6,
+ SMSG_GARRISON_REMOVE_EVENT = 0x29A7,
SMSG_GARRISON_REMOVE_FOLLOWER_ABILITY_RESULT = 0x298D,
SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x298B,
SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x2975,
@@ -1252,47 +1298,49 @@ enum OpcodeServer : uint16
SMSG_GARRISON_RESET_TALENT_TREE = 0x2971,
SMSG_GARRISON_RESET_TALENT_TREE_SOCKET_DATA = 0x2972,
SMSG_GARRISON_START_MISSION_RESULT = 0x2979,
- SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0x2999,
- SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0x29AA,
+ SMSG_GARRISON_SWAP_BUILDINGS_RESPONSE = 0x299A,
+ SMSG_GARRISON_SWITCH_TALENT_TREE_BRANCH = 0x29AB,
SMSG_GARRISON_TALENT_COMPLETED = 0x296D,
SMSG_GARRISON_TALENT_REMOVED = 0x296E,
SMSG_GARRISON_TALENT_REMOVE_SOCKET_DATA = 0x2970,
SMSG_GARRISON_TALENT_UPDATE_SOCKET_DATA = 0x296F,
- SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = 0x29AB,
+ SMSG_GARRISON_TALENT_WORLD_QUEST_UNLOCKS_RESPONSE = 0x29AC,
SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x2966,
SMSG_GARRISON_UPDATE_FOLLOWER = 0x2976,
- SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0x299B,
- SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = 0x29AD,
+ SMSG_GARRISON_UPDATE_GARRISON_MONUMENT_SELECTIONS = 0x299C,
+ SMSG_GARRISON_UPDATE_MISSION_CHEAT_RESULT = 0x29AE,
SMSG_GARRISON_UPGRADE_RESULT = 0x296B,
SMSG_GARRISON_USE_RECALL_PORTAL_RESULT = 0x297D,
SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2585,
- SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x280C,
- SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2754,
+ SMSG_GENERATE_SSO_TOKEN_RESPONSE = 0x2816,
+ SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x275A,
SMSG_GET_GARRISON_INFO_RESULT = 0x295E,
- SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x278E,
- SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x27CB,
- SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x27B5,
- SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x278D,
- SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x2789,
- SMSG_GET_TROPHY_LIST_RESPONSE = 0x27B4,
- SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x27E0,
- SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x27E1,
+ SMSG_GET_LANDING_PAGE_SHIPMENTS_RESPONSE = 0x2796,
+ SMSG_GET_REMAINING_GAME_TIME_RESPONSE = 0x27D4,
+ SMSG_GET_SELECTED_TROPHY_ID_RESPONSE = 0x27BE,
+ SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x2795,
+ SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x2791,
+ SMSG_GET_TROPHY_LIST_RESPONSE = 0x27BD,
+ SMSG_GET_VAS_ACCOUNT_CHARACTER_LIST_RESULT = 0x27E9,
+ SMSG_GET_VAS_TRANSFER_TARGET_REALM_LIST_RESULT = 0x27EA,
SMSG_GM_PLAYER_INFO = 0x3005,
SMSG_GM_REQUEST_PLAYER_INFO = 0x2FFB,
- SMSG_GM_TICKET_CASE_STATUS = 0x269B,
- SMSG_GM_TICKET_SYSTEM_STATUS = 0x269A,
- SMSG_GOD_MODE = 0x26F0,
+ SMSG_GM_TICKET_CASE_STATUS = 0x26A0,
+ SMSG_GM_TICKET_SYSTEM_STATUS = 0x269F,
+ SMSG_GOD_MODE = 0x26F6,
SMSG_GOSSIP_COMPLETE = 0x2A97,
SMSG_GOSSIP_MESSAGE = 0x2A98,
- SMSG_GOSSIP_POI = 0x2786,
+ SMSG_GOSSIP_OPTION_NPC_INTERACTION = 0x2AA7,
+ SMSG_GOSSIP_POI = 0x278E,
SMSG_GOSSIP_QUEST_UPDATE = 0x2A99,
SMSG_GOSSIP_REFRESH_OPTIONS = 0x2AA6,
SMSG_GROUP_ACTION_THROTTLED = 0x2590,
- SMSG_GROUP_AUTO_KICK = 0x2784,
- SMSG_GROUP_DECLINE = 0x2781,
- SMSG_GROUP_DESTROYED = 0x2783,
- SMSG_GROUP_NEW_LEADER = 0x2625,
- SMSG_GROUP_UNINVITE = 0x2782,
+ SMSG_GROUP_AUTO_KICK = 0x278B,
+ SMSG_GROUP_DECLINE = 0x2787,
+ SMSG_GROUP_DESTROYED = 0x278A,
+ SMSG_GROUP_NEW_LEADER = 0x262A,
+ SMSG_GROUP_REQUEST_DECLINE = 0x2788,
+ SMSG_GROUP_UNINVITE = 0x2789,
SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5,
SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4,
SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7,
@@ -1346,60 +1394,59 @@ enum OpcodeServer : uint16
SMSG_GUILD_ROSTER = 0x29BB,
SMSG_GUILD_ROSTER_UPDATE = 0x29BC,
SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9,
- SMSG_HEALTH_UPDATE = 0x26C7,
- SMSG_HIGHEST_THREAT_UPDATE = 0x26CF,
+ SMSG_HEALTH_UPDATE = 0x26CC,
+ SMSG_HIGHEST_THREAT_UPDATE = 0x26D4,
SMSG_HOTFIX_CONNECT = 0x2911,
SMSG_HOTFIX_MESSAGE = 0x2910,
- SMSG_INITIALIZE_FACTIONS = 0x2717,
+ SMSG_INITIALIZE_FACTIONS = 0x271D,
SMSG_INITIAL_SETUP = 0x2580,
- SMSG_INIT_WORLD_STATES = 0x273A,
- SMSG_INSPECT_RESULT = 0x2629,
- SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27A0,
- SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x279F,
- SMSG_INSTANCE_ENCOUNTER_END = 0x27A8,
- SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x279E,
- SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27AA,
- SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27A9,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27A3,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27A2,
- SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27A7,
- SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27AB,
- SMSG_INSTANCE_ENCOUNTER_START = 0x27A4,
- SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27A1,
- SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x27A6,
- SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x27A5,
- SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x26EE,
- SMSG_INSTANCE_INFO = 0x262C,
- SMSG_INSTANCE_RESET = 0x267E,
- SMSG_INSTANCE_RESET_FAILED = 0x267F,
- SMSG_INSTANCE_SAVE_CREATED = 0x276F,
- SMSG_INTERRUPT_POWER_REGEN = 0x2C59,
+ SMSG_INIT_WORLD_STATES = 0x2740,
+ SMSG_INSPECT_RESULT = 0x262E,
+ SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27A9,
+ SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27A8,
+ SMSG_INSTANCE_ENCOUNTER_END = 0x27B1,
+ SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27A7,
+ SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27B3,
+ SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27B2,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27AC,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27AB,
+ SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27B0,
+ SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27B4,
+ SMSG_INSTANCE_ENCOUNTER_START = 0x27AD,
+ SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27AA,
+ SMSG_INSTANCE_ENCOUNTER_UPDATE_ALLOW_RELEASE_IN_PROGRESS = 0x27AF,
+ SMSG_INSTANCE_ENCOUNTER_UPDATE_SUPPRESS_RELEASE = 0x27AE,
+ SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x26F4,
+ SMSG_INSTANCE_INFO = 0x2631,
+ SMSG_INSTANCE_RESET = 0x2683,
+ SMSG_INSTANCE_RESET_FAILED = 0x2684,
+ SMSG_INSTANCE_SAVE_CREATED = 0x2775,
+ SMSG_INTERRUPT_POWER_REGEN = 0x2C5C,
SMSG_INVALIDATE_PAGE_TEXT = 0x2918,
SMSG_INVALIDATE_PLAYER = 0x2FFF,
- SMSG_INVALID_PROMOTION_CODE = 0x2746,
+ SMSG_INVALID_PROMOTION_CODE = 0x274C,
SMSG_INVENTORY_CHANGE_FAILURE = 0x2DA5,
- SMSG_INVENTORY_FIXUP_COMPLETE = 0x2803,
- SMSG_INVENTORY_FULL_OVERFLOW = 0x2814,
- SMSG_ISLANDS_MISSION_NPC = 0x27EA,
- SMSG_ISLAND_AZERITE_GAIN = 0x274F,
- SMSG_ISLAND_COMPLETE = 0x2750,
+ SMSG_INVENTORY_FIXUP_COMPLETE = 0x280D,
+ SMSG_INVENTORY_FULL_OVERFLOW = 0x281E,
+ SMSG_ISLAND_AZERITE_GAIN = 0x2755,
+ SMSG_ISLAND_COMPLETE = 0x2756,
SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A84,
- SMSG_ITEM_CHANGED = 0x26DF,
- SMSG_ITEM_COOLDOWN = 0x27B6,
- SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2748,
- SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x259E,
- SMSG_ITEM_INTERACTION_COMPLETE = 0x2861,
- SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x259C,
- SMSG_ITEM_PUSH_RESULT = 0x261B,
- SMSG_ITEM_TIME_UPDATE = 0x2747,
- SMSG_KICK_REASON = 0x2681,
- SMSG_LATENCY_REPORT_PING = 0x2873,
- SMSG_LEARNED_SPELLS = 0x2C4D,
- SMSG_LEARN_PVP_TALENT_FAILED = 0x25CE,
- SMSG_LEARN_TALENT_FAILED = 0x25CD,
- SMSG_LEGACY_LOOT_RULES = 0x281A,
- SMSG_LEVEL_LINKING_RESULT = 0x2847,
- SMSG_LEVEL_UP_INFO = 0x26DE,
+ SMSG_ITEM_CHANGED = 0x26E5,
+ SMSG_ITEM_COOLDOWN = 0x27BF,
+ SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x274E,
+ SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25A0,
+ SMSG_ITEM_INTERACTION_COMPLETE = 0x286A,
+ SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x259E,
+ SMSG_ITEM_PUSH_RESULT = 0x2620,
+ SMSG_ITEM_TIME_UPDATE = 0x274D,
+ SMSG_KICK_REASON = 0x2686,
+ SMSG_LATENCY_REPORT_PING = 0x287C,
+ SMSG_LEARNED_SPELLS = 0x2C50,
+ SMSG_LEARN_PVP_TALENT_FAILED = 0x25D3,
+ SMSG_LEARN_TALENT_FAILED = 0x25D2,
+ SMSG_LEGACY_LOOT_RULES = 0x2823,
+ SMSG_LEVEL_LINKING_RESULT = 0x2850,
+ SMSG_LEVEL_UP_INFO = 0x26E3,
SMSG_LFG_BOOT_PLAYER = 0x2A35,
SMSG_LFG_DISABLED = 0x2A33,
SMSG_LFG_EXPAND_SEARCH_PROMPT = 0x2A3B,
@@ -1427,45 +1474,47 @@ enum OpcodeServer : uint16
SMSG_LFG_SLOT_INVALID = 0x2A30,
SMSG_LFG_TELEPORT_DENIED = 0x2A32,
SMSG_LFG_UPDATE_STATUS = 0x2A24,
- SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x2761,
- SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x2760,
- SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x2755,
- SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x2762,
- SMSG_LOAD_CUF_PROFILES = 0x25B8,
- SMSG_LOAD_EQUIPMENT_SET = 0x2702,
- SMSG_LOGIN_SET_TIME_SPEED = 0x2701,
- SMSG_LOGIN_VERIFY_WORLD = 0x2599,
- SMSG_LOGOUT_CANCEL_ACK = 0x267D,
- SMSG_LOGOUT_COMPLETE = 0x267C,
- SMSG_LOGOUT_RESPONSE = 0x267B,
- SMSG_LOG_XP_GAIN = 0x26DA,
- SMSG_LOOT_ALL_PASSED = 0x2619,
- SMSG_LOOT_LIST = 0x2734,
- SMSG_LOOT_MONEY_NOTIFY = 0x2614,
- SMSG_LOOT_RELEASE = 0x2613,
- SMSG_LOOT_RELEASE_ALL = 0x2612,
- SMSG_LOOT_REMOVED = 0x260E,
- SMSG_LOOT_RESPONSE = 0x260D,
- SMSG_LOOT_ROLL = 0x2616,
- SMSG_LOOT_ROLLS_COMPLETE = 0x2618,
- SMSG_LOOT_ROLL_WON = 0x261A,
- SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2668,
- SMSG_MAIL_COMMAND_RESULT = 0x2633,
- SMSG_MAIL_LIST_RESULT = 0x2749,
- SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x274A,
+ SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x2767,
+ SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x2766,
+ SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x275B,
+ SMSG_LIVE_REGION_KEY_BINDINGS_COPY_RESULT = 0x2768,
+ SMSG_LOAD_CUF_PROFILES = 0x25BB,
+ SMSG_LOAD_EQUIPMENT_SET = 0x2708,
+ SMSG_LOBBY_MATCHMAKER_PARTY_INFO = 0x2889,
+ SMSG_LOGIN_SET_TIME_SPEED = 0x2707,
+ SMSG_LOGIN_VERIFY_WORLD = 0x259B,
+ SMSG_LOGOUT_CANCEL_ACK = 0x2682,
+ SMSG_LOGOUT_COMPLETE = 0x2681,
+ SMSG_LOGOUT_RESPONSE = 0x2680,
+ SMSG_LOG_XP_GAIN = 0x26DF,
+ SMSG_LOOT_ALL_PASSED = 0x261E,
+ SMSG_LOOT_LIST = 0x273A,
+ SMSG_LOOT_MONEY_NOTIFY = 0x2619,
+ SMSG_LOOT_RELEASE = 0x2618,
+ SMSG_LOOT_RELEASE_ALL = 0x2617,
+ SMSG_LOOT_REMOVED = 0x2613,
+ SMSG_LOOT_RESPONSE = 0x2612,
+ SMSG_LOOT_ROLL = 0x261B,
+ SMSG_LOOT_ROLLS_COMPLETE = 0x261D,
+ SMSG_LOOT_ROLL_WON = 0x261F,
+ SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x266D,
+ SMSG_MAIL_COMMAND_RESULT = 0x2638,
+ SMSG_MAIL_LIST_RESULT = 0x274F,
+ SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2750,
SMSG_MAP_OBJECTIVES_INIT = 0x294B,
- SMSG_MAP_OBJ_EVENTS = 0x25C2,
- SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x2617,
- SMSG_MEETING_STONE_FAILED = 0x287C,
+ SMSG_MAP_OBJ_EVENTS = 0x25C5,
+ SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x261C,
+ SMSG_MEETING_STONE_FAILED = 0x288A,
SMSG_MESSAGE_BOX = 0x2576,
- SMSG_MINIMAP_PING = 0x26C4,
+ SMSG_MINIMAP_PING = 0x26C9,
SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14,
SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13,
- SMSG_MISSILE_CANCEL = 0x25C3,
- SMSG_MODIFY_COOLDOWN = 0x2757,
+ SMSG_MISSILE_CANCEL = 0x25C6,
+ SMSG_MODIFY_COOLDOWN = 0x275D,
SMSG_MOTD = 0x2BAF,
SMSG_MOUNT_RESULT = 0x257B,
- SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x2837,
+ SMSG_MOVEMENT_ENFORCEMENT_ALERT = 0x2840,
+ SMSG_MOVE_ADD_IMPULSE = 0x2E32,
SMSG_MOVE_APPLY_INERTIA = 0x2E2E,
SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2E15,
SMSG_MOVE_DISABLE_COLLISION = 0x2E11,
@@ -1483,6 +1532,20 @@ enum OpcodeServer : uint16
SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x2E16,
SMSG_MOVE_ROOT = 0x2DF9,
SMSG_MOVE_SET_ACTIVE_MOVER = 0x2DD5,
+ SMSG_MOVE_SET_ADV_FLYING_ADD_IMPULSE_MAX_SPEED = 0x2E3B,
+ SMSG_MOVE_SET_ADV_FLYING_AIR_FRICTION = 0x2E36,
+ SMSG_MOVE_SET_ADV_FLYING_BANKING_RATE = 0x2E3C,
+ SMSG_MOVE_SET_ADV_FLYING_DOUBLE_JUMP_VEL_MOD = 0x2E39,
+ SMSG_MOVE_SET_ADV_FLYING_GLIDE_START_MIN_HEIGHT = 0x2E3A,
+ SMSG_MOVE_SET_ADV_FLYING_LAUNCH_SPEED_COEFFICIENT = 0x2E42,
+ SMSG_MOVE_SET_ADV_FLYING_LIFT_COEFFICIENT = 0x2E38,
+ SMSG_MOVE_SET_ADV_FLYING_MAX_VEL = 0x2E37,
+ SMSG_MOVE_SET_ADV_FLYING_OVER_MAX_DECELERATION = 0x2E41,
+ SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_DOWN = 0x2E3D,
+ SMSG_MOVE_SET_ADV_FLYING_PITCHING_RATE_UP = 0x2E3E,
+ SMSG_MOVE_SET_ADV_FLYING_SURFACE_FRICTION = 0x2E40,
+ SMSG_MOVE_SET_ADV_FLYING_TURN_VELOCITY_THRESHOLD = 0x2E3F,
+ SMSG_MOVE_SET_CAN_ADV_FLY = 0x2E34,
SMSG_MOVE_SET_CAN_FLY = 0x2E05,
SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x2E07,
SMSG_MOVE_SET_COLLISION_HEIGHT = 0x2E13,
@@ -1534,11 +1597,13 @@ enum OpcodeServer : uint16
SMSG_MOVE_SPLINE_UNSET_HOVER = 0x2E22,
SMSG_MOVE_TELEPORT = 0x2E04,
SMSG_MOVE_UNROOT = 0x2DFA,
+ SMSG_MOVE_UNSET_CAN_ADV_FLY = 0x2E35,
SMSG_MOVE_UNSET_CAN_FLY = 0x2E06,
SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x2E08,
SMSG_MOVE_UNSET_HOVERING = 0x2E02,
SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x2E0A,
SMSG_MOVE_UPDATE = 0x2DE0,
+ SMSG_MOVE_UPDATE_ADD_IMPULSE = 0x2E33,
SMSG_MOVE_UPDATE_APPLY_INERTIA = 0x2E30,
SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x2DE4,
SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x2DDF,
@@ -1556,82 +1621,79 @@ enum OpcodeServer : uint16
SMSG_MOVE_UPDATE_TELEPORT = 0x2DE1,
SMSG_MOVE_UPDATE_TURN_RATE = 0x2DDD,
SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DD8,
- SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x27D0,
- SMSG_MULTI_FLOOR_NEW_FLOOR = 0x27CF,
- SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x2605,
- SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x2607,
- SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x260A,
- SMSG_MYTHIC_PLUS_SEASON_DATA = 0x2606,
- SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25D5,
- SMSG_NEW_TAXI_PATH = 0x2676,
+ SMSG_MULTI_FLOOR_LEAVE_FLOOR = 0x27D9,
+ SMSG_MULTI_FLOOR_NEW_FLOOR = 0x27D8,
+ SMSG_MYTHIC_PLUS_ALL_MAP_STATS = 0x260A,
+ SMSG_MYTHIC_PLUS_CURRENT_AFFIXES = 0x260C,
+ SMSG_MYTHIC_PLUS_NEW_WEEK_RECORD = 0x260F,
+ SMSG_MYTHIC_PLUS_SEASON_DATA = 0x260B,
+ SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25DA,
+ SMSG_NEW_TAXI_PATH = 0x267B,
SMSG_NEW_WORLD = 0x2598,
- SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C43,
- SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26A2,
- SMSG_NOTIFY_MONEY = 0x259B,
- SMSG_NOTIFY_RECEIVED_MAIL = 0x2634,
- SMSG_OFFER_PETITION_ERROR = 0x26AD,
- SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x26DB,
+ SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C46,
+ SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26A7,
+ SMSG_NOTIFY_MONEY = 0x259D,
+ SMSG_NOTIFY_RECEIVED_MAIL = 0x2639,
+ SMSG_NPC_INTERACTION_OPEN_RESULT = 0x2883,
+ SMSG_OFFER_PETITION_ERROR = 0x26B2,
+ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x26E0,
SMSG_ON_MONSTER_MOVE = 0x2DD4,
- SMSG_OPEN_ANIMA_DIVERSION_UI = 0x270F,
- SMSG_OPEN_ARTIFACT_FORGE = 0x2792,
+ SMSG_OPEN_ARTIFACT_FORGE = 0x279A,
SMSG_OPEN_CONTAINER = 0x2DA6,
- SMSG_OPEN_HEART_FORGE = 0x2817,
- SMSG_OPEN_ITEM_FORGE = 0x2790,
SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A31,
- SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x2788,
- SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x278A,
- SMSG_OVERRIDE_LIGHT = 0x26B2,
- SMSG_PAGE_TEXT = 0x270D,
- SMSG_PARTY_COMMAND_RESULT = 0x2785,
- SMSG_PARTY_INVITE = 0x25B9,
- SMSG_PARTY_KILL_LOG = 0x274D,
- SMSG_PARTY_MEMBER_FULL_STATE = 0x274C,
- SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x274B,
- SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x2867,
- SMSG_PARTY_UPDATE = 0x25EE,
- SMSG_PAST_TIME_EVENTS = 0x25BE,
- SMSG_PAUSE_MIRROR_TIMER = 0x2704,
- SMSG_PENDING_RAID_LOCK = 0x26EC,
- SMSG_PETITION_ALREADY_SIGNED = 0x25A1,
+ SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x2792,
+ SMSG_OVERRIDE_LIGHT = 0x26B7,
+ SMSG_PAGE_TEXT = 0x2713,
+ SMSG_PARTY_COMMAND_RESULT = 0x278C,
+ SMSG_PARTY_INVITE = 0x25BC,
+ SMSG_PARTY_KILL_LOG = 0x2753,
+ SMSG_PARTY_MEMBER_FULL_STATE = 0x2752,
+ SMSG_PARTY_MEMBER_PARTIAL_STATE = 0x2751,
+ SMSG_PARTY_NOTIFY_LFG_LEADER_CHANGE = 0x2870,
+ SMSG_PARTY_UPDATE = 0x25F3,
+ SMSG_PAST_TIME_EVENTS = 0x25C1,
+ SMSG_PAUSE_MIRROR_TIMER = 0x270A,
+ SMSG_PENDING_RAID_LOCK = 0x26F2,
+ SMSG_PETITION_ALREADY_SIGNED = 0x25A3,
SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29FA,
- SMSG_PETITION_SHOW_LIST = 0x26B5,
- SMSG_PETITION_SHOW_SIGNATURES = 0x26B6,
- SMSG_PETITION_SIGN_RESULTS = 0x273F,
- SMSG_PET_ACTION_FEEDBACK = 0x273C,
- SMSG_PET_ACTION_SOUND = 0x2698,
+ SMSG_PETITION_SHOW_LIST = 0x26BA,
+ SMSG_PETITION_SHOW_SIGNATURES = 0x26BB,
+ SMSG_PETITION_SIGN_RESULTS = 0x2745,
+ SMSG_PET_ACTION_FEEDBACK = 0x2742,
+ SMSG_PET_ACTION_SOUND = 0x269D,
SMSG_PET_ADDED = 0x2595,
- SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x25FC,
- SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x266D,
- SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x25F5,
- SMSG_PET_BATTLE_FINAL_ROUND = 0x25FA,
- SMSG_PET_BATTLE_FINISHED = 0x25FB,
- SMSG_PET_BATTLE_FIRST_ROUND = 0x25F7,
- SMSG_PET_BATTLE_INITIAL_UPDATE = 0x25F6,
- SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x25FD,
- SMSG_PET_BATTLE_PVP_CHALLENGE = 0x25F4,
- SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2631,
- SMSG_PET_BATTLE_QUEUE_STATUS = 0x2632,
- SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x25F9,
- SMSG_PET_BATTLE_REQUEST_FAILED = 0x25F3,
- SMSG_PET_BATTLE_ROUND_RESULT = 0x25F8,
- SMSG_PET_BATTLE_SLOT_UPDATES = 0x25E5,
- SMSG_PET_CAST_FAILED = 0x2C58,
+ SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2601,
+ SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x2672,
+ SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x25FA,
+ SMSG_PET_BATTLE_FINAL_ROUND = 0x25FF,
+ SMSG_PET_BATTLE_FINISHED = 0x2600,
+ SMSG_PET_BATTLE_FIRST_ROUND = 0x25FC,
+ SMSG_PET_BATTLE_INITIAL_UPDATE = 0x25FB,
+ SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x2602,
+ SMSG_PET_BATTLE_PVP_CHALLENGE = 0x25F9,
+ SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2636,
+ SMSG_PET_BATTLE_QUEUE_STATUS = 0x2637,
+ SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x25FE,
+ SMSG_PET_BATTLE_REQUEST_FAILED = 0x25F8,
+ SMSG_PET_BATTLE_ROUND_RESULT = 0x25FD,
+ SMSG_PET_BATTLE_SLOT_UPDATES = 0x25EA,
+ SMSG_PET_CAST_FAILED = 0x2C5B,
SMSG_PET_CLEAR_SPELLS = 0x2C24,
- SMSG_PET_DISMISS_SOUND = 0x2699,
- SMSG_PET_GOD_MODE = 0x2673,
- SMSG_PET_GUIDS = 0x26F8,
- SMSG_PET_LEARNED_SPELLS = 0x2C4F,
+ SMSG_PET_DISMISS_SOUND = 0x269E,
+ SMSG_PET_GOD_MODE = 0x2678,
+ SMSG_PET_GUIDS = 0x26FE,
+ SMSG_PET_LEARNED_SPELLS = 0x2C52,
SMSG_PET_MODE = 0x258B,
- SMSG_PET_NAME_INVALID = 0x26BA,
+ SMSG_PET_NAME_INVALID = 0x26BF,
SMSG_PET_NEWLY_TAMED = 0x2589,
SMSG_PET_SLOT_UPDATED = 0x258A,
SMSG_PET_SPELLS_MESSAGE = 0x2C25,
SMSG_PET_STABLE_LIST = 0x2596,
SMSG_PET_STABLE_RESULT = 0x2597,
- SMSG_PET_TAME_FAILURE = 0x26AA,
- SMSG_PET_UNLEARNED_SPELLS = 0x2C50,
+ SMSG_PET_TAME_FAILURE = 0x26AF,
+ SMSG_PET_UNLEARNED_SPELLS = 0x2C53,
SMSG_PHASE_SHIFT_CHANGE = 0x2578,
- SMSG_PLAYED_TIME = 0x26CB,
+ SMSG_PLAYED_TIME = 0x26D0,
SMSG_PLAYER_AZERITE_ITEM_EQUIPPED_STATUS_CHANGED = 0x3014,
SMSG_PLAYER_AZERITE_ITEM_GAINS = 0x3013,
SMSG_PLAYER_BONUS_ROLL_FAILED = 0x3016,
@@ -1642,40 +1704,42 @@ enum OpcodeServer : uint16
SMSG_PLAYER_IS_ADVENTURE_MAP_POI_VALID = 0x3009,
SMSG_PLAYER_OPEN_SUBSCRIPTION_INTERSTITIAL = 0x300E,
SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F9,
+ SMSG_PLAYER_SHOW_GENERIC_WIDGET_DISPLAY = 0x301E,
SMSG_PLAYER_SHOW_UI_EVENT_TOAST = 0x3019,
SMSG_PLAYER_SKINNED = 0x3006,
- SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x3007,
SMSG_PLAYER_TUTORIAL_HIGHLIGHT_SPELL = 0x300D,
SMSG_PLAYER_TUTORIAL_UNHIGHLIGHT_SPELL = 0x300C,
- SMSG_PLAY_MUSIC = 0x275C,
- SMSG_PLAY_OBJECT_SOUND = 0x275D,
- SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x2724,
- SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C47,
- SMSG_PLAY_SCENE = 0x262E,
- SMSG_PLAY_SOUND = 0x275B,
- SMSG_PLAY_SPEAKERBOT_SOUND = 0x275E,
- SMSG_PLAY_SPELL_VISUAL = 0x2C45,
- SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C49,
- SMSG_PLAY_TIME_WARNING = 0x26F2,
+ SMSG_PLAY_MUSIC = 0x2762,
+ SMSG_PLAY_OBJECT_SOUND = 0x2763,
+ SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x272A,
+ SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C4A,
+ SMSG_PLAY_SCENE = 0x2633,
+ SMSG_PLAY_SOUND = 0x2761,
+ SMSG_PLAY_SPEAKERBOT_SOUND = 0x2764,
+ SMSG_PLAY_SPELL_VISUAL = 0x2C48,
+ SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C4C,
+ SMSG_PLAY_TIME_WARNING = 0x26F8,
SMSG_PONG = 0x304E,
- SMSG_POWER_UPDATE = 0x26C8,
+ SMSG_POWER_UPDATE = 0x26CD,
SMSG_PRELOAD_CHILD_MAP = 0x2579,
- SMSG_PREPOPULATE_NAME_CACHE = 0x283A,
- SMSG_PRE_RESSURECT = 0x275A,
- SMSG_PRINT_NOTIFICATION = 0x25C6,
- SMSG_PROC_RESIST = 0x274E,
- SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C51,
+ SMSG_PRELOAD_WORLD = 0x2599,
+ SMSG_PREPOPULATE_NAME_CACHE = 0x2843,
+ SMSG_PRE_RESSURECT = 0x2760,
+ SMSG_PRINT_NOTIFICATION = 0x25C9,
+ SMSG_PROC_RESIST = 0x2754,
+ SMSG_PROFESSION_GOSSIP = 0x27F9,
+ SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C54,
SMSG_PVP_CREDIT = 0x2945,
SMSG_PVP_MATCH_COMPLETE = 0x294F,
SMSG_PVP_MATCH_INITIALIZE = 0x2950,
SMSG_PVP_MATCH_START = 0x294E,
SMSG_PVP_MATCH_STATISTICS = 0x2932,
SMSG_PVP_OPTIONS_ENABLED = 0x2934,
- SMSG_PVP_TIER_RECORD = 0x2874,
+ SMSG_PVP_TIER_RECORD = 0x287D,
SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x291A,
SMSG_QUERY_CREATURE_RESPONSE = 0x2914,
SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x2915,
- SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0x299E,
+ SMSG_QUERY_GARRISON_PET_NAME_RESPONSE = 0x299F,
SMSG_QUERY_GUILD_FOLLOW_INFO_RESPONSE = 0x29E7,
SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5,
SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x291E,
@@ -1687,7 +1751,7 @@ enum OpcodeServer : uint16
SMSG_QUERY_PLAYER_NAME_BY_COMMUNITY_ID_RESPONSE = 0x3002,
SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A96,
SMSG_QUERY_REALM_GUILD_MASTER_INFO_RESPONSE = 0x29E6,
- SMSG_QUERY_TIME_RESPONSE = 0x26D9,
+ SMSG_QUERY_TIME_RESPONSE = 0x26DE,
SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81,
SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8F,
SMSG_QUEST_FORCE_REMOVED = 0x2A9C,
@@ -1700,255 +1764,261 @@ enum OpcodeServer : uint16
SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x2A93,
SMSG_QUEST_GIVER_STATUS = 0x2A9B,
SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x2A91,
+ SMSG_QUEST_ITEM_USABILITY_RESPONSE = 0x2A82,
SMSG_QUEST_LOG_FULL = 0x2A87,
SMSG_QUEST_NON_LOG_UPDATE_COMPLETE = 0x2A88,
SMSG_QUEST_POI_QUERY_RESPONSE = 0x2A9D,
SMSG_QUEST_POI_UPDATE_RESPONSE = 0x2A9F,
SMSG_QUEST_PUSH_RESULT = 0x2A90,
- SMSG_QUEST_SESSION_INFO_RESPONSE = 0x285D,
- SMSG_QUEST_SESSION_READY_CHECK = 0x284B,
- SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x284C,
- SMSG_QUEST_SESSION_RESULT = 0x284A,
+ SMSG_QUEST_SESSION_INFO_RESPONSE = 0x2866,
+ SMSG_QUEST_SESSION_READY_CHECK = 0x2854,
+ SMSG_QUEST_SESSION_READY_CHECK_RESPONSE = 0x2855,
+ SMSG_QUEST_SESSION_RESULT = 0x2853,
SMSG_QUEST_UPDATE_ADD_CREDIT = 0x2A8C,
SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x2A8D,
SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x2A8E,
SMSG_QUEST_UPDATE_COMPLETE = 0x2A89,
SMSG_QUEST_UPDATE_FAILED = 0x2A8A,
SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A8B,
- SMSG_QUEUE_SUMMARY_UPDATE = 0x2802,
- SMSG_RAF_ACCOUNT_INFO = 0x2848,
- SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x2859,
- SMSG_RAID_DIFFICULTY_SET = 0x279B,
- SMSG_RAID_GROUP_ONLY = 0x279D,
+ SMSG_QUEUE_SUMMARY_UPDATE = 0x280C,
+ SMSG_RAF_ACCOUNT_INFO = 0x2851,
+ SMSG_RAF_ACTIVITY_STATE_CHANGED = 0x2862,
+ SMSG_RAID_DIFFICULTY_SET = 0x27A4,
+ SMSG_RAID_GROUP_ONLY = 0x27A6,
SMSG_RAID_INSTANCE_MESSAGE = 0x2BB4,
- SMSG_RAID_MARKERS_CHANGED = 0x25A2,
- SMSG_RANDOM_ROLL = 0x2628,
+ SMSG_RAID_MARKERS_CHANGED = 0x25A4,
+ SMSG_RANDOM_ROLL = 0x262D,
SMSG_RATED_PVP_INFO = 0x2931,
- SMSG_READY_CHECK_COMPLETED = 0x25F2,
- SMSG_READY_CHECK_RESPONSE = 0x25F1,
- SMSG_READY_CHECK_STARTED = 0x25F0,
- SMSG_READ_ITEM_RESULT_FAILED = 0x2797,
- SMSG_READ_ITEM_RESULT_OK = 0x278F,
- SMSG_REALM_LOOKUP_INFO = 0x27BB,
+ SMSG_READY_CHECK_COMPLETED = 0x25F7,
+ SMSG_READY_CHECK_RESPONSE = 0x25F6,
+ SMSG_READY_CHECK_STARTED = 0x25F5,
+ SMSG_READ_ITEM_RESULT_FAILED = 0x27A0,
+ SMSG_READ_ITEM_RESULT_OK = 0x2797,
+ SMSG_REALM_LOOKUP_INFO = 0x27C4,
SMSG_REALM_QUERY_RESPONSE = 0x2913,
- SMSG_REATTACH_RESURRECT = 0x273E,
- SMSG_RECRUIT_A_FRIEND_FAILURE = 0x26B7,
- SMSG_REFRESH_COMPONENT = 0x2649,
+ SMSG_REATTACH_RESURRECT = 0x2744,
+ SMSG_RECRAFT_ITEM_RESULT = 0x289B,
+ SMSG_RECRUIT_A_FRIEND_FAILURE = 0x26BC,
+ SMSG_REFRESH_COMPONENT = 0x264E,
SMSG_REFRESH_SPELL_HISTORY = 0x2C2C,
- SMSG_REMOVE_ITEM_PASSIVE = 0x25A9,
- SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x2C52,
- SMSG_REPLACE_TROPHY_RESPONSE = 0x27B3,
+ SMSG_REMOVE_ITEM_PASSIVE = 0x25AC,
+ SMSG_REMOVE_SPELL_FROM_ACTION_BAR = 0x2C55,
+ SMSG_REPLACE_TROPHY_RESPONSE = 0x27BC,
SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x3001,
SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x2591,
SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x2935,
SMSG_REQUEST_SCHEDULED_PVP_INFO_RESPONSE = 0x2936,
SMSG_RESEARCH_COMPLETE = 0x2587,
SMSG_RESET_COMPRESSION_CONTEXT = 0x304F,
- SMSG_RESET_FAILED_NOTIFY = 0x26AE,
+ SMSG_RESET_FAILED_NOTIFY = 0x26B3,
SMSG_RESET_QUEST_POI = 0x2AA0,
SMSG_RESET_RANGED_COMBAT_TIMER = 0x2944,
SMSG_RESET_WEEKLY_CURRENCY = 0x2575,
- SMSG_RESPEC_WIPE_CONFIRM = 0x260B,
+ SMSG_RESPEC_WIPE_CONFIRM = 0x2610,
SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2572,
- SMSG_RESTART_GLOBAL_COOLDOWN = 0x2C60,
- SMSG_RESTRICTED_ACCOUNT_WARNING = 0x25B5,
- SMSG_RESUME_CAST = 0x2C3B,
- SMSG_RESUME_CAST_BAR = 0x2C3E,
+ SMSG_RESTART_GLOBAL_COOLDOWN = 0x2C64,
+ SMSG_RESTRICTED_ACCOUNT_WARNING = 0x25B8,
+ SMSG_RESUME_CAST = 0x2C3E,
+ SMSG_RESUME_CAST_BAR = 0x2C41,
SMSG_RESUME_COMMS = 0x304B,
- SMSG_RESUME_TOKEN = 0x25A7,
+ SMSG_RESUME_TOKEN = 0x25AA,
SMSG_RESURRECT_REQUEST = 0x257E,
- SMSG_RESYNC_RUNES = 0x2C5F,
- SMSG_RETURN_APPLICANT_LIST = 0x283E,
- SMSG_RETURN_RECRUITING_CLUBS = 0x283D,
+ SMSG_RESYNC_RUNES = 0x2C62,
+ SMSG_RETURNING_PLAYER_PROMPT = 0x279F,
+ SMSG_RETURN_APPLICANT_LIST = 0x2847,
+ SMSG_RETURN_RECRUITING_CLUBS = 0x2846,
SMSG_ROLE_CHANGED_INFORM = 0x258D,
SMSG_ROLE_CHOSEN = 0x2A39,
SMSG_ROLE_POLL_INFORM = 0x258E,
- SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x27EF,
- SMSG_RUNE_REGEN_DEBUG = 0x25B2,
- SMSG_SCENARIO_COMPLETED = 0x27DD,
- SMSG_SCENARIO_POIS = 0x262B,
- SMSG_SCENARIO_PROGRESS_UPDATE = 0x2624,
- SMSG_SCENARIO_SHOW_CRITERIA = 0x27F2,
- SMSG_SCENARIO_STATE = 0x2623,
- SMSG_SCENARIO_UI_UPDATE = 0x27F1,
- SMSG_SCENARIO_VACATE = 0x2798,
- SMSG_SCENE_OBJECT_EVENT = 0x25DB,
- SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25E0,
- SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25E1,
- SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25DD,
- SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25DC,
- SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25DF,
- SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25DE,
- SMSG_SCRIPT_CAST = 0x2C56,
- SMSG_SEASON_INFO = 0x25BD,
- SMSG_SELL_RESPONSE = 0x26BB,
- SMSG_SEND_ITEM_PASSIVES = 0x25AA,
+ SMSG_RUNEFORGE_LEGENDARY_CRAFTING_OPEN_NPC = 0x27F8,
+ SMSG_RUNE_REGEN_DEBUG = 0x25B5,
+ SMSG_SCENARIO_COMPLETED = 0x27E6,
+ SMSG_SCENARIO_POIS = 0x2630,
+ SMSG_SCENARIO_PROGRESS_UPDATE = 0x2629,
+ SMSG_SCENARIO_SHOW_CRITERIA = 0x27FC,
+ SMSG_SCENARIO_STATE = 0x2628,
+ SMSG_SCENARIO_UI_UPDATE = 0x27FB,
+ SMSG_SCENARIO_VACATE = 0x27A1,
+ SMSG_SCENE_OBJECT_EVENT = 0x25E0,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25E5,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25E6,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x25E2,
+ SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25E1,
+ SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25E4,
+ SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25E3,
+ SMSG_SCRIPT_CAST = 0x2C59,
+ SMSG_SEASON_INFO = 0x25C0,
+ SMSG_SELL_RESPONSE = 0x26C0,
+ SMSG_SEND_ITEM_PASSIVES = 0x25AD,
SMSG_SEND_KNOWN_SPELLS = 0x2C2A,
- SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x2626,
- SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x2627,
+ SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x262B,
+ SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x262C,
SMSG_SEND_SPELL_CHARGES = 0x2C2D,
SMSG_SEND_SPELL_HISTORY = 0x2C2B,
SMSG_SEND_UNLEARN_SPELLS = 0x2C2E,
- SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x2646,
- SMSG_SERVER_TIME = 0x267A,
- SMSG_SERVER_TIME_OFFSET = 0x2708,
+ SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x264B,
+ SMSG_SERVER_TIME = 0x267F,
+ SMSG_SERVER_TIME_OFFSET = 0x270E,
SMSG_SETUP_CURRENCY = 0x2573,
SMSG_SETUP_RESEARCH_HISTORY = 0x2586,
- SMSG_SET_AI_ANIM_KIT = 0x2723,
- SMSG_SET_ALL_TASK_PROGRESS = 0x277F,
- SMSG_SET_ANIM_TIER = 0x2727,
- SMSG_SET_CHR_UPGRADE_TIER = 0x25D8,
+ SMSG_SET_AI_ANIM_KIT = 0x2729,
+ SMSG_SET_ALL_TASK_PROGRESS = 0x2785,
+ SMSG_SET_ANIM_TIER = 0x272D,
+ SMSG_SET_CHR_UPGRADE_TIER = 0x25DD,
SMSG_SET_CURRENCY = 0x2574,
SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E,
- SMSG_SET_DUNGEON_DIFFICULTY = 0x269C,
- SMSG_SET_FACTION_AT_WAR = 0x26F4,
- SMSG_SET_FACTION_NOT_VISIBLE = 0x271E,
- SMSG_SET_FACTION_STANDING = 0x271F,
- SMSG_SET_FACTION_VISIBLE = 0x271D,
- SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36,
- SMSG_SET_FORCED_REACTIONS = 0x2711,
- SMSG_SET_ITEM_PURCHASE_DATA = 0x259D,
- SMSG_SET_LOOT_METHOD_FAILED = 0x27C1,
- SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25A0,
- SMSG_SET_MELEE_ANIM_KIT = 0x2726,
- SMSG_SET_MOVEMENT_ANIM_KIT = 0x2725,
- SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37,
- SMSG_SET_PET_SPECIALIZATION = 0x261D,
+ SMSG_SET_DUNGEON_DIFFICULTY = 0x26A1,
+ SMSG_SET_FACTION_AT_WAR = 0x26FA,
+ SMSG_SET_FACTION_NOT_VISIBLE = 0x2724,
+ SMSG_SET_FACTION_STANDING = 0x2725,
+ SMSG_SET_FACTION_VISIBLE = 0x2723,
+ SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C39,
+ SMSG_SET_FORCED_REACTIONS = 0x2717,
+ SMSG_SET_ITEM_PURCHASE_DATA = 0x259F,
+ SMSG_SET_LOOT_METHOD_FAILED = 0x27CA,
+ SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25A2,
+ SMSG_SET_MELEE_ANIM_KIT = 0x272C,
+ SMSG_SET_MOVEMENT_ANIM_KIT = 0x272B,
+ SMSG_SET_PCT_SPELL_MODIFIER = 0x2C3A,
+ SMSG_SET_PET_SPECIALIZATION = 0x2622,
SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x3003,
- SMSG_SET_PLAY_HOVER_ANIM = 0x25B6,
- SMSG_SET_PROFICIENCY = 0x2728,
- SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x2851,
- SMSG_SET_SHIPMENT_READY_RESPONSE = 0x2997,
+ SMSG_SET_PLAY_HOVER_ANIM = 0x25B9,
+ SMSG_SET_PROFICIENCY = 0x272E,
+ SMSG_SET_QUEST_REPLAY_COOLDOWN_OVERRIDE = 0x285A,
+ SMSG_SET_SHIPMENT_READY_RESPONSE = 0x2998,
SMSG_SET_SPELL_CHARGES = 0x2C29,
- SMSG_SET_TASK_COMPLETE = 0x2780,
- SMSG_SET_TIME_ZONE_INFORMATION = 0x266F,
- SMSG_SET_VEHICLE_REC_ID = 0x26EB,
- SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x2878,
- SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x2998,
- SMSG_SHOW_BANK = 0x2677,
- SMSG_SHOW_MAILBOX = 0x2799,
- SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25D4,
+ SMSG_SET_TASK_COMPLETE = 0x2786,
+ SMSG_SET_TIME_ZONE_INFORMATION = 0x2674,
+ SMSG_SET_VEHICLE_REC_ID = 0x26F1,
+ SMSG_SHADOWLANDS_CAPACITANCE_UPDATE = 0x2882,
+ SMSG_SHIPMENT_FACTION_UPDATE_RESULT = 0x2999,
+ SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25D9,
SMSG_SHOW_QUEST_COMPLETION_TEXT = 0x2A95,
- SMSG_SHOW_TAXI_NODES = 0x26C3,
- SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x2763,
- SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x287D,
- SMSG_SOCKET_GEMS_FAILURE = 0x271B,
- SMSG_SOCKET_GEMS_SUCCESS = 0x271A,
- SMSG_SPECIAL_MOUNT_ANIM = 0x2697,
- SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x270C,
+ SMSG_SHOW_TAXI_NODES = 0x26C8,
+ SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x2769,
+ SMSG_SOCIAL_CONTRACT_REQUEST_RESPONSE = 0x288B,
+ SMSG_SOCKET_GEMS_FAILURE = 0x2721,
+ SMSG_SOCKET_GEMS_SUCCESS = 0x2720,
+ SMSG_SPECIAL_MOUNT_ANIM = 0x269C,
+ SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2712,
SMSG_SPELL_ABSORB_LOG = 0x2C1F,
SMSG_SPELL_CATEGORY_COOLDOWN = 0x2C17,
SMSG_SPELL_CHANNEL_START = 0x2C34,
SMSG_SPELL_CHANNEL_UPDATE = 0x2C35,
SMSG_SPELL_COOLDOWN = 0x2C15,
SMSG_SPELL_DAMAGE_SHIELD = 0x2C31,
- SMSG_SPELL_DELAYED = 0x2C3F,
+ SMSG_SPELL_DELAYED = 0x2C42,
SMSG_SPELL_DISPELL_LOG = 0x2C1A,
+ SMSG_SPELL_EMPOWER_SET_STAGE = 0x2C38,
+ SMSG_SPELL_EMPOWER_START = 0x2C36,
+ SMSG_SPELL_EMPOWER_UPDATE = 0x2C37,
SMSG_SPELL_ENERGIZE_LOG = 0x2C1C,
- SMSG_SPELL_EXECUTE_LOG = 0x2C40,
- SMSG_SPELL_FAILED_OTHER = 0x2C55,
- SMSG_SPELL_FAILURE = 0x2C53,
- SMSG_SPELL_FAILURE_MESSAGE = 0x2C5A,
- SMSG_SPELL_GO = 0x2C39,
+ SMSG_SPELL_EXECUTE_LOG = 0x2C43,
+ SMSG_SPELL_FAILED_OTHER = 0x2C58,
+ SMSG_SPELL_FAILURE = 0x2C56,
+ SMSG_SPELL_FAILURE_MESSAGE = 0x2C5D,
+ SMSG_SPELL_GO = 0x2C3C,
SMSG_SPELL_HEAL_ABSORB_LOG = 0x2C1E,
SMSG_SPELL_HEAL_LOG = 0x2C1D,
SMSG_SPELL_INSTAKILL_LOG = 0x2C33,
SMSG_SPELL_INTERRUPT_LOG = 0x2C20,
- SMSG_SPELL_MISS_LOG = 0x2C41,
+ SMSG_SPELL_MISS_LOG = 0x2C44,
SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x2C32,
SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x2C2F,
SMSG_SPELL_PERIODIC_AURA_LOG = 0x2C1B,
- SMSG_SPELL_PREPARE = 0x2C38,
- SMSG_SPELL_START = 0x2C3A,
- SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x25C8,
- SMSG_SPIRIT_HEALER_CONFIRM = 0x2709,
- SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x2863,
- SMSG_STAND_STATE_UPDATE = 0x2710,
- SMSG_START_ELAPSED_TIMER = 0x25FE,
- SMSG_START_ELAPSED_TIMERS = 0x2600,
- SMSG_START_LIGHTNING_STORM = 0x269F,
- SMSG_START_LOOT_ROLL = 0x2615,
- SMSG_START_MIRROR_TIMER = 0x2703,
- SMSG_START_TIMER = 0x25A4,
- SMSG_STOP_ELAPSED_TIMER = 0x25FF,
- SMSG_STOP_MIRROR_TIMER = 0x2705,
- SMSG_STOP_SPEAKERBOT_SOUND = 0x275F,
- SMSG_STREAMING_MOVIES = 0x25A3,
- SMSG_SUMMON_CANCEL = 0x26A8,
+ SMSG_SPELL_PREPARE = 0x2C3B,
+ SMSG_SPELL_START = 0x2C3D,
+ SMSG_SPELL_VISUAL_LOAD_SCREEN = 0x25CB,
+ SMSG_SPLASH_SCREEN_SHOW_LATEST = 0x286C,
+ SMSG_STAND_STATE_UPDATE = 0x2716,
+ SMSG_STARTER_BUILD_ACTIVATE_FAILED = 0x25D1,
+ SMSG_START_ELAPSED_TIMER = 0x2603,
+ SMSG_START_ELAPSED_TIMERS = 0x2605,
+ SMSG_START_LIGHTNING_STORM = 0x26A4,
+ SMSG_START_LOOT_ROLL = 0x261A,
+ SMSG_START_MIRROR_TIMER = 0x2709,
+ SMSG_START_TIMER = 0x25A6,
+ SMSG_STOP_ELAPSED_TIMER = 0x2604,
+ SMSG_STOP_MIRROR_TIMER = 0x270B,
+ SMSG_STOP_SPEAKERBOT_SOUND = 0x2765,
+ SMSG_STOP_TIMER = 0x25A7,
+ SMSG_STREAMING_MOVIES = 0x25A5,
+ SMSG_SUGGEST_INVITE_INFORM = 0x278D,
+ SMSG_SUMMON_CANCEL = 0x26AD,
SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258F,
- SMSG_SUMMON_REQUEST = 0x2715,
- SMSG_SUPERCEDED_SPELLS = 0x2C4C,
+ SMSG_SUMMON_REQUEST = 0x271B,
+ SMSG_SUPERCEDED_SPELLS = 0x2C4F,
SMSG_SUSPEND_COMMS = 0x304A,
- SMSG_SUSPEND_TOKEN = 0x25A6,
- SMSG_SYNC_WOW_ENTITLEMENTS = 0x285B,
- SMSG_TALENTS_INVOLUNTARILY_RESET = 0x270B,
- SMSG_TAXI_NODE_STATUS = 0x2674,
- SMSG_TEXT_EMOTE = 0x2672,
- SMSG_THREAT_CLEAR = 0x26D2,
- SMSG_THREAT_REMOVE = 0x26D1,
- SMSG_THREAT_UPDATE = 0x26D0,
+ SMSG_SUSPEND_TOKEN = 0x25A9,
+ SMSG_SYNC_WOW_ENTITLEMENTS = 0x2864,
+ SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2711,
+ SMSG_TAXI_NODE_STATUS = 0x2679,
+ SMSG_TEXT_EMOTE = 0x2677,
+ SMSG_THREAT_CLEAR = 0x26D7,
+ SMSG_THREAT_REMOVE = 0x26D6,
+ SMSG_THREAT_UPDATE = 0x26D5,
SMSG_TIME_ADJUSTMENT = 0x2DD3,
SMSG_TIME_SYNC_REQUEST = 0x2DD2,
- SMSG_TITLE_EARNED = 0x26CD,
- SMSG_TITLE_LOST = 0x26CE,
- SMSG_TOTEM_CREATED = 0x26BE,
- SMSG_TOTEM_DURATION_CHANGED = 0x26BF,
- SMSG_TOTEM_MOVED = 0x26C0,
+ SMSG_TITLE_EARNED = 0x26D2,
+ SMSG_TITLE_LOST = 0x26D3,
+ SMSG_TOTEM_CREATED = 0x26C3,
+ SMSG_TOTEM_DURATION_CHANGED = 0x26C4,
+ SMSG_TOTEM_MOVED = 0x26C5,
SMSG_TRADE_STATUS = 0x2582,
SMSG_TRADE_UPDATED = 0x2581,
- SMSG_TRAINER_BUY_FAILED = 0x26D5,
- SMSG_TRAINER_LIST = 0x26D4,
- SMSG_TRANSFER_ABORTED = 0x26F7,
- SMSG_TRANSFER_PENDING = 0x25C9,
- SMSG_TRANSMOGRIFY_NPC = 0x27E7,
+ SMSG_TRAINER_BUY_FAILED = 0x26DA,
+ SMSG_TRAINER_LIST = 0x26D9,
+ SMSG_TRAIT_CONFIG_COMMIT_FAILED = 0x25D0,
+ SMSG_TRANSFER_ABORTED = 0x26FD,
+ SMSG_TRANSFER_PENDING = 0x25CC,
SMSG_TREASURE_PICKER_RESPONSE = 0x291F,
- SMSG_TRIGGER_CINEMATIC = 0x27B9,
- SMSG_TRIGGER_MOVIE = 0x26C1,
- SMSG_TURN_IN_PETITION_RESULT = 0x2741,
- SMSG_TUTORIAL_FLAGS = 0x27AC,
+ SMSG_TRIGGER_CINEMATIC = 0x27C2,
+ SMSG_TRIGGER_MOVIE = 0x26C6,
+ SMSG_TURN_IN_PETITION_RESULT = 0x2747,
+ SMSG_TUTORIAL_FLAGS = 0x27B5,
SMSG_TWITTER_STATUS = 0x3043,
- SMSG_UI_HEALING_RANGE_MODIFIED = 0x2737,
- SMSG_UI_ITEM_INTERACTION_NPC = 0x27E9,
+ SMSG_UI_HEALING_RANGE_MODIFIED = 0x273D,
SMSG_UI_MAP_QUEST_LINES_RESPONSE = 0x2AA2,
- SMSG_UNDELETE_CHARACTER_RESPONSE = 0x27BC,
- SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x27BD,
- SMSG_UNLEARNED_SPELLS = 0x2C4E,
+ SMSG_UNDELETE_CHARACTER_RESPONSE = 0x27C5,
+ SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x27C6,
+ SMSG_UNLEARNED_SPELLS = 0x2C51,
SMSG_UNLOAD_CHILD_MAP = 0x257A,
- SMSG_UPDATE_AADC_STATUS_RESPONSE = 0x2875,
- SMSG_UPDATE_ACCOUNT_DATA = 0x26FD,
- SMSG_UPDATE_ACTION_BUTTONS = 0x25D9,
- SMSG_UPDATE_BNET_SESSION_KEY = 0x2813,
+ SMSG_UPDATE_AADC_STATUS_RESPONSE = 0x287E,
+ SMSG_UPDATE_ACCOUNT_DATA = 0x2703,
+ SMSG_UPDATE_ACTION_BUTTONS = 0x25DE,
+ SMSG_UPDATE_BNET_SESSION_KEY = 0x281D,
SMSG_UPDATE_CAPTURE_POINT = 0x2929,
- SMSG_UPDATE_CELESTIAL_BODY = 0x280F,
- SMSG_UPDATE_CHARACTER_FLAGS = 0x27B2,
- SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x2759,
- SMSG_UPDATE_COOLDOWN = 0x2758,
+ SMSG_UPDATE_CELESTIAL_BODY = 0x2819,
+ SMSG_UPDATE_CHARACTER_FLAGS = 0x27BB,
+ SMSG_UPDATE_CHARGE_CATEGORY_COOLDOWN = 0x275F,
+ SMSG_UPDATE_COOLDOWN = 0x275E,
+ SMSG_UPDATE_CRAFTING_NPC_RECIPES = 0x2996,
SMSG_UPDATE_DAILY_MISSION_COUNTER = 0x297F,
- SMSG_UPDATE_EXPANSION_LEVEL = 0x263E,
- SMSG_UPDATE_GAME_TIME_STATE = 0x2816,
- SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26A1,
- SMSG_UPDATE_LAST_INSTANCE = 0x2680,
- SMSG_UPDATE_OBJECT = 0x27BA,
- SMSG_UPDATE_PRIMARY_SPEC = 0x25D1,
- SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0x25EF,
- SMSG_UPDATE_TALENT_DATA = 0x25D0,
- SMSG_UPDATE_TASK_PROGRESS = 0x277E,
+ SMSG_UPDATE_EXPANSION_LEVEL = 0x2643,
+ SMSG_UPDATE_GAME_TIME_STATE = 0x2820,
+ SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26A6,
+ SMSG_UPDATE_LAST_INSTANCE = 0x2685,
+ SMSG_UPDATE_OBJECT = 0x27C3,
+ SMSG_UPDATE_PRIMARY_SPEC = 0x25D6,
+ SMSG_UPDATE_RECENT_PLAYER_GUIDS = 0x25F4,
+ SMSG_UPDATE_TALENT_DATA = 0x25D5,
+ SMSG_UPDATE_TASK_PROGRESS = 0x2784,
SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19,
- SMSG_UPDATE_WORLD_STATE = 0x273B,
+ SMSG_UPDATE_WORLD_STATE = 0x2741,
SMSG_USERLIST_ADD = 0x2BB9,
SMSG_USERLIST_REMOVE = 0x2BBA,
SMSG_USERLIST_UPDATE = 0x2BBB,
- SMSG_USE_EQUIPMENT_SET_RESULT = 0x2742,
- SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x280A,
- SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x2808,
- SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x2807,
- SMSG_VAS_PURCHASE_COMPLETE = 0x27E3,
- SMSG_VAS_PURCHASE_STATE_UPDATE = 0x27E2,
- SMSG_VENDOR_INVENTORY = 0x25B4,
+ SMSG_USE_EQUIPMENT_SET_RESULT = 0x2748,
+ SMSG_VAS_CHECK_TRANSFER_OK_RESPONSE = 0x2814,
+ SMSG_VAS_GET_QUEUE_MINUTES_RESPONSE = 0x2812,
+ SMSG_VAS_GET_SERVICE_STATUS_RESPONSE = 0x2811,
+ SMSG_VAS_PURCHASE_COMPLETE = 0x27EC,
+ SMSG_VAS_PURCHASE_STATE_UPDATE = 0x27EB,
+ SMSG_VENDOR_INVENTORY = 0x25B7,
SMSG_VIGNETTE_UPDATE = 0x3008,
- SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x280E,
- SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE = 0x286F,
- SMSG_VOICE_LOGIN_RESPONSE = 0x280D,
+ SMSG_VOICE_CHANNEL_INFO_RESPONSE = 0x2818,
+ SMSG_VOICE_CHANNEL_STT_TOKEN_RESPONSE = 0x2878,
+ SMSG_VOICE_LOGIN_RESPONSE = 0x2817,
SMSG_VOID_ITEM_SWAP_RESPONSE = 0x2DA4,
SMSG_VOID_STORAGE_CONTENTS = 0x2DA1,
SMSG_VOID_STORAGE_FAILED = 0x2DA0,
@@ -1957,28 +2027,28 @@ enum OpcodeServer : uint16
SMSG_WAIT_QUEUE_FINISH = 0x256F,
SMSG_WAIT_QUEUE_UPDATE = 0x256E,
SMSG_WARDEN3_DATA = 0x2577,
- SMSG_WARDEN3_DISABLED = 0x2811,
- SMSG_WARDEN3_ENABLED = 0x2810,
- SMSG_WARFRONT_COMPLETE = 0x2751,
+ SMSG_WARDEN3_DISABLED = 0x281B,
+ SMSG_WARDEN3_ENABLED = 0x281A,
+ SMSG_WARFRONT_COMPLETE = 0x2757,
SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x2933,
- SMSG_WEATHER = 0x269E,
- SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x2866,
- SMSG_WEEKLY_REWARDS_RESULT = 0x2864,
- SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x2865,
+ SMSG_WEATHER = 0x26A3,
+ SMSG_WEEKLY_REWARDS_PROGRESS_RESULT = 0x286F,
+ SMSG_WEEKLY_REWARDS_RESULT = 0x286D,
+ SMSG_WEEKLY_REWARD_CLAIM_RESULT = 0x286E,
SMSG_WEEKLY_SPELL_USAGE = 0x2C18,
SMSG_WHO = 0x2BAE,
- SMSG_WHO_IS = 0x269D,
- SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x2815,
- SMSG_WORLD_MAP_OPEN_NPC = 0x27E6,
+ SMSG_WHO_IS = 0x26A2,
+ SMSG_WILL_BE_KICKED_FOR_ADDED_SUBSCRIPTION_TIME = 0x281F,
SMSG_WORLD_QUEST_UPDATE_RESPONSE = 0x300F,
- SMSG_WORLD_SERVER_INFO = 0x25AB,
- SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x285C,
- SMSG_XP_GAIN_ABORTED = 0x25C5,
- SMSG_XP_GAIN_ENABLED = 0x279C,
+ SMSG_WORLD_SERVER_INFO = 0x25AE,
+ SMSG_WOW_ENTITLEMENT_NOTIFICATION = 0x2865,
+ SMSG_XP_AWARDED_FROM_CURRENCY = 0x28A0,
+ SMSG_XP_GAIN_ABORTED = 0x25C8,
+ SMSG_XP_GAIN_ENABLED = 0x27A5,
SMSG_ZONE_UNDER_ATTACK = 0x2BB5,
// Opcodes that are not generated automatically
- SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x25AE, // no client handler
+ SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x25B1, // no client handler
SMSG_COMPRESSED_PACKET = 0x3052,
SMSG_MULTIPLE_PACKETS = 0x3051,
@@ -2080,6 +2150,7 @@ class OpcodeTable
}
private:
+ bool ValidateClientOpcode(OpcodeClient opcode, char const* name) const;
template<typename Handler, Handler HandlerFunction>
void ValidateAndSetClientOpcode(OpcodeClient opcode, char const* name, SessionStatus status, PacketProcessing processing);
diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h
index 65021d13140..02460e30622 100644
--- a/src/server/game/Spells/Auras/SpellAuraDefines.h
+++ b/src/server/game/Spells/Auras/SpellAuraDefines.h
@@ -598,10 +598,34 @@ enum AuraType : uint32
SPELL_AURA_MOD_HEALING_TAKEN_FROM_CASTER = 504,
SPELL_AURA_MOD_PLAYER_CHOICE_REROLLS = 505, // NYI
SPELL_AURA_DISABLE_INERTIA = 506,
- SPELL_AURA_507 = 507,
+ SPELL_AURA_MOD_DAMAGE_TAKEN_FROM_CASTER_BY_LABEL = 507,
SPELL_AURA_508 = 508,
SPELL_AURA_509 = 509,
- SPELL_AURA_MODIFIED_RAID_INSTANCE = 510, // Related to "Fated" raid affixes
+ SPELL_AURA_MODIFIED_RAID_INSTANCE = 510, // NYI; Related to "Fated" raid affixes
+ SPELL_AURA_APPLY_PROFESSION_EFFECT = 511, // NYI; MiscValue[0] = ProfessionEffectID
+ SPELL_AURA_512 = 512,
+ SPELL_AURA_513 = 513,
+ SPELL_AURA_514 = 514,
+ SPELL_AURA_515 = 515,
+ SPELL_AURA_516 = 516,
+ SPELL_AURA_517 = 517,
+ SPELL_AURA_518 = 518,
+ SPELL_AURA_MOD_COOLDOWN_RECOVERY_RATE_ALL = 519, // NYI; applies to all spells, not filtered by familyflags or label
+ SPELL_AURA_520 = 520,
+ SPELL_AURA_521 = 521,
+ SPELL_AURA_522 = 522,
+ SPELL_AURA_523 = 523,
+ SPELL_AURA_524 = 524,
+ SPELL_AURA_DISPLAY_PROFESSION_EQUIPMENT = 525, // NYI; MiscValue[0] = Profession (enum, not id)
+ SPELL_AURA_526 = 526,
+ SPELL_AURA_527 = 527,
+ SPELL_AURA_ALLOW_BLOCKING_SPELLS = 528, // NYI
+ SPELL_AURA_MOD_SPELL_BLOCK_CHANCE = 529, // NYI
+ SPELL_AURA_530 = 530,
+ SPELL_AURA_531 = 531,
+ SPELL_AURA_532 = 532,
+ SPELL_AURA_DISABLE_NAVIGATION = 533, // disables map pins
+ SPELL_AURA_534 = 534,
TOTAL_AURAS
};
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index e1d291eb857..3ba85fdc262 100644
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -573,10 +573,34 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]=
&AuraEffect::HandleNoImmediateEffect, //504 SPELL_AURA_MOD_HEALING_TAKEN_FROM_CASTER implemented in Unit::SpellHealingBonusTaken
&AuraEffect::HandleNULL, //505 SPELL_AURA_MOD_PLAYER_CHOICE_REROLLS
&AuraEffect::HandleDisableInertia, //506 SPELL_AURA_DISABLE_INERTIA
- &AuraEffect::HandleNULL, //507
+ &AuraEffect::HandleNoImmediateEffect, //507 SPELL_AURA_MOD_DAMAGE_TAKEN_FROM_CASTER_BY_LABEL implemented in Unit::SpellDamageBonusTaken
&AuraEffect::HandleNULL, //508
&AuraEffect::HandleNULL, //509
&AuraEffect::HandleNULL, //510 SPELL_AURA_MODIFIED_RAID_INSTANCE
+ &AuraEffect::HandleNULL, //511 SPELL_AURA_APPLY_PROFESSION_EFFECT
+ &AuraEffect::HandleNULL, //512
+ &AuraEffect::HandleNULL, //513
+ &AuraEffect::HandleNULL, //514
+ &AuraEffect::HandleNULL, //515
+ &AuraEffect::HandleNULL, //516
+ &AuraEffect::HandleNULL, //517
+ &AuraEffect::HandleNULL, //518
+ &AuraEffect::HandleNULL, //519 SPELL_AURA_MOD_COOLDOWN_RECOVERY_RATE_ALL
+ &AuraEffect::HandleNULL, //520
+ &AuraEffect::HandleNULL, //521
+ &AuraEffect::HandleNULL, //522
+ &AuraEffect::HandleNULL, //523
+ &AuraEffect::HandleNULL, //524
+ &AuraEffect::HandleNULL, //525 SPELL_AURA_DISPLAY_PROFESSION_EQUIPMENT
+ &AuraEffect::HandleNULL, //526
+ &AuraEffect::HandleNULL, //527
+ &AuraEffect::HandleNULL, //528 SPELL_AURA_ALLOW_BLOCKING_SPELLS
+ &AuraEffect::HandleNULL, //529 SPELL_AURA_MOD_SPELL_BLOCK_CHANCE
+ &AuraEffect::HandleNULL, //530
+ &AuraEffect::HandleNULL, //531
+ &AuraEffect::HandleNULL, //532
+ &AuraEffect::HandleNULL, //533 SPELL_AURA_DISABLE_NAVIGATION
+ &AuraEffect::HandleNULL, //534
};
AuraEffect::AuraEffect(Aura* base, SpellEffectInfo const& spellEfffectInfo, int32 const* baseAmount, Unit* caster) :
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index b045b6473fd..2cd10e0b4e8 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -5582,6 +5582,11 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
if (m_spellInfo->ExcludeCasterAuraSpell && unitCaster->HasAura(m_spellInfo->ExcludeCasterAuraSpell))
return SPELL_FAILED_CASTER_AURASTATE;
+ if (m_spellInfo->CasterAuraType && !unitCaster->HasAuraType(m_spellInfo->CasterAuraType))
+ return SPELL_FAILED_CASTER_AURASTATE;
+ if (m_spellInfo->ExcludeCasterAuraType && unitCaster->HasAuraType(m_spellInfo->ExcludeCasterAuraType))
+ return SPELL_FAILED_CASTER_AURASTATE;
+
if (reqCombat && unitCaster->IsInCombat() && !m_spellInfo->CanBeUsedInCombat())
return SPELL_FAILED_AFFECTING_COMBAT;
}
@@ -6390,19 +6395,15 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
if (spellEffectInfo.Effect == SPELL_EFFECT_CHANGE_BATTLEPET_QUALITY)
{
- BattlePets::BattlePetBreedQuality quality = BattlePets::BattlePetBreedQuality::Poor;
- switch (spellEffectInfo.BasePoints)
+ auto qualityItr = std::lower_bound(sBattlePetBreedQualityStore.begin(), sBattlePetBreedQualityStore.end(), spellEffectInfo.BasePoints, [](BattlePetBreedQualityEntry const* a1, int32 selector)
{
- case 85:
- quality = BattlePets::BattlePetBreedQuality::Rare;
- break;
- case 75:
- quality = BattlePets::BattlePetBreedQuality::Uncommon;
- break;
- default:
- // Ignore Epic Battle-Stones
- break;
- }
+ return a1->MaxQualityRoll < selector;
+ });
+
+ BattlePets::BattlePetBreedQuality quality = BattlePets::BattlePetBreedQuality::Poor;
+ if (qualityItr != sBattlePetBreedQualityStore.end())
+ quality = BattlePets::BattlePetBreedQuality(qualityItr->QualityEnum);
+
if (battlePet->PacketInfo.Quality >= AsUnderlyingType(quality))
return SPELL_FAILED_CANT_UPGRADE_BATTLE_PET;
}
@@ -6668,7 +6669,7 @@ SpellCastResult Spell::CheckCasterAuras(int32* param1) const
Unit::AuraEffectList const& auras = unitCaster->GetAuraEffectsByType(type);
for (AuraEffect const* aurEff : auras)
{
- uint32 const mechanicMask = aurEff->GetSpellInfo()->GetAllEffectsMechanicMask();
+ uint64 const mechanicMask = aurEff->GetSpellInfo()->GetAllEffectsMechanicMask();
if (mechanicMask && !(mechanicMask & GetSpellInfo()->GetAllowedMechanicMask()))
{
foundNotMechanic = true;
@@ -7467,21 +7468,21 @@ SpellCastResult Spell::CheckItems(int32* param1 /*= nullptr*/, int32* param2 /*=
{
Item const* item = m_targets.GetItemTarget();
if (!item)
- return SPELL_FAILED_CANT_BE_DISENCHANTED;
+ return SPELL_FAILED_CANT_BE_SALVAGED;
// prevent disenchanting in trade slot
if (item->GetOwnerGUID() != player->GetGUID())
- return SPELL_FAILED_CANT_BE_DISENCHANTED;
+ return SPELL_FAILED_CANT_BE_SALVAGED;
ItemTemplate const* itemProto = item->GetTemplate();
if (!itemProto)
- return SPELL_FAILED_CANT_BE_DISENCHANTED;
+ return SPELL_FAILED_CANT_BE_SALVAGED;
ItemDisenchantLootEntry const* itemDisenchantLoot = item->GetDisenchantLoot(m_caster->ToPlayer());
if (!itemDisenchantLoot)
- return SPELL_FAILED_CANT_BE_DISENCHANTED;
+ return SPELL_FAILED_CANT_BE_SALVAGED;
if (itemDisenchantLoot->SkillRequired > player->GetSkillValue(SKILL_ENCHANTING))
- return SPELL_FAILED_LOW_CASTLEVEL;
+ return SPELL_FAILED_CANT_BE_SALVAGED_SKILL;
break;
}
case SPELL_EFFECT_PROSPECTING:
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h
index 017a07498b0..e66f4f55ab6 100644
--- a/src/server/game/Spells/Spell.h
+++ b/src/server/game/Spells/Spell.h
@@ -403,6 +403,11 @@ class TC_GAME_API Spell
void EffectSendChatMessage();
void EffectGrantBattlePetExperience();
void EffectLearnTransmogIllusion();
+ void EffectModifyAuraStacks();
+ void EffectModifyCooldown();
+ void EffectModifyCooldowns();
+ void EffectModifyCooldownsByCategory();
+ void EffectModifySpellCharges();
typedef std::unordered_set<Aura*> UsedSpellMods;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 6aefb6c38d9..2bde0329e6f 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -371,8 +371,23 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF
&Spell::EffectNULL, //285 SPELL_EFFECT_MODIFY_KEYSTONE_2
&Spell::EffectGrantBattlePetExperience, //286 SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE
&Spell::EffectNULL, //287 SPELL_EFFECT_SET_GARRISON_FOLLOWER_LEVEL
- &Spell::EffectUnused, //288 SPELL_EFFECT_288
- &Spell::EffectNULL, //289 SPELL_EFFECT_289
+ &Spell::EffectNULL, //288 SPELL_EFFECT_CRAFT_ITEM
+ &Spell::EffectModifyAuraStacks, //289 SPELL_EFFECT_MODIFY_AURA_STACKS
+ &Spell::EffectModifyCooldown, //290 SPELL_EFFECT_MODIFY_COOLDOWN
+ &Spell::EffectModifyCooldowns, //291 SPELL_EFFECT_MODIFY_COOLDOWNS
+ &Spell::EffectModifyCooldownsByCategory, //292 SPELL_EFFECT_MODIFY_COOLDOWNS_BY_CATEGORY
+ &Spell::EffectModifySpellCharges, //293 SPELL_EFFECT_MODIFY_CHARGES
+ &Spell::EffectNULL, //294 SPELL_EFFECT_CRAFT_LOOT
+ &Spell::EffectNULL, //295 SPELL_EFFECT_SALVAGE_ITEM
+ &Spell::EffectNULL, //296 SPELL_EFFECT_CRAFT_SALVAGE_ITEM
+ &Spell::EffectNULL, //297 SPELL_EFFECT_RECRAFT_ITEM
+ &Spell::EffectNULL, //298 SPELL_EFFECT_CANCEL_ALL_PRIVATE_CONVERSATIONS
+ &Spell::EffectNULL, //299 SPELL_EFFECT_299
+ &Spell::EffectUnused, //300 SPELL_EFFECT_300
+ &Spell::EffectNULL, //301 SPELL_EFFECT_CRAFT_ENCHANT
+ &Spell::EffectNULL, //302 SPELL_EFFECT_GATHERING
+ &Spell::EffectNULL, //303 SPELL_EFFECT_CREATE_TRAIT_TREE_CONFIG
+ &Spell::EffectNULL, //304 SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG
};
void Spell::EffectNULL()
@@ -2439,30 +2454,7 @@ void Spell::EffectEnchantItemTmp()
}
// select enchantment duration
- uint32 duration;
-
- // rogue family enchantments exception by duration
- if (m_spellInfo->Id == 38615)
- duration = 1800; // 30 mins
- // other rogue family enchantments always 1 hour (some have spell damage=0, but some have wrong data in EffBasePoints)
- else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE)
- duration = 3600; // 1 hour
- // shaman family enchantments
- else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN)
- duration = 3600; // 30 mins
- // other cases with this SpellVisual already selected
- else if (m_spellInfo->GetSpellVisual() == 215)
- duration = 1800; // 30 mins
- // some fishing pole bonuses except Glow Worm which lasts full hour
- else if (m_spellInfo->GetSpellVisual() == 563 && m_spellInfo->Id != 64401)
- duration = 600; // 10 mins
- else if (m_spellInfo->Id == 29702)
- duration = 300; // 5 mins
- else if (m_spellInfo->Id == 37360)
- duration = 300; // 5 mins
- // default case
- else
- duration = 3600; // 1 hour
+ uint32 duration = pEnchant->Duration;
// item can be in trade slot and have owner diff. from caster
Player* item_owner = itemTarget->GetOwner();
@@ -5385,19 +5377,14 @@ void Spell::EffectChangeBattlePetQuality()
if (!unitTarget || !unitTarget->IsCreature())
return;
- BattlePets::BattlePetBreedQuality quality = BattlePets::BattlePetBreedQuality::Poor;
- switch (damage)
+ auto qualityItr = std::lower_bound(sBattlePetBreedQualityStore.begin(), sBattlePetBreedQualityStore.end(), damage, [](BattlePetBreedQualityEntry const* a1, int32 selector)
{
- case 85:
- quality = BattlePets::BattlePetBreedQuality::Rare;
- break;
- case 75:
- quality = BattlePets::BattlePetBreedQuality::Uncommon;
- break;
- default:
- // Ignore Epic Battle-Stones
- break;
- }
+ return a1->MaxQualityRoll < selector;
+ });
+
+ BattlePets::BattlePetBreedQuality quality = BattlePets::BattlePetBreedQuality::Poor;
+ if (qualityItr != sBattlePetBreedQualityStore.end())
+ quality = BattlePets::BattlePetBreedQuality(qualityItr->QualityEnum);
playerCaster->GetSession()->GetBattlePetMgr()->ChangeBattlePetQuality(unitTarget->GetBattlePetCompanionGUID(), quality);
}
@@ -5815,3 +5802,74 @@ void Spell::EffectLearnTransmogIllusion()
player->GetSession()->GetCollectionMgr()->AddTransmogIllusion(illusionId);
}
+
+void Spell::EffectModifyAuraStacks()
+{
+ if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
+ return;
+
+ Aura* targetAura = unitTarget->GetAura(effectInfo->TriggerSpell);
+ if (!targetAura)
+ return;
+
+ switch (effectInfo->MiscValue)
+ {
+ case 0:
+ targetAura->ModStackAmount(damage);
+ break;
+ case 1:
+ targetAura->SetStackAmount(damage);
+ break;
+ default:
+ break;
+ }
+}
+
+void Spell::EffectModifyCooldown()
+{
+ if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
+ return;
+
+ unitTarget->GetSpellHistory()->ModifyCooldown(effectInfo->TriggerSpell, Milliseconds(damage));
+}
+
+void Spell::EffectModifyCooldowns()
+{
+ if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
+ return;
+
+ unitTarget->GetSpellHistory()->ModifyCoooldowns([this](SpellHistory::CooldownStorageType::iterator itr)
+ {
+ SpellInfo const* spellOnCooldown = sSpellMgr->AssertSpellInfo(itr->first, DIFFICULTY_NONE);
+ if (spellOnCooldown->SpellFamilyName != uint32(effectInfo->MiscValue))
+ return false;
+
+ int32 bitIndex = effectInfo->MiscValueB - 1;
+ if (bitIndex < 0 || uint32(bitIndex) >= sizeof(flag128) * 8)
+ return false;
+
+ flag128 reqFlag;
+ reqFlag[bitIndex / 32] = 1u << (bitIndex % 32);
+ return bool(spellOnCooldown->SpellFamilyFlags & reqFlag);
+ }, Milliseconds(damage));
+}
+
+void Spell::EffectModifyCooldownsByCategory()
+{
+ if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
+ return;
+
+ unitTarget->GetSpellHistory()->ModifyCoooldowns([this](SpellHistory::CooldownStorageType::iterator itr)
+ {
+ return sSpellMgr->AssertSpellInfo(itr->first, DIFFICULTY_NONE)->CategoryId == uint32(effectInfo->MiscValue);
+ }, Milliseconds(damage));
+}
+
+void Spell::EffectModifySpellCharges()
+{
+ if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
+ return;
+
+ for (int32 i = 0; i < damage; ++i)
+ unitTarget->GetSpellHistory()->RestoreCharge(effectInfo->MiscValue);
+}
diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp
index c97b36d0a3a..d3aa6dfdf09 100644
--- a/src/server/game/Spells/SpellHistory.cpp
+++ b/src/server/game/Spells/SpellHistory.cpp
@@ -568,20 +568,25 @@ void SpellHistory::AddCooldown(uint32 spellId, uint32 itemId, Clock::time_point
}
}
-void SpellHistory::ModifySpellCooldown(uint32 spellId, Duration offset, bool withoutCategoryCooldown)
+void SpellHistory::ModifySpellCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown)
{
auto itr = _spellCooldowns.find(spellId);
- if (!offset.count() || itr == _spellCooldowns.end())
+ if (!cooldownMod.count() || itr == _spellCooldowns.end())
return;
+ ModifySpellCooldown(itr, cooldownMod, withoutCategoryCooldown);
+}
+
+void SpellHistory::ModifySpellCooldown(CooldownStorageType::iterator& itr, Duration cooldownMod, bool withoutCategoryCooldown)
+{
Clock::time_point now = GameTime::GetTime<Clock>();
- itr->second.CooldownEnd += offset;
+ itr->second.CooldownEnd += cooldownMod;
if (itr->second.CategoryId)
{
if (!withoutCategoryCooldown)
- itr->second.CategoryEnd += offset;
+ itr->second.CategoryEnd += cooldownMod;
// Because category cooldown existence is tied to regular cooldown, we cannot allow a situation where regular cooldown is shorter than category
if (itr->second.CooldownEnd < itr->second.CategoryEnd)
@@ -589,14 +594,14 @@ void SpellHistory::ModifySpellCooldown(uint32 spellId, Duration offset, bool wit
}
if (itr->second.CooldownEnd <= now)
- EraseCooldown(itr);
+ itr = EraseCooldown(itr);
if (Player* playerOwner = GetPlayerOwner())
{
WorldPackets::Spells::ModifyCooldown modifyCooldown;
modifyCooldown.IsPet = _owner != playerOwner;
- modifyCooldown.SpellID = spellId;
- modifyCooldown.DeltaTime = std::chrono::duration_cast<Milliseconds>(offset).count();
+ modifyCooldown.SpellID = itr->second.SpellId;
+ modifyCooldown.DeltaTime = std::chrono::duration_cast<Milliseconds>(cooldownMod).count();
modifyCooldown.WithoutCategoryCooldown = withoutCategoryCooldown;
playerOwner->SendDirectMessage(modifyCooldown.Write());
}
@@ -666,6 +671,9 @@ bool SpellHistory::HasCooldown(SpellInfo const* spellInfo, uint32 itemId /*= 0*/
if (_spellCooldowns.count(spellInfo->Id) != 0)
return true;
+ if (spellInfo->CooldownAuraSpellId && _owner->HasAura(spellInfo->CooldownAuraSpellId))
+ return true;
+
uint32 category = 0;
GetCooldownDurations(spellInfo, itemId, nullptr, &category, nullptr);
if (!category)
diff --git a/src/server/game/Spells/SpellHistory.h b/src/server/game/Spells/SpellHistory.h
index 1a32371153e..f15a51c95c5 100644
--- a/src/server/game/Spells/SpellHistory.h
+++ b/src/server/game/Spells/SpellHistory.h
@@ -113,8 +113,19 @@ public:
void AddCooldown(uint32 spellId, uint32 itemId, Clock::time_point cooldownEnd, uint32 categoryId, Clock::time_point categoryEnd, bool onHold = false);
void ModifyCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown = false);
void ModifyCooldown(SpellInfo const* spellInfo, Duration cooldownMod, bool withoutCategoryCooldown = false);
+ template<typename Predicate>
+ void ModifyCoooldowns(Predicate&& predicate, Duration cooldownMod, bool withoutCategoryCooldown = false)
+ {
+ for (auto itr = _spellCooldowns.begin(); itr != _spellCooldowns.end();)
+ {
+ if (predicate(itr))
+ ModifySpellCooldown(itr, cooldownMod, withoutCategoryCooldown);
+ else
+ ++itr;
+ }
+ }
+
void ResetCooldown(uint32 spellId, bool update = false);
- void ResetCooldown(CooldownStorageType::iterator& itr, bool update = false);
template<typename Predicate>
void ResetCooldowns(Predicate predicate, bool update = false)
{
@@ -166,7 +177,9 @@ public:
private:
Player* GetPlayerOwner() const;
- void ModifySpellCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown = false);
+ void ModifySpellCooldown(uint32 spellId, Duration cooldownMod, bool withoutCategoryCooldown);
+ void ModifySpellCooldown(CooldownStorageType::iterator& itr, Duration cooldownMod, bool withoutCategoryCooldown);
+ void ResetCooldown(CooldownStorageType::iterator& itr, bool update = false);
void SendClearCooldowns(std::vector<int32> const& cooldowns) const;
CooldownStorageType::iterator EraseCooldown(CooldownStorageType::iterator itr)
{
diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp
index 9317c8d2e73..fa6221427bb 100644
--- a/src/server/game/Spells/SpellInfo.cpp
+++ b/src/server/game/Spells/SpellInfo.cpp
@@ -1096,8 +1096,23 @@ std::array<SpellEffectInfo::StaticData, TOTAL_SPELL_EFFECTS> SpellEffectInfo::_d
{EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 285 SPELL_EFFECT_MODIFY_KEYSTONE_2
{EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 286 SPELL_EFFECT_GRANT_BATTLEPET_EXPERIENCE
{EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 287 SPELL_EFFECT_SET_GARRISON_FOLLOWER_LEVEL
- {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 288 SPELL_EFFECT_288
- {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 289 SPELL_EFFECT_289
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 288 SPELL_EFFECT_CRAFT_ITEM
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 289 SPELL_EFFECT_MODIFY_AURA_STACKS
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 290 SPELL_EFFECT_MODIFY_COOLDOWN
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 291 SPELL_EFFECT_MODIFY_COOLDOWNS
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 292 SPELL_EFFECT_MODIFY_COOLDOWNS_BY_CATEGORY
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 293 SPELL_EFFECT_MODIFY_CHARGES
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 294 SPELL_EFFECT_CRAFT_LOOT
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 295 SPELL_EFFECT_SALVAGE_ITEM
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 296 SPELL_EFFECT_CRAFT_SALVAGE_ITEM
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 297 SPELL_EFFECT_RECRAFT_ITEM
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 298 SPELL_EFFECT_CANCEL_ALL_PRIVATE_CONVERSATIONS
+ {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 299 SPELL_EFFECT_299
+ {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 300 SPELL_EFFECT_300
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_ITEM}, // 301 SPELL_EFFECT_CRAFT_ENCHANT
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_NONE}, // 302 SPELL_EFFECT_GATHERING
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 303 SPELL_EFFECT_CREATE_TRAIT_TREE_CONFIG
+ {EFFECT_IMPLICIT_TARGET_EXPLICIT, TARGET_OBJECT_TYPE_UNIT}, // 304 SPELL_EFFECT_CHANGE_ACTIVE_COMBAT_TRAIT_CONFIG
} };
SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, SpellInfoLoadHelper const& data)
@@ -1184,6 +1199,10 @@ SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, S
TargetAuraSpell = _aura->TargetAuraSpell;
ExcludeCasterAuraSpell = _aura->ExcludeCasterAuraSpell;
ExcludeTargetAuraSpell = _aura->ExcludeTargetAuraSpell;
+ CasterAuraType = AuraType(_aura->CasterAuraType);
+ TargetAuraType = AuraType(_aura->TargetAuraType);
+ ExcludeCasterAuraType = AuraType(_aura->ExcludeCasterAuraType);
+ ExcludeTargetAuraType = AuraType(_aura->ExcludeTargetAuraType);
}
// SpellCastingRequirementsEntry
@@ -1219,6 +1238,7 @@ SpellInfo::SpellInfo(SpellNameEntry const* spellName, ::Difficulty difficulty, S
RecoveryTime = _cooldowns->RecoveryTime;
CategoryRecoveryTime = _cooldowns->CategoryRecoveryTime;
StartRecoveryTime = _cooldowns->StartRecoveryTime;
+ CooldownAuraSpellId = _cooldowns->AuraSpellID;
}
// SpellEquippedItemsEntry
@@ -3924,7 +3944,7 @@ Optional<SpellPowerCost> SpellInfo::CalcPowerCost(SpellPowerEntry const* power,
powerCost += int32(CalculatePct(unitCaster->GetCreateMana(), power->PowerCostPct));
break;
case POWER_ALTERNATE_POWER:
- TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type '%d' in spell %d", power->PowerType, Id);
+ TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type POWER_ALTERNATE_POWER in spell %d", Id);
return {};
default:
{
@@ -3943,6 +3963,35 @@ Optional<SpellPowerCost> SpellInfo::CalcPowerCost(SpellPowerEntry const* power,
else
{
powerCost = int32(power->OptionalCost);
+
+ if (power->OptionalCostPct)
+ {
+ switch (power->PowerType)
+ {
+ // health as power used
+ case POWER_HEALTH:
+ powerCost += int32(CalculatePct(unitCaster->GetMaxHealth(), power->OptionalCostPct));
+ break;
+ case POWER_MANA:
+ powerCost += int32(CalculatePct(unitCaster->GetCreateMana(), power->OptionalCostPct));
+ break;
+ case POWER_ALTERNATE_POWER:
+ TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unsupported power type POWER_ALTERNATE_POWER in spell %d for optional cost percent", Id);
+ return {};
+ default:
+ {
+ if (PowerTypeEntry const* powerTypeEntry = sDB2Manager.GetPowerTypeEntry(Powers(power->PowerType)))
+ {
+ powerCost += int32(CalculatePct(powerTypeEntry->MaxBasePower, power->OptionalCostPct));
+ break;
+ }
+
+ TC_LOG_ERROR("spells", "SpellInfo::CalcPowerCost: Unknown power type '%d' in spell %d for optional cost percent", power->PowerType, Id);
+ return {};
+ }
+ }
+ }
+
powerCost += unitCaster->GetTotalAuraModifier(SPELL_AURA_MOD_ADDITIONAL_POWER_COST, [this, power](AuraEffect const* aurEff) -> bool
{
return aurEff->GetMiscValue() == power->PowerType
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 100c1166ee4..878904a6444 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -380,11 +380,16 @@ class TC_GAME_API SpellInfo
uint32 TargetAuraSpell = 0;
uint32 ExcludeCasterAuraSpell = 0;
uint32 ExcludeTargetAuraSpell = 0;
+ AuraType CasterAuraType = SPELL_AURA_NONE;
+ AuraType TargetAuraType = SPELL_AURA_NONE;
+ AuraType ExcludeCasterAuraType = SPELL_AURA_NONE;
+ AuraType ExcludeTargetAuraType = SPELL_AURA_NONE;
SpellCastTimesEntry const* CastTimeEntry = nullptr;
uint32 RecoveryTime = 0;
uint32 CategoryRecoveryTime = 0;
uint32 StartRecoveryCategory = 0;
uint32 StartRecoveryTime = 0;
+ uint32 CooldownAuraSpellId = 0;
EnumFlag<SpellInterruptFlags> InterruptFlags = SpellInterruptFlags::None;
EnumFlag<SpellAuraInterruptFlags> AuraInterruptFlags = SpellAuraInterruptFlags::None;
EnumFlag<SpellAuraInterruptFlags2> AuraInterruptFlags2 = SpellAuraInterruptFlags2::None;
diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp
index 9d90a5560bb..05554c372b5 100644
--- a/src/server/game/Spells/SpellMgr.cpp
+++ b/src/server/game/Spells/SpellMgr.cpp
@@ -2767,17 +2767,19 @@ void SpellMgr::LoadSpellInfoServerside()
"AttributesEx4, AttributesEx5, AttributesEx6, AttributesEx7, AttributesEx8, AttributesEx9, AttributesEx10, AttributesEx11, AttributesEx12, AttributesEx13, "
// 19 20 21 22 23 24 25 26 27
"AttributesEx14, Stances, StancesNot, Targets, TargetCreatureType, RequiresSpellFocus, FacingCasterFlags, CasterAuraState, TargetAuraState, "
- // 28 29 30 31 32 33 34
- "ExcludeCasterAuraState, ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell, CastingTimeIndex, "
- // 35 36 37 38 39 40 41
+ // 28 29 30 31 32 33
+ "ExcludeCasterAuraState, ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell, "
+ // 34 35 36 37 38
+ "CasterAuraType, TargetAuraType, ExcludeCasterAuraType, ExcludeTargetAuraType, CastingTimeIndex, "
+ // 39 40 41 42 43 44 45
"RecoveryTime, CategoryRecoveryTime, StartRecoveryCategory, StartRecoveryTime, InterruptFlags, AuraInterruptFlags1, AuraInterruptFlags2, "
- // 42 43 44 45 46 47 48 49 50 51 52
+ // 46 47 48 49 50 51 52 53 54 55 56
"ChannelInterruptFlags1, ChannelInterruptFlags2, ProcFlags, ProcFlags2, ProcChance, ProcCharges, ProcCooldown, ProcBasePPM, MaxLevel, BaseLevel, SpellLevel, "
- // 35 54 55 56 57 58 59 60 61
+ // 57 58 59 60 61 62 63 64 65
"DurationIndex, RangeIndex, Speed, LaunchDelay, StackAmount, EquippedItemClass, EquippedItemSubClassMask, EquippedItemInventoryTypeMask, ContentTuningId, "
- // 62 63 64 65 66 67 68 69 70 71
+ // 66 67 68 69 70 71 72 73 74 75
"SpellName, ConeAngle, ConeWidth, MaxTargetLevel, MaxAffectedTargets, SpellFamilyName, SpellFamilyFlags1, SpellFamilyFlags2, SpellFamilyFlags3, SpellFamilyFlags4, "
- // 72 73 74 75 76
+ // 76 77 78 79 80
"DmgClass, PreventionType, AreaGroupId, SchoolMask, ChargeCategoryId FROM serverside_spell");
if (spellsResult)
{
@@ -2795,7 +2797,7 @@ void SpellMgr::LoadSpellInfoServerside()
continue;
}
- mServersideSpellNames.emplace_back(spellId, fields[62].GetString());
+ mServersideSpellNames.emplace_back(spellId, fields[66].GetString());
SpellInfo& spellInfo = const_cast<SpellInfo&>(*mSpellInfoMap.emplace(&mServersideSpellNames.back().Name, difficulty, spellEffects[{ spellId, difficulty }]).first);
spellInfo.CategoryId = fields[2].GetUInt32();
@@ -2830,45 +2832,49 @@ void SpellMgr::LoadSpellInfoServerside()
spellInfo.TargetAuraSpell = fields[31].GetUInt32();
spellInfo.ExcludeCasterAuraSpell = fields[32].GetUInt32();
spellInfo.ExcludeTargetAuraSpell = fields[33].GetUInt32();
- spellInfo.CastTimeEntry = sSpellCastTimesStore.LookupEntry(fields[34].GetUInt32());
- spellInfo.RecoveryTime = fields[35].GetUInt32();
- spellInfo.CategoryRecoveryTime = fields[36].GetUInt32();
- spellInfo.StartRecoveryCategory = fields[37].GetUInt32();
- spellInfo.StartRecoveryTime = fields[38].GetUInt32();
- spellInfo.InterruptFlags = SpellInterruptFlags(fields[39].GetUInt32());
- spellInfo.AuraInterruptFlags = SpellAuraInterruptFlags(fields[40].GetUInt32());
- spellInfo.AuraInterruptFlags2 = SpellAuraInterruptFlags2(fields[41].GetUInt32());
- spellInfo.ChannelInterruptFlags = SpellAuraInterruptFlags(fields[42].GetUInt32());
- spellInfo.ChannelInterruptFlags2 = SpellAuraInterruptFlags2(fields[43].GetUInt32());
- spellInfo.ProcFlags[0] = fields[44].GetUInt32();
- spellInfo.ProcFlags[1] = fields[45].GetUInt32();
- spellInfo.ProcChance = fields[46].GetUInt32();
- spellInfo.ProcCharges = fields[47].GetUInt32();
- spellInfo.ProcCooldown = fields[48].GetUInt32();
- spellInfo.ProcBasePPM = fields[49].GetFloat();
- spellInfo.MaxLevel = fields[50].GetUInt32();
- spellInfo.BaseLevel = fields[51].GetUInt32();
- spellInfo.SpellLevel = fields[52].GetUInt32();
- spellInfo.DurationEntry = sSpellDurationStore.LookupEntry(fields[53].GetUInt32());
- spellInfo.RangeEntry = sSpellRangeStore.LookupEntry(fields[54].GetUInt32());
- spellInfo.Speed = fields[55].GetFloat();
- spellInfo.LaunchDelay = fields[56].GetFloat();
- spellInfo.StackAmount = fields[57].GetUInt32();
- spellInfo.EquippedItemClass = fields[58].GetInt32();
- spellInfo.EquippedItemSubClassMask = fields[59].GetInt32();
- spellInfo.EquippedItemInventoryTypeMask = fields[60].GetInt32();
- spellInfo.ContentTuningId = fields[61].GetUInt32();
- spellInfo.ConeAngle = fields[63].GetFloat();
- spellInfo.Width = fields[64].GetFloat();
- spellInfo.MaxTargetLevel = fields[65].GetUInt32();
- spellInfo.MaxAffectedTargets = fields[66].GetUInt32();
- spellInfo.SpellFamilyName = fields[67].GetUInt32();
- spellInfo.SpellFamilyFlags = flag128(fields[68].GetUInt32(), fields[69].GetUInt32(), fields[70].GetUInt32(), fields[71].GetUInt32());
- spellInfo.DmgClass = fields[72].GetUInt32();
- spellInfo.PreventionType = fields[73].GetUInt32();
- spellInfo.RequiredAreasID = fields[74].GetInt32();
- spellInfo.SchoolMask = fields[75].GetUInt32();
- spellInfo.ChargeCategoryId = fields[76].GetUInt32();
+ spellInfo.CasterAuraType = AuraType(fields[34].GetInt32());
+ spellInfo.TargetAuraType = AuraType(fields[35].GetInt32());
+ spellInfo.ExcludeCasterAuraType = AuraType(fields[36].GetInt32());
+ spellInfo.ExcludeTargetAuraType = AuraType(fields[37].GetInt32());
+ spellInfo.CastTimeEntry = sSpellCastTimesStore.LookupEntry(fields[38].GetUInt32());
+ spellInfo.RecoveryTime = fields[39].GetUInt32();
+ spellInfo.CategoryRecoveryTime = fields[40].GetUInt32();
+ spellInfo.StartRecoveryCategory = fields[41].GetUInt32();
+ spellInfo.StartRecoveryTime = fields[42].GetUInt32();
+ spellInfo.InterruptFlags = SpellInterruptFlags(fields[43].GetUInt32());
+ spellInfo.AuraInterruptFlags = SpellAuraInterruptFlags(fields[44].GetUInt32());
+ spellInfo.AuraInterruptFlags2 = SpellAuraInterruptFlags2(fields[45].GetUInt32());
+ spellInfo.ChannelInterruptFlags = SpellAuraInterruptFlags(fields[46].GetUInt32());
+ spellInfo.ChannelInterruptFlags2 = SpellAuraInterruptFlags2(fields[47].GetUInt32());
+ spellInfo.ProcFlags[0] = fields[48].GetUInt32();
+ spellInfo.ProcFlags[1] = fields[49].GetUInt32();
+ spellInfo.ProcChance = fields[50].GetUInt32();
+ spellInfo.ProcCharges = fields[51].GetUInt32();
+ spellInfo.ProcCooldown = fields[52].GetUInt32();
+ spellInfo.ProcBasePPM = fields[53].GetFloat();
+ spellInfo.MaxLevel = fields[54].GetUInt32();
+ spellInfo.BaseLevel = fields[55].GetUInt32();
+ spellInfo.SpellLevel = fields[56].GetUInt32();
+ spellInfo.DurationEntry = sSpellDurationStore.LookupEntry(fields[57].GetUInt32());
+ spellInfo.RangeEntry = sSpellRangeStore.LookupEntry(fields[58].GetUInt32());
+ spellInfo.Speed = fields[59].GetFloat();
+ spellInfo.LaunchDelay = fields[60].GetFloat();
+ spellInfo.StackAmount = fields[61].GetUInt32();
+ spellInfo.EquippedItemClass = fields[62].GetInt32();
+ spellInfo.EquippedItemSubClassMask = fields[63].GetInt32();
+ spellInfo.EquippedItemInventoryTypeMask = fields[64].GetInt32();
+ spellInfo.ContentTuningId = fields[65].GetUInt32();
+ spellInfo.ConeAngle = fields[67].GetFloat();
+ spellInfo.Width = fields[68].GetFloat();
+ spellInfo.MaxTargetLevel = fields[69].GetUInt32();
+ spellInfo.MaxAffectedTargets = fields[70].GetUInt32();
+ spellInfo.SpellFamilyName = fields[71].GetUInt32();
+ spellInfo.SpellFamilyFlags = flag128(fields[72].GetUInt32(), fields[73].GetUInt32(), fields[74].GetUInt32(), fields[75].GetUInt32());
+ spellInfo.DmgClass = fields[76].GetUInt32();
+ spellInfo.PreventionType = fields[77].GetUInt32();
+ spellInfo.RequiredAreasID = fields[78].GetInt32();
+ spellInfo.SchoolMask = fields[79].GetUInt32();
+ spellInfo.ChargeCategoryId = fields[80].GetUInt32();
} while (spellsResult->NextRow());
}
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index 13259d7a258..d13d47f8564 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -939,7 +939,7 @@ void World::LoadConfigSettings(bool reload)
m_int64_configs[CONFIG_CHARACTER_CREATING_DISABLED_RACEMASK] = sConfigMgr->GetInt64Default("CharacterCreating.Disabled.RaceMask", 0);
m_int_configs[CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK] = sConfigMgr->GetIntDefault("CharacterCreating.Disabled.ClassMask", 0);
- m_int_configs[CONFIG_CHARACTERS_PER_REALM] = sConfigMgr->GetIntDefault("CharactersPerRealm", 50);
+ m_int_configs[CONFIG_CHARACTERS_PER_REALM] = sConfigMgr->GetIntDefault("CharactersPerRealm", 60);
if (m_int_configs[CONFIG_CHARACTERS_PER_REALM] < 1 || m_int_configs[CONFIG_CHARACTERS_PER_REALM] > MAX_CHARACTERS_PER_REALM)
{
TC_LOG_ERROR("server.loading", "CharactersPerRealm (%i) must be in range 1..%u. Set to %u.", m_int_configs[CONFIG_CHARACTERS_PER_REALM], MAX_CHARACTERS_PER_REALM, MAX_CHARACTERS_PER_REALM);
@@ -947,14 +947,22 @@ void World::LoadConfigSettings(bool reload)
}
// must be after CONFIG_CHARACTERS_PER_REALM
- m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = sConfigMgr->GetIntDefault("CharactersPerAccount", 50);
+ m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = sConfigMgr->GetIntDefault("CharactersPerAccount", 60);
if (m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] < m_int_configs[CONFIG_CHARACTERS_PER_REALM])
{
TC_LOG_ERROR("server.loading", "CharactersPerAccount (%i) can't be less than CharactersPerRealm (%i).", m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT], m_int_configs[CONFIG_CHARACTERS_PER_REALM]);
m_int_configs[CONFIG_CHARACTERS_PER_ACCOUNT] = m_int_configs[CONFIG_CHARACTERS_PER_REALM];
}
+ m_int_configs[CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM] = sConfigMgr->GetIntDefault("CharacterCreating.EvokersPerRealm", 1);
+ if (int32(m_int_configs[CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM]) < 0 || m_int_configs[CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM] > 10)
+ {
+ TC_LOG_ERROR("server.loading", "CharacterCreating.EvokersPerRealm (%i) must be in range 0..10. Set to 1.", m_int_configs[CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM]);
+ m_int_configs[CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM] = 1;
+ }
+
m_int_configs[CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER] = sConfigMgr->GetIntDefault("CharacterCreating.MinLevelForDemonHunter", 0);
+ m_int_configs[CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_EVOKER] = sConfigMgr->GetIntDefault("CharacterCreating.MinLevelForEvoker", 50);
m_bool_configs[CONFIG_CHARACTER_CREATING_DISABLE_ALLIED_RACE_ACHIEVEMENT_REQUIREMENT] = sConfigMgr->GetBoolDefault("CharacterCreating.DisableAlliedRaceAchievementRequirement", false);
m_int_configs[CONFIG_SKIP_CINEMATICS] = sConfigMgr->GetIntDefault("SkipCinematics", 0);
@@ -2253,9 +2261,6 @@ void World::SetInitialWorldSettings()
TC_LOG_INFO("server.loading", "Loading Gossip menu addon...");
sObjectMgr->LoadGossipMenuAddon();
- TC_LOG_INFO("server.loading", "Loading Gossip menu item addon...");
- sObjectMgr->LoadGossipMenuItemAddon();
-
TC_LOG_INFO("server.loading", "Loading Creature trainers...");
sObjectMgr->LoadCreatureTrainers(); // must be after LoadGossipMenuItems
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index 1d390fc2c08..fae74be2f26 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -249,7 +249,9 @@ enum WorldIntConfigs
CONFIG_CHARACTER_CREATING_DISABLED_CLASSMASK,
CONFIG_CHARACTERS_PER_ACCOUNT,
CONFIG_CHARACTERS_PER_REALM,
+ CONFIG_CHARACTER_CREATING_EVOKERS_PER_REALM,
CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER,
+ CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_EVOKER,
CONFIG_SKIP_CINEMATICS,
CONFIG_MAX_PLAYER_LEVEL,
CONFIG_MIN_DUALSPEC_LEVEL,
diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp
index e2eae68c984..c64327ab7cc 100644
--- a/src/server/scripts/Spells/spell_generic.cpp
+++ b/src/server/scripts/Spells/spell_generic.cpp
@@ -3382,8 +3382,10 @@ class spell_gen_spirit_healer_res : public SpellScript
Player* originalCaster = GetOriginalCaster()->ToPlayer();
if (Unit* target = GetHitUnit())
{
- WorldPackets::NPC::SpiritHealerConfirm spiritHealerConfirm;
- spiritHealerConfirm.Unit = target->GetGUID();
+ WorldPackets::NPC::NPCInteractionOpenResult spiritHealerConfirm;
+ spiritHealerConfirm.Npc = target->GetGUID();
+ spiritHealerConfirm.InteractionType = PlayerInteractionType::SpiritHealer;
+ spiritHealerConfirm.Success = true;
originalCaster->SendDirectMessage(spiritHealerConfirm.Write());
}
}
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 61794dfa355..cb30a7eb96b 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -834,9 +834,17 @@ CharactersPerAccount = 50
# CharactersPerRealm
# Description: Limit number of characters per account on this realm.
# Range: 1-200
-# Default: 50
+# Default: 60
+
+CharactersPerRealm = 60
+
+#
+# CharacterCreating.EvokersPerRealm
+# Description: Limit number of death knight characters per account on this realm.
+# Range: 1-60
+# Default: 1
-CharactersPerRealm = 50
+CharacterCreating.EvokersPerRealm = 1
#
# CharacterCreating.MinLevelForDemonHunter
@@ -848,6 +856,15 @@ CharactersPerRealm = 50
CharacterCreating.MinLevelForDemonHunter = 0
#
+# CharacterCreating.MinLevelForEvoker
+# Description: Limit creating demon hunters only for account with another
+# character of specific level.
+# Default: 50 - (Enabled, Requires at least another level 50 character)
+# 0 - (Disabled, No requirement)
+
+CharacterCreating.MinLevelForEvoker = 0
+
+#
# CharacterCreating.DisableAlliedRaceAchievementRequirement
# Description: Disable achievement requirements for allied race character creation
# Default: 0 (Keep requirements active)
diff --git a/src/tools/extractor_common/ExtractorDB2LoadInfo.h b/src/tools/extractor_common/ExtractorDB2LoadInfo.h
index 88d6bf4985e..39bec07c9a0 100644
--- a/src/tools/extractor_common/ExtractorDB2LoadInfo.h
+++ b/src/tools/extractor_common/ExtractorDB2LoadInfo.h
@@ -35,7 +35,7 @@ struct CinematicCameraLoadInfo
{ false, FT_INT, "SoundID" },
{ false, FT_FLOAT, "OriginFacing" },
{ false, FT_INT, "FileDataID" },
- { true, FT_INT, "Unknown915" },
+ { false, FT_INT, "ConversationID" },
};
static DB2MetaField const fields[5] =
{
@@ -43,10 +43,10 @@ struct CinematicCameraLoadInfo
{ FT_INT, 1, false },
{ FT_FLOAT, 1, true },
{ FT_INT, 1, false },
- { FT_INT, 1, true },
+ { FT_INT, 1, false },
};
- static DB2Meta meta(1294214, -1, 5, 5, 0x3920D07C, fields, -1);
- static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
+ static DB2Meta meta(1294214, -1, 5, 5, 0x4B3DF171, fields, -1);
+ static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::size(loadedFields), &meta);
return &loadInfo;
}
};
@@ -78,7 +78,7 @@ struct GameobjectDisplayInfoLoadInfo
{ FT_FLOAT, 1, true },
};
static DB2Meta meta(1266277, -1, 5, 5, 0x7E33A93F, fields, -1);
- static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
+ static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::size(loadedFields), &meta);
return &loadInfo;
}
};
@@ -99,7 +99,7 @@ struct LiquidMaterialLoadInfo
{ FT_BYTE, 1, true },
};
static DB2Meta meta(1132538, -1, 2, 2, 0x2CFFEA40, fields, -1);
- static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
+ static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::size(loadedFields), &meta);
return &loadInfo;
}
};
@@ -126,7 +126,7 @@ struct LiquidObjectLoadInfo
{ FT_BYTE, 1, false },
};
static DB2Meta meta(1308058, -1, 5, 5, 0x6CAEB8A1, fields, -1);
- static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
+ static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::size(loadedFields), &meta);
return &loadInfo;
}
};
@@ -219,7 +219,7 @@ struct LiquidTypeLoadInfo
{ FT_FLOAT, 4, true },
};
static DB2Meta meta(1371380, -1, 21, 21, 0xAFFFC9E0, fields, -1);
- static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
+ static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::size(loadedFields), &meta);
return &loadInfo;
}
};
@@ -254,11 +254,12 @@ struct MapLoadInfo
{ true, FT_SHORT, "WindSettingsID" },
{ true, FT_INT, "ZmpFileDataID" },
{ true, FT_INT, "WdtFileDataID" },
+ { true, FT_INT, "NavigationMaxDistance" },
{ true, FT_INT, "Flags1" },
{ true, FT_INT, "Flags2" },
{ true, FT_INT, "Flags3" },
};
- static DB2MetaField const fields[23] =
+ static DB2MetaField const fields[24] =
{
{ FT_STRING_NOT_LOCALIZED, 1, true },
{ FT_STRING, 1, true },
@@ -282,10 +283,11 @@ struct MapLoadInfo
{ FT_SHORT, 1, true },
{ FT_INT, 1, true },
{ FT_INT, 1, true },
+ { FT_INT, 1, true },
{ FT_INT, 3, true },
};
- static DB2Meta meta(1349477, -1, 23, 23, 0xAAA1F94E, fields, -1);
- static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::extent<decltype(loadedFields)>::value, &meta);
+ static DB2Meta meta(1349477, -1, 24, 24, 0x43E626E4, fields, -1);
+ static DB2FileLoadInfo const loadInfo(&loadedFields[0], std::size(loadedFields), &meta);
return &loadInfo;
}
};
diff --git a/src/tools/map_extractor/loadlib/DBFilesClientList.h b/src/tools/map_extractor/loadlib/DBFilesClientList.h
index ce0cf20cd17..4b7f39f2ef8 100644
--- a/src/tools/map_extractor/loadlib/DBFilesClientList.h
+++ b/src/tools/map_extractor/loadlib/DBFilesClientList.h
@@ -53,6 +53,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1353545, "AreaTable.db2" },
{ 1354401, "AreaTrigger.db2" },
{ 1352378, "AreaTriggerActionSet.db2" },
+ { 4266572, "AreaTriggerBoundedPlane.db2" },
{ 1332554, "AreaTriggerBox.db2" },
{ 1937227, "AreaTriggerCreateProperties.db2" },
{ 1121943, "AreaTriggerCylinder.db2" },
@@ -168,12 +169,15 @@ DB2FileInfo const DBFilesClientList[] =
{ 3450453, "ChrCustomizationReq.db2" },
{ 3580359, "ChrCustomizationReqChoice.db2" },
{ 3460183, "ChrCustomizationSkinnedModel.db2" },
+ { 4724136, "ChrCustomizationVisReq.db2" },
+ { 4672833, "ChrCustomizationVoice.db2" },
{ 3384313, "ChrModel.db2" },
{ 3566562, "ChrModelMaterial.db2" },
{ 3548976, "ChrModelTextureLayer.db2" },
{ 3507821, "ChrRaceRacialAbility.db2" },
{ 3490304, "ChrRaceXChrModel.db2" },
{ 1305311, "ChrRaces.db2" },
+ { 4566929, "ChrRacesCreateScreenIcon.db2" },
{ 4195187, "ChrSelectBackgroundCDI.db2" },
{ 1343390, "ChrSpecialization.db2" },
{ 984529, "ChrUpgradeBucket.db2" },
@@ -193,17 +197,30 @@ DB2FileInfo const DBFilesClientList[] =
{ 1278239, "ComponentTextureFileData.db2" },
{ 3501965, "ConditionalContentTuning.db2" },
{ 1709409, "ConfigurationWarning.db2" },
+ { 4668112, "ContentRestrictionRule.db2" },
{ 4281307, "ContentRestrictionRuleSet.db2" },
{ 1962930, "ContentTuning.db2" },
{ 2976765, "ContentTuningXExpected.db2" },
+ { 4659576, "ContentTuningXLabel.db2" },
{ 1587153, "Contribution.db2" },
{ 2143633, "ContributionStyle.db2" },
{ 2143634, "ContributionStyleContainer.db2" },
{ 1260801, "ConversationLine.db2" },
{ 3220711, "CorruptionEffects.db2" },
{ 3384973, "Covenant.db2" },
+ { 4545611, "CraftingData.db2" },
+ { 4659601, "CraftingDataEnchantQuality.db2" },
+ { 4545612, "CraftingDataItemQuality.db2" },
+ { 4373536, "CraftingDifficulty.db2" },
+ { 4373537, "CraftingDifficultyQuality.db2" },
+ { 4529122, "CraftingOrder.db2" },
+ { 4688652, "CraftingOrderHouse.db2" },
+ { 4373538, "CraftingQuality.db2" },
+ { 4541803, "CraftingReagentEffect.db2" },
+ { 4382197, "CraftingReagentQuality.db2" },
{ 841631, "Creature.db2" },
{ 879282, "CreatureDifficulty.db2" },
+ { 4044373, "CreatureDifficultyTreasure.db2" },
{ 1146692, "CreatureDispXUiCamera.db2" },
{ 1108759, "CreatureDisplayInfo.db2" },
{ 1332686, "CreatureDisplayInfoCond.db2" },
@@ -215,6 +232,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1146698, "CreatureDisplayInfoTrn.db2" },
{ 1351351, "CreatureFamily.db2" },
{ 1131322, "CreatureImmunities.db2" },
+ { 3055733, "CreatureLabel.db2" },
{ 1365368, "CreatureModelData.db2" },
{ 1125666, "CreatureMovementInfo.db2" },
{ 1344466, "CreatureSoundData.db2" },
@@ -257,6 +275,8 @@ DB2FileInfo const DBFilesClientList[] =
{ 1361972, "Faction.db2" },
{ 1343595, "FactionGroup.db2" },
{ 1361579, "FactionTemplate.db2" },
+ { 4501047, "FlightCapability.db2" },
+ { 4644249, "FlightCapabilityXGlideEvent.db2" },
{ 1308056, "FootprintTextures.db2" },
{ 1267647, "FootstepTerrainLookup.db2" },
{ 1237638, "FriendshipRepReaction.db2" },
@@ -272,6 +292,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1302847, "GameObjectDiffAnimMap.db2" },
{ 1266277, "GameObjectDisplayInfo.db2" },
{ 1345272, "GameObjectDisplayInfoXSoundKit.db2" },
+ { 4621877, "GameObjectLabel.db2" },
{ 841620, "GameObjects.db2" },
{ 3405438, "GameParameter.db2" },
{ 1368021, "GameTips.db2" },
@@ -331,6 +352,9 @@ DB2FileInfo const DBFilesClientList[] =
{ 976037, "GarrUiAnimClassInfo.db2" },
{ 976035, "GarrUiAnimRaceInfo.db2" },
{ 1343604, "GemProperties.db2" },
+ { 4644012, "GlideEvent.db2" },
+ { 4682325, "GlideEventBlendTimes.db2" },
+ { 4328468, "GlobalColor.db2" },
{ 3752002, "GlobalCurve.db2" },
{ 3756368, "GlobalGameContentTuning.db2" },
{ 4082838, "GlobalPlayerCondition.db2" },
@@ -340,6 +364,8 @@ DB2FileInfo const DBFilesClientList[] =
{ 948546, "GlyphExclusiveCategory.db2" },
{ 1345274, "GlyphProperties.db2" },
{ 948496, "GlyphRequiredSpec.db2" },
+ { 4278503, "GossipNPCOption.db2" },
+ { 4335720, "GossipNPCOptionDisplayInfo.db2" },
{ 4407361, "GossipXGarrTalentTrees.db2" },
{ 3622253, "GossipXUIDisplayInfo.db2" },
{ 2433582, "GradientEffect.db2" },
@@ -404,7 +430,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1134087, "ItemDisenchantLoot.db2" },
{ 1266429, "ItemDisplayInfo.db2" },
{ 1280614, "ItemDisplayInfoMaterialRes.db2" },
- { 1146690, "ItemDisplayXUiCamera.db2" },
+ { 4050937, "ItemDisplayInfoModelMatRes.db2" },
{ 969941, "ItemEffect.db2" },
{ 801681, "ItemExtendedCost.db2" },
{ 2358574, "ItemFallbackVisual.db2" },
@@ -414,6 +440,8 @@ DB2FileInfo const DBFilesClientList[] =
{ 1624933, "ItemLevelSelectorQualitySet.db2" },
{ 1237440, "ItemLimitCategory.db2" },
{ 1378590, "ItemLimitCategoryCondition.db2" },
+ { 4677533, "ItemLogicalCost.db2" },
+ { 4677534, "ItemLogicalCostGroup.db2" },
{ 982457, "ItemModifiedAppearance.db2" },
{ 1278399, "ItemModifiedAppearanceExtra.db2" },
{ 1332559, "ItemNameDescription.db2" },
@@ -421,6 +449,8 @@ DB2FileInfo const DBFilesClientList[] =
{ 1302240, "ItemPetFood.db2" },
{ 1121231, "ItemPriceBase.db2" },
{ 1270315, "ItemRangedDisplayInfo.db2" },
+ { 4548446, "ItemSalvage.db2" },
+ { 4549058, "ItemSalvageLoot.db2" },
{ 1273408, "ItemSearchName.db2" },
{ 1343609, "ItemSet.db2" },
{ 1314689, "ItemSetSpell.db2" },
@@ -457,11 +487,13 @@ DB2FileInfo const DBFilesClientList[] =
{ 1375580, "LightData.db2" },
{ 1334669, "LightParams.db2" },
{ 1308501, "LightSkybox.db2" },
+ { 4680119, "LightWorldShadow.db2" },
{ 2003383, "Lightning.db2" },
{ 1132538, "LiquidMaterial.db2" },
{ 1308058, "LiquidObject.db2" },
{ 1371380, "LiquidType.db2" },
{ 2261065, "LiquidTypeXTexture.db2" },
+ { 4276965, "LivingWorldObjectTemplate.db2" },
{ 2478235, "LoadingScreenSkin.db2" },
{ 1302239, "LoadingScreenTaxiSplines.db2" },
{ 1266541, "LoadingScreens.db2" },
@@ -487,6 +519,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1367868, "MapDifficulty.db2" },
{ 1375435, "MapDifficultyXCondition.db2" },
{ 1719707, "MapLoadingScreen.db2" },
+ { 4633656, "MapRenderScale.db2" },
{ 801710, "MarketingPromotionsXLocale.db2" },
{ 1294217, "Material.db2" },
{ 2991315, "MawPower.db2" },
@@ -497,10 +530,10 @@ DB2FileInfo const DBFilesClientList[] =
{ 1337833, "ModelFileData.db2" },
{ 1399953, "ModelRibbonQuality.db2" },
{ 3386486, "ModifiedCraftingCategory.db2" },
+ { 4530643, "ModifiedCraftingItem.db2" },
{ 3386487, "ModifiedCraftingReagentItem.db2" },
{ 3386488, "ModifiedCraftingReagentSlot.db2" },
{ 3390956, "ModifiedCraftingSpellSlot.db2" },
- { 3386490, "ModifiedReagentItem.db2" },
{ 1267645, "ModifierTree.db2" },
{ 921760, "Mount.db2" },
{ 1114709, "MountCapability.db2" },
@@ -562,7 +595,20 @@ DB2FileInfo const DBFilesClientList[] =
{ 1332557, "PowerDisplay.db2" },
{ 1266022, "PowerType.db2" },
{ 1275869, "PrestigeLevelInfo.db2" },
+ { 4542069, "ProfTraitPathNode.db2" },
+ { 4542084, "ProfTraitPerkNode.db2" },
+ { 4542085, "ProfTraitTree.db2" },
+ { 4508544, "Profession.db2" },
+ { 4505297, "ProfessionEffect.db2" },
+ { 4556715, "ProfessionEffectType.db2" },
+ { 4452078, "ProfessionPropPoints.db2" },
+ { 4623413, "ProfessionRating.db2" },
+ { 4505298, "ProfessionTrait.db2" },
+ { 4505494, "ProfessionTraitXEffect.db2" },
+ { 4505299, "ProfessionTraitXLabel.db2" },
+ { 4868299, "ProfessionXRating.db2" },
{ 1585723, "PvpBrawl.db2" },
+ { 4699082, "PvpRating.db2" },
{ 1591100, "PvpScalingEffect.db2" },
{ 1591098, "PvpScalingEffectType.db2" },
{ 2966426, "PvpSeason.db2" },
@@ -624,9 +670,11 @@ DB2FileInfo const DBFilesClientList[] =
{ 1328719, "SeamlessSite.db2" },
{ 1301141, "ServerMessages.db2" },
{ 1239844, "ShadowyEffect.db2" },
+ { 4620073, "SharedString.db2" },
{ 1954391, "SiegeableProperties.db2" },
{ 1240935, "SkillLine.db2" },
{ 1266278, "SkillLineAbility.db2" },
+ { 4505477, "SkillLineXTraitTree.db2" },
{ 1240406, "SkillRaceClassInfo.db2" },
{ 3581893, "SkySceneXPlayerCondition.db2" },
{ 3488583, "Soulbind.db2" },
@@ -650,9 +698,11 @@ DB2FileInfo const DBFilesClientList[] =
{ 1307289, "SoundKitChild.db2" },
{ 1237435, "SoundKitEntry.db2" },
{ 1307288, "SoundKitFallback.db2" },
+ { 4618887, "SoundMixGroup.db2" },
{ 1266542, "SoundOverride.db2" },
{ 3405441, "SoundParameter.db2" },
{ 1279417, "SoundProviderPreferences.db2" },
+ { 4756178, "SoundWaterfallEmitter.db2" },
{ 1313612, "SourceInfo.db2" },
{ 1117088, "SpamMessages.db2" },
{ 2057624, "SpecSetMember.db2" },
@@ -684,6 +734,8 @@ DB2FileInfo const DBFilesClientList[] =
{ 1140088, "SpellEffect.db2" },
{ 1888495, "SpellEffectAutoDescription.db2" },
{ 1310248, "SpellEffectEmission.db2" },
+ { 4507381, "SpellEmpower.db2" },
+ { 4871072, "SpellEmpowerStage.db2" },
{ 1140011, "SpellEquippedItems.db2" },
{ 1146819, "SpellFlyout.db2" },
{ 1134085, "SpellFlyoutItem.db2" },
@@ -710,6 +762,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1146820, "SpellRange.db2" },
{ 841946, "SpellReagents.db2" },
{ 1135239, "SpellReagentsCurrency.db2" },
+ { 4674394, "SpellReplacement.db2" },
{ 1139940, "SpellScaling.db2" },
{ 3055899, "SpellScript.db2" },
{ 3055901, "SpellScriptText.db2" },
@@ -754,6 +807,30 @@ DB2FileInfo const DBFilesClientList[] =
{ 988200, "Toy.db2" },
{ 1301101, "TradeSkillCategory.db2" },
{ 1329070, "TradeSkillItem.db2" },
+ { 4543085, "TraitCond.db2" },
+ { 4420295, "TraitCost.db2" },
+ { 4524216, "TraitCurrency.db2" },
+ { 4539393, "TraitCurrencySource.db2" },
+ { 4420327, "TraitDefinition.db2" },
+ { 4536895, "TraitDefinitionEffectPoints.db2" },
+ { 4420308, "TraitEdge.db2" },
+ { 4420297, "TraitNode.db2" },
+ { 4420298, "TraitNodeEntry.db2" },
+ { 4543088, "TraitNodeEntryXTraitCond.db2" },
+ { 4420299, "TraitNodeEntryXTraitCost.db2" },
+ { 4420300, "TraitNodeGroup.db2" },
+ { 4543090, "TraitNodeGroupXTraitCond.db2" },
+ { 4420301, "TraitNodeGroupXTraitCost.db2" },
+ { 4420302, "TraitNodeGroupXTraitNode.db2" },
+ { 4543092, "TraitNodeXTraitCond.db2" },
+ { 4420303, "TraitNodeXTraitCost.db2" },
+ { 4420304, "TraitNodeXTraitNodeEntry.db2" },
+ { 4635649, "TraitSystem.db2" },
+ { 4420305, "TraitTree.db2" },
+ { 4669507, "TraitTreeLoadout.db2" },
+ { 4669509, "TraitTreeLoadoutEntry.db2" },
+ { 4420306, "TraitTreeXTraitCost.db2" },
+ { 4524218, "TraitTreeXTraitCurrency.db2" },
{ 1338702, "TransformMatrix.db2" },
{ 2399695, "TransmogDefaultLevel.db2" },
{ 1589454, "TransmogHoliday.db2" },
@@ -768,10 +845,12 @@ DB2FileInfo const DBFilesClientList[] =
{ 3488582, "UIChromieTimeExpansionInfo.db2" },
{ 3502042, "UICovenantAbility.db2" },
{ 3502043, "UICovenantPreview.db2" },
+ { 4579858, "UIDeadlyDebuff.db2" },
{ 4065278, "UIDungeonScoreRarity.db2" },
{ 3946498, "UIEventToast.db2" },
{ 1729547, "UIExpansionDisplayInfo.db2" },
{ 1729546, "UIExpansionDisplayInfoIcon.db2" },
+ { 4861207, "UIGenericWidgetDisplay.db2" },
{ 4530951, "UIModifiedInstance.db2" },
{ 3556601, "UIScriptedAnimationEffect.db2" },
{ 2960122, "UISplashScreen.db2" },
@@ -802,6 +881,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1989276, "UiTextureAtlasElement.db2" },
{ 897532, "UiTextureAtlasMember.db2" },
{ 939159, "UiTextureKit.db2" },
+ { 4737221, "UiWeeklyReward.db2" },
{ 1983278, "UiWidget.db2" },
{ 1983639, "UiWidgetConstantSource.db2" },
{ 1983640, "UiWidgetDataSource.db2" },
@@ -848,6 +928,7 @@ DB2FileInfo const DBFilesClientList[] =
{ 1135240, "WorldElapsedTimer.db2" },
{ 1134579, "WorldMapOverlay.db2" },
{ 1957212, "WorldMapOverlayTile.db2" },
+ { 4680120, "WorldShadow.db2" },
{ 1332558, "WorldStateExpression.db2" },
{ 1266941, "WorldStateZoneSounds.db2" },
{ 1310255, "World_PVP_Area.db2" },