diff options
Diffstat (limited to 'src/server')
126 files changed, 8774 insertions, 4595 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) |