diff options
92 files changed, 1311 insertions, 1184 deletions
diff --git a/sql/base/auth_database.sql b/sql/base/auth_database.sql index 19da747f6fa..cd0f77945c2 100644 --- a/sql/base/auth_database.sql +++ b/sql/base/auth_database.sql @@ -336,6 +336,7 @@ CREATE TABLE `battlenet_account_toys` ( `accountId` int(10) unsigned NOT NULL, `itemId` int(11) NOT NULL DEFAULT '0', `isFavourite` tinyint(1) DEFAULT '0', + `hasFanfare` tinyint(1) DEFAULT '0', PRIMARY KEY (`accountId`,`itemId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; /*!40101 SET character_set_client = @saved_cs_client */; @@ -2193,7 +2194,8 @@ INSERT INTO `updates` VALUES ('2018_06_23_00_auth.sql','BE35312C386A127D047E5A7CE0D14DB41D905F8E','RELEASED','2018-05-23 10:14:39',0), ('2018_06_29_00_auth.sql','03AAEA7E52848FA5522C3F0C6D9C38B988407480','RELEASED','2018-06-29 22:34:04',0), ('2018_12_09_00_auth_2017_01_06_00_auth.sql','6CCFE6A9774EC733C9863D36A0F15F3534189BBD','RELEASED','2018-11-22 22:21:26',0), -('2018_12_09_01_auth.sql','576C2A11BE671D8420FA3EB705E594E381ECCC56','RELEASED','2018-12-09 14:49:17',0); +('2018_12_09_01_auth.sql','576C2A11BE671D8420FA3EB705E594E381ECCC56','RELEASED','2018-12-09 14:49:17',0), +('2019_06_08_00_auth.sql','EA5A78F5A26C17BC790481EA9B3772D3A6912459','RELEASED','2019-05-20 17:21:20',0); /*!40000 ALTER TABLE `updates` ENABLE KEYS */; UNLOCK TABLES; diff --git a/sql/updates/auth/master/2019_06_08_00_auth.sql b/sql/updates/auth/master/2019_06_08_00_auth.sql new file mode 100644 index 00000000000..a979ce76fe6 --- /dev/null +++ b/sql/updates/auth/master/2019_06_08_00_auth.sql @@ -0,0 +1 @@ +ALTER TABLE `battlenet_account_toys` ADD `hasFanfare` tinyint(1) DEFAULT '0' AFTER `isFavourite`; diff --git a/sql/updates/world/master/2019_06_08_00_world.sql b/sql/updates/world/master/2019_06_08_00_world.sql new file mode 100644 index 00000000000..a2538fa77f8 --- /dev/null +++ b/sql/updates/world/master/2019_06_08_00_world.sql @@ -0,0 +1,18 @@ +ALTER TABLE `creature_template` + ADD `FadeRegionRadius` float NOT NULL DEFAULT '0' AFTER `movementId`, + ADD `WidgetSetID` int(11) NOT NULL DEFAULT '0' AFTER `FadeRegionRadius`, + ADD `WidgetSetUnitConditionID` int(11) NOT NULL DEFAULT '0' AFTER `WidgetSetID`; + +ALTER TABLE `playerchoice` ADD `SoundKitId` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UiTextureKitId`; +ALTER TABLE `playerchoice_response` + ADD `UiTextureAtlasElementID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `WidgetSetID`, + ADD `SoundKitID` int(10) unsigned NOT NULL DEFAULT '0' AFTER `UiTextureAtlasElementID`, + ADD `SubHeader` varchar(100) NOT NULL DEFAULT '' AFTER `Header`, + ADD `ButtonTooltip` varchar(400) NOT NULL DEFAULT '' AFTER `SubHeader`, + ADD `RewardQuestID` int(10) unsigned DEFAULT NULL AFTER `Confirmation`; + +ALTER TABLE `playerchoice_response_locale` + ADD `SubHeader` varchar(100) NOT NULL DEFAULT '' AFTER `Header`, + ADD `ButtonTooltip` varchar(400) NOT NULL DEFAULT '' AFTER `SubHeader`; + +ALTER TABLE `quest_template` ADD `ManagedWorldStateID` int(11) NOT NULL DEFAULT '0' AFTER `Expansion`; diff --git a/src/common/Utilities/EnumClassFlag.h b/src/common/Utilities/EnumClassFlag.h index d2e2132605b..4d77b4c5930 100644 --- a/src/common/Utilities/EnumClassFlag.h +++ b/src/common/Utilities/EnumClassFlag.h @@ -39,7 +39,7 @@ public: return left &= right; } - EnumClassFlag operator|=(EnumClassFlag right) + EnumClassFlag& operator|=(EnumClassFlag right) { _value = static_cast<T>(static_cast<std::underlying_type_t<T>>(_value) | static_cast<std::underlying_type_t<T>>(right._value)); return *this; diff --git a/src/server/database/Database/Implementation/LoginDatabase.cpp b/src/server/database/Database/Implementation/LoginDatabase.cpp index c560bfa396e..6c7429d37be 100644 --- a/src/server/database/Database/Implementation/LoginDatabase.cpp +++ b/src/server/database/Database/Implementation/LoginDatabase.cpp @@ -151,8 +151,8 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_UPD_LAST_CHAR_UNDELETE, "UPDATE battlenet_accounts SET LastCharacterUndelete = UNIX_TIMESTAMP() WHERE Id = ?", CONNECTION_ASYNC); // Account wide toys - PrepareStatement(LOGIN_SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite FROM battlenet_account_toys WHERE accountId = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite) VALUES (?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_ACCOUNT_TOYS, "SELECT itemId, isFavourite, hasFanfare FROM battlenet_account_toys WHERE accountId = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_REP_ACCOUNT_TOYS, "REPLACE INTO battlenet_account_toys (accountId, itemId, isFavourite, hasFanfare) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); // Battle Pets PrepareStatement(LOGIN_SEL_BATTLE_PETS, "SELECT guid, species, breed, level, exp, health, quality, flags, name FROM battle_pets WHERE battlenetAccountId = ?", CONNECTION_ASYNC); diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index d13400c5494..74e53d79887 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -347,7 +347,8 @@ namespace }; StorageMap _stores; - std::map<uint64, int32> _hotfixData; + uint32 _hotfixCount = 0; + DB2Manager::HotfixContainer _hotfixData; std::map<std::pair<uint32 /*tableHash*/, int32 /*recordId*/>, std::vector<uint8>> _hotfixBlob; AreaGroupMemberContainer _areaGroupMembers; @@ -1302,7 +1303,7 @@ void DB2Manager::LoadHotfixData() { Field* fields = result->Fetch(); - uint32 id = fields[0].GetUInt32(); + int32 id = fields[0].GetInt32(); uint32 tableHash = fields[1].GetUInt32(); int32 recordId = fields[2].GetInt32(); bool deleted = fields[3].GetBool(); @@ -1313,7 +1314,8 @@ void DB2Manager::LoadHotfixData() } _maxHotfixId = std::max(_maxHotfixId, id); - _hotfixData[MAKE_PAIR64(id, tableHash)] = recordId; + _hotfixData[id].emplace_back(tableHash, recordId); + ++_hotfixCount; deletedRecords[std::make_pair(tableHash, recordId)] = deleted; ++count; } while (result->NextRow()); @@ -1359,7 +1361,12 @@ void DB2Manager::LoadHotfixBlob() TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " hotfix blob records in %u ms", _hotfixBlob.size(), GetMSTimeDiffToNow(oldMSTime)); } -std::map<uint64, int32> const& DB2Manager::GetHotfixData() const +uint32 DB2Manager::GetHotfixCount() const +{ + return _hotfixCount; +} + +DB2Manager::HotfixContainer const& DB2Manager::GetHotfixData() const { return _hotfixData; } @@ -1371,7 +1378,8 @@ std::vector<uint8> const* DB2Manager::GetHotfixBlobData(uint32 tableHash, int32 void DB2Manager::InsertNewHotfix(uint32 tableHash, uint32 recordId) { - _hotfixData[MAKE_PAIR64(tableHash, ++_maxHotfixId)] = recordId; + _hotfixData[++_maxHotfixId].emplace_back(tableHash, recordId); + ++_hotfixCount; } std::vector<uint32> DB2Manager::GetAreasForGroup(uint32 areaGroupId) const diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index 245f8f1f592..2960d4fb185 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -247,6 +247,8 @@ class TC_GAME_API DB2Manager public: DEFINE_DB2_SET_COMPARATOR(MountTypeXCapabilityEntry) + typedef std::map<int32 /*hotfixId*/, std::vector<std::pair<uint32 /*tableHash*/, int32 /*recordId*/>>> HotfixContainer; + typedef std::vector<ItemBonusEntry const*> ItemBonusList; typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyContainer; typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntryComparator> MountTypeXCapabilitySet; @@ -259,7 +261,8 @@ public: void LoadHotfixData(); void LoadHotfixBlob(); - std::map<uint64, int32> const& GetHotfixData() const; + uint32 GetHotfixCount() const; + HotfixContainer const& GetHotfixData() const; std::vector<uint8> const* GetHotfixBlobData(uint32 tableHash, int32 recordId); std::vector<uint32> GetAreasForGroup(uint32 areaGroupId) const; @@ -346,7 +349,7 @@ public: private: friend class DB2HotfixGeneratorBase; void InsertNewHotfix(uint32 tableHash, uint32 recordId); - uint32 _maxHotfixId = 0; + int32 _maxHotfixId = 0; }; #define sDB2Manager DB2Manager::Instance() diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index e96dbd661bd..312b1d403a7 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -550,7 +550,8 @@ enum CharSectionFlags { SECTION_FLAG_PLAYER = 0x01, SECTION_FLAG_DEATH_KNIGHT = 0x04, - SECTION_FLAG_DEMON_HUNTER = 0x20 + SECTION_FLAG_DEMON_HUNTER = 0x20, + SECTION_FLAG_CONDITIONAL = 0x400 }; enum CharSectionType diff --git a/src/server/game/DungeonFinding/LFG.h b/src/server/game/DungeonFinding/LFG.h index 9acd3324c2f..cc12ac71617 100644 --- a/src/server/game/DungeonFinding/LFG.h +++ b/src/server/game/DungeonFinding/LFG.h @@ -99,6 +99,8 @@ enum LfgLockStatusType LFG_LOCKSTATUS_TOO_LOW_GEAR_SCORE = 4, LFG_LOCKSTATUS_TOO_HIGH_GEAR_SCORE = 5, LFG_LOCKSTATUS_RAID_LOCKED = 6, + LFG_LOCKSTATUS_NO_SPEC = 14, + LFG_LOCKSTATUS_HAS_RESTRICTION = 15, LFG_LOCKSTATUS_ATTUNEMENT_TOO_LOW_LEVEL = 1001, LFG_LOCKSTATUS_ATTUNEMENT_TOO_HIGH_LEVEL = 1002, LFG_LOCKSTATUS_QUEST_NOT_COMPLETED = 1022, diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index bd8f1f81c1c..77c1bef1900 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -422,7 +422,7 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons) // Check player or group member restrictions if (!player->GetSession()->HasPermission(rbac::RBAC_PERM_JOIN_DUNGEON_FINDER)) - joinData.result = LFG_JOIN_NO_SLOTS_PLAYER; + joinData.result = LFG_JOIN_NO_SLOTS; else if (player->InBattleground() || player->InArena() || player->InBattlegroundQueue()) joinData.result = LFG_JOIN_CANT_USE_DUNGEONS; else if (player->HasAura(LFG_SPELL_DUNGEON_DESERTER)) @@ -430,9 +430,9 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons) else if (player->HasAura(LFG_SPELL_DUNGEON_COOLDOWN)) joinData.result = LFG_JOIN_RANDOM_COOLDOWN_PLAYER; else if (dungeons.empty()) - joinData.result = LFG_JOIN_NO_SLOTS_PLAYER; + joinData.result = LFG_JOIN_NO_SLOTS; else if (player->HasAura(9454)) // check Freeze debuff - joinData.result = LFG_JOIN_NO_SLOTS_PLAYER; + joinData.result = LFG_JOIN_NO_SLOTS; else if (grp) { if (grp->GetMembersCount() > MAX_GROUP_SIZE) @@ -453,7 +453,10 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons) else if (plrg->InBattleground() || plrg->InArena() || plrg->InBattlegroundQueue()) joinData.result = LFG_JOIN_CANT_USE_DUNGEONS; else if (plrg->HasAura(9454)) // check Freeze debuff - joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS; + { + joinData.result = LFG_JOIN_NO_SLOTS; + joinData.playersMissingRequirement.push_back(&plrg->GetName()); + } ++memberCount; players.insert(plrg->GetGUID()); } @@ -507,9 +510,9 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons) dungeons = GetDungeonsByRandom(rDungeonId); // if we have lockmap then there are no compatible dungeons - GetCompatibleDungeons(dungeons, players, joinData.lockmap, isContinue); + GetCompatibleDungeons(&dungeons, players, &joinData.lockmap, &joinData.playersMissingRequirement, isContinue); if (dungeons.empty()) - joinData.result = grp ? LFG_JOIN_NO_LFG_OBJECT : LFG_JOIN_NO_SLOTS_PLAYER; + joinData.result = LFG_JOIN_NO_SLOTS; } } @@ -782,22 +785,23 @@ void LFGMgr::UpdateRoleCheck(ObjectGuid gguid, ObjectGuid guid /* = ObjectGuid:: @param[in] players Set of players to check their dungeon restrictions @param[out] lockMap Map of players Lock status info of given dungeons (Empty if dungeons is not empty) */ -void LFGMgr::GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& players, LfgLockPartyMap& lockMap, bool isContinue) +void LFGMgr::GetCompatibleDungeons(LfgDungeonSet* dungeons, GuidSet const& players, LfgLockPartyMap* lockMap, std::vector<std::string const*>* playersMissingRequirement, bool isContinue) { - lockMap.clear(); + lockMap->clear(); std::map<uint32, uint32> lockedDungeons; + std::unordered_set<uint32> dungeonsToRemove; - for (GuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons.empty(); ++it) + for (GuidSet::const_iterator it = players.begin(); it != players.end() && !dungeons->empty(); ++it) { ObjectGuid guid = (*it); - LfgLockMap const& cachedLockMap = GetLockedDungeons(guid); + LfgLockMap cachedLockMap = GetLockedDungeons(guid); Player* player = ObjectAccessor::FindConnectedPlayer(guid); - for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons.empty(); ++it2) + for (LfgLockMap::const_iterator it2 = cachedLockMap.begin(); it2 != cachedLockMap.end() && !dungeons->empty(); ++it2) { uint32 dungeonId = (it2->first & 0x00FFFFFF); // Compare dungeon ids - LfgDungeonSet::iterator itDungeon = dungeons.find(dungeonId); - if (itDungeon != dungeons.end()) + LfgDungeonSet::iterator itDungeon = dungeons->find(dungeonId); + if (itDungeon != dungeons->end()) { bool eraseDungeon = true; @@ -822,14 +826,19 @@ void LFGMgr::GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& playe } if (eraseDungeon) - dungeons.erase(itDungeon); + dungeonsToRemove.insert(dungeonId); - lockMap[guid][dungeonId] = it2->second; + (*lockMap)[guid][dungeonId] = it2->second; + playersMissingRequirement->push_back(&player->GetName()); } } } - if (!dungeons.empty()) - lockMap.clear(); + + for (uint32 dungeonIdToRemove : dungeonsToRemove) + dungeons->erase(dungeonIdToRemove); + + if (!dungeons->empty()) + lockMap->clear(); } /** @@ -1601,7 +1610,7 @@ LfgDungeonSet const& LFGMgr::GetSelectedDungeons(ObjectGuid guid) return PlayersStore[guid].GetSelectedDungeons(); } -LfgLockMap const LFGMgr::GetLockedDungeons(ObjectGuid guid) +LfgLockMap LFGMgr::GetLockedDungeons(ObjectGuid guid) { TC_LOG_TRACE("lfg.data.player.dungeons.locked.get", "Player: %s, LockedDungeons.", guid.ToString().c_str()); LfgLockMap lock; diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 8cb332d3e45..0107d9adcfb 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -112,7 +112,7 @@ enum LfgJoinResult LFG_JOIN_OK = 0x00, // Joined (no client msg) LFG_JOIN_GROUP_FULL = 0x1F, // Your group is already full. LFG_JOIN_NO_LFG_OBJECT = 0x21, // Internal LFG Error. - LFG_JOIN_NO_SLOTS_PLAYER = 0x22, // You do not meet the requirements for the chosen dungeons. + LFG_JOIN_NO_SLOTS = 0x22, // You do not meet the requirements for the chosen dungeons. LFG_JOIN_MISMATCHED_SLOTS = 0x23, // You cannot mix dungeons, raids, and random when picking dungeons. LFG_JOIN_PARTY_PLAYERS_FROM_DIFFERENT_REALMS = 0x24, // The dungeon you chose does not support players from multiple realms. LFG_JOIN_MEMBERS_NOT_PRESENT = 0x25, // One or more group members are pending invites or disconnected. @@ -177,6 +177,7 @@ struct LfgJoinResultData LfgJoinResult result; LfgRoleCheckState state; LfgLockPartyMap lockmap; + std::vector<std::string const*> playersMissingRequirement; }; // Data needed by SMSG_LFG_UPDATE_STATUS @@ -386,7 +387,7 @@ class TC_GAME_API LFGMgr // LFGHandler /// Get locked dungeons - LfgLockMap const GetLockedDungeons(ObjectGuid guid); + LfgLockMap GetLockedDungeons(ObjectGuid guid); /// Returns current lfg status LfgUpdateData GetLfgStatus(ObjectGuid guid); /// Checks if Seasonal dungeon is active @@ -447,7 +448,7 @@ class TC_GAME_API LFGMgr void SetState(ObjectGuid guid, LfgState state); void SetVoteKick(ObjectGuid gguid, bool active); void RemovePlayerData(ObjectGuid guid); - void GetCompatibleDungeons(LfgDungeonSet& dungeons, GuidSet const& players, LfgLockPartyMap& lockMap, bool isContinue); + void GetCompatibleDungeons(LfgDungeonSet* dungeons, GuidSet const& players, LfgLockPartyMap* lockMap, std::vector<std::string const*>* playersMissingRequirement, bool isContinue); void _SaveToDB(ObjectGuid guid, uint32 db_guid); LFGDungeonData const* GetLFGDungeon(uint32 id); diff --git a/src/server/game/Entities/Creature/CreatureData.h b/src/server/game/Entities/Creature/CreatureData.h index 36715732e48..01c19a2e8d1 100644 --- a/src/server/game/Entities/Creature/CreatureData.h +++ b/src/server/game/Entities/Creature/CreatureData.h @@ -379,6 +379,9 @@ struct TC_GAME_API CreatureTemplate float ModExperience; bool RacialLeader; uint32 movementId; + float FadeRegionRadius; + int32 WidgetSetID; + int32 WidgetSetUnitConditionID; bool RegenHealth; uint32 MechanicImmuneMask; uint32 flags_extra; diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index a157035a06b..af16870c6d5 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1707,11 +1707,8 @@ bool Item::HasStats() const return false; } -bool Item::HasStats(WorldPackets::Item::ItemInstance const& itemInstance, BonusData const* bonus) +bool Item::HasStats(WorldPackets::Item::ItemInstance const& /*itemInstance*/, BonusData const* bonus) { - if (itemInstance.RandomPropertiesID != 0) - return true; - for (uint8 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) if (bonus->ItemStatAllocation[i] != 0) return true; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 392d418a3e7..ca25867df39 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -424,14 +424,14 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const if (HasFall) { - *data << uint32(unit->m_movementInfo.jump.fallTime); // Time - *data << float(unit->m_movementInfo.jump.zspeed); // JumpVelocity + *data << uint32(unit->m_movementInfo.jump.fallTime); // Time + *data << float(unit->m_movementInfo.jump.zspeed); // JumpVelocity if (data->WriteBit(HasFallDirection)) { - *data << float(unit->m_movementInfo.jump.sinAngle); // Direction + *data << float(unit->m_movementInfo.jump.sinAngle); // Direction *data << float(unit->m_movementInfo.jump.cosAngle); - *data << float(unit->m_movementInfo.jump.xyspeed); // Speed + *data << float(unit->m_movementInfo.jump.xyspeed); // Speed } } @@ -445,7 +445,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, CreateObjectBits flags) const *data << float(unit->GetSpeed(MOVE_TURN_RATE)); *data << float(unit->GetSpeed(MOVE_PITCH_RATE)); - *data << uint32(0); // unit->m_movementInfo.forces.size() + *data << uint32(0); // unit->m_movementInfo.forces.size() + + *data << float(1.0f); // MovementForcesModMagnitude data->WriteBit(HasSpline); data->FlushBits(); diff --git a/src/server/game/Entities/Player/CollectionMgr.cpp b/src/server/game/Entities/Player/CollectionMgr.cpp index 8ee265ab53b..8ec7d65551b 100644 --- a/src/server/game/Entities/Player/CollectionMgr.cpp +++ b/src/server/game/Entities/Player/CollectionMgr.cpp @@ -70,6 +70,21 @@ void CollectionMgr::LoadMountDefinitions() TC_LOG_INFO("server.loading", ">> Loaded " SZFMTD " mount definitions in %u ms", FactionSpecificMounts.size(), GetMSTimeDiffToNow(oldMSTime)); } +namespace +{ + EnumClassFlag<ToyFlags> GetToyFlags(bool isFavourite, bool hasFanfare) + { + EnumClassFlag<ToyFlags> flags(ToyFlags::None); + if (isFavourite) + flags |= ToyFlags::Favorite; + + if (hasFanfare) + flags |= ToyFlags::HasFanfare; + + return flags; + } +} + CollectionMgr::CollectionMgr(WorldSession* owner) : _owner(owner), _appearances(Trinity::make_unique<boost::dynamic_bitset<uint32>>()) { } @@ -84,9 +99,9 @@ void CollectionMgr::LoadToys() _owner->GetPlayer()->AddDynamicValue(ACTIVE_PLAYER_DYNAMIC_FIELD_TOYS, t.first); } -bool CollectionMgr::AddToy(uint32 itemId, bool isFavourite /*= false*/) +bool CollectionMgr::AddToy(uint32 itemId, bool isFavourite, bool hasFanfare) { - if (UpdateAccountToys(itemId, isFavourite)) + if (UpdateAccountToys(itemId, isFavourite, hasFanfare)) { _owner->GetPlayer()->AddDynamicValue(ACTIVE_PLAYER_DYNAMIC_FIELD_TOYS, itemId); return true; @@ -104,9 +119,7 @@ void CollectionMgr::LoadAccountToys(PreparedQueryResult result) { Field* fields = result->Fetch(); uint32 itemId = fields[0].GetUInt32(); - bool isFavourite = fields[1].GetBool(); - - _toys[itemId] = isFavourite; + _toys[itemId] = GetToyFlags(fields[1].GetBool(), fields[2].GetBool()); } while (result->NextRow()); } @@ -118,14 +131,15 @@ void CollectionMgr::SaveAccountToys(SQLTransaction& trans) stmt = LoginDatabase.GetPreparedStatement(LOGIN_REP_ACCOUNT_TOYS); stmt->setUInt32(0, _owner->GetBattlenetAccountId()); stmt->setUInt32(1, toy.first); - stmt->setBool(2, toy.second); + stmt->setBool(2, toy.second.HasFlag(ToyFlags::Favorite)); + stmt->setBool(3, toy.second.HasFlag(ToyFlags::HasFanfare)); trans->Append(stmt); } } -bool CollectionMgr::UpdateAccountToys(uint32 itemId, bool isFavourite /*= false*/) +bool CollectionMgr::UpdateAccountToys(uint32 itemId, bool isFavourite, bool hasFanfare) { - return _toys.insert(ToyBoxContainer::value_type(itemId, isFavourite)).second; + return _toys.insert(ToyBoxContainer::value_type(itemId, GetToyFlags(isFavourite, hasFanfare))).second; } void CollectionMgr::ToySetFavorite(uint32 itemId, bool favorite) @@ -134,7 +148,19 @@ void CollectionMgr::ToySetFavorite(uint32 itemId, bool favorite) if (itr == _toys.end()) return; - itr->second = favorite; + if (favorite) + itr->second |= ToyFlags::Favorite; + else + itr->second.RemoveFlag(ToyFlags::Favorite); +} + +void CollectionMgr::ToyClearFanfare(uint32 itemId) +{ + auto itr = _toys.find(itemId); + if (itr == _toys.end()) + return; + + itr->second.RemoveFlag(ToyFlags::HasFanfare); } void CollectionMgr::OnItemAdded(Item* item) diff --git a/src/server/game/Entities/Player/CollectionMgr.h b/src/server/game/Entities/Player/CollectionMgr.h index 5894e32cc77..5f3d054424b 100644 --- a/src/server/game/Entities/Player/CollectionMgr.h +++ b/src/server/game/Entities/Player/CollectionMgr.h @@ -20,6 +20,7 @@ #include "Define.h" #include "DatabaseEnvFwd.h" +#include "EnumClassFlag.h" #include "ObjectGuid.h" #include <boost/dynamic_bitset_fwd.hpp> #include <map> @@ -53,7 +54,14 @@ struct HeirloomData uint32 bonusId; }; -typedef std::map<uint32, bool> ToyBoxContainer; +enum class ToyFlags : uint32 +{ + None = 0, + Favorite = 0x01, + HasFanfare = 0x02 +}; + +typedef std::map<uint32, EnumClassFlag<ToyFlags>> ToyBoxContainer; typedef std::map<uint32, HeirloomData> HeirloomContainer; enum MountStatusFlags : uint8 @@ -79,9 +87,10 @@ public: void LoadAccountToys(PreparedQueryResult result); void SaveAccountToys(SQLTransaction& trans); void ToySetFavorite(uint32 itemId, bool favorite); + void ToyClearFanfare(uint32 itemId); - bool AddToy(uint32 itemId, bool isFavourite /*= false*/); - bool UpdateAccountToys(uint32 itemId, bool isFavourite /*= false*/); + bool AddToy(uint32 itemId, bool isFavourite, bool hasFanfare); + bool UpdateAccountToys(uint32 itemId, bool isFavourite, bool hasFanfare); bool HasToy(uint32 itemId) const { return _toys.count(itemId) > 0; } ToyBoxContainer const& GetAccountToys() const { return _toys; } diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 0e0592eb3b2..3e92e1f2a5c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -92,7 +92,7 @@ #include "QuestDef.h" #include "QuestObjectiveCriteriaMgr.h" #include "QuestPackets.h" -#include "Realm.h" +#include "RealmList.h" #include "ReputationMgr.h" #include "RestMgr.h" #include "Scenario.h" @@ -2766,7 +2766,7 @@ void Player::SendMailResult(uint32 mailId, MailResponseType mailAction, MailResp void Player::SendNewMail() const { // deliver undelivered mail - WorldPackets::Mail::NotifyRecievedMail notify; + WorldPackets::Mail::NotifyReceivedMail notify; notify.Delay = 0.0f; GetSession()->SendPacket(notify.Write()); @@ -6765,6 +6765,7 @@ void Player::ModifyCurrency(uint32 id, int32 count, bool printLog/* = true*/, bo packet.WeeklyQuantity = newWeekCount; packet.TrackedQuantity = newTrackedCount; packet.Flags = itr->second.Flags; + packet.QuantityChange = count; GetSession()->SendPacket(packet.Write()); } @@ -8224,7 +8225,7 @@ void Player::RemoveAELootedObject(ObjectGuid const& lootObjectGuid) bool Player::HasLootWorldObjectGUID(ObjectGuid const& lootWorldObjectGuid) const { - return m_AELootView.end() != std::find_if(m_AELootView.begin(), m_AELootView.end(), [&lootWorldObjectGuid](std::pair<ObjectGuid, ObjectGuid> const& lootView) + return m_AELootView.end() != std::find_if(m_AELootView.begin(), m_AELootView.end(), [&lootWorldObjectGuid](std::pair<ObjectGuid const, ObjectGuid> const& lootView) { return lootView.second == lootWorldObjectGuid; }); @@ -20067,7 +20068,7 @@ void Player::SaveToDB(bool create /*=false*/) stmt->setUInt8(index++, GetByteValue(ACTIVE_PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES)); stmt->setUInt32(index++, m_grantableLevels); - stmt->setUInt32(index++, realm.Build); + stmt->setUInt32(index++, sRealmList->GetMinorMajorBugfixVersionForBuild(realm.Build)); } else { @@ -27586,6 +27587,7 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) displayPlayerChoice.SenderGUID = sender; displayPlayerChoice.ChoiceID = choiceId; displayPlayerChoice.UiTextureKitID = playerChoice->UiTextureKitId; + displayPlayerChoice.SoundKitID = playerChoice->SoundKitId; displayPlayerChoice.Question = playerChoice->Question; if (playerChoiceLocale) ObjectMgr::GetLocaleString(playerChoiceLocale->Question, locale, displayPlayerChoice.Question); @@ -27603,9 +27605,13 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) playerChoiceResponse.ChoiceArtFileID = playerChoiceResponseTemplate.ChoiceArtFileId; playerChoiceResponse.Flags = playerChoiceResponseTemplate.Flags; playerChoiceResponse.WidgetSetID = playerChoiceResponseTemplate.WidgetSetID; + playerChoiceResponse.UiTextureAtlasElementID = playerChoiceResponseTemplate.UiTextureAtlasElementID; + playerChoiceResponse.SoundKitID = playerChoiceResponseTemplate.SoundKitID; playerChoiceResponse.GroupID = playerChoiceResponseTemplate.GroupID; playerChoiceResponse.Answer = playerChoiceResponseTemplate.Answer; playerChoiceResponse.Header = playerChoiceResponseTemplate.Header; + playerChoiceResponse.SubHeader = playerChoiceResponseTemplate.SubHeader; + playerChoiceResponse.ButtonTooltip = playerChoiceResponseTemplate.ButtonTooltip; playerChoiceResponse.Description = playerChoiceResponseTemplate.Description; playerChoiceResponse.Confirmation = playerChoiceResponseTemplate.Confirmation; if (playerChoiceLocale) @@ -27614,6 +27620,8 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) { ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Answer, locale, playerChoiceResponse.Answer); ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Header, locale, playerChoiceResponse.Header); + ObjectMgr::GetLocaleString(playerChoiceResponseLocale->SubHeader, locale, playerChoiceResponse.SubHeader); + ObjectMgr::GetLocaleString(playerChoiceResponseLocale->ButtonTooltip, locale, playerChoiceResponse.ButtonTooltip); ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Description, locale, playerChoiceResponse.Description); ObjectMgr::GetLocaleString(playerChoiceResponseLocale->Confirmation, locale, playerChoiceResponse.Confirmation); } @@ -27657,6 +27665,8 @@ void Player::SendPlayerChoice(ObjectGuid sender, int32 choiceId) rewardEntry.Quantity = faction.Quantity; } } + + playerChoiceResponse.RewardQuestID = playerChoiceResponseTemplate.RewardQuestID; } SendDirectMessage(displayPlayerChoice.Write()); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index b2c46670849..c9bc2b7d020 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1029,15 +1029,6 @@ private: SpecializationInfo& operator=(SpecializationInfo const&) = delete; }; -#pragma pack(push, 1) -struct PlayerDynamicFieldSpellModByLabel -{ - uint32 Mod; - float Value; - uint32 Label; -}; -#pragma pack(pop) - uint32 constexpr PLAYER_MAX_HONOR_LEVEL = 500; uint8 constexpr PLAYER_LEVEL_MIN_HONOR = 110; uint32 constexpr SPELL_PVP_RULES_ENABLED = 134735; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c5d40871d7d..7835d0e002a 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -11901,7 +11901,7 @@ void Unit::SendPlayOrphanSpellVisual(ObjectGuid const& target, uint32 spellVisua playOrphanSpellVisual.SpellVisualID = spellVisualId; playOrphanSpellVisual.TravelSpeed = travelSpeed; playOrphanSpellVisual.SpeedAsTime = speedAsTime; - playOrphanSpellVisual.UnkZero = 0.0f; + playOrphanSpellVisual.LaunchDelay = 0.0f; SendMessageToSet(playOrphanSpellVisual.Write(), true); } @@ -11915,7 +11915,7 @@ void Unit::SendPlayOrphanSpellVisual(Position const& targetLocation, uint32 spel playOrphanSpellVisual.SpellVisualID = spellVisualId; playOrphanSpellVisual.TravelSpeed = travelSpeed; playOrphanSpellVisual.SpeedAsTime = speedAsTime; - playOrphanSpellVisual.UnkZero = 0.0f; + playOrphanSpellVisual.LaunchDelay = 0.0f; SendMessageToSet(playOrphanSpellVisual.Write(), true); } @@ -11940,12 +11940,12 @@ void Unit::SendPlaySpellVisual(ObjectGuid const& targetGuid, uint32 spellVisualI SendMessageToSet(playSpellVisual.Write(), true); } -void Unit::SendPlaySpellVisual(Position const& targetPosition, float o, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/) +void Unit::SendPlaySpellVisual(Position const& targetPosition, float launchDelay, uint32 spellVisualId, uint16 missReason, uint16 reflectStatus, float travelSpeed, bool speedAsTime /*= false*/) { WorldPackets::Spells::PlaySpellVisual playSpellVisual; playSpellVisual.Source = GetGUID(); playSpellVisual.TargetPosition = targetPosition; // exclusive with Target - playSpellVisual.Orientation = o; + playSpellVisual.LaunchDelay = launchDelay; playSpellVisual.SpellVisualID = spellVisualId; playSpellVisual.TravelSpeed = travelSpeed; playSpellVisual.MissReason = missReason; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 8ad7d0b14ae..624b42737e1 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -426,8 +426,10 @@ void ObjectMgr::LoadCreatureTemplates() "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, " // 60 61 62 63 64 65 66 67 68 "InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, " - // 69 70 71 72 73 74 - "RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template"); + // 69 70 71 72 73 74 75 76 + "RacialLeader, movementId, FadeRegionRadius, WidgetSetID, WidgetSetUnitConditionID, RegenHealth, mechanic_immune_mask, flags_extra, " + // 77 + "ScriptName FROM creature_template"); if (!result) { @@ -525,10 +527,13 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) creatureTemplate.ModExperience = fields[68].GetFloat(); creatureTemplate.RacialLeader = fields[69].GetBool(); creatureTemplate.movementId = fields[70].GetUInt32(); - creatureTemplate.RegenHealth = fields[71].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[72].GetUInt32(); - creatureTemplate.flags_extra = fields[73].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[74].GetString()); + creatureTemplate.FadeRegionRadius = fields[71].GetFloat(); + creatureTemplate.WidgetSetID = fields[72].GetInt32(); + creatureTemplate.WidgetSetUnitConditionID = fields[73].GetInt32(); + creatureTemplate.RegenHealth = fields[74].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[75].GetUInt32(); + creatureTemplate.flags_extra = fields[76].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[77].GetString()); } void ObjectMgr::LoadCreatureTemplateModels() @@ -3963,9 +3968,9 @@ void ObjectMgr::LoadQuests() "RewardFactionID5, RewardFactionValue5, RewardFactionOverride5, RewardFactionCapIn5, RewardFactionFlags, " //96 97 98 99 100 101 102 103 "RewardCurrencyID1, RewardCurrencyQty1, RewardCurrencyID2, RewardCurrencyQty2, RewardCurrencyID3, RewardCurrencyQty3, RewardCurrencyID4, RewardCurrencyQty4, " - //104 105 106 107 108 109 110 - "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, " - //111 112 113 114 115 116 117 118 119 + //104 105 106 107 108 109 110 111 + "AcceptedSoundKitID, CompleteSoundKitID, AreaGroupID, TimeAllowed, AllowableRaces, TreasurePickerID, Expansion, ManagedWorldStateID, " + //112 113 114 115 116 117 118 119 120 "LogTitle, LogDescription, QuestDescription, AreaDescription, PortraitGiverText, PortraitGiverName, PortraitTurnInText, PortraitTurnInName, QuestCompletionLog" " FROM quest_template"); if (!result) @@ -10101,7 +10106,7 @@ void ObjectMgr::LoadPlayerChoices() uint32 oldMSTime = getMSTime(); _playerChoices.clear(); - QueryResult choices = WorldDatabase.Query("SELECT ChoiceId, UiTextureKitId, Question, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice"); + QueryResult choices = WorldDatabase.Query("SELECT ChoiceId, UiTextureKitId, SoundKitId, Question, HideWarboardHeader, KeepOpenAfterChoice FROM playerchoice"); if (!choices) { @@ -10124,13 +10129,14 @@ void ObjectMgr::LoadPlayerChoices() PlayerChoice& choice = _playerChoices[choiceId]; choice.ChoiceId = choiceId; choice.UiTextureKitId = fields[1].GetInt32(); - choice.Question = fields[2].GetString(); - choice.HideWarboardHeader = fields[3].GetBool(); - choice.KeepOpenAfterChoice = fields[4].GetBool(); + choice.SoundKitId = fields[2].GetUInt32(); + choice.Question = fields[3].GetString(); + choice.HideWarboardHeader = fields[4].GetBool(); + choice.KeepOpenAfterChoice = fields[5].GetBool(); } while (choices->NextRow()); - if (QueryResult responses = WorldDatabase.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Flags, WidgetSetID, GroupID, Header, Answer, Description, Confirmation FROM playerchoice_response ORDER BY `Index` ASC")) + if (QueryResult responses = WorldDatabase.Query("SELECT ChoiceId, ResponseId, ChoiceArtFileId, Flags, WidgetSetID, UiTextureAtlasElementID, SoundKitID, GroupID, Answer, Header, SubHeader, ButtonTemplate, Description, Confirmation, RewardQuestID FROM playerchoice_response ORDER BY `Index` ASC")) { do { @@ -10153,11 +10159,18 @@ void ObjectMgr::LoadPlayerChoices() response.ChoiceArtFileId = fields[2].GetInt32(); response.Flags = fields[3].GetInt32(); response.WidgetSetID = fields[4].GetUInt32(); - response.GroupID = fields[5].GetUInt8(); - response.Header = fields[6].GetString(); - response.Answer = fields[7].GetString(); - response.Description = fields[8].GetString(); - response.Confirmation = fields[9].GetString(); + response.UiTextureAtlasElementID = fields[5].GetUInt32(); + response.SoundKitID = fields[6].GetUInt32(); + response.GroupID = fields[7].GetUInt8(); + response.Answer = fields[8].GetString(); + response.Header = fields[9].GetString(); + response.SubHeader = fields[10].GetString(); + response.ButtonTooltip = fields[11].GetString(); + response.Description = fields[12].GetString(); + response.Confirmation = fields[13].GetString(); + if (!fields[14].IsNull()) + response.RewardQuestID = fields[14].GetUInt32(); + ++responseCount; } while (responses->NextRow()); @@ -10404,8 +10417,8 @@ void ObjectMgr::LoadPlayerChoicesLocale() oldMSTime = getMSTime(); - // 0 1 2 3 4 5 6 - if (QueryResult result = WorldDatabase.Query("SELECT ChoiceID, ResponseID, locale, Header, Answer, Description, Confirmation FROM playerchoice_response_locale")) + // 0 1 2 3 4 5 6 7 8 + if (QueryResult result = WorldDatabase.Query("SELECT ChoiceID, ResponseID, locale, Answer, Header, SubHeader, ButtonTooltip, Description, Confirmation FROM playerchoice_response_locale")) { std::size_t count = 0; do @@ -10437,10 +10450,12 @@ void ObjectMgr::LoadPlayerChoicesLocale() continue; PlayerChoiceResponseLocale& data = itr->second.Responses[responseId]; - AddLocaleString(fields[3].GetString(), locale, data.Header); - AddLocaleString(fields[4].GetString(), locale, data.Answer); - AddLocaleString(fields[5].GetString(), locale, data.Description); - AddLocaleString(fields[6].GetString(), locale, data.Confirmation); + AddLocaleString(fields[3].GetString(), locale, data.Answer); + AddLocaleString(fields[4].GetString(), locale, data.Header); + AddLocaleString(fields[5].GetString(), locale, data.SubHeader); + AddLocaleString(fields[6].GetString(), locale, data.ButtonTooltip); + AddLocaleString(fields[7].GetString(), locale, data.Description); + AddLocaleString(fields[8].GetString(), locale, data.Confirmation); ++count; } while (result->NextRow()); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index fb195e123b6..0aa19c37287 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -520,6 +520,8 @@ struct PlayerChoiceResponseLocale { std::vector<std::string> Answer; std::vector<std::string> Header; + std::vector<std::string> SubHeader; + std::vector<std::string> ButtonTooltip; std::vector<std::string> Description; std::vector<std::string> Confirmation; }; @@ -795,18 +797,24 @@ struct PlayerChoiceResponse int32 ChoiceArtFileId; int32 Flags; uint32 WidgetSetID; + uint32 UiTextureAtlasElementID = 0; + uint32 SoundKitID = 0; uint8 GroupID; - std::string Header; std::string Answer; + std::string Header; + std::string SubHeader; + std::string ButtonTooltip; std::string Description; std::string Confirmation; Optional<PlayerChoiceResponseReward> Reward; + Optional<uint32> RewardQuestID; }; struct PlayerChoice { int32 ChoiceId; int32 UiTextureKitId; + uint32 SoundKitId; std::string Question; std::vector<PlayerChoiceResponse> Responses; bool HideWarboardHeader; diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index 8871d179a6c..c0b5d775642 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -585,13 +585,8 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R player->SetPartyType(m_groupCategory, GROUP_TYPE_NONE); - WorldPacket data; - if (method == GROUP_REMOVEMETHOD_KICK || method == GROUP_REMOVEMETHOD_KICK_LFG) - { - data.Initialize(SMSG_GROUP_UNINVITE, 0); - player->GetSession()->SendPacket(&data); - } + player->SendDirectMessage(WorldPackets::Party::GroupUninvite().Write()); _homebindIfInstance(player); } diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index c8f95d6f242..6de90abd781 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -1355,10 +1355,11 @@ void Guild::HandleRoster(WorldSession* session) session->SendPacket(roster.Write()); } -void Guild::SendQueryResponse(WorldSession* session) +void Guild::SendQueryResponse(WorldSession* session, ObjectGuid const& playerGuid) { WorldPackets::Guild::QueryGuildInfoResponse response; response.GuildGuid = GetGUID(); + response.PlayerGuid = playerGuid; response.Info = boost::in_place(); response.Info->GuildGUID = GetGUID(); @@ -1507,7 +1508,7 @@ void Guild::HandleSetEmblem(WorldSession* session, const EmblemInfo& emblemInfo) SendSaveEmblemResult(session, ERR_GUILDEMBLEM_SUCCESS); // "Guild Emblem saved." - SendQueryResponse(session); + SendQueryResponse(session, ObjectGuid::Empty); } } diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index b39d258b438..d29f24785a5 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -754,7 +754,7 @@ class TC_GAME_API Guild // Handle client commands void HandleRoster(WorldSession* session); - void SendQueryResponse(WorldSession* session); + void SendQueryResponse(WorldSession* session, ObjectGuid const& playerGuid); void HandleSetAchievementTracking(WorldSession* session, std::set<uint32> const& achievementIds); void HandleGetAchievementMembers(WorldSession* session, uint32 achievementId) const; void HandleSetMOTD(WorldSession* session, std::string const& motd); diff --git a/src/server/game/Handlers/ArenaTeamHandler.cpp b/src/server/game/Handlers/ArenaTeamHandler.cpp deleted file mode 100644 index 81daf20c389..00000000000 --- a/src/server/game/Handlers/ArenaTeamHandler.cpp +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2008-2019 TrinityCore <https://www.trinitycore.org/> - * Copyright (C) 2005-2009 MaNGOS <http://getmangos.com/> - * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by the - * Free Software Foundation; either version 2 of the License, or (at your - * option) any later version. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for - * more details. - * - * You should have received a copy of the GNU General Public License along - * with this program. If not, see <http://www.gnu.org/licenses/>. - */ - -#include "Player.h" -#include "WorldPacket.h" -#include "WorldSession.h" -#include "Opcodes.h" - -void WorldSession::SendNotInArenaTeamPacket(uint8 type) -{ - WorldPacket data(SMSG_ARENA_ERROR, 4+1); - uint32 error = 0; - data << uint32(error); // 0 = ERR_ARENA_NO_TEAM_II, 1 = ERR_ARENA_EXPIRED_CAIS, 2 = ERR_LFG_CANT_USE_BATTLEGROUND - if (!error) - data << uint8(type); // team type (2=2v2, 3=3v3, 5=5v5), can be used for custom types... - SendPacket(&data); -} - -/* -+ERR_ARENA_NO_TEAM_II "You are not in a %dv%d arena team" - -+ERR_ARENA_TEAM_CREATE_S "%s created. To disband, use /teamdisband [2v2, 3v3, 5v5]." -+ERR_ARENA_TEAM_INVITE_SS "You have invited %s to join %s" -+ERR_ARENA_TEAM_QUIT_S "You are no longer a member of %s" -ERR_ARENA_TEAM_FOUNDER_S "Congratulations, you are a founding member of %s! To leave, use /teamquit [2v2, 3v3, 5v5]." - -+ERR_ARENA_TEAM_INTERNAL "Internal arena team error" -+ERR_ALREADY_IN_ARENA_TEAM "You are already in an arena team of that size" -+ERR_ALREADY_IN_ARENA_TEAM_S "%s is already in an arena team of that size" -+ERR_INVITED_TO_ARENA_TEAM "You have already been invited into an arena team" -+ERR_ALREADY_INVITED_TO_ARENA_TEAM_S "%s has already been invited to an arena team" -+ERR_ARENA_TEAM_NAME_INVALID "That name contains invalid characters, please enter a new name" -+ERR_ARENA_TEAM_NAME_EXISTS_S "There is already an arena team named \"%s\"" -+ERR_ARENA_TEAM_LEADER_LEAVE_S "You must promote a new team captain using /teamcaptain before leaving the team" -+ERR_ARENA_TEAM_PERMISSIONS "You don't have permission to do that" -+ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM "You are not in an arena team of that size" -+ERR_ARENA_TEAM_PLAYER_NOT_IN_TEAM_SS "%s is not in %s" -+ERR_ARENA_TEAM_PLAYER_NOT_FOUND_S "\"%s\" not found" -+ERR_ARENA_TEAM_NOT_ALLIED "You cannot invite players from the opposing alliance" - -+ERR_ARENA_TEAM_JOIN_SS "%s has joined %s" -+ERR_ARENA_TEAM_YOU_JOIN_S "You have joined %s. To leave, use /teamquit [2v2, 3v3, 5v5]." - -+ERR_ARENA_TEAM_LEAVE_SS "%s has left %s" - -+ERR_ARENA_TEAM_LEADER_IS_SS "%s is the captain of %s" -+ERR_ARENA_TEAM_LEADER_CHANGED_SSS "%s has made %s the new captain of %s" - -+ERR_ARENA_TEAM_REMOVE_SSS "%s has been kicked out of %s by %s" - -+ERR_ARENA_TEAM_DISBANDED_S "%s has disbanded %s" - -ERR_ARENA_TEAM_TARGET_TOO_LOW_S "%s is not high enough level to join your team" - -ERR_ARENA_TEAM_TOO_MANY_MEMBERS_S "%s is full" - -ERR_ARENA_TEAM_LEVEL_TOO_LOW_I "You must be level %d to form an arena team" -*/ diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index d5e5bb4eb11..5388940936e 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -64,8 +64,13 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPackets::NPC::Hello& hello void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::BattlemasterJoin& battlemasterJoin) { bool isPremade = false; - Group* grp = NULL; - uint32 bgTypeId_ = battlemasterJoin.QueueID & 0xFFFF; + if (battlemasterJoin.QueueIDs.empty()) + { + TC_LOG_ERROR("network", "Battleground: no bgtype received. possible cheater? %s", _player->GetGUID().ToString().c_str()); + return; + } + + uint32 bgTypeId_ = battlemasterJoin.QueueIDs[0] & 0xFFFF; if (!sBattlemasterListStore.LookupEntry(bgTypeId_)) { TC_LOG_ERROR("network", "Battleground: invalid bgtype (%u) received. possible cheater? %s", bgTypeId_, _player->GetGUID().ToString().c_str()); @@ -100,8 +105,10 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt GroupJoinBattlegroundResult err = ERR_BATTLEGROUND_NONE; + Group* grp = _player->GetGroup(); + // check queue conditions - if (!battlemasterJoin.JoinAsGroup) + if (!grp) { if (GetPlayer()->isUsingLfg()) { @@ -171,11 +178,6 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt } else { - grp = _player->GetGroup(); - - if (!grp) - return; - if (grp->GetLeaderGUID() != _player->GetGUID()) return; @@ -525,10 +527,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl // check real arenateam existence only here (if it was moved to group->CanJoin .. () then we would ahve to get it twice) ArenaTeam* at = sArenaTeamMgr->GetArenaTeamById(ateamId); if (!at) - { - _player->GetSession()->SendNotInArenaTeamPacket(arenatype); return; - } // get the team rating for queuing uint32 arenaRating = at->GetRating(); diff --git a/src/server/game/Handlers/BlackMarketHandler.cpp b/src/server/game/Handlers/BlackMarketHandler.cpp index dd539e96ff5..a750125927f 100644 --- a/src/server/game/Handlers/BlackMarketHandler.cpp +++ b/src/server/game/Handlers/BlackMarketHandler.cpp @@ -153,7 +153,7 @@ void WorldSession::SendBlackMarketOutbidNotification(BlackMarketTemplate const* packet.MarketID = templ->MarketID; packet.Item = templ->Item; - packet.RandomPropertiesID = templ->Item.RandomPropertiesID; + packet.RandomPropertiesID = 0; SendPacket(packet.Write()); } diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index 4f8e630b53b..31221a9207d 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -37,12 +37,13 @@ void WorldSession::HandleGuildQueryOpcode(WorldPackets::Guild::QueryGuildInfo& q if (Guild* guild = sGuildMgr->GetGuildByGuid(query.GuildGuid)) if (guild->IsMember(query.PlayerGuid)) { - guild->SendQueryResponse(this); + guild->SendQueryResponse(this, query.PlayerGuid); return; } WorldPackets::Guild::QueryGuildInfoResponse response; response.GuildGuid = query.GuildGuid; + response.PlayerGuid = query.PlayerGuid; SendPacket(response.Write()); TC_LOG_DEBUG("guild", "SMSG_GUILD_QUERY_RESPONSE [%s]", GetPlayerInfo().c_str()); diff --git a/src/server/game/Handlers/HotfixHandler.cpp b/src/server/game/Handlers/HotfixHandler.cpp index 0ed74be8023..b58b7bedbe1 100644 --- a/src/server/game/Handlers/HotfixHandler.cpp +++ b/src/server/game/Handlers/HotfixHandler.cpp @@ -56,35 +56,38 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Hotfix::DBQueryBulk& dbQuery) void WorldSession::SendAvailableHotfixes(int32 version) { - SendPacket(WorldPackets::Hotfix::AvailableHotfixes(version, sDB2Manager.GetHotfixData()).Write()); + SendPacket(WorldPackets::Hotfix::AvailableHotfixes(version, sDB2Manager.GetHotfixCount(), sDB2Manager.GetHotfixData()).Write()); } void WorldSession::HandleHotfixRequest(WorldPackets::Hotfix::HotfixRequest& hotfixQuery) { - std::map<uint64, int32> const& hotfixes = sDB2Manager.GetHotfixData(); + DB2Manager::HotfixContainer const& hotfixes = sDB2Manager.GetHotfixData(); WorldPackets::Hotfix::HotfixResponse hotfixQueryResponse; hotfixQueryResponse.Hotfixes.reserve(hotfixQuery.Hotfixes.size()); - for (uint64 hotfixId : hotfixQuery.Hotfixes) + for (WorldPackets::Hotfix::HotfixRecord const& hotfixRecord : hotfixQuery.Hotfixes) { - if (int32 const* hotfix = Trinity::Containers::MapGetValuePtr(hotfixes, hotfixId)) + if (auto const* hotfixedRecords = Trinity::Containers::MapGetValuePtr(hotfixes, hotfixRecord.HotfixID)) { - DB2StorageBase const* storage = sDB2Manager.GetStorage(PAIR64_HIPART(hotfixId)); - - WorldPackets::Hotfix::HotfixResponse::HotfixData hotfixData; - hotfixData.ID = hotfixId; - hotfixData.RecordID = *hotfix; - if (storage && storage->HasRecord(hotfixData.RecordID)) - { - hotfixData.Data = boost::in_place(); - storage->WriteRecord(hotfixData.RecordID, GetSessionDbcLocale(), *hotfixData.Data); - } - else if (std::vector<uint8> const* blobData = sDB2Manager.GetHotfixBlobData(PAIR64_HIPART(hotfixId), *hotfix)) + for (auto const& tableRecord : *hotfixedRecords) { - hotfixData.Data = boost::in_place(); - hotfixData.Data->append(blobData->data(), blobData->size()); - } + DB2StorageBase const* storage = sDB2Manager.GetStorage(hotfixRecord.TableHash); + + WorldPackets::Hotfix::HotfixResponse::HotfixData hotfixData; + hotfixData.Record = hotfixRecord; + if (storage && storage->HasRecord(hotfixData.Record.RecordID)) + { + std::size_t pos = hotfixQueryResponse.HotfixContent.size(); + storage->WriteRecord(hotfixData.Record.RecordID, GetSessionDbcLocale(), hotfixQueryResponse.HotfixContent); + hotfixData.Size = hotfixQueryResponse.HotfixContent.size() - pos; + } + else if (std::vector<uint8> const* blobData = sDB2Manager.GetHotfixBlobData(hotfixData.Record.TableHash, hotfixData.Record.RecordID)) + { + hotfixData.Size = blobData->size(); + hotfixQueryResponse.HotfixContent.append(blobData->data(), blobData->size()); + } - hotfixQueryResponse.Hotfixes.emplace_back(std::move(hotfixData)); + hotfixQueryResponse.Hotfixes.emplace_back(std::move(hotfixData)); + } } } diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp index f659b35db34..5641db4e5c2 100644 --- a/src/server/game/Handlers/InspectHandler.cpp +++ b/src/server/game/Handlers/InspectHandler.cpp @@ -78,63 +78,15 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect) inspectResult.InspecteeGUID = inspect.Target; inspectResult.SpecializationID = player->GetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID); + inspectResult.LifetimeMaxRank = player->GetByteValue(ACTIVE_PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_LIFETIME_MAX_PVP_RANK); + inspectResult.TodayHK = player->GetUInt16Value(ACTIVE_PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_TODAY_KILLS); + inspectResult.YesterdayHK = player->GetUInt16Value(ACTIVE_PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_YESTERDAY_KILLS); + inspectResult.LifetimeHK = player->GetUInt32Value(ACTIVE_PLAYER_FIELD_LIFETIME_HONORABLE_KILLS); + inspectResult.HonorLevel = player->GetUInt32Value(PLAYER_FIELD_HONOR_LEVEL); SendPacket(inspectResult.Write()); } -void WorldSession::HandleRequestHonorStatsOpcode(WorldPackets::Inspect::RequestHonorStats& request) -{ - Player* player = ObjectAccessor::FindPlayer(request.TargetGUID); - if (!player) - { - TC_LOG_DEBUG("network", "WorldSession::HandleRequestHonorStatsOpcode: Target %s not found.", request.TargetGUID.ToString().c_str()); - return; - } - - TC_LOG_DEBUG("network", "WorldSession::HandleRequestHonorStatsOpcode: Target %s.", request.TargetGUID.ToString().c_str()); - - if (!GetPlayer()->IsWithinDistInMap(player, INSPECT_DISTANCE, false)) - return; - - if (GetPlayer()->IsValidAttackTarget(player)) - return; - - WorldPackets::Inspect::InspectHonorStats honorStats; - honorStats.PlayerGUID = request.TargetGUID; - honorStats.LifetimeHK = player->GetUInt32Value(ACTIVE_PLAYER_FIELD_LIFETIME_HONORABLE_KILLS); - honorStats.YesterdayHK = player->GetUInt16Value(ACTIVE_PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_YESTERDAY_KILLS); - honorStats.TodayHK = player->GetUInt16Value(ACTIVE_PLAYER_FIELD_KILLS, PLAYER_FIELD_KILLS_OFFSET_TODAY_KILLS); - honorStats.LifetimeMaxRank = 0; /// @todo - - SendPacket(honorStats.Write()); -} - -void WorldSession::HandleInspectPVP(WorldPackets::Inspect::InspectPVPRequest& request) -{ - /// @todo: deal with request.InspectRealmAddress - - Player* player = ObjectAccessor::FindPlayer(request.InspectTarget); - if (!player) - { - TC_LOG_DEBUG("network", "WorldSession::HandleInspectPVP: Target %s not found.", request.InspectTarget.ToString().c_str()); - return; - } - - TC_LOG_DEBUG("network", "WorldSession::HandleInspectPVP: Target %s, InspectRealmAddress %u.", request.InspectTarget.ToString().c_str(), request.InspectRealmAddress); - - if (!GetPlayer()->IsWithinDistInMap(player, INSPECT_DISTANCE, false)) - return; - - if (GetPlayer()->IsValidAttackTarget(player)) - return; - - WorldPackets::Inspect::InspectPVPResponse response; - response.ClientGUID = request.InspectTarget; - /// @todo: fill brackets - - SendPacket(response.Write()); -} - void WorldSession::HandleQueryInspectAchievements(WorldPackets::Inspect::QueryInspectAchievements& inspect) { Player* player = ObjectAccessor::FindPlayer(inspect.Guid); diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp index 2a557e18874..8ba5dc93333 100644 --- a/src/server/game/Handlers/ItemHandler.cpp +++ b/src/server/game/Handlers/ItemHandler.cpp @@ -666,6 +666,7 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid) item.StackCount = itemTemplate->GetBuyCount(); item.Price = price; item.DoNotFilterOnVendor = vendorItem->IgnoreFiltering; + item.Refundable = itemTemplate->GetFlags() & ITEM_FLAG_ITEM_PURCHASE_RECORD && vendorItem->ExtendedCost && itemTemplate->GetMaxStackSize() == 1; item.Item.ItemID = vendorItem->item; if (!vendorItem->BonusListIDs.empty()) diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 82fe040ea68..2074d150dc3 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -308,7 +308,6 @@ void WorldSession::SendLfgRoleCheckUpdate(lfg::LfgRoleCheck const& roleCheck) { return sLFGMgr->GetLFGDungeonEntry(dungeonId); }); - lfgRoleCheckUpdate.BgQueueID = 0; lfgRoleCheckUpdate.GroupFinderActivityID = 0; if (!roleCheck.roles.empty()) { @@ -340,6 +339,8 @@ void WorldSession::SendLfgJoinResult(lfg::LfgJoinResultData const& joinData) lfgJoinResult.Result = joinData.result; if (joinData.result == lfg::LFG_JOIN_ROLE_CHECK_FAILED) lfgJoinResult.ResultDetail = joinData.state; + else if (joinData.result == lfg::LFG_JOIN_NO_SLOTS) + lfgJoinResult.BlackListNames = joinData.playersMissingRequirement; for (lfg::LfgLockPartyMap::const_iterator it = joinData.lockmap.begin(); it != joinData.lockmap.end(); ++it) { diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 5b96b4260e4..c9ac113c623 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -145,7 +145,7 @@ void WorldSession::HandleAutostoreLootItemOpcode(WorldPackets::Loot::LootItem& p void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet*/) { Player* player = GetPlayer(); - for (std::pair<ObjectGuid, ObjectGuid> const& lootView : player->GetAELootView()) + for (std::pair<ObjectGuid const, ObjectGuid> const& lootView : player->GetAELootView()) { ObjectGuid guid = lootView.second; Loot* loot = nullptr; @@ -222,34 +222,32 @@ void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet playersNear.push_back(member); } - uint32 goldPerPlayer = uint32((loot->gold) / (playersNear.size())); + uint64 goldPerPlayer = uint64(loot->gold / playersNear.size()); for (std::vector<Player*>::const_iterator i = playersNear.begin(); i != playersNear.end(); ++i) { - (*i)->ModifyMoney(goldPerPlayer); - (*i)->UpdateCriteria(CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer); + uint64 goldMod = CalculatePct(goldPerPlayer, (*i)->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MONEY_GAIN, 1)); - if (Guild* guild = sGuildMgr->GetGuildById((*i)->GetGuildId())) - if (uint32 guildGold = CalculatePct(goldPerPlayer, (*i)->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT))) - guild->HandleMemberDepositMoney(this, guildGold, true); + (*i)->ModifyMoney(goldPerPlayer + goldMod); + (*i)->UpdateCriteria(CRITERIA_TYPE_LOOT_MONEY, goldPerPlayer); WorldPackets::Loot::LootMoneyNotify packet; packet.Money = goldPerPlayer; + packet.MoneyMod = goldMod; packet.SoleLooter = playersNear.size() <= 1 ? true : false; (*i)->SendDirectMessage(packet.Write()); } } else { - player->ModifyMoney(loot->gold); - player->UpdateCriteria(CRITERIA_TYPE_LOOT_MONEY, loot->gold); + uint64 goldMod = CalculatePct(loot->gold, player->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_MONEY_GAIN, 1)); - if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) - if (uint32 guildGold = CalculatePct(loot->gold, player->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT))) - guild->HandleMemberDepositMoney(this, guildGold, true); + player->ModifyMoney(loot->gold + goldMod); + player->UpdateCriteria(CRITERIA_TYPE_LOOT_MONEY, loot->gold); WorldPackets::Loot::LootMoneyNotify packet; packet.Money = loot->gold; + packet.MoneyMod = goldMod; packet.SoleLooter = true; // "You loot..." SendPacket(packet.Write()); } @@ -447,7 +445,7 @@ void WorldSession::DoLootRelease(ObjectGuid lguid) void WorldSession::DoLootReleaseAll() { std::unordered_map<ObjectGuid, ObjectGuid> lootView = _player->GetAELootView(); - for (std::pair<ObjectGuid, ObjectGuid> lootPair : lootView) + for (std::pair<ObjectGuid const, ObjectGuid> const& lootPair : lootView) DoLootRelease(lootPair.second); } diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 5ee4228db79..d9af761eb22 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -110,6 +110,9 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe stats.HealthScalingExpansion = creatureInfo->HealthScalingExpansion; stats.VignetteID = creatureInfo->VignetteID; stats.Class = creatureInfo->unit_class; + stats.FadeRegionRadius = creatureInfo->FadeRegionRadius; + stats.WidgetSetID = creatureInfo->WidgetSetID; + stats.WidgetSetUnitConditionID = creatureInfo->WidgetSetUnitConditionID; stats.Title = creatureInfo->SubName; stats.TitleAlt = creatureInfo->TitleAlt; diff --git a/src/server/game/Handlers/ToyHandler.cpp b/src/server/game/Handlers/ToyHandler.cpp index 7ebb109df95..663e3de89ff 100644 --- a/src/server/game/Handlers/ToyHandler.cpp +++ b/src/server/game/Handlers/ToyHandler.cpp @@ -47,7 +47,7 @@ void WorldSession::HandleAddToy(WorldPackets::Toy::AddToy& packet) return; } - if (_collectionMgr->AddToy(item->GetEntry(), false)) + if (_collectionMgr->AddToy(item->GetEntry(), false, false)) _player->DestroyItem(item->GetBagSlot(), item->GetSlot(), true); } @@ -95,3 +95,8 @@ void WorldSession::HandleUseToy(WorldPackets::Toy::UseToy& packet) spell->m_castFlagsEx |= CAST_FLAG_EX_USE_TOY_SPELL; spell->prepare(&targets); } + +void WorldSession::HandleToyClearFanfare(WorldPackets::Toy::ToyClearFanfare& toyClearFanfare) +{ + _collectionMgr->ToyClearFanfare(toyClearFanfare.ItemID); +} diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 30434745296..247b2c37f30 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -126,16 +126,17 @@ Quest::Quest(Field* questRecord) AllowableRaces = questRecord[108].GetUInt64(); TreasurePickerID = questRecord[109].GetInt32(); Expansion = questRecord[110].GetInt32(); - - LogTitle = questRecord[111].GetString(); - LogDescription = questRecord[112].GetString(); - QuestDescription = questRecord[113].GetString(); - AreaDescription = questRecord[114].GetString(); - PortraitGiverText = questRecord[115].GetString(); - PortraitGiverName = questRecord[116].GetString(); - PortraitTurnInText = questRecord[117].GetString(); - PortraitTurnInName = questRecord[118].GetString(); - QuestCompletionLog = questRecord[119].GetString(); + ManagedWorldStateID = questRecord[111].GetInt32(); + + LogTitle = questRecord[112].GetString(); + LogDescription = questRecord[113].GetString(); + QuestDescription = questRecord[114].GetString(); + AreaDescription = questRecord[115].GetString(); + PortraitGiverText = questRecord[116].GetString(); + PortraitGiverName = questRecord[117].GetString(); + PortraitTurnInText = questRecord[118].GetString(); + PortraitTurnInName = questRecord[119].GetString(); + QuestCompletionLog = questRecord[120].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 cac085e5a91..6382134acab 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -441,6 +441,7 @@ class TC_GAME_API Quest uint32 GetRewardReputationMask() const { return RewardReputationMask; } int32 GetTreasurePickerId() const { return TreasurePickerID; } int32 GetExpansion() const { return Expansion; } + int32 GetManagedWorldStateId() const { return ManagedWorldStateID; } uint32 GetQuestGiverPortrait() const { return QuestGiverPortrait; } int32 GetQuestGiverPortraitMount() const { return QuestGiverPortraitMount; } uint32 GetQuestTurnInPortrait() const { return QuestTurnInPortrait; } @@ -533,6 +534,7 @@ class TC_GAME_API Quest uint64 AllowableRaces; int32 TreasurePickerID; int32 Expansion; + int32 ManagedWorldStateID; QuestObjectives Objectives; std::string LogTitle; std::string LogDescription; diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index 37d63a5e939..f4cd72123db 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -21,6 +21,7 @@ WorldPacket const* WorldPackets::Battleground::PVPSeason::Write() { _worldPacket << uint32(CurrentSeason); _worldPacket << uint32(PreviousSeason); + _worldPacket << uint32(PvpSeasonID); return &_worldPacket; } @@ -125,10 +126,11 @@ WorldPacket const* WorldPackets::Battleground::PVPLogData::Write() void WorldPackets::Battleground::BattlemasterJoin::Read() { - _worldPacket >> QueueID; + QueueIDs.resize(_worldPacket.read<uint32>()); _worldPacket >> Roles; _worldPacket >> BlacklistMap[0] >> BlacklistMap[1]; - JoinAsGroup = _worldPacket.ReadBit(); + for (uint64& queueId : QueueIDs) + _worldPacket >> queueId; } void WorldPackets::Battleground::BattlemasterJoinArena::Read() diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 60d1d5ee210..c470ad7bbf6 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -22,6 +22,7 @@ #include "LFGPacketsCommon.h" #include "ObjectGuid.h" #include "Optional.h" +#include "PacketUtilities.h" #include "Position.h" namespace WorldPackets @@ -37,6 +38,7 @@ namespace WorldPackets uint32 PreviousSeason = 0; uint32 CurrentSeason = 0; + uint32 PvpSeasonID = 0; }; class AreaSpiritHealerQuery final : public ClientPacket @@ -220,9 +222,8 @@ namespace WorldPackets void Read() override; - bool JoinAsGroup = false; + Array<uint64, 1> QueueIDs; uint8 Roles = 0; - uint64 QueueID = 0; int32 BlacklistMap[2] = { }; }; diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index afd7b7bb87c..1739ef13eb9 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -117,7 +117,7 @@ WorldPackets::Character::EnumCharactersResult::CharacterInfo::CharacterInfo(Fiel if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(Class, fields[29].GetUInt8())) SpecID = spec->ID; - LastLoginBuild = fields[30].GetUInt32(); + LastLoginVersion = fields[30].GetUInt32(); for (uint8 slot = 0; slot < INVENTORY_SLOT_BAG_END; ++slot) { @@ -172,7 +172,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters data << uint32(charInfo.LastPlayedTime); data << uint16(charInfo.SpecID); data << uint32(charInfo.Unknown703); - data << uint32(charInfo.LastLoginBuild); + data << uint32(charInfo.LastLoginVersion); data << uint32(charInfo.Flags4); data.WriteBits(charInfo.Name.length(), 6); data.WriteBit(charInfo.FirstLogin); @@ -196,6 +196,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharacters return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Character::EnumCharactersResult::UnlockedConditionalAppearance const& unlockedConditionalAppearance) +{ + data << int32(unlockedConditionalAppearance.AchievementID); + data << int32(unlockedConditionalAppearance.Unused); + + return data; +} + WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() { _worldPacket.reserve(9 + Characters.size() * sizeof(CharacterInfo) + RaceUnlockData.size() * sizeof(RaceUnlock)); @@ -210,10 +218,14 @@ WorldPacket const* WorldPackets::Character::EnumCharactersResult::Write() _worldPacket << uint32(Characters.size()); _worldPacket << int32(MaxCharacterLevel); _worldPacket << uint32(RaceUnlockData.size()); + _worldPacket << uint32(UnlockedConditionalAppearances.size()); if (DisabledClassesMask) _worldPacket << uint32(*DisabledClassesMask); + for (UnlockedConditionalAppearance const& unlockedConditionalAppearance : UnlockedConditionalAppearances) + _worldPacket << unlockedConditionalAppearance; + for (CharacterInfo const& charInfo : Characters) _worldPacket << charInfo; diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index d21c38b2afc..90f460b298d 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -148,7 +148,7 @@ namespace WorldPackets uint32 LastPlayedTime = 0; uint16 SpecID = 0; uint32 Unknown703 = 0; - uint32 LastLoginBuild = 0; + uint32 LastLoginVersion = 0; struct PetInfo { @@ -178,6 +178,12 @@ namespace WorldPackets bool HasHeritageArmor = false; }; + struct UnlockedConditionalAppearance + { + int32 AchievementID = 0; + int32 Unused = 0; + }; + EnumCharactersResult() : ServerPacket(SMSG_ENUM_CHARACTERS_RESULT) { } WorldPacket const* Write() override; @@ -194,6 +200,7 @@ namespace WorldPackets std::vector<CharacterInfo> Characters; ///< all characters on the list std::vector<RaceUnlock> RaceUnlockData; ///< + std::vector<UnlockedConditionalAppearance> UnlockedConditionalAppearances; }; class CreateCharacter final : public ClientPacket diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 8b9a1a05c76..4bfc5d5062f 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -242,7 +242,7 @@ WorldPacket const* WorldPackets::Chat::ChatPlayerNotfound::Write() WorldPacket const* WorldPackets::Chat::ChatServerMessage::Write() { - _worldPacket << MessageID; + _worldPacket << int32(MessageID); _worldPacket.WriteBits(StringParam.length(), 11); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp index 86c999ddd83..fbc37cf5bf1 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.cpp @@ -68,6 +68,7 @@ namespace WorldPackets Type = TYPE_CREATURE_TO_PLAYER_DAMAGE; PlayerLevelDelta = target->GetInt32Value(ACTIVE_PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA); PlayerItemLevel = target->GetAverageItemLevel(); + TargetItemLevel = 0; ScalingHealthItemLevelCurveID = target->GetUInt32Value(UNIT_FIELD_SCALING_HEALTH_ITEM_LEVEL_CURVE_ID); TargetLevel = target->getLevel(); Expansion = creatureTemplate->RequiredExpansion; @@ -85,6 +86,7 @@ namespace WorldPackets Type = TYPE_PLAYER_TO_CREATURE_DAMAGE; PlayerLevelDelta = attacker->GetInt32Value(ACTIVE_PLAYER_FIELD_SCALING_PLAYER_LEVEL_DELTA); PlayerItemLevel = attacker->GetAverageItemLevel(); + TargetItemLevel = 0; ScalingHealthItemLevelCurveID = target->GetUInt32Value(UNIT_FIELD_SCALING_HEALTH_ITEM_LEVEL_CURVE_ID); TargetLevel = target->getLevel(); Expansion = creatureTemplate->RequiredExpansion; @@ -171,6 +173,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ContentTuningPara { data << int16(contentTuningParams.PlayerLevelDelta); data << uint16(contentTuningParams.PlayerItemLevel); + data << uint16(contentTuningParams.TargetItemLevel); data << uint16(contentTuningParams.ScalingHealthItemLevelCurveID); data << uint8(contentTuningParams.TargetLevel); data << uint8(contentTuningParams.Expansion); diff --git a/src/server/game/Server/Packets/CombatLogPacketsCommon.h b/src/server/game/Server/Packets/CombatLogPacketsCommon.h index 40d317e7e02..10fcf040b09 100644 --- a/src/server/game/Server/Packets/CombatLogPacketsCommon.h +++ b/src/server/game/Server/Packets/CombatLogPacketsCommon.h @@ -62,6 +62,7 @@ namespace WorldPackets uint32 Type = 0; int16 PlayerLevelDelta = 0; uint16 PlayerItemLevel = 0; + uint16 TargetItemLevel = 0; uint16 ScalingHealthItemLevelCurveID = 0; uint8 TargetLevel = 0; uint8 Expansion = 0; diff --git a/src/server/game/Server/Packets/DuelPackets.cpp b/src/server/game/Server/Packets/DuelPackets.cpp index 7d2602c4e41..dd358c8cee8 100644 --- a/src/server/game/Server/Packets/DuelPackets.cpp +++ b/src/server/game/Server/Packets/DuelPackets.cpp @@ -41,7 +41,7 @@ WorldPacket const* WorldPackets::Duel::DuelComplete::Write() WorldPacket const* WorldPackets::Duel::DuelCountdown::Write() { - _worldPacket << Countdown; + _worldPacket << uint32(Countdown); return &_worldPacket; } @@ -67,8 +67,8 @@ WorldPacket const* WorldPackets::Duel::DuelWinner::Write() _worldPacket.WriteBits(BeatenName.size(), 6); _worldPacket.WriteBits(WinnerName.size(), 6); _worldPacket.WriteBit(Fled); - _worldPacket << BeatenVirtualRealmAddress; - _worldPacket << WinnerVirtualRealmAddress; + _worldPacket << uint32(BeatenVirtualRealmAddress); + _worldPacket << uint32(WinnerVirtualRealmAddress); _worldPacket.WriteString(BeatenName); _worldPacket.WriteString(WinnerName); diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 48732b43aba..ec37ad28893 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -110,7 +110,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionAreaBonus const& areaBonus) +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionBonusAbility const& areaBonus) { data << uint32(areaBonus.GarrMssnBonusAbilityID); data << uint32(areaBonus.StartTime); @@ -169,7 +169,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonInfo co data << missionRewardItem; } - for (WorldPackets::Garrison::GarrisonMissionAreaBonus const* areaBonus : garrison.MissionAreaBonuses) + for (WorldPackets::Garrison::GarrisonMissionBonusAbility const* areaBonus : garrison.MissionAreaBonuses) data << *areaBonus; for (WorldPackets::Garrison::GarrisonTalent const& talent : garrison.Talents) diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index 7ec0b01c3e6..7eddbb46cf9 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -122,7 +122,7 @@ namespace WorldPackets int32 Unknown = 0; }; - struct GarrisonMissionAreaBonus + struct GarrisonMissionBonusAbility { uint32 GarrMssnBonusAbilityID = 0; time_t StartTime = time_t(0); @@ -148,7 +148,7 @@ namespace WorldPackets std::vector<GarrisonMission const*> Missions; std::vector<std::vector<GarrisonMissionReward>> MissionRewards; std::vector<std::vector<GarrisonMissionReward>> MissionOvermaxRewards; - std::vector<GarrisonMissionAreaBonus const*> MissionAreaBonuses; + std::vector<GarrisonMissionBonusAbility const*> MissionAreaBonuses; std::vector<GarrisonTalent> Talents; std::vector<bool> CanStartMission; std::vector<int32> ArchivedMissions; @@ -353,7 +353,7 @@ namespace WorldPackets class GarrisonRemoveFollowerResult final : public ServerPacket { public: - GarrisonRemoveFollowerResult() : ServerPacket(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, 8 + 4) { } + GarrisonRemoveFollowerResult() : ServerPacket(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, 8 + 4 + 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 0a2868685af..56768fafe8f 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -29,6 +29,7 @@ WorldPackets::Guild::QueryGuildInfoResponse::QueryGuildInfoResponse() WorldPacket const* WorldPackets::Guild::QueryGuildInfoResponse::Write() { _worldPacket << GuildGuid; + _worldPacket << PlayerGuid; _worldPacket.WriteBit(Info.is_initialized()); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/GuildPackets.h b/src/server/game/Server/Packets/GuildPackets.h index 919fed8a88b..b72d4857d48 100644 --- a/src/server/game/Server/Packets/GuildPackets.h +++ b/src/server/game/Server/Packets/GuildPackets.h @@ -78,6 +78,7 @@ namespace WorldPackets WorldPacket const* Write() override; ObjectGuid GuildGuid; + ObjectGuid PlayerGuid; Optional<GuildInfo> Info; }; @@ -883,7 +884,7 @@ namespace WorldPackets class GuildBankTextQueryResult : public ServerPacket { public: - GuildBankTextQueryResult() : ServerPacket(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, 5) { } + GuildBankTextQueryResult() : ServerPacket(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, 4 + 2) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/HotfixPackets.cpp b/src/server/game/Server/Packets/HotfixPackets.cpp index aee733ab4db..cf147b91031 100644 --- a/src/server/game/Server/Packets/HotfixPackets.cpp +++ b/src/server/game/Server/Packets/HotfixPackets.cpp @@ -47,36 +47,64 @@ WorldPacket const* WorldPackets::Hotfix::DBReply::Write() WorldPacket const* WorldPackets::Hotfix::AvailableHotfixes::Write() { _worldPacket << int32(HotfixCacheVersion); - _worldPacket << uint32(Hotfixes.size()); + _worldPacket << uint32(HotfixCount); for (auto const& hotfixEntry : Hotfixes) - _worldPacket << uint64(hotfixEntry.first); + { + for (auto const& tableRecord : hotfixEntry.second) + { + _worldPacket << uint32(tableRecord.first); + _worldPacket << int32(tableRecord.second); + _worldPacket << int32(hotfixEntry.first); + } + } return &_worldPacket; } +ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Hotfix::HotfixRecord& hotfixRecord) +{ + data >> hotfixRecord.TableHash; + data >> hotfixRecord.RecordID; + data >> hotfixRecord.HotfixID; + return data; +} + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixRecord const& hotfixRecord) +{ + data << uint32(hotfixRecord.TableHash); + data << int32(hotfixRecord.RecordID); + data << int32(hotfixRecord.HotfixID); + return data; +} + void WorldPackets::Hotfix::HotfixRequest::Read() { + _worldPacket >> ClientBuild; + _worldPacket >> DataBuild; + uint32 hotfixCount = _worldPacket.read<uint32>(); - if (hotfixCount > sDB2Manager.GetHotfixData().size()) - throw PacketArrayMaxCapacityException(hotfixCount, sDB2Manager.GetHotfixData().size()); + if (hotfixCount > sDB2Manager.GetHotfixCount()) + throw PacketArrayMaxCapacityException(hotfixCount, sDB2Manager.GetHotfixCount()); Hotfixes.resize(hotfixCount); - for (uint64& hotfixId : Hotfixes) - _worldPacket >> hotfixId; + for (HotfixRecord& hotfixRecord : Hotfixes) + _worldPacket >> hotfixRecord; } ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Hotfix::HotfixResponse::HotfixData const& hotfixData) { - data << uint64(hotfixData.ID); - data << int32(hotfixData.RecordID); - data.WriteBit(hotfixData.Data.is_initialized()); - if (hotfixData.Data) + data << hotfixData.Record; + if (hotfixData.Size) { - data << uint32(hotfixData.Data->size()); - data.append(*hotfixData.Data); + data << uint32(*hotfixData.Size); + data.WriteBit(true); } else + { data << uint32(0); + data.WriteBit(false); + } + data.FlushBits(); return data; } @@ -87,5 +115,8 @@ WorldPacket const* WorldPackets::Hotfix::HotfixResponse::Write() for (HotfixData const& hotfix : Hotfixes) _worldPacket << hotfix; + _worldPacket << uint32(HotfixContent.size()); + _worldPacket.append(HotfixContent); + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/HotfixPackets.h b/src/server/game/Server/Packets/HotfixPackets.h index 9f0a4a1176f..100b51a5fb2 100644 --- a/src/server/game/Server/Packets/HotfixPackets.h +++ b/src/server/game/Server/Packets/HotfixPackets.h @@ -62,13 +62,21 @@ namespace WorldPackets class AvailableHotfixes final : public ServerPacket { public: - AvailableHotfixes(int32 hotfixCacheVersion, std::map<uint64, int32> const& hotfixes) - : ServerPacket(SMSG_AVAILABLE_HOTFIXES), HotfixCacheVersion(hotfixCacheVersion), Hotfixes(hotfixes) { } + AvailableHotfixes(int32 hotfixCacheVersion, uint32 hotfixCount, DB2Manager::HotfixContainer const& hotfixes) + : ServerPacket(SMSG_AVAILABLE_HOTFIXES), HotfixCacheVersion(hotfixCacheVersion), HotfixCount(hotfixCount), Hotfixes(hotfixes) { } WorldPacket const* Write() override; int32 HotfixCacheVersion; - std::map<uint64, int32> const& Hotfixes; + uint32 HotfixCount; + DB2Manager::HotfixContainer const& Hotfixes; + }; + + struct HotfixRecord + { + uint32 TableHash = 0; + int32 RecordID = 0; + int32 HotfixID = 0; }; class HotfixRequest final : public ClientPacket @@ -78,7 +86,9 @@ namespace WorldPackets void Read() override; - std::vector<uint64> Hotfixes; + uint32 ClientBuild = 0; + uint32 DataBuild = 0; + std::vector<HotfixRecord> Hotfixes; }; class HotfixResponse final : public ServerPacket @@ -86,9 +96,8 @@ namespace WorldPackets public: struct HotfixData { - uint64 ID = 0; - int32 RecordID = 0; - Optional<ByteBuffer> Data; + HotfixRecord Record; + Optional<uint32> Size; }; HotfixResponse() : ServerPacket(SMSG_HOTFIX_RESPONSE) { } @@ -96,6 +105,7 @@ namespace WorldPackets WorldPacket const* Write() override; std::vector<HotfixData> Hotfixes; + ByteBuffer HotfixContent; }; } } diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 415aedaa56a..8a36270bec2 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -63,6 +63,24 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::InspectGuildData return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData const& bracket) +{ + data << uint8(bracket.Bracket); + data << int32(bracket.Rating); + data << int32(bracket.Rank); + data << int32(bracket.WeeklyPlayed); + data << int32(bracket.WeeklyWon); + data << int32(bracket.SeasonPlayed); + data << int32(bracket.SeasonWon); + data << int32(bracket.WeeklyBestRating); + data << int32(bracket.Unk710); + data << int32(bracket.Unk801_1); + data.WriteBit(bracket.Unk801_2); + data.FlushBits(); + + return data; +} + WorldPackets::Inspect::InspectItemData::InspectItemData(::Item const* item, uint8 index) { CreatorGUID = item->GetGuidValue(ITEM_FIELD_CREATOR); @@ -100,6 +118,11 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write() _worldPacket << int32(ClassID); _worldPacket << int32(SpecializationID); _worldPacket << int32(GenderID); + _worldPacket << uint8(LifetimeMaxRank); + _worldPacket << uint16(TodayHK); + _worldPacket << uint16(YesterdayHK); + _worldPacket << uint32(LifetimeHK); + _worldPacket << uint32(HonorLevel); if (!Glyphs.empty()) _worldPacket.append(Glyphs.data(), Glyphs.size()); if (!Talents.empty()) @@ -111,8 +134,8 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write() _worldPacket.WriteBit(AzeriteLevel.is_initialized()); _worldPacket.FlushBits(); - for (size_t i = 0; i < Items.size(); ++i) - _worldPacket << Items[i]; + for (PVPBracketData const& bracket : Bracket) + _worldPacket << bracket; if (GuildData) _worldPacket << *GuildData; @@ -120,58 +143,8 @@ WorldPacket const* WorldPackets::Inspect::InspectResult::Write() if (AzeriteLevel) _worldPacket << int32(*AzeriteLevel); - return &_worldPacket; -} - -void WorldPackets::Inspect::RequestHonorStats::Read() -{ - _worldPacket >> TargetGUID; -} - -WorldPacket const* WorldPackets::Inspect::InspectHonorStats::Write() -{ - _worldPacket << PlayerGUID; - _worldPacket << uint8(LifetimeMaxRank); - _worldPacket << uint16(YesterdayHK); /// @todo: confirm order - _worldPacket << uint16(TodayHK); /// @todo: confirm order - _worldPacket << uint32(LifetimeHK); - - return &_worldPacket; -} - -void WorldPackets::Inspect::InspectPVPRequest::Read() -{ - _worldPacket >> InspectTarget; - _worldPacket >> InspectRealmAddress; -} - -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Inspect::PVPBracketData const& bracket) -{ - data << uint8(bracket.Bracket); - data << int32(bracket.Rating); - data << int32(bracket.Rank); - data << int32(bracket.WeeklyPlayed); - data << int32(bracket.WeeklyWon); - data << int32(bracket.SeasonPlayed); - data << int32(bracket.SeasonWon); - data << int32(bracket.WeeklyBestRating); - data << int32(bracket.Unk710); - data << int32(bracket.Unk801_1); - data.WriteBit(bracket.Unk801_2); - data.FlushBits(); - - return data; -} - -WorldPacket const* WorldPackets::Inspect::InspectPVPResponse::Write() -{ - _worldPacket << ClientGUID; - - _worldPacket.WriteBits(Bracket.size(), 3); - _worldPacket.FlushBits(); - - for (size_t i = 0; i < Bracket.size(); ++i) - _worldPacket << Bracket[i]; + for (InspectItemData const& item : Items) + _worldPacket << item; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h index e16507904b9..51b1248e286 100644 --- a/src/server/game/Server/Packets/InspectPackets.h +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -67,6 +67,21 @@ namespace WorldPackets int32 AchievementPoints = 0; }; + struct PVPBracketData + { + int32 Rating = 0; + int32 Rank = 0; + int32 WeeklyPlayed = 0; + int32 WeeklyWon = 0; + int32 SeasonPlayed = 0; + int32 SeasonWon = 0; + int32 WeeklyBestRating = 0; + int32 Unk710 = 0; + int32 Unk801_1 = 0; + uint8 Bracket = 0; + bool Unk801_2 = false; + }; + class InspectResult final : public ServerPacket { public: @@ -85,71 +100,16 @@ namespace WorldPackets int32 ClassID = CLASS_NONE; int32 GenderID = GENDER_NONE; Optional<InspectGuildData> GuildData; + std::array<PVPBracketData, 6> Bracket; int32 SpecializationID = 0; Optional<int32> AzeriteLevel; - }; - - class RequestHonorStats final : public ClientPacket - { - public: - RequestHonorStats(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_HONOR_STATS, std::move(packet)) { } - - void Read() override; - - ObjectGuid TargetGUID; - }; - - class InspectHonorStats final : public ServerPacket - { - public: - InspectHonorStats() : ServerPacket(SMSG_INSPECT_HONOR_STATS, 25) { } - - WorldPacket const* Write() override; - - ObjectGuid PlayerGUID; - uint32 LifetimeHK = 0; - uint16 YesterdayHK = 0; - uint16 TodayHK = 0; + uint32 LifetimeHK = 0; + uint32 HonorLevel = 0; + uint16 TodayHK = 0; + uint16 YesterdayHK = 0; uint8 LifetimeMaxRank = 0; }; - class InspectPVPRequest final : public ClientPacket - { - public: - InspectPVPRequest(WorldPacket&& packet) : ClientPacket(CMSG_INSPECT_PVP, std::move(packet)) { } - - void Read() override; - - ObjectGuid InspectTarget; - uint32 InspectRealmAddress = 0; - }; - - struct PVPBracketData - { - int32 Rating = 0; - int32 Rank = 0; - int32 WeeklyPlayed = 0; - int32 WeeklyWon = 0; - int32 SeasonPlayed = 0; - int32 SeasonWon = 0; - int32 WeeklyBestRating = 0; - int32 Unk710 = 0; - int32 Unk801_1 = 0; - uint8 Bracket = 0; - bool Unk801_2 = false; - }; - - class InspectPVPResponse final : public ServerPacket - { - public: - InspectPVPResponse() : ServerPacket(SMSG_INSPECT_PVP, 17) { } - - WorldPacket const* Write() override; - - std::vector<PVPBracketData> Bracket; - ObjectGuid ClientGUID; - }; - class QueryInspectAchievements final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index d6724f42286..311b1b14e65 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -229,7 +229,7 @@ namespace WorldPackets class InstanceEncounterGainCombatResurrectionCharge final : public ServerPacket { public: - InstanceEncounterGainCombatResurrectionCharge() : ServerPacket(SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE, 0) { } + InstanceEncounterGainCombatResurrectionCharge() : ServerPacket(SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE, 4 + 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.cpp b/src/server/game/Server/Packets/ItemPacketsCommon.cpp index aafdaa831b4..0803b3f044b 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.cpp +++ b/src/server/game/Server/Packets/ItemPacketsCommon.cpp @@ -33,8 +33,6 @@ bool WorldPackets::Item::ItemBonusInstanceData::operator==(ItemBonusInstanceData void WorldPackets::Item::ItemInstance::Initialize(::Item const* item) { ItemID = item->GetEntry(); - RandomPropertiesSeed = item->GetItemSuffixFactor(); - RandomPropertiesID = item->GetItemRandomPropertyId(); std::vector<uint32> const& bonusListIds = item->GetDynamicValues(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS); if (!bonusListIds.empty()) { @@ -70,9 +68,6 @@ void WorldPackets::Item::ItemInstance::Initialize(::ItemDynamicFieldGems const* void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) { ItemID = lootItem.itemid; - RandomPropertiesSeed = lootItem.randomSuffix; - if (lootItem.randomPropertyId.Type != ItemRandomEnchantmentType::BonusList) - RandomPropertiesID = lootItem.randomPropertyId.Id; if (!lootItem.BonusListIDs.empty()) { @@ -91,9 +86,6 @@ void WorldPackets::Item::ItemInstance::Initialize(::LootItem const& lootItem) void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidItem) { ItemID = voidItem->ItemEntry; - RandomPropertiesSeed = voidItem->ItemSuffixFactor; - if (voidItem->ItemRandomPropertyId.Type != ItemRandomEnchantmentType::BonusList) - RandomPropertiesID = voidItem->ItemRandomPropertyId.Id; if (voidItem->ItemUpgradeId || voidItem->FixedScalingLevel || voidItem->ArtifactKnowledgeLevel) { @@ -116,7 +108,7 @@ void WorldPackets::Item::ItemInstance::Initialize(::VoidStorageItem const* voidI bool WorldPackets::Item::ItemInstance::operator==(ItemInstance const& r) const { - if (ItemID != r.ItemID || RandomPropertiesID != r.RandomPropertiesID || RandomPropertiesSeed != r.RandomPropertiesSeed) + if (ItemID != r.ItemID) return false; if (ItemBonus.is_initialized() != r.ItemBonus.is_initialized() || Modifications.is_initialized() != r.Modifications.is_initialized()) @@ -161,8 +153,6 @@ ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemBonusInstanceDa ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& itemInstance) { data << int32(itemInstance.ItemID); - data << int32(itemInstance.RandomPropertiesSeed); - data << int32(itemInstance.RandomPropertiesID); data.WriteBit(itemInstance.ItemBonus.is_initialized()); data.WriteBit(itemInstance.Modifications.is_initialized()); @@ -180,8 +170,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Item::ItemInstance const& ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Item::ItemInstance& itemInstance) { data >> itemInstance.ItemID; - data >> itemInstance.RandomPropertiesSeed; - data >> itemInstance.RandomPropertiesID; bool hasItemBonus = data.ReadBit(); bool hasModifications = data.ReadBit(); diff --git a/src/server/game/Server/Packets/ItemPacketsCommon.h b/src/server/game/Server/Packets/ItemPacketsCommon.h index af7f06920b8..1c01447630e 100644 --- a/src/server/game/Server/Packets/ItemPacketsCommon.h +++ b/src/server/game/Server/Packets/ItemPacketsCommon.h @@ -50,8 +50,6 @@ namespace WorldPackets void Initialize(::VoidStorageItem const* voidItem); uint32 ItemID = 0; - uint32 RandomPropertiesSeed = 0; - uint32 RandomPropertiesID = 0; Optional<ItemBonusInstanceData> ItemBonus; Optional<CompactArray<int32>> Modifications; diff --git a/src/server/game/Server/Packets/LFGPackets.cpp b/src/server/game/Server/Packets/LFGPackets.cpp index 91edfa54981..2a7707d06d0 100644 --- a/src/server/game/Server/Packets/LFGPackets.cpp +++ b/src/server/game/Server/Packets/LFGPackets.cpp @@ -241,13 +241,16 @@ WorldPacket const* WorldPackets::LFG::LFGRoleCheckUpdate::Write() _worldPacket << uint8(PartyIndex); _worldPacket << uint8(RoleCheckStatus); _worldPacket << uint32(JoinSlots.size()); - _worldPacket << uint64(BgQueueID); + _worldPacket << uint32(BgQueueIDs.size()); _worldPacket << int32(GroupFinderActivityID); _worldPacket << uint32(Members.size()); for (uint32 slot : JoinSlots) _worldPacket << uint32(slot); + for (uint64 bgQueueID : BgQueueIDs) + _worldPacket << uint64(bgQueueID); + _worldPacket.WriteBit(IsBeginning); _worldPacket.WriteBit(IsRequeue); _worldPacket.FlushBits(); @@ -285,10 +288,18 @@ WorldPacket const* WorldPackets::LFG::LFGJoinResult::Write() _worldPacket << uint8(Result); _worldPacket << uint8(ResultDetail); _worldPacket << uint32(BlackList.size()); + _worldPacket << uint32(BlackListNames.size()); for (LFGJoinBlackList const& blackList : BlackList) _worldPacket << blackList; + for (std::string const* str : BlackListNames) + _worldPacket.WriteBits(str->length() + 1, 24); + + for (std::string const* str : BlackListNames) + if (!str->empty()) + _worldPacket << *str; + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/LFGPackets.h b/src/server/game/Server/Packets/LFGPackets.h index aa081a98dda..b98f1d66334 100644 --- a/src/server/game/Server/Packets/LFGPackets.h +++ b/src/server/game/Server/Packets/LFGPackets.h @@ -269,7 +269,7 @@ namespace WorldPackets uint8 PartyIndex = 0; uint8 RoleCheckStatus = 0; std::vector<uint32> JoinSlots; - uint64 BgQueueID = 0; + std::vector<uint64> BgQueueIDs; int32 GroupFinderActivityID = 0; std::vector<LFGRoleCheckUpdateMember> Members; bool IsBeginning = false; @@ -305,6 +305,7 @@ namespace WorldPackets uint8 Result = 0; uint8 ResultDetail = 0; std::vector<LFGJoinBlackList> BlackList; + std::vector<std::string const*> BlackListNames; }; class LFGQueueStatus final : public ServerPacket diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp index 86b3484c6c0..ff787c11b02 100644 --- a/src/server/game/Server/Packets/LootPackets.cpp +++ b/src/server/game/Server/Packets/LootPackets.cpp @@ -94,7 +94,8 @@ void WorldPackets::Loot::LootRelease::Read() WorldPacket const* WorldPackets::Loot::LootMoneyNotify::Write() { - _worldPacket << Money; + _worldPacket << uint64(Money); + _worldPacket << uint64(MoneyMod); _worldPacket.WriteBit(SoleLooter); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h index f65e54d780f..adacd5c0fb7 100644 --- a/src/server/game/Server/Packets/LootPackets.h +++ b/src/server/game/Server/Packets/LootPackets.h @@ -129,7 +129,8 @@ namespace WorldPackets WorldPacket const* Write() override; - uint32 Money = 0; + uint64 Money = 0; + uint64 MoneyMod = 0; bool SoleLooter = false; }; diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index 6ca0a994b0a..294698728ff 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -272,7 +272,7 @@ WorldPacket const* WorldPackets::Mail::MailQueryNextTimeResult::Write() return &_worldPacket; } -WorldPacket const* WorldPackets::Mail::NotifyRecievedMail::Write() +WorldPacket const* WorldPackets::Mail::NotifyReceivedMail::Write() { _worldPacket << float(Delay); diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h index ce6a7933af5..e7851b7dccd 100644 --- a/src/server/game/Server/Packets/MailPackets.h +++ b/src/server/game/Server/Packets/MailPackets.h @@ -227,10 +227,10 @@ namespace WorldPackets std::vector<MailNextTimeEntry> Next; }; - class NotifyRecievedMail : ServerPacket + class NotifyReceivedMail : ServerPacket { public: - NotifyRecievedMail() : ServerPacket(SMSG_NOTIFY_RECEIVED_MAIL, 4) { } + NotifyReceivedMail() : ServerPacket(SMSG_NOTIFY_RECEIVED_MAIL, 4) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 3f9bf709082..4039bd9e7b6 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -54,6 +54,9 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() _worldPacket.WriteBit(TrackedQuantity.is_initialized()); _worldPacket.WriteBit(MaxQuantity.is_initialized()); _worldPacket.WriteBit(SuppressChatLog); + _worldPacket.WriteBit(QuantityChange.is_initialized()); + _worldPacket.WriteBit(QuantityGainSource.is_initialized()); + _worldPacket.WriteBit(QuantityLostSource.is_initialized()); _worldPacket.FlushBits(); if (WeeklyQuantity) @@ -65,6 +68,15 @@ WorldPacket const* WorldPackets::Misc::SetCurrency::Write() if (MaxQuantity) _worldPacket << int32(*MaxQuantity); + if (QuantityChange) + _worldPacket << int32(*QuantityChange); + + if (QuantityGainSource) + _worldPacket << int32(*QuantityGainSource); + + if (QuantityLostSource) + _worldPacket << int32(*QuantityLostSource); + return &_worldPacket; } diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 20ab3ac02ea..1c88f229a8c 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -109,6 +109,9 @@ namespace WorldPackets Optional<int32> WeeklyQuantity; Optional<int32> TrackedQuantity; Optional<int32> MaxQuantity; + Optional<int32> QuantityChange; + Optional<int32> QuantityGainSource; + Optional<int32> QuantityLostSource; bool SuppressChatLog = false; }; diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index c913637ad34..8276fb8d819 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -840,7 +840,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound data.WriteBit(stateChange.VehicleRecID.is_initialized()); data.WriteBit(stateChange.CollisionHeight.is_initialized()); data.WriteBit(stateChange.MovementForce_.is_initialized()); - data.WriteBit(stateChange.Unknown.is_initialized()); + data.WriteBit(stateChange.MovementForceGUID.is_initialized()); data.FlushBits(); if (stateChange.CollisionHeight) @@ -864,8 +864,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Movement::MoveSetCompound if (stateChange.VehicleRecID) data << int32(*stateChange.VehicleRecID); - if (stateChange.Unknown) - data << *stateChange.Unknown; + if (stateChange.MovementForceGUID) + data << *stateChange.MovementForceGUID; if (stateChange.MovementForce_) data << *stateChange.MovementForce_; diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 52999613fe3..f806551c24c 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -592,7 +592,7 @@ namespace WorldPackets Optional<int32> VehicleRecID; Optional<CollisionHeightInfo> CollisionHeight; Optional<MovementForce> MovementForce_; - Optional<ObjectGuid> Unknown; + Optional<ObjectGuid> MovementForceGUID; }; MoveSetCompoundState() : ServerPacket(SMSG_MOVE_SET_COMPOUND_STATE, 4 + 1) { } diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp index 16da5d654a5..7e52b5d549a 100644 --- a/src/server/game/Server/Packets/NPCPackets.cpp +++ b/src/server/game/Server/Packets/NPCPackets.cpp @@ -64,7 +64,6 @@ WorldPacket const* WorldPackets::NPC::GossipMessage::Write() return &_worldPacket; } - ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &item) { data << uint32(item.MuID); @@ -77,6 +76,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::NPC::VendorItem const &it data << int32(item.PlayerConditionFailed); data << item.Item; data.WriteBit(item.DoNotFilterOnVendor); + data.WriteBit(item.Refundable); data.FlushBits(); return data; diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h index a9d9207351b..39a25e25b7b 100644 --- a/src/server/game/Server/Packets/NPCPackets.h +++ b/src/server/game/Server/Packets/NPCPackets.h @@ -114,6 +114,7 @@ namespace WorldPackets int32 ExtendedCostID = 0; int32 PlayerConditionFailed = 0; bool DoNotFilterOnVendor = false; + bool Refundable = false; }; class VendorInventory final : public ServerPacket diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index 93961d15c9c..1cd4ab95dad 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -418,7 +418,7 @@ WorldPacket const* WorldPackets::Party::GroupNewLeader::Write() ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo const& playerInfo) { data.WriteBits(playerInfo.Name.size(), 6); - data.WriteBits(playerInfo.VoiceStateID.size(), 6); + data.WriteBits(playerInfo.VoiceStateID.size() + 1, 6); data.WriteBit(playerInfo.FromSocialQueue); data.WriteBit(playerInfo.VoiceChatSilenced); data << playerInfo.GUID; @@ -428,7 +428,8 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::PartyPlayerInfo co data << uint8(playerInfo.RolesAssigned); data << uint8(playerInfo.Class); data.WriteString(playerInfo.Name); - data.WriteString(playerInfo.VoiceStateID); + if (!playerInfo.VoiceStateID.empty()) + data << playerInfo.VoiceStateID; return data; } @@ -531,7 +532,7 @@ WorldPacket const* WorldPackets::Party::RaidMarkersChanged::Write() _worldPacket.WriteBits(RaidMarkers.size(), 4); _worldPacket.FlushBits(); - for (RaidMarker* raidMarker : RaidMarkers) + for (RaidMarker const* raidMarker : RaidMarkers) { _worldPacket << raidMarker->TransportGUID; _worldPacket << raidMarker->Location.GetMapId(); diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index 4290656c16e..3e784c10706 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -124,6 +124,14 @@ namespace WorldPackets std::string Name; }; + class GroupUninvite final : public ServerPacket + { + public: + GroupUninvite() : ServerPacket(SMSG_GROUP_UNINVITE, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + class RequestPartyMemberStats final : public ClientPacket { public: @@ -603,7 +611,7 @@ namespace WorldPackets uint8 PartyIndex = 0; uint32 ActiveMarkers = 0u; - std::vector<RaidMarker*> RaidMarkers; + std::vector<RaidMarker const*> RaidMarkers; }; class PartyKillLog final : public ServerPacket diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 338839e993d..8f651aeea7e 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -79,6 +79,9 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write() _worldPacket << int32(Stats.RequiredExpansion); _worldPacket << int32(Stats.VignetteID); _worldPacket << int32(Stats.Class); + _worldPacket << float(Stats.FadeRegionRadius); + _worldPacket << int32(Stats.WidgetSetID); + _worldPacket << int32(Stats.WidgetSetUnitConditionID); if (!Stats.Title.empty()) _worldPacket << Stats.Title; diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index a262b2bcc2f..4331df38c85 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -82,6 +82,9 @@ namespace WorldPackets uint32 RequiredExpansion = 0; uint32 VignetteID = 0; int32 Class = 0; + float FadeRegionRadius = 0.0f; + int32 WidgetSetID = 0; + int32 WidgetSetUnitConditionID = 0; std::array<uint32, 2> Flags; std::array<uint32, 2> ProxyCreatureID; std::array<std::string, 4> Name; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index 246a45992a5..0078bb8910d 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -146,6 +146,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << uint64(Info.AllowableRaces); _worldPacket << int32(Info.TreasurePickerID); _worldPacket << int32(Info.Expansion); + _worldPacket << int32(Info.ManagedWorldStateID); _worldPacket.WriteBits(Info.LogTitle.size(), 9); _worldPacket.WriteBits(Info.LogDescription.size(), 12); @@ -649,12 +650,17 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon data << int32(playerChoiceResponse.ChoiceArtFileID); data << int32(playerChoiceResponse.Flags); data << uint32(playerChoiceResponse.WidgetSetID); + data << uint32(playerChoiceResponse.UiTextureAtlasElementID); + data << uint32(playerChoiceResponse.SoundKitID); data << uint8(playerChoiceResponse.GroupID); data.WriteBits(playerChoiceResponse.Answer.length(), 9); data.WriteBits(playerChoiceResponse.Header.length(), 9); + data.WriteBits(playerChoiceResponse.SubHeader.length() , 7); + data.WriteBits(playerChoiceResponse.ButtonTooltip.length(), 9); data.WriteBits(playerChoiceResponse.Description.length(), 11); data.WriteBits(playerChoiceResponse.Confirmation.length(), 7); + data.WriteBit(playerChoiceResponse.RewardQuestID.is_initialized()); data.WriteBit(playerChoiceResponse.Reward.is_initialized()); data.FlushBits(); @@ -663,8 +669,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Quest::PlayerChoiceRespon data.WriteString(playerChoiceResponse.Answer); data.WriteString(playerChoiceResponse.Header); + data.WriteString(playerChoiceResponse.SubHeader); + data.WriteString(playerChoiceResponse.ButtonTooltip); data.WriteString(playerChoiceResponse.Description); data.WriteString(playerChoiceResponse.Confirmation); + + if (playerChoiceResponse.RewardQuestID) + data << uint32(*playerChoiceResponse.RewardQuestID); + return data; } @@ -674,6 +686,7 @@ WorldPacket const* WorldPackets::Quest::DisplayPlayerChoice::Write() _worldPacket << uint32(Responses.size()); _worldPacket << SenderGUID; _worldPacket << int32(UiTextureKitID); + _worldPacket << uint32(SoundKitID); _worldPacket.WriteBits(Question.length(), 8); _worldPacket.WriteBit(CloseChoiceFrame); _worldPacket.WriteBit(HideWarboardHeader); diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index aa449d93883..fd9ac659cae 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -162,6 +162,7 @@ namespace WorldPackets int32 TimeAllowed = 0; int32 TreasurePickerID = 0; int32 Expansion = 0; + int32 ManagedWorldStateID = 0; std::vector<QuestObjective> Objectives; int32 RewardItems[QUEST_REWARD_ITEM_COUNT] = { }; int32 RewardAmount[QUEST_REWARD_ITEM_COUNT] = { }; @@ -670,12 +671,17 @@ namespace WorldPackets int32 ChoiceArtFileID = 0; int32 Flags = 0; uint32 WidgetSetID = 0; + uint32 UiTextureAtlasElementID = 0; + uint32 SoundKitID = 0; uint8 GroupID = 0; std::string Answer; std::string Header; + std::string SubHeader; + std::string ButtonTooltip; std::string Description; std::string Confirmation; Optional<PlayerChoiceResponseReward> Reward; + Optional<uint32> RewardQuestID; }; class DisplayPlayerChoice final : public ServerPacket @@ -688,6 +694,7 @@ namespace WorldPackets ObjectGuid SenderGUID; int32 ChoiceID = 0; int32 UiTextureKitID = 0; + uint32 SoundKitID = 0; std::string Question; std::vector<PlayerChoiceResponse> Responses; bool CloseChoiceFrame = false; diff --git a/src/server/game/Server/Packets/ReputationPackets.h b/src/server/game/Server/Packets/ReputationPackets.h index 3cd07e55845..9ad7efafc27 100644 --- a/src/server/game/Server/Packets/ReputationPackets.h +++ b/src/server/game/Server/Packets/ReputationPackets.h @@ -25,7 +25,7 @@ namespace WorldPackets { namespace Reputation { - static uint16 const FactionCount = 300; + static uint16 const FactionCount = 350; class InitializeFactions final : public ServerPacket { diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 9469e675876..3e434f4899b 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -171,7 +171,7 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellTargetData { buffer.ResetBitPos(); - targetData.Flags = buffer.ReadBits(25); + targetData.Flags = buffer.ReadBits(26); bool hasSrcLocation = buffer.ReadBit(); bool hasDstLocation = buffer.ReadBit(); bool hasOrientation = buffer.ReadBit(); @@ -274,7 +274,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::TargetLocation co ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellTargetData const& spellTargetData) { - data.WriteBits(spellTargetData.Flags, 25); + data.WriteBits(spellTargetData.Flags, 26); data.WriteBit(spellTargetData.SrcLocation.is_initialized()); data.WriteBit(spellTargetData.DstLocation.is_initialized()); data.WriteBit(spellTargetData.Orientation.is_initialized()); @@ -312,6 +312,12 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellMissStatus c return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellHitStatus const& spellHitStatus) +{ + data << uint8(spellHitStatus.Reason); + return data; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellPowerData const& spellPowerData) { data << int32(spellPowerData.Cost); @@ -377,22 +383,26 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con data << spellCastData.Predict; data.WriteBits(spellCastData.HitTargets.size(), 16); data.WriteBits(spellCastData.MissTargets.size(), 16); + data.WriteBits(spellCastData.HitStatus.size(), 16); data.WriteBits(spellCastData.MissStatus.size(), 16); data.WriteBits(spellCastData.RemainingPower.size(), 9); data.WriteBit(spellCastData.RemainingRunes.is_initialized()); data.WriteBits(spellCastData.TargetPoints.size(), 16); data.FlushBits(); - for (WorldPackets::Spells::SpellMissStatus const& status : spellCastData.MissStatus) - data << status; + for (WorldPackets::Spells::SpellMissStatus const& missStatus : spellCastData.MissStatus) + data << missStatus; data << spellCastData.Target; - for (ObjectGuid const& target : spellCastData.HitTargets) - data << target; + for (ObjectGuid const& hitTarget : spellCastData.HitTargets) + data << hitTarget; + + for (ObjectGuid const& missTarget : spellCastData.MissTargets) + data << missTarget; - for (ObjectGuid const& target : spellCastData.MissTargets) - data << target; + for (WorldPackets::Spells::SpellHitStatus const& hitStatus : spellCastData.HitStatus) + data << hitStatus; for (WorldPackets::Spells::SpellPowerData const& power : spellCastData.RemainingPower) data << power; @@ -717,8 +727,8 @@ WorldPacket const* WorldPackets::Spells::PlayOrphanSpellVisual::Write() _worldPacket << Target; _worldPacket << int32(SpellVisualID); _worldPacket << float(TravelSpeed); - _worldPacket << float(UnkZero); - _worldPacket << float(Unk801); + _worldPacket << float(LaunchDelay); + _worldPacket << float(MinDuration); _worldPacket.WriteBit(SpeedAsTime); _worldPacket.FlushBits(); @@ -729,14 +739,15 @@ WorldPacket const* WorldPackets::Spells::PlaySpellVisual::Write() { _worldPacket << Source; _worldPacket << Target; - _worldPacket << Unk801_1; + _worldPacket << Transport; _worldPacket << TargetPosition; _worldPacket << uint32(SpellVisualID); _worldPacket << float(TravelSpeed); + _worldPacket << uint16(HitReason); _worldPacket << uint16(MissReason); _worldPacket << uint16(ReflectStatus); - _worldPacket << float(Orientation); - _worldPacket << float(Unk801_2); + _worldPacket << float(LaunchDelay); + _worldPacket << float(MinDuration); _worldPacket.WriteBit(SpeedAsTime); _worldPacket.FlushBits(); diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 919666c9b53..8e1d46cc3da 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -297,8 +297,19 @@ namespace WorldPackets ObjectGuid ServerCastID; }; + struct SpellHitStatus + { + SpellHitStatus() { } + SpellHitStatus(uint8 reason) : Reason(reason) { } + + uint8 Reason; + }; + struct SpellMissStatus { + SpellMissStatus() { } + SpellMissStatus(uint8 reason, uint8 reflectStatus) : Reason(reason), ReflectStatus(reflectStatus) { } + uint8 Reason = 0; uint8 ReflectStatus = 0; }; @@ -354,6 +365,7 @@ namespace WorldPackets uint32 CastTime = 0; std::vector<ObjectGuid> HitTargets; std::vector<ObjectGuid> MissTargets; + std::vector<SpellHitStatus> HitStatus; std::vector<SpellMissStatus> MissStatus; SpellTargetData Target; std::vector<SpellPowerData> RemainingPower; @@ -699,8 +711,8 @@ namespace WorldPackets int32 SpellVisualID = 0; bool SpeedAsTime = false; float TravelSpeed = 0.0f; - float UnkZero = 0.0f; // Always zero - float Unk801 = 0.0f; + float LaunchDelay = 0.0f; + float MinDuration = 0.0f; TaggedPosition<Position::XYZ> SourceRotation; // Vector of rotations, Orientation is z TaggedPosition<Position::XYZ> TargetLocation; // Exclusive with Target }; @@ -714,15 +726,16 @@ namespace WorldPackets ObjectGuid Source; ObjectGuid Target; // Exclusive with TargetPosition - ObjectGuid Unk801_1; - uint16 MissReason = 0; + ObjectGuid Transport; // Used when Target = Empty && (SpellVisual::Flags & 0x400) == 0 + TaggedPosition<Position::XYZ> TargetPosition; // Exclusive with Target uint32 SpellVisualID = 0; - bool SpeedAsTime = false; - uint16 ReflectStatus = 0; float TravelSpeed = 0.0f; - TaggedPosition<Position::XYZ> TargetPosition; // Exclusive with Target - float Orientation = 0.0f; - float Unk801_2 = 0.0f; + uint16 HitReason = 0; + uint16 MissReason = 0; + uint16 ReflectStatus = 0; + float LaunchDelay = 0.0f; + float MinDuration = 0.0f; + bool SpeedAsTime = false; }; class PlaySpellVisualKit final : public ServerPacket diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index 76ce613b611..5e4d8b362fb 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -38,6 +38,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket << uint32(BpayStoreProductDeliveryDelay); _worldPacket << uint32(ClubsPresenceUpdateTimer); + _worldPacket << uint32(HiddenUIClubsPresenceUpdateTimer); _worldPacket.WriteBit(VoiceEnabled); _worldPacket.WriteBit(EuropaTicketSystemStatus.is_initialized()); @@ -65,6 +66,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket.WriteBit(ClubsEnabled); _worldPacket.WriteBit(ClubsBattleNetClubTypeAllowed); _worldPacket.WriteBit(ClubsCharacterClubTypeAllowed); + _worldPacket.WriteBit(ClubsPresenceUpdateEnabled); _worldPacket.WriteBit(VoiceChatDisabledByParentalControl); _worldPacket.WriteBit(VoiceChatMutedByParentalControl); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index ee1704a0dac..17b404032dc 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -112,6 +112,7 @@ namespace WorldPackets int64 TokenBalanceAmount = 0; uint32 BpayStoreProductDeliveryDelay = 0; uint32 ClubsPresenceUpdateTimer = 0; + uint32 HiddenUIClubsPresenceUpdateTimer = 0; ///< Timer for updating club presence when communities ui frame is hidden bool ItemRestorationButtonEnabled = false; bool CharUndeleteEnabled = false; ///< Implemented bool BpayStoreDisabledByParentalControls = false; @@ -129,6 +130,7 @@ namespace WorldPackets bool ClubsEnabled = false; bool ClubsBattleNetClubTypeAllowed = false; bool ClubsCharacterClubTypeAllowed = false; + bool ClubsPresenceUpdateEnabled = false; bool VoiceChatDisabledByParentalControl = false; bool VoiceChatMutedByParentalControl = false; diff --git a/src/server/game/Server/Packets/TokenPackets.cpp b/src/server/game/Server/Packets/TokenPackets.cpp index 2f5b40e3fd9..8100f139604 100644 --- a/src/server/game/Server/Packets/TokenPackets.cpp +++ b/src/server/game/Server/Packets/TokenPackets.cpp @@ -49,7 +49,7 @@ WorldPacket const* WorldPackets::Token::WowTokenMarketPriceResponse::Write() _worldPacket << CurrentMarketPrice; _worldPacket << UnkInt; _worldPacket << Result; - _worldPacket << UnkInt2; + _worldPacket << AuctionDuration; return &_worldPacket; } diff --git a/src/server/game/Server/Packets/TokenPackets.h b/src/server/game/Server/Packets/TokenPackets.h index 21d8c2855cf..c7dd085c9b2 100644 --- a/src/server/game/Server/Packets/TokenPackets.h +++ b/src/server/game/Server/Packets/TokenPackets.h @@ -75,7 +75,7 @@ namespace WorldPackets uint64 CurrentMarketPrice = 0; uint32 UnkInt = 0; // send CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE uint32 Result = 0; - uint32 UnkInt2 = 0; + uint32 AuctionDuration = 0; // preset auction duration enum }; } } diff --git a/src/server/game/Server/Packets/ToyPackets.cpp b/src/server/game/Server/Packets/ToyPackets.cpp index a6a8d9706e9..111993db16d 100644 --- a/src/server/game/Server/Packets/ToyPackets.cpp +++ b/src/server/game/Server/Packets/ToyPackets.cpp @@ -32,17 +32,26 @@ WorldPacket const* WorldPackets::Toy::AccountToysUpdate::Write() _worldPacket.WriteBit(IsFullUpdate); _worldPacket.FlushBits(); - // both lists have to have the same size - _worldPacket << int32(Toys->size()); - _worldPacket << int32(Toys->size()); + // all lists have to have the same size + _worldPacket << int32(Toys->size()); // ids + _worldPacket << int32(Toys->size()); // favorites + _worldPacket << int32(Toys->size()); // fanfare - for (auto const& item : *Toys) - _worldPacket << uint32(item.first); + for (auto const& toy : *Toys) + _worldPacket << uint32(toy.first); - for (auto const& favourite : *Toys) - _worldPacket.WriteBit(favourite.second); + for (auto const& toy : *Toys) + _worldPacket.WriteBit(toy.second.HasFlag(ToyFlags::Favorite)); + + for (auto const& toy : *Toys) + _worldPacket.WriteBit(toy.second.HasFlag(ToyFlags::HasFanfare)); _worldPacket.FlushBits(); return &_worldPacket; } + +void WorldPackets::Toy::ToyClearFanfare::Read() +{ + _worldPacket >> ItemID; +} diff --git a/src/server/game/Server/Packets/ToyPackets.h b/src/server/game/Server/Packets/ToyPackets.h index a0157b6fab8..bc5699cf5ca 100644 --- a/src/server/game/Server/Packets/ToyPackets.h +++ b/src/server/game/Server/Packets/ToyPackets.h @@ -55,6 +55,16 @@ namespace WorldPackets bool IsFullUpdate = false; ToyBoxContainer const* Toys = nullptr; }; + + class ToyClearFanfare final : public ClientPacket + { + public: + ToyClearFanfare(WorldPacket&& packet) : ClientPacket(CMSG_TOY_CLEAR_FANFARE, std::move(packet)) { } + + void Read() override; + + uint32 ItemID = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3a4256e9977..32cc88a0aee 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -472,7 +472,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateRolePoll); DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode); DEFINE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectOpcode); - DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectPVP); DEFINE_HANDLER(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse); DEFINE_HANDLER(CMSG_ISLAND_QUEUE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ITEM_PURCHASE_REFUND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund); @@ -546,11 +545,11 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_FEATHER_FALL_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); DEFINE_HANDLER(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); - DEFINE_HANDLER(CMSG_MOVE_FORCE_MOVEMENT_FORCE_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); DEFINE_HANDLER(CMSG_MOVE_FORCE_ROOT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); DEFINE_HANDLER(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); + DEFINE_HANDLER(CMSG_MOVE_FORCE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); DEFINE_HANDLER(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); DEFINE_HANDLER(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck); @@ -564,6 +563,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck); DEFINE_HANDLER(CMSG_MOVE_REMOVE_MOVEMENT_FORCES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_MOVE_SEAMLESS_TRANSFER_COMPLETE, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_MOVE_SET_COLLISION_HEIGHT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleSetCollisionHeightAck); @@ -595,6 +595,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveTeleportAck); DEFINE_HANDLER(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode); DEFINE_HANDLER(CMSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_MOVE_UPDATE_FALL_SPEED, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementOpcodes); DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera); @@ -694,19 +695,20 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REPORT_ENABLED_ADDONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REPORT_PVP_PLAYER_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK); + DEFINE_HANDLER(CMSG_REPORT_SERVER_LAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestAccountData); DEFINE_HANDLER(CMSG_REQUEST_AREA_POI_UPDATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestBattlefieldStatusOpcode); DEFINE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCategoryCooldowns); DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCemeteryList); DEFINE_HANDLER(CMSG_REQUEST_CHALLENGE_MODE_AFFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_CONSUMPTION_CONVERSION_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_CROWD_CONTROL_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_FORCED_REACTIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestForcedReactionsOpcode); DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestPartyState); DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestGuildRewardsList); - DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestHonorStatsOpcode); DEFINE_HANDLER(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyJoinUpdates); DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode); @@ -714,8 +716,10 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayedTime); DEFINE_HANDLER(CMSG_REQUEST_PVP_BRAWL_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_PVP_REWARDS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPvpReward); + DEFINE_HANDLER(CMSG_REQUEST_QUEST_LINES_FOR_MAP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRaidInfoOpcode); DEFINE_HANDLER(CMSG_REQUEST_RATED_BATTLEFIELD_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRatedBattlefieldInfo); + DEFINE_HANDLER(CMSG_REQUEST_REALM_GUILD_MASTER_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_RESEARCH_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REQUEST_STABLED_PETS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestStabledPets); DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleExit); @@ -822,6 +826,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_TOGGLE_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TOGGLE_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTogglePvP); DEFINE_HANDLER(CMSG_TOTEM_DESTROYED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTotemDestroyed); + DEFINE_HANDLER(CMSG_TOY_CLEAR_FANFARE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleToyClearFanfare); DEFINE_HANDLER(CMSG_TRADE_SKILL_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerBuySpellOpcode); DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerListOpcode); @@ -897,10 +902,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_NO_CORPSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_PLAY_VISUAL_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_CROWD_CONTROL_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_MATCH_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_MATCH_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_FORGE_OPENED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARTIFACT_RESPEC_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -927,6 +934,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_HOTFIXES, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_EMPOWERED_ITEM_EQUIPPED_STATUS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_EMPOWERED_ITEM_RESPEC_OPEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AZERITE_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BAN_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -967,10 +975,13 @@ void OpcodeTable::Initialize() 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_TOY_DELIVERED, 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); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_CHARACTER_QUEUE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_GUILD_FOLLOW_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_GUILD_MASTER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_PURCHASE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1299,11 +1310,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INCOMING_SUMMON_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INCOMING_SUMMON_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIALIZE_FACTIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_PVP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1402,6 +1413,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVES_INIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVE_ADD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVE_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJ_EVENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MASTER_LOOT_CANDIDATE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1666,6 +1679,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_CAST_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_TOKEN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_CLEAR_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1816,7 +1830,7 @@ void OpcodeTable::Initialize() 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); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, XXXXXXXXXXXX, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TALENT_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 560ce425a96..5effe3ccd36 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -45,28 +45,28 @@ enum OpcodeMisc : uint16 enum OpcodeClient : uint16 { - CMSG_ACCEPT_GUILD_INVITE = 0x35FC, + CMSG_ACCEPT_GUILD_INVITE = 0x35FD, CMSG_ACCEPT_LEVEL_GRANT = 0x34FA, CMSG_ACCEPT_TRADE = 0x315A, - CMSG_ACCEPT_WARGAME_INVITE = 0x35E0, + CMSG_ACCEPT_WARGAME_INVITE = 0x35E1, CMSG_ACTIVATE_TAXI = 0x34AB, CMSG_ADDON_LIST = 0x35D8, - CMSG_ADD_BATTLENET_FRIEND = 0x365A, - CMSG_ADD_FRIEND = 0x36D0, - CMSG_ADD_IGNORE = 0x36D4, - CMSG_ADD_TOY = 0x3298, + CMSG_ADD_BATTLENET_FRIEND = 0x365C, + CMSG_ADD_FRIEND = 0x36D5, + CMSG_ADD_IGNORE = 0x36D9, + CMSG_ADD_TOY = 0x3297, CMSG_ADVENTURE_JOURNAL_OPEN_QUEST = 0x3201, - CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x333D, - CMSG_ADVENTURE_MAP_POI_QUERY = 0x3244, + CMSG_ADVENTURE_JOURNAL_START_QUEST = 0x333E, + CMSG_ADVENTURE_MAP_POI_QUERY = 0x3245, CMSG_ALTER_APPEARANCE = 0x34F6, CMSG_AREA_SPIRIT_HEALER_QUERY = 0x34B0, CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x34B1, CMSG_AREA_TRIGGER = 0x31D5, - CMSG_ARTIFACT_ADD_POWER = 0x31A9, - CMSG_ARTIFACT_SET_APPEARANCE = 0x31AB, + CMSG_ARTIFACT_ADD_POWER = 0x31A8, + CMSG_ARTIFACT_SET_APPEARANCE = 0x31AA, CMSG_ASSIGN_EQUIPMENT_SET_SPEC = 0x3209, - CMSG_ATTACK_STOP = 0x3256, - CMSG_ATTACK_SWING = 0x3255, + CMSG_ATTACK_STOP = 0x3254, + CMSG_ATTACK_SWING = 0x3253, CMSG_AUCTION_HELLO_REQUEST = 0x34CB, CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x34D1, CMSG_AUCTION_LIST_ITEMS = 0x34CE, @@ -85,46 +85,46 @@ enum OpcodeClient : uint16 CMSG_AUTO_EQUIP_ITEM = 0x399A, CMSG_AUTO_EQUIP_ITEM_SLOT = 0x399F, CMSG_AUTO_STORE_BAG_ITEM = 0x399B, - CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x335B, - CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x3347, + CMSG_AZERITE_EMPOWERED_ITEM_SELECT_POWER = 0x335C, + CMSG_AZERITE_EMPOWERED_ITEM_VIEWED = 0x3348, CMSG_BANKER_ACTIVATE = 0x34B3, CMSG_BATTLEFIELD_LEAVE = 0x3172, - CMSG_BATTLEFIELD_LIST = 0x317E, + CMSG_BATTLEFIELD_LIST = 0x317D, CMSG_BATTLEFIELD_PORT = 0x3527, - CMSG_BATTLEMASTER_HELLO = 0x32B0, + CMSG_BATTLEMASTER_HELLO = 0x32AF, CMSG_BATTLEMASTER_JOIN = 0x3522, CMSG_BATTLEMASTER_JOIN_ARENA = 0x3523, CMSG_BATTLEMASTER_JOIN_BRAWL = 0x3525, CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x3524, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D3, - CMSG_BATTLENET_REQUEST = 0x36F7, - CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x36FB, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36CB, - CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x3716, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CA, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C1, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36BB, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36BC, - CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x370F, - CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C4, - CMSG_BATTLE_PAY_REQUEST_CHARACTER_BOOST_UNREVOKE = 0x36C2, - CMSG_BATTLE_PAY_REQUEST_CURRENT_VAS_TRANSFER_QUEUES = 0x370C, - CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x370B, - CMSG_BATTLE_PAY_REQUEST_VAS_CHARACTER_QUEUE_TIME = 0x370D, - CMSG_BATTLE_PAY_START_PURCHASE = 0x36F3, - CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F4, - CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C3, - CMSG_BATTLE_PAY_VALIDATE_BNET_VAS_TRANSFER = 0x370E, - CMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x36F2, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x36D8, + CMSG_BATTLENET_REQUEST = 0x36FC, + CMSG_BATTLENET_REQUEST_REALM_LIST_TICKET = 0x3700, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x36D0, + CMSG_BATTLE_PAY_CANCEL_OPEN_CHECKOUT = 0x371B, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x36CF, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x36C6, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x36BE, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x36BF, + CMSG_BATTLE_PAY_OPEN_CHECKOUT = 0x3714, + CMSG_BATTLE_PAY_QUERY_CLASS_TRIAL_BOOST_RESULT = 0x36C9, + CMSG_BATTLE_PAY_REQUEST_CHARACTER_BOOST_UNREVOKE = 0x36C7, + CMSG_BATTLE_PAY_REQUEST_CURRENT_VAS_TRANSFER_QUEUES = 0x3711, + CMSG_BATTLE_PAY_REQUEST_PRICE_INFO = 0x3710, + CMSG_BATTLE_PAY_REQUEST_VAS_CHARACTER_QUEUE_TIME = 0x3712, + CMSG_BATTLE_PAY_START_PURCHASE = 0x36F8, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x36F9, + CMSG_BATTLE_PAY_TRIAL_BOOST_CHARACTER = 0x36C8, + CMSG_BATTLE_PAY_VALIDATE_BNET_VAS_TRANSFER = 0x3713, + CMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x36F7, CMSG_BATTLE_PET_CLEAR_FANFARE = 0x312C, - 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_DELETE_PET = 0x3625, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x3626, + CMSG_BATTLE_PET_MODIFY_NAME = 0x3628, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x3624, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x3623, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x362D, + CMSG_BATTLE_PET_SET_FLAGS = 0x3631, + CMSG_BATTLE_PET_SUMMON = 0x3629, CMSG_BATTLE_PET_UPDATE_DISPLAY_NOTIFY = 0x31DF, CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x31DE, CMSG_BEGIN_TRADE = 0x3157, @@ -132,55 +132,55 @@ enum OpcodeClient : uint16 CMSG_BLACK_MARKET_BID_ON_ITEM = 0x352F, CMSG_BLACK_MARKET_OPEN = 0x352D, CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x352E, - CMSG_BONUS_ROLL = 0x335C, - CMSG_BUG_REPORT = 0x3686, + CMSG_BONUS_ROLL = 0x335D, + CMSG_BUG_REPORT = 0x3688, CMSG_BUSY_TRADE = 0x3158, CMSG_BUY_BACK_ITEM = 0x34A4, CMSG_BUY_BANK_SLOT = 0x34B4, CMSG_BUY_ITEM = 0x34A3, CMSG_BUY_REAGENT_BANK = 0x34B5, - CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36EC, - CMSG_BUY_WOW_TOKEN_START = 0x36EB, + CMSG_BUY_WOW_TOKEN_CONFIRM = 0x36F1, + CMSG_BUY_WOW_TOKEN_START = 0x36F0, CMSG_CAGE_BATTLE_PET = 0x31F0, - CMSG_CALENDAR_ADD_EVENT = 0x367D, - CMSG_CALENDAR_COMMUNITY_FILTER = 0x3671, - CMSG_CALENDAR_COMPLAIN = 0x3679, - CMSG_CALENDAR_COPY_EVENT = 0x3678, - CMSG_CALENDAR_EVENT_INVITE = 0x3672, - CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x3676, - CMSG_CALENDAR_EVENT_RSVP = 0x3674, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x367B, - CMSG_CALENDAR_EVENT_STATUS = 0x3675, - CMSG_CALENDAR_GET = 0x366F, - CMSG_CALENDAR_GET_EVENT = 0x3670, - CMSG_CALENDAR_GET_NUM_PENDING = 0x367A, - CMSG_CALENDAR_REMOVE_EVENT = 0x3677, - CMSG_CALENDAR_REMOVE_INVITE = 0x3673, - CMSG_CALENDAR_UPDATE_EVENT = 0x367E, - CMSG_CANCEL_AURA = 0x31AD, + CMSG_CALENDAR_ADD_EVENT = 0x367F, + CMSG_CALENDAR_COMMUNITY_FILTER = 0x3673, + 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_REMOVE_EVENT = 0x3679, + CMSG_CALENDAR_REMOVE_INVITE = 0x3675, + CMSG_CALENDAR_UPDATE_EVENT = 0x3680, + CMSG_CANCEL_AURA = 0x31AC, CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x34E8, - CMSG_CANCEL_CAST = 0x329E, - CMSG_CANCEL_CHANNELLING = 0x326A, - CMSG_CANCEL_GROWTH_AURA = 0x326F, + CMSG_CANCEL_CAST = 0x329D, + CMSG_CANCEL_CHANNELLING = 0x3269, + CMSG_CANCEL_GROWTH_AURA = 0x326E, CMSG_CANCEL_MASTER_LOOT_ROLL = 0x3211, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31AC, - CMSG_CANCEL_MOUNT_AURA = 0x3280, - CMSG_CANCEL_QUEUED_SPELL = 0x317F, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x31AB, + CMSG_CANCEL_MOUNT_AURA = 0x327F, + CMSG_CANCEL_QUEUED_SPELL = 0x317E, CMSG_CANCEL_TEMP_ENCHANTMENT = 0x34F3, CMSG_CANCEL_TRADE = 0x315C, - CMSG_CAN_DUEL = 0x3662, - CMSG_CAN_REDEEM_WOW_TOKEN_FOR_BALANCE = 0x370A, - CMSG_CAST_SPELL = 0x329B, - CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x308F, - CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308E, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x3321, - CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x3322, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3303, - CMSG_CHANGE_SUB_GROUP = 0x364C, - CMSG_CHARACTER_RENAME_REQUEST = 0x36BF, - CMSG_CHAR_CUSTOMIZE = 0x368F, - CMSG_CHAR_DELETE = 0x369C, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3695, + CMSG_CAN_DUEL = 0x3664, + CMSG_CAN_REDEEM_WOW_TOKEN_FOR_BALANCE = 0x370F, + CMSG_CAST_SPELL = 0x329A, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x3090, + CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x308F, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x3320, + CMSG_CHANGE_BANK_BAG_SLOT_FLAG = 0x3321, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x3302, + CMSG_CHANGE_SUB_GROUP = 0x364E, + CMSG_CHARACTER_RENAME_REQUEST = 0x36C4, + CMSG_CHAR_CUSTOMIZE = 0x3693, + CMSG_CHAR_DELETE = 0x36A0, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x3699, CMSG_CHAT_ADDON_MESSAGE = 0x37EE, CMSG_CHAT_ADDON_MESSAGE_TARGETED = 0x37EF, CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x37E3, @@ -217,197 +217,196 @@ 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 = 0x36CC, - CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36EA, - CMSG_CHOICE_RESPONSE = 0x32A0, - CMSG_CLEAR_RAID_MARKER = 0x31A5, + CMSG_CHECK_RAF_EMAIL_ENABLED = 0x36D1, + CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x36EF, + CMSG_CHOICE_RESPONSE = 0x329F, + CMSG_CLEAR_RAID_MARKER = 0x31A4, CMSG_CLEAR_TRADE_ITEM = 0x315E, CMSG_CLIENT_PORT_GRAVEYARD = 0x3529, CMSG_CLOSE_INTERACTION = 0x3493, - CMSG_CLOSE_QUEST_CHOICE = 0x32A1, - CMSG_CLUB_INVITE = 0x36FA, - CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x3632, - CMSG_COMMENTATOR_ENABLE = 0x35F0, - CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F4, - CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F5, - CMSG_COMMENTATOR_GET_MAP_INFO = 0x35F1, - CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x35F3, - CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F2, - CMSG_COMMENTATOR_START_WARGAME = 0x35EF, - CMSG_COMPLAINT = 0x366C, + CMSG_CLOSE_QUEST_CHOICE = 0x32A0, + CMSG_CLUB_INVITE = 0x36FF, + CMSG_COLLECTION_ITEM_SET_FAVORITE = 0x3634, + CMSG_COMMENTATOR_ENABLE = 0x35F1, + CMSG_COMMENTATOR_ENTER_INSTANCE = 0x35F5, + CMSG_COMMENTATOR_EXIT_INSTANCE = 0x35F6, + CMSG_COMMENTATOR_GET_MAP_INFO = 0x35F2, + CMSG_COMMENTATOR_GET_PLAYER_COOLDOWNS = 0x35F4, + CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x35F3, + CMSG_COMMENTATOR_START_WARGAME = 0x35F0, + CMSG_COMPLAINT = 0x366E, CMSG_COMPLETE_CINEMATIC = 0x3547, CMSG_COMPLETE_MOVIE = 0x34DE, - CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31AA, + CMSG_CONFIRM_ARTIFACT_RESPEC = 0x31A9, CMSG_CONFIRM_RESPEC_WIPE = 0x320B, CMSG_CONNECT_TO_FAILED = 0x35D4, CMSG_CONTRIBUTION_CONTRIBUTE = 0x3557, CMSG_CONTRIBUTION_GET_STATE = 0x3558, CMSG_CONVERSATION_LINE_STARTED = 0x3548, - CMSG_CONVERT_CONSUMPTION_TIME = 0x36FD, - CMSG_CONVERT_RAID = 0x364E, - CMSG_CREATE_CHARACTER = 0x3643, - CMSG_CREATE_SHIPMENT = 0x32EF, - CMSG_DB_QUERY_BULK = 0x35E4, + CMSG_CONVERT_CONSUMPTION_TIME = 0x3702, + CMSG_CONVERT_RAID = 0x3650, + CMSG_CREATE_CHARACTER = 0x3645, + CMSG_CREATE_SHIPMENT = 0x32EE, + CMSG_DB_QUERY_BULK = 0x35E5, CMSG_DECLINE_GUILD_INVITES = 0x3520, CMSG_DECLINE_PETITION = 0x3536, CMSG_DELETE_EQUIPMENT_SET = 0x350D, - CMSG_DEL_FRIEND = 0x36D1, - CMSG_DEL_IGNORE = 0x36D5, - CMSG_DEPOSIT_REAGENT_BANK = 0x332A, - CMSG_DESTROY_ITEM = 0x3292, - 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 = 0x3611, - CMSG_DF_PROPOSAL_RESPONSE = 0x3607, - CMSG_DF_READY_CHECK_RESPONSE = 0x3618, - CMSG_DF_SET_ROLES = 0x3614, - CMSG_DF_TELEPORT = 0x3616, + CMSG_DEL_FRIEND = 0x36D6, + CMSG_DEL_IGNORE = 0x36DA, + CMSG_DEPOSIT_REAGENT_BANK = 0x3329, + CMSG_DESTROY_ITEM = 0x3291, + CMSG_DF_BOOT_PLAYER_VOTE = 0x3616, + CMSG_DF_GET_JOIN_STATUS = 0x3614, + CMSG_DF_GET_SYSTEM_INFO = 0x3613, + CMSG_DF_JOIN = 0x3609, + CMSG_DF_LEAVE = 0x3612, + CMSG_DF_PROPOSAL_RESPONSE = 0x3608, + CMSG_DF_READY_CHECK_RESPONSE = 0x3619, + CMSG_DF_SET_ROLES = 0x3615, + CMSG_DF_TELEPORT = 0x3617, CMSG_DISCARDED_TIME_SYNC_ACKS = 0x3A3C, CMSG_DISMISS_CRITTER = 0x34FC, CMSG_DO_MASTER_LOOT_ROLL = 0x3210, - CMSG_DO_READY_CHECK = 0x3633, + CMSG_DO_READY_CHECK = 0x3635, CMSG_DUEL_RESPONSE = 0x34E3, - CMSG_EJECT_PASSENGER = 0x3239, + CMSG_EJECT_PASSENGER = 0x323A, CMSG_EMOTE = 0x3543, CMSG_ENABLE_ENCRYPTION_ACK = 0x3767, CMSG_ENABLE_NAGLE = 0x376B, CMSG_ENABLE_TAXI_NODE = 0x34A9, - CMSG_ENGINE_SURVEY = 0x36E4, - CMSG_ENUM_CHARACTERS = 0x35E8, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36DE, + CMSG_ENGINE_SURVEY = 0x36E9, + CMSG_ENUM_CHARACTERS = 0x35E9, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x36E3, CMSG_FAR_SIGHT = 0x34E9, CMSG_GAME_EVENT_DEBUG_DISABLE = 0x31B0, CMSG_GAME_EVENT_DEBUG_ENABLE = 0x31AF, CMSG_GAME_OBJ_REPORT_USE = 0x34F0, CMSG_GAME_OBJ_USE = 0x34EF, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32DA, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32CB, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x331D, - CMSG_GARRISON_COMPLETE_MISSION = 0x3310, - CMSG_GARRISON_GENERATE_RECRUITS = 0x32DD, - CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32EB, - CMSG_GARRISON_GET_MISSION_REWARD = 0x3341, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3312, - CMSG_GARRISON_PURCHASE_BUILDING = 0x32C7, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32DF, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x3307, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32DB, - CMSG_GARRISON_RENAME_FOLLOWER = 0x32DC, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32C6, - CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32E4, - CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32EE, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32ED, - CMSG_GARRISON_RESEARCH_TALENT = 0x32E0, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32C8, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32D8, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32D4, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32DE, - CMSG_GARRISON_START_MISSION = 0x330F, - CMSG_GARRISON_SWAP_BUILDINGS = 0x32CC, - CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E7, - CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x36B7, - CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3683, - CMSG_GET_GARRISON_INFO = 0x32C1, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x32D9, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x32CA, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x331C, + CMSG_GARRISON_COMPLETE_MISSION = 0x330F, + CMSG_GARRISON_GENERATE_RECRUITS = 0x32DC, + CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x32EA, + CMSG_GARRISON_GET_MISSION_REWARD = 0x3342, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x3311, + CMSG_GARRISON_PURCHASE_BUILDING = 0x32C6, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x32DE, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x3306, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x32DA, + CMSG_GARRISON_RENAME_FOLLOWER = 0x32DB, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x32C5, + CMSG_GARRISON_REQUEST_CLASS_SPEC_CATEGORY_INFO = 0x32E3, + CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x32ED, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x32EC, + CMSG_GARRISON_RESEARCH_TALENT = 0x32DF, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x32C7, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x32D7, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x32D3, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x32DD, + CMSG_GARRISON_START_MISSION = 0x330E, + CMSG_GARRISON_SWAP_BUILDINGS = 0x32CB, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x35E8, + CMSG_GET_ACCOUNT_CHARACTER_LIST = 0x36BA, + CMSG_GET_CHALLENGE_MODE_REWARDS = 0x3685, + CMSG_GET_GARRISON_INFO = 0x32C0, CMSG_GET_ITEM_PURCHASE_DATA = 0x3531, - CMSG_GET_MIRROR_IMAGE_DATA = 0x3296, - CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EE, - CMSG_GET_REMAINING_GAME_TIME = 0x36ED, - CMSG_GET_TROPHY_LIST = 0x3300, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E0, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3693, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x3692, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3691, + CMSG_GET_MIRROR_IMAGE_DATA = 0x3295, + CMSG_GET_PVP_OPTIONS_ENABLED = 0x35EF, + CMSG_GET_REMAINING_GAME_TIME = 0x36F2, + CMSG_GET_TROPHY_LIST = 0x32FF, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x36E5, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x3697, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x3696, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x3695, CMSG_GOSSIP_SELECT_OPTION = 0x3494, CMSG_GRANT_LEVEL = 0x34F8, - CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308D, - CMSG_GUILD_ADD_RANK = 0x3064, - CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x305F, - CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x3061, + CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x308E, + CMSG_GUILD_ADD_RANK = 0x3065, + CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x3060, + CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x3062, CMSG_GUILD_BANK_ACTIVATE = 0x34B6, CMSG_GUILD_BANK_BUY_TAB = 0x34C4, CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x34C6, - CMSG_GUILD_BANK_LOG_QUERY = 0x3082, + CMSG_GUILD_BANK_LOG_QUERY = 0x3083, CMSG_GUILD_BANK_QUERY_TAB = 0x34C3, - CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3083, - CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3086, - CMSG_GUILD_BANK_TEXT_QUERY = 0x3087, + CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x3084, + CMSG_GUILD_BANK_SET_TAB_TEXT = 0x3087, + CMSG_GUILD_BANK_TEXT_QUERY = 0x3088, CMSG_GUILD_BANK_UPDATE_TAB = 0x34C5, CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x34C7, - CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x307B, - CMSG_GUILD_CHANGE_NAME_REQUEST = 0x307E, - CMSG_GUILD_DECLINE_INVITATION = 0x3060, - CMSG_GUILD_DELETE = 0x3068, - CMSG_GUILD_DELETE_RANK = 0x3065, - CMSG_GUILD_DEMOTE_MEMBER = 0x305E, - CMSG_GUILD_EVENT_LOG_QUERY = 0x3085, - CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x3071, - CMSG_GUILD_GET_RANKS = 0x306D, - CMSG_GUILD_GET_ROSTER = 0x3073, - CMSG_GUILD_INVITE_BY_NAME = 0x3606, - CMSG_GUILD_LEAVE = 0x3062, - CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x308C, - CMSG_GUILD_NEWS_UPDATE_STICKY = 0x306E, - CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x3063, - CMSG_GUILD_PERMISSIONS_QUERY = 0x3084, - CMSG_GUILD_PROMOTE_MEMBER = 0x305D, - CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x306B, - CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x3069, - CMSG_GUILD_QUERY_NEWS = 0x306C, - CMSG_GUILD_QUERY_RECIPES = 0x306A, - CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3088, - CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x306F, - CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3070, - CMSG_GUILD_SET_GUILD_MASTER = 0x36C6, - CMSG_GUILD_SET_MEMBER_NOTE = 0x3072, - CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3067, - CMSG_GUILD_SHIFT_RANK = 0x3066, - CMSG_GUILD_UPDATE_INFO_TEXT = 0x3075, - CMSG_GUILD_UPDATE_MOTD_TEXT = 0x3074, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x307C, + CMSG_GUILD_CHANGE_NAME_REQUEST = 0x307F, + CMSG_GUILD_DECLINE_INVITATION = 0x3061, + CMSG_GUILD_DELETE = 0x3069, + CMSG_GUILD_DELETE_RANK = 0x3066, + CMSG_GUILD_DEMOTE_MEMBER = 0x305F, + CMSG_GUILD_EVENT_LOG_QUERY = 0x3086, + CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x3072, + CMSG_GUILD_GET_RANKS = 0x306E, + CMSG_GUILD_GET_ROSTER = 0x3074, + CMSG_GUILD_INVITE_BY_NAME = 0x3607, + CMSG_GUILD_LEAVE = 0x3063, + CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x308D, + CMSG_GUILD_NEWS_UPDATE_STICKY = 0x306F, + CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x3064, + CMSG_GUILD_PERMISSIONS_QUERY = 0x3085, + CMSG_GUILD_PROMOTE_MEMBER = 0x305E, + CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x306C, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x306A, + CMSG_GUILD_QUERY_NEWS = 0x306D, + CMSG_GUILD_QUERY_RECIPES = 0x306B, + CMSG_GUILD_REPLACE_GUILD_MASTER = 0x3089, + CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x3070, + CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x3071, + CMSG_GUILD_SET_GUILD_MASTER = 0x36CB, + CMSG_GUILD_SET_MEMBER_NOTE = 0x3073, + CMSG_GUILD_SET_RANK_PERMISSIONS = 0x3068, + CMSG_GUILD_SHIFT_RANK = 0x3067, + CMSG_GUILD_UPDATE_INFO_TEXT = 0x3076, + CMSG_GUILD_UPDATE_MOTD_TEXT = 0x3075, CMSG_HEARTH_AND_RESURRECT = 0x3509, - CMSG_HOTFIX_REQUEST = 0x35E5, + CMSG_HOTFIX_REQUEST = 0x35E6, CMSG_IGNORE_TRADE = 0x3159, CMSG_INITIATE_ROLE_POLL = 0x35DA, CMSG_INITIATE_TRADE = 0x3156, CMSG_INSPECT = 0x352B, - CMSG_INSPECT_PVP = 0x36A2, CMSG_INSTANCE_LOCK_RESPONSE = 0x350E, - CMSG_ISLAND_QUEUE = 0x3387, + CMSG_ISLAND_QUEUE = 0x3388, CMSG_ITEM_PURCHASE_REFUND = 0x3532, - CMSG_ITEM_TEXT_QUERY = 0x331E, + CMSG_ITEM_TEXT_QUERY = 0x331D, CMSG_JOIN_PET_BATTLE_QUEUE = 0x31DC, CMSG_JOIN_RATED_BATTLEGROUND = 0x3177, - CMSG_KEEP_ALIVE = 0x367F, + CMSG_KEEP_ALIVE = 0x3681, CMSG_KEYBOUND_OVERRIDE = 0x3222, CMSG_LEARN_PVP_TALENTS = 0x3556, CMSG_LEARN_TALENTS = 0x3554, - CMSG_LEAVE_GROUP = 0x3649, + CMSG_LEAVE_GROUP = 0x364B, CMSG_LEAVE_PET_BATTLE_QUEUE = 0x31DD, - 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 = 0x3359, - CMSG_LFG_LIST_LEAVE = 0x3609, - CMSG_LFG_LIST_SEARCH = 0x360B, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x335A, - 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 = 0x361C, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x360D, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x360E, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x360F, + CMSG_LFG_LIST_GET_STATUS = 0x360B, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x3610, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x3611, + CMSG_LFG_LIST_JOIN = 0x335A, + CMSG_LFG_LIST_LEAVE = 0x360A, + CMSG_LFG_LIST_SEARCH = 0x360C, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x335B, + CMSG_LF_GUILD_ADD_RECRUIT = 0x361C, + CMSG_LF_GUILD_BROWSE = 0x361E, + CMSG_LF_GUILD_DECLINE_RECRUIT = 0x3079, + CMSG_LF_GUILD_GET_APPLICATIONS = 0x307A, + CMSG_LF_GUILD_GET_GUILD_POST = 0x3077, + CMSG_LF_GUILD_GET_RECRUITS = 0x3078, + CMSG_LF_GUILD_REMOVE_RECRUIT = 0x307B, + CMSG_LF_GUILD_SET_GUILD_POST = 0x361D, CMSG_LIST_INVENTORY = 0x34A1, - CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36BA, - CMSG_LIVE_REGION_CHARACTER_COPY = 0x36B9, - CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36B8, - CMSG_LOADING_SCREEN_NOTIFY = 0x35F8, - CMSG_LOAD_SELECTED_TROPHY = 0x3301, + CMSG_LIVE_REGION_ACCOUNT_RESTORE = 0x36BD, + CMSG_LIVE_REGION_CHARACTER_COPY = 0x36BC, + CMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST = 0x36BB, + CMSG_LOADING_SCREEN_NOTIFY = 0x35F9, + CMSG_LOAD_SELECTED_TROPHY = 0x3300, CMSG_LOGOUT_CANCEL = 0x34D9, CMSG_LOGOUT_INSTANT = 0x34DA, CMSG_LOGOUT_REQUEST = 0x34D7, @@ -418,22 +417,22 @@ enum OpcodeClient : uint16 CMSG_LOOT_RELEASE = 0x3212, CMSG_LOOT_ROLL = 0x3213, CMSG_LOOT_UNIT = 0x320C, - CMSG_LOW_LEVEL_RAID1 = 0x36A0, + CMSG_LOW_LEVEL_RAID1 = 0x36A4, CMSG_LOW_LEVEL_RAID2 = 0x3515, CMSG_MAIL_CREATE_TEXT_ITEM = 0x353D, CMSG_MAIL_DELETE = 0x3224, CMSG_MAIL_GET_LIST = 0x3538, CMSG_MAIL_MARK_AS_READ = 0x353C, - CMSG_MAIL_RETURN_TO_SENDER = 0x3655, + CMSG_MAIL_RETURN_TO_SENDER = 0x3657, CMSG_MAIL_TAKE_ITEM = 0x353A, CMSG_MAIL_TAKE_MONEY = 0x3539, CMSG_MAKE_CONTITIONAL_APPEARANCE_PERMANENT = 0x3227, CMSG_MASTER_LOOT_ITEM = 0x320F, - CMSG_MINIMAP_PING = 0x364B, - CMSG_MISSILE_TRAJECTORY_COLLISION = 0x318A, + CMSG_MINIMAP_PING = 0x364D, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x3189, CMSG_MOUNT_CLEAR_FANFARE = 0x312D, - CMSG_MOUNT_SET_FAVORITE = 0x3631, - CMSG_MOUNT_SPECIAL_ANIM = 0x3281, + CMSG_MOUNT_SET_FAVORITE = 0x3633, + CMSG_MOUNT_SPECIAL_ANIM = 0x3280, CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x3A12, CMSG_MOVE_CHANGE_TRANSPORT = 0x3A2C, CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x3A31, @@ -446,11 +445,11 @@ enum OpcodeClient : uint16 CMSG_MOVE_FEATHER_FALL_ACK = 0x3A19, CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x3A2B, CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x3A2A, - CMSG_MOVE_FORCE_MOVEMENT_FORCE_SPEED_CHANGE_ACK = 0x3A3D, CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x3A2F, CMSG_MOVE_FORCE_ROOT_ACK = 0x3A0B, CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x3A09, CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x3A08, + CMSG_MOVE_FORCE_SET_MOD_MOVEMENT_FORCE_MAGNITUDE_ACK = 0x3A3D, CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x3A1F, CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x3A0A, CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x3A20, @@ -464,6 +463,7 @@ enum OpcodeClient : uint16 CMSG_MOVE_KNOCK_BACK_ACK = 0x3A0F, CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x3A14, CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x3A13, + CMSG_MOVE_SEAMLESS_TRANSFER_COMPLETE = 0x3A3F, CMSG_MOVE_SET_CAN_FLY_ACK = 0x3A24, CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x3A22, CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x3A36, @@ -495,71 +495,72 @@ enum OpcodeClient : uint16 CMSG_MOVE_TELEPORT_ACK = 0x39F8, CMSG_MOVE_TIME_SKIPPED = 0x3A18, CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x3A05, + CMSG_MOVE_UPDATE_FALL_SPEED = 0x3A17, CMSG_MOVE_WATER_WALK_ACK = 0x3A1A, CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x31D2, CMSG_NEXT_CINEMATIC_CAMERA = 0x3546, - CMSG_OBJECT_UPDATE_FAILED = 0x3180, - CMSG_OBJECT_UPDATE_RESCUED = 0x3181, - CMSG_OFFER_PETITION = 0x36B0, + CMSG_OBJECT_UPDATE_FAILED = 0x317F, + CMSG_OBJECT_UPDATE_RESCUED = 0x3180, + CMSG_OFFER_PETITION = 0x36B3, CMSG_OPENING_CINEMATIC = 0x3545, - CMSG_OPEN_ITEM = 0x331F, - CMSG_OPEN_MISSION_NPC = 0x32E6, - CMSG_OPEN_SHIPMENT_NPC = 0x32EC, - CMSG_OPEN_TRADESKILL_NPC = 0x32F7, + CMSG_OPEN_ITEM = 0x331E, + CMSG_OPEN_MISSION_NPC = 0x32E5, + CMSG_OPEN_SHIPMENT_NPC = 0x32EB, + CMSG_OPEN_TRADESKILL_NPC = 0x32F6, CMSG_OPT_OUT_OF_LOOT = 0x34F7, - CMSG_PARTY_INVITE = 0x3602, - CMSG_PARTY_INVITE_RESPONSE = 0x3603, - CMSG_PARTY_UNINVITE = 0x3647, + CMSG_PARTY_INVITE = 0x3603, + CMSG_PARTY_INVITE_RESPONSE = 0x3604, + CMSG_PARTY_UNINVITE = 0x3649, CMSG_PETITION_BUY = 0x34C9, - CMSG_PETITION_RENAME_GUILD = 0x36C7, + CMSG_PETITION_RENAME_GUILD = 0x36CC, CMSG_PETITION_SHOW_LIST = 0x34C8, CMSG_PETITION_SHOW_SIGNATURES = 0x34CA, CMSG_PET_ABANDON = 0x348D, CMSG_PET_ACTION = 0x348B, CMSG_PET_BATTLE_FINAL_NOTIFY = 0x31E1, - CMSG_PET_BATTLE_INPUT = 0x3640, + CMSG_PET_BATTLE_INPUT = 0x3642, CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x3223, CMSG_PET_BATTLE_QUIT_NOTIFY = 0x31E0, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3641, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x3643, CMSG_PET_BATTLE_REQUEST_PVP = 0x31DA, CMSG_PET_BATTLE_REQUEST_UPDATE = 0x31DB, CMSG_PET_BATTLE_REQUEST_WILD = 0x31D8, CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x31E2, CMSG_PET_BATTLE_WILD_LOCATION_FAIL = 0x31D9, CMSG_PET_CANCEL_AURA = 0x348E, - CMSG_PET_CAST_SPELL = 0x329A, - CMSG_PET_RENAME = 0x3685, + CMSG_PET_CAST_SPELL = 0x3299, + CMSG_PET_RENAME = 0x3687, CMSG_PET_SET_ACTION = 0x348A, CMSG_PET_SPELL_AUTOCAST = 0x348F, CMSG_PET_STOP_ATTACK = 0x348C, CMSG_PING = 0x3768, - CMSG_PLAYER_LOGIN = 0x35EA, + CMSG_PLAYER_LOGIN = 0x35EB, CMSG_PROTOCOL_MISMATCH = 0x376E, CMSG_PUSH_QUEST_TO_PARTY = 0x349F, - CMSG_PVP_LOG_DATA = 0x317B, - CMSG_QUERY_BATTLE_PET_NAME = 0x3276, - CMSG_QUERY_COMMUNITY_NAME = 0x368C, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3660, - CMSG_QUERY_CORPSE_TRANSPORT = 0x3661, - CMSG_QUERY_COUNTDOWN_TIMER = 0x31A8, - CMSG_QUERY_CREATURE = 0x3270, - CMSG_QUERY_GAME_OBJECT = 0x3271, - CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3277, - CMSG_QUERY_GUILD_INFO = 0x368E, + CMSG_PVP_LOG_DATA = 0x317A, + CMSG_QUERY_BATTLE_PET_NAME = 0x3275, + CMSG_QUERY_COMMUNITY_NAME = 0x368E, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x3662, + CMSG_QUERY_CORPSE_TRANSPORT = 0x3663, + CMSG_QUERY_COUNTDOWN_TIMER = 0x31A7, + CMSG_QUERY_CREATURE = 0x326F, + CMSG_QUERY_GAME_OBJECT = 0x3270, + CMSG_QUERY_GARRISON_CREATURE_NAME = 0x3276, + CMSG_QUERY_GUILD_INFO = 0x3691, CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x3503, CMSG_QUERY_NEXT_MAIL_TIME = 0x353B, - CMSG_QUERY_NPC_TEXT = 0x3272, - CMSG_QUERY_PAGE_TEXT = 0x3274, - CMSG_QUERY_PETITION = 0x3278, - CMSG_QUERY_PET_NAME = 0x3275, - CMSG_QUERY_PLAYER_NAME = 0x368B, + CMSG_QUERY_NPC_TEXT = 0x3271, + CMSG_QUERY_PAGE_TEXT = 0x3273, + CMSG_QUERY_PETITION = 0x3277, + CMSG_QUERY_PET_NAME = 0x3274, + CMSG_QUERY_PLAYER_NAME = 0x368D, CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x3174, - CMSG_QUERY_QUEST_INFO = 0x3273, - CMSG_QUERY_REALM_NAME = 0x368D, - CMSG_QUERY_SCENARIO_POI = 0x3656, + CMSG_QUERY_QUEST_INFO = 0x3272, + CMSG_QUERY_REALM_NAME = 0x3690, + CMSG_QUERY_SCENARIO_POI = 0x3658, CMSG_QUERY_TIME = 0x34D6, - CMSG_QUERY_TREASURE_PICKER = 0x3343, - CMSG_QUERY_VOID_STORAGE = 0x31A1, + CMSG_QUERY_TREASURE_PICKER = 0x3344, + CMSG_QUERY_VOID_STORAGE = 0x31A0, CMSG_QUEST_CONFIRM_ACCEPT = 0x349E, CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x3498, CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x349A, @@ -570,147 +571,150 @@ enum OpcodeClient : uint16 CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x349D, CMSG_QUEST_GIVER_STATUS_QUERY = 0x349C, CMSG_QUEST_LOG_REMOVE_QUEST = 0x3530, - CMSG_QUEST_POI_QUERY = 0x36B1, + CMSG_QUEST_POI_QUERY = 0x36B4, CMSG_QUEST_PUSH_RESULT = 0x34A0, CMSG_QUEUED_MESSAGES_END = 0x376C, - CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x3709, - CMSG_QUICK_JOIN_REQUEST_INVITE = 0x3708, - CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x3707, - CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x3706, - CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36E5, - CMSG_RANDOM_ROLL = 0x3654, - CMSG_READY_CHECK_RESPONSE = 0x3634, - CMSG_READ_ITEM = 0x3320, + CMSG_QUICK_JOIN_AUTO_ACCEPT_REQUESTS = 0x370E, + CMSG_QUICK_JOIN_REQUEST_INVITE = 0x370D, + CMSG_QUICK_JOIN_RESPOND_TO_INVITE = 0x370C, + CMSG_QUICK_JOIN_SIGNAL_TOAST_DISPLAYED = 0x370B, + CMSG_RAID_OR_BATTLEGROUND_ENGINE_SURVEY = 0x36EA, + CMSG_RANDOM_ROLL = 0x3656, + CMSG_READY_CHECK_RESPONSE = 0x3636, + CMSG_READ_ITEM = 0x331F, CMSG_RECLAIM_CORPSE = 0x34DC, - CMSG_RECRUIT_A_FRIEND = 0x36CD, - CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36EF, - CMSG_REDEEM_WOW_TOKEN_START = 0x36EE, - CMSG_REMOVE_NEW_ITEM = 0x3346, - CMSG_REORDER_CHARACTERS = 0x35E9, + CMSG_RECRUIT_A_FRIEND = 0x36D2, + CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x36F4, + CMSG_REDEEM_WOW_TOKEN_START = 0x36F3, + CMSG_REMOVE_NEW_ITEM = 0x3347, + CMSG_REORDER_CHARACTERS = 0x35EA, CMSG_REPAIR_ITEM = 0x34ED, - CMSG_REPLACE_TROPHY = 0x3302, + CMSG_REPLACE_TROPHY = 0x3301, CMSG_REPOP_REQUEST = 0x3528, - CMSG_REPORT_CLIENT_VARIABLES = 0x3703, - CMSG_REPORT_ENABLED_ADDONS = 0x3702, - CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x3704, + CMSG_REPORT_CLIENT_VARIABLES = 0x3708, + CMSG_REPORT_ENABLED_ADDONS = 0x3707, + CMSG_REPORT_KEYBINDING_EXECUTION_COUNTS = 0x3709, CMSG_REPORT_PVP_PLAYER_AFK = 0x34F5, - CMSG_REQUEST_ACCOUNT_DATA = 0x3696, - CMSG_REQUEST_AREA_POI_UPDATE = 0x3345, - CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DC, - CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317D, + CMSG_REPORT_SERVER_LAG = 0x338D, + CMSG_REQUEST_ACCOUNT_DATA = 0x369A, + CMSG_REQUEST_AREA_POI_UPDATE = 0x3346, + CMSG_REQUEST_BATTLEFIELD_STATUS = 0x35DD, + CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x317C, CMSG_REQUEST_CEMETERY_LIST = 0x3175, CMSG_REQUEST_CHALLENGE_MODE_AFFIXES = 0x3205, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32B3, - CMSG_REQUEST_CONSUMPTION_CONVERSION_INFO = 0x36FC, + CMSG_REQUEST_CHARACTER_GUILD_FOLLOW_INFO = 0x3692, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x32B2, + CMSG_REQUEST_CONSUMPTION_CONVERSION_INFO = 0x3701, CMSG_REQUEST_CROWD_CONTROL_SPELL = 0x352C, CMSG_REQUEST_FORCED_REACTIONS = 0x3207, - CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A7, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A6, - CMSG_REQUEST_HONOR_STATS = 0x317A, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x32A3, - CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F7, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3653, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x31A6, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x31A5, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x32A2, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x35F8, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x3655, CMSG_REQUEST_PET_INFO = 0x3490, - CMSG_REQUEST_PLAYED_TIME = 0x327B, - CMSG_REQUEST_PVP_BRAWL_INFO = 0x3195, - CMSG_REQUEST_PVP_REWARDS = 0x3194, - CMSG_REQUEST_RAID_INFO = 0x36C8, - CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E3, + CMSG_REQUEST_PLAYED_TIME = 0x327A, + CMSG_REQUEST_PVP_BRAWL_INFO = 0x3194, + CMSG_REQUEST_PVP_REWARDS = 0x3193, + CMSG_REQUEST_QUEST_LINES_FOR_MAP = 0x3389, + CMSG_REQUEST_RAID_INFO = 0x36CD, + CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x35E4, + CMSG_REQUEST_REALM_GUILD_MASTER_INFO = 0x309B, CMSG_REQUEST_RESEARCH_HISTORY = 0x3167, CMSG_REQUEST_STABLED_PETS = 0x3491, - CMSG_REQUEST_VEHICLE_EXIT = 0x3234, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x3236, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3235, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x3237, - CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3344, - CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36E7, + CMSG_REQUEST_VEHICLE_EXIT = 0x3235, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x3237, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x3236, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x3238, + CMSG_REQUEST_WORLD_QUEST_UPDATE = 0x3345, + CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x36EC, CMSG_RESET_CHALLENGE_MODE = 0x3203, CMSG_RESET_CHALLENGE_MODE_CHEAT = 0x3204, - CMSG_RESET_INSTANCES = 0x3668, - CMSG_RESURRECT_RESPONSE = 0x3684, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x3304, - CMSG_RIDE_VEHICLE_INTERACT = 0x3238, - CMSG_SAVE_CUF_PROFILES = 0x318B, + CMSG_RESET_INSTANCES = 0x366A, + CMSG_RESURRECT_RESPONSE = 0x3686, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x3303, + CMSG_RIDE_VEHICLE_INTERACT = 0x3239, + CMSG_SAVE_CUF_PROFILES = 0x318A, CMSG_SAVE_EQUIPMENT_SET = 0x350C, - CMSG_SAVE_GUILD_EMBLEM = 0x32A7, + CMSG_SAVE_GUILD_EMBLEM = 0x32A6, CMSG_SCENE_PLAYBACK_CANCELED = 0x321F, CMSG_SCENE_PLAYBACK_COMPLETE = 0x321E, CMSG_SCENE_TRIGGER_EVENT = 0x3220, CMSG_SELF_RES = 0x3533, CMSG_SELL_ITEM = 0x34A2, - CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36E9, - CMSG_SELL_WOW_TOKEN_START = 0x36E8, - CMSG_SEND_CONTACT_LIST = 0x36CF, - CMSG_SEND_MAIL = 0x35FA, - CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3620, + CMSG_SELL_WOW_TOKEN_CONFIRM = 0x36EE, + CMSG_SELL_WOW_TOKEN_START = 0x36ED, + CMSG_SEND_CONTACT_LIST = 0x36D4, + CMSG_SEND_MAIL = 0x35FB, + CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x3621, CMSG_SEND_TEXT_EMOTE = 0x3488, CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x3225, CMSG_SET_ACTION_BAR_TOGGLES = 0x3534, - CMSG_SET_ACTION_BUTTON = 0x3635, + CMSG_SET_ACTION_BUTTON = 0x3637, CMSG_SET_ACTIVE_MOVER = 0x3A37, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32B4, - CMSG_SET_ASSISTANT_LEADER = 0x364F, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3323, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3324, - CMSG_SET_CONTACT_NOTES = 0x36D2, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x32B3, + CMSG_SET_ASSISTANT_LEADER = 0x3651, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x3322, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x3323, + CMSG_SET_CONTACT_NOTES = 0x36D7, CMSG_SET_CURRENCY_FLAGS = 0x3169, CMSG_SET_DIFFICULTY_ID = 0x3221, - CMSG_SET_DUNGEON_DIFFICULTY = 0x3682, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3617, + CMSG_SET_DUNGEON_DIFFICULTY = 0x3684, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x3618, CMSG_SET_FACTION_AT_WAR = 0x34DF, CMSG_SET_FACTION_INACTIVE = 0x34E1, CMSG_SET_FACTION_NOT_AT_WAR = 0x34E0, CMSG_SET_GAME_EVENT_DEBUG_VIEW_STATE = 0x31B8, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3326, - CMSG_SET_LFG_BONUS_FACTION_ID = 0x32A2, - CMSG_SET_LOOT_METHOD = 0x3648, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x3325, + CMSG_SET_LFG_BONUS_FACTION_ID = 0x32A1, + CMSG_SET_LOOT_METHOD = 0x364A, CMSG_SET_LOOT_SPECIALIZATION = 0x3541, - CMSG_SET_PARTY_ASSIGNMENT = 0x3651, - CMSG_SET_PARTY_LEADER = 0x364A, + CMSG_SET_PARTY_ASSIGNMENT = 0x3653, + CMSG_SET_PARTY_LEADER = 0x364C, CMSG_SET_PET_SLOT = 0x3168, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x368A, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x368C, CMSG_SET_PREFERRED_CEMETERY = 0x3176, - CMSG_SET_PVP = 0x32AB, - CMSG_SET_RAID_DIFFICULTY = 0x36DC, + CMSG_SET_PVP = 0x32AA, + CMSG_SET_RAID_DIFFICULTY = 0x36E1, CMSG_SET_ROLE = 0x35D9, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x3688, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x368A, CMSG_SET_SELECTION = 0x352A, CMSG_SET_SHEATHED = 0x3489, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3325, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x3324, CMSG_SET_TAXI_BENCHMARK_MODE = 0x34F4, - CMSG_SET_TITLE = 0x327F, + CMSG_SET_TITLE = 0x327E, CMSG_SET_TRADE_CURRENCY = 0x3160, CMSG_SET_TRADE_GOLD = 0x315F, CMSG_SET_TRADE_ITEM = 0x315D, - CMSG_SET_USING_PARTY_GARRISON = 0x32E8, - CMSG_SET_WAR_MODE = 0x32AC, + CMSG_SET_USING_PARTY_GARRISON = 0x32E7, + CMSG_SET_WAR_MODE = 0x32AB, CMSG_SET_WATCHED_FACTION = 0x34E2, - CMSG_SHOW_TRADE_SKILL = 0x36C0, + CMSG_SHOW_TRADE_SKILL = 0x36C5, CMSG_SIGN_PETITION = 0x3535, - CMSG_SILENCE_PARTY_TALKER = 0x3652, + CMSG_SILENCE_PARTY_TALKER = 0x3654, CMSG_SOCKET_GEMS = 0x34EC, - CMSG_SORT_BAGS = 0x3327, - CMSG_SORT_BANK_BAGS = 0x3328, - CMSG_SORT_REAGENT_BANK_BAGS = 0x3329, + CMSG_SORT_BAGS = 0x3326, + CMSG_SORT_BANK_BAGS = 0x3327, + CMSG_SORT_REAGENT_BANK_BAGS = 0x3328, CMSG_SPELL_CLICK = 0x3495, CMSG_SPIRIT_HEALER_ACTIVATE = 0x34AF, CMSG_SPLIT_ITEM = 0x399E, - CMSG_STAND_STATE_CHANGE = 0x3189, + CMSG_STAND_STATE_CHANGE = 0x3188, CMSG_START_CHALLENGE_MODE = 0x354C, - CMSG_START_SPECTATOR_WAR_GAME = 0x35DF, - CMSG_START_WAR_GAME = 0x35DE, - CMSG_SUMMON_RESPONSE = 0x366A, - CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3645, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3644, - CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3646, + CMSG_START_SPECTATOR_WAR_GAME = 0x35E0, + CMSG_START_WAR_GAME = 0x35DF, + CMSG_SUMMON_RESPONSE = 0x366C, + CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x3647, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x3646, + CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x3648, CMSG_SURRENDER_ARENA = 0x3173, CMSG_SUSPEND_COMMS_ACK = 0x3764, CMSG_SUSPEND_TOKEN_RESPONSE = 0x376A, CMSG_SWAP_INV_ITEM = 0x399D, CMSG_SWAP_ITEM = 0x399C, - CMSG_SWAP_SUB_GROUPS = 0x364D, - CMSG_SWAP_VOID_ITEM = 0x31A3, - CMSG_TABARD_VENDOR_ACTIVATE = 0x32A8, + CMSG_SWAP_SUB_GROUPS = 0x364F, + CMSG_SWAP_VOID_ITEM = 0x31A2, + CMSG_TABARD_VENDOR_ACTIVATE = 0x32A7, CMSG_TALK_TO_GOSSIP = 0x3492, CMSG_TAXI_NODE_STATUS_QUERY = 0x34A8, CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x34AA, @@ -719,49 +723,50 @@ enum OpcodeClient : uint16 CMSG_TIME_SYNC_RESPONSE = 0x3A38, CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x3A3A, CMSG_TIME_SYNC_RESPONSE_FAILED = 0x3A39, - CMSG_TOGGLE_DIFFICULTY = 0x3657, - CMSG_TOGGLE_PVP = 0x32AA, + CMSG_TOGGLE_DIFFICULTY = 0x3659, + CMSG_TOGGLE_PVP = 0x32A9, CMSG_TOTEM_DESTROYED = 0x34FB, - CMSG_TRADE_SKILL_SET_FAVORITE = 0x3342, + CMSG_TOY_CLEAR_FANFARE = 0x312E, + CMSG_TRADE_SKILL_SET_FAVORITE = 0x3343, CMSG_TRAINER_BUY_SPELL = 0x34AE, CMSG_TRAINER_LIST = 0x34AD, - CMSG_TRANSMOGRIFY_ITEMS = 0x3196, + CMSG_TRANSMOGRIFY_ITEMS = 0x3195, CMSG_TURN_IN_PETITION = 0x3537, - CMSG_TUTORIAL = 0x36DD, + CMSG_TUTORIAL = 0x36E2, CMSG_TWITTER_CHECK_STATUS = 0x312A, CMSG_TWITTER_CONNECT = 0x3127, CMSG_TWITTER_DISCONNECT = 0x312B, - CMSG_TWITTER_POST = 0x332B, - CMSG_UI_TIME_REQUEST = 0x369B, + CMSG_TWITTER_POST = 0x332A, + CMSG_UI_TIME_REQUEST = 0x369F, CMSG_UNACCEPT_TRADE = 0x315B, - CMSG_UNDELETE_CHARACTER = 0x36DF, + CMSG_UNDELETE_CHARACTER = 0x36E4, CMSG_UNLEARN_SKILL = 0x34E6, - CMSG_UNLEARN_SPECIALIZATION = 0x31A4, - CMSG_UNLOCK_VOID_STORAGE = 0x31A0, - CMSG_UPDATE_ACCOUNT_DATA = 0x3697, - CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x329D, - CMSG_UPDATE_CLIENT_SETTINGS = 0x3664, + CMSG_UNLEARN_SPECIALIZATION = 0x31A3, + CMSG_UNLOCK_VOID_STORAGE = 0x319F, + CMSG_UPDATE_ACCOUNT_DATA = 0x369B, + CMSG_UPDATE_AREA_TRIGGER_VISUAL = 0x329C, + CMSG_UPDATE_CLIENT_SETTINGS = 0x3666, CMSG_UPDATE_MISSILE_TRAJECTORY = 0x3A3E, - CMSG_UPDATE_RAID_TARGET = 0x3650, - CMSG_UPDATE_SPELL_VISUAL = 0x329C, - CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36F5, - CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F0, - CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36E6, - CMSG_UPGRADE_GARRISON = 0x32BC, + CMSG_UPDATE_RAID_TARGET = 0x3652, + CMSG_UPDATE_SPELL_VISUAL = 0x329B, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x36FA, + CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x36F5, + CMSG_UPDATE_WOW_TOKEN_COUNT = 0x36EB, + CMSG_UPGRADE_GARRISON = 0x32BB, CMSG_UPGRADE_ITEM = 0x3226, - CMSG_USED_FOLLOW = 0x3186, - CMSG_USE_CRITTER_ITEM = 0x323E, + CMSG_USED_FOLLOW = 0x3185, + CMSG_USE_CRITTER_ITEM = 0x323F, CMSG_USE_EQUIPMENT_SET = 0x3995, - CMSG_USE_ITEM = 0x3297, - CMSG_USE_TOY = 0x3299, - CMSG_VIOLENCE_LEVEL = 0x3184, - CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x3712, - CMSG_VOICE_CHAT_LOGIN = 0x3711, - CMSG_VOID_STORAGE_TRANSFER = 0x31A2, - CMSG_WARDEN_DATA = 0x35EC, - CMSG_WHO = 0x3681, - CMSG_WHO_IS = 0x3680, - CMSG_WORLD_PORT_RESPONSE = 0x35F9, + CMSG_USE_ITEM = 0x3296, + CMSG_USE_TOY = 0x3298, + CMSG_VIOLENCE_LEVEL = 0x3183, + CMSG_VOICE_CHAT_JOIN_CHANNEL = 0x3717, + CMSG_VOICE_CHAT_LOGIN = 0x3716, + CMSG_VOID_STORAGE_TRANSFER = 0x31A1, + CMSG_WARDEN_DATA = 0x35ED, + CMSG_WHO = 0x3683, + CMSG_WHO_IS = 0x3682, + CMSG_WORLD_PORT_RESPONSE = 0x35FA, CMSG_WRAP_ITEM = 0x3994, CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0xBADD, @@ -771,44 +776,46 @@ enum OpcodeClient : uint16 enum OpcodeServer : uint16 { - SMSG_ABORT_NEW_WORLD = 0x25AD, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x2654, + SMSG_ABORT_NEW_WORLD = 0x25AE, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x2655, SMSG_ACCOUNT_DATA_TIMES = 0x2752, SMSG_ACCOUNT_MOUNT_UPDATE = 0x25C3, SMSG_ACCOUNT_TOYS_UPDATE = 0x25C4, SMSG_ACHIEVEMENT_DELETED = 0x2727, - SMSG_ACHIEVEMENT_EARNED = 0x2662, - SMSG_ACTIVATE_TAXI_REPLY = 0x26AB, + SMSG_ACHIEVEMENT_EARNED = 0x2663, + SMSG_ACTIVATE_TAXI_REPLY = 0x26AC, SMSG_ACTIVE_GLYPHS = 0x2C53, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x265C, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x265D, SMSG_ADD_ITEM_PASSIVE = 0x25BF, - SMSG_ADD_LOSS_OF_CONTROL = 0x269B, - SMSG_ADD_RUNE_POWER = 0x26EA, + SMSG_ADD_LOSS_OF_CONTROL = 0x269C, + SMSG_ADD_RUNE_POWER = 0x26EB, SMSG_ADJUST_SPLINE_DURATION = 0x25E8, SMSG_ADVENTURE_MAP_POI_QUERY_RESPONSE = 0x2845, SMSG_AE_LOOT_TARGETS = 0x262E, SMSG_AE_LOOT_TARGET_ACK = 0x262F, - SMSG_AI_REACTION = 0x26E7, + SMSG_AI_REACTION = 0x26E8, SMSG_ALL_ACCOUNT_CRITERIA = 0x2570, SMSG_ALL_ACHIEVEMENT_DATA = 0x256F, SMSG_ALL_GUILD_ACHIEVEMENTS = 0x29B8, - SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2586, + SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x2587, SMSG_AREA_POI_UPDATE = 0x2852, SMSG_AREA_SPIRIT_HEALER_TIME = 0x278A, - SMSG_AREA_TRIGGER_DENIED = 0x26A2, + SMSG_AREA_TRIGGER_DENIED = 0x26A3, SMSG_AREA_TRIGGER_NO_CORPSE = 0x275E, + SMSG_AREA_TRIGGER_PLAY_VISUAL_EVENT = 0x2640, SMSG_AREA_TRIGGER_RE_PATH = 0x263E, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x2642, - SMSG_ARENA_CROWD_CONTROL_SPELLS = 0x2650, - SMSG_ARENA_ERROR = 0x271A, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2667, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x2643, + SMSG_ARENA_CROWD_CONTROL_SPELLS = 0x2651, + SMSG_ARENA_MATCH_END = 0x28A9, + SMSG_ARENA_MATCH_START = 0x28A8, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x2668, SMSG_ARTIFACT_FORGE_OPENED = 0x27EE, SMSG_ARTIFACT_RESPEC_CONFIRM = 0x27F1, SMSG_ARTIFACT_TRAITS_REFUNDED = 0x27F2, SMSG_ARTIFACT_XP_GAIN = 0x2835, SMSG_ATTACKER_STATE_UPDATE = 0x27DB, - SMSG_ATTACK_START = 0x266F, - SMSG_ATTACK_STOP = 0x2670, + SMSG_ATTACK_START = 0x2670, + SMSG_ATTACK_STOP = 0x2671, SMSG_ATTACK_SWING_ERROR = 0x273C, SMSG_ATTACK_SWING_LANDED_LOG = 0x273D, SMSG_AUCTION_CLOSED_NOTIFICATION = 0x2731, @@ -826,24 +833,25 @@ enum OpcodeServer : uint16 SMSG_AURA_UPDATE = 0x2C22, SMSG_AUTH_CHALLENGE = 0x3048, SMSG_AUTH_RESPONSE = 0x256C, - SMSG_AVAILABLE_HOTFIXES = 0x25A1, + SMSG_AVAILABLE_HOTFIXES = 0x25A2, + SMSG_AZERITE_EMPOWERED_ITEM_EQUIPPED_STATUS_CHANGED = 0x2876, SMSG_AZERITE_EMPOWERED_ITEM_RESPEC_OPEN = 0x283F, - SMSG_AZERITE_XP_GAIN = 0x2878, - SMSG_BAN_REASON = 0x26B7, - SMSG_BARBER_SHOP_RESULT = 0x26F0, - SMSG_BATTLEFIELD_LIST = 0x2594, - SMSG_BATTLEFIELD_PORT_DENIED = 0x259A, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2590, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x2593, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x258F, - SMSG_BATTLEFIELD_STATUS_NONE = 0x2592, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2591, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A5, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259B, + SMSG_AZERITE_XP_GAIN = 0x2875, + SMSG_BAN_REASON = 0x26B8, + SMSG_BARBER_SHOP_RESULT = 0x26F1, + SMSG_BATTLEFIELD_LIST = 0x2595, + SMSG_BATTLEFIELD_PORT_DENIED = 0x259B, + SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x2591, + SMSG_BATTLEFIELD_STATUS_FAILED = 0x2594, + SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x2590, + SMSG_BATTLEFIELD_STATUS_NONE = 0x2593, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x2592, + SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x25A6, + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x259C, SMSG_BATTLEGROUND_INIT = 0x27A9, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2598, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x2599, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2595, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x2599, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x259A, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x2596, SMSG_BATTLEGROUND_POINTS = 0x27A8, SMSG_BATTLENET_CHALLENGE_ABORT = 0x27DA, SMSG_BATTLENET_CHALLENGE_START = 0x27D9, @@ -851,7 +859,7 @@ enum OpcodeServer : uint16 SMSG_BATTLENET_REALM_LIST_TICKET = 0x284F, SMSG_BATTLENET_RESPONSE = 0x284C, SMSG_BATTLENET_SET_SESSION_STATE = 0x284E, - SMSG_BATTLENET_UPDATE_SESSION_KEY = 0x2872, + SMSG_BATTLENET_UPDATE_SESSION_KEY = 0x286F, SMSG_BATTLE_PAY_ACK_FAILED = 0x27D2, SMSG_BATTLE_PAY_BATTLE_PET_DELIVERED = 0x27C7, SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x27D1, @@ -862,24 +870,27 @@ enum OpcodeServer : uint16 SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x27BF, SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x27C0, SMSG_BATTLE_PAY_MOUNT_DELIVERED = 0x27C6, - SMSG_BATTLE_PAY_OPEN_CHECKOUT_RESULT = 0x286B, + SMSG_BATTLE_PAY_OPEN_CHECKOUT_RESULT = 0x2868, SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x27D0, SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x27CE, SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x27CD, - SMSG_BATTLE_PAY_SUBSCRIPTION_CHANGED = 0x2874, - SMSG_BATTLE_PAY_VAS_BNET_TRANSFER_VALIDATION_RESULT = 0x2869, + SMSG_BATTLE_PAY_SUBSCRIPTION_CHANGED = 0x2871, + SMSG_BATTLE_PAY_TOY_DELIVERED = 0x27C8, + SMSG_BATTLE_PAY_VAS_BNET_TRANSFER_VALIDATION_RESULT = 0x2866, SMSG_BATTLE_PAY_VAS_BOOST_CONSUMED = 0x27C2, SMSG_BATTLE_PAY_VAS_CHARACTER_LIST = 0x2838, SMSG_BATTLE_PAY_VAS_CHARACTER_QUEUE_STATUS = 0x2864, + SMSG_BATTLE_PAY_VAS_GUILD_FOLLOW_INFO = 0x29E7, + SMSG_BATTLE_PAY_VAS_GUILD_MASTER_LIST = 0x29E6, SMSG_BATTLE_PAY_VAS_PURCHASE_COMPLETE = 0x283B, SMSG_BATTLE_PAY_VAS_PURCHASE_LIST = 0x283C, SMSG_BATTLE_PAY_VAS_PURCHASE_STARTED = 0x283A, SMSG_BATTLE_PAY_VAS_REALM_LIST = 0x2839, SMSG_BATTLE_PAY_VAS_TRANSFER_QUEUE_STATUS = 0x2863, SMSG_BATTLE_PETS_HEALED = 0x260A, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x26A5, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x26A6, SMSG_BATTLE_PET_DELETED = 0x2607, - SMSG_BATTLE_PET_ERROR = 0x2657, + SMSG_BATTLE_PET_ERROR = 0x2658, SMSG_BATTLE_PET_JOURNAL = 0x2606, SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x2604, SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x2605, @@ -891,55 +902,55 @@ enum OpcodeServer : uint16 SMSG_BATTLE_PET_UPDATES = 0x2600, SMSG_BINDER_CONFIRM = 0x2742, SMSG_BIND_POINT_UPDATE = 0x257C, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2646, - SMSG_BLACK_MARKET_OPEN_RESULT = 0x2644, - SMSG_BLACK_MARKET_OUTBID = 0x2647, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2645, - SMSG_BLACK_MARKET_WON = 0x2648, - SMSG_BONUS_ROLL_EMPTY = 0x2664, - SMSG_BONUS_ROLL_FAILED = 0x287B, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x2647, + SMSG_BLACK_MARKET_OPEN_RESULT = 0x2645, + SMSG_BLACK_MARKET_OUTBID = 0x2648, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x2646, + SMSG_BLACK_MARKET_WON = 0x2649, + SMSG_BONUS_ROLL_EMPTY = 0x2665, + SMSG_BONUS_ROLL_FAILED = 0x2879, SMSG_BOSS_KILL_CREDIT = 0x27CC, - SMSG_BREAK_TARGET = 0x266E, + SMSG_BREAK_TARGET = 0x266F, SMSG_BROADCAST_ACHIEVEMENT = 0x2BBC, - SMSG_BUY_FAILED = 0x26F9, - SMSG_BUY_SUCCEEDED = 0x26F8, + SMSG_BUY_FAILED = 0x26FA, + SMSG_BUY_SUCCEEDED = 0x26F9, SMSG_CACHE_INFO = 0x274C, SMSG_CACHE_VERSION = 0x274B, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26CB, - SMSG_CALENDAR_COMMAND_RESULT = 0x26CC, - SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26BB, - SMSG_CALENDAR_EVENT_INVITE = 0x26BC, - SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x26C0, - SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x26BF, - SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x26C5, - SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x26C6, - SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x26BD, - SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x26C2, - SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x26BE, - SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x26C1, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26C3, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26C4, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26C7, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26C8, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26C9, - SMSG_CALENDAR_SEND_CALENDAR = 0x26B9, - SMSG_CALENDAR_SEND_EVENT = 0x26BA, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x26CA, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x26CC, + SMSG_CALENDAR_COMMAND_RESULT = 0x26CD, + SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x26BC, + SMSG_CALENDAR_EVENT_INVITE = 0x26BD, + SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x26C1, + SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x26C0, + SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x26C6, + SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x26C7, + SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x26BE, + SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x26C3, + SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x26BF, + SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x26C2, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x26C4, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x26C5, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x26C8, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x26C9, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x26CA, + SMSG_CALENDAR_SEND_CALENDAR = 0x26BA, + SMSG_CALENDAR_SEND_EVENT = 0x26BB, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x26CB, SMSG_CAMERA_EFFECT = 0x276F, SMSG_CANCEL_AUTO_REPEAT = 0x271B, SMSG_CANCEL_COMBAT = 0x273A, SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x2C46, - SMSG_CANCEL_SCENE = 0x2656, + SMSG_CANCEL_SCENE = 0x2657, SMSG_CANCEL_SPELL_VISUAL = 0x2C44, SMSG_CANCEL_SPELL_VISUAL_KIT = 0x2C48, - SMSG_CAN_DUEL_RESULT = 0x2679, + SMSG_CAN_DUEL_RESULT = 0x267A, SMSG_CAST_FAILED = 0x2C56, SMSG_CATEGORY_COOLDOWN = 0x2C16, SMSG_CHALLENGE_MODE_AFFIXES = 0x2624, SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x2623, SMSG_CHALLENGE_MODE_COMPLETE = 0x2621, - SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x2626, - SMSG_CHALLENGE_MODE_NEW_PLAYER_SEASON_RECORD = 0x2627, + SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x2627, + SMSG_CHALLENGE_MODE_NEW_PLAYER_SEASON_RECORD = 0x2628, SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x2625, SMSG_CHALLENGE_MODE_RESET = 0x2620, SMSG_CHALLENGE_MODE_REWARDS = 0x2622, @@ -951,7 +962,7 @@ enum OpcodeServer : uint16 SMSG_CHANNEL_NOTIFY_JOINED = 0x2BC1, SMSG_CHANNEL_NOTIFY_LEFT = 0x2BC2, SMSG_CHARACTER_CLASS_TRIAL_CREATE = 0x280C, - SMSG_CHARACTER_INVENTORY_OVERFLOW_WARNING = 0x2873, + SMSG_CHARACTER_INVENTORY_OVERFLOW_WARNING = 0x2870, SMSG_CHARACTER_ITEM_FIXUP = 0x285F, SMSG_CHARACTER_LOGIN_FAILED = 0x274D, SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x27D8, @@ -976,77 +987,77 @@ enum OpcodeServer : uint16 SMSG_CHAT_RESTRICTED = 0x2BB3, SMSG_CHAT_SERVER_MESSAGE = 0x2BC4, SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x2C12, - SMSG_CHECK_WARGAME_ENTRY = 0x259E, + SMSG_CHECK_WARGAME_ENTRY = 0x259F, SMSG_CLEAR_ALL_SPELL_CHARGES = 0x2C27, SMSG_CLEAR_BOSS_EMOTES = 0x25CD, - SMSG_CLEAR_COOLDOWN = 0x26EC, + SMSG_CLEAR_COOLDOWN = 0x26ED, SMSG_CLEAR_COOLDOWNS = 0x2C26, - SMSG_CLEAR_LOSS_OF_CONTROL = 0x269D, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x269E, SMSG_CLEAR_SPELL_CHARGES = 0x2C28, - SMSG_CLEAR_TARGET = 0x26E3, + SMSG_CLEAR_TARGET = 0x26E4, SMSG_COIN_REMOVED = 0x262D, - SMSG_COMBAT_EVENT_FAILED = 0x2671, + SMSG_COMBAT_EVENT_FAILED = 0x2672, SMSG_COMMENTATOR_MAP_INFO = 0x274F, SMSG_COMMENTATOR_PLAYER_INFO = 0x2750, SMSG_COMMENTATOR_STATE_CHANGED = 0x274E, - SMSG_COMPLAINT_RESULT = 0x26DA, + SMSG_COMPLAINT_RESULT = 0x26DB, SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x27EA, SMSG_CONNECT_TO = 0x304D, SMSG_CONQUEST_FORMULA_CONSTANTS = 0x27D3, - SMSG_CONSOLE_WRITE = 0x2653, + SMSG_CONSOLE_WRITE = 0x2654, SMSG_CONSUMPTION_CONVERSION_INFO_RESPONSE = 0x2853, SMSG_CONSUMPTION_CONVERSION_RESULT = 0x2854, SMSG_CONTACT_LIST = 0x27D6, - SMSG_CONTRIBUTION_COLLECTOR_STATE = 0x286A, - SMSG_CONTROL_UPDATE = 0x2666, + SMSG_CONTRIBUTION_COLLECTOR_STATE = 0x2867, + SMSG_CONTROL_UPDATE = 0x2667, SMSG_COOLDOWN_CHEAT = 0x2783, - SMSG_COOLDOWN_EVENT = 0x26EB, - SMSG_CORPSE_LOCATION = 0x266D, + SMSG_COOLDOWN_EVENT = 0x26EC, + SMSG_CORPSE_LOCATION = 0x266E, SMSG_CORPSE_RECLAIM_DELAY = 0x2796, SMSG_CORPSE_TRANSPORT_QUERY = 0x275A, SMSG_CREATE_CHAR = 0x2747, SMSG_CREATE_SHIPMENT_RESPONSE = 0x27E9, SMSG_CRITERIA_DELETED = 0x2726, SMSG_CRITERIA_UPDATE = 0x2720, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26F4, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x26F5, SMSG_CUSTOM_LOAD_SCREEN = 0x25E3, SMSG_DAILY_QUESTS_RESET = 0x2A80, SMSG_DAMAGE_CALC_LOG = 0x2814, - SMSG_DB_REPLY = 0x25A0, - SMSG_DEATH_RELEASE_LOC = 0x270E, + SMSG_DB_REPLY = 0x25A1, + SMSG_DEATH_RELEASE_LOC = 0x270F, SMSG_DEFENSE_MESSAGE = 0x2BB6, SMSG_DELETE_CHAR = 0x2748, SMSG_DESTROY_ARENA_UNIT = 0x278C, SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x273B, - SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258A, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x258B, SMSG_DISENCHANT_CREDIT = 0x25BC, - SMSG_DISMOUNT = 0x26E2, + SMSG_DISMOUNT = 0x26E3, SMSG_DISMOUNT_RESULT = 0x257B, SMSG_DISPEL_FAILED = 0x2C30, SMSG_DISPLAY_GAME_ERROR = 0x25B5, - SMSG_DISPLAY_PLAYER_CHOICE = 0x26A6, - SMSG_DISPLAY_PROMOTION = 0x266A, + SMSG_DISPLAY_PLAYER_CHOICE = 0x26A7, + SMSG_DISPLAY_PROMOTION = 0x266B, SMSG_DISPLAY_QUEST_POPUP = 0x2A9D, SMSG_DISPLAY_TOAST = 0x263A, SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x25F7, SMSG_DROP_NEW_CONNECTION = 0x304C, - SMSG_DUEL_COMPLETE = 0x2677, - SMSG_DUEL_COUNTDOWN = 0x2676, - SMSG_DUEL_IN_BOUNDS = 0x2675, - SMSG_DUEL_OPPONENT_SELECTED = 0x2673, - SMSG_DUEL_OUT_OF_BOUNDS = 0x2674, - SMSG_DUEL_REQUESTED = 0x2672, - SMSG_DUEL_WINNER = 0x2678, + SMSG_DUEL_COMPLETE = 0x2678, + SMSG_DUEL_COUNTDOWN = 0x2677, + SMSG_DUEL_IN_BOUNDS = 0x2676, + SMSG_DUEL_OPPONENT_SELECTED = 0x2674, + SMSG_DUEL_OUT_OF_BOUNDS = 0x2675, + SMSG_DUEL_REQUESTED = 0x2673, + SMSG_DUEL_WINNER = 0x2679, SMSG_DURABILITY_DAMAGE_DEATH = 0x2792, SMSG_EMOTE = 0x2815, - SMSG_ENABLE_BARBER_SHOP = 0x26EF, + SMSG_ENABLE_BARBER_SHOP = 0x26F0, SMSG_ENABLE_ENCRYPTION = 0x3049, SMSG_ENCHANTMENT_LOG = 0x275B, SMSG_ENCOUNTER_END = 0x27CB, SMSG_ENCOUNTER_START = 0x27CA, - SMSG_ENUM_CHARACTERS_RESULT = 0x2582, + SMSG_ENUM_CHARACTERS_RESULT = 0x2583, SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x2C21, - SMSG_EQUIPMENT_SET_ID = 0x26E4, + SMSG_EQUIPMENT_SET_ID = 0x26E5, SMSG_EXPECTED_SPAM_RECORDS = 0x2BB1, SMSG_EXPLORATION_EXPERIENCE = 0x27AE, SMSG_FACTION_BONUS_INFO = 0x276E, @@ -1054,24 +1065,24 @@ enum OpcodeServer : uint16 SMSG_FEATURE_SYSTEM_STATUS = 0x25D1, SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x25D2, SMSG_FEIGN_DEATH_RESISTED = 0x278F, - SMSG_FISH_ESCAPED = 0x2701, - SMSG_FISH_NOT_HOOKED = 0x2700, + SMSG_FISH_ESCAPED = 0x2702, + SMSG_FISH_NOT_HOOKED = 0x2701, SMSG_FLIGHT_SPLINE_SYNC = 0x2DF7, - SMSG_FORCED_DEATH_UPDATE = 0x270F, + SMSG_FORCED_DEATH_UPDATE = 0x2710, SMSG_FORCE_ANIM = 0x279D, - SMSG_FORCE_OBJECT_RELINK = 0x2669, + SMSG_FORCE_OBJECT_RELINK = 0x266A, SMSG_FRIEND_STATUS = 0x27D7, - SMSG_GAME_EVENT_DEBUG_INITIALIZE = 0x267F, + SMSG_GAME_EVENT_DEBUG_INITIALIZE = 0x2680, SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x25D6, SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x25D7, SMSG_GAME_OBJECT_DESPAWN = 0x25D8, - SMSG_GAME_OBJECT_MULTI_TRANSITION = 0x2879, + SMSG_GAME_OBJECT_MULTI_TRANSITION = 0x2877, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x2C4B, SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x2C4A, SMSG_GAME_OBJECT_RESET_STATE = 0x2765, SMSG_GAME_OBJECT_SET_STATE = 0x284B, SMSG_GAME_OBJECT_UI_ACTION = 0x2762, - SMSG_GAME_SPEED_SET = 0x26AF, + SMSG_GAME_SPEED_SET = 0x26B0, SMSG_GAME_TIME_SET = 0x2754, SMSG_GAME_TIME_UPDATE = 0x2753, SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x2902, @@ -1099,6 +1110,7 @@ enum OpcodeServer : uint16 SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x292A, SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x2910, SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x290C, + SMSG_GARRISON_MISSION_LIST_UPDATE = 0x290E, SMSG_GARRISON_MISSION_REWARD_RESPONSE = 0x292D, SMSG_GARRISON_MISSION_UPDATE_CAN_START = 0x2911, SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x2917, @@ -1121,7 +1133,7 @@ enum OpcodeServer : uint16 SMSG_GARRISON_START_MISSION_RESULT = 0x2907, SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x28F8, SMSG_GARRISON_UPGRADE_RESULT = 0x28FD, - SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2583, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x2584, SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27AF, SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x2928, SMSG_GET_GARRISON_INFO_RESULT = 0x28F0, @@ -1130,18 +1142,18 @@ enum OpcodeServer : uint16 SMSG_GET_TROPHY_LIST_RESPONSE = 0x2810, SMSG_GM_PLAYER_INFO = 0x2782, SMSG_GM_REQUEST_PLAYER_INFO = 0x25EE, - SMSG_GM_TICKET_CASE_STATUS = 0x26D1, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x26D0, + SMSG_GM_TICKET_CASE_STATUS = 0x26D2, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x26D1, SMSG_GOD_MODE = 0x2741, SMSG_GOSSIP_COMPLETE = 0x2A96, SMSG_GOSSIP_MESSAGE = 0x2A97, SMSG_GOSSIP_POI = 0x27E4, SMSG_GOSSIP_TEXT_UPDATE = 0x2A98, - SMSG_GROUP_ACTION_THROTTLED = 0x259C, + SMSG_GROUP_ACTION_THROTTLED = 0x259D, SMSG_GROUP_DECLINE = 0x27DF, SMSG_GROUP_DESTROYED = 0x27E1, SMSG_GROUP_INVITE_CONFIRMATION = 0x2860, - SMSG_GROUP_NEW_LEADER = 0x264B, + SMSG_GROUP_NEW_LEADER = 0x264C, SMSG_GROUP_UNINVITE = 0x27E0, SMSG_GUILD_ACHIEVEMENT_DELETED = 0x29C5, SMSG_GUILD_ACHIEVEMENT_EARNED = 0x29C4, @@ -1156,25 +1168,25 @@ enum OpcodeServer : uint16 SMSG_GUILD_COMMAND_RESULT = 0x29BA, SMSG_GUILD_CRITERIA_DELETED = 0x29C6, SMSG_GUILD_CRITERIA_UPDATE = 0x29C3, - SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x29F5, - SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x29F4, - SMSG_GUILD_EVENT_DISBANDED = 0x29EB, + SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x29F8, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x29F7, + SMSG_GUILD_EVENT_DISBANDED = 0x29ED, SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x29E2, - SMSG_GUILD_EVENT_MOTD = 0x29EC, - SMSG_GUILD_EVENT_NEW_LEADER = 0x29EA, - SMSG_GUILD_EVENT_PLAYER_JOINED = 0x29E8, - SMSG_GUILD_EVENT_PLAYER_LEFT = 0x29E9, - SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x29ED, - SMSG_GUILD_EVENT_RANKS_UPDATED = 0x29EE, - SMSG_GUILD_EVENT_RANK_CHANGED = 0x29EF, - SMSG_GUILD_EVENT_TAB_ADDED = 0x29F0, - SMSG_GUILD_EVENT_TAB_DELETED = 0x29F1, - SMSG_GUILD_EVENT_TAB_MODIFIED = 0x29F2, - SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x29F3, + SMSG_GUILD_EVENT_MOTD = 0x29EE, + SMSG_GUILD_EVENT_NEW_LEADER = 0x29EC, + SMSG_GUILD_EVENT_PLAYER_JOINED = 0x29EA, + SMSG_GUILD_EVENT_PLAYER_LEFT = 0x29EB, + SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x29EF, + SMSG_GUILD_EVENT_RANKS_UPDATED = 0x29F1, + SMSG_GUILD_EVENT_RANK_CHANGED = 0x29F2, + SMSG_GUILD_EVENT_TAB_ADDED = 0x29F3, + SMSG_GUILD_EVENT_TAB_DELETED = 0x29F4, + SMSG_GUILD_EVENT_TAB_MODIFIED = 0x29F5, + SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x29F6, SMSG_GUILD_FLAGGED_FOR_RENAME = 0x29DC, SMSG_GUILD_INVITE = 0x29CA, - SMSG_GUILD_INVITE_DECLINED = 0x29E6, - SMSG_GUILD_INVITE_EXPIRED = 0x29E7, + SMSG_GUILD_INVITE_DECLINED = 0x29E8, + SMSG_GUILD_INVITE_EXPIRED = 0x29E9, SMSG_GUILD_ITEM_LOOTED = 0x29D4, SMSG_GUILD_KNOWN_RECIPES = 0x29BE, SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x29BF, @@ -1195,16 +1207,16 @@ enum OpcodeServer : uint16 SMSG_GUILD_ROSTER = 0x29BB, SMSG_GUILD_ROSTER_UPDATE = 0x29BC, SMSG_GUILD_SEND_RANK_CHANGE = 0x29B9, - SMSG_HEALTH_UPDATE = 0x2704, - SMSG_HIGHEST_THREAT_UPDATE = 0x2715, - SMSG_HOTFIX_MESSAGE = 0x25A2, - SMSG_HOTFIX_RESPONSE = 0x25A3, + SMSG_HEALTH_UPDATE = 0x2705, + SMSG_HIGHEST_THREAT_UPDATE = 0x2716, + SMSG_HOTFIX_MESSAGE = 0x25A3, + SMSG_HOTFIX_RESPONSE = 0x25A4, + SMSG_INCOMING_SUMMON_COMPLETED = 0x28AB, + SMSG_INCOMING_SUMMON_PENDING = 0x28AA, SMSG_INITIALIZE_FACTIONS = 0x276D, - SMSG_INITIAL_SETUP = 0x257F, + SMSG_INITIAL_SETUP = 0x2580, SMSG_INIT_WORLD_STATES = 0x2793, - SMSG_INSPECT_HONOR_STATS = 0x25B2, - SMSG_INSPECT_PVP = 0x2769, - SMSG_INSPECT_RESULT = 0x264F, + SMSG_INSPECT_RESULT = 0x2650, SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x27FC, SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x27FB, SMSG_INSTANCE_ENCOUNTER_END = 0x2804, @@ -1220,12 +1232,12 @@ enum OpcodeServer : uint16 SMSG_INSTANCE_ENCOUNTER_START = 0x2800, SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x27FD, SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x273F, - SMSG_INSTANCE_INFO = 0x2652, - SMSG_INSTANCE_RESET = 0x26B4, - SMSG_INSTANCE_RESET_FAILED = 0x26B5, + SMSG_INSTANCE_INFO = 0x2653, + SMSG_INSTANCE_RESET = 0x26B5, + SMSG_INSTANCE_RESET_FAILED = 0x26B6, SMSG_INSTANCE_SAVE_CREATED = 0x27C9, - SMSG_INVALIDATE_PAGE_TEXT = 0x270A, - SMSG_INVALIDATE_PLAYER = 0x26D9, + SMSG_INVALIDATE_PAGE_TEXT = 0x270B, + SMSG_INVALIDATE_PLAYER = 0x26DA, SMSG_INVALID_PROMOTION_CODE = 0x279E, SMSG_INVENTORY_CHANGE_FAILURE = 0x276B, SMSG_ISLAND_AZERITE_XP_GAIN = 0x27AB, @@ -1235,15 +1247,15 @@ enum OpcodeServer : uint16 SMSG_ITEM_CHANGED = 0x2729, SMSG_ITEM_COOLDOWN = 0x2813, SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x27A0, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25B1, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25AF, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x25B2, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x25B0, SMSG_ITEM_PUSH_RESULT = 0x2639, SMSG_ITEM_TIME_UPDATE = 0x279F, SMSG_KICK_REASON = 0x2837, SMSG_LEARNED_SPELLS = 0x2C4D, SMSG_LEARN_PVP_TALENTS_FAILED = 0x25EA, SMSG_LEARN_TALENTS_FAILED = 0x25E9, - SMSG_LEVEL_UPDATE = 0x2587, + SMSG_LEVEL_UPDATE = 0x2588, SMSG_LEVEL_UP_INFO = 0x2728, SMSG_LFG_BOOT_PLAYER = 0x2A35, SMSG_LFG_DISABLED = 0x2A33, @@ -1273,8 +1285,8 @@ enum OpcodeServer : uint16 SMSG_LF_GUILD_COMMAND_RESULT = 0x29D0, SMSG_LF_GUILD_POST = 0x29CD, SMSG_LF_GUILD_RECRUITS = 0x29CF, - SMSG_LIGHTNING_STORM_END = 0x26D6, - SMSG_LIGHTNING_STORM_START = 0x26D5, + SMSG_LIGHTNING_STORM_END = 0x26D7, + SMSG_LIGHTNING_STORM_START = 0x26D6, SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x27BD, SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x27BB, SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x27B0, @@ -1282,31 +1294,33 @@ enum OpcodeServer : uint16 SMSG_LOAD_EQUIPMENT_SET = 0x2756, SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x2811, SMSG_LOGIN_SET_TIME_SPEED = 0x2755, - SMSG_LOGIN_VERIFY_WORLD = 0x25AC, - SMSG_LOGOUT_CANCEL_ACK = 0x26B3, - SMSG_LOGOUT_COMPLETE = 0x26B2, - SMSG_LOGOUT_RESPONSE = 0x26B1, + SMSG_LOGIN_VERIFY_WORLD = 0x25AD, + SMSG_LOGOUT_CANCEL_ACK = 0x26B4, + SMSG_LOGOUT_COMPLETE = 0x26B3, + SMSG_LOGOUT_RESPONSE = 0x26B2, SMSG_LOG_XP_GAIN = 0x2724, SMSG_LOOT_ALL_PASSED = 0x2637, - SMSG_LOOT_LEGACY_RULES_IN_EFFECT = 0x287A, + SMSG_LOOT_LEGACY_RULES_IN_EFFECT = 0x2878, SMSG_LOOT_LIST = 0x278B, SMSG_LOOT_MONEY_NOTIFY = 0x2632, SMSG_LOOT_RELEASE = 0x2631, SMSG_LOOT_RELEASE_ALL = 0x2630, - SMSG_LOOT_REMOVED = 0x262B, - SMSG_LOOT_RESPONSE = 0x262A, + SMSG_LOOT_REMOVED = 0x262C, + SMSG_LOOT_RESPONSE = 0x262B, SMSG_LOOT_ROLL = 0x2634, SMSG_LOOT_ROLLS_COMPLETE = 0x2636, SMSG_LOOT_ROLL_WON = 0x2638, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x269A, - SMSG_MAIL_COMMAND_RESULT = 0x265A, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x269B, + SMSG_MAIL_COMMAND_RESULT = 0x265B, SMSG_MAIL_LIST_RESULT = 0x27A1, SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x27A2, SMSG_MAP_OBJECTIVES_INIT = 0x27AA, + SMSG_MAP_OBJECTIVE_ADD = 0x2597, + SMSG_MAP_OBJECTIVE_REMOVE = 0x2598, SMSG_MAP_OBJ_EVENTS = 0x25D9, SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x2635, SMSG_MESSAGE_BOX = 0x2575, - SMSG_MINIMAP_PING = 0x26FF, + SMSG_MINIMAP_PING = 0x2700, SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x2C14, SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x2C13, SMSG_MISSILE_CANCEL = 0x25DA, @@ -1401,13 +1415,13 @@ enum OpcodeServer : uint16 SMSG_MOVE_UPDATE_TURN_RATE = 0x2DAB, SMSG_MOVE_UPDATE_WALK_SPEED = 0x2DA6, SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x25F2, - SMSG_NEW_TAXI_PATH = 0x26AC, - SMSG_NEW_WORLD = 0x25AB, + SMSG_NEW_TAXI_PATH = 0x26AD, + SMSG_NEW_WORLD = 0x25AC, SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x2C43, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26D8, - SMSG_NOTIFY_MONEY = 0x25AE, - SMSG_NOTIFY_RECEIVED_MAIL = 0x265B, - SMSG_OFFER_PETITION_ERROR = 0x26E8, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x26D9, + SMSG_NOTIFY_MONEY = 0x25AF, + SMSG_NOTIFY_RECEIVED_MAIL = 0x265C, + SMSG_OFFER_PETITION_ERROR = 0x26E9, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x2725, SMSG_ON_MONSTER_MOVE = 0x2DA2, SMSG_OPEN_ALLIED_RACE_DETAILS_GIVER = 0x2841, @@ -1416,7 +1430,7 @@ enum OpcodeServer : uint16 SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x27E6, SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x27E8, SMSG_OPEN_TRANSMOGRIFIER = 0x283E, - SMSG_OVERRIDE_LIGHT = 0x26EE, + SMSG_OVERRIDE_LIGHT = 0x26EF, SMSG_PAGE_TEXT = 0x2761, SMSG_PARTY_COMMAND_RESULT = 0x27E3, SMSG_PARTY_INVITE = 0x25CF, @@ -1427,15 +1441,15 @@ enum OpcodeServer : uint16 SMSG_PAUSE_MIRROR_TIMER = 0x2758, SMSG_PENDING_RAID_LOCK = 0x2739, SMSG_PETITION_ALREADY_SIGNED = 0x25B8, - SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29F7, - SMSG_PETITION_SHOW_LIST = 0x26F1, - SMSG_PETITION_SHOW_SIGNATURES = 0x26F2, + SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x29FA, + SMSG_PETITION_SHOW_LIST = 0x26F2, + SMSG_PETITION_SHOW_SIGNATURES = 0x26F3, SMSG_PETITION_SIGN_RESULTS = 0x2798, SMSG_PET_ACTION_FEEDBACK = 0x2795, - SMSG_PET_ACTION_SOUND = 0x26CE, - SMSG_PET_ADDED = 0x25A8, + SMSG_PET_ACTION_SOUND = 0x26CF, + SMSG_PET_ADDED = 0x25A9, SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x2619, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x26A1, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x26A2, SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x2612, SMSG_PET_BATTLE_FINAL_ROUND = 0x2617, SMSG_PET_BATTLE_FINISHED = 0x2618, @@ -1443,65 +1457,65 @@ enum OpcodeServer : uint16 SMSG_PET_BATTLE_INITIAL_UPDATE = 0x2613, SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x261A, SMSG_PET_BATTLE_PVP_CHALLENGE = 0x2611, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2658, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x2659, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x2659, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x265A, SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x2616, SMSG_PET_BATTLE_REQUEST_FAILED = 0x2610, SMSG_PET_BATTLE_ROUND_RESULT = 0x2615, SMSG_PET_BATTLE_SLOT_UPDATES = 0x2603, SMSG_PET_CAST_FAILED = 0x2C57, SMSG_PET_CLEAR_SPELLS = 0x2C24, - SMSG_PET_DISMISS_SOUND = 0x26CF, - SMSG_PET_GOD_MODE = 0x26A9, + SMSG_PET_DISMISS_SOUND = 0x26D0, + SMSG_PET_GOD_MODE = 0x26AA, SMSG_PET_GUIDS = 0x274A, SMSG_PET_LEARNED_SPELLS = 0x2C4F, - SMSG_PET_MODE = 0x2589, - SMSG_PET_NAME_INVALID = 0x26F6, - SMSG_PET_SLOT_UPDATED = 0x2588, + SMSG_PET_MODE = 0x258A, + SMSG_PET_NAME_INVALID = 0x26F7, + SMSG_PET_SLOT_UPDATED = 0x2589, SMSG_PET_SPELLS_MESSAGE = 0x2C25, - SMSG_PET_STABLE_LIST = 0x25A9, - SMSG_PET_STABLE_RESULT = 0x25AA, - SMSG_PET_TAME_FAILURE = 0x26E5, + SMSG_PET_STABLE_LIST = 0x25AA, + SMSG_PET_STABLE_RESULT = 0x25AB, + SMSG_PET_TAME_FAILURE = 0x26E6, SMSG_PET_UNLEARNED_SPELLS = 0x2C50, SMSG_PHASE_SHIFT_CHANGE = 0x2577, - SMSG_PLAYED_TIME = 0x2711, + SMSG_PLAYED_TIME = 0x2712, SMSG_PLAYER_BOUND = 0x257D, - SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F6, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x29F9, SMSG_PLAYER_SKINNED = 0x2790, SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x27A5, SMSG_PLAY_MUSIC = 0x27B7, SMSG_PLAY_OBJECT_SOUND = 0x27B8, SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x277A, SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x2C47, - SMSG_PLAY_SCENE = 0x2655, + SMSG_PLAY_SCENE = 0x2656, SMSG_PLAY_SOUND = 0x27B6, SMSG_PLAY_SPEAKERBOT_SOUND = 0x27B9, SMSG_PLAY_SPELL_VISUAL = 0x2C45, SMSG_PLAY_SPELL_VISUAL_KIT = 0x2C49, SMSG_PLAY_TIME_WARNING = 0x2743, SMSG_PONG = 0x304E, - SMSG_POWER_UPDATE = 0x2705, + SMSG_POWER_UPDATE = 0x2706, SMSG_PRE_RESSURECT = 0x27B5, SMSG_PRINT_NOTIFICATION = 0x25E1, SMSG_PROC_RESIST = 0x27A7, - SMSG_PROPOSE_LEVEL_GRANT = 0x2719, + SMSG_PROPOSE_LEVEL_GRANT = 0x271A, SMSG_PUSH_SPELL_TO_ACTION_BAR = 0x2C51, SMSG_PVP_CREDIT = 0x271F, SMSG_PVP_LOG_DATA = 0x25B3, SMSG_PVP_OPTIONS_ENABLED = 0x25B6, SMSG_PVP_SEASON = 0x25D3, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x270C, - SMSG_QUERY_COMMUNITY_NAME_RESPONSE = 0x2708, - SMSG_QUERY_CREATURE_RESPONSE = 0x2702, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x2703, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x270D, + SMSG_QUERY_COMMUNITY_NAME_RESPONSE = 0x2709, + SMSG_QUERY_CREATURE_RESPONSE = 0x2703, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x2704, SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x292B, SMSG_QUERY_GUILD_INFO_RESPONSE = 0x29E5, SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x2812, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x2706, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x2709, - SMSG_QUERY_PETITION_RESPONSE = 0x270D, - SMSG_QUERY_PET_NAME_RESPONSE = 0x270B, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x2707, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x2707, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x270A, + SMSG_QUERY_PETITION_RESPONSE = 0x270E, + SMSG_QUERY_PET_NAME_RESPONSE = 0x270C, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x2708, SMSG_QUERY_QUEST_INFO_RESPONSE = 0x2A95, SMSG_QUERY_TIME_RESPONSE = 0x2723, SMSG_QUERY_TREASURE_PICKER_RESPONSE = 0x2850, @@ -1535,51 +1549,52 @@ enum OpcodeServer : uint16 SMSG_RAID_GROUP_ONLY = 0x27F9, SMSG_RAID_INSTANCE_MESSAGE = 0x2BB4, SMSG_RAID_MARKERS_CHANGED = 0x25B9, - SMSG_RANDOM_ROLL = 0x264E, - SMSG_RATED_BATTLEFIELD_INFO = 0x25A6, + SMSG_RANDOM_ROLL = 0x264F, + SMSG_RATED_BATTLEFIELD_INFO = 0x25A7, SMSG_READY_CHECK_COMPLETED = 0x260F, SMSG_READY_CHECK_RESPONSE = 0x260E, SMSG_READY_CHECK_STARTED = 0x260D, SMSG_READ_ITEM_RESULT_FAILED = 0x27F3, SMSG_READ_ITEM_RESULT_OK = 0x27ED, SMSG_REALM_LOOKUP_INFORMATION = 0x2818, - SMSG_REALM_QUERY_RESPONSE = 0x26ED, + SMSG_REALM_QUERY_RESPONSE = 0x26EE, SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x27D5, SMSG_REFER_A_FRIEND_EXPIRED = 0x276A, - SMSG_REFER_A_FRIEND_FAILURE = 0x26F3, - SMSG_REFRESH_COMPONENT = 0x267B, + SMSG_REFER_A_FRIEND_FAILURE = 0x26F4, + SMSG_REFRESH_COMPONENT = 0x267C, SMSG_REFRESH_SPELL_HISTORY = 0x2C2C, SMSG_REMOVE_ITEM_PASSIVE = 0x25C0, - SMSG_REMOVE_LOSS_OF_CONTROL = 0x269C, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x269D, SMSG_REPLACE_TROPHY_RESPONSE = 0x280F, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26E1, - SMSG_REQUEST_ADDON_LIST = 0x2661, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259D, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x26E2, + SMSG_REQUEST_ADDON_LIST = 0x2662, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x259E, SMSG_REQUEST_PVP_BRAWL_INFO_RESPONSE = 0x25D5, SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x25D4, - SMSG_RESEARCH_COMPLETE = 0x2585, + SMSG_RESEARCH_COMPLETE = 0x2586, SMSG_RESET_COMPRESSION_CONTEXT = 0x304F, - SMSG_RESET_FAILED_NOTIFY = 0x26E9, + SMSG_RESET_FAILED_NOTIFY = 0x26EA, SMSG_RESET_RANGED_COMBAT_TIMER = 0x271C, SMSG_RESET_WEEKLY_CURRENCY = 0x2574, - SMSG_RESPEC_WIPE_CONFIRM = 0x2628, + SMSG_RESPEC_WIPE_CONFIRM = 0x2629, SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x2571, SMSG_RESUME_CAST_BAR = 0x2C3E, SMSG_RESUME_COMMS = 0x304B, SMSG_RESUME_TOKEN = 0x25BE, + SMSG_RESURRECT_CLEAR_DATA = 0x257F, SMSG_RESURRECT_REQUEST = 0x257E, SMSG_RESYNC_RUNES = 0x2746, - SMSG_ROLE_CHANGED_INFORM = 0x258C, + SMSG_ROLE_CHANGED_INFORM = 0x258D, SMSG_ROLE_CHOSEN = 0x2A39, - SMSG_ROLE_POLL_INFORM = 0x258D, + SMSG_ROLE_POLL_INFORM = 0x258E, SMSG_RUNE_REGEN_DEBUG = 0x25C8, SMSG_SCENARIO_BOOT = 0x27F4, SMSG_SCENARIO_COMPLETED = 0x2834, - SMSG_SCENARIO_POIS = 0x2651, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x264A, + SMSG_SCENARIO_POIS = 0x2652, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x264B, SMSG_SCENARIO_SET_SHOULD_SHOW_CRITERIA = 0x2844, SMSG_SCENARIO_SPELL_UPDATE = 0x2843, - SMSG_SCENARIO_STATE = 0x2649, + SMSG_SCENARIO_STATE = 0x264A, SMSG_SCENE_OBJECT_EVENT = 0x25F8, SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x25FD, SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x25FE, @@ -1588,56 +1603,56 @@ enum OpcodeServer : uint16 SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x25FC, SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x25FB, SMSG_SCRIPT_CAST = 0x2C55, - SMSG_SELL_RESPONSE = 0x26F7, + SMSG_SELL_RESPONSE = 0x26F8, SMSG_SEND_ITEM_PASSIVES = 0x25C1, SMSG_SEND_KNOWN_SPELLS = 0x2C2A, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x264C, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x264D, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x264D, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x264E, SMSG_SEND_SPELL_CHARGES = 0x2C2D, SMSG_SEND_SPELL_HISTORY = 0x2C2B, SMSG_SEND_UNLEARN_SPELLS = 0x2C2E, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x266C, - SMSG_SERVER_TIME = 0x26B0, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x266D, + SMSG_SERVER_TIME = 0x26B1, SMSG_SETUP_CURRENCY = 0x2572, - SMSG_SETUP_RESEARCH_HISTORY = 0x2584, + SMSG_SETUP_RESEARCH_HISTORY = 0x2585, SMSG_SET_AI_ANIM_KIT = 0x2779, SMSG_SET_ALL_TASK_PROGRESS = 0x27DD, SMSG_SET_ANIM_TIER = 0x277D, SMSG_SET_CURRENCY = 0x2573, SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x2A2E, - SMSG_SET_DUNGEON_DIFFICULTY = 0x26D2, + SMSG_SET_DUNGEON_DIFFICULTY = 0x26D3, SMSG_SET_FACTION_AT_WAR = 0x2745, SMSG_SET_FACTION_NOT_VISIBLE = 0x2774, SMSG_SET_FACTION_STANDING = 0x2775, SMSG_SET_FACTION_VISIBLE = 0x2773, SMSG_SET_FLAT_SPELL_MODIFIER = 0x2C36, SMSG_SET_FORCED_REACTIONS = 0x2764, - SMSG_SET_ITEM_PURCHASE_DATA = 0x25B0, + SMSG_SET_ITEM_PURCHASE_DATA = 0x25B1, SMSG_SET_LOOT_METHOD_FAILED = 0x281E, SMSG_SET_MAX_WEEKLY_QUANTITY = 0x25B7, SMSG_SET_MELEE_ANIM_KIT = 0x277C, SMSG_SET_MOVEMENT_ANIM_KIT = 0x277B, SMSG_SET_PCT_SPELL_MODIFIER = 0x2C37, - SMSG_SET_PET_SPECIALIZATION = 0x2643, - SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2710, + SMSG_SET_PET_SPECIALIZATION = 0x2644, + SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x2711, SMSG_SET_PLAY_HOVER_ANIM = 0x25CC, SMSG_SET_PROFICIENCY = 0x277E, SMSG_SET_SPELL_CHARGES = 0x2C29, SMSG_SET_TASK_COMPLETE = 0x27DE, - SMSG_SET_TIME_ZONE_INFORMATION = 0x26A4, + SMSG_SET_TIME_ZONE_INFORMATION = 0x26A5, SMSG_SET_VEHICLE_REC_ID = 0x2738, SMSG_SHOW_ADVENTURE_MAP = 0x283D, - SMSG_SHOW_BANK = 0x26AD, + SMSG_SHOW_BANK = 0x26AE, SMSG_SHOW_MAILBOX = 0x27F5, SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x25F1, - SMSG_SHOW_TAXI_NODES = 0x26FE, + SMSG_SHOW_TAXI_NODES = 0x26FF, SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x27BE, SMSG_SOCKET_GEMS = 0x2770, SMSG_SOCKET_GEMS_FAILURE = 0x2771, SMSG_SORT_BAGS_RESULT = 0x282C, SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x25F3, SMSG_SPECIALIZATION_CHANGED = 0x25ED, - SMSG_SPECIAL_MOUNT_ANIM = 0x26CD, + SMSG_SPECIAL_MOUNT_ANIM = 0x26CE, SMSG_SPEC_INVOLUNTARILY_CHANGED = 0x2760, SMSG_SPELL_ABSORB_LOG = 0x2C1F, SMSG_SPELL_CATEGORY_COOLDOWN = 0x2C17, @@ -1674,26 +1689,26 @@ enum OpcodeServer : uint16 SMSG_STOP_MIRROR_TIMER = 0x2759, SMSG_STOP_SPEAKERBOT_SOUND = 0x27BA, SMSG_STREAMING_MOVIES = 0x25BA, - SMSG_SUMMON_CANCEL = 0x26E0, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258E, + SMSG_SUMMON_CANCEL = 0x26E1, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x258F, SMSG_SUMMON_REQUEST = 0x2768, SMSG_SUPERCEDED_SPELLS = 0x2C4C, SMSG_SUSPEND_COMMS = 0x304A, SMSG_SUSPEND_TOKEN = 0x25BD, SMSG_TALENTS_INVOLUNTARILY_RESET = 0x275F, - SMSG_TAXI_NODE_STATUS = 0x26AA, - SMSG_TEXT_EMOTE = 0x26A8, - SMSG_THREAT_CLEAR = 0x2718, - SMSG_THREAT_REMOVE = 0x2717, - SMSG_THREAT_UPDATE = 0x2716, + SMSG_TAXI_NODE_STATUS = 0x26AB, + SMSG_TEXT_EMOTE = 0x26A9, + SMSG_THREAT_CLEAR = 0x2719, + SMSG_THREAT_REMOVE = 0x2718, + SMSG_THREAT_UPDATE = 0x2717, SMSG_TIME_ADJUSTMENT = 0x2DA1, SMSG_TIME_SYNC_REQUEST = 0x2DA0, - SMSG_TITLE_EARNED = 0x2713, - SMSG_TITLE_LOST = 0x2714, - SMSG_TOTEM_CREATED = 0x26FA, - SMSG_TOTEM_MOVED = 0x26FB, - SMSG_TRADE_STATUS = 0x2581, - SMSG_TRADE_UPDATED = 0x2580, + SMSG_TITLE_EARNED = 0x2714, + SMSG_TITLE_LOST = 0x2715, + SMSG_TOTEM_CREATED = 0x26FB, + SMSG_TOTEM_MOVED = 0x26FC, + SMSG_TRADE_STATUS = 0x2582, + SMSG_TRADE_UPDATED = 0x2581, SMSG_TRAINER_BUY_FAILED = 0x271E, SMSG_TRAINER_LIST = 0x271D, SMSG_TRANSFER_ABORTED = 0x2749, @@ -1701,7 +1716,7 @@ enum OpcodeServer : uint16 SMSG_TRANSMOG_COLLECTION_UPDATE = 0x25C6, SMSG_TRANSMOG_SET_COLLECTION_UPDATE = 0x25C7, SMSG_TRIGGER_CINEMATIC = 0x2816, - SMSG_TRIGGER_MOVIE = 0x26FC, + SMSG_TRIGGER_MOVIE = 0x26FD, SMSG_TURN_IN_PETITION_RESULT = 0x279A, SMSG_TUTORIAL_FLAGS = 0x2808, SMSG_TUTORIAL_HIGHLIGHT_SPELL = 0x284A, @@ -1713,12 +1728,12 @@ enum OpcodeServer : uint16 SMSG_UNLEARNED_SPELLS = 0x2C4E, SMSG_UPDATE_ACCOUNT_DATA = 0x2751, SMSG_UPDATE_ACTION_BUTTONS = 0x25F6, - SMSG_UPDATE_CELESTIAL_BODY = 0x286E, + SMSG_UPDATE_CELESTIAL_BODY = 0x286B, SMSG_UPDATE_CHARACTER_FLAGS = 0x280E, - SMSG_UPDATE_EXPANSION_LEVEL = 0x2665, - SMSG_UPDATE_GAME_TIME_STATE = 0x2875, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26D7, - SMSG_UPDATE_LAST_INSTANCE = 0x26B6, + SMSG_UPDATE_EXPANSION_LEVEL = 0x2666, + SMSG_UPDATE_GAME_TIME_STATE = 0x2872, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x26D8, + SMSG_UPDATE_LAST_INSTANCE = 0x26B7, SMSG_UPDATE_OBJECT = 0x2817, SMSG_UPDATE_TALENT_DATA = 0x25EC, SMSG_UPDATE_TASK_PROGRESS = 0x27DC, @@ -1740,10 +1755,10 @@ enum OpcodeServer : uint16 SMSG_WARDEN_DATA = 0x2576, SMSG_WARFRONT_COMPLETED = 0x27AD, SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x25B4, - SMSG_WEATHER = 0x26D4, + SMSG_WEATHER = 0x26D5, SMSG_WEEKLY_SPELL_USAGE = 0x2C18, SMSG_WHO = 0x2BAE, - SMSG_WHO_IS = 0x26D3, + SMSG_WHO_IS = 0x26D4, SMSG_WORLD_QUEST_UPDATE = 0x2851, SMSG_WORLD_SERVER_INFO = 0x25C2, SMSG_WORLD_TEXT = 0x2836, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 40f3eff4def..b7003370326 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -360,9 +360,7 @@ namespace WorldPackets namespace Inspect { class Inspect; - class InspectPVPRequest; class QueryInspectAchievements; - class RequestHonorStats; } namespace Instance @@ -613,6 +611,7 @@ namespace WorldPackets class AccountToysUpdate; class AddToy; class UseToy; + class ToyClearFanfare; } namespace Scenario @@ -1052,7 +1051,6 @@ class TC_GAME_API WorldSession void SendDiscoverNewTaxiNode(uint32 nodeid); // Guild/Arena Team - void SendNotInArenaTeamPacket(uint8 type); void SendPetitionShowList(ObjectGuid guid); void DoLootRelease(ObjectGuid lguid); @@ -1145,8 +1143,6 @@ class TC_GAME_API WorldSession // Inspect void HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect); - void HandleRequestHonorStatsOpcode(WorldPackets::Inspect::RequestHonorStats& request); - void HandleInspectPVP(WorldPackets::Inspect::InspectPVPRequest& request); void HandleQueryInspectAchievements(WorldPackets::Inspect::QueryInspectAchievements& inspect); void HandleMountSpecialAnimOpcode(WorldPackets::Misc::MountSpecial& mountSpecial); @@ -1655,6 +1651,7 @@ class TC_GAME_API WorldSession // Toys void HandleAddToy(WorldPackets::Toy::AddToy& packet); void HandleUseToy(WorldPackets::Toy::UseToy& packet); + void HandleToyClearFanfare(WorldPackets::Toy::ToyClearFanfare& toyClearFanfare); void HandleMountSetFavorite(WorldPackets::Misc::MountSetFavorite& mountSetFavorite); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 01f401b0920..23c7f211616 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -418,7 +418,7 @@ enum AuraType : uint32 SPELL_AURA_BYPASS_ARMOR_FOR_CASTER = 345, SPELL_AURA_ENABLE_ALT_POWER = 346, // NYI SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE = 347, - SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT = 348, + SPELL_AURA_MOD_MONEY_GAIN = 348, // Modifies gold gains from source: [Misc = 0, Quests][Misc = 1, Loot] SPELL_AURA_MOD_CURRENCY_GAIN = 349, SPELL_AURA_MOD_GATHERING_ITEMS_GAINED_PERCENT = 350, // NYI SPELL_AURA_351 = 351, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 101dfbafe70..9e21f697bf4 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -414,7 +414,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNoImmediateEffect, //345 SPELL_AURA_BYPASS_ARMOR_FOR_CASTER &AuraEffect::HandleEnableAltPower, //346 SPELL_AURA_ENABLE_ALT_POWER &AuraEffect::HandleNoImmediateEffect, //347 SPELL_AURA_MOD_SPELL_COOLDOWN_BY_HASTE implemented in SpellHistory::StartCooldown - &AuraEffect::HandleNoImmediateEffect, //348 SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT implemented in WorldSession::HandleLootMoneyOpcode + &AuraEffect::HandleNoImmediateEffect, //348 SPELL_AURA_MOD_MONEY_GAIN implemented in WorldSession::HandleLootMoneyOpcode &AuraEffect::HandleNoImmediateEffect, //349 SPELL_AURA_MOD_CURRENCY_GAIN implemented in Player::ModifyCurrency &AuraEffect::HandleNULL, //350 SPELL_AURA_MOD_GATHERING_ITEMS_GAINED_PERCENT &AuraEffect::HandleNULL, //351 SPELL_AURA_351 diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 04c2941fdfc..a72de085989 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -4186,19 +4186,14 @@ void Spell::UpdateSpellCastDataTargets(WorldPackets::Spells::SpellCastData& data if (targetInfo.missCondition == SPELL_MISS_NONE) // hits { data.HitTargets.push_back(targetInfo.targetGUID); + data.HitStatus.emplace_back(SPELL_MISS_NONE); m_channelTargetEffectMask |= targetInfo.effectMask; } else // misses { data.MissTargets.push_back(targetInfo.targetGUID); - - WorldPackets::Spells::SpellMissStatus missStatus; - missStatus.Reason = targetInfo.missCondition; - if (targetInfo.missCondition == SPELL_MISS_REFLECT) - missStatus.ReflectStatus = targetInfo.reflectResult; - - data.MissStatus.push_back(missStatus); + data.MissStatus.emplace_back(targetInfo.missCondition, targetInfo.reflectResult); } } diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp index e5b0b7b0873..ffee81c073b 100644 --- a/src/server/scripts/Spells/spell_warrior.cpp +++ b/src/server/scripts/Spells/spell_warrior.cpp @@ -181,7 +181,7 @@ class spell_warr_charge_drop_fire_periodic : public SpellScriptLoader { int32 timeOffset = 6 * i * aurEff->GetPeriod() / 25; Movement::Location loc = GetTarget()->movespline->ComputePosition(timeOffset); - GetTarget()->SendPlaySpellVisual(Position(loc.x, loc.y, loc.z, loc.orientation), 0.f, SPELL_VISUAL_BLAZING_CHARGE, 0, 0, 1.f, true); + GetTarget()->SendPlaySpellVisual(Position(loc.x, loc.y, loc.z), 0.f, SPELL_VISUAL_BLAZING_CHARGE, 0, 0, 1.f, true); } } } diff --git a/src/server/shared/Realm/RealmList.cpp b/src/server/shared/Realm/RealmList.cpp index 49dac39cef5..9babd0eeec1 100644 --- a/src/server/shared/Realm/RealmList.cpp +++ b/src/server/shared/Realm/RealmList.cpp @@ -204,38 +204,48 @@ Realm const* RealmList::GetRealm(Battlenet::RealmHandle const& id) const return NULL; } +// List of client builds for verbose version info in realmlist packet +static RealmBuildInfo const ClientBuilds[] = +{ + { 28938, 8, 1, 5, ' ' }, + { 21355, 6, 2, 4, ' ' }, + { 20726, 6, 2, 3, ' ' }, + { 20574, 6, 2, 2, 'a' }, + { 20490, 6, 2, 2, 'a' }, + { 15595, 4, 3, 4, ' ' }, + { 14545, 4, 2, 2, ' ' }, + { 13623, 4, 0, 6, 'a' }, + { 13930, 3, 3, 5, 'a' }, // 3.3.5a China Mainland build + { 12340, 3, 3, 5, 'a' }, + { 11723, 3, 3, 3, 'a' }, + { 11403, 3, 3, 2, ' ' }, + { 11159, 3, 3, 0, 'a' }, + { 10505, 3, 2, 2, 'a' }, + { 9947, 3, 1, 3, ' ' }, + { 8606, 2, 4, 3, ' ' }, + { 6141, 1, 12, 3, ' ' }, + { 6005, 1, 12, 2, ' ' }, + { 5875, 1, 12, 1, ' ' }, +}; + RealmBuildInfo const* RealmList::GetBuildInfo(uint32 build) const { - // List of client builds for verbose version info in realmlist packet - static std::vector<RealmBuildInfo> const ClientBuilds = - { - { 21355, 6, 2, 4, ' ' }, - { 20726, 6, 2, 3, ' ' }, - { 20574, 6, 2, 2, 'a' }, - { 20490, 6, 2, 2, 'a' }, - { 15595, 4, 3, 4, ' ' }, - { 14545, 4, 2, 2, ' ' }, - { 13623, 4, 0, 6, 'a' }, - { 13930, 3, 3, 5, 'a' }, // 3.3.5a China Mainland build - { 12340, 3, 3, 5, 'a' }, - { 11723, 3, 3, 3, 'a' }, - { 11403, 3, 3, 2, ' ' }, - { 11159, 3, 3, 0, 'a' }, - { 10505, 3, 2, 2, 'a' }, - { 9947, 3, 1, 3, ' ' }, - { 8606, 2, 4, 3, ' ' }, - { 6141, 1, 12, 3, ' ' }, - { 6005, 1, 12, 2, ' ' }, - { 5875, 1, 12, 1, ' ' }, - }; - - for (std::size_t i = 0; i < ClientBuilds.size(); ++i) - if (ClientBuilds[i].Build == build) - return &ClientBuilds[i]; + for (RealmBuildInfo const& clientBuild : ClientBuilds) + if (clientBuild.Build == build) + return &clientBuild; return nullptr; } +uint32 RealmList::GetMinorMajorBugfixVersionForBuild(uint32 build) const +{ + RealmBuildInfo const* buildInfo = std::lower_bound(std::begin(ClientBuilds), std::end(ClientBuilds), build, [](RealmBuildInfo const& buildInfo, uint32 value) + { + return buildInfo.Build < value; + }); + return buildInfo != std::end(ClientBuilds) ? (buildInfo->MajorVersion * 10000 + buildInfo->MinorVersion * 100 + buildInfo->BugfixVersion) : 0; +} + void RealmList::WriteSubRegions(bgs::protocol::game_utilities::v1::GetAllValuesForAttributeResponse* response) const { boost::shared_lock<boost::shared_mutex> lock(*_realmsMutex); diff --git a/src/server/shared/Realm/RealmList.h b/src/server/shared/Realm/RealmList.h index 2bacdf308ee..da1a6b2c4e8 100644 --- a/src/server/shared/Realm/RealmList.h +++ b/src/server/shared/Realm/RealmList.h @@ -92,6 +92,7 @@ public: Realm const* GetRealm(Battlenet::RealmHandle const& id) const; RealmBuildInfo const* GetBuildInfo(uint32 build) const; + uint32 GetMinorMajorBugfixVersionForBuild(uint32 build) const; void WriteSubRegions(bgs::protocol::game_utilities::v1::GetAllValuesForAttributeResponse* response) const; std::vector<uint8> GetRealmEntryJSON(Battlenet::RealmHandle const& id, uint32 build) const; std::vector<uint8> GetRealmList(uint32 build, std::string const& subRegion) const; |