diff options
Diffstat (limited to 'src')
40 files changed, 1221 insertions, 1047 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp index ceeed6ac50f..698d3a4c6e9 100644 --- a/src/server/database/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp @@ -51,21 +51,21 @@ void CharacterDatabaseConnection::DoPrepareStatements() "subject, deliver_time, expire_time, money, has_items FROM mail WHERE receiver = ? ", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_MAIL_LIST_ITEMS, "SELECT itemEntry,count FROM item_instance WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_SEL_ENUM, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_ENUM_DECLINED_NAME, "SELECT c.guid, c.name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.account = ? AND c.deleteInfos_Name IS NULL", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_UNDELETE_ENUM, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, c.position_x, c.position_y, c.position_z, " - "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup " + "gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild " "FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_UNDELETE_ENUM_DECLINED_NAME, "SELECT c.guid, c.deleteInfos_Name, c.race, c.class, c.gender, c.skin, c.face, c.hairStyle, c.hairColor, c.facialStyle, c.customDisplay1, c.customDisplay2, c.customDisplay3, c.level, c.zone, c.map, " "c.position_x, c.position_y, c.position_z, gm.guildid, c.playerFlags, c.at_login, cp.entry, cp.modelid, cp.level, c.equipmentCache, " - "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " + "cb.guid, c.slot, c.logout_time, c.activeTalentGroup, c.lastLoginBuild, cd.genitive FROM characters AS c LEFT JOIN character_pet AS cp ON c.guid = cp.owner AND cp.slot = ? " "LEFT JOIN character_declinedname AS cd ON c.guid = cd.guid LEFT JOIN guild_member AS gm ON c.guid = gm.guid " "LEFT JOIN character_banned AS cb ON c.guid = cb.guid AND cb.active = 1 WHERE c.deleteInfos_Account = ? AND c.deleteInfos_Name IS NOT NULL", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_FREE_NAME, "SELECT name, at_login FROM characters WHERE guid = ? AND NOT EXISTS (SELECT NULL FROM characters WHERE name = ?)", CONNECTION_ASYNC); @@ -428,14 +428,14 @@ void CharacterDatabaseConnection::DoPrepareStatements() "extra_flags, stable_slots, at_login, zone, " "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " - "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + "power4, power5, power6, latency, activeTalentGroup, lootSpecId, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, lastLoginBuild) VALUES " + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,skin=?,face=?,hairStyle=?,hairColor=?,facialStyle=?,customDisplay1=?,customDisplay2=?,customDisplay3=?,inventorySlots=?,bankSlots=?,restState=?,playerFlags=?,playerFlagsEx=?," "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,primarySpecialization=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,activeTalentGroup=?,lootSpecId=?,exploredZones=?," - "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=?,honor=?,honorLevel=?,prestigeLevel=?,honorRestState=?,honorRestBonus=? WHERE guid=?", CONNECTION_ASYNC); + "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=?,honor=?,honorLevel=?,prestigeLevel=?,honorRestState=?,honorRestBonus=?,lastLoginBuild=? WHERE guid=?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_REM_AT_LOGIN_FLAG, "UPDATE characters set at_login = at_login & ~ ? WHERE guid = ?", CONNECTION_ASYNC); diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index a8fb5710dcd..e30e5d28e95 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -244,6 +244,7 @@ void PlayerMenu::SendGossipMenu(uint32 titleTextId, ObjectGuid objectGUID) text.QuestID = questID; text.QuestType = item.QuestIcon; text.QuestLevel = quest->GetQuestLevel(); + text.QuestMaxScalingLevel = quest->GetQuestMaxScalingLevel(); text.QuestFlags[0] = quest->GetFlags(); text.QuestFlags[1] = quest->GetFlagsEx(); text.Repeatable = quest->IsRepeatable(); @@ -380,7 +381,8 @@ void PlayerMenu::SendQuestGiverQuestListMessage(ObjectGuid guid) bool repeatable = false; // NYI - questList.QuestDataText.emplace_back(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetFlags(), quest->GetFlagsEx(), repeatable, title); + questList.QuestDataText.emplace_back(questID, questMenuItem.QuestIcon, quest->GetQuestLevel(), quest->GetQuestMaxScalingLevel(), + quest->GetFlags(), quest->GetFlagsEx(), repeatable, std::move(title)); } } @@ -506,6 +508,7 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const packet.Info.QuestID = quest->GetQuestId(); packet.Info.QuestType = quest->GetQuestType(); packet.Info.QuestLevel = quest->GetQuestLevel(); + packet.Info.QuestMaxScalingLevel = quest->GetQuestMaxScalingLevel(); packet.Info.QuestPackageID = quest->GetQuestPackageID(); packet.Info.QuestMinLevel = quest->GetMinLevel(); packet.Info.QuestSortID = quest->GetZoneOrSort(); diff --git a/src/server/game/Entities/Item/ItemDefines.h b/src/server/game/Entities/Item/ItemDefines.h index 9f5c6ce1aa5..107a89c6152 100644 --- a/src/server/game/Entities/Item/ItemDefines.h +++ b/src/server/game/Entities/Item/ItemDefines.h @@ -123,6 +123,7 @@ enum InventoryResult : uint8 EQUIP_ERR_CANT_USE_ITEM = 98, // You can't use that item. EQUIP_ERR_CANT_BE_OBLITERATED = 99, // You can't obliterate that item EQUIP_ERR_GUILD_BANK_CONJURED_ITEM = 100,// You cannot store conjured items in the guild bank + EQUIP_ERR_CANT_DO_THAT_RIGHT_NOW = 101,// You can't do that right now. }; enum BuyResult diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fc29e464fbf..47aaec14608 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2354,7 +2354,7 @@ 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.ReferAFriend = recruitAFriend; + packet.ReferAFriendBonusType = recruitAFriend ? 1 : 0; GetSession()->SendPacket(packet.Write()); uint32 curXP = GetUInt32Value(PLAYER_XP); @@ -9846,6 +9846,42 @@ bool Player::IsValidPos(uint8 bag, uint8 slot, bool explicit_pos) const void Player::SetInventorySlotCount(uint8 slots) { ASSERT(slots <= (INVENTORY_SLOT_ITEM_END - INVENTORY_SLOT_ITEM_START)); + + if (slots < GetInventorySlotCount()) + { + std::vector<Item*> unstorableItems; + + for (uint8 slot = INVENTORY_SLOT_ITEM_START + slots; slot < INVENTORY_SLOT_ITEM_END; ++slot) + if (Item* unstorableItem = GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) + unstorableItems.push_back(unstorableItem); + + if (!unstorableItems.empty()) + { + std::size_t fullBatches = unstorableItems.size() / MAX_MAIL_ITEMS; + std::size_t remainder = unstorableItems.size() % MAX_MAIL_ITEMS; + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + + auto sendItemsBatch = [this, &trans, &unstorableItems](std::size_t batchNumber, std::size_t batchSize) + { + MailDraft draft(GetSession()->GetTrinityString(LANG_NOT_EQUIPPED_ITEM), "There were problems with equipping item(s)."); + for (std::size_t j = 0; j < batchSize; ++j) + draft.AddItem(unstorableItems[batchNumber * MAX_MAIL_ITEMS + j]); + + draft.SendMailTo(trans, this, MailSender(this, MAIL_STATIONERY_GM), MAIL_CHECK_MASK_COPIED); + }; + + for (std::size_t batch = 0; batch < fullBatches; ++batch) + sendItemsBatch(batch, MAX_MAIL_ITEMS); + + if (remainder) + sendItemsBatch(fullBatches, remainder); + + CharacterDatabase.CommitTransaction(trans); + + SendDirectMessage(WorldPackets::Item::CharacterInventoryOverflowWarning().Write()); + } + } + SetByteValue(PLAYER_FIELD_BYTES2, PLAYER_FIELD_BYTES_2_OFFSET_NUM_BACKPACK_SLOTS, slots); } @@ -15620,8 +15656,8 @@ bool Player::SatisfyQuestClass(Quest const* qInfo, bool msg) const bool Player::SatisfyQuestRace(Quest const* qInfo, bool msg) const { - int32 reqraces = qInfo->GetAllowableRaces(); - if (reqraces == -1) + uint64 reqraces = qInfo->GetAllowableRaces(); + if (reqraces == uint64(-1)) return true; if ((reqraces & getRaceMask()) == 0) { @@ -19893,6 +19929,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, GetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES)); stmt->setUInt32(index++, m_grantableLevels); + stmt->setUInt32(index++, realm.Build); } else { @@ -20043,6 +20080,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt32(index++, GetPrestigeLevel()); stmt->setUInt8(index++, uint8(GetUInt32Value(PLAYER_FIELD_REST_INFO + REST_STATE_HONOR))); stmt->setFloat(index++, finiteAlways(_restMgr->GetRestBonus(REST_TYPE_HONOR))); + stmt->setUInt32(index++, realm.Build); // Index stmt->setUInt64(index, GetGUID().GetCounter()); @@ -27174,12 +27212,14 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) WorldPackets::Quest::DisplayPlayerChoice displayPlayerChoice; displayPlayerChoice.SenderGUID = sender; displayPlayerChoice.ChoiceID = choiceId; + displayPlayerChoice.UiTextureKitID = playerChoice->UiTextureKitId; displayPlayerChoice.Question = playerChoice->Question; if (playerChoiceLocale) ObjectMgr::GetLocaleString(playerChoiceLocale->Question, locale, displayPlayerChoice.Question); displayPlayerChoice.Responses.resize(playerChoice->Responses.size()); displayPlayerChoice.CloseChoiceFrame = false; + displayPlayerChoice.HideWarboardHeader = playerChoice->HideWarboardHeader; for (std::size_t i = 0; i < playerChoice->Responses.size(); ++i) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 02f97985629..30e96a23232 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -425,14 +425,17 @@ enum PlayerFlagsEx enum PlayerLocalFlags { + PLAYER_LOCAL_FLAG_CONTROLLING_PET = 0x00000001, // Displays "You have an active summon already" when trying to tame new pet PLAYER_LOCAL_FLAG_TRACK_STEALTHED = 0x00000002, PLAYER_LOCAL_FLAG_RELEASE_TIMER = 0x00000008, // Display time till auto release spirit PLAYER_LOCAL_FLAG_NO_RELEASE_WINDOW = 0x00000010, // Display no "release spirit" window at all PLAYER_LOCAL_FLAG_NO_PET_BAR = 0x00000020, // CGPetInfo::IsPetBarUsed PLAYER_LOCAL_FLAG_OVERRIDE_CAMERA_MIN_HEIGHT = 0x00000040, + PLAYER_LOCAL_FLAG_NEWLY_BOOSTED_CHARACTER = 0x00000080, PLAYER_LOCAL_FLAG_USING_PARTY_GARRISON = 0x00000100, PLAYER_LOCAL_FLAG_CAN_USE_OBJECTS_MOUNTED = 0x00000200, - PLAYER_LOCAL_FLAG_CAN_VISIT_PARTY_GARRISON = 0x00000400 + PLAYER_LOCAL_FLAG_CAN_VISIT_PARTY_GARRISON = 0x00000400, + PLAYER_LOCAL_FLAG_ACCOUNT_SECURED = 0x00001000, // Script_IsAccountSecured }; enum PlayerBytesOffsets @@ -1341,7 +1344,12 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> /*** QUEST SYSTEM ***/ /*********************************************************/ - int32 GetQuestLevel(Quest const* quest) const { return quest && (quest->GetQuestLevel() > 0) ? quest->GetQuestLevel() : getLevel(); } + int32 GetQuestLevel(Quest const* quest) const + { + if (!quest) + return getLevel(); + return quest->GetQuestLevel() > 0 ? quest->GetQuestLevel() : std::min<int32>(getLevel(), quest->GetQuestMaxScalingLevel()); + } void PrepareQuestMenu(ObjectGuid guid); void SendPreparedQuest(ObjectGuid guid); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 8e61eb33baa..9bd7d5c107d 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3876,35 +3876,35 @@ void ObjectMgr::LoadQuests() mExclusiveQuestGroups.clear(); QueryResult result = WorldDatabase.Query("SELECT " - //0 1 2 3 4 5 6 7 8 9 10 - "ID, QuestType, QuestLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " - //11 12 13 14 15 16 17 18 19 20 21 + //0 1 2 3 4 5 6 7 8 9 10 11 + "ID, QuestType, QuestLevel, MaxScalingLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " + //12 13 14 15 16 17 18 19 20 21 22 "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell1, RewardDisplaySpell2, RewardDisplaySpell3, RewardSpell, RewardHonor, RewardKillHonor, StartItem, " - //22 23 24 25 26 + //23 24 25 26 27 "RewardArtifactXPDifficulty, RewardArtifactXPMultiplier, RewardArtifactCategoryID, Flags, FlagsEx, " - //27 28 29 30 31 32 33 34 + //28 29 30 31 32 33 34 35 "RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, " - //35 36 37 38 39 40 41 42 + //36 37 38 39 40 41 42 43 "RewardItem3, RewardAmount3, ItemDrop3, ItemDropQuantity3, RewardItem4, RewardAmount4, ItemDrop4, ItemDropQuantity4, " - //43 44 45 46 47 48 + //44 45 46 47 48 49 "RewardChoiceItemID1, RewardChoiceItemQuantity1, RewardChoiceItemDisplayID1, RewardChoiceItemID2, RewardChoiceItemQuantity2, RewardChoiceItemDisplayID2, " - //49 50 51 52 53 54 + //50 51 52 53 54 55 "RewardChoiceItemID3, RewardChoiceItemQuantity3, RewardChoiceItemDisplayID3, RewardChoiceItemID4, RewardChoiceItemQuantity4, RewardChoiceItemDisplayID4, " - //55 56 57 58 59 60 + //56 57 58 59 60 61 "RewardChoiceItemID5, RewardChoiceItemQuantity5, RewardChoiceItemDisplayID5, RewardChoiceItemID6, RewardChoiceItemQuantity6, RewardChoiceItemDisplayID6, " - //61 62 63 64 65 66 67 68 69 70 + //62 63 64 65 66 67 68 69 70 71 "POIContinent, POIx, POIy, POIPriority, RewardTitle, RewardArenaPoints, RewardSkillLineID, RewardNumSkillUps, PortraitGiver, PortraitTurnIn, " - //71 72 73 74 75 76 77 78 + //72 73 74 75 76 77 78 79 "RewardFactionID1, RewardFactionValue1, RewardFactionOverride1, RewardFactionCapIn1, RewardFactionID2, RewardFactionValue2, RewardFactionOverride2, RewardFactionCapIn2, " - //79 80 81 82 83 84 85 86 + //80 81 82 83 84 85 86 87 "RewardFactionID3, RewardFactionValue3, RewardFactionOverride3, RewardFactionCapIn3, RewardFactionID4, RewardFactionValue4, RewardFactionOverride4, RewardFactionCapIn4, " - //87 88 89 90 91 + //88 89 90 91 92 "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " - //92 93 94 95 96 97 98 99 + //93 94 95 96 97 98 99 100 "RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " - //100 101 102 103 104 105 106 + //101 102 103 104 105 106 107 "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, QuestRewardID, Expansion, " - //107 108 109 110 111 112 113 114 115 + //108 109 110 111 112 113 114 115 116 "LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" " FROM quest_template"); if (!result) @@ -4199,12 +4199,12 @@ void ObjectMgr::LoadQuests() } } // AllowableRaces, can be -1/RACEMASK_ALL_PLAYABLE to allow any race - if (qinfo->AllowableRaces != -1) + if (qinfo->AllowableRaces != uint64(-1)) { - if (qinfo->AllowableRaces > 0 && !(uint32(qinfo->AllowableRaces) & RACEMASK_ALL_PLAYABLE)) + if (qinfo->AllowableRaces > 0 && !(qinfo->AllowableRaces & RACEMASK_ALL_PLAYABLE)) { - TC_LOG_ERROR("sql.sql", "Quest %u does not contain any playable races in `AllowableRaces` (%d), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces); - qinfo->AllowableRaces = -1; + TC_LOG_ERROR("sql.sql", "Quest %u does not contain any playable races in `AllowableRaces` (" UI64FMTD "), value set to 0 (all races).", qinfo->GetQuestId(), qinfo->AllowableRaces); + qinfo->AllowableRaces = uint64(-1); } } // RequiredSkillId, can be 0 @@ -7573,8 +7573,8 @@ void ObjectMgr::LoadQuestPOI() uint32 count = 0; - // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 - QueryResult result = WorldDatabase.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1 FROM quest_poi order by QuestID, Idx1"); + // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 + QueryResult result = WorldDatabase.Query("SELECT QuestID, BlobIndex, Idx1, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs FROM quest_poi order by QuestID, Idx1"); if (!result) { TC_LOG_ERROR("server.loading", ">> Loaded 0 quest POI definitions. DB table `quest_poi` is empty."); @@ -7628,11 +7628,12 @@ void ObjectMgr::LoadQuestPOI() int32 WorldEffectID = fields[11].GetInt32(); int32 PlayerConditionID = fields[12].GetInt32(); int32 WoDUnk1 = fields[13].GetInt32(); + bool AlwaysAllowMergingBlobs = fields[14].GetBool(); if (!sObjectMgr->GetQuestTemplate(QuestID)) TC_LOG_ERROR("sql.sql", "`quest_poi` quest id (%u) Idx1 (%u) does not exist in `quest_template`", QuestID, Idx1); - QuestPOI POI(BlobIndex, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1); + QuestPOI POI(BlobIndex, ObjectiveIndex, QuestObjectiveID, QuestObjectID, MapID, WorldMapAreaId, Floor, Priority, Flags, WorldEffectID, PlayerConditionID, WoDUnk1, AlwaysAllowMergingBlobs); if (QuestID < int32(POIs.size()) && Idx1 < int32(POIs[QuestID].size())) { POI.points = POIs[QuestID][Idx1]; @@ -9645,10 +9646,10 @@ PlayerInfo const* ObjectMgr::GetPlayerInfo(uint32 race, uint32 class_) const void ObjectMgr::LoadRaceAndClassExpansionRequirements() { uint32 oldMSTime = getMSTime(); - _raceExpansionRequirementStore.clear(); + _raceUnlockRequirementStore.clear(); - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT raceID, expansion FROM `race_expansion_requirement`"); + // 0 1 2 + QueryResult result = WorldDatabase.Query("SELECT raceID, expansion, achievementId FROM `race_unlock_requirement`"); if (result) { @@ -9657,28 +9658,37 @@ void ObjectMgr::LoadRaceAndClassExpansionRequirements() { Field* fields = result->Fetch(); - uint8 raceID = fields[0].GetInt8(); - uint8 expansion = fields[1].GetInt8(); + uint8 raceID = fields[0].GetUInt8(); + uint8 expansion = fields[1].GetUInt8(); + uint32 achievementId = fields[2].GetUInt32(); ChrRacesEntry const* raceEntry = sChrRacesStore.LookupEntry(raceID); if (!raceEntry) { - TC_LOG_ERROR("sql.sql", "Race %u defined in `race_expansion_requirement` does not exists, skipped.", raceID); + TC_LOG_ERROR("sql.sql", "Race %u defined in `race_unlock_requirement` does not exists, skipped.", raceID); continue; } - if (expansion >= MAX_EXPANSIONS) + if (expansion >= MAX_ACCOUNT_EXPANSIONS) + { + TC_LOG_ERROR("sql.sql", "Race %u defined in `race_unlock_requirement` has incorrect expansion %u, skipped.", raceID, expansion); + continue; + } + + if (achievementId && !sAchievementStore.LookupEntry(achievementId)) { - TC_LOG_ERROR("sql.sql", "Race %u defined in `race_expansion_requirement` has incorrect expansion %u, skipped.", raceID, expansion); + TC_LOG_ERROR("sql.sql", "Race %u defined in `race_unlock_requirement` has incorrect achievement %u, skipped.", raceID, achievementId); continue; } - _raceExpansionRequirementStore[raceID] = expansion; + RaceUnlockRequirement& raceUnlockRequirement = _raceUnlockRequirementStore[raceID]; + raceUnlockRequirement.Expansion = expansion; + raceUnlockRequirement.AchievementId = achievementId; ++count; } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u race expansion requirements in %u ms.", count, GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " race expansion requirements in %u ms.", _raceUnlockRequirementStore.size(), GetMSTimeDiffToNow(oldMSTime)); } else TC_LOG_INFO("server.loading", ">> Loaded 0 race expansion requirements. DB table `race_expansion_requirement` is empty."); @@ -9910,7 +9920,7 @@ void ObjectMgr::LoadPlayerChoices() uint32 oldMSTime = getMSTime(); _playerChoices.clear(); - QueryResult choices = WorldDatabase.Query("SELECT ChoiceId, Question FROM playerchoice"); + QueryResult choices = WorldDatabase.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader FROM playerchoice"); if (!choices) { @@ -9932,7 +9942,9 @@ void ObjectMgr::LoadPlayerChoices() PlayerChoice& choice = _playerChoices[choiceId]; choice.ChoiceId = choiceId; - choice.Question = fields[1].GetString(); + choice.UiTextureKitId = fields[1].GetInt32(); + choice.Question = fields[2].GetString(); + choice.HideWarboardHeader = fields[3].GetBool(); } while (choices->NextRow()); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 7f3dd1b5115..63429371f62 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -718,11 +718,12 @@ struct QuestPOI int32 PlayerConditionID; int32 UnkWoD1; std::vector<QuestPOIPoint> points; + bool AlwaysAllowMergingBlobs; - QuestPOI() : BlobIndex(0), ObjectiveIndex(0), QuestObjectiveID(0), QuestObjectID(0), MapID(0), WorldMapAreaID(0), Floor(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0), UnkWoD1(0) { } - QuestPOI(int32 _BlobIndex, int32 _ObjectiveIndex, int32 _QuestObjectiveID, int32 _QuestObjectID, int32 _MapID, int32 _WorldMapAreaID, int32 _Foor, int32 _Priority, int32 _Flags, int32 _WorldEffectID, int32 _PlayerConditionID, int32 _UnkWoD1) : + QuestPOI() : BlobIndex(0), ObjectiveIndex(0), QuestObjectiveID(0), QuestObjectID(0), MapID(0), WorldMapAreaID(0), Floor(0), Priority(0), Flags(0), WorldEffectID(0), PlayerConditionID(0), UnkWoD1(0), AlwaysAllowMergingBlobs(false){ } + QuestPOI(int32 _BlobIndex, int32 _ObjectiveIndex, int32 _QuestObjectiveID, int32 _QuestObjectID, int32 _MapID, int32 _WorldMapAreaID, int32 _Foor, int32 _Priority, int32 _Flags, int32 _WorldEffectID, int32 _PlayerConditionID, int32 _UnkWoD1, bool _AlwaysAllowMergingBlobs) : BlobIndex(_BlobIndex), ObjectiveIndex(_ObjectiveIndex), QuestObjectiveID(_QuestObjectiveID), QuestObjectID(_QuestObjectID), MapID(_MapID), WorldMapAreaID(_WorldMapAreaID), - Floor(_Foor), Priority(_Priority), Flags(_Flags), WorldEffectID(_WorldEffectID), PlayerConditionID(_PlayerConditionID), UnkWoD1(_UnkWoD1) { } + Floor(_Foor), Priority(_Priority), Flags(_Flags), WorldEffectID(_WorldEffectID), PlayerConditionID(_PlayerConditionID), UnkWoD1(_UnkWoD1), AlwaysAllowMergingBlobs(_AlwaysAllowMergingBlobs) { } }; typedef std::vector<QuestPOI> QuestPOIVector; @@ -813,8 +814,10 @@ struct PlayerChoiceResponse struct PlayerChoice { int32 ChoiceId; + int32 UiTextureKitId; std::string Question; std::vector<PlayerChoiceResponse> Responses; + bool HideWarboardHeader; PlayerChoiceResponse const* GetResponse(int32 responseId) const { @@ -899,6 +902,12 @@ typedef std::unordered_map<uint32, std::vector<uint32 /*id*/>> TerrainPhaseInfo; typedef std::unordered_map<uint32, std::vector<uint32>> TerrainUIPhaseInfo; // worldmaparea swap typedef std::unordered_map<uint32, std::vector<PhaseInfoStruct>> PhaseInfo; // phase +struct RaceUnlockRequirement +{ + uint8 Expansion; + uint32 AchievementId; +}; + class PlayerDumpReader; class TC_GAME_API ObjectMgr @@ -1567,13 +1576,13 @@ class TC_GAME_API ObjectMgr std::string GetNormalizedRealmName(uint32 realm) const; bool GetRealmName(uint32 realmId, std::string& name, std::string& normalizedName) const; - std::unordered_map<uint8, uint8> const& GetRaceExpansionRequirements() const { return _raceExpansionRequirementStore; } - uint8 GetRaceExpansionRequirement(uint8 race) const + std::unordered_map<uint8, RaceUnlockRequirement> const& GetRaceUnlockRequirements() const { return _raceUnlockRequirementStore; } + RaceUnlockRequirement const* GetRaceUnlockRequirement(uint8 race) const { - auto itr = _raceExpansionRequirementStore.find(race); - if (itr != _raceExpansionRequirementStore.end()) - return itr->second; - return EXPANSION_CLASSIC; + auto itr = _raceUnlockRequirementStore.find(race); + if (itr != _raceUnlockRequirementStore.end()) + return &itr->second; + return nullptr; } std::unordered_map<uint8, uint8> const& GetClassExpansionRequirements() const { return _classExpansionRequirementStore; } @@ -1751,7 +1760,7 @@ class TC_GAME_API ObjectMgr std::set<uint32> _difficultyEntries[MAX_CREATURE_DIFFICULTIES]; // already loaded difficulty 1 value in creatures, used in CheckCreatureTemplate std::set<uint32> _hasDifficultyEntries[MAX_CREATURE_DIFFICULTIES]; // already loaded creatures with difficulty 1 values, used in CheckCreatureTemplate - std::unordered_map<uint8, uint8> _raceExpansionRequirementStore; + std::unordered_map<uint8, RaceUnlockRequirement> _raceUnlockRequirementStore; std::unordered_map<uint8, uint8> _classExpansionRequirementStore; RealmNameContainer _realmNameStore; diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 77a23130a97..fc0699a5810 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -251,7 +251,7 @@ struct GuildReward { uint32 ItemID; uint8 MinGuildRep; - int32 RaceMask; + uint64 RaceMask; uint64 Cost; std::vector<uint32> AchievementsRequired; }; diff --git a/src/server/game/Guilds/GuildMgr.cpp b/src/server/game/Guilds/GuildMgr.cpp index ded132f9297..09b17086872 100644 --- a/src/server/game/Guilds/GuildMgr.cpp +++ b/src/server/game/Guilds/GuildMgr.cpp @@ -515,7 +515,7 @@ void GuildMgr::LoadGuildRewards() Field* fields = result->Fetch(); reward.ItemID = fields[0].GetUInt32(); reward.MinGuildRep = fields[1].GetUInt8(); - reward.RaceMask = fields[2].GetInt32(); + reward.RaceMask = fields[2].GetUInt64(); reward.Cost = fields[3].GetUInt64(); if (!sObjectMgr->GetItemTemplate(reward.ItemID)) diff --git a/src/server/game/Handlers/AuthHandler.cpp b/src/server/game/Handlers/AuthHandler.cpp index 8e5d6a77732..296bf506edc 100644 --- a/src/server/game/Handlers/AuthHandler.cpp +++ b/src/server/game/Handlers/AuthHandler.cpp @@ -35,7 +35,7 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos) { response.SuccessInfo = boost::in_place(); - response.SuccessInfo->AccountExpansionLevel = GetExpansion(); + response.SuccessInfo->AccountExpansionLevel = GetAccountExpansion(); response.SuccessInfo->ActiveExpansionLevel = GetExpansion(); response.SuccessInfo->VirtualRealmAddress = realm.Id.GetAddress(); response.SuccessInfo->Time = int32(time(nullptr)); @@ -48,7 +48,6 @@ void WorldSession::SendAuthResponse(uint32 code, bool queued, uint32 queuePos) response.SuccessInfo->Templates.push_back(&templ.second); response.SuccessInfo->AvailableClasses = &sObjectMgr->GetClassExpansionRequirements(); - response.SuccessInfo->AvailableRaces = &sObjectMgr->GetRaceExpansionRequirements(); } if (queued) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index d390abe71e5..2edd9d71b9b 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -301,8 +301,9 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) { do { - Field* fields = result->Fetch(); - WorldPackets::Character::EnumCharactersResult::CharacterInfo charInfo(fields); + charEnum.Characters.emplace_back(result->Fetch()); + + WorldPackets::Character::EnumCharactersResult::CharacterInfo& charInfo = charEnum.Characters.back(); TC_LOG_INFO("network", "Loading char guid %s from account %u.", charInfo.Guid.ToString().c_str(), GetAccountId()); @@ -338,15 +339,21 @@ void WorldSession::HandleCharEnum(PreparedQueryResult result) else charEnum.HasDemonHunterOnRealm = false; - if (charInfo.Level >= sWorld->getIntConfig(CONFIG_CHARACTER_CREATING_MIN_LEVEL_FOR_DEMON_HUNTER) || canAlwaysCreateDemonHunter) - charEnum.HasLevel70OnRealm = true; - - charEnum.Characters.emplace_back(charInfo); + charEnum.MaxCharacterLevel = std::max<int32>(charEnum.MaxCharacterLevel, charInfo.Level); } while (result->NextRow()); } - charEnum.IsDemonHunterCreationAllowed = (!charEnum.HasDemonHunterOnRealm && charEnum.HasLevel70OnRealm) || canAlwaysCreateDemonHunter; + charEnum.IsDemonHunterCreationAllowed = GetAccountExpansion() >= EXPANSION_LEGION || canAlwaysCreateDemonHunter; + charEnum.IsAlliedRacesCreationAllowed = GetAccountExpansion() >= EXPANSION_BATTLE_FOR_AZEROTH; + + for (std::pair<uint8 const, RaceUnlockRequirement> const& requirement : sObjectMgr->GetRaceUnlockRequirements()) + { + WorldPackets::Character::EnumCharactersResult::RaceUnlock raceUnlock; + raceUnlock.RaceID = requirement.first; + raceUnlock.HasExpansion = GetAccountExpansion() >= requirement.second.Expansion; + charEnum.RaceUnlockData.push_back(raceUnlock); + } SendPacket(charEnum.Write()); } @@ -458,19 +465,36 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact } // prevent character creating Expansion race without Expansion account - uint8 raceExpansionRequirement = sObjectMgr->GetRaceExpansionRequirement(charCreate.CreateInfo->Race); - if (raceExpansionRequirement > GetExpansion()) + RaceUnlockRequirement const* raceExpansionRequirement = sObjectMgr->GetRaceUnlockRequirement(charCreate.CreateInfo->Race); + if (!raceExpansionRequirement) { - TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character with expansion %u race (%u)", GetExpansion(), GetAccountId(), raceExpansionRequirement, charCreate.CreateInfo->Race); + TC_LOG_ERROR("entities.player.cheat", "Account %u tried to create character with unavailable race %u", GetAccountId(), charCreate.CreateInfo->Race); + SendCharCreate(CHAR_CREATE_FAILED); + return; + } + + if (raceExpansionRequirement->Expansion > GetAccountExpansion()) + { + TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character with expansion %u race (%u)", + GetAccountExpansion(), GetAccountId(), raceExpansionRequirement->Expansion, charCreate.CreateInfo->Race); SendCharCreate(CHAR_CREATE_EXPANSION); return; } + //if (raceExpansionRequirement->AchievementId && !) + //{ + // TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character without achievement %u race (%u)", + // GetAccountExpansion(), GetAccountId(), raceExpansionRequirement->AchievementId, charCreate.CreateInfo->Race); + // SendCharCreate(CHAR_CREATE_ALLIED_RACE_ACHIEVEMENT); + // return; + //} + // prevent character creating Expansion class without Expansion account uint8 classExpansionRequirement = sObjectMgr->GetClassExpansionRequirement(charCreate.CreateInfo->Class); - if (classExpansionRequirement > GetExpansion()) + if (classExpansionRequirement > GetAccountExpansion()) { - TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character with expansion %u class (%u)", GetExpansion(), GetAccountId(), classExpansionRequirement, charCreate.CreateInfo->Class); + TC_LOG_ERROR("entities.player.cheat", "Expansion %u account:[%d] tried to Create character with expansion %u class (%u)", + GetAccountExpansion(), GetAccountId(), classExpansionRequirement, charCreate.CreateInfo->Class); SendCharCreate(CHAR_CREATE_EXPANSION_CLASS); return; } @@ -665,7 +689,7 @@ void WorldSession::HandleCharCreateOpcode(WorldPackets::Character::CreateCharact if (checkDemonHunterReqs && !hasDemonHunterReqLevel) { - SendCharCreate(CHAR_CREATE_FAILED); + SendCharCreate(CHAR_CREATE_LEVEL_REQUIREMENT_DEMON_HUNTER); return; } @@ -2112,8 +2136,8 @@ void WorldSession::HandleCharRaceOrFactionChangeCallback(std::shared_ptr<WorldPa for (ObjectMgr::QuestMap::const_iterator iter = questTemplates.begin(); iter != questTemplates.end(); ++iter) { Quest const* quest = iter->second; - uint32 newRaceMask = (newTeamId == TEAM_ALLIANCE) ? RACEMASK_ALLIANCE : RACEMASK_HORDE; - if (quest->GetAllowableRaces() != -1 && !(quest->GetAllowableRaces() & newRaceMask)) + uint64 newRaceMask = (newTeamId == TEAM_ALLIANCE) ? RACEMASK_ALLIANCE : RACEMASK_HORDE; + if (quest->GetAllowableRaces() != uint64(-1) && !(quest->GetAllowableRaces() & newRaceMask)) { stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_QUESTSTATUS_REWARDED_ACTIVE_BY_QUEST); stmt->setUInt64(0, lowGuid); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 7d2115c618d..76f307d6359 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -172,7 +172,7 @@ void WorldSession::HandleWhoOpcode(WorldPackets::Who::WhoRequestPkt& whoRequest) continue; // check if race matches racemask - if (request.RaceFilter >= 0 && !(request.RaceFilter & (1 << target->getRace()))) + if (request.RaceFilter >= 0 && !(request.RaceFilter & (UI64LIT(1) << target->getRace()))) continue; if (!whoRequest.Areas.empty()) diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 079f2b8fd13..33d18b946f6 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -375,6 +375,7 @@ void WorldSession::HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& quest questPOIBlobData.WorldEffectID = data->WorldEffectID; questPOIBlobData.PlayerConditionID = data->PlayerConditionID; questPOIBlobData.UnkWoD1 = data->UnkWoD1; + questPOIBlobData.AlwaysAllowMergingBlobs = data->AlwaysAllowMergingBlobs; for (QuestPOIPoint const& point : data->points) { diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index b5ced4bdb81..1bcd86a4a03 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -85,7 +85,12 @@ enum Expansions EXPANSION_MISTS_OF_PANDARIA = 4, EXPANSION_WARLORDS_OF_DRAENOR = 5, EXPANSION_LEGION = 6, - MAX_EXPANSIONS + MAX_EXPANSIONS, + + // future expansion + EXPANSION_BATTLE_FOR_AZEROTH = 7, + + MAX_ACCOUNT_EXPANSIONS }; #define CURRENT_EXPANSION EXPANSION_LEGION @@ -1947,6 +1952,19 @@ enum SpellCustomErrors SPELL_CUSTOM_ERROR_MUST_BE_STANDING_NEAR_INJURED_CHROMIE_IN_MOUNT_HYJAL = 340, // Must be standing near the injured Chromie in Mount Hyjal. SPELL_CUSTOM_ERROR_REMOVE_CANNONS_HEAVY_IRON_PLATING_FIRST = 342, // You should remove the cannon's Heavy Iron Plating first. SPELL_CUSTOM_ERROR_REMOVE_CANNONS_ELECTROKINETIC_DEFENSE_GRID_FIRST = 343, // You should remove the cannon's Electrokinetic Defense Grid first. + SPELL_CUSTOM_ERROR_REQUIRES_THE_ARMORY_KEY_AND_DENDRITE_CLUSTERS = 344, // You are missing pieces of the Armory Key or do not have enough Dendrite Clusters. + SPELL_CUSTOM_ERROR_THIS_ITEM_REQUIRES_BASIC_OBLITERUM_TO_UPGRADE = 345, // This item requires basic Obliterum to upgrade. + SPELL_CUSTOM_ERROR_THIS_ITEM_REQUIRES_PRIMAL_OBLITERUM_TO_UPGRADE = 346, // This item requires Primal Obliterum to upgrade. + SPELL_CUSTOM_ERROR_THIS_ITEM_REQUIRES_FLIGHT_MASTERS_WHISTLE = 347, // This item requires a Flight Master's Whistle. + SPELL_CUSTOM_ERROR_REQUIRES_POWER_THAT_ECHOES_THAT_OF_THE_AUGARI = 349, // Will only open to one wielding the power that echoes that of the Augari. + SPELL_CUSTOM_ERROR_THAT_PLAYER_HAS_A_PENDING_TOTEMIC_REVIVAL = 350, // That player has a pending Totemic Revival. + SPELL_CUSTOM_ERROR_YOU_HAVE_NO_FIRE_MINES_DEPLOYED = 351, // You have no Fire Mines deployed. + SPELL_CUSTOM_ERROR_YOU_ARE_BLOCKED_BY_A_STRUCTURE_ABOVE_YOU = 353, // You are blocked by a structure above you. + SPELL_CUSTOM_ERROR_REQUIRES_100_IMP_MEAT = 354, // Requires 100 Imp Meat. + SPELL_CUSTOM_ERROR_YOU_HAVE_NOT_OBTAINED_ANY_BACKGROUND_FILTERS = 355, // You have not obtained any background filters. + SPELL_CUSTOM_ERROR_NOTHING_INTERESTING_POSTED_HERE_RIGHT_NOW = 356, // There is nothing interesting posted here right now. + SPELL_CUSTOM_ERROR_PARAGON_REPUTATION_REQUIRES_HIGHER_LEVEL = 357, // Paragon Reputation is not available until a higher level. + SPELL_CUSTOM_ERROR_UUNA_IS_MISSING = 358, // Uuna is missing. }; enum StealthType @@ -4724,51 +4742,54 @@ enum ResponseCodes CHAR_CREATE_TRIAL = 47, CHAR_CREATE_TIMEOUT = 48, CHAR_CREATE_THROTTLE = 49, - - CHAR_DELETE_IN_PROGRESS = 50, - CHAR_DELETE_SUCCESS = 51, - CHAR_DELETE_FAILED = 52, - CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 53, - CHAR_DELETE_FAILED_GUILD_LEADER = 54, - CHAR_DELETE_FAILED_ARENA_CAPTAIN = 55, - CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 56, - CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 57, - CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 58, - CHAR_DELETE_FAILED_VAS_TRANSACTION_IN_PROGRESS = 59, - - CHAR_LOGIN_IN_PROGRESS = 60, - CHAR_LOGIN_SUCCESS = 61, - CHAR_LOGIN_NO_WORLD = 62, - CHAR_LOGIN_DUPLICATE_CHARACTER = 63, - CHAR_LOGIN_NO_INSTANCES = 64, - CHAR_LOGIN_FAILED = 65, - CHAR_LOGIN_DISABLED = 66, - CHAR_LOGIN_NO_CHARACTER = 67, - CHAR_LOGIN_LOCKED_FOR_TRANSFER = 68, - CHAR_LOGIN_LOCKED_BY_BILLING = 69, - CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 70, - CHAR_LOGIN_TEMPORARY_GM_LOCK = 71, - CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 72, - CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 73, - CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 74, - - CHAR_NAME_SUCCESS = 75, - CHAR_NAME_FAILURE = 76, - CHAR_NAME_NO_NAME = 77, - CHAR_NAME_TOO_SHORT = 78, - CHAR_NAME_TOO_LONG = 79, - CHAR_NAME_INVALID_CHARACTER = 80, - CHAR_NAME_MIXED_LANGUAGES = 81, - CHAR_NAME_PROFANE = 82, - CHAR_NAME_RESERVED = 83, - CHAR_NAME_INVALID_APOSTROPHE = 84, - CHAR_NAME_MULTIPLE_APOSTROPHES = 85, - CHAR_NAME_THREE_CONSECUTIVE = 86, - CHAR_NAME_INVALID_SPACE = 87, - CHAR_NAME_CONSECUTIVE_SPACES = 88, - CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 89, - CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 90, - CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 91 + CHAR_CREATE_ALLIED_RACE_ACHIEVEMENT = 50, + CHAR_CREATE_LEVEL_REQUIREMENT_DEMON_HUNTER = 51, + + CHAR_DELETE_IN_PROGRESS = 52, + CHAR_DELETE_SUCCESS = 53, + CHAR_DELETE_FAILED = 54, + CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 55, + CHAR_DELETE_FAILED_GUILD_LEADER = 56, + CHAR_DELETE_FAILED_ARENA_CAPTAIN = 57, + CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 58, + CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 59, + CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 60, + CHAR_DELETE_FAILED_VAS_TRANSACTION_IN_PROGRESS = 61, + + CHAR_LOGIN_IN_PROGRESS = 62, + CHAR_LOGIN_SUCCESS = 63, + CHAR_LOGIN_NO_WORLD = 64, + CHAR_LOGIN_DUPLICATE_CHARACTER = 65, + CHAR_LOGIN_NO_INSTANCES = 66, + CHAR_LOGIN_FAILED = 67, + CHAR_LOGIN_DISABLED = 68, + CHAR_LOGIN_NO_CHARACTER = 69, + CHAR_LOGIN_LOCKED_FOR_TRANSFER = 70, + CHAR_LOGIN_LOCKED_BY_BILLING = 71, + CHAR_LOGIN_LOCKED_BY_MOBILE_AH = 72, + CHAR_LOGIN_TEMPORARY_GM_LOCK = 73, + CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 74, + CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 75, + CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 76, + CHAR_LOGIN_LOCKED_BY_RESTRICTION = 77, + + CHAR_NAME_SUCCESS = 78, + CHAR_NAME_FAILURE = 79, + CHAR_NAME_NO_NAME = 80, + CHAR_NAME_TOO_SHORT = 81, + CHAR_NAME_TOO_LONG = 82, + CHAR_NAME_INVALID_CHARACTER = 83, + CHAR_NAME_MIXED_LANGUAGES = 84, + CHAR_NAME_PROFANE = 85, + CHAR_NAME_RESERVED = 86, + CHAR_NAME_INVALID_APOSTROPHE = 87, + CHAR_NAME_MULTIPLE_APOSTROPHES = 88, + CHAR_NAME_THREE_CONSECUTIVE = 89, + CHAR_NAME_INVALID_SPACE = 90, + CHAR_NAME_CONSECUTIVE_SPACES = 91, + CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 92, + CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 93, + CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 94 }; enum CharacterUndeleteResult @@ -6195,6 +6216,7 @@ enum class GameError : uint32 ERR_CLAIMED_CHALLENGE_MODE_REWARD_OLD = 984, ERR_TALENT_GRANTED_BY_AURA = 985, ERR_CHALLENGE_MODE_ALREADY_COMPLETE = 986, + ERR_GLYPH_TARGET_NOT_AVAILABLE = 987, }; #endif diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 0b5bb9078bf..7e815ce9a42 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -37,37 +37,38 @@ Quest::Quest(Field* questRecord) ID = questRecord[0].GetUInt32(); Type = questRecord[1].GetUInt8(); Level = questRecord[2].GetInt32(); - PackageID = questRecord[3].GetUInt32(); - MinLevel = questRecord[4].GetInt32(); - QuestSortID = questRecord[5].GetInt16(); - QuestInfoID = questRecord[6].GetUInt16(); - SuggestedPlayers = questRecord[7].GetUInt8(); - NextQuestInChain = questRecord[8].GetUInt32(); - RewardXPDifficulty = questRecord[9].GetUInt32(); - RewardXPMultiplier = questRecord[10].GetFloat(); - RewardMoney = questRecord[11].GetUInt32(); - RewardMoneyDifficulty = questRecord[12].GetUInt32(); - RewardMoneyMultiplier = questRecord[13].GetFloat(); - RewardBonusMoney = questRecord[14].GetUInt32(); + MaxScalingLevel = questRecord[3].GetInt32(); + PackageID = questRecord[4].GetUInt32(); + MinLevel = questRecord[5].GetInt32(); + QuestSortID = questRecord[6].GetInt16(); + QuestInfoID = questRecord[7].GetUInt16(); + SuggestedPlayers = questRecord[8].GetUInt8(); + NextQuestInChain = questRecord[9].GetUInt32(); + RewardXPDifficulty = questRecord[10].GetUInt32(); + RewardXPMultiplier = questRecord[11].GetFloat(); + RewardMoney = questRecord[12].GetUInt32(); + RewardMoneyDifficulty = questRecord[13].GetUInt32(); + RewardMoneyMultiplier = questRecord[14].GetFloat(); + RewardBonusMoney = questRecord[15].GetUInt32(); for (uint32 i = 0; i < QUEST_REWARD_DISPLAY_SPELL_COUNT; ++i) - RewardDisplaySpell[i] = questRecord[15 + i].GetUInt32(); - - RewardSpell = questRecord[18].GetUInt32(); - RewardHonor = questRecord[19].GetUInt32(); - RewardKillHonor = questRecord[20].GetUInt32(); - SourceItemId = questRecord[21].GetUInt32(); - RewardArtifactXPDifficulty = questRecord[22].GetUInt32(); - RewardArtifactXPMultiplier = questRecord[23].GetFloat(); - RewardArtifactCategoryID = questRecord[24].GetUInt32(); - Flags = questRecord[25].GetUInt32(); - FlagsEx = questRecord[26].GetUInt32(); + RewardDisplaySpell[i] = questRecord[16 + i].GetUInt32(); + + RewardSpell = questRecord[19].GetUInt32(); + RewardHonor = questRecord[20].GetUInt32(); + RewardKillHonor = questRecord[21].GetUInt32(); + SourceItemId = questRecord[22].GetUInt32(); + RewardArtifactXPDifficulty = questRecord[23].GetUInt32(); + RewardArtifactXPMultiplier = questRecord[24].GetFloat(); + RewardArtifactCategoryID = questRecord[25].GetUInt32(); + Flags = questRecord[26].GetUInt32(); + FlagsEx = questRecord[27].GetUInt32(); for (uint32 i = 0; i < QUEST_ITEM_DROP_COUNT; ++i) { - RewardItemId[i] = questRecord[27 + i * 4].GetUInt32(); - RewardItemCount[i] = questRecord[28 + i * 4].GetUInt32(); - ItemDrop[i] = questRecord[29 + i * 4].GetUInt32(); - ItemDropQuantity[i] = questRecord[30 + i * 4].GetUInt32(); + RewardItemId[i] = questRecord[28 + i * 4].GetUInt32(); + RewardItemCount[i] = questRecord[29 + i * 4].GetUInt32(); + ItemDrop[i] = questRecord[30 + i * 4].GetUInt32(); + ItemDropQuantity[i] = questRecord[31 + i * 4].GetUInt32(); if (RewardItemId[i]) ++_rewItemsCount; @@ -75,63 +76,63 @@ Quest::Quest(Field* questRecord) for (uint32 i = 0; i < QUEST_REWARD_CHOICES_COUNT; ++i) { - RewardChoiceItemId[i] = questRecord[43 + i * 3].GetUInt32(); - RewardChoiceItemCount[i] = questRecord[44 + i * 3].GetUInt32(); - RewardChoiceItemDisplayId[i] = questRecord[45 + i * 3].GetUInt32(); + RewardChoiceItemId[i] = questRecord[44 + i * 3].GetUInt32(); + RewardChoiceItemCount[i] = questRecord[45 + i * 3].GetUInt32(); + RewardChoiceItemDisplayId[i] = questRecord[46 + i * 3].GetUInt32(); if (RewardChoiceItemId[i]) ++_rewChoiceItemsCount; } - POIContinent = questRecord[61].GetUInt32(); - POIx = questRecord[62].GetFloat(); - POIy = questRecord[63].GetFloat(); - POIPriority = questRecord[64].GetUInt32(); + POIContinent = questRecord[62].GetUInt32(); + POIx = questRecord[63].GetFloat(); + POIy = questRecord[64].GetFloat(); + POIPriority = questRecord[65].GetUInt32(); - RewardTitleId = questRecord[65].GetUInt32(); - RewardArenaPoints = questRecord[66].GetUInt32(); - RewardSkillId = questRecord[67].GetUInt32(); - RewardSkillPoints = questRecord[68].GetUInt32(); + RewardTitleId = questRecord[66].GetUInt32(); + RewardArenaPoints = questRecord[67].GetUInt32(); + RewardSkillId = questRecord[68].GetUInt32(); + RewardSkillPoints = questRecord[69].GetUInt32(); - QuestGiverPortrait = questRecord[69].GetUInt32(); - QuestTurnInPortrait = questRecord[70].GetUInt32(); + QuestGiverPortrait = questRecord[70].GetUInt32(); + QuestTurnInPortrait = questRecord[71].GetUInt32(); for (uint32 i = 0; i < QUEST_REWARD_REPUTATIONS_COUNT; ++i) { - RewardFactionId[i] = questRecord[71 + i * 4].GetUInt32(); - RewardFactionValue[i] = questRecord[72 + i * 4].GetInt32(); - RewardFactionOverride[i] = questRecord[73 + i * 4].GetInt32(); - RewardFactionCapIn[i] = questRecord[74 + i * 4].GetUInt32(); + RewardFactionId[i] = questRecord[72 + i * 4].GetUInt32(); + RewardFactionValue[i] = questRecord[73 + i * 4].GetInt32(); + RewardFactionOverride[i] = questRecord[74 + i * 4].GetInt32(); + RewardFactionCapIn[i] = questRecord[75 + i * 4].GetUInt32(); } - RewardReputationMask = questRecord[91].GetUInt32(); + RewardReputationMask = questRecord[92].GetUInt32(); for (uint32 i = 0; i < QUEST_REWARD_CURRENCY_COUNT; ++i) { - RewardCurrencyId[i] = questRecord[92 + i * 2].GetUInt32(); - RewardCurrencyCount[i] = questRecord[93 + i * 2].GetUInt32(); + RewardCurrencyId[i] = questRecord[93 + i * 2].GetUInt32(); + RewardCurrencyCount[i] = questRecord[94 + i * 2].GetUInt32(); if (RewardCurrencyId[i]) ++_rewCurrencyCount; } - SoundAccept = questRecord[100].GetUInt32(); - SoundTurnIn = questRecord[101].GetUInt32(); - AreaGroupID = questRecord[102].GetUInt32(); - LimitTime = questRecord[103].GetUInt32(); - AllowableRaces = questRecord[104].GetInt32(); - QuestRewardID = questRecord[105].GetUInt32(); - Expansion = questRecord[106].GetInt32(); - - LogTitle = questRecord[107].GetString(); - LogDescription = questRecord[108].GetString(); - QuestDescription = questRecord[109].GetString(); - AreaDescription = questRecord[110].GetString(); - PortraitGiverText = questRecord[111].GetString(); - PortraitGiverName = questRecord[112].GetString(); - PortraitTurnInText = questRecord[113].GetString(); - PortraitTurnInName = questRecord[114].GetString(); - QuestCompletionLog = questRecord[115].GetString(); + SoundAccept = questRecord[101].GetUInt32(); + SoundTurnIn = questRecord[102].GetUInt32(); + AreaGroupID = questRecord[103].GetUInt32(); + LimitTime = questRecord[104].GetUInt32(); + AllowableRaces = questRecord[105].GetUInt64(); + QuestRewardID = questRecord[106].GetUInt32(); + Expansion = questRecord[107].GetInt32(); + + LogTitle = questRecord[108].GetString(); + LogDescription = questRecord[109].GetString(); + QuestDescription = questRecord[110].GetString(); + AreaDescription = questRecord[111].GetString(); + PortraitGiverText = questRecord[112].GetString(); + PortraitGiverName = questRecord[113].GetString(); + PortraitTurnInText = questRecord[114].GetString(); + PortraitTurnInName = questRecord[115].GetString(); + QuestCompletionLog = questRecord[116].GetString(); for (uint32 i = 0; i < QUEST_EMOTE_COUNT; ++i) { diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index 943fa06f6b1..88132ce0285 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -351,9 +351,10 @@ class TC_GAME_API Quest int32 GetMinLevel() const { return MinLevel; } uint32 GetMaxLevel() const { return MaxLevel; } int32 GetQuestLevel() const { return Level; } + int32 GetQuestMaxScalingLevel() const { return MaxScalingLevel; } uint32 GetQuestInfoID() const { return QuestInfoID; } uint32 GetAllowableClasses() const { return AllowableClasses; } - int32 GetAllowableRaces() const { return AllowableRaces; } + uint64 GetAllowableRaces() const { return AllowableRaces; } uint32 GetRequiredSkill() const { return RequiredSkillId; } uint32 GetRequiredSkillValue() const { return RequiredSkillPoints; } uint32 GetRequiredMinRepFaction() const { return RequiredMinRepFaction; } @@ -452,6 +453,7 @@ class TC_GAME_API Quest uint32 ID; uint32 Type; int32 Level; + int32 MaxScalingLevel; uint32 PackageID; int32 MinLevel; int32 QuestSortID; @@ -502,7 +504,7 @@ class TC_GAME_API Quest uint32 SoundTurnIn; uint32 AreaGroupID; uint32 LimitTime; - int32 AllowableRaces; + uint64 AllowableRaces; uint32 QuestRewardID; int32 Expansion; QuestObjectives Objectives; diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 3953a856b60..31a3b2d6ee2 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -130,18 +130,11 @@ WorldPacket const* WorldPackets::Auth::AuthResponse::Write() _worldPacket << uint8(SuccessInfo->ActiveExpansionLevel); _worldPacket << uint8(SuccessInfo->AccountExpansionLevel); _worldPacket << uint32(SuccessInfo->TimeSecondsUntilPCKick); - _worldPacket << uint32(SuccessInfo->AvailableRaces->size()); _worldPacket << uint32(SuccessInfo->AvailableClasses->size()); _worldPacket << uint32(SuccessInfo->Templates.size()); _worldPacket << uint32(SuccessInfo->CurrencyID); _worldPacket << int32(SuccessInfo->Time); - for (auto const& race : *SuccessInfo->AvailableRaces) - { - _worldPacket << uint8(race.first); /// the current race - _worldPacket << uint8(race.second); /// the required Expansion - } - for (auto const& klass : *SuccessInfo->AvailableClasses) { _worldPacket << uint8(klass.first); /// the current class diff --git a/src/server/game/Server/Packets/AuthenticationPackets.h b/src/server/game/Server/Packets/AuthenticationPackets.h index 7e244df991b..fbc0c6bb256 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.h +++ b/src/server/game/Server/Packets/AuthenticationPackets.h @@ -153,7 +153,6 @@ namespace WorldPackets std::vector<CharacterTemplate const*> Templates; ///< list of pre-made character templates. std::unordered_map<uint8, uint8> const* AvailableClasses = nullptr; ///< the minimum AccountExpansion required to select the classes - std::unordered_map<uint8, uint8> const* AvailableRaces = nullptr; ///< the minimum AccountExpansion required to select the races bool IsExpansionTrial = false; bool ForceCharacterTemplate = false; ///< forces the client to always use a character template when creating a new character. @see Templates. @todo implement diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index fd88684bab6..538a2c7e1d5 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -37,8 +37,8 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel // "characters.zone, characters.map, characters.position_x, characters.position_y, characters.position_z, " // 19 20 21 22 23 24 25 // "guild_member.guildid, characters.playerFlags, characters.at_login, character_pet.entry, character_pet.modelid, character_pet.level, characters.equipmentCache, " - // 26 27 28 29 30 - // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, character_declinedname.genitive" + // 26 27 28 29 30 31 + // "character_banned.guid, characters.slot, characters.logout_time, characters.activeTalentGroup, characters.lastLoginBuild, character_declinedname.genitive" Guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); Name = fields[1].GetString(); @@ -82,7 +82,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel if (fields[26].GetUInt64()) Flags |= CHARACTER_FLAG_LOCKED_BY_BILLING; - if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[30].GetString().empty()) + if (sWorld->getBoolConfig(CONFIG_DECLINED_NAMES_USED) && !fields[31].GetString().empty()) Flags |= CHARACTER_FLAG_DECLINED; if (atLoginFlags & AT_LOGIN_CUSTOMIZE) @@ -117,6 +117,8 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(Class, fields[29].GetUInt8())) SpecID = spec->ID; + LastLoginBuild = fields[30].GetUInt32(); + for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { uint32 visualBase = slot * 3; @@ -126,76 +128,96 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel } } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::CharacterInfo::VisualItemInfo const& visualItem) +{ + data << uint32(visualItem.DisplayId); + data << uint32(visualItem.DisplayEnchantId); + data << uint8(visualItem.InventoryType); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::CharacterInfo const& charInfo) +{ + data << charInfo.Guid; + data << uint8(charInfo.ListPosition); + data << uint8(charInfo.Race); + data << uint8(charInfo.Class); + data << uint8(charInfo.Sex); + data << uint8(charInfo.Skin); + data << uint8(charInfo.Face); + data << uint8(charInfo.HairStyle); + data << uint8(charInfo.HairColor); + data << uint8(charInfo.FacialHair); + data.append(charInfo.CustomDisplay.data(), charInfo.CustomDisplay.size()); + data << uint8(charInfo.Level); + data << int32(charInfo.ZoneId); + data << int32(charInfo.MapId); + data << charInfo.PreLoadPosition; + data << charInfo.GuildGuid; + data << uint32(charInfo.Flags); + data << uint32(charInfo.CustomizationFlag); + data << uint32(charInfo.Flags3); + data << uint32(charInfo.Pet.CreatureDisplayId); + data << uint32(charInfo.Pet.Level); + data << uint32(charInfo.Pet.CreatureFamily); + + data << uint32(charInfo.ProfessionIds[0]); + data << uint32(charInfo.ProfessionIds[1]); + + for (WorldPackets::Character::EnumCharactersResult::CharacterInfo::VisualItemInfo const& visualItem : charInfo.VisualItems) + data << visualItem; + + data << uint32(charInfo.LastPlayedTime); + data << uint16(charInfo.SpecID); + data << uint32(charInfo.Unknown703); + data << uint32(charInfo.LastLoginBuild); + data << uint32(charInfo.Flags4); + data.WriteBits(charInfo.Name.length(), 6); + data.WriteBit(charInfo.FirstLogin); + data.WriteBit(charInfo.BoostInProgress); + data.WriteBits(charInfo.unkWod61x, 5); + data.FlushBits(); + + data.WriteString(charInfo.Name); + + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::RaceUnlock const& raceUnlock) +{ + data << int32(raceUnlock.RaceID); + data.WriteBit(raceUnlock.HasExpansion); + data.WriteBit(raceUnlock.HasAchievement); + data.WriteBit(raceUnlock.HasHeritageArmor); + data.FlushBits(); + + return data; +} + WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() { - _worldPacket.reserve(9 + Characters.size() * sizeof(CharacterInfo) + FactionChangeRestrictions.size() * sizeof(RestrictedFactionChangeRuleInfo)); + _worldPacket.reserve(9 + Characters.size() * sizeof(CharacterInfo) + RaceUnlockData.size() * sizeof(RaceUnlock)); _worldPacket.WriteBit(Success); _worldPacket.WriteBit(IsDeletedCharacters); _worldPacket.WriteBit(IsDemonHunterCreationAllowed); _worldPacket.WriteBit(HasDemonHunterOnRealm); - _worldPacket.WriteBit(HasLevel70OnRealm); _worldPacket.WriteBit(Unknown7x); _worldPacket.WriteBit(DisabledClassesMask.is_initialized()); + _worldPacket.WriteBit(IsAlliedRacesCreationAllowed); _worldPacket << uint32(Characters.size()); - _worldPacket << uint32(FactionChangeRestrictions.size()); + _worldPacket << int32(MaxCharacterLevel); + _worldPacket << uint32(RaceUnlockData.size()); if (DisabledClassesMask) _worldPacket << uint32(*DisabledClassesMask); - for (RestrictedFactionChangeRuleInfo const& rule : FactionChangeRestrictions) - { - _worldPacket << int32(rule.Mask); - _worldPacket << uint8(rule.Race); - } - for (CharacterInfo const& charInfo : Characters) - { - _worldPacket << charInfo.Guid; - _worldPacket << uint8(charInfo.ListPosition); - _worldPacket << uint8(charInfo.Race); - _worldPacket << uint8(charInfo.Class); - _worldPacket << uint8(charInfo.Sex); - _worldPacket << uint8(charInfo.Skin); - _worldPacket << uint8(charInfo.Face); - _worldPacket << uint8(charInfo.HairStyle); - _worldPacket << uint8(charInfo.HairColor); - _worldPacket << uint8(charInfo.FacialHair); - _worldPacket.append(charInfo.CustomDisplay.data(), charInfo.CustomDisplay.size()); - _worldPacket << uint8(charInfo.Level); - _worldPacket << int32(charInfo.ZoneId); - _worldPacket << int32(charInfo.MapId); - _worldPacket << charInfo.PreLoadPosition; - _worldPacket << charInfo.GuildGuid; - _worldPacket << uint32(charInfo.Flags); - _worldPacket << uint32(charInfo.CustomizationFlag); - _worldPacket << uint32(charInfo.Flags3); - _worldPacket << uint32(charInfo.Pet.CreatureDisplayId); - _worldPacket << uint32(charInfo.Pet.Level); - _worldPacket << uint32(charInfo.Pet.CreatureFamily); - - _worldPacket << uint32(charInfo.ProfessionIds[0]); - _worldPacket << uint32(charInfo.ProfessionIds[1]); - - for (CharacterInfo::VisualItemInfo const& visualItem : charInfo.VisualItems) - { - _worldPacket << uint32(visualItem.DisplayId); - _worldPacket << uint32(visualItem.DisplayEnchantId); - _worldPacket << uint8(visualItem.InventoryType); - } + _worldPacket << charInfo; - _worldPacket << uint32(charInfo.LastPlayedTime); - _worldPacket << uint16(charInfo.SpecID); - _worldPacket << uint32(charInfo.Unknown703); - _worldPacket << uint32(charInfo.Flags4); - _worldPacket.WriteBits(charInfo.Name.length(), 6); - _worldPacket.WriteBit(charInfo.FirstLogin); - _worldPacket.WriteBit(charInfo.BoostInProgress); - _worldPacket.WriteBits(charInfo.unkWod61x, 5); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(charInfo.Name); - } + for (RaceUnlock const& raceUnlock : RaceUnlockData) + _worldPacket << raceUnlock; return &_worldPacket; } @@ -469,9 +491,7 @@ WorldPacket const* WorldPackets::Character::LogXPGain::Write() _worldPacket << uint8(Reason); _worldPacket << int32(Amount); _worldPacket << float(GroupBonus); - _worldPacket.WriteBit(ReferAFriend); - - _worldPacket.FlushBits(); + _worldPacket << uint8(ReferAFriendBonusType); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index ed325e4e896..1f4ce11621a 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -146,6 +146,7 @@ namespace WorldPackets uint32 LastPlayedTime = 0; uint16 SpecID = 0; uint32 Unknown703 = 0; + uint32 LastLoginBuild = 0; struct PetInfo { @@ -167,13 +168,12 @@ namespace WorldPackets std::array<VisualItemInfo, 23> VisualItems = { }; }; - struct RestrictedFactionChangeRuleInfo + struct RaceUnlock { - RestrictedFactionChangeRuleInfo(int32 mask, uint8 race) - : Mask(mask), Race(race) { } - - int32 Mask = 0; - uint8 Race = 0; + int32 RaceID; + bool HasExpansion; + bool HasAchievement; + bool HasHeritageArmor; }; EnumCharactersResult() : ServerPacket(SMSG_ENUM_CHARACTERS_RESULT) { } @@ -184,13 +184,14 @@ namespace WorldPackets bool IsDeletedCharacters = false; ///< used for character undelete list bool IsDemonHunterCreationAllowed = false; ///< used for demon hunter early access bool HasDemonHunterOnRealm = false; - bool HasLevel70OnRealm = false; bool Unknown7x = false; + bool IsAlliedRacesCreationAllowed = false; + int32 MaxCharacterLevel = 1; Optional<uint32> DisabledClassesMask; std::vector<CharacterInfo> Characters; ///< all characters on the list - std::vector<RestrictedFactionChangeRuleInfo> FactionChangeRestrictions; ///< @todo: research + std::vector<RaceUnlock> RaceUnlockData; ///< }; class CreateCharacter final : public ClientPacket @@ -631,7 +632,7 @@ namespace WorldPackets uint8 Reason = 0; int32 Amount = 0; float GroupBonus = 0; - bool ReferAFriend = false; + uint8 ReferAFriendBonusType = 0; // 1 - 300% of normal XP; 2 - 150% of normal XP }; class TitleEarned final : public ServerPacket diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index 6afac0117c9..ff378e680e0 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -166,7 +166,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastLogData ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SandboxScalingData const& sandboxScalingData) { - data.WriteBits(sandboxScalingData.Type, 3); + data.WriteBits(sandboxScalingData.Type, 4); data << int16(sandboxScalingData.PlayerLevelDelta); data << uint16(sandboxScalingData.PlayerItemLevel); data << uint8(sandboxScalingData.TargetLevel); diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 5f5ecdea9fa..367021001c2 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -511,7 +511,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Guild::GuildRewardItem co data << rewardItem.ItemID; data << rewardItem.Unk4; data << uint32(rewardItem.AchievementsRequired.size()); - data << rewardItem.RaceMask; + data << uint64(rewardItem.RaceMask); data << rewardItem.MinGuildLevel; data << rewardItem.MinGuildRep; data << rewardItem.Cost; diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 06e07665afe..f781e81b868 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -673,7 +673,7 @@ namespace WorldPackets uint32 ItemID = 0; uint32 Unk4 = 0; std::vector<uint32> AchievementsRequired; - uint32 RaceMask = 0; + uint64 RaceMask = 0; int32 MinGuildLevel = 0; int32 MinGuildRep = 0; uint64 Cost = 0; diff --git a/src/server/game/Server/Packets/InstancePackets.cpp b/src/server/game/Server/Packets/InstancePackets.cpp index 6851bcea921..0a6e29e6838 100644 --- a/src/server/game/Server/Packets/InstancePackets.cpp +++ b/src/server/game/Server/Packets/InstancePackets.cpp @@ -146,6 +146,8 @@ WorldPacket const* WorldPackets::Instance::InstanceEncounterStart::Write() _worldPacket << uint32(MaxInCombatResCount); _worldPacket << uint32(CombatResChargeRecovery); _worldPacket << uint32(NextCombatResChargeTime); + _worldPacket.WriteBit(InProgress); + _worldPacket.FlushBits(); return &_worldPacket; } diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index c01262cfa1f..f13e046906e 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -207,6 +207,7 @@ namespace WorldPackets uint32 MaxInCombatResCount = 0; uint32 CombatResChargeRecovery = 0; uint32 NextCombatResChargeTime = 0; + bool InProgress = true; }; class InstanceEncounterEnd final : public ServerPacket diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h index d1558755fc2..e985f1366de 100644 --- a/src/server/game/Server/Packets/ItemPackets.h +++ b/src/server/game/Server/Packets/ItemPackets.h @@ -533,6 +533,14 @@ namespace WorldPackets ObjectGuid ItemGuid; }; + + class CharacterInventoryOverflowWarning final : public ServerPacket + { + public: + CharacterInventoryOverflowWarning() : ServerPacket(SMSG_CHARACTER_INVENTORY_OVERFLOW_WARNING, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; } } diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index 28e72b7e6cd..2b7f9ab7d18 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -50,6 +50,7 @@ WorldPacket const* WorldPackets::NPC::GossipMessage::Write() _worldPacket << int32(text.QuestID); _worldPacket << int32(text.QuestType); _worldPacket << int32(text.QuestLevel); + _worldPacket << int32(text.QuestMaxScalingLevel); _worldPacket << int32(text.QuestFlags[0]); _worldPacket << int32(text.QuestFlags[1]); diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index a522084ab26..a094f25dc22 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -60,6 +60,7 @@ namespace WorldPackets int32 QuestID = 0; int32 QuestType = 0; int32 QuestLevel = 0; + int32 QuestMaxScalingLevel = 0; bool Repeatable = false; std::string QuestTitle; int32 QuestFlags[2] = { }; diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 0f4b9daf6b5..c640394be93 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -370,6 +370,9 @@ WorldPacket const* WorldPackets::Query::QuestPOIQueryResponse::Write() _worldPacket << int32(questPOIBlobPoint.X); _worldPacket << int32(questPOIBlobPoint.Y); } + + _worldPacket.WriteBit(questPOIBlobData.AlwaysAllowMergingBlobs); + _worldPacket.FlushBits(); } } diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index c98c7809be5..7639f165dae 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -321,6 +321,7 @@ namespace WorldPackets int32 PlayerConditionID = 0; int32 UnkWoD1 = 0; std::vector<QuestPOIBlobPoint> QuestPOIBlobPointStats; + bool AlwaysAllowMergingBlobs = false; }; struct QuestPOIData diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 3b07f68943e..20a6539ae1d 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -65,6 +65,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << int32(Info.QuestID); _worldPacket << int32(Info.QuestType); _worldPacket << int32(Info.QuestLevel); + _worldPacket << int32(Info.QuestMaxScalingLevel); _worldPacket << int32(Info.QuestPackageID); _worldPacket << int32(Info.QuestMinLevel); _worldPacket << int32(Info.QuestSortID); @@ -139,7 +140,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << int32(Info.TimeAllowed); _worldPacket << uint32(Info.Objectives.size()); - _worldPacket << int32(Info.AllowableRaces); + _worldPacket << uint64(Info.AllowableRaces); _worldPacket << int32(Info.QuestRewardID); _worldPacket << int32(Info.Expansion); @@ -489,6 +490,7 @@ WorldPacket const* WorldPackets::Quest::QuestGiverQuestListMessage::Write() _worldPacket << uint32(gossip.QuestID); _worldPacket << uint32(gossip.QuestType); _worldPacket << int32(gossip.QuestLevel); + _worldPacket << int32(gossip.QuestMaxScalingLevel); _worldPacket << uint32(gossip.QuestFlags); _worldPacket << uint32(gossip.QuestFlagsEx); _worldPacket.WriteBit(gossip.Repeatable); @@ -664,8 +666,10 @@ WorldPacket const* WorldPackets::Quest::DisplayPlayerChoice::Write() _worldPacket << int32(ChoiceID); _worldPacket << uint32(Responses.size()); _worldPacket << SenderGUID; + _worldPacket << int32(UiTextureKitID); _worldPacket.WriteBits(Question.length(), 8); _worldPacket.WriteBit(CloseChoiceFrame); + _worldPacket.WriteBit(HideWarboardHeader); _worldPacket.FlushBits(); for (PlayerChoiceResponse const& response : Responses) diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index 88f72c99271..1dd40e1ccc2 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -109,6 +109,7 @@ namespace WorldPackets int32 QuestID = 0; int32 QuestType = 0; // Accepted values: 0, 1 or 2. 0 == IsAutoComplete() (skip objectives/details) int32 QuestLevel = 0; // may be -1, static data, in other cases must be used dynamic level: Player::GetQuestLevel (0 is not known, but assuming this is no longer valid for quest intended for client) + int32 QuestMaxScalingLevel = 255; int32 QuestPackageID = 0; int32 QuestMinLevel = 0; int32 QuestSortID = 0; // zone or sort to display in quest log @@ -135,7 +136,7 @@ namespace WorldPackets float POIx = 0.0f; float POIy = 0.0f; int32 POIPriority = 0; - int32 AllowableRaces = -1; + uint64 AllowableRaces = UI64LIT(0xFFFFFFFFFFFFFFFF); std::string LogTitle; std::string LogDescription; std::string QuestDescription; @@ -462,11 +463,13 @@ namespace WorldPackets struct GossipText { - GossipText(uint32 questID, uint32 questType, int32 questLevel, uint32 questFlags, uint32 questFlagsEx, bool repeatable, std::string questTitle) : - QuestID(questID), QuestType(questType), QuestLevel(questLevel), QuestFlags(questFlags), QuestFlagsEx(questFlagsEx), Repeatable(repeatable), QuestTitle(questTitle) { } + GossipText(uint32 questID, uint32 questType, int32 questLevel, int32 questMaxScalingLevel, uint32 questFlags, uint32 questFlagsEx, bool repeatable, std::string questTitle) : + QuestID(questID), QuestType(questType), QuestLevel(questLevel), QuestMaxScalingLevel(questMaxScalingLevel), QuestFlags(questFlags), + QuestFlagsEx(questFlagsEx), Repeatable(repeatable), QuestTitle(std::move(questTitle)) { } uint32 QuestID; uint32 QuestType; int32 QuestLevel; + int32 QuestMaxScalingLevel; uint32 QuestFlags; uint32 QuestFlagsEx; bool Repeatable; @@ -676,9 +679,11 @@ namespace WorldPackets ObjectGuid SenderGUID; int32 ChoiceID = 0; + int32 UiTextureKitID = 0; std::string Question; std::vector<PlayerChoiceResponse> Responses; bool CloseChoiceFrame = false; + bool HideWarboardHeader = false; }; class ChoiceResponse final : public ClientPacket diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index 931376f48ac..cafb723c062 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -163,6 +163,8 @@ ByteBuffer& operator>>(ByteBuffer& data, Optional<WorldPackets::Ticket::SupportT data >> lfgListSearchResult->LastTitleAuthorGuid; data >> lfgListSearchResult->LastDescriptionAuthorGuid; data >> lfgListSearchResult->LastVoiceChatAuthorGuid; + data >> lfgListSearchResult->ListingCreatorGuid; + data >> lfgListSearchResult->Unknown735; uint32 titleLength = data.ReadBits(8); uint32 descriptionLength = data.ReadBits(11); diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h index b94386a2ed6..6e25f3da4a9 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -165,6 +165,8 @@ namespace WorldPackets ObjectGuid LastTitleAuthorGuid; ObjectGuid LastDescriptionAuthorGuid; ObjectGuid LastVoiceChatAuthorGuid; + ObjectGuid ListingCreatorGuid; + ObjectGuid Unknown735; std::string Title; std::string Description; std::string VoiceChat; diff --git a/src/server/game/Server/Packets/WhoPackets.h b/src/server/game/Server/Packets/WhoPackets.h index 7dc9c33dab5..b84cf096345 100644 --- a/src/server/game/Server/Packets/WhoPackets.h +++ b/src/server/game/Server/Packets/WhoPackets.h @@ -66,7 +66,7 @@ namespace WorldPackets std::string VirtualRealmName; std::string Guild; std::string GuildVirtualRealmName; - int32 RaceFilter = -1; + uint64 RaceFilter = UI64LIT(0); int32 ClassFilter = -1; std::vector<WhoWord> Words; bool ShowEnemies = false; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 301be77e6c3..28bd8c80701 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -220,6 +220,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PET_SET_BATTLE_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetSetBattleSlot); DEFINE_HANDLER(CMSG_BATTLE_PET_SET_FLAGS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlePetSetFlags); DEFINE_HANDLER(CMSG_BATTLE_PET_SUMMON, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleBattlePetSummon); + DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBeginTradeOpcode); //DEFINE_HANDLER(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleBfEntryInviteResponse); @@ -953,6 +954,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_PURCHASE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_SUBSCRIPTION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_BNET_TRANSFER_VALIDATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_CHARACTER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1039,6 +1041,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_LEFT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_CLASS_TRIAL_CREATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_INVENTORY_OVERFLOW_WARNING, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_ITEM_FIXUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_OBJECT_TEST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1358,7 +1361,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1478,6 +1480,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_OFFER_PETITION_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_MONSTER_MOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_ALLIED_RACE_DETAILS_GIVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_CONTAINER, 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); @@ -1609,6 +1612,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_LOOKUP_INFORMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1779,9 +1783,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACTION_BUTTONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CELESTIAL_BODY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CHARACTER_FLAGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_EXPANSION_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_GAME_TIME_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 9dac3a3ecac..49ca92b7004 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -51,24 +51,24 @@ enum OpcodeClient : uint16 CMSG_ACCEPT_WARGAME_INVITE = 0x35E0, CMSG_ACTIVATE_TAXI = 0x34AE, CMSG_ADDON_LIST = 0x35D8, - CMSG_ADD_BATTLENET_FRIEND = 0x365C, - CMSG_ADD_FRIEND = 0x36D1, - CMSG_ADD_IGNORE = 0x36D5, - CMSG_ADD_TOY = 0x3287, - CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x31F7, - CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x332B, + CMSG_ADD_BATTLENET_FRIEND = 0x365A, + CMSG_ADD_FRIEND = 0x36CF, + CMSG_ADD_IGNORE = 0x36D3, + CMSG_ADD_TOY = 0x328B, + CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x31F9, + CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x332E, CMSG_ALTER_APPEARANCE = 0x34F9, CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34B3, CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34B4, - CMSG_AREA_TRIGGER = 0x31CC, + CMSG_AREA_TRIGGER = 0x31CD, CMSG_ARTIFACT_ADD_POWER = 0x31A5, CMSG_ARTIFACT_ADD_RELIC_TALENT = 0x31A8, CMSG_ARTIFACT_ATTUNE_PREVIEW_RELIC = 0x31A9, CMSG_ARTIFACT_ATTUNE_SOCKETED_RELIC = 0x31AA, CMSG_ARTIFACT_SET_APPEARANCE = 0x31A7, - CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x31FE, - CMSG_ATTACK_STOP = 0x3249, - CMSG_ATTACK_SWING = 0x3248, + CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x3200, + CMSG_ATTACK_STOP = 0x324D, + CMSG_ATTACK_SWING = 0x324C, CMSG_AUCTION_HELLO_REQUEST = 0x34CF, CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34D5, CMSG_AUCTION_LIST_ITEMS = 0x34D2, @@ -91,90 +91,91 @@ enum OpcodeClient : uint16 CMSG_BATTLEFIELD_LEAVE = 0x3171, CMSG_BATTLEFIELD_LIST = 0x317D, CMSG_BATTLEFIELD_PORT = 0x3529, - CMSG_BATTLEMASTER_HELLO = 0x329D, + CMSG_BATTLEMASTER_HELLO = 0x32A1, CMSG_BATTLEMASTER_JOIN = 0x3524, CMSG_BATTLEMASTER_JOIN_ARENA = 0x3525, CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3527, CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3526, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D4, - CMSG_BATTLENET_REQUEST = 0x36F8, - CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36F9, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CC, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CB, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C2, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36BC, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36BD, - CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C5, - CMSG_BATTLE_PAY_REQUEST_CHARACTER_BOOST_UNREVOKE = 0x36C3, - CMSG_BATTLE_PAY_REQUEST_CURRENT_VAS_TRANSFER_QUEUES = 0x370A, - CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x3709, - CMSG_BATTLE_PAY_REQUEST_VAS_CHARACTER_QUEUE_TIME = 0x370B, - CMSG_BATTLE_PAY_START_PURCHASE = 0x36F4, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F5, - CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C4, - CMSG_BATTLE_PAY_VALIDATE_BNET_VAS_TRANSFER = 0x370C, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D2, + CMSG_BATTLENET_REQUEST = 0x36F6, + CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36F7, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CA, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36C9, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C0, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36BA, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36BB, + CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C3, + CMSG_BATTLE_PAY_REQUEST_CHARACTER_BOOST_UNREVOKE = 0x36C1, + CMSG_BATTLE_PAY_REQUEST_CURRENT_VAS_TRANSFER_QUEUES = 0x3708, + CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x3707, + CMSG_BATTLE_PAY_REQUEST_VAS_CHARACTER_QUEUE_TIME = 0x3709, + CMSG_BATTLE_PAY_START_PURCHASE = 0x36F2, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F3, + CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C2, + CMSG_BATTLE_PAY_VALIDATE_BNET_VAS_TRANSFER = 0x370A, CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C, - CMSG_BATTLE_PET_DELETE_PET = 0x3626, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3627, - CMSG_BATTLE_PET_MODIFY_NAME = 0x3629, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3625, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3624, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362D, - CMSG_BATTLE_PET_SET_FLAGS = 0x3631, - CMSG_BATTLE_PET_SUMMON = 0x362A, - CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31D5, + CMSG_BATTLE_PET_DELETE_PET = 0x3624, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3625, + CMSG_BATTLE_PET_MODIFY_NAME = 0x3627, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3623, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3622, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362B, + CMSG_BATTLE_PET_SET_FLAGS = 0x362F, + CMSG_BATTLE_PET_SUMMON = 0x3628, + CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x31D7, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31D6, CMSG_BEGIN_TRADE = 0x3157, CMSG_BINDER_ACTIVATE = 0x34B5, CMSG_BLACK_MARKET_BID_ON_ITEM = 0x3531, CMSG_BLACK_MARKET_OPEN = 0x352F, CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x3530, - CMSG_BUG_REPORT = 0x3688, + CMSG_BUG_REPORT = 0x3686, CMSG_BUSY_TRADE = 0x3158, CMSG_BUY_BACK_ITEM = 0x34A7, CMSG_BUY_BANK_SLOT = 0x34B7, CMSG_BUY_ITEM = 0x34A6, CMSG_BUY_REAGENT_BANK = 0x34B8, - CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36ED, - CMSG_BUY_WOW_TOKEN_START = 0x36EC, - CMSG_CAGE_BATTLE_PET = 0x31E6, - CMSG_CALENDAR_ADD_EVENT = 0x367F, - CMSG_CALENDAR_COMPLAIN = 0x367B, - CMSG_CALENDAR_COPY_EVENT = 0x367A, - CMSG_CALENDAR_EVENT_INVITE = 0x3674, - CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x3678, - CMSG_CALENDAR_EVENT_RSVP = 0x3676, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x367D, - CMSG_CALENDAR_EVENT_STATUS = 0x3677, - CMSG_CALENDAR_GET = 0x3671, - CMSG_CALENDAR_GET_EVENT = 0x3672, - CMSG_CALENDAR_GET_NUM_PENDING = 0x367C, - CMSG_CALENDAR_GUILD_FILTER = 0x3673, - CMSG_CALENDAR_REMOVE_EVENT = 0x3679, - CMSG_CALENDAR_REMOVE_INVITE = 0x3675, - CMSG_CALENDAR_UPDATE_EVENT = 0x3680, + CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36EB, + CMSG_BUY_WOW_TOKEN_START = 0x36EA, + CMSG_CAGE_BATTLE_PET = 0x31E8, + CMSG_CALENDAR_ADD_EVENT = 0x367D, + CMSG_CALENDAR_COMPLAIN = 0x3679, + CMSG_CALENDAR_COPY_EVENT = 0x3678, + CMSG_CALENDAR_EVENT_INVITE = 0x3672, + CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x3676, + CMSG_CALENDAR_EVENT_RSVP = 0x3674, + CMSG_CALENDAR_EVENT_SIGN_UP = 0x367B, + CMSG_CALENDAR_EVENT_STATUS = 0x3675, + CMSG_CALENDAR_GET = 0x366F, + CMSG_CALENDAR_GET_EVENT = 0x3670, + CMSG_CALENDAR_GET_NUM_PENDING = 0x367A, + CMSG_CALENDAR_GUILD_FILTER = 0x3671, + CMSG_CALENDAR_REMOVE_EVENT = 0x3677, + CMSG_CALENDAR_REMOVE_INVITE = 0x3673, + CMSG_CALENDAR_UPDATE_EVENT = 0x367E, CMSG_CANCEL_AURA = 0x31AC, CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34EB, - CMSG_CANCEL_CAST = 0x328D, - CMSG_CANCEL_CHANNELLING = 0x3258, - CMSG_CANCEL_GROWTH_AURA = 0x325D, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3206, + CMSG_CANCEL_CAST = 0x3291, + CMSG_CANCEL_CHANNELLING = 0x325C, + CMSG_CANCEL_GROWTH_AURA = 0x3261, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3208, CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31AB, - CMSG_CANCEL_MOUNT_AURA = 0x326E, + CMSG_CANCEL_MOUNT_AURA = 0x3272, CMSG_CANCEL_QUEUED_SPELL = 0x317E, CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34F6, CMSG_CANCEL_TRADE = 0x315C, - CMSG_CAN_DUEL = 0x3664, - CMSG_CAN_REDEEM_WOW_TOKEN_FOR_BALANCE = 0x3708, - CMSG_CAST_SPELL = 0x328A, + CMSG_CAN_DUEL = 0x3662, + CMSG_CAN_REDEEM_WOW_TOKEN_FOR_BALANCE = 0x3706, + CMSG_CAST_SPELL = 0x328E, CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F, CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308E, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x330E, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32F0, - CMSG_CHANGE_SUB_GROUP = 0x364E, - CMSG_CHARACTER_RENAME_REQUEST = 0x36C0, - CMSG_CHAR_CUSTOMIZE = 0x3690, - CMSG_CHAR_DELETE = 0x369D, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3696, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x3312, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x32F4, + CMSG_CHANGE_SUB_GROUP = 0x364C, + CMSG_CHARACTER_RENAME_REQUEST = 0x36BE, + CMSG_CHAR_CUSTOMIZE = 0x368E, + CMSG_CHAR_DELETE = 0x369B, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3694, CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x37D0, CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x37D4, CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x37F3, @@ -219,14 +220,14 @@ enum OpcodeClient : uint16 CMSG_CHAT_REPORT_FILTERED = 0x37CC, CMSG_CHAT_REPORT_IGNORED = 0x37CB, CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x37CE, - CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36CD, - CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36EB, - CMSG_CHOICE_RESPONSE = 0x328F, + CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36CB, + CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36E9, + CMSG_CHOICE_RESPONSE = 0x3293, CMSG_CLEAR_RAID_MARKER = 0x31A1, CMSG_CLEAR_TRADE_ITEM = 0x315E, CMSG_CLIENT_PORT_GRAVEYARD = 0x352B, CMSG_CLOSE_INTERACTION = 0x3496, - CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x3634, + CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x3632, CMSG_COMMENTATOR_ENABLE = 0x35F0, CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F4, CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F5, @@ -234,87 +235,87 @@ enum OpcodeClient : uint16 CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x35F3, CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F2, CMSG_COMMENTATOR_START_WARGAME = 0x35EF, - CMSG_COMPLAINT = 0x366E, + CMSG_COMPLAINT = 0x366C, CMSG_COMPLETE_CINEMATIC = 0x3549, CMSG_COMPLETE_MOVIE = 0x34E1, CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31A6, - CMSG_CONFIRM_RESPEC_WIPE = 0x3200, + CMSG_CONFIRM_RESPEC_WIPE = 0x3202, CMSG_CONNECT_TO_FAILED = 0x35D4, CMSG_CONTRIBUTION_CONTRIBUTE = 0x3558, CMSG_CONTRIBUTION_GET_STATE = 0x3559, - CMSG_CONVERT_CONSUMPTION_TIME = 0x36FB, - CMSG_CONVERT_RAID = 0x3650, - CMSG_CREATE_CHARACTER = 0x3645, - CMSG_CREATE_SHIPMENT = 0x32DC, + CMSG_CONVERT_CONSUMPTION_TIME = 0x36F9, + CMSG_CONVERT_RAID = 0x364E, + CMSG_CREATE_CHARACTER = 0x3643, + CMSG_CREATE_SHIPMENT = 0x32E0, CMSG_DB_QUERY_BULK = 0x35E4, CMSG_DECLINE_GUILD_INVITES = 0x3522, CMSG_DECLINE_PETITION = 0x3538, CMSG_DELETE_EQUIPMENT_SET = 0x3510, - CMSG_DEL_FRIEND = 0x36D2, - CMSG_DEL_IGNORE = 0x36D6, - CMSG_DEPOSIT_REAGENT_BANK = 0x3317, - CMSG_DESTROY_ITEM = 0x3281, - CMSG_DF_BOOT_PLAYER_VOTE = 0x3617, - CMSG_DF_GET_JOIN_STATUS = 0x3615, - CMSG_DF_GET_SYSTEM_INFO = 0x3614, + CMSG_DEL_FRIEND = 0x36D0, + CMSG_DEL_IGNORE = 0x36D4, + CMSG_DEPOSIT_REAGENT_BANK = 0x331B, + CMSG_DESTROY_ITEM = 0x3285, + CMSG_DF_BOOT_PLAYER_VOTE = 0x3615, + CMSG_DF_GET_JOIN_STATUS = 0x3613, + CMSG_DF_GET_SYSTEM_INFO = 0x3612, CMSG_DF_JOIN = 0x3608, - CMSG_DF_LEAVE = 0x3613, + CMSG_DF_LEAVE = 0x3611, CMSG_DF_PROPOSAL_RESPONSE = 0x3607, - CMSG_DF_READY_CHECK_RESPONSE = 0x361A, - CMSG_DF_SET_ROLES = 0x3616, - CMSG_DF_TELEPORT = 0x3618, + CMSG_DF_READY_CHECK_RESPONSE = 0x3618, + CMSG_DF_SET_ROLES = 0x3614, + CMSG_DF_TELEPORT = 0x3616, CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A3C, CMSG_DISMISS_CRITTER = 0x34FF, - CMSG_DO_MASTER_LOOT_ROLL = 0x3205, - CMSG_DO_READY_CHECK = 0x3635, + CMSG_DO_MASTER_LOOT_ROLL = 0x3207, + CMSG_DO_READY_CHECK = 0x3633, CMSG_DUEL_RESPONSE = 0x34E6, - CMSG_EJECT_PASSENGER = 0x322E, + CMSG_EJECT_PASSENGER = 0x3230, CMSG_EMOTE = 0x3545, CMSG_ENABLE_ENCRYPTION_ACK = 0x3767, CMSG_ENABLE_NAGLE = 0x376B, CMSG_ENABLE_TAXI_NODE = 0x34AC, - CMSG_ENGINE_SURVEY = 0x36E5, + CMSG_ENGINE_SURVEY = 0x36E3, CMSG_ENUM_CHARACTERS = 0x35E8, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36DF, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36DD, CMSG_FAR_SIGHT = 0x34EC, CMSG_GAME_OBJ_REPORT_USE = 0x34F3, CMSG_GAME_OBJ_USE = 0x34F2, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32C7, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32B8, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x330A, - CMSG_GARRISON_COMPLETE_MISSION = 0x32FD, - CMSG_GARRISON_GENERATE_RECRUITS = 0x32CA, - CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32D8, - CMSG_GARRISON_GET_MISSION_REWARD = 0x3331, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x32FF, - CMSG_GARRISON_PURCHASE_BUILDING = 0x32B4, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32CC, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x32F4, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32C8, - CMSG_GARRISON_RENAME_FOLLOWER = 0x32C9, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32B3, - CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32D1, - CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32DB, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32DA, - CMSG_GARRISON_RESEARCH_TALENT = 0x32CD, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32B5, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32C5, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32C1, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32CB, - CMSG_GARRISON_START_MISSION = 0x32FC, - CMSG_GARRISON_SWAP_BUILDINGS = 0x32B9, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32CB, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32BC, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x330E, + CMSG_GARRISON_COMPLETE_MISSION = 0x3301, + CMSG_GARRISON_GENERATE_RECRUITS = 0x32CE, + CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32DC, + CMSG_GARRISON_GET_MISSION_REWARD = 0x3334, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3303, + CMSG_GARRISON_PURCHASE_BUILDING = 0x32B8, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32D0, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x32F8, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32CC, + CMSG_GARRISON_RENAME_FOLLOWER = 0x32CD, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32B7, + CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32D5, + CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32DF, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32DE, + CMSG_GARRISON_RESEARCH_TALENT = 0x32D1, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32B9, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32C9, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32C5, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32CF, + CMSG_GARRISON_START_MISSION = 0x3300, + CMSG_GARRISON_SWAP_BUILDINGS = 0x32BD, CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E7, - CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3685, - CMSG_GET_GARRISON_INFO = 0x32AE, + CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3683, + CMSG_GET_GARRISON_INFO = 0x32B2, CMSG_GET_ITEM_PURCHASE_DATA = 0x3533, - CMSG_GET_MIRROR_IMAGE_DATA = 0x3285, + CMSG_GET_MIRROR_IMAGE_DATA = 0x3289, CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EE, - CMSG_GET_REMAINING_GAME_TIME = 0x36EE, - CMSG_GET_TROPHY_LIST = 0x32ED, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E1, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3694, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x3693, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3692, + CMSG_GET_REMAINING_GAME_TIME = 0x36EC, + CMSG_GET_TROPHY_LIST = 0x32F1, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36DF, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3692, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x3691, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3690, CMSG_GOSSIP_SELECT_OPTION = 0x3497, CMSG_GRANT_LEVEL = 0x34FB, CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308D, @@ -356,7 +357,7 @@ enum OpcodeClient : uint16 CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3088, CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x306F, CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3070, - CMSG_GUILD_SET_GUILD_MASTER = 0x36C7, + CMSG_GUILD_SET_GUILD_MASTER = 0x36C5, CMSG_GUILD_SET_MEMBER_NOTE = 0x3072, CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3067, CMSG_GUILD_SHIFT_RANK = 0x3066, @@ -368,67 +369,67 @@ enum OpcodeClient : uint16 CMSG_INITIATE_ROLE_POLL = 0x35DA, CMSG_INITIATE_TRADE = 0x3156, CMSG_INSPECT = 0x352D, - CMSG_INSPECT_PVP = 0x36A3, + CMSG_INSPECT_PVP = 0x36A1, CMSG_INSTANCE_LOCK_RESPONSE = 0x3511, CMSG_ITEM_PURCHASE_REFUND = 0x3534, - CMSG_ITEM_TEXT_QUERY = 0x330B, - CMSG_JOIN_PET_BATTLE_QUEUE = 0x31D3, + CMSG_ITEM_TEXT_QUERY = 0x330F, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x31D4, CMSG_JOIN_RATED_BATTLEGROUND = 0x3176, - CMSG_KEEP_ALIVE = 0x3681, - CMSG_KEYBOUND_OVERRIDE = 0x3217, + CMSG_KEEP_ALIVE = 0x367F, + CMSG_KEYBOUND_OVERRIDE = 0x3219, CMSG_LEARN_PVP_TALENTS = 0x3557, CMSG_LEARN_TALENTS = 0x3556, - CMSG_LEAVE_GROUP = 0x364B, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31D4, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360E, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360F, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x3610, - CMSG_LFG_LIST_GET_STATUS = 0x360C, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x3611, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x3612, - CMSG_LFG_LIST_JOIN = 0x3609, - CMSG_LFG_LIST_LEAVE = 0x360B, - CMSG_LFG_LIST_SEARCH = 0x360D, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x360A, - CMSG_LF_GUILD_ADD_RECRUIT = 0x361D, - CMSG_LF_GUILD_BROWSE = 0x361F, + CMSG_LEAVE_GROUP = 0x3649, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31D5, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360C, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360D, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360E, + CMSG_LFG_LIST_GET_STATUS = 0x360A, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x360F, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x3610, + CMSG_LFG_LIST_JOIN = 0x3345, + CMSG_LFG_LIST_LEAVE = 0x3609, + CMSG_LFG_LIST_SEARCH = 0x360B, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x3346, + CMSG_LF_GUILD_ADD_RECRUIT = 0x361B, + CMSG_LF_GUILD_BROWSE = 0x361D, CMSG_LF_GUILD_DECLINE_RECRUIT = 0x3078, CMSG_LF_GUILD_GET_APPLICATIONS = 0x3079, CMSG_LF_GUILD_GET_GUILD_POST = 0x3076, CMSG_LF_GUILD_GET_RECRUITS = 0x3077, CMSG_LF_GUILD_REMOVE_RECRUIT = 0x307A, - CMSG_LF_GUILD_SET_GUILD_POST = 0x361E, + CMSG_LF_GUILD_SET_GUILD_POST = 0x361C, CMSG_LIST_INVENTORY = 0x34A4, - CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36BB, - CMSG_LIVE_REGION_CHARACTER_COPY = 0x36BA, - CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B9, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36B9, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x36B8, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B7, CMSG_LOADING_SCREEN_NOTIFY = 0x35F8, - CMSG_LOAD_SELECTED_TROPHY = 0x32EE, + CMSG_LOAD_SELECTED_TROPHY = 0x32F2, CMSG_LOGOUT_CANCEL = 0x34DC, CMSG_LOGOUT_INSTANT = 0x34DD, CMSG_LOGOUT_REQUEST = 0x34DB, CMSG_LOG_DISCONNECT = 0x3769, CMSG_LOG_STREAMING_ERROR = 0x376D, - CMSG_LOOT_ITEM = 0x3203, - CMSG_LOOT_MONEY = 0x3202, - CMSG_LOOT_RELEASE = 0x3207, - CMSG_LOOT_ROLL = 0x3208, - CMSG_LOOT_UNIT = 0x3201, - CMSG_LOW_LEVEL_RAID1 = 0x36A1, + CMSG_LOOT_ITEM = 0x3205, + CMSG_LOOT_MONEY = 0x3204, + CMSG_LOOT_RELEASE = 0x3209, + CMSG_LOOT_ROLL = 0x320A, + CMSG_LOOT_UNIT = 0x3203, + CMSG_LOW_LEVEL_RAID1 = 0x369F, CMSG_LOW_LEVEL_RAID2 = 0x3518, CMSG_MAIL_CREATE_TEXT_ITEM = 0x353F, - CMSG_MAIL_DELETE = 0x3219, + CMSG_MAIL_DELETE = 0x321B, CMSG_MAIL_GET_LIST = 0x353A, CMSG_MAIL_MARK_AS_READ = 0x353E, - CMSG_MAIL_RETURN_TO_SENDER = 0x3657, + CMSG_MAIL_RETURN_TO_SENDER = 0x3655, CMSG_MAIL_TAKE_ITEM = 0x353C, CMSG_MAIL_TAKE_MONEY = 0x353B, - CMSG_MASTER_LOOT_ITEM = 0x3204, - CMSG_MINIMAP_PING = 0x364D, + CMSG_MASTER_LOOT_ITEM = 0x3206, + CMSG_MINIMAP_PING = 0x364B, CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3189, CMSG_MOUNT_CLEAR_FANFARE = 0x312D, - CMSG_MOUNT_SET_FAVORITE = 0x3633, - CMSG_MOUNT_SPECIAL_ANIM = 0x326F, + CMSG_MOUNT_SET_FAVORITE = 0x3631, + CMSG_MOUNT_SPECIAL_ANIM = 0x3273, CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A12, CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2C, CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A31, @@ -490,39 +491,39 @@ enum OpcodeClient : uint16 CMSG_MOVE_TIME_SKIPPED = 0x3A18, CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x3A05, CMSG_MOVE_WATER_WALK_ACK = 0x3A1A, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31C9, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31CA, CMSG_NEXT_CINEMATIC_CAMERA = 0x3548, CMSG_OBJECT_UPDATE_FAILED = 0x317F, CMSG_OBJECT_UPDATE_RESCUED = 0x3180, - CMSG_OFFER_PETITION = 0x36B1, + CMSG_OFFER_PETITION = 0x36AF, CMSG_OPENING_CINEMATIC = 0x3547, - CMSG_OPEN_ITEM = 0x330C, - CMSG_OPEN_MISSION_NPC = 0x32D3, - CMSG_OPEN_SHIPMENT_NPC = 0x32D9, - CMSG_OPEN_TRADESKILL_NPC = 0x32E4, + CMSG_OPEN_ITEM = 0x3310, + CMSG_OPEN_MISSION_NPC = 0x32D7, + CMSG_OPEN_SHIPMENT_NPC = 0x32DD, + CMSG_OPEN_TRADESKILL_NPC = 0x32E8, CMSG_OPT_OUT_OF_LOOT = 0x34FA, CMSG_PARTY_INVITE = 0x3602, CMSG_PARTY_INVITE_RESPONSE = 0x3603, - CMSG_PARTY_UNINVITE = 0x3649, + CMSG_PARTY_UNINVITE = 0x3647, CMSG_PETITION_BUY = 0x34CD, - CMSG_PETITION_RENAME_GUILD = 0x36C8, + CMSG_PETITION_RENAME_GUILD = 0x36C6, CMSG_PETITION_SHOW_LIST = 0x34CC, CMSG_PETITION_SHOW_SIGNATURES = 0x34CE, CMSG_PET_ABANDON = 0x3490, CMSG_PET_ACTION = 0x348E, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31D7, - CMSG_PET_BATTLE_INPUT = 0x3642, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3218, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31D6, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3643, - CMSG_PET_BATTLE_REQUEST_PVP = 0x31D1, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31D2, - CMSG_PET_BATTLE_REQUEST_WILD = 0x31CF, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31D8, - CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31D0, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31D9, + CMSG_PET_BATTLE_INPUT = 0x3640, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x321A, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31D8, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3641, + CMSG_PET_BATTLE_REQUEST_PVP = 0x31D2, + CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31D3, + CMSG_PET_BATTLE_REQUEST_WILD = 0x31D0, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31DA, + CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31D1, CMSG_PET_CANCEL_AURA = 0x3491, - CMSG_PET_CAST_SPELL = 0x3289, - CMSG_PET_RENAME = 0x3687, + CMSG_PET_CAST_SPELL = 0x328D, + CMSG_PET_RENAME = 0x3685, CMSG_PET_SET_ACTION = 0x348D, CMSG_PET_SPELL_AUTOCAST = 0x3492, CMSG_PET_STOP_ATTACK = 0x348F, @@ -531,27 +532,27 @@ enum OpcodeClient : uint16 CMSG_PROTOCOL_MISMATCH = 0x376E, CMSG_PUSH_QUEST_TO_PARTY = 0x34A2, CMSG_PVP_LOG_DATA = 0x317A, - CMSG_PVP_PRESTIGE_RANK_UP = 0x332F, - CMSG_QUERY_BATTLE_PET_NAME = 0x3264, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3662, - CMSG_QUERY_CORPSE_TRANSPORT = 0x3663, + CMSG_PVP_PRESTIGE_RANK_UP = 0x3332, + CMSG_QUERY_BATTLE_PET_NAME = 0x3268, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3660, + CMSG_QUERY_CORPSE_TRANSPORT = 0x3661, CMSG_QUERY_COUNTDOWN_TIMER = 0x31A4, - CMSG_QUERY_CREATURE = 0x325E, - CMSG_QUERY_GAME_OBJECT = 0x325F, - CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3265, - CMSG_QUERY_GUILD_INFO = 0x368F, + CMSG_QUERY_CREATURE = 0x3262, + CMSG_QUERY_GAME_OBJECT = 0x3263, + CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3269, + CMSG_QUERY_GUILD_INFO = 0x368D, CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x3506, CMSG_QUERY_NEXT_MAIL_TIME = 0x353D, - CMSG_QUERY_NPC_TEXT = 0x3260, - CMSG_QUERY_PAGE_TEXT = 0x3262, - CMSG_QUERY_PETITION = 0x3266, - CMSG_QUERY_PET_NAME = 0x3263, - CMSG_QUERY_PLAYER_NAME = 0x368D, + CMSG_QUERY_NPC_TEXT = 0x3264, + CMSG_QUERY_PAGE_TEXT = 0x3266, + CMSG_QUERY_PETITION = 0x326A, + CMSG_QUERY_PET_NAME = 0x3267, + CMSG_QUERY_PLAYER_NAME = 0x368B, CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3173, - CMSG_QUERY_QUEST_INFO = 0x3261, - CMSG_QUERY_QUEST_REWARDS = 0x3333, - CMSG_QUERY_REALM_NAME = 0x368E, - CMSG_QUERY_SCENARIO_POI = 0x3658, + CMSG_QUERY_QUEST_INFO = 0x3265, + CMSG_QUERY_QUEST_REWARDS = 0x3336, + CMSG_QUERY_REALM_NAME = 0x368C, + CMSG_QUERY_SCENARIO_POI = 0x3656, CMSG_QUERY_TIME = 0x34DA, CMSG_QUERY_VOID_STORAGE = 0x319D, CMSG_QUEST_CONFIRM_ACCEPT = 0x34A1, @@ -564,126 +565,126 @@ enum OpcodeClient : uint16 CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x34A0, CMSG_QUEST_GIVER_STATUS_QUERY = 0x349F, CMSG_QUEST_LOG_REMOVE_QUEST = 0x3532, - CMSG_QUEST_POI_QUERY = 0x36B2, + CMSG_QUEST_POI_QUERY = 0x36B0, CMSG_QUEST_PUSH_RESULT = 0x34A3, CMSG_QUEUED_MESSAGES_END = 0x376C, - CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3707, - CMSG_QUICK_JOIN_REQUEST_INVITE = 0x3706, - CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x3705, - CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x3704, - CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36E6, - CMSG_RANDOM_ROLL = 0x3656, - CMSG_READY_CHECK_RESPONSE = 0x3636, - CMSG_READ_ITEM = 0x330D, + CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3705, + CMSG_QUICK_JOIN_REQUEST_INVITE = 0x3704, + CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x3703, + CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x3702, + CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36E4, + CMSG_RANDOM_ROLL = 0x3654, + CMSG_READY_CHECK_RESPONSE = 0x3634, + CMSG_READ_ITEM = 0x3311, CMSG_RECLAIM_CORPSE = 0x34DF, - CMSG_RECRUIT_A_FRIEND = 0x36CE, - CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F0, - CMSG_REDEEM_WOW_TOKEN_START = 0x36EF, - CMSG_REMOVE_NEW_ITEM = 0x3336, + CMSG_RECRUIT_A_FRIEND = 0x36CC, + CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36EE, + CMSG_REDEEM_WOW_TOKEN_START = 0x36ED, + CMSG_REMOVE_NEW_ITEM = 0x3339, CMSG_REORDER_CHARACTERS = 0x35E9, CMSG_REPAIR_ITEM = 0x34F0, - CMSG_REPLACE_TROPHY = 0x32EF, + CMSG_REPLACE_TROPHY = 0x32F3, CMSG_REPOP_REQUEST = 0x352A, - CMSG_REPORT_CLIENT_VARIABLES = 0x3701, - CMSG_REPORT_ENABLED_ADDONS = 0x3700, - CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x3702, + CMSG_REPORT_CLIENT_VARIABLES = 0x36FF, + CMSG_REPORT_ENABLED_ADDONS = 0x36FE, + CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x3700, CMSG_REPORT_PVP_PLAYER_AFK = 0x34F8, - CMSG_REQUEST_ACCOUNT_DATA = 0x3697, - CMSG_REQUEST_AREA_POI_UPDATE = 0x3335, + CMSG_REQUEST_ACCOUNT_DATA = 0x3695, + CMSG_REQUEST_AREA_POI_UPDATE = 0x3338, CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DC, CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317C, CMSG_REQUEST_CEMETERY_LIST = 0x3174, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32A0, - CMSG_REQUEST_CONSUMPTION_CONVERSION_INFO = 0x36FA, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32A4, + CMSG_REQUEST_CONSUMPTION_CONVERSION_INFO = 0x36F8, CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x352E, - CMSG_REQUEST_FORCED_REACTIONS = 0x31FC, + CMSG_REQUEST_FORCED_REACTIONS = 0x31FE, CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A3, CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A2, CMSG_REQUEST_HONOR_STATS = 0x3179, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x3291, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x3295, CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F7, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3655, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3653, CMSG_REQUEST_PET_INFO = 0x3493, - CMSG_REQUEST_PLAYED_TIME = 0x3269, + CMSG_REQUEST_PLAYED_TIME = 0x326D, CMSG_REQUEST_PVP_BRAWL_INFO = 0x3191, CMSG_REQUEST_PVP_REWARDS = 0x3190, - CMSG_REQUEST_RAID_INFO = 0x36C9, + CMSG_REQUEST_RAID_INFO = 0x36C7, CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E3, CMSG_REQUEST_RESEARCH_HISTORY = 0x3167, CMSG_REQUEST_STABLED_PETS = 0x3494, - CMSG_REQUEST_VEHICLE_EXIT = 0x3229, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x322B, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x322A, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x322C, - CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3334, - CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36E8, - CMSG_RESET_CHALLENGE_MODE = 0x31F9, - CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x31FA, - CMSG_RESET_INSTANCES = 0x366A, - CMSG_RESURRECT_RESPONSE = 0x3686, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x32F1, - CMSG_RIDE_VEHICLE_INTERACT = 0x322D, + CMSG_REQUEST_VEHICLE_EXIT = 0x322B, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x322D, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x322C, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x322E, + CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3337, + CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36E6, + CMSG_RESET_CHALLENGE_MODE = 0x31FB, + CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x31FC, + CMSG_RESET_INSTANCES = 0x3668, + CMSG_RESURRECT_RESPONSE = 0x3684, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x32F5, + CMSG_RIDE_VEHICLE_INTERACT = 0x322F, CMSG_SAVE_CUF_PROFILES = 0x318A, CMSG_SAVE_EQUIPMENT_SET = 0x350F, - CMSG_SAVE_GUILD_EMBLEM = 0x3295, - CMSG_SCENE_PLAYBACK_CANCELED = 0x3214, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x3213, - CMSG_SCENE_TRIGGER_EVENT = 0x3215, + CMSG_SAVE_GUILD_EMBLEM = 0x3299, + CMSG_SCENE_PLAYBACK_CANCELED = 0x3216, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x3215, + CMSG_SCENE_TRIGGER_EVENT = 0x3217, CMSG_SELF_RES = 0x3535, CMSG_SELL_ITEM = 0x34A5, - CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36EA, - CMSG_SELL_WOW_TOKEN_START = 0x36E9, - CMSG_SEND_CONTACT_LIST = 0x36D0, + CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36E8, + CMSG_SELL_WOW_TOKEN_START = 0x36E7, + CMSG_SEND_CONTACT_LIST = 0x36CE, CMSG_SEND_MAIL = 0x35FA, - CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3622, + CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3620, CMSG_SEND_TEXT_EMOTE = 0x348A, - CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x321A, + CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x321C, CMSG_SET_ACTION_BAR_TOGGLES = 0x3536, - CMSG_SET_ACTION_BUTTON = 0x3637, + CMSG_SET_ACTION_BUTTON = 0x3635, CMSG_SET_ACTIVE_MOVER = 0x3A37, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32A1, - CMSG_SET_ASSISTANT_LEADER = 0x3651, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3310, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3311, - CMSG_SET_BANK_BAG_SLOT_FLAG = 0x330F, - CMSG_SET_CONTACT_NOTES = 0x36D3, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32A5, + CMSG_SET_ASSISTANT_LEADER = 0x364F, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3314, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3315, + CMSG_SET_BANK_BAG_SLOT_FLAG = 0x3313, + CMSG_SET_CONTACT_NOTES = 0x36D1, CMSG_SET_CURRENCY_FLAGS = 0x3169, - CMSG_SET_DIFFICULTY_ID = 0x3216, - CMSG_SET_DUNGEON_DIFFICULTY = 0x3684, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3619, + CMSG_SET_DIFFICULTY_ID = 0x3218, + CMSG_SET_DUNGEON_DIFFICULTY = 0x3682, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3617, CMSG_SET_FACTION_AT_WAR = 0x34E2, CMSG_SET_FACTION_INACTIVE = 0x34E4, CMSG_SET_FACTION_NOT_AT_WAR = 0x34E3, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3313, - CMSG_SET_LFG_BONUS_FACTION_ID = 0x3290, - CMSG_SET_LOOT_METHOD = 0x364A, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3317, + CMSG_SET_LFG_BONUS_FACTION_ID = 0x3294, + CMSG_SET_LOOT_METHOD = 0x3648, CMSG_SET_LOOT_SPECIALIZATION = 0x3543, - CMSG_SET_PARTY_ASSIGNMENT = 0x3653, - CMSG_SET_PARTY_LEADER = 0x364C, + CMSG_SET_PARTY_ASSIGNMENT = 0x3651, + CMSG_SET_PARTY_LEADER = 0x364A, CMSG_SET_PET_SLOT = 0x3168, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x368C, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x368A, CMSG_SET_PREFERRED_CEMETERY = 0x3175, - CMSG_SET_PVP = 0x3299, - CMSG_SET_RAID_DIFFICULTY = 0x36DD, + CMSG_SET_PVP = 0x329D, + CMSG_SET_RAID_DIFFICULTY = 0x36DB, CMSG_SET_ROLE = 0x35D9, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368A, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3688, CMSG_SET_SELECTION = 0x352C, CMSG_SET_SHEATHED = 0x348B, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3312, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3316, CMSG_SET_TAXI_BENCHMARK_MODE = 0x34F7, - CMSG_SET_TITLE = 0x326D, + CMSG_SET_TITLE = 0x3271, CMSG_SET_TRADE_CURRENCY = 0x3160, CMSG_SET_TRADE_GOLD = 0x315F, CMSG_SET_TRADE_ITEM = 0x315D, - CMSG_SET_USING_PARTY_GARRISON = 0x32D5, + CMSG_SET_USING_PARTY_GARRISON = 0x32D9, CMSG_SET_WATCHED_FACTION = 0x34E5, - CMSG_SHOW_TRADE_SKILL = 0x36C1, + CMSG_SHOW_TRADE_SKILL = 0x36BF, CMSG_SIGN_PETITION = 0x3537, - CMSG_SILENCE_PARTY_TALKER = 0x3654, + CMSG_SILENCE_PARTY_TALKER = 0x3652, CMSG_SOCKET_GEMS = 0x34EF, - CMSG_SORT_BAGS = 0x3314, - CMSG_SORT_BANK_BAGS = 0x3315, - CMSG_SORT_REAGENT_BANK_BAGS = 0x3316, + CMSG_SORT_BAGS = 0x3318, + CMSG_SORT_BANK_BAGS = 0x3319, + CMSG_SORT_REAGENT_BANK_BAGS = 0x331A, CMSG_SPELL_CLICK = 0x3498, CMSG_SPIRIT_HEALER_ACTIVATE = 0x34B2, CMSG_SPLIT_ITEM = 0x399E, @@ -691,18 +692,18 @@ enum OpcodeClient : uint16 CMSG_START_CHALLENGE_MODE = 0x354E, CMSG_START_SPECTATOR_WAR_GAME = 0x35DF, CMSG_START_WAR_GAME = 0x35DE, - CMSG_SUMMON_RESPONSE = 0x366C, - CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3647, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3646, - CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3648, + CMSG_SUMMON_RESPONSE = 0x366A, + CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3645, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3644, + CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3646, CMSG_SURRENDER_ARENA = 0x3172, CMSG_SUSPEND_COMMS_ACK = 0x3764, CMSG_SUSPEND_TOKEN_RESPONSE = 0x376A, CMSG_SWAP_INV_ITEM = 0x399D, CMSG_SWAP_ITEM = 0x399C, - CMSG_SWAP_SUB_GROUPS = 0x364F, + CMSG_SWAP_SUB_GROUPS = 0x364D, CMSG_SWAP_VOID_ITEM = 0x319F, - CMSG_TABARD_VENDOR_ACTIVATE = 0x3296, + CMSG_TABARD_VENDOR_ACTIVATE = 0x329A, CMSG_TALK_TO_GOSSIP = 0x3495, CMSG_TAXI_NODE_STATUS_QUERY = 0x34AB, CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34AD, @@ -711,46 +712,46 @@ enum OpcodeClient : uint16 CMSG_TIME_SYNC_RESPONSE = 0x3A38, CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3A, CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A39, - CMSG_TOGGLE_DIFFICULTY = 0x3659, - CMSG_TOGGLE_PVP = 0x3298, + CMSG_TOGGLE_DIFFICULTY = 0x3657, + CMSG_TOGGLE_PVP = 0x329C, CMSG_TOTEM_DESTROYED = 0x34FE, - CMSG_TRADE_SKILL_SET_FAVORITE = 0x3332, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x3335, CMSG_TRAINER_BUY_SPELL = 0x34B1, CMSG_TRAINER_LIST = 0x34B0, CMSG_TRANSMOGRIFY_ITEMS = 0x3192, CMSG_TURN_IN_PETITION = 0x3539, - CMSG_TUTORIAL = 0x36DE, + CMSG_TUTORIAL = 0x36DC, CMSG_TWITTER_CHECK_STATUS = 0x312A, CMSG_TWITTER_CONNECT = 0x3127, CMSG_TWITTER_DISCONNECT = 0x312B, - CMSG_TWITTER_POST = 0x3318, - CMSG_UI_TIME_REQUEST = 0x369C, + CMSG_TWITTER_POST = 0x331C, + CMSG_UI_TIME_REQUEST = 0x369A, CMSG_UNACCEPT_TRADE = 0x315B, - CMSG_UNDELETE_CHARACTER = 0x36E0, + CMSG_UNDELETE_CHARACTER = 0x36DE, CMSG_UNLEARN_SKILL = 0x34E9, CMSG_UNLEARN_SPECIALIZATION = 0x31A0, CMSG_UNLOCK_VOID_STORAGE = 0x319C, - CMSG_UPDATE_ACCOUNT_DATA = 0x3698, - CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x328C, - CMSG_UPDATE_CLIENT_SETTINGS = 0x3666, + CMSG_UPDATE_ACCOUNT_DATA = 0x3696, + CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x3290, + CMSG_UPDATE_CLIENT_SETTINGS = 0x3664, CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3E, - CMSG_UPDATE_RAID_TARGET = 0x3652, - CMSG_UPDATE_SPELL_VISUAL = 0x328B, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F6, - CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F1, - CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36E7, - CMSG_UPGRADE_GARRISON = 0x32A9, - CMSG_UPGRADE_ITEM = 0x321B, + CMSG_UPDATE_RAID_TARGET = 0x3650, + CMSG_UPDATE_SPELL_VISUAL = 0x328F, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F4, + CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36EF, + CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36E5, + CMSG_UPGRADE_GARRISON = 0x32AD, + CMSG_UPGRADE_ITEM = 0x321D, CMSG_USED_FOLLOW = 0x3185, - CMSG_USE_CRITTER_ITEM = 0x3234, + CMSG_USE_CRITTER_ITEM = 0x3235, CMSG_USE_EQUIPMENT_SET = 0x3995, - CMSG_USE_ITEM = 0x3286, - CMSG_USE_TOY = 0x3288, + CMSG_USE_ITEM = 0x328A, + CMSG_USE_TOY = 0x328C, CMSG_VIOLENCE_LEVEL = 0x3183, CMSG_VOID_STORAGE_TRANSFER = 0x319E, CMSG_WARDEN_DATA = 0x35EC, - CMSG_WHO = 0x3683, - CMSG_WHO_IS = 0x3682, + CMSG_WHO = 0x3681, + CMSG_WHO_IS = 0x3680, CMSG_WORLD_PORT_RESPONSE = 0x35F9, CMSG_WRAP_ITEM = 0x3994, @@ -762,63 +763,63 @@ enum OpcodeClient : uint16 enum OpcodeServer : uint16 { SMSG_ABORT_NEW_WORLD = 0x25AD, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x2653, - SMSG_ACCOUNT_DATA_TIMES = 0x274A, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x2652, + SMSG_ACCOUNT_DATA_TIMES = 0x2749, SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C3, SMSG_ACCOUNT_TOYS_UPDATE = 0x25C4, - SMSG_ACHIEVEMENT_DELETED = 0x271F, - SMSG_ACHIEVEMENT_EARNED = 0x2661, - SMSG_ACTIVATE_TAXI_REPLY = 0x26A7, - SMSG_ACTIVE_GLYPHS = 0x2C52, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x265B, + SMSG_ACHIEVEMENT_DELETED = 0x271E, + SMSG_ACHIEVEMENT_EARNED = 0x2660, + SMSG_ACTIVATE_TAXI_REPLY = 0x26A6, + SMSG_ACTIVE_GLYPHS = 0x2C53, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x265A, SMSG_ADD_ITEM_PASSIVE = 0x25BF, - SMSG_ADD_LOSS_OF_CONTROL = 0x2697, - SMSG_ADD_RUNE_POWER = 0x26E3, + SMSG_ADD_LOSS_OF_CONTROL = 0x2696, + SMSG_ADD_RUNE_POWER = 0x26E2, SMSG_ADJUST_SPLINE_DURATION = 0x25E8, SMSG_AE_LOOT_TARGETS = 0x262C, SMSG_AE_LOOT_TARGET_ACK = 0x262D, - SMSG_AI_REACTION = 0x26E0, + SMSG_AI_REACTION = 0x26DF, SMSG_ALL_ACCOUNT_CRITERIA = 0x2570, SMSG_ALL_ACHIEVEMENT_DATA = 0x256F, SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8, SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2586, SMSG_AREA_POI_UPDATE = 0x2848, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x2783, - SMSG_AREA_TRIGGER_DENIED = 0x269E, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x2756, - SMSG_AREA_TRIGGER_RE_PATH = 0x2640, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x263D, - SMSG_ARENA_CROWD_CONTROL_SPELLS = 0x264F, - SMSG_ARENA_ERROR = 0x2712, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2666, - SMSG_ARTIFACT_FORGE_OPENED = 0x27E3, - SMSG_ARTIFACT_KNOWLEDGE = 0x27EB, - SMSG_ARTIFACT_RESPEC_CONFIRM = 0x27E6, - SMSG_ARTIFACT_TRAITS_REFUNDED = 0x27E7, - SMSG_ARTIFACT_XP_GAIN = 0x282E, - SMSG_ATTACKER_STATE_UPDATE = 0x27D0, - SMSG_ATTACK_START = 0x266E, - SMSG_ATTACK_STOP = 0x266F, - SMSG_ATTACK_SWING_ERROR = 0x2734, - SMSG_ATTACK_SWING_LANDED_LOG = 0x2735, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2729, - SMSG_AUCTION_COMMAND_RESULT = 0x2726, - SMSG_AUCTION_HELLO_RESPONSE = 0x2724, - SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x272D, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x272B, - SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x272C, - SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x272E, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2728, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x272A, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x2725, - SMSG_AUCTION_WON_NOTIFICATION = 0x2727, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x2782, + SMSG_AREA_TRIGGER_DENIED = 0x269D, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x2755, + SMSG_AREA_TRIGGER_RE_PATH = 0x263F, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x263C, + SMSG_ARENA_CROWD_CONTROL_SPELLS = 0x264E, + SMSG_ARENA_ERROR = 0x2711, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2665, + SMSG_ARTIFACT_FORGE_OPENED = 0x27E2, + SMSG_ARTIFACT_KNOWLEDGE = 0x27EA, + SMSG_ARTIFACT_RESPEC_CONFIRM = 0x27E5, + SMSG_ARTIFACT_TRAITS_REFUNDED = 0x27E6, + SMSG_ARTIFACT_XP_GAIN = 0x282D, + SMSG_ATTACKER_STATE_UPDATE = 0x27CF, + SMSG_ATTACK_START = 0x266D, + SMSG_ATTACK_STOP = 0x266E, + SMSG_ATTACK_SWING_ERROR = 0x2733, + SMSG_ATTACK_SWING_LANDED_LOG = 0x2734, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2728, + SMSG_AUCTION_COMMAND_RESULT = 0x2725, + SMSG_AUCTION_HELLO_RESPONSE = 0x2723, + SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x272C, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x272A, + SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x272B, + SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x272D, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x2727, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x2729, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x2724, + SMSG_AUCTION_WON_NOTIFICATION = 0x2726, SMSG_AURA_POINTS_DEPLETED = 0x2C23, SMSG_AURA_UPDATE = 0x2C22, SMSG_AUTH_CHALLENGE = 0x3048, SMSG_AUTH_RESPONSE = 0x256C, SMSG_AVAILABLE_HOTFIXES = 0x25A1, - SMSG_BAN_REASON = 0x26B3, - SMSG_BARBER_SHOP_RESULT = 0x26E9, + SMSG_BAN_REASON = 0x26B2, + SMSG_BARBER_SHOP_RESULT = 0x26E8, SMSG_BATTLEFIELD_LIST = 0x2594, SMSG_BATTLEFIELD_PORT_DENIED = 0x259A, SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2590, @@ -828,43 +829,44 @@ enum OpcodeServer : uint16 SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2591, SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A5, SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259B, - SMSG_BATTLEGROUND_INIT = 0x27A1, + SMSG_BATTLEGROUND_INIT = 0x27A0, SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2598, SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2599, SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2595, - SMSG_BATTLEGROUND_POINTS = 0x27A0, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x27CF, - SMSG_BATTLENET_CHALLENGE_START = 0x27CE, + SMSG_BATTLEGROUND_POINTS = 0x279F, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x27CE, + SMSG_BATTLENET_CHALLENGE_START = 0x27CD, SMSG_BATTLENET_NOTIFICATION = 0x2843, SMSG_BATTLENET_REALM_LIST_TICKET = 0x2845, SMSG_BATTLENET_RESPONSE = 0x2842, SMSG_BATTLENET_SET_SESSION_STATE = 0x2844, - SMSG_BATTLE_PAY_ACK_FAILED = 0x27C7, - SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x27BC, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27C6, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27BA, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B9, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B8, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B6, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B4, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B5, - SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x27BB, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27C5, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27C3, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27C2, + SMSG_BATTLE_PAY_ACK_FAILED = 0x27C6, + SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x27BB, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27C5, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x27B9, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x27B8, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x27B7, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x27B5, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27B3, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27B4, + SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x27BA, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27C4, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27C2, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27C1, + SMSG_BATTLE_PAY_SUBSCRIPTION_CHANGED = 0x2864, SMSG_BATTLE_PAY_VAS_BNET_TRANSFER_VALIDATION_RESULT = 0x285B, - SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B7, - SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2831, + SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27B6, + SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2830, SMSG_BATTLE_PAY_VAS_CHARACTER_QUEUE_STATUS = 0x2859, - SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x2834, - SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2835, - SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2833, - SMSG_BATTLE_PAY_VAS_REALM_LIST = 0x2832, + SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x2833, + SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x2834, + SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x2832, + SMSG_BATTLE_PAY_VAS_REALM_LIST = 0x2831, SMSG_BATTLE_PAY_VAS_TRANSFER_QUEUE_STATUS = 0x2858, SMSG_BATTLE_PETS_HEALED = 0x2609, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x26A1, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x26A0, SMSG_BATTLE_PET_DELETED = 0x2606, - SMSG_BATTLE_PET_ERROR = 0x2656, + SMSG_BATTLE_PET_ERROR = 0x2655, SMSG_BATTLE_PET_JOURNAL = 0x2605, SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2603, SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2604, @@ -874,49 +876,49 @@ enum OpcodeServer : uint16 SMSG_BATTLE_PET_REVOKED = 0x2607, SMSG_BATTLE_PET_TRAP_LEVEL = 0x2600, SMSG_BATTLE_PET_UPDATES = 0x25FF, - SMSG_BINDER_CONFIRM = 0x273A, + SMSG_BINDER_CONFIRM = 0x2739, SMSG_BIND_POINT_UPDATE = 0x257C, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2645, - SMSG_BLACK_MARKET_OPEN_RESULT = 0x2643, - SMSG_BLACK_MARKET_OUTBID = 0x2646, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2644, - SMSG_BLACK_MARKET_WON = 0x2647, - SMSG_BONUS_ROLL_EMPTY = 0x2663, - SMSG_BOSS_KILL_CREDIT = 0x27C1, - SMSG_BREAK_TARGET = 0x266D, - SMSG_BUY_FAILED = 0x26F2, - SMSG_BUY_SUCCEEDED = 0x26F1, - SMSG_CACHE_INFO = 0x2744, - SMSG_CACHE_VERSION = 0x2743, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26C7, - SMSG_CALENDAR_COMMAND_RESULT = 0x26C8, - SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26B7, - SMSG_CALENDAR_EVENT_INVITE = 0x26B8, - SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x26B9, - SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x26BC, - SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x26C1, - SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x26C2, - SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x26BD, - SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x26BE, - SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x26BA, - SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x26BB, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26BF, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26C0, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26C3, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26C4, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26C5, - SMSG_CALENDAR_SEND_CALENDAR = 0x26B5, - SMSG_CALENDAR_SEND_EVENT = 0x26B6, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x26C6, - SMSG_CAMERA_EFFECT = 0x2768, - SMSG_CANCEL_AUTO_REPEAT = 0x2713, - SMSG_CANCEL_COMBAT = 0x2732, - SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C45, - SMSG_CANCEL_SCENE = 0x2655, - SMSG_CANCEL_SPELL_VISUAL = 0x2C43, - SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C47, - SMSG_CAN_DUEL_RESULT = 0x2677, - SMSG_CAST_FAILED = 0x2C55, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2644, + SMSG_BLACK_MARKET_OPEN_RESULT = 0x2642, + SMSG_BLACK_MARKET_OUTBID = 0x2645, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2643, + SMSG_BLACK_MARKET_WON = 0x2646, + SMSG_BONUS_ROLL_EMPTY = 0x2662, + SMSG_BOSS_KILL_CREDIT = 0x27C0, + SMSG_BREAK_TARGET = 0x266C, + SMSG_BUY_FAILED = 0x26F1, + SMSG_BUY_SUCCEEDED = 0x26F0, + SMSG_CACHE_INFO = 0x2743, + SMSG_CACHE_VERSION = 0x2742, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26C6, + SMSG_CALENDAR_COMMAND_RESULT = 0x26C7, + SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26B6, + SMSG_CALENDAR_EVENT_INVITE = 0x26B7, + SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x26B8, + SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x26BB, + SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x26C0, + SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x26C1, + SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x26BC, + SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x26BD, + SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x26B9, + SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x26BA, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26BE, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26BF, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26C2, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26C3, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26C4, + SMSG_CALENDAR_SEND_CALENDAR = 0x26B4, + SMSG_CALENDAR_SEND_EVENT = 0x26B5, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x26C5, + SMSG_CAMERA_EFFECT = 0x2767, + SMSG_CANCEL_AUTO_REPEAT = 0x2712, + SMSG_CANCEL_COMBAT = 0x2731, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C46, + SMSG_CANCEL_SCENE = 0x2654, + SMSG_CANCEL_SPELL_VISUAL = 0x2C44, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C48, + SMSG_CAN_DUEL_RESULT = 0x2676, + SMSG_CAST_FAILED = 0x2C56, SMSG_CATEGORY_COOLDOWN = 0x2C16, SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x2622, SMSG_CHALLENGE_MODE_COMPLETE = 0x2620, @@ -927,24 +929,25 @@ enum OpcodeServer : uint16 SMSG_CHALLENGE_MODE_REWARDS = 0x2621, SMSG_CHALLENGE_MODE_START = 0x261D, SMSG_CHALLENGE_MODE_UPDATE_DEATH_COUNT = 0x261E, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2736, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x2735, SMSG_CHANNEL_LIST = 0x2BC3, SMSG_CHANNEL_NOTIFY = 0x2BC0, SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC1, SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC2, - SMSG_CHARACTER_CLASS_TRIAL_CREATE = 0x2805, + SMSG_CHARACTER_CLASS_TRIAL_CREATE = 0x2804, + SMSG_CHARACTER_INVENTORY_OVERFLOW_WARNING = 0x2863, SMSG_CHARACTER_ITEM_FIXUP = 0x2854, - SMSG_CHARACTER_LOGIN_FAILED = 0x2745, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27CD, - SMSG_CHARACTER_RENAME_RESULT = 0x27A6, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x2804, - SMSG_CHARACTER_UPGRADE_QUEUED = 0x2803, + SMSG_CHARACTER_LOGIN_FAILED = 0x2744, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27CC, + SMSG_CHARACTER_RENAME_RESULT = 0x27A5, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x2803, + SMSG_CHARACTER_UPGRADE_QUEUED = 0x2802, SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x25F4, - SMSG_CHARACTER_UPGRADE_STARTED = 0x2802, - SMSG_CHARACTER_UPGRADE_UNREVOKE_RESULT = 0x2806, - SMSG_CHAR_CUSTOMIZE = 0x271A, - SMSG_CHAR_CUSTOMIZE_FAILED = 0x2719, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27EF, + SMSG_CHARACTER_UPGRADE_STARTED = 0x2801, + SMSG_CHARACTER_UPGRADE_UNREVOKE_RESULT = 0x2805, + SMSG_CHAR_CUSTOMIZE = 0x2719, + SMSG_CHAR_CUSTOMIZE_FAILED = 0x2718, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x27EE, SMSG_CHAT = 0x2BAD, SMSG_CHAT_AUTO_RESPONDED = 0x2BB8, SMSG_CHAT_DOWN = 0x2BBD, @@ -960,97 +963,97 @@ enum OpcodeServer : uint16 SMSG_CHECK_WARGAME_ENTRY = 0x259E, SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C27, SMSG_CLEAR_BOSS_EMOTES = 0x25CD, - SMSG_CLEAR_COOLDOWN = 0x26E5, + SMSG_CLEAR_COOLDOWN = 0x26E4, SMSG_CLEAR_COOLDOWNS = 0x2C26, - SMSG_CLEAR_LOSS_OF_CONTROL = 0x2699, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x2698, SMSG_CLEAR_SPELL_CHARGES = 0x2C28, - SMSG_CLEAR_TARGET = 0x26DC, + SMSG_CLEAR_TARGET = 0x26DB, SMSG_COIN_REMOVED = 0x262B, - SMSG_COMBAT_EVENT_FAILED = 0x2670, - SMSG_COMMENTATOR_MAP_INFO = 0x2747, - SMSG_COMMENTATOR_PLAYER_INFO = 0x2748, - SMSG_COMMENTATOR_STATE_CHANGED = 0x2746, - SMSG_COMPLAINT_RESULT = 0x26D4, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27DF, + SMSG_COMBAT_EVENT_FAILED = 0x266F, + SMSG_COMMENTATOR_MAP_INFO = 0x2746, + SMSG_COMMENTATOR_PLAYER_INFO = 0x2747, + SMSG_COMMENTATOR_STATE_CHANGED = 0x2745, + SMSG_COMPLAINT_RESULT = 0x26D3, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27DE, SMSG_CONNECT_TO = 0x304D, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C8, - SMSG_CONSOLE_WRITE = 0x2652, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27C7, + SMSG_CONSOLE_WRITE = 0x2651, SMSG_CONSUMPTION_CONVERSION_INFO_RESPONSE = 0x2849, SMSG_CONSUMPTION_CONVERSION_RESULT = 0x284A, - SMSG_CONTACT_LIST = 0x27CB, - SMSG_CONTROL_UPDATE = 0x2665, - SMSG_COOLDOWN_CHEAT = 0x277C, - SMSG_COOLDOWN_EVENT = 0x26E4, - SMSG_CORPSE_LOCATION = 0x266C, - SMSG_CORPSE_RECLAIM_DELAY = 0x278F, - SMSG_CORPSE_TRANSPORT_QUERY = 0x2752, - SMSG_CREATE_CHAR = 0x273F, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x27DE, - SMSG_CRITERIA_DELETED = 0x271E, - SMSG_CRITERIA_UPDATE = 0x2718, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26ED, + SMSG_CONTACT_LIST = 0x27CA, + SMSG_CONTROL_UPDATE = 0x2664, + SMSG_COOLDOWN_CHEAT = 0x277B, + SMSG_COOLDOWN_EVENT = 0x26E3, + SMSG_CORPSE_LOCATION = 0x266B, + SMSG_CORPSE_RECLAIM_DELAY = 0x278E, + SMSG_CORPSE_TRANSPORT_QUERY = 0x2751, + SMSG_CREATE_CHAR = 0x273E, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x27DD, + SMSG_CRITERIA_DELETED = 0x271D, + SMSG_CRITERIA_UPDATE = 0x2717, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26EC, SMSG_CUSTOM_LOAD_SCREEN = 0x25E3, SMSG_DAILY_QUESTS_RESET = 0x2A80, - SMSG_DAMAGE_CALC_LOG = 0x280D, + SMSG_DAMAGE_CALC_LOG = 0x280C, SMSG_DB_REPLY = 0x25A0, - SMSG_DEATH_RELEASE_LOC = 0x2706, + SMSG_DEATH_RELEASE_LOC = 0x2705, SMSG_DEFENSE_MESSAGE = 0x2BB6, - SMSG_DELETE_CHAR = 0x2740, - SMSG_DESTROY_ARENA_UNIT = 0x2785, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x2733, + SMSG_DELETE_CHAR = 0x273F, + SMSG_DESTROY_ARENA_UNIT = 0x2784, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x2732, SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258A, SMSG_DISENCHANT_CREDIT = 0x25BC, - SMSG_DISMOUNT = 0x26DB, + SMSG_DISMOUNT = 0x26DA, SMSG_DISMOUNT_RESULT = 0x257B, SMSG_DISPEL_FAILED = 0x2C30, SMSG_DISPLAY_GAME_ERROR = 0x25B5, - SMSG_DISPLAY_PLAYER_CHOICE = 0x26A2, - SMSG_DISPLAY_PROMOTION = 0x2669, + SMSG_DISPLAY_PLAYER_CHOICE = 0x26A1, + SMSG_DISPLAY_PROMOTION = 0x2668, SMSG_DISPLAY_QUEST_POPUP = 0x2A9D, - SMSG_DISPLAY_TOAST = 0x2639, + SMSG_DISPLAY_TOAST = 0x2638, SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F6, SMSG_DROP_NEW_CONNECTION = 0x304C, - SMSG_DUEL_COMPLETE = 0x2675, - SMSG_DUEL_COUNTDOWN = 0x2674, - SMSG_DUEL_IN_BOUNDS = 0x2673, - SMSG_DUEL_OUT_OF_BOUNDS = 0x2672, - SMSG_DUEL_REQUESTED = 0x2671, - SMSG_DUEL_WINNER = 0x2676, - SMSG_DURABILITY_DAMAGE_DEATH = 0x278B, - SMSG_EMOTE = 0x280E, - SMSG_ENABLE_BARBER_SHOP = 0x26E8, + SMSG_DUEL_COMPLETE = 0x2674, + SMSG_DUEL_COUNTDOWN = 0x2673, + SMSG_DUEL_IN_BOUNDS = 0x2672, + SMSG_DUEL_OUT_OF_BOUNDS = 0x2671, + SMSG_DUEL_REQUESTED = 0x2670, + SMSG_DUEL_WINNER = 0x2675, + SMSG_DURABILITY_DAMAGE_DEATH = 0x278A, + SMSG_EMOTE = 0x280D, + SMSG_ENABLE_BARBER_SHOP = 0x26E7, SMSG_ENABLE_ENCRYPTION = 0x3049, - SMSG_ENCHANTMENT_LOG = 0x2753, - SMSG_ENCOUNTER_END = 0x27C0, - SMSG_ENCOUNTER_START = 0x27BF, + SMSG_ENCHANTMENT_LOG = 0x2752, + SMSG_ENCOUNTER_END = 0x27BF, + SMSG_ENCOUNTER_START = 0x27BE, SMSG_ENUM_CHARACTERS_RESULT = 0x2582, SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C21, - SMSG_EQUIPMENT_SET_ID = 0x26DD, + SMSG_EQUIPMENT_SET_ID = 0x26DC, SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, - SMSG_EXPLORATION_EXPERIENCE = 0x27A3, - SMSG_FACTION_BONUS_INFO = 0x2767, + SMSG_EXPLORATION_EXPERIENCE = 0x27A2, + SMSG_FACTION_BONUS_INFO = 0x2766, SMSG_FAILED_PLAYER_CONDITION = 0x25E2, SMSG_FEATURE_SYSTEM_STATUS = 0x25D1, SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D2, - SMSG_FEIGN_DEATH_RESISTED = 0x2788, - SMSG_FISH_ESCAPED = 0x26FA, - SMSG_FISH_NOT_HOOKED = 0x26F9, + SMSG_FEIGN_DEATH_RESISTED = 0x2787, + SMSG_FISH_ESCAPED = 0x26F9, + SMSG_FISH_NOT_HOOKED = 0x26F8, SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7, - SMSG_FORCED_DEATH_UPDATE = 0x2707, - SMSG_FORCE_ANIM = 0x2795, - SMSG_FORCE_OBJECT_RELINK = 0x2668, - SMSG_FRIEND_STATUS = 0x27CC, + SMSG_FORCED_DEATH_UPDATE = 0x2706, + SMSG_FORCE_ANIM = 0x2794, + SMSG_FORCE_OBJECT_RELINK = 0x2667, + SMSG_FRIEND_STATUS = 0x27CB, SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D6, SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D7, SMSG_GAME_OBJECT_DESPAWN = 0x25D8, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4A, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C49, - SMSG_GAME_OBJECT_RESET_STATE = 0x275E, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4B, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C4A, + SMSG_GAME_OBJECT_RESET_STATE = 0x275D, SMSG_GAME_OBJECT_SET_STATE = 0x2841, - SMSG_GAME_OBJECT_UI_ACTION = 0x275B, - SMSG_GAME_SPEED_SET = 0x26AB, - SMSG_GAME_TIME_SET = 0x274C, - SMSG_GAME_TIME_UPDATE = 0x274B, + SMSG_GAME_OBJECT_UI_ACTION = 0x275A, + SMSG_GAME_SPEED_SET = 0x26AA, + SMSG_GAME_TIME_SET = 0x274B, + SMSG_GAME_TIME_UPDATE = 0x274A, SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2902, SMSG_GARRISON_ADD_MISSION_RESULT = 0x2906, SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x2918, @@ -1068,7 +1071,7 @@ enum OpcodeServer : uint16 SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x2915, SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x2912, SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x2929, - SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27E1, + SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x27E0, SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x28F7, SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x28F5, SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x2905, @@ -1098,26 +1101,26 @@ enum OpcodeServer : uint16 SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x28F8, SMSG_GARRISON_UPGRADE_RESULT = 0x28FD, SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2583, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A4, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A3, SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928, SMSG_GET_GARRISON_INFO_RESULT = 0x28F0, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27E0, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27DC, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x2809, - SMSG_GM_PLAYER_INFO = 0x277B, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x27DF, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x27DB, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x2808, + SMSG_GM_PLAYER_INFO = 0x277A, SMSG_GM_REQUEST_PLAYER_INFO = 0x25ED, - SMSG_GM_TICKET_CASE_STATUS = 0x26CD, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x26CC, - SMSG_GOD_MODE = 0x2739, + SMSG_GM_TICKET_CASE_STATUS = 0x26CC, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x26CB, + SMSG_GOD_MODE = 0x2738, SMSG_GOSSIP_COMPLETE = 0x2A96, SMSG_GOSSIP_MESSAGE = 0x2A97, - SMSG_GOSSIP_POI = 0x27D9, + SMSG_GOSSIP_POI = 0x27D8, SMSG_GROUP_ACTION_THROTTLED = 0x259C, - SMSG_GROUP_DECLINE = 0x27D4, - SMSG_GROUP_DESTROYED = 0x27D6, + SMSG_GROUP_DECLINE = 0x27D3, + SMSG_GROUP_DESTROYED = 0x27D5, SMSG_GROUP_INVITE_CONFIRMATION = 0x2855, - SMSG_GROUP_NEW_LEADER = 0x264A, - SMSG_GROUP_UNINVITE = 0x27D5, + SMSG_GROUP_NEW_LEADER = 0x2649, + SMSG_GROUP_UNINVITE = 0x27D4, SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x29C7, @@ -1170,55 +1173,55 @@ enum OpcodeServer : uint16 SMSG_GUILD_ROSTER = 0x29BB, SMSG_GUILD_ROSTER_UPDATE = 0x29BC, SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9, - SMSG_HEALTH_UPDATE = 0x26FD, - SMSG_HIGHEST_THREAT_UPDATE = 0x270D, + SMSG_HEALTH_UPDATE = 0x26FC, + SMSG_HIGHEST_THREAT_UPDATE = 0x270C, SMSG_HOTFIX_MESSAGE = 0x25A2, SMSG_HOTFIX_RESPONSE = 0x25A3, - SMSG_INITIALIZE_FACTIONS = 0x2766, + SMSG_INITIALIZE_FACTIONS = 0x2765, SMSG_INITIAL_SETUP = 0x257F, - SMSG_INIT_WORLD_STATES = 0x278C, + SMSG_INIT_WORLD_STATES = 0x278B, SMSG_INSPECT_HONOR_STATS = 0x25B2, - SMSG_INSPECT_PVP = 0x2762, - SMSG_INSPECT_RESULT = 0x264E, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27F5, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27F4, - SMSG_INSTANCE_ENCOUNTER_END = 0x27FD, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27F3, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27FF, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27FE, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27F8, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27F7, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27FC, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x2800, - SMSG_INSTANCE_ENCOUNTER_SET_ALLOWING_RELEASE = 0x27FB, - SMSG_INSTANCE_ENCOUNTER_SET_SUPPRESSING_RELEASE = 0x27FA, - SMSG_INSTANCE_ENCOUNTER_START = 0x27F9, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27F6, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2737, - SMSG_INSTANCE_INFO = 0x2651, - SMSG_INSTANCE_RESET = 0x26B0, - SMSG_INSTANCE_RESET_FAILED = 0x26B1, - SMSG_INSTANCE_SAVE_CREATED = 0x27BE, - SMSG_INVALIDATE_PAGE_TEXT = 0x2702, - SMSG_INVALIDATE_PLAYER = 0x26D3, - SMSG_INVALID_PROMOTION_CODE = 0x2796, - SMSG_INVENTORY_CHANGE_FAILURE = 0x2764, + SMSG_INSPECT_PVP = 0x2761, + SMSG_INSPECT_RESULT = 0x264D, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27F4, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27F3, + SMSG_INSTANCE_ENCOUNTER_END = 0x27FC, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x27F2, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x27FE, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x27FD, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x27F7, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x27F6, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x27FB, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x27FF, + SMSG_INSTANCE_ENCOUNTER_SET_ALLOWING_RELEASE = 0x27FA, + SMSG_INSTANCE_ENCOUNTER_SET_SUPPRESSING_RELEASE = 0x27F9, + SMSG_INSTANCE_ENCOUNTER_START = 0x27F8, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27F5, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x2736, + SMSG_INSTANCE_INFO = 0x2650, + SMSG_INSTANCE_RESET = 0x26AF, + SMSG_INSTANCE_RESET_FAILED = 0x26B0, + SMSG_INSTANCE_SAVE_CREATED = 0x27BD, + SMSG_INVALIDATE_PAGE_TEXT = 0x2701, + SMSG_INVALIDATE_PLAYER = 0x26D2, + SMSG_INVALID_PROMOTION_CODE = 0x2795, + SMSG_INVENTORY_CHANGE_FAILURE = 0x2763, SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x2A83, - SMSG_ITEM_CHANGED = 0x2721, - SMSG_ITEM_COOLDOWN = 0x280C, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2798, + SMSG_ITEM_CHANGED = 0x2720, + SMSG_ITEM_COOLDOWN = 0x280B, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x2797, SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25B1, SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AF, - SMSG_ITEM_PUSH_RESULT = 0x2638, - SMSG_ITEM_TIME_UPDATE = 0x2797, - SMSG_KICK_REASON = 0x2830, - SMSG_LEARNED_SPELLS = 0x2C4C, + SMSG_ITEM_PUSH_RESULT = 0x2637, + SMSG_ITEM_TIME_UPDATE = 0x2796, + SMSG_KICK_REASON = 0x282F, + SMSG_LEARNED_SPELLS = 0x2C4D, SMSG_LEARN_PVP_TALENTS_FAILED = 0x25EA, SMSG_LEARN_TALENTS_FAILED = 0x25E9, SMSG_LEVEL_UPDATE = 0x2587, - SMSG_LEVEL_UP_INFO = 0x2720, - SMSG_LFG_BOOT_PLAYER = 0x2A36, - SMSG_LFG_DISABLED = 0x2A34, + SMSG_LEVEL_UP_INFO = 0x271F, + SMSG_LFG_BOOT_PLAYER = 0x2A35, + SMSG_LFG_DISABLED = 0x2A33, SMSG_LFG_INSTANCE_SHUTDOWN_COUNTDOWN = 0x2A25, SMSG_LFG_JOIN_RESULT = 0x2A1C, SMSG_LFG_LIST_JOIN_RESULT = 0x2A1D, @@ -1226,17 +1229,17 @@ enum OpcodeServer : uint16 SMSG_LFG_LIST_SEARCH_STATUS = 0x2A1F, SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x2A2A, SMSG_LFG_LIST_UPDATE_STATUS = 0x2A26, - SMSG_LFG_OFFER_CONTINUE = 0x2A35, - SMSG_LFG_PARTY_INFO = 0x2A37, - SMSG_LFG_PLAYER_INFO = 0x2A38, - SMSG_LFG_PLAYER_REWARD = 0x2A39, + SMSG_LFG_OFFER_CONTINUE = 0x2A34, + SMSG_LFG_PARTY_INFO = 0x2A36, + SMSG_LFG_PLAYER_INFO = 0x2A37, + SMSG_LFG_PLAYER_REWARD = 0x2A38, SMSG_LFG_PROPOSAL_UPDATE = 0x2A2D, SMSG_LFG_QUEUE_STATUS = 0x2A20, - SMSG_LFG_READY_CHECK_RESULT = 0x2A3B, + SMSG_LFG_READY_CHECK_RESULT = 0x2A3A, SMSG_LFG_READY_CHECK_UPDATE = 0x2A22, SMSG_LFG_ROLE_CHECK_UPDATE = 0x2A21, SMSG_LFG_SLOT_INVALID = 0x2A30, - SMSG_LFG_TELEPORT_DENIED = 0x2A33, + SMSG_LFG_TELEPORT_DENIED = 0x2A32, SMSG_LFG_UPDATE_STATUS = 0x2A24, SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x29D5, SMSG_LF_GUILD_APPLICATIONS = 0x29D1, @@ -1245,45 +1248,44 @@ enum OpcodeServer : uint16 SMSG_LF_GUILD_COMMAND_RESULT = 0x29D0, SMSG_LF_GUILD_POST = 0x29CD, SMSG_LF_GUILD_RECRUITS = 0x29CF, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27B2, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27B0, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A5, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27B1, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27AF, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27A4, SMSG_LOAD_CUF_PROFILES = 0x25CE, - SMSG_LOAD_EQUIPMENT_SET = 0x274E, - SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x280A, - SMSG_LOGIN_SET_TIME_SPEED = 0x274D, + SMSG_LOAD_EQUIPMENT_SET = 0x274D, + SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x2809, + SMSG_LOGIN_SET_TIME_SPEED = 0x274C, SMSG_LOGIN_VERIFY_WORLD = 0x25AC, - SMSG_LOGOUT_CANCEL_ACK = 0x26AF, - SMSG_LOGOUT_COMPLETE = 0x26AE, - SMSG_LOGOUT_RESPONSE = 0x26AD, - SMSG_LOG_XP_GAIN = 0x271C, - SMSG_LOOT_ALL_PASSED = 0x2636, - SMSG_LOOT_ITEM_LIST = 0x2634, - SMSG_LOOT_LIST = 0x2784, + SMSG_LOGOUT_CANCEL_ACK = 0x26AE, + SMSG_LOGOUT_COMPLETE = 0x26AD, + SMSG_LOGOUT_RESPONSE = 0x26AC, + SMSG_LOG_XP_GAIN = 0x271B, + SMSG_LOOT_ALL_PASSED = 0x2635, + SMSG_LOOT_LIST = 0x2783, SMSG_LOOT_MONEY_NOTIFY = 0x2630, SMSG_LOOT_RELEASE = 0x262F, SMSG_LOOT_RELEASE_ALL = 0x262E, SMSG_LOOT_REMOVED = 0x2629, SMSG_LOOT_RESPONSE = 0x2628, SMSG_LOOT_ROLL = 0x2632, - SMSG_LOOT_ROLLS_COMPLETE = 0x2635, - SMSG_LOOT_ROLL_WON = 0x2637, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2696, - SMSG_MAIL_COMMAND_RESULT = 0x2659, - SMSG_MAIL_LIST_RESULT = 0x2799, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x279A, - SMSG_MAP_OBJECTIVES_INIT = 0x27A2, + SMSG_LOOT_ROLLS_COMPLETE = 0x2634, + SMSG_LOOT_ROLL_WON = 0x2636, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x2695, + SMSG_MAIL_COMMAND_RESULT = 0x2658, + SMSG_MAIL_LIST_RESULT = 0x2798, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x2799, + SMSG_MAP_OBJECTIVES_INIT = 0x27A1, SMSG_MAP_OBJ_EVENTS = 0x25D9, SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x2633, SMSG_MESSAGE_BOX = 0x2575, - SMSG_MINIMAP_PING = 0x26F8, + SMSG_MINIMAP_PING = 0x26F7, SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, SMSG_MISSILE_CANCEL = 0x25DA, - SMSG_MODIFY_CHARGE_RECOVERY_SPEED = 0x27A9, - SMSG_MODIFY_COOLDOWN = 0x27A7, - SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED = 0x27A8, - SMSG_MODIFY_PARTY_RANGE = 0x2787, + SMSG_MODIFY_CHARGE_RECOVERY_SPEED = 0x27A8, + SMSG_MODIFY_COOLDOWN = 0x27A6, + SMSG_MODIFY_COOLDOWN_RECOVERY_SPEED = 0x27A7, + SMSG_MODIFY_PARTY_RANGE = 0x2786, SMSG_MOTD = 0x2BAF, SMSG_MOUNT_RESULT = 0x257A, SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x2DE1, @@ -1369,40 +1371,41 @@ enum OpcodeServer : uint16 SMSG_MOVE_UPDATE_TURN_RATE = 0x2DAB, SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DA6, SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25F1, - SMSG_NEW_TAXI_PATH = 0x26A8, + SMSG_NEW_TAXI_PATH = 0x26A7, SMSG_NEW_WORLD = 0x25AB, - SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C42, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26D2, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C43, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26D1, SMSG_NOTIFY_MONEY = 0x25AE, - SMSG_NOTIFY_RECEIVED_MAIL = 0x265A, - SMSG_OFFER_PETITION_ERROR = 0x26E1, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x271D, + SMSG_NOTIFY_RECEIVED_MAIL = 0x2659, + SMSG_OFFER_PETITION_ERROR = 0x26E0, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x271C, SMSG_ON_MONSTER_MOVE = 0x2DA2, - SMSG_OPEN_CONTAINER = 0x2765, - SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A32, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27DB, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27DD, - SMSG_OPEN_TRANSMOGRIFIER = 0x2837, - SMSG_OVERRIDE_LIGHT = 0x26E7, - SMSG_PAGE_TEXT = 0x275A, - SMSG_PARTY_COMMAND_RESULT = 0x27D8, + SMSG_OPEN_ALLIED_RACE_DETAILS_GIVER = 0x2837, + SMSG_OPEN_CONTAINER = 0x2764, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x2A31, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27DA, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27DC, + SMSG_OPEN_TRANSMOGRIFIER = 0x2836, + SMSG_OVERRIDE_LIGHT = 0x26E6, + SMSG_PAGE_TEXT = 0x2759, + SMSG_PARTY_COMMAND_RESULT = 0x27D7, SMSG_PARTY_INVITE = 0x25CF, - SMSG_PARTY_KILL_LOG = 0x279E, - SMSG_PARTY_MEMBER_STATE = 0x279C, - SMSG_PARTY_MEMBER_STATE_UPDATE = 0x279B, + SMSG_PARTY_KILL_LOG = 0x279D, + SMSG_PARTY_MEMBER_STATE = 0x279B, + SMSG_PARTY_MEMBER_STATE_UPDATE = 0x279A, SMSG_PARTY_UPDATE = 0x260B, - SMSG_PAUSE_MIRROR_TIMER = 0x2750, - SMSG_PENDING_RAID_LOCK = 0x2731, + SMSG_PAUSE_MIRROR_TIMER = 0x274F, + SMSG_PENDING_RAID_LOCK = 0x2730, SMSG_PETITION_ALREADY_SIGNED = 0x25B8, SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F7, - SMSG_PETITION_SHOW_LIST = 0x26EA, - SMSG_PETITION_SHOW_SIGNATURES = 0x26EB, - SMSG_PETITION_SIGN_RESULTS = 0x2790, - SMSG_PET_ACTION_FEEDBACK = 0x278E, - SMSG_PET_ACTION_SOUND = 0x26CA, + SMSG_PETITION_SHOW_LIST = 0x26E9, + SMSG_PETITION_SHOW_SIGNATURES = 0x26EA, + SMSG_PETITION_SIGN_RESULTS = 0x278F, + SMSG_PET_ACTION_FEEDBACK = 0x278D, + SMSG_PET_ACTION_SOUND = 0x26C9, SMSG_PET_ADDED = 0x25A8, SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2618, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x269D, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x269C, SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x2611, SMSG_PET_BATTLE_FINAL_ROUND = 0x2616, SMSG_PET_BATTLE_FINISHED = 0x2617, @@ -1410,68 +1413,68 @@ enum OpcodeServer : uint16 SMSG_PET_BATTLE_INITIAL_UPDATE = 0x2612, SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x2619, SMSG_PET_BATTLE_PVP_CHALLENGE = 0x2610, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2657, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x2658, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2656, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x2657, SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2615, SMSG_PET_BATTLE_REQUEST_FAILED = 0x260F, SMSG_PET_BATTLE_ROUND_RESULT = 0x2614, SMSG_PET_BATTLE_SLOT_UPDATES = 0x2602, - SMSG_PET_CAST_FAILED = 0x2C56, + SMSG_PET_CAST_FAILED = 0x2C57, SMSG_PET_CLEAR_SPELLS = 0x2C24, - SMSG_PET_DISMISS_SOUND = 0x26CB, - SMSG_PET_GOD_MODE = 0x26A5, - SMSG_PET_GUIDS = 0x2742, - SMSG_PET_LEARNED_SPELLS = 0x2C4E, + SMSG_PET_DISMISS_SOUND = 0x26CA, + SMSG_PET_GOD_MODE = 0x26A4, + SMSG_PET_GUIDS = 0x2741, + SMSG_PET_LEARNED_SPELLS = 0x2C4F, SMSG_PET_MODE = 0x2589, - SMSG_PET_NAME_INVALID = 0x26EF, + SMSG_PET_NAME_INVALID = 0x26EE, SMSG_PET_SLOT_UPDATED = 0x2588, SMSG_PET_SPELLS_MESSAGE = 0x2C25, SMSG_PET_STABLE_LIST = 0x25A9, SMSG_PET_STABLE_RESULT = 0x25AA, - SMSG_PET_TAME_FAILURE = 0x26DE, - SMSG_PET_UNLEARNED_SPELLS = 0x2C4F, + SMSG_PET_TAME_FAILURE = 0x26DD, + SMSG_PET_UNLEARNED_SPELLS = 0x2C50, SMSG_PHASE_SHIFT_CHANGE = 0x2577, - SMSG_PLAYED_TIME = 0x2709, + SMSG_PLAYED_TIME = 0x2708, SMSG_PLAYER_BOUND = 0x257D, SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F6, - SMSG_PLAYER_SKINNED = 0x2789, - SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x279D, - SMSG_PLAY_MUSIC = 0x27AC, - SMSG_PLAY_OBJECT_SOUND = 0x27AD, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x2773, - SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C46, - SMSG_PLAY_SCENE = 0x2654, - SMSG_PLAY_SOUND = 0x27AB, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AE, - SMSG_PLAY_SPELL_VISUAL = 0x2C44, - SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C48, - SMSG_PLAY_TIME_WARNING = 0x273B, + SMSG_PLAYER_SKINNED = 0x2788, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x279C, + SMSG_PLAY_MUSIC = 0x27AB, + SMSG_PLAY_OBJECT_SOUND = 0x27AC, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x2772, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C47, + SMSG_PLAY_SCENE = 0x2653, + SMSG_PLAY_SOUND = 0x27AA, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x27AD, + SMSG_PLAY_SPELL_VISUAL = 0x2C45, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C49, + SMSG_PLAY_TIME_WARNING = 0x273A, SMSG_PONG = 0x304E, - SMSG_POWER_UPDATE = 0x26FE, - SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2759, - SMSG_PRE_RESSURECT = 0x27AA, + SMSG_POWER_UPDATE = 0x26FD, + SMSG_PRESTIGE_AND_HONOR_INVOLUNTARILY_CHANGED = 0x2758, + SMSG_PRE_RESSURECT = 0x27A9, SMSG_PRINT_NOTIFICATION = 0x25E1, - SMSG_PROC_RESIST = 0x279F, - SMSG_PROPOSE_LEVEL_GRANT = 0x2711, - SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C50, - SMSG_PVP_CREDIT = 0x2717, + SMSG_PROC_RESIST = 0x279E, + SMSG_PROPOSE_LEVEL_GRANT = 0x2710, + SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C51, + SMSG_PVP_CREDIT = 0x2716, SMSG_PVP_LOG_DATA = 0x25B3, SMSG_PVP_OPTIONS_ENABLED = 0x25B6, SMSG_PVP_SEASON = 0x25D3, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2704, - SMSG_QUERY_CREATURE_RESPONSE = 0x26FB, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26FC, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x2703, + SMSG_QUERY_CREATURE_RESPONSE = 0x26FA, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x26FB, SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B, SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x280B, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FF, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x2701, - SMSG_QUERY_PETITION_RESPONSE = 0x2705, - SMSG_QUERY_PET_NAME_RESPONSE = 0x2703, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x2700, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x280A, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x26FE, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x2700, + SMSG_QUERY_PETITION_RESPONSE = 0x2704, + SMSG_QUERY_PET_NAME_RESPONSE = 0x2702, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x26FF, SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A95, SMSG_QUERY_QUEST_REWARD_RESPONSE = 0x2846, - SMSG_QUERY_TIME_RESPONSE = 0x271B, + SMSG_QUERY_TIME_RESPONSE = 0x271A, SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x2A81, SMSG_QUEST_CONFIRM_ACCEPT = 0x2A8E, SMSG_QUEST_FORCE_REMOVED = 0x2A9B, @@ -1497,56 +1500,57 @@ enum OpcodeServer : uint16 SMSG_QUEST_UPDATE_COMPLETE_BY_SPELL = 0x2A87, SMSG_QUEST_UPDATE_FAILED = 0x2A89, SMSG_QUEST_UPDATE_FAILED_TIMER = 0x2A8A, - SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C9, - SMSG_RAID_DIFFICULTY_SET = 0x27F0, - SMSG_RAID_GROUP_ONLY = 0x27F2, + SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x27C8, + SMSG_RAID_DIFFICULTY_SET = 0x27EF, + SMSG_RAID_GROUP_ONLY = 0x27F1, SMSG_RAID_INSTANCE_MESSAGE = 0x2BB4, SMSG_RAID_MARKERS_CHANGED = 0x25B9, - SMSG_RANDOM_ROLL = 0x264D, + SMSG_RANDOM_ROLL = 0x264C, SMSG_RATED_BATTLEFIELD_INFO = 0x25A6, SMSG_READY_CHECK_COMPLETED = 0x260E, SMSG_READY_CHECK_RESPONSE = 0x260D, SMSG_READY_CHECK_STARTED = 0x260C, - SMSG_READ_ITEM_RESULT_FAILED = 0x27EC, - SMSG_READ_ITEM_RESULT_OK = 0x27E2, - SMSG_REALM_QUERY_RESPONSE = 0x26E6, - SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27CA, - SMSG_REFER_A_FRIEND_EXPIRED = 0x2763, - SMSG_REFER_A_FRIEND_FAILURE = 0x26EC, - SMSG_REFRESH_COMPONENT = 0x2679, + SMSG_READ_ITEM_RESULT_FAILED = 0x27EB, + SMSG_READ_ITEM_RESULT_OK = 0x27E1, + SMSG_REALM_LOOKUP_INFORMATION = 0x2810, + SMSG_REALM_QUERY_RESPONSE = 0x26E5, + SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27C9, + SMSG_REFER_A_FRIEND_EXPIRED = 0x2762, + SMSG_REFER_A_FRIEND_FAILURE = 0x26EB, + SMSG_REFRESH_COMPONENT = 0x2678, SMSG_REFRESH_SPELL_HISTORY = 0x2C2C, SMSG_REMOVE_ITEM_PASSIVE = 0x25C0, - SMSG_REMOVE_LOSS_OF_CONTROL = 0x2698, - SMSG_REPLACE_TROPHY_RESPONSE = 0x2808, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26DA, - SMSG_REQUEST_ADDON_LIST = 0x2660, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x2697, + SMSG_REPLACE_TROPHY_RESPONSE = 0x2807, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26D9, + SMSG_REQUEST_ADDON_LIST = 0x265F, SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259D, SMSG_REQUEST_PVP_BRAWL_INFO_RESPONSE = 0x25D5, SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D4, SMSG_RESEARCH_COMPLETE = 0x2585, - SMSG_RESET_AREA_TRIGGER = 0x2641, + SMSG_RESET_AREA_TRIGGER = 0x2640, SMSG_RESET_COMPRESSION_CONTEXT = 0x304F, - SMSG_RESET_FAILED_NOTIFY = 0x26E2, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x2714, + SMSG_RESET_FAILED_NOTIFY = 0x26E1, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x2713, SMSG_RESET_WEEKLY_CURRENCY = 0x2574, SMSG_RESPEC_WIPE_CONFIRM = 0x2626, SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2571, - SMSG_RESUME_CAST_BAR = 0x2C3D, + SMSG_RESUME_CAST_BAR = 0x2C3E, SMSG_RESUME_COMMS = 0x304B, SMSG_RESUME_TOKEN = 0x25BE, SMSG_RESURRECT_REQUEST = 0x257E, - SMSG_RESYNC_RUNES = 0x273E, + SMSG_RESYNC_RUNES = 0x273D, SMSG_ROLE_CHANGED_INFORM = 0x258C, - SMSG_ROLE_CHOSEN = 0x2A3A, + SMSG_ROLE_CHOSEN = 0x2A39, SMSG_ROLE_POLL_INFORM = 0x258D, SMSG_RUNE_REGEN_DEBUG = 0x25C8, - SMSG_SCENARIO_BOOT = 0x27ED, - SMSG_SCENARIO_COMPLETED = 0x282D, - SMSG_SCENARIO_POIS = 0x2650, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x2649, + SMSG_SCENARIO_BOOT = 0x27EC, + SMSG_SCENARIO_COMPLETED = 0x282C, + SMSG_SCENARIO_POIS = 0x264F, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x2648, SMSG_SCENARIO_SET_SHOULD_SHOW_CRITERIA = 0x283A, SMSG_SCENARIO_SPELL_UPDATE = 0x2839, - SMSG_SCENARIO_STATE = 0x2648, + SMSG_SCENARIO_STATE = 0x2647, SMSG_SCENE_OBJECT_EVENT = 0x25F7, SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FC, SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FD, @@ -1554,149 +1558,150 @@ enum OpcodeServer : uint16 SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x25F8, SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25FB, SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25FA, - SMSG_SCRIPT_CAST = 0x2C54, - SMSG_SELL_RESPONSE = 0x26F0, + SMSG_SCRIPT_CAST = 0x2C55, + SMSG_SELL_RESPONSE = 0x26EF, SMSG_SEND_ITEM_PASSIVES = 0x25C1, SMSG_SEND_KNOWN_SPELLS = 0x2C2A, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x264B, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x264C, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x264A, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x264B, SMSG_SEND_SPELL_CHARGES = 0x2C2D, SMSG_SEND_SPELL_HISTORY = 0x2C2B, SMSG_SEND_UNLEARN_SPELLS = 0x2C2E, SMSG_SERVER_FIRST_ACHIEVEMENT = 0x2BBC, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x266B, - SMSG_SERVER_TIME = 0x26AC, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x266A, + SMSG_SERVER_TIME = 0x26AB, SMSG_SETUP_CURRENCY = 0x2572, SMSG_SETUP_RESEARCH_HISTORY = 0x2584, - SMSG_SET_AI_ANIM_KIT = 0x2772, - SMSG_SET_ALL_TASK_PROGRESS = 0x27D2, - SMSG_SET_ANIM_TIER = 0x2776, + SMSG_SET_AI_ANIM_KIT = 0x2771, + SMSG_SET_ALL_TASK_PROGRESS = 0x27D1, + SMSG_SET_ANIM_TIER = 0x2775, SMSG_SET_CURRENCY = 0x2573, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E, - SMSG_SET_DUNGEON_DIFFICULTY = 0x26CE, - SMSG_SET_FACTION_AT_WAR = 0x273D, - SMSG_SET_FACTION_NOT_VISIBLE = 0x276D, - SMSG_SET_FACTION_STANDING = 0x276E, - SMSG_SET_FACTION_VISIBLE = 0x276C, + SMSG_SET_DUNGEON_DIFFICULTY = 0x26CD, + SMSG_SET_FACTION_AT_WAR = 0x273C, + SMSG_SET_FACTION_NOT_VISIBLE = 0x276C, + SMSG_SET_FACTION_STANDING = 0x276D, + SMSG_SET_FACTION_VISIBLE = 0x276B, SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, - SMSG_SET_FORCED_REACTIONS = 0x275D, + SMSG_SET_FORCED_REACTIONS = 0x275C, SMSG_SET_ITEM_PURCHASE_DATA = 0x25B0, - SMSG_SET_LOOT_METHOD_FAILED = 0x2817, + SMSG_SET_LOOT_METHOD_FAILED = 0x2816, SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B7, - SMSG_SET_MELEE_ANIM_KIT = 0x2775, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x2774, + SMSG_SET_MELEE_ANIM_KIT = 0x2774, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x2773, SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, - SMSG_SET_PET_SPECIALIZATION = 0x2642, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2708, + SMSG_SET_PET_SPECIALIZATION = 0x2641, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2707, SMSG_SET_PLAY_HOVER_ANIM = 0x25CC, - SMSG_SET_PROFICIENCY = 0x2777, + SMSG_SET_PROFICIENCY = 0x2776, SMSG_SET_SPELL_CHARGES = 0x2C29, - SMSG_SET_TASK_COMPLETE = 0x27D3, - SMSG_SET_TIME_ZONE_INFORMATION = 0x26A0, - SMSG_SET_VEHICLE_REC_ID = 0x2730, - SMSG_SHOW_ADVENTURE_MAP = 0x2836, - SMSG_SHOW_BANK = 0x26A9, - SMSG_SHOW_MAILBOX = 0x27EE, + SMSG_SET_TASK_COMPLETE = 0x27D2, + SMSG_SET_TIME_ZONE_INFORMATION = 0x269F, + SMSG_SET_VEHICLE_REC_ID = 0x272F, + SMSG_SHOW_ADVENTURE_MAP = 0x2835, + SMSG_SHOW_BANK = 0x26A8, + SMSG_SHOW_MAILBOX = 0x27ED, SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25F0, - SMSG_SHOW_TAXI_NODES = 0x26F7, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27B3, - SMSG_SOCKET_GEMS = 0x2769, - SMSG_SOCKET_GEMS_FAILURE = 0x276A, - SMSG_SORT_BAGS_RESULT = 0x2825, + SMSG_SHOW_TAXI_NODES = 0x26F6, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27B2, + SMSG_SOCKET_GEMS = 0x2768, + SMSG_SOCKET_GEMS_FAILURE = 0x2769, + SMSG_SORT_BAGS_RESULT = 0x2824, SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25F2, SMSG_SPECIALIZATION_CHANGED = 0x25EC, - SMSG_SPECIAL_MOUNT_ANIM = 0x26C9, - SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2758, + SMSG_SPECIAL_MOUNT_ANIM = 0x26C8, + SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2757, 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 = 0x2C3E, + SMSG_SPELL_DELAYED = 0x2C3F, SMSG_SPELL_DISPELL_LOG = 0x2C1A, SMSG_SPELL_ENERGIZE_LOG = 0x2C1C, - SMSG_SPELL_EXECUTE_LOG = 0x2C3F, - SMSG_SPELL_FAILED_OTHER = 0x2C53, - SMSG_SPELL_FAILURE = 0x2C51, - SMSG_SPELL_FAILURE_MESSAGE = 0x2C58, + SMSG_SPELL_EXECUTE_LOG = 0x2C40, + SMSG_SPELL_FAILED_OTHER = 0x2C54, + SMSG_SPELL_FAILURE = 0x2C52, + SMSG_SPELL_FAILURE_MESSAGE = 0x2C59, SMSG_SPELL_GO = 0x2C39, 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 = 0x2C40, + SMSG_SPELL_MISS_LOG = 0x2C41, 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_SPIRIT_HEALER_CONFIRM = 0x2755, - SMSG_STAND_STATE_UPDATE = 0x275C, + SMSG_SPIRIT_HEALER_CONFIRM = 0x2754, + SMSG_STAND_STATE_UPDATE = 0x275B, SMSG_START_ELAPSED_TIMER = 0x261A, SMSG_START_ELAPSED_TIMERS = 0x261C, SMSG_START_LOOT_ROLL = 0x2631, - SMSG_START_MIRROR_TIMER = 0x274F, + SMSG_START_MIRROR_TIMER = 0x274E, SMSG_START_TIMER = 0x25BB, SMSG_STOP_ELAPSED_TIMER = 0x261B, - SMSG_STOP_MIRROR_TIMER = 0x2751, - SMSG_STOP_SPEAKERBOT_SOUND = 0x27AF, + SMSG_STOP_MIRROR_TIMER = 0x2750, + SMSG_STOP_SPEAKERBOT_SOUND = 0x27AE, SMSG_STREAMING_MOVIES = 0x25BA, - SMSG_SUMMON_CANCEL = 0x26D9, + SMSG_SUMMON_CANCEL = 0x26D8, SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258E, - SMSG_SUMMON_REQUEST = 0x2761, - SMSG_SUPERCEDED_SPELLS = 0x2C4B, + SMSG_SUMMON_REQUEST = 0x2760, + SMSG_SUPERCEDED_SPELLS = 0x2C4C, SMSG_SUSPEND_COMMS = 0x304A, SMSG_SUSPEND_TOKEN = 0x25BD, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2757, - SMSG_TAXI_NODE_STATUS = 0x26A6, - SMSG_TEXT_EMOTE = 0x26A4, - SMSG_THREAT_CLEAR = 0x2710, - SMSG_THREAT_REMOVE = 0x270F, - SMSG_THREAT_UPDATE = 0x270E, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x2756, + SMSG_TAXI_NODE_STATUS = 0x26A5, + SMSG_TEXT_EMOTE = 0x26A3, + SMSG_THREAT_CLEAR = 0x270F, + SMSG_THREAT_REMOVE = 0x270E, + SMSG_THREAT_UPDATE = 0x270D, SMSG_TIME_ADJUSTMENT = 0x2DA1, SMSG_TIME_SYNC_REQUEST = 0x2DA0, - SMSG_TITLE_EARNED = 0x270B, - SMSG_TITLE_LOST = 0x270C, - SMSG_TOTEM_CREATED = 0x26F3, - SMSG_TOTEM_MOVED = 0x26F4, + SMSG_TITLE_EARNED = 0x270A, + SMSG_TITLE_LOST = 0x270B, + SMSG_TOTEM_CREATED = 0x26F2, + SMSG_TOTEM_MOVED = 0x26F3, SMSG_TRADE_STATUS = 0x2581, SMSG_TRADE_UPDATED = 0x2580, - SMSG_TRAINER_BUY_FAILED = 0x2716, - SMSG_TRAINER_LIST = 0x2715, - SMSG_TRANSFER_ABORTED = 0x2741, + SMSG_TRAINER_BUY_FAILED = 0x2715, + SMSG_TRAINER_LIST = 0x2714, + SMSG_TRANSFER_ABORTED = 0x2740, SMSG_TRANSFER_PENDING = 0x25E5, SMSG_TRANSMOG_COLLECTION_UPDATE = 0x25C6, SMSG_TRANSMOG_SET_COLLECTION_UPDATE = 0x25C7, - SMSG_TRIGGER_CINEMATIC = 0x280F, - SMSG_TRIGGER_MOVIE = 0x26F5, - SMSG_TURN_IN_PETITION_RESULT = 0x2792, - SMSG_TUTORIAL_FLAGS = 0x2801, + SMSG_TRIGGER_CINEMATIC = 0x280E, + SMSG_TRIGGER_MOVIE = 0x26F4, + SMSG_TURN_IN_PETITION_RESULT = 0x2791, + SMSG_TUTORIAL_FLAGS = 0x2800, SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x2840, SMSG_TUTORIAL_UNHIGHLIGHT_SPELL = 0x283F, SMSG_TWITTER_STATUS = 0x2FFD, - SMSG_UI_TIME = 0x2754, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2812, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2813, - SMSG_UNLEARNED_SPELLS = 0x2C4D, - SMSG_UPDATE_ACCOUNT_DATA = 0x2749, + SMSG_UI_TIME = 0x2753, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x2811, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x2812, + SMSG_UNLEARNED_SPELLS = 0x2C4E, + SMSG_UPDATE_ACCOUNT_DATA = 0x2748, SMSG_UPDATE_ACTION_BUTTONS = 0x25F5, - SMSG_UPDATE_CHARACTER_FLAGS = 0x2807, - SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x2A31, - SMSG_UPDATE_EXPANSION_LEVEL = 0x2664, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26D1, - SMSG_UPDATE_LAST_INSTANCE = 0x26B2, - SMSG_UPDATE_OBJECT = 0x2810, + SMSG_UPDATE_CELESTIAL_BODY = 0x285E, + SMSG_UPDATE_CHARACTER_FLAGS = 0x2806, + SMSG_UPDATE_EXPANSION_LEVEL = 0x2663, + SMSG_UPDATE_GAME_TIME_STATE = 0x2865, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26D0, + SMSG_UPDATE_LAST_INSTANCE = 0x26B1, + SMSG_UPDATE_OBJECT = 0x280F, SMSG_UPDATE_TALENT_DATA = 0x25EB, - SMSG_UPDATE_TASK_PROGRESS = 0x27D1, + SMSG_UPDATE_TASK_PROGRESS = 0x27D0, SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x2C19, - SMSG_UPDATE_WORLD_STATE = 0x278D, + SMSG_UPDATE_WORLD_STATE = 0x278C, SMSG_USERLIST_ADD = 0x2BB9, SMSG_USERLIST_REMOVE = 0x2BBA, SMSG_USERLIST_UPDATE = 0x2BBB, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x2793, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x2792, SMSG_VENDOR_INVENTORY = 0x25CA, - SMSG_VIGNETTE_UPDATE = 0x27B1, + SMSG_VIGNETTE_UPDATE = 0x27B0, SMSG_VOID_ITEM_SWAP_RESPONSE = 0x25DF, SMSG_VOID_STORAGE_CONTENTS = 0x25DC, SMSG_VOID_STORAGE_FAILED = 0x25DB, @@ -1706,29 +1711,29 @@ enum OpcodeServer : uint16 SMSG_WAIT_QUEUE_UPDATE = 0x256D, SMSG_WARDEN_DATA = 0x2576, SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B4, - SMSG_WEATHER = 0x26D0, + SMSG_WEATHER = 0x26CF, SMSG_WEEKLY_SPELL_USAGE = 0x2C18, SMSG_WHO = 0x2BAE, - SMSG_WHO_IS = 0x26CF, + SMSG_WHO_IS = 0x26CE, SMSG_WORLD_QUEST_UPDATE = 0x2847, SMSG_WORLD_SERVER_INFO = 0x25C2, - SMSG_WORLD_TEXT = 0x282F, - SMSG_WOW_TOKEN_AUCTION_SOLD = 0x281D, - SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x281F, - SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x2820, + SMSG_WORLD_TEXT = 0x282E, + SMSG_WOW_TOKEN_AUCTION_SOLD = 0x281C, + SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x281E, + SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x281F, SMSG_WOW_TOKEN_CAN_REDEEM_FOR_BALANCE_RESULT = 0x2856, - SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x281E, - SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2818, - SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x2819, - SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x281A, - SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2821, - SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2822, - SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2823, - SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x281B, - SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x281C, - SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2824, + SMSG_WOW_TOKEN_CAN_VETERAN_BUY_RESULT = 0x281D, + SMSG_WOW_TOKEN_DISTRIBUTION_GLUE_UPDATE = 0x2817, + SMSG_WOW_TOKEN_DISTRIBUTION_UPDATE = 0x2818, + SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x2819, + SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x2820, + SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x2821, + SMSG_WOW_TOKEN_REDEEM_RESULT = 0x2822, + SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x281A, + SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x281B, + SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x2823, SMSG_XP_GAIN_ABORTED = 0x25E0, - SMSG_XP_GAIN_ENABLED = 0x27F1, + SMSG_XP_GAIN_ENABLED = 0x27F0, SMSG_ZONE_UNDER_ATTACK = 0x2BB5, // Opcodes that are not generated automatically diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 08357f8bc4d..acadaf0d64a 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -112,7 +112,8 @@ WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccoun _accountId(id), _accountName(std::move(name)), _battlenetAccountId(battlenetAccountId), - m_expansion(expansion), + m_accountExpansion(expansion), + m_expansion(std::min<uint8>(expansion, sWorld->getIntConfig(CONFIG_EXPANSION))), _os(os), _battlenetRequestToken(0), _warden(NULL), diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8e9ecabfded..8d8f00483c7 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -936,6 +936,7 @@ class TC_GAME_API WorldSession void SetSecurity(AccountTypes security) { _security = security; } std::string const& GetRemoteAddress() const { return m_Address; } void SetPlayer(Player* player); + uint8 GetAccountExpansion() const { return m_accountExpansion; } uint8 GetExpansion() const { return m_expansion; } std::string const& GetOS() const { return _os; } @@ -1797,6 +1798,7 @@ class TC_GAME_API WorldSession uint32 _accountId; std::string _accountName; uint32 _battlenetAccountId; + uint8 m_accountExpansion; uint8 m_expansion; std::string _os; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index b83742a3346..ff5a587a5be 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -70,9 +70,9 @@ uint8 const WorldSocket::AuthCheckSeed[16] = { 0xC5, 0xC6, 0x98, 0x95, 0x76, 0x3 uint8 const WorldSocket::SessionKeySeed[16] = { 0x58, 0xCB, 0xCF, 0x40, 0xFE, 0x2E, 0xCE, 0xA6, 0x5A, 0x90, 0xB8, 0x01, 0x68, 0x6C, 0x28, 0x0B }; uint8 const WorldSocket::ContinuedSessionSeed[16] = { 0x16, 0xAD, 0x0C, 0xD4, 0x46, 0xF9, 0x4F, 0xB2, 0xEF, 0x7D, 0xEA, 0x2A, 0x17, 0x66, 0x4D, 0x2F }; -uint32 const ClientTypeSeed_Win[4] = { 0xC34F59FE, 0xFF9A7F5E, 0x8A9DD986, 0x97B24A36 }; -uint32 const ClientTypeSeed_Wn64[4] = { 0x4E625212, 0xFAD6CBD8, 0x5D3FD3C7, 0xF335A567 }; -uint32 const ClientTypeSeed_Mc64[4] = { 0x95EFC66, 0x266170B8, 0x3145F79, 0xD8C1C808 }; +uint8 const ClientTypeSeed_Win[16] = { 0x23, 0xC5, 0x9C, 0x59, 0x63, 0xCB, 0xEF, 0x5B, 0x72, 0x8D, 0x13, 0xA5, 0x08, 0x78, 0xDF, 0xCB }; +uint8 const ClientTypeSeed_Wn64[16] = { 0xC7, 0xFF, 0x93, 0x2D, 0x6A, 0x21, 0x74, 0xA3, 0xD5, 0x38, 0xCA, 0x72, 0x12, 0x13, 0x6D, 0x2B }; +uint8 const ClientTypeSeed_Mc64[16] = { 0x21, 0x0B, 0x97, 0x01, 0x49, 0xD6, 0xF5, 0x6C, 0xAC, 0x9B, 0xAD, 0xF2, 0xAA, 0xC9, 0x1E, 0x8E }; WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)), _type(CONNECTION_TYPE_REALM), _key(0), _OverSpeedPings(0), @@ -637,10 +637,6 @@ struct AccountInfo Game.IsBanned = fields[13].GetUInt64() != 0; Game.IsRectuiter = fields[14].GetUInt32() != 0; - uint32 world_expansion = sWorld->getIntConfig(CONFIG_EXPANSION); - if (Game.Expansion > world_expansion) - Game.Expansion = world_expansion; - if (BattleNet.Locale >= TOTAL_LOCALES) BattleNet.Locale = LOCALE_enUS; } @@ -675,11 +671,11 @@ void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth:: SHA256Hash digestKeyHash; digestKeyHash.UpdateData(account.Game.KeyData.data(), account.Game.KeyData.size()); if (account.Game.OS == "Win") - digestKeyHash.UpdateData(reinterpret_cast<uint8 const*>(ClientTypeSeed_Win), 16); + digestKeyHash.UpdateData(ClientTypeSeed_Win, 16); else if (account.Game.OS == "Wn64") - digestKeyHash.UpdateData(reinterpret_cast<uint8 const*>(ClientTypeSeed_Wn64), 16); + digestKeyHash.UpdateData(ClientTypeSeed_Wn64, 16); else if (account.Game.OS == "Mc64") - digestKeyHash.UpdateData(reinterpret_cast<uint8 const*>(ClientTypeSeed_Mc64), 16); + digestKeyHash.UpdateData(ClientTypeSeed_Mc64, 16); digestKeyHash.Finalize(); |