aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Accounts/BattlenetAccountMgr.cpp6
-rw-r--r--src/server/game/Accounts/BattlenetAccountMgr.h2
-rw-r--r--src/server/game/Accounts/RBAC.cpp530
-rw-r--r--src/server/game/Achievements/AchievementMgr.cpp547
-rw-r--r--src/server/game/Achievements/AchievementMgr.h10
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp2
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp3
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp65
-rw-r--r--src/server/game/DataStores/DB2Stores.h5
-rw-r--r--src/server/game/DataStores/DB2Structure.h16
-rw-r--r--src/server/game/DataStores/DB2fmt.h2
-rw-r--r--src/server/game/DataStores/DBCEnums.h4
-rw-r--r--src/server/game/DataStores/DBCStores.cpp215
-rw-r--r--src/server/game/DataStores/DBCStores.h13
-rw-r--r--src/server/game/DataStores/DBCStructure.h26
-rw-r--r--src/server/game/DataStores/DBCfmt.h5
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp28
-rw-r--r--src/server/game/Entities/Creature/Creature.h1
-rw-r--r--src/server/game/Entities/Item/Item.cpp14
-rw-r--r--src/server/game/Entities/Item/Item.h3
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp1
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp182
-rw-r--r--src/server/game/Entities/Player/Player.cpp419
-rw-r--r--src/server/game/Entities/Player/Player.h17
-rw-r--r--src/server/game/Entities/Unit/Unit.cpp73
-rw-r--r--src/server/game/Entities/Unit/Unit.h5
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp77
-rw-r--r--src/server/game/Globals/ObjectMgr.h1
-rw-r--r--src/server/game/Groups/Group.cpp24
-rw-r--r--src/server/game/Guilds/Guild.cpp32
-rw-r--r--src/server/game/Guilds/Guild.h2
-rw-r--r--src/server/game/Handlers/AuctionHouseHandler.cpp26
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp4
-rw-r--r--src/server/game/Handlers/BlackMarketHandler.cpp46
-rw-r--r--src/server/game/Handlers/CalendarHandler.cpp2
-rw-r--r--src/server/game/Handlers/CharacterHandler.cpp10
-rw-r--r--src/server/game/Handlers/GroupHandler.cpp72
-rw-r--r--src/server/game/Handlers/GuildFinderHandler.cpp10
-rw-r--r--src/server/game/Handlers/GuildHandler.cpp14
-rw-r--r--src/server/game/Handlers/ItemHandler.cpp51
-rw-r--r--src/server/game/Handlers/LootHandler.cpp122
-rw-r--r--src/server/game/Handlers/MailHandler.cpp2
-rw-r--r--src/server/game/Handlers/MiscHandler.cpp67
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp12
-rw-r--r--src/server/game/Handlers/NPCHandler.cpp67
-rw-r--r--src/server/game/Handlers/PetitionsHandler.cpp15
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp72
-rw-r--r--src/server/game/Handlers/QuestHandler.cpp7
-rw-r--r--src/server/game/Handlers/SkillHandler.cpp11
-rw-r--r--src/server/game/Handlers/SpellHandler.cpp18
-rw-r--r--src/server/game/Handlers/TaxiHandler.cpp2
-rw-r--r--src/server/game/Handlers/TicketHandler.cpp12
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp14
-rw-r--r--src/server/game/Loot/LootMgr.cpp199
-rw-r--r--src/server/game/Loot/LootMgr.h71
-rw-r--r--src/server/game/Maps/Map.cpp24
-rw-r--r--src/server/game/Maps/Map.h3
-rw-r--r--src/server/game/Maps/MapManager.cpp7
-rw-r--r--src/server/game/Miscellaneous/Formulas.h57
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp6
-rw-r--r--src/server/game/Movement/MovementStructures.cpp12
-rw-r--r--src/server/game/Movement/MovementStructures.h2
-rw-r--r--src/server/game/Scripting/ScriptMgr.cpp4
-rw-r--r--src/server/game/Scripting/ScriptMgr.h4
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.cpp144
-rw-r--r--src/server/game/Server/Packets/AchievementPackets.h134
-rw-r--r--src/server/game/Server/Packets/AuctionHousePackets.cpp14
-rw-r--r--src/server/game/Server/Packets/AuctionHousePackets.h20
-rw-r--r--src/server/game/Server/Packets/BlackMarketPackets.cpp32
-rw-r--r--src/server/game/Server/Packets/BlackMarketPackets.h51
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h13
-rw-r--r--src/server/game/Server/Packets/CombatLogPackets.h2
-rw-r--r--src/server/game/Server/Packets/ItemPackets.cpp8
-rw-r--r--src/server/game/Server/Packets/ItemPackets.h15
-rw-r--r--src/server/game/Server/Packets/LootPackets.cpp85
-rw-r--r--src/server/game/Server/Packets/LootPackets.h109
-rw-r--r--src/server/game/Server/Packets/MiscPackets.cpp52
-rw-r--r--src/server/game/Server/Packets/MiscPackets.h121
-rw-r--r--src/server/game/Server/Packets/MovementPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/MovementPackets.h6
-rw-r--r--src/server/game/Server/Packets/NPCPackets.cpp7
-rw-r--r--src/server/game/Server/Packets/NPCPackets.h10
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp38
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h63
-rw-r--r--src/server/game/Server/Packets/QuestPackets.h2
-rw-r--r--src/server/game/Server/Packets/SpellPackets.cpp6
-rw-r--r--src/server/game/Server/Packets/SpellPackets.h11
-rw-r--r--src/server/game/Server/Packets/TalentPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/TalentPackets.h6
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp892
-rw-r--r--src/server/game/Server/Protocol/Opcodes.h1457
-rw-r--r--src/server/game/Server/WorldSession.cpp38
-rw-r--r--src/server/game/Server/WorldSession.h105
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp38
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.h36
-rw-r--r--src/server/game/Spells/Spell.cpp4
-rw-r--r--src/server/game/Spells/SpellEffects.cpp22
-rw-r--r--src/server/game/Spells/SpellInfo.h2
-rw-r--r--src/server/game/Spells/SpellScript.cpp4
-rw-r--r--src/server/game/Spells/SpellScript.h2
-rw-r--r--src/server/game/Tickets/TicketMgr.cpp4
-rw-r--r--src/server/game/World/World.cpp24
-rw-r--r--src/server/game/World/World.h2
-rw-r--r--src/server/scripts/Commands/cs_battlenet_account.cpp14
-rw-r--r--src/server/scripts/Commands/cs_debug.cpp2
-rw-r--r--src/server/scripts/Commands/cs_rbac.cpp766
-rw-r--r--src/server/scripts/Commands/cs_ticket.cpp4
-rw-r--r--src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp5
-rw-r--r--src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp14
-rw-r--r--src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp29
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp2
-rw-r--r--src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp2
-rw-r--r--src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp430
-rw-r--r--src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp2
-rw-r--r--src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp1
-rw-r--r--src/server/scripts/Spells/spell_dk.cpp2
-rw-r--r--src/server/scripts/Spells/spell_warrior.cpp7
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.cpp187
-rw-r--r--src/server/shared/DataStores/DB2StorageLoader.h2
-rw-r--r--src/server/shared/DataStores/DB2Store.h30
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.cpp23
-rw-r--r--src/server/shared/Database/Implementation/CharacterDatabase.h6
-rw-r--r--src/server/shared/Database/Implementation/HotfixDatabase.cpp44
-rw-r--r--src/server/shared/Database/Implementation/HotfixDatabase.h14
-rw-r--r--src/server/shared/Utilities/Util.cpp7
-rw-r--r--src/server/shared/Utilities/Util.h2
-rw-r--r--src/server/worldserver/worldserver.conf.dist15
-rw-r--r--src/tools/CMakeLists.txt3
-rw-r--r--src/tools/map_extractor/System.cpp65
-rw-r--r--src/tools/map_extractor/dbcfile.cpp3
-rw-r--r--src/tools/map_extractor/loadlib.cpp3
-rw-r--r--src/tools/map_extractor/loadlib/DBFilesClientList.h1071
-rw-r--r--src/tools/mesh_extractor/ADT.cpp70
-rw-r--r--src/tools/mesh_extractor/ADT.h49
-rw-r--r--src/tools/mesh_extractor/CMakeLists.txt50
-rw-r--r--src/tools/mesh_extractor/Cache.h80
-rw-r--r--src/tools/mesh_extractor/Chunk.cpp48
-rw-r--r--src/tools/mesh_extractor/Chunk.h37
-rw-r--r--src/tools/mesh_extractor/ChunkedData.cpp91
-rw-r--r--src/tools/mesh_extractor/ChunkedData.h38
-rw-r--r--src/tools/mesh_extractor/Constants.h75
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.cpp213
-rw-r--r--src/tools/mesh_extractor/ContinentBuilder.h48
-rw-r--r--src/tools/mesh_extractor/DBC.cpp88
-rw-r--r--src/tools/mesh_extractor/DBC.h70
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.cpp126
-rw-r--r--src/tools/mesh_extractor/DoodadHandler.h79
-rw-r--r--src/tools/mesh_extractor/Geometry.cpp146
-rw-r--r--src/tools/mesh_extractor/Geometry.h40
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.cpp119
-rw-r--r--src/tools/mesh_extractor/LiquidHandler.h38
-rw-r--r--src/tools/mesh_extractor/MPQ.cpp139
-rw-r--r--src/tools/mesh_extractor/MPQ.h106
-rw-r--r--src/tools/mesh_extractor/MPQManager.cpp132
-rw-r--r--src/tools/mesh_extractor/MPQManager.h53
-rw-r--r--src/tools/mesh_extractor/MapChunk.cpp93
-rw-r--r--src/tools/mesh_extractor/MapChunk.h41
-rw-r--r--src/tools/mesh_extractor/MeshExtractor.cpp486
-rw-r--r--src/tools/mesh_extractor/Model.cpp84
-rw-r--r--src/tools/mesh_extractor/Model.h40
-rw-r--r--src/tools/mesh_extractor/ObjectDataHandler.cpp26
-rw-r--r--src/tools/mesh_extractor/ObjectDataHandler.h32
-rw-r--r--src/tools/mesh_extractor/TileBuilder.cpp414
-rw-r--r--src/tools/mesh_extractor/TileBuilder.h51
-rw-r--r--src/tools/mesh_extractor/Utils.cpp564
-rw-r--r--src/tools/mesh_extractor/Utils.h407
-rw-r--r--src/tools/mesh_extractor/WDT.cpp78
-rw-r--r--src/tools/mesh_extractor/WDT.h46
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.cpp160
-rw-r--r--src/tools/mesh_extractor/WorldModelGroup.h55
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.cpp237
-rw-r--r--src/tools/mesh_extractor/WorldModelHandler.h64
-rw-r--r--src/tools/mesh_extractor/WorldModelRoot.cpp96
-rw-r--r--src/tools/mesh_extractor/WorldModelRoot.h44
-rw-r--r--src/tools/mesh_extractor/readme6
-rw-r--r--src/tools/vmap4_extractor/adtfile.cpp2
-rw-r--r--src/tools/vmap4_extractor/dbcfile.cpp3
-rw-r--r--src/tools/vmap4_extractor/vmapexport.cpp20
-rw-r--r--src/tools/vmap4_extractor/wdtfile.cpp2
180 files changed, 5783 insertions, 8918 deletions
diff --git a/src/server/game/Accounts/BattlenetAccountMgr.cpp b/src/server/game/Accounts/BattlenetAccountMgr.cpp
index 88ebb000b5b..3241c6eb5a2 100644
--- a/src/server/game/Accounts/BattlenetAccountMgr.cpp
+++ b/src/server/game/Accounts/BattlenetAccountMgr.cpp
@@ -23,7 +23,7 @@
using GameAccountMgr = AccountMgr;
-AccountOpResult Battlenet::AccountMgr::CreateBattlenetAccount(std::string email, std::string password)
+AccountOpResult Battlenet::AccountMgr::CreateBattlenetAccount(std::string email, std::string password, bool withGameAccount /*= true*/)
{
if (utf8length(email) > MAX_BNET_EMAIL_STR)
return AccountOpResult::AOR_NAME_TOO_LONG;
@@ -45,7 +45,9 @@ AccountOpResult Battlenet::AccountMgr::CreateBattlenetAccount(std::string email,
uint32 newAccountId = GetId(email);
ASSERT(newAccountId);
- GameAccountMgr::instance()->CreateAccount(std::to_string(newAccountId) + "#1", password, email, newAccountId, 1);
+ if (withGameAccount)
+ GameAccountMgr::instance()->CreateAccount(std::to_string(newAccountId) + "#1", password, email, newAccountId, 1);
+
return AccountOpResult::AOR_OK;
}
diff --git a/src/server/game/Accounts/BattlenetAccountMgr.h b/src/server/game/Accounts/BattlenetAccountMgr.h
index 120bee18e13..7601cbc4e53 100644
--- a/src/server/game/Accounts/BattlenetAccountMgr.h
+++ b/src/server/game/Accounts/BattlenetAccountMgr.h
@@ -29,7 +29,7 @@ namespace Battlenet
{
namespace AccountMgr
{
- AccountOpResult CreateBattlenetAccount(std::string email, std::string password);
+ AccountOpResult CreateBattlenetAccount(std::string email, std::string password, bool withGameAccount = true);
AccountOpResult ChangePassword(uint32 accountId, std::string newPassword);
bool CheckPassword(uint32 accountId, std::string password);
AccountOpResult LinkWithGameAccount(std::string const& email, std::string const& gameAccountName);
diff --git a/src/server/game/Accounts/RBAC.cpp b/src/server/game/Accounts/RBAC.cpp
index 54ef1a34766..74ff060636e 100644
--- a/src/server/game/Accounts/RBAC.cpp
+++ b/src/server/game/Accounts/RBAC.cpp
@@ -1,265 +1,265 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "RBAC.h"
-#include "AccountMgr.h"
-#include "DatabaseEnv.h"
-#include "Log.h"
-
-namespace rbac
-{
-
-std::string GetDebugPermissionString(RBACPermissionContainer const& perms)
-{
- std::string str = "";
- if (!perms.empty())
- {
- std::ostringstream o;
- RBACPermissionContainer::const_iterator itr = perms.begin();
- o << (*itr);
- for (++itr; itr != perms.end(); ++itr)
- o << ", " << uint32(*itr);
- str = o.str();
- }
-
- return str;
-}
-
-RBACCommandResult RBACData::GrantPermission(uint32 permissionId, int32 realmId /* = 0*/)
-{
- // Check if permission Id exists
- RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
- if (!perm)
- {
- TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission does not exists",
- GetId(), GetName().c_str(), permissionId, realmId);
- return RBAC_ID_DOES_NOT_EXISTS;
- }
-
- // Check if already added in denied list
- if (HasDeniedPermission(permissionId))
- {
- TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission in deny list",
- GetId(), GetName().c_str(), permissionId, realmId);
- return RBAC_IN_DENIED_LIST;
- }
-
- // Already added?
- if (HasGrantedPermission(permissionId))
- {
- TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission already granted",
- GetId(), GetName().c_str(), permissionId, realmId);
- return RBAC_CANT_ADD_ALREADY_ADDED;
- }
-
- AddGrantedPermission(permissionId);
-
- // Do not save to db when loading data from DB (realmId = 0)
- if (realmId)
- {
- TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
- GetId(), GetName().c_str(), permissionId, realmId);
- SavePermission(permissionId, true, realmId);
- CalculateNewPermissions();
- }
- else
- TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
- GetId(), GetName().c_str(), permissionId, realmId);
-
- return RBAC_OK;
-}
-
-RBACCommandResult RBACData::DenyPermission(uint32 permissionId, int32 realmId /* = 0*/)
-{
- // Check if permission Id exists
- RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
- if (!perm)
- {
- TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission does not exists",
- GetId(), GetName().c_str(), permissionId, realmId);
- return RBAC_ID_DOES_NOT_EXISTS;
- }
-
- // Check if already added in granted list
- if (HasGrantedPermission(permissionId))
- {
- TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission in grant list",
- GetId(), GetName().c_str(), permissionId, realmId);
- return RBAC_IN_GRANTED_LIST;
- }
-
- // Already added?
- if (HasDeniedPermission(permissionId))
- {
- TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission already denied",
- GetId(), GetName().c_str(), permissionId, realmId);
- return RBAC_CANT_ADD_ALREADY_ADDED;
- }
-
- AddDeniedPermission(permissionId);
-
- // Do not save to db when loading data from DB (realmId = 0)
- if (realmId)
- {
- TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
- GetId(), GetName().c_str(), permissionId, realmId);
- SavePermission(permissionId, false, realmId);
- CalculateNewPermissions();
- }
- else
- TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
- GetId(), GetName().c_str(), permissionId, realmId);
-
- return RBAC_OK;
-}
-
-void RBACData::SavePermission(uint32 permission, bool granted, int32 realmId)
-{
- PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_RBAC_ACCOUNT_PERMISSION);
- stmt->setUInt32(0, GetId());
- stmt->setUInt32(1, permission);
- stmt->setBool(2, granted);
- stmt->setInt32(3, realmId);
- LoginDatabase.Execute(stmt);
-}
-
-RBACCommandResult RBACData::RevokePermission(uint32 permissionId, int32 realmId /* = 0*/)
-{
- // Check if it's present in any list
- if (!HasGrantedPermission(permissionId) && !HasDeniedPermission(permissionId))
- {
- TC_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Not granted or revoked",
- GetId(), GetName().c_str(), permissionId, realmId);
- return RBAC_CANT_REVOKE_NOT_IN_LIST;
- }
-
- RemoveGrantedPermission(permissionId);
- RemoveDeniedPermission(permissionId);
-
- // Do not save to db when loading data from DB (realmId = 0)
- if (realmId)
- {
- TC_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
- GetId(), GetName().c_str(), permissionId, realmId);
- PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_RBAC_ACCOUNT_PERMISSION);
- stmt->setUInt32(0, GetId());
- stmt->setUInt32(1, permissionId);
- stmt->setInt32(2, realmId);
- LoginDatabase.Execute(stmt);
-
- CalculateNewPermissions();
- }
- else
- TC_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
- GetId(), GetName().c_str(), permissionId, realmId);
-
- return RBAC_OK;
-}
-
-void RBACData::LoadFromDB()
-{
- ClearData();
-
- TC_LOG_DEBUG("rbac", "RBACData::LoadFromDB [Id: %u Name: %s]: Loading permissions", GetId(), GetName().c_str());
- // Load account permissions (granted and denied) that affect current realm
- PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS);
- stmt->setUInt32(0, GetId());
- stmt->setInt32(1, GetRealmId());
-
- PreparedQueryResult result = LoginDatabase.Query(stmt);
- if (result)
- {
- do
- {
- Field* fields = result->Fetch();
- if (fields[1].GetBool())
- GrantPermission(fields[0].GetUInt32());
- else
- DenyPermission(fields[0].GetUInt32());
- }
- while (result->NextRow());
- }
-
- // Add default permissions
- RBACPermissionContainer const& permissions = sAccountMgr->GetRBACDefaultPermissions(_secLevel);
- for (RBACPermissionContainer::const_iterator itr = permissions.begin(); itr != permissions.end(); ++itr)
- GrantPermission(*itr);
-
- // Force calculation of permissions
- CalculateNewPermissions();
-}
-
-void RBACData::CalculateNewPermissions()
-{
- TC_LOG_TRACE("rbac", "RBACData::CalculateNewPermissions [Id: %u Name: %s]", GetId(), GetName().c_str());
-
- // Get the list of granted permissions
- _globalPerms = GetGrantedPermissions();
- ExpandPermissions(_globalPerms);
- RBACPermissionContainer revoked = GetDeniedPermissions();
- ExpandPermissions(revoked);
- RemovePermissions(_globalPerms, revoked);
-}
-
-void RBACData::AddPermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo)
-{
- for (RBACPermissionContainer::const_iterator itr = permsFrom.begin(); itr != permsFrom.end(); ++itr)
- permsTo.insert(*itr);
-}
-
-void RBACData::RemovePermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo)
-{
- for (RBACPermissionContainer::const_iterator itr = permsFrom.begin(); itr != permsFrom.end(); ++itr)
- permsTo.erase(*itr);
-}
-
-void RBACData::ExpandPermissions(RBACPermissionContainer& permissions)
-{
- RBACPermissionContainer toCheck = permissions;
- permissions.clear();
-
- while (!toCheck.empty())
- {
- // remove the permission from original list
- uint32 permissionId = *toCheck.begin();
- toCheck.erase(toCheck.begin());
-
- RBACPermission const* permission = sAccountMgr->GetRBACPermission(permissionId);
- if (!permission)
- continue;
-
- // insert into the final list (expanded list)
- permissions.insert(permissionId);
-
- // add all linked permissions (that are not already expanded) to the list of permissions to be checked
- RBACPermissionContainer const& linkedPerms = permission->GetLinkedPermissions();
- for (RBACPermissionContainer::const_iterator itr = linkedPerms.begin(); itr != linkedPerms.end(); ++itr)
- if (permissions.find(*itr) == permissions.end())
- toCheck.insert(*itr);
- }
-
- TC_LOG_DEBUG("rbac", "RBACData::ExpandPermissions: Expanded: %s", GetDebugPermissionString(permissions).c_str());
-}
-
-void RBACData::ClearData()
-{
- _grantedPerms.clear();
- _deniedPerms.clear();
- _globalPerms.clear();
-}
-
-}
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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 "RBAC.h"
+#include "AccountMgr.h"
+#include "DatabaseEnv.h"
+#include "Log.h"
+
+namespace rbac
+{
+
+std::string GetDebugPermissionString(RBACPermissionContainer const& perms)
+{
+ std::string str = "";
+ if (!perms.empty())
+ {
+ std::ostringstream o;
+ RBACPermissionContainer::const_iterator itr = perms.begin();
+ o << (*itr);
+ for (++itr; itr != perms.end(); ++itr)
+ o << ", " << uint32(*itr);
+ str = o.str();
+ }
+
+ return str;
+}
+
+RBACCommandResult RBACData::GrantPermission(uint32 permissionId, int32 realmId /* = 0*/)
+{
+ // Check if permission Id exists
+ RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
+ if (!perm)
+ {
+ TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission does not exists",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ return RBAC_ID_DOES_NOT_EXISTS;
+ }
+
+ // Check if already added in denied list
+ if (HasDeniedPermission(permissionId))
+ {
+ TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission in deny list",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ return RBAC_IN_DENIED_LIST;
+ }
+
+ // Already added?
+ if (HasGrantedPermission(permissionId))
+ {
+ TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission already granted",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ return RBAC_CANT_ADD_ALREADY_ADDED;
+ }
+
+ AddGrantedPermission(permissionId);
+
+ // Do not save to db when loading data from DB (realmId = 0)
+ if (realmId)
+ {
+ TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ SavePermission(permissionId, true, realmId);
+ CalculateNewPermissions();
+ }
+ else
+ TC_LOG_TRACE("rbac", "RBACData::GrantPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
+ GetId(), GetName().c_str(), permissionId, realmId);
+
+ return RBAC_OK;
+}
+
+RBACCommandResult RBACData::DenyPermission(uint32 permissionId, int32 realmId /* = 0*/)
+{
+ // Check if permission Id exists
+ RBACPermission const* perm = sAccountMgr->GetRBACPermission(permissionId);
+ if (!perm)
+ {
+ TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission does not exists",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ return RBAC_ID_DOES_NOT_EXISTS;
+ }
+
+ // Check if already added in granted list
+ if (HasGrantedPermission(permissionId))
+ {
+ TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission in grant list",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ return RBAC_IN_GRANTED_LIST;
+ }
+
+ // Already added?
+ if (HasDeniedPermission(permissionId))
+ {
+ TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Permission already denied",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ return RBAC_CANT_ADD_ALREADY_ADDED;
+ }
+
+ AddDeniedPermission(permissionId);
+
+ // Do not save to db when loading data from DB (realmId = 0)
+ if (realmId)
+ {
+ TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ SavePermission(permissionId, false, realmId);
+ CalculateNewPermissions();
+ }
+ else
+ TC_LOG_TRACE("rbac", "RBACData::DenyPermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
+ GetId(), GetName().c_str(), permissionId, realmId);
+
+ return RBAC_OK;
+}
+
+void RBACData::SavePermission(uint32 permission, bool granted, int32 realmId)
+{
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_INS_RBAC_ACCOUNT_PERMISSION);
+ stmt->setUInt32(0, GetId());
+ stmt->setUInt32(1, permission);
+ stmt->setBool(2, granted);
+ stmt->setInt32(3, realmId);
+ LoginDatabase.Execute(stmt);
+}
+
+RBACCommandResult RBACData::RevokePermission(uint32 permissionId, int32 realmId /* = 0*/)
+{
+ // Check if it's present in any list
+ if (!HasGrantedPermission(permissionId) && !HasDeniedPermission(permissionId))
+ {
+ TC_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Not granted or revoked",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ return RBAC_CANT_REVOKE_NOT_IN_LIST;
+ }
+
+ RemoveGrantedPermission(permissionId);
+ RemoveDeniedPermission(permissionId);
+
+ // Do not save to db when loading data from DB (realmId = 0)
+ if (realmId)
+ {
+ TC_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok and DB updated",
+ GetId(), GetName().c_str(), permissionId, realmId);
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_DEL_RBAC_ACCOUNT_PERMISSION);
+ stmt->setUInt32(0, GetId());
+ stmt->setUInt32(1, permissionId);
+ stmt->setInt32(2, realmId);
+ LoginDatabase.Execute(stmt);
+
+ CalculateNewPermissions();
+ }
+ else
+ TC_LOG_TRACE("rbac", "RBACData::RevokePermission [Id: %u Name: %s] (Permission %u, RealmId %d). Ok",
+ GetId(), GetName().c_str(), permissionId, realmId);
+
+ return RBAC_OK;
+}
+
+void RBACData::LoadFromDB()
+{
+ ClearData();
+
+ TC_LOG_DEBUG("rbac", "RBACData::LoadFromDB [Id: %u Name: %s]: Loading permissions", GetId(), GetName().c_str());
+ // Load account permissions (granted and denied) that affect current realm
+ PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS);
+ stmt->setUInt32(0, GetId());
+ stmt->setInt32(1, GetRealmId());
+
+ PreparedQueryResult result = LoginDatabase.Query(stmt);
+ if (result)
+ {
+ do
+ {
+ Field* fields = result->Fetch();
+ if (fields[1].GetBool())
+ GrantPermission(fields[0].GetUInt32());
+ else
+ DenyPermission(fields[0].GetUInt32());
+ }
+ while (result->NextRow());
+ }
+
+ // Add default permissions
+ RBACPermissionContainer const& permissions = sAccountMgr->GetRBACDefaultPermissions(_secLevel);
+ for (RBACPermissionContainer::const_iterator itr = permissions.begin(); itr != permissions.end(); ++itr)
+ GrantPermission(*itr);
+
+ // Force calculation of permissions
+ CalculateNewPermissions();
+}
+
+void RBACData::CalculateNewPermissions()
+{
+ TC_LOG_TRACE("rbac", "RBACData::CalculateNewPermissions [Id: %u Name: %s]", GetId(), GetName().c_str());
+
+ // Get the list of granted permissions
+ _globalPerms = GetGrantedPermissions();
+ ExpandPermissions(_globalPerms);
+ RBACPermissionContainer revoked = GetDeniedPermissions();
+ ExpandPermissions(revoked);
+ RemovePermissions(_globalPerms, revoked);
+}
+
+void RBACData::AddPermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo)
+{
+ for (RBACPermissionContainer::const_iterator itr = permsFrom.begin(); itr != permsFrom.end(); ++itr)
+ permsTo.insert(*itr);
+}
+
+void RBACData::RemovePermissions(RBACPermissionContainer const& permsFrom, RBACPermissionContainer& permsTo)
+{
+ for (RBACPermissionContainer::const_iterator itr = permsFrom.begin(); itr != permsFrom.end(); ++itr)
+ permsTo.erase(*itr);
+}
+
+void RBACData::ExpandPermissions(RBACPermissionContainer& permissions)
+{
+ RBACPermissionContainer toCheck = permissions;
+ permissions.clear();
+
+ while (!toCheck.empty())
+ {
+ // remove the permission from original list
+ uint32 permissionId = *toCheck.begin();
+ toCheck.erase(toCheck.begin());
+
+ RBACPermission const* permission = sAccountMgr->GetRBACPermission(permissionId);
+ if (!permission)
+ continue;
+
+ // insert into the final list (expanded list)
+ permissions.insert(permissionId);
+
+ // add all linked permissions (that are not already expanded) to the list of permissions to be checked
+ RBACPermissionContainer const& linkedPerms = permission->GetLinkedPermissions();
+ for (RBACPermissionContainer::const_iterator itr = linkedPerms.begin(); itr != linkedPerms.end(); ++itr)
+ if (permissions.find(*itr) == permissions.end())
+ toCheck.insert(*itr);
+ }
+
+ TC_LOG_DEBUG("rbac", "RBACData::ExpandPermissions: Expanded: %s", GetDebugPermissionString(permissions).c_str());
+}
+
+void RBACData::ClearData()
+{
+ _grantedPerms.clear();
+ _deniedPerms.clear();
+ _globalPerms.clear();
+}
+
+}
diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp
index ba2571884dc..5f9f63e34d1 100644
--- a/src/server/game/Achievements/AchievementMgr.cpp
+++ b/src/server/game/Achievements/AchievementMgr.cpp
@@ -422,9 +422,9 @@ void AchievementMgr<T>::RemoveCriteriaProgress(AchievementCriteria const* entry)
if (criteriaProgress == m_criteriaProgress.end())
return;
- WorldPacket data(SMSG_CRITERIA_DELETED, 4);
- data << uint32(entry->ID);
- SendPacket(&data);
+ WorldPackets::Achievement::CriteriaDeleted criteriaDeleted;
+ criteriaDeleted.CriteriaID = entry->ID;
+ SendPacket(criteriaDeleted.Write());
m_criteriaProgress.erase(criteriaProgress);
}
@@ -439,29 +439,10 @@ void AchievementMgr<Guild>::RemoveCriteriaProgress(AchievementCriteria const* en
if (criteriaProgress == m_criteriaProgress.end())
return;
- ObjectGuid guid = GetOwner()->GetGUID();
-
- WorldPacket data(SMSG_GUILD_CRITERIA_DELETED, 4 + 8);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[4]);
-
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[7]);
- data << uint32(entry->ID);
- data.WriteByteSeq(guid[5]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[6]);
-
- SendPacket(&data);
+ WorldPackets::Achievement::GuildCriteriaDeleted guildCriteriaDeleted;
+ guildCriteriaDeleted.GuildGUID = GetOwner()->GetGUID();
+ guildCriteriaDeleted.CriteriaID = entry->ID;
+ SendPacket(guildCriteriaDeleted.Write());
m_criteriaProgress.erase(criteriaProgress);
}
@@ -790,16 +771,16 @@ void AchievementMgr<Player>::Reset()
{
for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
{
- WorldPacket data(SMSG_ACHIEVEMENT_DELETED, 4);
- data << uint32(iter->first);
- SendPacket(&data);
+ WorldPackets::Achievement::AchievementDeleted achievementDeleted;
+ achievementDeleted.AchievementID = iter->first;
+ SendPacket(achievementDeleted.Write());
}
for (CriteriaProgressMap::const_iterator iter = m_criteriaProgress.begin(); iter != m_criteriaProgress.end(); ++iter)
{
- WorldPacket data(SMSG_CRITERIA_DELETED, 4);
- data << uint32(iter->first);
- SendPacket(&data);
+ WorldPackets::Achievement::CriteriaDeleted criteriaDeleted;
+ criteriaDeleted.CriteriaID = iter->first;
+ SendPacket(criteriaDeleted.Write());
}
m_completedAchievements.clear();
@@ -817,26 +798,11 @@ void AchievementMgr<Guild>::Reset()
ObjectGuid guid = GetOwner()->GetGUID();
for (CompletedAchievementMap::const_iterator iter = m_completedAchievements.begin(); iter != m_completedAchievements.end(); ++iter)
{
- WorldPacket data(SMSG_GUILD_ACHIEVEMENT_DELETED, 4);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[6]);
- data << uint32(iter->first);
- data.WriteByteSeq(guid[5]);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[7]);
- data.AppendPackedTime(iter->second.date);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[2]);
- SendPacket(&data);
+ WorldPackets::Achievement::GuildAchievementDeleted guildAchievementDeleted;
+ guildAchievementDeleted.AchievementID = iter->first;
+ guildAchievementDeleted.GuildGUID = guid;
+ guildAchievementDeleted.TimeDeleted = time(NULL);
+ SendPacket(guildAchievementDeleted.Write());
}
while (!m_criteriaProgress.empty())
@@ -867,12 +833,11 @@ void AchievementMgr<T>::SendAchievementEarned(AchievementEntry const* achievemen
if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL | ACHIEVEMENT_FLAG_REALM_FIRST_REACH))
{
// broadcast realm first reached
- WorldPacket data(SMSG_SERVER_FIRST_ACHIEVEMENT, GetOwner()->GetName().size() + 1 + 8 + 4 + 4);
- data << GetOwner()->GetName();
- data << GetOwner()->GetGUID();
- data << uint32(achievement->ID);
- data << uint32(0); // 1=link supplied string as player name, 0=display plain string
- sWorld->SendGlobalMessage(&data);
+ WorldPackets::Achievement::ServerFirstAchievement serverFirstAchievement;
+ serverFirstAchievement.Name = GetOwner()->GetName();
+ serverFirstAchievement.PlayerGUID = GetOwner()->GetGUID();
+ serverFirstAchievement.AchievementID = achievement->ID;
+ sWorld->SendGlobalMessage(serverFirstAchievement.Write());
}
// if player is in world he can tell his friends about new achievement
else if (GetOwner()->IsInWorld())
@@ -895,30 +860,22 @@ void AchievementMgr<T>::SendAchievementEarned(AchievementEntry const* achievemen
template<>
void AchievementMgr<Guild>::SendAchievementEarned(AchievementEntry const* achievement) const
{
- ObjectGuid guid = GetOwner()->GetGUID();
+ if (achievement->Flags & (ACHIEVEMENT_FLAG_REALM_FIRST_KILL | ACHIEVEMENT_FLAG_REALM_FIRST_REACH))
+ {
+ // broadcast realm first reached
+ WorldPackets::Achievement::ServerFirstAchievement serverFirstAchievement;
+ serverFirstAchievement.Name = GetOwner()->GetName();
+ serverFirstAchievement.PlayerGUID = GetOwner()->GetGUID();
+ serverFirstAchievement.AchievementID = achievement->ID;
+ serverFirstAchievement.GuildAchievement = true;
+ sWorld->SendGlobalMessage(serverFirstAchievement.Write());
+ }
- WorldPacket data(SMSG_GUILD_ACHIEVEMENT_EARNED, 8+4+8);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[6]);
- data.WriteBit(guid[2]);
- data.WriteBit(guid[5]);
-
- data.WriteByteSeq(guid[2]);
- data.AppendPackedTime(time(NULL));
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[3]);
- data << uint32(achievement->ID);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[5]);
- data.WriteByteSeq(guid[6]);
-
- SendPacket(&data);
+ WorldPackets::Achievement::GuildAchievementEarned guildAchievementEarned;
+ guildAchievementEarned.AchievementID = achievement->ID;
+ guildAchievementEarned.GuildGUID = GetOwner()->GetGUID();
+ guildAchievementEarned.TimeEarned = time(NULL);
+ SendPacket(guildAchievementEarned.Write());
}
template<class T>
@@ -948,57 +905,19 @@ void AchievementMgr<Player>::SendCriteriaUpdate(AchievementCriteria const* crite
template<>
void AchievementMgr<Guild>::SendCriteriaUpdate(AchievementCriteria const* entry, CriteriaProgress const* progress, uint32 /*timeElapsed*/, bool /*timedCompleted*/) const
{
- /*
- //will send response to criteria progress request
- WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3 + 1 + 1 + 8 + 8 + 4 + 4 + 4 + 4 + 4);
-
- ObjectGuid counter(0, progress->counter); // for accessing every byte individually
- ObjectGuid guid = progress->PlayerGUID;
-
- data.WriteBits(1, 21);
- data.WriteBit(counter[4]);
- data.WriteBit(counter[1]);
- data.WriteBit(guid[2]);
- data.WriteBit(counter[3]);
- data.WriteBit(guid[1]);
- data.WriteBit(counter[5]);
- data.WriteBit(counter[0]);
- data.WriteBit(guid[3]);
- data.WriteBit(counter[2]);
- data.WriteBit(guid[7]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[0]);
- data.WriteBit(counter[6]);
- data.WriteBit(guid[6]);
- data.WriteBit(counter[7]);
- data.WriteBit(guid[4]);
-
- data.FlushBits();
-
- data.WriteByteSeq(guid[5]);
- data << uint32(progress->date); // unknown date
- data.WriteByteSeq(counter[3]);
- data.WriteByteSeq(counter[7]);
- data << uint32(progress->date); // unknown date
- data.WriteByteSeq(counter[6]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(counter[4]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(counter[0]);
- data.WriteByteSeq(guid[2]);
- data.WriteByteSeq(counter[1]);
- data.WriteByteSeq(guid[6]);
- data << uint32(progress->date); // last update time (not packed!)
- data << uint32(entry->ID);
- data.WriteByteSeq(counter[5]);
- data << uint32(0);
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(counter[2]);
- data.WriteByteSeq(guid[0]);
-
- GetOwner()->BroadcastPacketIfTrackingAchievement(&data, entry->ID);
- */
+ WorldPackets::Achievement::GuildCriteriaUpdate guildCriteriaUpdate;
+ guildCriteriaUpdate.Progress.resize(1);
+
+ WorldPackets::Achievement::GuildCriteriaProgress& guildCriteriaProgress = guildCriteriaUpdate.Progress[0];
+ guildCriteriaProgress.CriteriaID = entry->ID;
+ guildCriteriaProgress.DateCreated = 0;
+ guildCriteriaProgress.DateStarted = 0;
+ guildCriteriaProgress.DateUpdated = progress->date;
+ guildCriteriaProgress.Quantity = progress->counter;
+ guildCriteriaProgress.PlayerGUID = progress->PlayerGUID;
+ guildCriteriaProgress.Flags = 0;
+
+ GetOwner()->BroadcastPacketIfTrackingAchievement(guildCriteriaUpdate.Write(), entry->ID);
}
template<class T>
@@ -1009,86 +928,28 @@ void AchievementMgr<T>::SendAllTrackedCriterias(Player* /*receiver*/, std::set<u
template<>
void AchievementMgr<Guild>::SendAllTrackedCriterias(Player* receiver, std::set<uint32> const& trackedCriterias) const
{
- /*
- ObjectGuid counter;
- ObjectGuid guid;
- uint32 trackedCriteriasCount = 0;
+ WorldPackets::Achievement::GuildCriteriaUpdate guildCriteriaUpdate;
+ guildCriteriaUpdate.Progress.reserve(trackedCriterias.size());
- for (std::set<uint32>::iterator itr = trackedCriterias.begin(); itr != trackedCriterias.end(); ++itr)
+ for (uint32 criteriaId : trackedCriterias)
{
- AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteriaTree(*itr);
-
- CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(entry->ID);
+ auto progress = m_criteriaProgress.find(criteriaId);
if (progress == m_criteriaProgress.end())
continue;
- ++trackedCriteriasCount;
- }
+ WorldPackets::Achievement::GuildCriteriaProgress guildCriteriaProgress;
+ guildCriteriaProgress.CriteriaID = criteriaId;
+ guildCriteriaProgress.DateCreated = 0;
+ guildCriteriaProgress.DateStarted = 0;
+ guildCriteriaProgress.DateUpdated = progress->second.date;
+ guildCriteriaProgress.Quantity = progress->second.counter;
+ guildCriteriaProgress.PlayerGUID = progress->second.PlayerGUID;
+ guildCriteriaProgress.Flags = 0;
- ByteBuffer criteriaBits(21 + (trackedCriteriasCount * (8 + 8)));
- ByteBuffer criteriaData(trackedCriteriasCount * (8 + 8 + 4 + 4 + 4 + 4 + 4));
-
- criteriaBits.WriteBits(trackedCriteriasCount, 21);
-
- for (std::set<uint32>::iterator itr = trackedCriterias.begin(); itr != trackedCriterias.end(); ++itr)
- {
- AchievementCriteriaEntry const* entry = sAchievementMgr->GetAchievementCriteriaTree(*itr);
-
- CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(entry->ID);
- if (progress == m_criteriaProgress.end())
- continue;
+ guildCriteriaUpdate.Progress.push_back(guildCriteriaProgress);
+ }
- counter.SetRawValue(progress->second.counter);
- guid = progress->second.PlayerGUID;
-
- criteriaBits.WriteBit(counter[4]);
- criteriaBits.WriteBit(counter[1]);
- criteriaBits.WriteBit(guid[2]);
- criteriaBits.WriteBit(counter[3]);
- criteriaBits.WriteBit(guid[1]);
- criteriaBits.WriteBit(counter[5]);
- criteriaBits.WriteBit(counter[0]);
- criteriaBits.WriteBit(guid[3]);
- criteriaBits.WriteBit(counter[2]);
- criteriaBits.WriteBit(guid[7]);
- criteriaBits.WriteBit(guid[5]);
- criteriaBits.WriteBit(guid[0]);
- criteriaBits.WriteBit(counter[6]);
- criteriaBits.WriteBit(guid[6]);
- criteriaBits.WriteBit(counter[7]);
- criteriaBits.WriteBit(guid[4]);
-
- criteriaData.WriteByteSeq(guid[5]);
- criteriaData << uint32(progress->second.date); // unknown date
- criteriaData.WriteByteSeq(counter[3]);
- criteriaData.WriteByteSeq(counter[7]);
- criteriaData << uint32(progress->second.date); // unknown date
- criteriaData.WriteByteSeq(counter[6]);
- criteriaData.WriteByteSeq(guid[4]);
- criteriaData.WriteByteSeq(guid[1]);
- criteriaData.WriteByteSeq(counter[4]);
- criteriaData.WriteByteSeq(guid[3]);
- criteriaData.WriteByteSeq(counter[0]);
- criteriaData.WriteByteSeq(guid[2]);
- criteriaData.WriteByteSeq(counter[1]);
- criteriaData.WriteByteSeq(guid[6]);
- criteriaData << uint32(progress->second.date); // last update time (not packed!)
- criteriaData << uint32(entry->ID);
- criteriaData.WriteByteSeq(counter[5]);
- criteriaData << uint32(0);
- criteriaData.WriteByteSeq(guid[7]);
- criteriaData.WriteByteSeq(counter[2]);
- criteriaData.WriteByteSeq(guid[0]);
- }
-
- WorldPacket data(SMSG_GUILD_CRITERIA_DATA, criteriaBits.size() + criteriaData.size());
- data.append(criteriaBits);
-
- if (trackedCriteriasCount)
- data.append(criteriaData);
-
- receiver->GetSession()->SendPacket(&data);
- */
+ receiver->GetSession()->SendPacket(guildCriteriaUpdate.Write());
}
/**
@@ -1645,20 +1506,6 @@ void AchievementMgr<T>::CompletedCriteriaFor(AchievementEntry const* achievement
}
template<class T>
-uint64 AchievementMgr<T>::GetTotalCriteriaTreeProgress(AchievementCriteriaTree const* criteriaTree)
-{
- uint64 progress = 0;
- if (criteriaTree->Criteria)
- if (CriteriaProgress const* criteriaProgress = GetCriteriaProgress(criteriaTree->Criteria))
- progress += criteriaProgress->counter;
-
- for (AchievementCriteriaTree const* node : criteriaTree->Children)
- progress += GetTotalCriteriaTreeProgress(node);
-
- return progress;
-}
-
-template<class T>
bool AchievementMgr<T>::IsCompletedAchievement(AchievementEntry const* entry)
{
// counter can never complete
@@ -1672,7 +1519,16 @@ bool AchievementMgr<T>::IsCompletedAchievement(AchievementEntry const* entry)
// For SUMM achievements, we have to count the progress of each criteria of the achievement.
// Oddly, the target count is NOT contained in the achievement, but in each individual criteria
if (entry->Flags & ACHIEVEMENT_FLAG_SUMM)
- return GetTotalCriteriaTreeProgress(tree) >= tree->Entry->Amount;
+ {
+ uint64 progress = 0;
+ sAchievementMgr->WalkCriteriaTree(tree, [this, &progress](AchievementCriteriaTree const* criteriaTree)
+ {
+ if (criteriaTree->Criteria)
+ if (CriteriaProgress const* criteriaProgress = this->GetCriteriaProgress(criteriaTree->Criteria))
+ progress += criteriaProgress->counter;
+ });
+ return progress >= tree->Entry->Amount;
+ }
return IsCompletedCriteriaTree(tree);
}
@@ -2005,9 +1861,9 @@ template<class T>
void AchievementMgr<T>::SendAllAchievementData(Player* /*receiver*/) const
{
VisibleAchievementCheck filterInvisible;
- WorldPackets::Achievement::AllAchievements achievementData;
- achievementData.Earned.reserve(m_completedAchievements.size());
- achievementData.Progress.reserve(m_criteriaProgress.size());
+ WorldPackets::Achievement::AllAchievementData achievementData;
+ achievementData.Data.Earned.reserve(m_completedAchievements.size());
+ achievementData.Data.Progress.reserve(m_criteriaProgress.size());
for (auto itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
{
@@ -2023,7 +1879,7 @@ void AchievementMgr<T>::SendAllAchievementData(Player* /*receiver*/) const
earned.Owner = GetOwner()->GetGUID();
earned.VirtualRealmAddress = earned.NativeRealmAddress = GetVirtualRealmAddress();
}
- achievementData.Earned.push_back(earned);
+ achievementData.Data.Earned.push_back(earned);
}
for (auto itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr)
@@ -2036,7 +1892,7 @@ void AchievementMgr<T>::SendAllAchievementData(Player* /*receiver*/) const
progress.Date = itr->second.date;
progress.TimeFromStart = 0;
progress.TimeFromCreate = 0;
- achievementData.Progress.push_back(progress);
+ achievementData.Data.Progress.push_back(progress);
}
SendPacket(achievementData.Write());
@@ -2045,208 +1901,99 @@ void AchievementMgr<T>::SendAllAchievementData(Player* /*receiver*/) const
template<>
void AchievementMgr<Guild>::SendAllAchievementData(Player* receiver) const
{
- VisibleAchievementCheck isVisible;
-
- auto count = std::count_if(m_completedAchievements.begin(), m_completedAchievements.end(), isVisible);
-
- WorldPacket data(SMSG_GUILD_ACHIEVEMENT_DATA, count * (4 + 4) + 3);
- data.WriteBits(count, 23);
- data.FlushBits();
+ VisibleAchievementCheck filterInvisible;
+ WorldPackets::Achievement::AllGuildAchievements allGuildAchievements;
+ allGuildAchievements.Earned.reserve(m_completedAchievements.size());
- for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
+ for (auto itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
{
- if (!isVisible(*itr))
+ AchievementEntry const* achievement = filterInvisible(*itr);
+ if (!achievement)
continue;
- data.AppendPackedTime(itr->second.date);
- data << uint32(itr->first);
+ WorldPackets::Achievement::EarnedAchievement earned;
+ earned.Id = itr->first;
+ earned.Date = itr->second.date;
+ allGuildAchievements.Earned.push_back(earned);
}
- receiver->GetSession()->SendPacket(&data);
+ receiver->GetSession()->SendPacket(allGuildAchievements.Write());
}
template<>
void AchievementMgr<Player>::SendAchievementInfo(Player* receiver, uint32 /*achievementId = 0 */) const
{
- /*
- ObjectGuid guid = GetOwner()->GetGUID();
- ObjectGuid counter;
-
VisibleAchievementCheck filterInvisible;
- size_t numCriteria = m_criteriaProgress.size();
- size_t numAchievements = std::count_if(m_completedAchievements.begin(), m_completedAchievements.end(), filterInvisible);
- ByteBuffer criteriaData(numCriteria * 16);
-
- WorldPacket data(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, 1 + 8 + 3 + 3 + numAchievements * (4 + 4) + numCriteria * (0));
- data.WriteBit(guid[7]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[1]);
- data.WriteBits(numAchievements, 23);
- data.WriteBit(guid[0]);
- data.WriteBit(guid[3]);
- data.WriteBits(numCriteria, 21);
- data.WriteBit(guid[2]);
- for (CriteriaProgressMap::const_iterator itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr)
- {
- counter.SetRawValue(itr->second.counter);
-
- data.WriteBit(counter[5]);
- data.WriteBit(counter[3]);
- data.WriteBit(guid[1]);
- data.WriteBit(guid[4]);
- data.WriteBit(guid[2]);
- data.WriteBit(counter[6]);
- data.WriteBit(guid[0]);
- data.WriteBit(counter[4]);
- data.WriteBit(counter[1]);
- data.WriteBit(counter[2]);
- data.WriteBit(guid[3]);
- data.WriteBit(guid[7]);
- data.WriteBits(0, 2); // criteria progress flags
- data.WriteBit(counter[0]);
- data.WriteBit(guid[5]);
- data.WriteBit(guid[6]);
- data.WriteBit(counter[7]);
-
- criteriaData.WriteByteSeq(guid[3]);
- criteriaData.WriteByteSeq(counter[4]);
- criteriaData << uint32(0); // timer 1
- criteriaData.WriteByteSeq(guid[1]);
- criteriaData.AppendPackedTime(itr->second.date);
- criteriaData.WriteByteSeq(counter[3]);
- criteriaData.WriteByteSeq(counter[7]);
- criteriaData.WriteByteSeq(guid[5]);
- criteriaData.WriteByteSeq(counter[0]);
- criteriaData.WriteByteSeq(guid[4]);
- criteriaData.WriteByteSeq(guid[2]);
- criteriaData.WriteByteSeq(guid[6]);
- criteriaData.WriteByteSeq(guid[7]);
- criteriaData.WriteByteSeq(counter[6]);
- criteriaData << uint32(itr->first);
- criteriaData << uint32(0); // timer 2
- criteriaData.WriteByteSeq(counter[1]);
- criteriaData.WriteByteSeq(counter[5]);
- criteriaData.WriteByteSeq(guid[0]);
- criteriaData.WriteByteSeq(counter[2]);
- }
-
- data.WriteBit(guid[6]);
- data.WriteBit(guid[5]);
- data.FlushBits();
- data.append(criteriaData);
- data.WriteByteSeq(guid[1]);
- data.WriteByteSeq(guid[6]);
- data.WriteByteSeq(guid[3]);
- data.WriteByteSeq(guid[0]);
- data.WriteByteSeq(guid[2]);
+ WorldPackets::Achievement::RespondInspectAchievements inspectedAchievements;
+ inspectedAchievements.Player = GetOwner()->GetGUID();
+ inspectedAchievements.Data.Earned.reserve(m_completedAchievements.size());
+ inspectedAchievements.Data.Progress.reserve(m_criteriaProgress.size());
- for (CompletedAchievementMap::const_iterator itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
+ for (auto itr = m_completedAchievements.begin(); itr != m_completedAchievements.end(); ++itr)
{
- if (!filterInvisible(*itr))
+ AchievementEntry const* achievement = filterInvisible(*itr);
+ if (!achievement)
continue;
- data << uint32(itr->first);
- data.AppendPackedTime(itr->second.date);
+ WorldPackets::Achievement::EarnedAchievement earned;
+ earned.Id = itr->first;
+ earned.Date = itr->second.date;
+ if (!(achievement->Flags & ACHIEVEMENT_FLAG_ACCOUNT))
+ {
+ earned.Owner = GetOwner()->GetGUID();
+ earned.VirtualRealmAddress = earned.NativeRealmAddress = GetVirtualRealmAddress();
+ }
+ inspectedAchievements.Data.Earned.push_back(earned);
}
- data.WriteByteSeq(guid[7]);
- data.WriteByteSeq(guid[4]);
- data.WriteByteSeq(guid[5]);
+ for (auto itr = m_criteriaProgress.begin(); itr != m_criteriaProgress.end(); ++itr)
+ {
+ WorldPackets::Achievement::CriteriaProgress progress;
+ progress.Id = itr->first;
+ progress.Quantity = itr->second.counter;
+ progress.Player = itr->second.PlayerGUID;
+ progress.Flags = 0;
+ progress.Date = itr->second.date;
+ progress.TimeFromStart = 0;
+ progress.TimeFromCreate = 0;
+ inspectedAchievements.Data.Progress.push_back(progress);
+ }
- receiver->GetSession()->SendPacket(&data);
- */
+ receiver->GetSession()->SendPacket(inspectedAchievements.Write());
}
template<>
void AchievementMgr<Guild>::SendAchievementInfo(Player* receiver, uint32 achievementId /*= 0*/) const
{
- /*
- //will send response to criteria progress request
- AchievementCriteriaTreeList const* criteria = sAchievementMgr->GetAchievementCriteriaByAchievement(achievementId);
- if (!criteria)
- {
- // send empty packet
- WorldPacket data(SMSG_GUILD_CRITERIA_DATA, 3);
- data.WriteBits(0, 21);
- data.FlushBits();
- receiver->GetSession()->SendPacket(&data);
- return;
- }
-
- ObjectGuid counter;
- ObjectGuid guid;
- uint32 numCriteria = 0;
- ByteBuffer criteriaData(criteria->size() * (8 + 8 + 4 + 4 + 4));
- ByteBuffer criteriaBits(criteria->size() * (8 + 8) / 8);
- for (AchievementCriteriaTreeList::const_iterator itr = criteria->begin(); itr != criteria->end(); ++itr)
+ WorldPackets::Achievement::GuildCriteriaUpdate guildCriteriaUpdate;
+ if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementId))
{
- uint32 criteriaId = (*itr)->ID;
- CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(criteriaId);
- if (progress == m_criteriaProgress.end())
- continue;
-
- ++numCriteria;
+ if (AchievementCriteriaTree const* tree = sAchievementMgr->GetAchievementCriteriaTree(achievement->CriteriaTree))
+ {
+ sAchievementMgr->WalkCriteriaTree(tree, [this, &guildCriteriaUpdate](AchievementCriteriaTree const* node)
+ {
+ if (node->Criteria)
+ {
+ auto progress = this->m_criteriaProgress.find(node->Criteria->ID);
+ if (progress != this->m_criteriaProgress.end())
+ {
+ WorldPackets::Achievement::GuildCriteriaProgress guildCriteriaProgress;
+ guildCriteriaProgress.CriteriaID = node->Criteria->ID;
+ guildCriteriaProgress.DateCreated = 0;
+ guildCriteriaProgress.DateStarted = 0;
+ guildCriteriaProgress.DateUpdated = progress->second.date;
+ guildCriteriaProgress.Quantity = progress->second.counter;
+ guildCriteriaProgress.PlayerGUID = progress->second.PlayerGUID;
+ guildCriteriaProgress.Flags = 0;
+
+ guildCriteriaUpdate.Progress.push_back(guildCriteriaProgress);
+ }
+ }
+ });
+ }
}
- criteriaBits.WriteBits(numCriteria, 21);
-
- for (AchievementCriteriaTreeList::const_iterator itr = criteria->begin(); itr != criteria->end(); ++itr)
- {
- uint32 criteriaId = (*itr)->ID;
- CriteriaProgressMap::const_iterator progress = m_criteriaProgress.find(criteriaId);
- if (progress == m_criteriaProgress.end())
- continue;
-
- counter.SetRawValue(progress->second.counter);
- guid = progress->second.PlayerGUID;
-
- criteriaBits.WriteBit(counter[4]);
- criteriaBits.WriteBit(counter[1]);
- criteriaBits.WriteBit(guid[2]);
- criteriaBits.WriteBit(counter[3]);
- criteriaBits.WriteBit(guid[1]);
- criteriaBits.WriteBit(counter[5]);
- criteriaBits.WriteBit(counter[0]);
- criteriaBits.WriteBit(guid[3]);
- criteriaBits.WriteBit(counter[2]);
- criteriaBits.WriteBit(guid[7]);
- criteriaBits.WriteBit(guid[5]);
- criteriaBits.WriteBit(guid[0]);
- criteriaBits.WriteBit(counter[6]);
- criteriaBits.WriteBit(guid[6]);
- criteriaBits.WriteBit(counter[7]);
- criteriaBits.WriteBit(guid[4]);
-
- criteriaData.WriteByteSeq(guid[5]);
- criteriaData << uint32(progress->second.date); // unknown date
- criteriaData.WriteByteSeq(counter[3]);
- criteriaData.WriteByteSeq(counter[7]);
- criteriaData << uint32(progress->second.date); // unknown date
- criteriaData.WriteByteSeq(counter[6]);
- criteriaData.WriteByteSeq(guid[4]);
- criteriaData.WriteByteSeq(guid[1]);
- criteriaData.WriteByteSeq(counter[4]);
- criteriaData.WriteByteSeq(guid[3]);
- criteriaData.WriteByteSeq(counter[0]);
- criteriaData.WriteByteSeq(guid[2]);
- criteriaData.WriteByteSeq(counter[1]);
- criteriaData.WriteByteSeq(guid[6]);
- criteriaData << uint32(progress->second.date); // last update time (not packed!)
- criteriaData << uint32(criteriaId);
- criteriaData.WriteByteSeq(counter[5]);
- criteriaData << uint32(0);
- criteriaData.WriteByteSeq(guid[7]);
- criteriaData.WriteByteSeq(counter[2]);
- criteriaData.WriteByteSeq(guid[0]);
- }
-
- WorldPacket data(SMSG_GUILD_CRITERIA_DATA, criteriaBits.size() + criteriaData.size());
- data.append(criteriaBits);
- if (numCriteria)
- data.append(criteriaData);
-
- receiver->GetSession()->SendPacket(&data);
- */
+ receiver->GetSession()->SendPacket(guildCriteriaUpdate.Write());
}
template<class T>
diff --git a/src/server/game/Achievements/AchievementMgr.h b/src/server/game/Achievements/AchievementMgr.h
index 755e86eeec8..a33d16f45b7 100644
--- a/src/server/game/Achievements/AchievementMgr.h
+++ b/src/server/game/Achievements/AchievementMgr.h
@@ -319,7 +319,6 @@ class AchievementMgr
void CompletedCriteriaFor(AchievementEntry const* achievement, Player* referencePlayer);
bool IsCompletedCriteriaTree(AchievementCriteriaTree const* tree);
bool IsCompletedCriteria(AchievementCriteria const* achievementCriteria, uint64 requiredAmount);
- uint64 GetTotalCriteriaTreeProgress(AchievementCriteriaTree const* criteriaTree);
bool IsCompletedAchievement(AchievementEntry const* entry);
bool CanUpdateCriteria(AchievementCriteria const* criteria, AchievementCriteriaTreeList const* trees, uint64 miscValue1, uint64 miscValue2, uint64 miscValue3, Unit const* unit, Player* referencePlayer);
void SendPacket(WorldPacket const* data) const;
@@ -429,6 +428,15 @@ class AchievementGlobalMgr
return false;
}
+ template<typename Func>
+ void WalkCriteriaTree(AchievementCriteriaTree const* tree, Func const& func) const
+ {
+ for (AchievementCriteriaTree const* node : tree->Children)
+ WalkCriteriaTree(node, func);
+
+ func(tree);
+ }
+
// Removes instanceId as valid id to complete realm first kill achievements
void OnInstanceDestroyed(uint32 instanceId);
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 4715d0f5012..0bba2c84827 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -177,6 +177,8 @@ Battleground::Battleground()
m_PrematureCountDown = false;
m_PrematureCountDownTimer = 0;
+ m_Guid = 0;
+
m_HonorMode = BG_NORMAL;
StartDelayTimes[BG_STARTING_EVENT_FIRST] = BG_START_DELAY_2M;
diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp
index 2542706e507..366a8f5c8a9 100644
--- a/src/server/game/Conditions/ConditionMgr.cpp
+++ b/src/server/game/Conditions/ConditionMgr.cpp
@@ -1316,7 +1316,10 @@ bool ConditionMgr::addToSpellImplicitTargetConditions(Condition* cond)
}
if (!assigned)
+ {
delete sharedList;
+ break;
+ }
}
sharedList->push_back(cond);
break;
diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp
index 708bb0cccd1..ee3becd0c28 100644
--- a/src/server/game/DataStores/DB2Stores.cpp
+++ b/src/server/game/DataStores/DB2Stores.cpp
@@ -29,11 +29,13 @@ DB2Storage<HolidaysEntry> sHolidaysStore(HolidaysEntryfmt);
DB2Storage<ItemEntry> sItemStore(Itemfmt);
DB2Storage<ItemAppearanceEntry> sItemAppearanceStore(ItemAppearanceEntryfmt);
DB2Storage<ItemBonusEntry> sItemBonusStore(ItemBonusEntryfmt);
+DB2Storage<ItemBonusTreeNodeEntry> sItemBonusTreeNodeStore(ItemBonusTreeNodeEntryfmt);
DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore(ItemCurrencyCostfmt);
DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore(ItemExtendedCostEntryfmt);
DB2Storage<ItemEffectEntry> sItemEffectStore(ItemEffectEntryfmt);
DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore(ItemModifiedAppearanceEntryfmt);
DB2Storage<ItemSparseEntry> sItemSparseStore(ItemSparsefmt);
+DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore(ItemXBonusTreeEntryfmt);
DB2Storage<KeyChainEntry> sKeyChainStore(KeyChainfmt);
DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore(OverrideSpellDataEntryfmt);
DB2Storage<PhaseGroupEntry> sPhaseGroupStore(PhaseGroupEntryfmt);
@@ -74,24 +76,27 @@ inline void LoadDB2(uint32& availableDb2Locales, DB2StoreProblemList& errlist, D
std::string db2_filename = db2_path + filename;
if (storage.Load(db2_filename.c_str(), uint32(sWorld->GetDefaultDbcLocale())))
{
- storage.LoadSQLData();
+ storage.LoadFromDB();
for (uint32 i = 0; i < TOTAL_LOCALES; ++i)
{
- if (!(availableDb2Locales & (1 << i)))
- continue;
-
if (uint32(sWorld->GetDefaultDbcLocale()) == i)
continue;
- std::string localizedName(db2_path);
- localizedName.append(localeNames[i]);
- localizedName.push_back('/');
- localizedName.append(filename);
+ if (availableDb2Locales & (1 << i))
+ {
+ std::string localizedName(db2_path);
+ localizedName.append(localeNames[i]);
+ localizedName.push_back('/');
+ localizedName.append(filename);
+
+ if (!storage.LoadStringsFrom(localizedName.c_str(), i))
+ availableDb2Locales &= ~(1 << i); // mark as not available for speedup next checks
+ }
- if (!storage.LoadStringsFrom(localizedName.c_str(), i))
- availableDb2Locales &= ~(1<<i); // mark as not available for speedup next checks
+ storage.LoadStringsFromDB(i);
}
+
}
else
{
@@ -124,11 +129,13 @@ void DB2Manager::LoadStores(std::string const& dataPath)
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemStore, db2Path, "Item.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemAppearanceStore, db2Path, "ItemAppearance.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemBonusStore, db2Path, "ItemBonus.db2");
+ LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemBonusTreeNodeStore, db2Path, "ItemBonusTreeNode.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemCurrencyCostStore, db2Path, "ItemCurrencyCost.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemExtendedCostStore, db2Path, "ItemExtendedCost.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemEffectStore, db2Path, "ItemEffect.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemModifiedAppearanceStore, db2Path, "ItemModifiedAppearance.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemSparseStore, db2Path, "Item-sparse.db2");
+ LoadDB2(availableDb2Locales, bad_db2_files, _stores, sItemXBonusTreeStore, db2Path, "ItemXBonusTree.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sKeyChainStore, db2Path, "KeyChain.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sOverrideSpellDataStore, db2Path, "OverrideSpellData.db2");
LoadDB2(availableDb2Locales, bad_db2_files, _stores, sPhaseGroupStore, db2Path, "PhaseXPhaseGroup.db2");
@@ -148,11 +155,28 @@ void DB2Manager::LoadStores(std::string const& dataPath)
if (ItemBonusEntry const* bonus = sItemBonusStore.LookupEntry(i))
_itemBonusLists[bonus->BonusListID].push_back(bonus);
+ for (uint32 i = 0; i < sItemBonusTreeNodeStore.GetNumRows(); ++i)
+ {
+ if (ItemBonusTreeNodeEntry const* bonusTreeNode = sItemBonusTreeNodeStore.LookupEntry(i))
+ {
+ uint32 bonusTreeId = bonusTreeNode->BonusTreeID;
+ while (bonusTreeNode)
+ {
+ _itemBonusTrees[bonusTreeId].insert(bonusTreeNode);
+ bonusTreeNode = sItemBonusTreeNodeStore.LookupEntry(bonusTreeNode->SubTreeID);
+ }
+ }
+ }
+
for (uint32 i = 0; i < sItemModifiedAppearanceStore.GetNumRows(); ++i)
if (ItemModifiedAppearanceEntry const* appearanceMod = sItemModifiedAppearanceStore.LookupEntry(i))
if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID))
_itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID;
+ for (uint32 i = 0; i < sItemXBonusTreeStore.GetNumRows(); ++i)
+ if (ItemXBonusTreeEntry const* itemBonusTreeAssignment = sItemXBonusTreeStore.LookupEntry(i))
+ _itemToBonusTree.insert({ itemBonusTreeAssignment->ItemID, itemBonusTreeAssignment->BonusTreeID });
+
{
std::set<uint32> scalingCurves;
for (uint32 i = 0; i < sScalingStatDistributionStore.GetNumRows(); ++i)
@@ -392,6 +416,27 @@ uint32 DB2Manager::GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const
return 0;
}
+std::set<uint32> DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const
+{
+ std::set<uint32> bonusListIDs;
+ auto itemIdRange = _itemToBonusTree.equal_range(itemId);
+ if (itemIdRange.first == itemIdRange.second)
+ return bonusListIDs;
+
+ for (auto itemTreeItr = itemIdRange.first; itemTreeItr != itemIdRange.second; ++itemTreeItr)
+ {
+ auto treeItr = _itemBonusTrees.find(itemTreeItr->second);
+ if (treeItr == _itemBonusTrees.end())
+ continue;
+
+ for (ItemBonusTreeNodeEntry const* bonusTreeNode : treeItr->second)
+ if (bonusTreeNode->BonusTreeModID == itemBonusTreeMod)
+ bonusListIDs.insert(bonusTreeNode->BonusListID);
+ }
+
+ return bonusListIDs;
+}
+
DB2Manager::ItemBonusList DB2Manager::GetItemBonusList(uint32 bonusListId) const
{
auto itr = _itemBonusLists.find(bonusListId);
diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h
index d901082b69f..0f89ab919e0 100644
--- a/src/server/game/DataStores/DB2Stores.h
+++ b/src/server/game/DataStores/DB2Stores.h
@@ -69,6 +69,8 @@ public:
typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, uint32> ItemDisplayIdContainer;
typedef std::vector<ItemBonusEntry const*> ItemBonusList;
typedef std::unordered_map<uint32 /*bonusListId*/, ItemBonusList> ItemBonusListContainer;
+ typedef std::unordered_multimap<uint32 /*itemId*/, uint32 /*bonusTreeId*/> ItemToBonusTreeContainer;
+ typedef std::unordered_map<uint32, std::set<ItemBonusTreeNodeEntry const*>> ItemBonusTreeContainer;
typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer;
static DB2Manager& Instance()
@@ -87,6 +89,7 @@ public:
static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false);
uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const;
uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const;
+ std::set<uint32> GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const;
ItemBonusList GetItemBonusList(uint32 bonusListId) const;
std::set<uint32> GetPhasesForGroup(uint32 group) const;
@@ -97,6 +100,8 @@ private:
HeirloomCurvesContainer _heirloomCurvePoints;
ItemDisplayIdContainer _itemDisplayIDs;
ItemBonusListContainer _itemBonusLists;
+ ItemToBonusTreeContainer _itemToBonusTree;
+ ItemBonusTreeContainer _itemBonusTrees;
PhaseGroupContainer _phasesByGroup;
};
diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h
index cdc83b70b2b..2fa04ac20b1 100644
--- a/src/server/game/DataStores/DB2Structure.h
+++ b/src/server/game/DataStores/DB2Structure.h
@@ -99,6 +99,15 @@ struct ItemBonusEntry
uint32 Index; // 5
};
+struct ItemBonusTreeNodeEntry
+{
+ uint32 ID; // 0
+ uint32 BonusTreeID; // 1
+ uint32 BonusTreeModID; // 2
+ uint32 SubTreeID; // 3
+ uint32 BonusListID; // 4
+};
+
struct ItemCurrencyCostEntry
{
//uint32 ID; // 0
@@ -215,6 +224,13 @@ struct ItemSparseEntry
uint32 ItemNameDescriptionID; // 101
};
+struct ItemXBonusTreeEntry
+{
+ uint32 ID; // 0
+ uint32 ItemID; // 1
+ uint32 BonusTreeID; // 2
+};
+
#define KEYCHAIN_SIZE 32
struct KeyChainEntry
diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h
index d789f4a6622..9c8563eb720 100644
--- a/src/server/game/DataStores/DB2fmt.h
+++ b/src/server/game/DataStores/DB2fmt.h
@@ -24,11 +24,13 @@ char const HolidaysEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiixxsiix";
char const Itemfmt[] = "niiiiiiii";
char const ItemAppearanceEntryfmt[] = "nii";
char const ItemBonusEntryfmt[] = "niiiii";
+char const ItemBonusTreeNodeEntryfmt[] = "niiii";
char const ItemCurrencyCostfmt[] = "xn";
char const ItemExtendedCostEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
char const ItemEffectEntryfmt[] = "niiiiiiii";
char const ItemModifiedAppearanceEntryfmt[] = "niiiii";
char const ItemSparsefmt[] = "niiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffffffiiifisssssiiiiiiiiiiiiiiiiiiifiiifiii";
+char const ItemXBonusTreeEntryfmt[] = "nii";
char const KeyChainfmt[] = "nbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
char const OverrideSpellDataEntryfmt[] = "niiiiiiiiiixx";
char const PhaseGroupEntryfmt[] = "nii";
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index cf8701dc0d7..72994461add 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -37,7 +37,7 @@ enum LevelLimit
// Client expected level limitation, like as used in DBC item max levels for "until max player level"
// use as default max player level, must be fit max level for used client
// also see MAX_LEVEL and STRONG_MAX_LEVEL define
- DEFAULT_MAX_LEVEL = 85,
+ DEFAULT_MAX_LEVEL = 100,
// client supported max level for player/pets/etc. Avoid overflow or client stability affected.
// also see GT_MAX_LEVEL define
@@ -85,7 +85,7 @@ enum AchievementFlags
ACHIEVEMENT_FLAG_REALM_FIRST_REACH = 0x00000100, //
ACHIEVEMENT_FLAG_REALM_FIRST_KILL = 0x00000200, //
ACHIEVEMENT_FLAG_UNK3 = 0x00000400, // ACHIEVEMENT_FLAG_HIDE_NAME_IN_TIE
- ACHIEVEMENT_FLAG_REALM_FIRST_GUILD = 0x00000800, // first guild on realm done something
+ ACHIEVEMENT_FLAG_UNK4 = 0x00000800, // first guild on realm done something
ACHIEVEMENT_FLAG_SHOW_IN_GUILD_NEWS = 0x00001000, // Shows in guild news
ACHIEVEMENT_FLAG_SHOW_IN_GUILD_HEADER = 0x00002000, // Shows in guild news header
ACHIEVEMENT_FLAG_GUILD = 0x00004000, //
diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp
index 20788fde81d..7532a6f8c75 100644
--- a/src/server/game/DataStores/DBCStores.cpp
+++ b/src/server/game/DataStores/DBCStores.cpp
@@ -124,6 +124,7 @@ GameTable <GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store(GtNpcTotalHpExp3
GameTable <GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store(GtNpcTotalHpExp4fmt);
GameTable <GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store(GtNpcTotalHpExp5fmt);
GameTable <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore(GtOCTClassCombatRatingScalarfmt);
+GameTable <GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore(GtOCTLevelExperiencefmt);
GameTable <GtOCTRegenHPEntry> sGtOCTRegenHPStore(GtOCTRegenHPfmt);
GameTable <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore(GtOCTHpPerStaminafmt);
GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore(GtRegenMPPerSptfmt);
@@ -205,8 +206,6 @@ DBCStorage <SpellEffectScalingEntry> sSpellEffectScalingStore(SpellEffectScaling
SpellCategoryStore sSpellsByCategoryStore;
PetFamilySpellsStore sPetFamilySpellsStore;
-SpellsPerClassStore sSpellsPerClassStore;
-ClassBySkillIdStore sClassBySkillIdStore;
SpellEffectScallingByEffectId sSpellEffectScallingByEffectId;
@@ -500,11 +499,10 @@ void LoadDBCStores(const std::string& dataPath)
LoadDBC(availableDbcLocales, bad_dbc_files, sMapStore, dbcPath, "Map.dbc");//19116
LoadDBC(availableDbcLocales, bad_dbc_files, sMapDifficultyStore, dbcPath, "MapDifficulty.dbc");//19116
// fill data
- sMapDifficultyMap[0][0] = MapDifficulty(DIFFICULTY_NONE, 0, 0, false);//map 0 is missingg from MapDifficulty.dbc use this till its ported to sql
for (uint32 i = 0; i < sMapDifficultyStore.GetNumRows(); ++i)
if (MapDifficultyEntry const* entry = sMapDifficultyStore.LookupEntry(i))
- sMapDifficultyMap[entry->MapID][entry->DifficultyID] = MapDifficulty(entry->DifficultyID, entry->RaidDuration, entry->MaxPlayers, entry->Message_lang[0] > 0);
- sMapDifficultyStore.Clear();
+ sMapDifficultyMap[entry->MapID][entry->DifficultyID] = entry;
+ sMapDifficultyMap[0][0] = sMapDifficultyMap[1][0]; //map 0 is missing from MapDifficulty.dbc use this till its ported to sql
LoadDBC(availableDbcLocales, bad_dbc_files, sModifierTreeStore, dbcPath, "ModifierTree.dbc");//19342
LoadDBC(availableDbcLocales, bad_dbc_files, sMountCapabilityStore, dbcPath, "MountCapability.dbc");//19116
@@ -600,92 +598,9 @@ void LoadDBCStores(const std::string& dataPath)
sSpellEffectScallingByEffectId.insert(std::make_pair(spellEffectScaling->SpellEffectID, j));
}
- std::map<std::string, uint32> classIdByName;
- for (uint32 j = 0; j < sChrClassesStore.GetNumRows(); j++)
- {
- ChrClassesEntry const* classEntry = sChrClassesStore.LookupEntry(j);
- if (!classEntry)
- continue;
-
- classIdByName.insert(std::make_pair(std::string(classEntry->Name_lang), j));
- }
-
- for (uint32 j = 0; j < sSkillLineStore.GetNumRows(); j++)
- {
- SkillLineEntry const* skillEntry = sSkillLineStore.LookupEntry(j);
- if (!skillEntry)
- continue;
-
- if (skillEntry->CategoryID!= SKILL_CATEGORY_CLASS)
- continue;
-
- std::map<std::string, uint32> ::const_iterator iter = classIdByName.find(std::string(skillEntry->DisplayName_lang));
- if (iter == classIdByName.end())
- continue;
-
- sClassBySkillIdStore.insert(std::make_pair(j, iter->second));
- }
-
- for (uint32 j = 0; j < sSkillLineAbilityStore.GetNumRows(); ++j)
- {
- SkillLineAbilityEntry const* skillAbility = sSkillLineAbilityStore.LookupEntry(j);
- if (!skillAbility)
- continue;
-
- if (skillAbility->AquireMethod != SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN)
- continue;
-
- SpellEntry const* spellInfo = sSpellStore.LookupEntry(skillAbility->SpellID);
- if (!spellInfo)
- continue;
-
- SpellLevelsEntry const* spellLevels = sSpellLevelsStore.LookupEntry(spellInfo->LevelsID);
- if (!spellLevels || !spellLevels->SpellLevel)
- continue;
-
- uint32 classId = GetClassBySkillId(skillAbility->SkillLine);
-
- if (!classId)
- continue;
-
- if (sSpellsPerClassStore.find(classId) == sSpellsPerClassStore.end())
- sSpellsPerClassStore.insert(make_pair(classId, std::list<SkillLineAbilityEntry const*>()));
-
- sSpellsPerClassStore[classId].push_back(skillAbility);
- }
LoadDBC(availableDbcLocales, bad_dbc_files, sTalentStore, dbcPath, "Talent.dbc");//15595
- // Create Spelldifficulty searcher
- /* TODO: 6.x update to new spell diffs
- for (uint32 i = 0; i < sSpellDifficultyStore.GetNumRows(); ++i)
- {
- SpellDifficultyEntry const* spellDiff = sSpellDifficultyStore.LookupEntry(i);
- if (!spellDiff)
- continue;
-
- SpellDifficultyEntry newEntry;
- memset(newEntry.SpellID, 0, 4*sizeof(uint32));
- for (uint32 x = 0; x < MAX_DIFFICULTY; ++x)
- {
- if (spellDiff->SpellID[x] <= 0 || !sSpellStore.LookupEntry(spellDiff->SpellID[x]))
- {
- if (spellDiff->SpellID[x] > 0)//don't show error if spell is <= 0, not all modes have spells and there are unknown negative values
- TC_LOG_ERROR("sql.sql", "spelldifficulty_dbc: spell %i at field id:%u at spellid%i does not exist in SpellStore (spell.dbc), loaded as 0", spellDiff->SpellID[x], spellDiff->ID, x);
- newEntry.SpellID[x] = 0;//spell was <= 0 or invalid, set to 0
- }
- else
- newEntry.SpellID[x] = spellDiff->SpellID[x];
- }
-
- if (newEntry.SpellID[0] <= 0 || newEntry.SpellID[1] <= 0)//id0-1 must be always set!
- continue;
-
- for (uint32 x = 0; x < MAX_DIFFICULTY; ++x)
- if (newEntry.SpellID[x])
- sSpellMgr->SetSpellDifficultyId(uint32(newEntry.SpellID[x]), spellDiff->ID);
- }*/
-
for (unsigned int i = 0; i < sTalentStore.GetNumRows(); ++i)
{
TalentEntry const* talentInfo = sTalentStore.LookupEntry(i);
@@ -746,6 +661,7 @@ void LoadDBCStores(const std::string& dataPath)
LoadGameTable(bad_dbc_files, "NpcTotalHpExp5", sGtNpcTotalHpExp5Store, dbcPath, "gtNpcTotalHpExp5.dbc"); // 19445
LoadGameTable(bad_dbc_files, "OCTClassCombatRatingScalar", sGtOCTClassCombatRatingScalarStore, dbcPath, "gtOCTClassCombatRatingScalar.dbc");//19342
LoadGameTable(bad_dbc_files, "OCTHPPerStamina", sGtOCTHpPerStaminaStore, dbcPath, "gtOCTHpPerStamina.dbc");//19342
+ LoadGameTable(bad_dbc_files, "OCTLevelExperience", sGtOCTLevelExperienceStore, dbcPath, "gtOCTLevelExperience.dbc"); // 19342
LoadGameTable(bad_dbc_files, "RegenMPPerSpt", sGtRegenMPPerSptStore, dbcPath, "gtRegenMPPerSpt.dbc");//19342
LoadGameTable(bad_dbc_files, "SpellScaling", sGtSpellScalingStore, dbcPath, "gtSpellScaling.dbc");//19342
LoadGameTable(bad_dbc_files, "OCTBaseHPByClass", sGtOCTBaseHPByClassStore, dbcPath, "gtOCTBaseHPByClass.dbc");//19342
@@ -897,32 +813,20 @@ uint32 GetMaxLevelForExpansion(uint32 expansion)
return 0;
}
-/*
-Used only for calculate xp gain by content lvl.
-Calculation on Gilneas and group maps of LostIslands calculated as CONTENT_1_60.
-*/
-ContentLevels GetContentLevelsForMapAndZone(uint32 mapid, uint32 zoneId)
+uint32 GetExpansionForLevel(uint32 level)
{
- mapid = GetVirtualMapForMapAndZone(mapid, zoneId);
- if (mapid < 2)
- return CONTENT_1_60;
-
- MapEntry const* mapEntry = sMapStore.LookupEntry(mapid);
- if (!mapEntry)
- return CONTENT_1_60;
-
- // no need enum all maps from phasing
- if (mapEntry->ParentMapID >= 0)
- mapid = mapEntry->ParentMapID;
-
- switch (mapid)
- {
- case 648: //LostIslands
- case 654: //Gilneas
- return CONTENT_1_60;
- default:
- return ContentLevels(mapEntry->Expansion());
- }
+ if (level < 60)
+ return EXPANSION_CLASSIC;
+ else if (level < 70)
+ return EXPANSION_THE_BURNING_CRUSADE;
+ else if (level < 80)
+ return EXPANSION_WRATH_OF_THE_LICH_KING;
+ else if (level < 85)
+ return EXPANSION_CATACLYSM;
+ else if (level < 90)
+ return EXPANSION_MISTS_OF_PANDARIA;
+ else
+ return CURRENT_EXPANSION;
}
bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredTotemCategoryId)
@@ -971,7 +875,7 @@ void Map2ZoneCoordinates(float& x, float& y, uint32 zone)
std::swap(x, y); // client have map coords swapped
}
-MapDifficulty const* GetDefaultMapDifficulty(uint32 mapID)
+MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapID)
{
auto itr = sMapDifficultyMap.find(mapID);
if (itr == sMapDifficultyMap.end())
@@ -987,13 +891,13 @@ MapDifficulty const* GetDefaultMapDifficulty(uint32 mapID)
continue;
if (difficulty->Flags & DIFFICULTY_FLAG_DEFAULT)
- return &p.second;
+ return p.second;
}
- return &itr->second.begin()->second;
+ return itr->second.begin()->second;
}
-MapDifficulty const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
+MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
{
auto itr = sMapDifficultyMap.find(mapId);
if (itr == sMapDifficultyMap.end())
@@ -1003,17 +907,17 @@ MapDifficulty const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty)
if (diffItr == itr->second.end())
return nullptr;
- return &diffItr->second;
+ return diffItr->second;
}
-MapDifficulty const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
+MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty)
{
DifficultyEntry const* diffEntry = sDifficultyStore.LookupEntry(difficulty);
if (!diffEntry)
return GetDefaultMapDifficulty(mapId);
uint32 tmpDiff = difficulty;
- MapDifficulty const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff));
+ MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff));
while (!mapDiff)
{
tmpDiff = diffEntry->FallbackDifficultyID;
@@ -1140,77 +1044,6 @@ SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, u
return NULL;
}
-uint32 GetClassBySkillId(uint32 skillId)
-{
- ClassBySkillIdStore::const_iterator iter = sClassBySkillIdStore.find(skillId);
- if (iter != sClassBySkillIdStore.end())
- return iter->second;
- return 0;
-}
-
-uint32 GetSkillIdByClass(uint32 classId)
-{
- for (ClassBySkillIdStore::const_iterator iter = sClassBySkillIdStore.begin(); iter != sClassBySkillIdStore.end(); iter++)
- if (iter->second == classId)
- return iter->first;
- return 0;
-}
-
-std::list<uint32> GetSpellsForLevels(uint32 classId, uint32 raceMask, uint32 specializationId, uint32 minLevel, uint32 maxLevel)
-{
- std::list<uint32> spellList;
-
- if (classId != 0)
- {
- SpellsPerClassStore::const_iterator classIter = sSpellsPerClassStore.find(classId);
- if (classIter != sSpellsPerClassStore.end())
- {
- const std::list<SkillLineAbilityEntry const*>& learnSpellList = classIter->second;
- for (std::list<SkillLineAbilityEntry const*>::const_iterator iter = learnSpellList.begin(); iter != learnSpellList.end(); iter++)
- {
- SkillLineAbilityEntry const* skillLine = *iter;
- if (!skillLine)
- continue;
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(skillLine->SpellID);
- if (!spellInfo)
- continue;
-
- if (skillLine->RaceMask && !(skillLine->RaceMask & raceMask))
- continue;
-
- if (spellInfo->SpellLevel <= minLevel || spellInfo->SpellLevel > maxLevel)
- continue;
-
- spellList.push_back(spellInfo->Id);
- }
- }
- }
-
- if (!specializationId)
- return spellList;
-
- SpecializationSpellsBySpecStore::const_iterator specIter = sSpecializationSpellsBySpecStore.find(specializationId);
- if (specIter != sSpecializationSpellsBySpecStore.end())
- {
- SpecializationSpellsBySpecEntry learnSpellList = specIter->second;
- for (size_t i = 0; i < learnSpellList.size(); ++i)
- {
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(learnSpellList[i]->SpellID);
- if (!spellInfo)
- {
- TC_LOG_ERROR("spells", "GetSpellsForLevels: spell %u not found in spellstore", learnSpellList[i]->SpellID);
- continue;
- }
- if (spellInfo->SpellLevel <= minLevel || spellInfo->SpellLevel > maxLevel)
- continue;
-
- spellList.push_back(spellInfo->Id);
- }
- }
- return spellList;
-}
-
uint32 GetTalentSpellCost(uint32 spellId)
{
TalentBySpellIDMap::const_iterator itr = sTalentBySpellIDMap.find(spellId);
diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h
index 7c20baf5e55..8a411300a79 100644
--- a/src/server/game/DataStores/DBCStores.h
+++ b/src/server/game/DataStores/DBCStores.h
@@ -59,6 +59,7 @@ enum ContentLevels
};
uint32 GetMaxLevelForExpansion(uint32 expansion);
+uint32 GetExpansionForLevel(uint32 level);
ContentLevels GetContentLevelsForMapAndZone(uint32 mapid, uint32 zoneId);
@@ -66,14 +67,11 @@ bool IsTotemCategoryCompatiableWith(uint32 itemTotemCategoryId, uint32 requiredT
void Zone2MapCoordinates(float &x, float &y, uint32 zone);
void Map2ZoneCoordinates(float &x, float &y, uint32 zone);
-uint32 GetClassBySkillId(uint32 skillId);
-uint32 GetSkillIdByClass(uint32 classId);
-std::list<uint32> GetSpellsForLevels(uint32 classId, uint32 raceMask, uint32 specializationId, uint32 minLevel, uint32 maxLevel);
-typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficulty>> MapDifficultyMap;
-MapDifficulty const* GetDefaultMapDifficulty(uint32 mapID);
-MapDifficulty const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty);
-MapDifficulty const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty);
+typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyMap;
+MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapID);
+MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty);
+MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty);
uint32 GetLiquidFlags(uint32 liquidType);
@@ -187,6 +185,7 @@ extern GameTable <GtNpcTotalHpExp3Entry> sGtNpcTotalHpExp3Store;
extern GameTable <GtNpcTotalHpExp4Entry> sGtNpcTotalHpExp4Store;
extern GameTable <GtNpcTotalHpExp5Entry> sGtNpcTotalHpExp5Store;
extern GameTable <GtOCTClassCombatRatingScalarEntry> sGtOCTClassCombatRatingScalarStore;
+extern GameTable <GtOCTLevelExperienceEntry> sGtOCTLevelExperienceStore;
extern GameTable <gtOCTHpPerStaminaEntry> sGtOCTHpPerStaminaStore;
extern GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore;
extern GameTable <GtSpellScalingEntry> sGtSpellScalingStore;
diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h
index 8451c955fc2..69739a32854 100644
--- a/src/server/game/DataStores/DBCStructure.h
+++ b/src/server/game/DataStores/DBCStructure.h
@@ -634,7 +634,7 @@ struct DifficultyEntry
//uint32 GroupSizeDmgCurveID; // 9
//uint32 GroupSizeSpellPointsCurveID; // 10
//char const* NameLang; // 11
- //uint32 Unk; // 12
+ uint32 ItemBonusTreeModID; // 12
};
struct DungeonEncounterEntry
@@ -890,6 +890,11 @@ struct GtOCTClassCombatRatingScalarEntry
float ratio;
};
+struct GtOCTLevelExperienceEntry
+{
+ float Data;
+};
+
struct GtOCTRegenHPEntry
{
float ratio;
@@ -1261,7 +1266,9 @@ struct MapDifficultyEntry
uint32 RaidDuration; // 4 m_raidDuration in secs, 0 if no fixed reset time
uint32 MaxPlayers; // 5 m_maxPlayers some heroic versions have 0 when expected same amount as in normal version
uint32 LockID; // 6
- //uint32 Unk2; // 7
+ uint32 ItemBonusTreeModID; // 7
+
+ bool HasMessage() const { return Message_lang[0] != '\0'; }
};
struct MinorTalentEntry
@@ -1577,8 +1584,6 @@ typedef std::set<uint32> SpellCategorySet;
typedef std::map<uint32, SpellCategorySet > SpellCategoryStore;
typedef std::set<uint32> PetFamilySpellsSet;
typedef std::map<uint32, PetFamilySpellsSet > PetFamilySpellsStore;
-typedef std::unordered_map<uint32, std::list<SkillLineAbilityEntry const*> > SpellsPerClassStore;
-typedef std::unordered_map<uint32, uint32> ClassBySkillIdStore;
typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId;
struct SpellCastTimesEntry
@@ -2071,18 +2076,5 @@ struct VectorArray
typedef std::map<uint32, VectorArray> NameGenContainer;
-// Structures not used for casting to loaded DBC data and not required then packing
-struct MapDifficulty
-{
- MapDifficulty() : DifficultyID(0), resetTime(0), maxPlayers(0), hasErrorMessage(false) { }
- MapDifficulty(uint32 difficultyID, uint32 _resetTime, uint32 _maxPlayers, bool _hasErrorMessage)
- : DifficultyID(difficultyID), resetTime(_resetTime), maxPlayers(_maxPlayers), hasErrorMessage(_hasErrorMessage) { }
-
- uint32 DifficultyID;
- uint32 resetTime;
- uint32 maxPlayers;
- bool hasErrorMessage;
-};
-
typedef std::map<uint32, uint32> TalentSpellPosMap;
#endif
diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h
index 3999ec61675..1d404d66311 100644
--- a/src/server/game/DataStores/DBCfmt.h
+++ b/src/server/game/DataStores/DBCfmt.h
@@ -52,7 +52,7 @@ char const Criteriafmt[] = "niiiiiiiixii";
char const CriteriaTreefmt[] = "niliixxx";
char const CurrencyTypesfmt[] = "nixxxxxiiixx";
char const DestructibleModelDatafmt[] = "nixxxixxxxixxxxixxxxxxxx";
-char const DifficultyFmt[] = "niiiixiixxxxx";
+char const DifficultyFmt[] = "niiiixiixxxxi";
char const DungeonEncounterfmt[] = "niiixsxxx";
char const DurabilityCostsfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii";
char const DurabilityQualityfmt[] = "nf";
@@ -68,6 +68,7 @@ char const GlyphSlotfmt[] = "nix";
char const GtBarberShopCostBasefmt[] = "xf";
char const GtCombatRatingsfmt[] = "xf";
char const GtOCTHpPerStaminafmt[] = "df";
+char const GtOCTLevelExperiencefmt[] = "xf";
char const GtChanceToMeleeCritBasefmt[] = "xf";
char const GtChanceToMeleeCritfmt[] = "xf";
char const GtChanceToSpellCritBasefmt[] = "xf";
@@ -113,7 +114,7 @@ char const LockEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx";
char const PhaseEntryfmt[] = "ni";
char const MailTemplateEntryfmt[] = "nxs";
char const MapEntryfmt[] = "nxiixxsixxixiffxiiiixx";
-char const MapDifficultyEntryfmt[] = "diisiiix";
+char const MapDifficultyEntryfmt[] = "diisiiii";
char const MinorTalentEntryfmt[] = "niii";
char const MovieEntryfmt[] = "nxxxx";
char const ModifierTreefmt[] = "niiiiii";
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 070263cd85e..1945c0608ea 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1027,10 +1027,10 @@ void Creature::SaveToDB(uint32 mapid, uint32 spawnMask, uint32 phaseMask)
stmt->setUInt64(index++, m_DBTableGuid);
stmt->setUInt32(index++, GetEntry());
stmt->setUInt16(index++, uint16(mapid));
- stmt->setUInt8(index++, spawnMask);
+ stmt->setUInt32(index++, spawnMask);
stmt->setUInt32(index++, GetPhaseMask());
stmt->setUInt32(index++, displayId);
- stmt->setInt32(index++, int32(GetCurrentEquipmentId()));
+ stmt->setUInt8(index++, GetCurrentEquipmentId());
stmt->setFloat(index++, GetPositionX());
stmt->setFloat(index++, GetPositionY());
stmt->setFloat(index++, GetPositionZ());
@@ -1290,6 +1290,8 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType guid, Map* map, bool addTo
m_creatureData = data;
+ loot.SetGUID(ObjectGuid::Create<HighGuid::LootObject>(data->mapid, data->id, sObjectMgr->GetGenerator<HighGuid::LootObject>()->Generate()));
+
if (addToMap && !GetMap()->AddToMap(this))
return false;
return true;
@@ -1431,9 +1433,29 @@ bool Creature::CanStartAttack(Unit const* who, bool force) const
if (!CanCreatureAttack(who, force))
return false;
+ // No aggro from gray creatures
+ if (CheckNoGrayAggroConfig(who->getLevelForTarget(this), getLevelForTarget(who)))
+ return false;
+
return IsWithinLOSInMap(who);
}
+
+bool Creature::CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) const
+{
+ if (Trinity::XP::GetColorCode(playerLevel, creatureLevel) != XP_GRAY)
+ return false;
+
+ uint32 notAbove = sWorld->getIntConfig(CONFIG_NO_GRAY_AGGRO_ABOVE);
+ uint32 notBelow = sWorld->getIntConfig(CONFIG_NO_GRAY_AGGRO_BELOW);
+ if (notAbove == 0 && notBelow == 0)
+ return false;
+
+ if (playerLevel <= notBelow || (playerLevel >= notAbove && notAbove > 0))
+ return true;
+ return false;
+}
+
float Creature::GetAttackDistance(Unit const* player) const
{
float aggroRate = sWorld->getRate(RATE_CREATURE_AGGRO);
@@ -1640,7 +1662,7 @@ bool Creature::IsImmunedToSpell(SpellInfo const* spellInfo) const
bool Creature::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const
{
- SpellEffectInfo const* effect = spellInfo->GetEffect(GetMap()->GetDifficultyID());
+ SpellEffectInfo const* effect = spellInfo->GetEffect(this, index);
if (!effect)
return true;
if (GetCreatureTemplate()->MechanicImmuneMask & (1 << (effect->Mechanic - 1)))
diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h
index 842624e0c01..a3230dd98ba 100644
--- a/src/server/game/Entities/Creature/Creature.h
+++ b/src/server/game/Entities/Creature/Creature.h
@@ -766,6 +766,7 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject
private:
void ForcedDespawn(uint32 timeMSToDespawn = 0);
+ bool CheckNoGrayAggroConfig(uint32 playerLevel, uint32 creatureLevel) const; // No aggro from gray creatures
//WaypointMovementGenerator vars
uint32 m_waypointID;
diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp
index 5aa196e9fbc..87a12edfc58 100644
--- a/src/server/game/Entities/Item/Item.cpp
+++ b/src/server/game/Entities/Item/Item.cpp
@@ -264,6 +264,7 @@ Item::Item()
m_paidExtendedCost = 0;
memset(_modifiers, 0, sizeof(_modifiers));
+ memset(&_bonusData, 0, sizeof(_bonusData));
}
bool Item::Create(ObjectGuid::LowType guidlow, uint32 itemid, Player const* owner)
@@ -503,10 +504,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi
for (char const* token : bonusListIDs)
{
uint32 bonusListID = atoul(token);
- DB2Manager::ItemBonusList bonuses = sDB2Manager.GetItemBonusList(bonusListID);
- AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID);
- for (ItemBonusEntry const* bonus : bonuses)
- _bonusData.AddBonus(bonus->Type, bonus->Value);
+ AddBonuses(bonusListID);
}
if (need_save) // normal item changed state set not work at loading
@@ -1797,6 +1795,14 @@ uint32 Item::GetVisibleAppearanceModId() const
return GetAppearanceModId();
}
+void Item::AddBonuses(uint32 bonusListID)
+{
+ DB2Manager::ItemBonusList bonuses = sDB2Manager.GetItemBonusList(bonusListID);
+ AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID);
+ for (ItemBonusEntry const* bonus : bonuses)
+ _bonusData.AddBonus(bonus->Type, bonus->Value);
+}
+
void BonusData::Initialize(ItemTemplate const* proto)
{
Quality = proto->GetQuality();
diff --git a/src/server/game/Entities/Item/Item.h b/src/server/game/Entities/Item/Item.h
index 2188e582e0a..f687dae23da 100644
--- a/src/server/game/Entities/Item/Item.h
+++ b/src/server/game/Entities/Item/Item.h
@@ -261,6 +261,9 @@ class Item : public Object
bool IsBoundByEnchant() const;
virtual void SaveToDB(SQLTransaction& trans);
virtual bool LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fields, uint32 entry);
+
+ void AddBonuses(uint32 bonusListID);
+
static void DeleteFromDB(SQLTransaction& trans, ObjectGuid::LowType itemGuid);
virtual void DeleteFromDB(SQLTransaction& trans);
static void DeleteFromInventoryDB(SQLTransaction& trans, ObjectGuid::LowType itemGuid);
diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp
index cf63f858b58..65884541f55 100644
--- a/src/server/game/Entities/Object/ObjectGuid.cpp
+++ b/src/server/game/Entities/Object/ObjectGuid.cpp
@@ -250,5 +250,6 @@ template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::Item>::Generate();
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::GameObject>::Generate();
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::DynamicObject>::Generate();
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::Corpse>::Generate();
+template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::LootObject>::Generate();
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::AreaTrigger>::Generate();
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::Transport>::Generate();
diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp
index a030953c0a0..2c416cf4da7 100644
--- a/src/server/game/Entities/Pet/Pet.cpp
+++ b/src/server/game/Entities/Pet/Pet.cpp
@@ -495,6 +495,10 @@ void Pet::DeleteFromDB(uint32 guidlow)
stmt->setUInt32(0, guidlow);
trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_AURA_EFFECTS);
+ stmt->setUInt32(0, guidlow);
+ trans->Append(stmt);
+
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_AURAS);
stmt->setUInt32(0, guidlow);
trans->Append(stmt);
@@ -1212,83 +1216,116 @@ void Pet::_LoadAuras(uint32 timediff)
{
TC_LOG_DEBUG("entities.pet", "Loading auras for %s", GetGUID().ToString().c_str());
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_AURA);
+ /*
+ 0 1 2 3 4 5
+ SELECT casterGuid, spell, effectMask, effectIndex, amount, baseAmount FROM pet_aura_effect WHERE guid = ?
+ */
+
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_AURA_EFFECT);
stmt->setUInt32(0, m_charmInfo->GetPetNumber());
- PreparedQueryResult result = CharacterDatabase.Query(stmt);
- if (result)
+ ObjectGuid casterGuid, itemGuid;
+ std::map<AuraKey, AuraLoadEffectInfo> effectInfo;
+ if (PreparedQueryResult effectResult = CharacterDatabase.Query(stmt))
{
- ObjectGuid caster_guid;
do
{
- int32 damage[3];
- int32 baseDamage[3];
- Field* fields = result->Fetch();
- caster_guid.SetRawValue(fields[0].GetBinary());
+ Field* fields = effectResult->Fetch();
+ uint32 effectIndex = fields[3].GetUInt8();
+ if (effectIndex < MAX_SPELL_EFFECTS)
+ {
+ casterGuid.SetRawValue(fields[0].GetBinary());
+ if (casterGuid.IsEmpty())
+ casterGuid = GetGUID();
+
+ AuraKey key{ casterGuid, itemGuid, fields[1].GetUInt32(), fields[2].GetUInt32() };
+ AuraLoadEffectInfo& info = effectInfo[key];
+ info.Amounts[effectIndex] = fields[4].GetInt32();
+ info.BaseAmounts[effectIndex] = fields[5].GetInt32();
+ }
+ } while (effectResult->NextRow());
+ }
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_PET_AURA);
+ stmt->setUInt32(0, m_charmInfo->GetPetNumber());
+
+ /*
+ 0 1 2 3 4 5 6 7
+ SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges FROM pet_aura WHERE guid = ?
+ */
+ if (PreparedQueryResult auraResult = CharacterDatabase.Query(stmt))
+ {
+ do
+ {
+ Field* fields = auraResult->Fetch();
// NULL guid stored - pet is the caster of the spell - see Pet::_SaveAuras
- if (!caster_guid)
- caster_guid = GetGUID();
- uint32 spellid = fields[1].GetUInt32();
- uint8 effmask = fields[2].GetUInt8();
- uint8 recalculatemask = fields[3].GetUInt8();
- uint8 stackcount = fields[4].GetUInt8();
- damage[0] = fields[5].GetInt32();
- damage[1] = fields[6].GetInt32();
- damage[2] = fields[7].GetInt32();
- baseDamage[0] = fields[8].GetInt32();
- baseDamage[1] = fields[9].GetInt32();
- baseDamage[2] = fields[10].GetInt32();
- int32 maxduration = fields[11].GetInt32();
- int32 remaintime = fields[12].GetInt32();
- uint8 remaincharges = fields[13].GetUInt8();
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
+ casterGuid.SetRawValue(fields[0].GetBinary());
+ if (casterGuid.IsEmpty())
+ casterGuid = GetGUID();
+
+ AuraKey key{ casterGuid, itemGuid, fields[1].GetUInt32(), fields[2].GetUInt32() };
+ uint32 recalculateMask = fields[3].GetUInt32();
+ uint8 stackCount = fields[4].GetUInt8();
+ int32 maxDuration = fields[5].GetInt32();
+ int32 remainTime = fields[6].GetInt32();
+ uint8 remainCharges = fields[7].GetUInt8();
+
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(key.SpellId);
if (!spellInfo)
{
- TC_LOG_ERROR("entities.pet", "Unknown aura (spellid %u), ignore.", spellid);
+ TC_LOG_ERROR("entities.pet", "Unknown aura (spellid %u), ignore.", key.SpellId);
continue;
}
// negative effects should continue counting down after logout
- if (remaintime != -1 && !spellInfo->IsPositive())
+ if (remainTime != -1 && !spellInfo->IsPositive())
{
- if (remaintime/IN_MILLISECONDS <= int32(timediff))
+ if (remainTime/IN_MILLISECONDS <= int32(timediff))
continue;
- remaintime -= timediff*IN_MILLISECONDS;
+ remainTime -= timediff*IN_MILLISECONDS;
}
- // prevent wrong values of remaincharges
+ // prevent wrong values of remainCharges
if (spellInfo->ProcCharges)
{
- if (remaincharges <= 0 || remaincharges > spellInfo->ProcCharges)
- remaincharges = spellInfo->ProcCharges;
+ // we have no control over the order of applying auras and modifiers allow auras
+ // to have more charges than value in SpellInfo
+ if (remainCharges <= 0/* || remainCharges > spellproto->procCharges*/)
+ remainCharges = spellInfo->ProcCharges;
}
else
- remaincharges = 0;
+ remainCharges = 0;
- if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, NULL, &baseDamage[0], NULL, caster_guid))
+ AuraLoadEffectInfo& info = effectInfo[key];
+ if (Aura* aura = Aura::TryCreate(spellInfo, key.EffectMask, this, NULL, info.BaseAmounts.data(), NULL, casterGuid))
{
if (!aura->CanBeSaved())
{
aura->Remove();
continue;
}
- aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
+
+ aura->SetLoadedState(maxDuration, remainTime, remainCharges, stackCount, recalculateMask, info.Amounts.data());
aura->ApplyForTargets();
- TC_LOG_INFO("entities.pet", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask);
+ TC_LOG_INFO("entities.pet", "Added aura spellid %u, effectmask %u", spellInfo->Id, key.EffectMask);
}
}
- while (result->NextRow());
+ while (auraResult->NextRow());
}
}
void Pet::_SaveAuras(SQLTransaction& trans)
{
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_AURAS);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_AURA_EFFECTS);
stmt->setUInt32(0, m_charmInfo->GetPetNumber());
trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PET_AURAS);
+ stmt->setUInt32(0, m_charmInfo->GetPetNumber());
+ trans->Append(stmt);
+
+ uint8 index;
for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
{
// check if the aura has to be saved
@@ -1296,51 +1333,42 @@ void Pet::_SaveAuras(SQLTransaction& trans)
continue;
Aura* aura = itr->second;
-
- int32 damage[MAX_SPELL_EFFECTS];
- int32 baseDamage[MAX_SPELL_EFFECTS];
- uint8 effMask = 0;
- uint8 recalculateMask = 0;
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- {
- if (aura->GetEffect(i))
- {
- baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
- damage[i] = aura->GetEffect(i)->GetAmount();
- effMask |= (1<<i);
- if (aura->GetEffect(i)->CanBeRecalculated())
- recalculateMask |= (1<<i);
- }
- else
- {
- baseDamage[i] = 0;
- damage[i] = 0;
- }
- }
+ uint32 recalculateMask = 0;
+ AuraKey key = aura->GenerateKey(recalculateMask);
// don't save guid of caster in case we are caster of the spell - guid for pet is generated every pet load, so it won't match saved guid anyways
- ObjectGuid casterGUID = (itr->second->GetCasterGUID() == GetGUID()) ? ObjectGuid::Empty : itr->second->GetCasterGUID();
-
- uint8 index = 0;
+ if (key.Caster == GetGUID())
+ key.Caster.Clear();
+ index = 0;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PET_AURA);
stmt->setUInt32(index++, m_charmInfo->GetPetNumber());
- stmt->setBinary(index++, casterGUID.GetRawValue());
- stmt->setUInt32(index++, itr->second->GetId());
- stmt->setUInt8(index++, effMask);
- stmt->setUInt8(index++, recalculateMask);
- stmt->setUInt8(index++, itr->second->GetStackAmount());
- stmt->setInt32(index++, damage[0]);
- stmt->setInt32(index++, damage[1]);
- stmt->setInt32(index++, damage[2]);
- stmt->setInt32(index++, baseDamage[0]);
- stmt->setInt32(index++, baseDamage[1]);
- stmt->setInt32(index++, baseDamage[2]);
- stmt->setInt32(index++, itr->second->GetMaxDuration());
- stmt->setInt32(index++, itr->second->GetDuration());
- stmt->setUInt8(index++, itr->second->GetCharges());
-
+ stmt->setBinary(index++, key.Caster.GetRawValue());
+ stmt->setUInt32(index++, key.SpellId);
+ stmt->setUInt32(index++, key.EffectMask);
+ stmt->setUInt32(index++, recalculateMask);
+ stmt->setUInt8(index++, aura->GetStackAmount());
+ stmt->setInt32(index++, aura->GetMaxDuration());
+ stmt->setInt32(index++, aura->GetDuration());
+ stmt->setUInt8(index++, aura->GetCharges());
trans->Append(stmt);
+
+ for (AuraEffect const* effect : aura->GetAuraEffects())
+ {
+ if (effect)
+ {
+ index = 0;
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_PET_AURA_EFFECT);
+ stmt->setUInt32(index++, m_charmInfo->GetPetNumber());
+ stmt->setBinary(index++, key.Caster.GetRawValue());
+ stmt->setUInt32(index++, key.SpellId);
+ stmt->setUInt32(index++, key.EffectMask);
+ stmt->setUInt8(index++, effect->GetEffIndex());
+ stmt->setInt32(index++, effect->GetAmount());
+ stmt->setInt32(index++, effect->GetBaseAmount());
+ trans->Append(stmt);
+ }
+ }
}
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 5ec0a7c1dbe..bd084491dee 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -91,6 +91,8 @@
#include "MovementPackets.h"
#include "ItemPackets.h"
#include "QuestPackets.h"
+#include "LootPackets.h"
+#include <boost/dynamic_bitset.hpp>
#define ZONE_UPDATE_INTERVAL (1*IN_MILLISECONDS)
@@ -510,14 +512,10 @@ inline void KillRewarder::_RewardXP(Player* player, float rate)
for (Unit::AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
AddPct(xp, (*i)->GetAmount());
- // 4.2.3. Calculate expansion penalty
- if (_victim->GetTypeId() == TYPEID_UNIT && player->getLevel() >= GetMaxLevelForExpansion(_victim->ToCreature()->GetCreatureTemplate()->expansion))
- xp = CalculatePct(xp, 10); // Players get only 10% xp for killing creatures of lower expansion levels than himself
-
- // 4.2.4. Give XP to player.
+ // 4.2.3. Give XP to player.
player->GiveXP(xp, _victim, _groupRate);
if (Pet* pet = player->GetPet())
- // 4.2.5. If player has pet, reward pet with XP (100% for single player, 50% for group case).
+ // 4.2.4. If player has pet, reward pet with XP (100% for single player, 50% for group case).
pet->GivePetXP(_group ? xp / 2 : xp);
}
}
@@ -867,7 +865,7 @@ Player::Player(WorldSession* session): Unit(true)
isDebugAreaTriggers = false;
- _completedQuestBits.resize(QUESTS_COMPLETED_BITS_SIZE * 8);
+ _completedQuestBits = new boost::dynamic_bitset<uint8>(QUESTS_COMPLETED_BITS_SIZE * 8);
m_WeeklyQuestChanged = false;
m_MonthlyQuestChanged = false;
m_SeasonalQuestChanged = false;
@@ -912,6 +910,7 @@ Player::~Player()
delete m_declinedname;
delete m_runes;
+ delete _completedQuestBits;
delete m_achievementMgr;
delete m_reputationMgr;
@@ -2978,7 +2977,9 @@ void Player::GiveLevel(uint8 level)
// Refer-A-Friend
if (GetSession()->GetRecruiterId())
+ {
if (level < sWorld->getIntConfig(CONFIG_MAX_RECRUIT_A_FRIEND_BONUS_PLAYER_LEVEL))
+ {
if (level % 2 == 0)
{
++m_grantableLevels;
@@ -2986,12 +2987,7 @@ void Player::GiveLevel(uint8 level)
if (!HasByteFlag(PLAYER_FIELD_BYTES, 1, 0x01))
SetByteFlag(PLAYER_FIELD_BYTES, 1, 0x01);
}
-
- std::list<uint32> learnList = GetSpellsForLevels(getClass(), getRaceMask(), GetTalentSpec(GetActiveTalentGroup()), oldLevel, level);
- for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++)
- {
- if (!HasSpell(*iter))
- LearnSpell(*iter, true);
+ }
}
sScriptMgr->OnPlayerLevelChanged(this, oldLevel);
@@ -4179,12 +4175,6 @@ bool Player::ResetTalents(bool noCost, bool resetTalents, bool resetSpecializati
if (resetSpecialization)
{
- std::list<uint32> learnList = GetSpellsForLevels(0, getRaceMask(), GetTalentSpec(GetActiveTalentGroup()), 0, getLevel());
- for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++)
- {
- if (HasSpell(*iter))
- RemoveSpell(*iter, true);
- }
SetTalentSpec(GetActiveTalentGroup(), 0);
SetUInt32Value(PLAYER_FIELD_CURRENT_SPEC_ID, 0);
}
@@ -4591,6 +4581,10 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe
stmt->setUInt64(0, guid);
trans->Append(stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_EFFECT);
+ stmt->setUInt64(0, guid);
+ trans->Append(stmt);
+
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
stmt->setUInt64(0, guid);
trans->Append(stmt);
@@ -4792,15 +4786,15 @@ void Player::DeleteOldCharacters(uint32 keepDays)
*/
void Player::BuildPlayerRepop()
{
- WorldPacket data(SMSG_PRE_RESURRECT, GetPackGUID().size());
- data << GetPackGUID();
- GetSession()->SendPacket(&data);
+ WorldPackets::Misc::PreRessurect packet;
+ packet.PlayerGUID = GetGUID();
+ GetSession()->SendPacket(packet.Write());
if (getRace() == RACE_NIGHTELF)
CastSpell(this, 20584, true);
CastSpell(this, 8326, true);
- // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_WATER_WALK
+ // there must be SMSG.FORCE_RUN_SPEED_CHANGE, SMSG.FORCE_SWIM_SPEED_CHANGE, SMSG.MOVE_SET_WATER_WALK
// there must be SMSG.STOP_MIRROR_TIMER
// there we must send 888 opcode
@@ -4847,12 +4841,9 @@ void Player::BuildPlayerRepop()
void Player::ResurrectPlayer(float restore_percent, bool applySickness)
{
- WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // remove spirit healer position
- data << uint32(-1);
- data << float(0);
- data << float(0);
- data << float(0);
- GetSession()->SendPacket(&data);
+ WorldPackets::Misc::DeathReleaseLoc packet;
+ packet.MapID = -1;
+ GetSession()->SendPacket(packet.Write());
// speed change, land walk
@@ -5272,12 +5263,10 @@ void Player::RepopAtGraveyard()
TeleportTo(ClosestGrave->MapID, ClosestGrave->Loc.X, ClosestGrave->Loc.Y, ClosestGrave->Loc.Z, (ClosestGrave->Facing * M_PI) / 180); // Orientation is initially in degrees
if (isDead()) // not send if alive, because it used in TeleportTo()
{
- WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // show spirit healer position on minimap
- data << ClosestGrave->MapID;
- data << ClosestGrave->Loc.X;
- data << ClosestGrave->Loc.Y;
- data << ClosestGrave->Loc.Z;
- GetSession()->SendPacket(&data);
+ WorldPackets::Misc::DeathReleaseLoc packet;
+ packet.MapID = ClosestGrave->MapID;
+ packet.Loc = G3D::Vector3(ClosestGrave->Loc.X, ClosestGrave->Loc.Y, ClosestGrave->Loc.Z);
+ GetSession()->SendPacket(packet.Write());
}
}
else if (GetPositionZ() < MAX_MAP_DEPTH)
@@ -6628,7 +6617,7 @@ int32 Player::CalculateReputationGain(ReputationSource source, uint32 creatureOr
break;
}
- if (rate != 1.0f && creatureOrQuestLevel <= Trinity::XP::GetGrayLevel(getLevel()))
+ if (rate != 1.0f && creatureOrQuestLevel < Trinity::XP::GetGrayLevel(getLevel()))
percent *= rate;
if (percent <= 0.0f)
@@ -7251,6 +7240,7 @@ void Player::ResetCurrencyWeekCap()
if (uint32 arenaTeamId = GetArenaTeamId(arenaSlot))
{
ArenaTeam* arenaTeam = sArenaTeamMgr->GetArenaTeamById(arenaTeamId);
+ ASSERT(arenaTeam);
arenaTeam->FinishWeek(); // set played this week etc values to 0 in memory, too
arenaTeam->SaveToDB(); // save changes
arenaTeam->NotifyStatsChanged(); // notify the players of the changes
@@ -8591,7 +8581,7 @@ void Player::RemovedInsignia(Player* looterPlr)
void Player::SendLootRelease(ObjectGuid guid)
{
- WorldPacket data(SMSG_LOOT_RELEASE_RESPONSE, (8+1));
+ WorldPacket data(SMSG_LOOT_RELEASE, (8+1));
data << guid << uint8(1);
SendDirectMessage(&data);
}
@@ -8916,11 +8906,16 @@ void Player::SendLoot(ObjectGuid guid, LootType loot_type)
{
SetLootGUID(guid);
- WorldPacket data(SMSG_LOOT_RESPONSE, (9 + 50)); // we guess size
- data << guid;
- data << uint8(loot_type);
- data << LootView(*loot, this, permission);
- SendDirectMessage(&data);
+ WorldPackets::Loot::LootResponse packet;
+ packet.LootObj = guid;
+ packet.Owner = loot->GetGUID();
+ packet.LootMethod = loot_type;
+ if (!GetGroup())
+ packet.PersonalLooting = true;
+ else
+ packet.PersonalLooting = false;
+ loot->BuildLootResponse(packet, this, permission);
+ SendDirectMessage(packet.Write());
// add 'this' player as one of the players that are looting 'loot'
loot->AddLooter(GetGUID());
@@ -8941,17 +8936,21 @@ void Player::SendLootError(ObjectGuid guid, LootError error)
SendDirectMessage(&data);
}
-void Player::SendNotifyLootMoneyRemoved()
+void Player::SendNotifyLootMoneyRemoved(ObjectGuid lootObj)
{
- WorldPacket data(SMSG_LOOT_CLEAR_MONEY, 0);
- GetSession()->SendPacket(&data);
+ WorldPackets::Loot::CoinRemoved packet;
+ packet.LootObj = lootObj;
+ SendDirectMessage(packet.Write());
}
-void Player::SendNotifyLootItemRemoved(uint8 lootSlot)
+void Player::SendNotifyLootItemRemoved(ObjectGuid owner, ObjectGuid lootObj, uint8 lootSlot)
{
- WorldPacket data(SMSG_LOOT_REMOVED, 1);
- data << uint8(lootSlot);
- GetSession()->SendPacket(&data);
+ WorldPackets::Loot::LootRemoved packet;
+ packet.Owner = owner;
+ packet.LootObj = lootObj;
+ // Since 6.x client expects loot to be starting from 1 hence the +1
+ packet.LootListID = lootSlot+1;
+ GetSession()->SendPacket(packet.Write());
}
void Player::SendUpdateWorldState(uint32 variable, uint32 value, bool hidden /*= false*/)
@@ -9620,11 +9619,10 @@ void Player::SetBindPoint(ObjectGuid guid)
GetSession()->SendPacket(&data);
}
-void Player::SendTalentWipeConfirm(ObjectGuid guid)
+void Player::SendRespecWipeConfirm(ObjectGuid const& guid, uint32 cost)
{
- WorldPacket data(MSG_TALENT_WIPE_CONFIRM, 8 + 4);
+ WorldPacket data(SMSG_RESPEC_WIPE_CONFIRM, 8 + 4);
data << guid;
- uint32 cost = sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : GetNextResetTalentsCost();
data << cost;
GetSession()->SendPacket(&data);
}
@@ -11629,27 +11627,31 @@ InventoryResult Player::CanRollForItemInLFG(ItemTemplate const* proto, WorldObje
}
// Return stored item (if stored to stack, it can diff. from pItem). And pItem ca be deleted in this case.
-Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update, int32 randomPropertyId, GuidSet const& allowedLooters)
+Item* Player::StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId /*= 0*/, GuidSet const& allowedLooters /*= GuidSet()*/, std::vector<int32> const& bonusListIDs /*= std::vector<int32>()*/)
{
uint32 count = 0;
- for (ItemPosCountVec::const_iterator itr = dest.begin(); itr != dest.end(); ++itr)
+ for (ItemPosCountVec::const_iterator itr = pos.begin(); itr != pos.end(); ++itr)
count += itr->count;
- Item* pItem = Item::CreateItem(item, count, this);
- if (pItem)
+ Item* item = Item::CreateItem(itemId, count, this);
+ if (item)
{
- ItemAddedQuestCheck(item, count);
- UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, item, count);
- UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, item, 1);
+ ItemAddedQuestCheck(itemId, count);
+ UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_RECEIVE_EPIC_ITEM, itemId, count);
+ UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_OWN_ITEM, itemId, 1);
if (randomPropertyId)
- pItem->SetItemRandomProperties(randomPropertyId);
- pItem = StoreItem(dest, pItem, update);
+ item->SetItemRandomProperties(randomPropertyId);
+
+ for (int32 bonusListID : bonusListIDs)
+ item->AddBonuses(bonusListID);
+
+ item = StoreItem(pos, item, update);
- if (allowedLooters.size() > 1 && pItem->GetTemplate()->GetMaxStackSize() == 1 && pItem->IsSoulBound())
+ if (allowedLooters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound())
{
- pItem->SetSoulboundTradeable(allowedLooters);
- pItem->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, GetTotalPlayedTime());
- AddTradeableItem(pItem);
+ item->SetSoulboundTradeable(allowedLooters);
+ item->SetUInt32Value(ITEM_FIELD_CREATE_PLAYED_TIME, GetTotalPlayedTime());
+ AddTradeableItem(item);
// save data
std::ostringstream ss;
@@ -11659,12 +11661,12 @@ Item* Player::StoreNewItem(ItemPosCountVec const& dest, uint32 item, bool update
ss << ' ' << *itr;
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_ITEM_BOP_TRADE);
- stmt->setUInt64(0, pItem->GetGUID().GetCounter());
+ stmt->setUInt64(0, item->GetGUID().GetCounter());
stmt->setString(1, ss.str());
CharacterDatabase.Execute(stmt);
}
}
- return pItem;
+ return item;
}
Item* Player::StoreItem(ItemPosCountVec const& dest, Item* pItem, bool update)
@@ -14015,7 +14017,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men
break;
case GOSSIP_OPTION_UNLEARNTALENTS:
PlayerTalkClass->SendCloseGossip();
- SendTalentWipeConfirm(guid);
+ SendRespecWipeConfirm(guid, sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : GetNextResetTalentsCost());
break;
case GOSSIP_OPTION_UNLEARNPETTALENTS:
PlayerTalkClass->SendCloseGossip();
@@ -14888,7 +14890,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
{
- _completedQuestBits.set(questBit - 1);
+ _completedQuestBits->set(questBit - 1);
WorldPackets::Quest::SetQuestCompletedBit setCompletedBit;
setCompletedBit.QuestID = quest_id;
@@ -15004,7 +15006,7 @@ bool Player::SatisfyQuestLog(bool msg)
if (msg)
{
- WorldPacket data(SMSG_QUESTLOG_FULL, 0);
+ WorldPacket data(SMSG_QUEST_LOG_FULL, 0);
GetSession()->SendPacket(&data);
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTLOG_FULL");
}
@@ -15527,7 +15529,7 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/)
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
{
- _completedQuestBits.reset(questBit - 1);
+ _completedQuestBits->reset(questBit - 1);
WorldPackets::Quest::ClearQuestCompletedBit clearCompletedBit;
clearCompletedBit.QuestID = questId;
@@ -16328,7 +16330,7 @@ void Player::SendQuestComplete(Quest const* quest)
{
if (quest)
{
- WorldPacket data(SMSG_QUESTUPDATE_COMPLETE, 4);
+ WorldPacket data(SMSG_QUEST_UPDATE_COMPLETE, 4);
data << uint32(quest->GetQuestId());
GetSession()->SendPacket(&data);
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_COMPLETE quest = %u", quest->GetQuestId());
@@ -16388,7 +16390,7 @@ void Player::SendQuestTimerFailed(uint32 quest_id)
{
if (quest_id)
{
- WorldPacket data(SMSG_QUESTUPDATE_FAILEDTIMER, 4);
+ WorldPacket data(SMSG_QUEST_UPDATE_FAILED_TIMER, 4);
data << uint32(quest_id);
GetSession()->SendPacket(&data);
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_FAILEDTIMER");
@@ -16428,11 +16430,11 @@ void Player::SendPushToPartyResponse(Player* player, uint8 msg)
{
if (player)
{
- WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 1);
+ WorldPacket data(SMSG_QUEST_PUSH_RESULT, 8 + 1);
data << player->GetGUID();
data << uint8(msg); // valid values: 0-8
- GetSession()->SendPacket(&data);
- TC_LOG_DEBUG("network", "WORLD: Sent MSG_QUEST_PUSH_RESULT");
+ SendDirectMessage(&data);
+ TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUEST_PUSH_RESULT");
}
}
@@ -16450,7 +16452,7 @@ void Player::SendQuestUpdateAddCredit(Quest const* quest, ObjectGuid guid, Quest
void Player::SendQuestUpdateAddPlayer(Quest const* quest, uint16 newCount, uint32 required)
{
- WorldPacket data(SMSG_QUESTUPDATE_ADD_PVP_KILL, (3*4));
+ WorldPacket data(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, (3*4));
TC_LOG_DEBUG("network", "WORLD: Sent SMSG_QUESTUPDATE_ADD_PVP_KILL");
data << uint32(quest->GetQuestId());
data << uint32(newCount);
@@ -17202,7 +17204,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder)
_LoadSpells(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_SPELLS));
_LoadGlyphs(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_GLYPHS));
- _LoadAuras(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), time_diff);
+ _LoadAuras(holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURAS), holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_AURA_EFFECTS), time_diff);
_LoadGlyphAuras();
// add ghost flag (must be after aura load: PLAYER_FLAGS_GHOST set in aura)
if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
@@ -17467,67 +17469,83 @@ void Player::_LoadActions(PreparedQueryResult result)
}
}
-void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff)
+void Player::_LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effectResult, uint32 timediff)
{
TC_LOG_DEBUG("entities.player.loading", "Loading auras for %s", GetGUID().ToString().c_str());
- /* 0 1 2 3 4 5 6 7 8 9 10
- QueryResult* result = CharacterDatabase.PQuery("SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2,
- 11 12 13
- maxduration, remaintime, remaincharges FROM character_aura WHERE guid = '%u'", GetGUIDLow());
+ /*
+ 0 1 2 3 4 5 6
+ SELECT casterGuid, itemGuid, spell, effectMask, effectIndex, amount, baseAmount FROM character_aura_effect WHERE guid = ?
*/
- if (result)
+ ObjectGuid casterGuid, itemGuid;
+ std::map<AuraKey, AuraLoadEffectInfo> effectInfo;
+ if (effectResult)
{
- ObjectGuid caster_guid;
do
{
- Field* fields = result->Fetch();
- int32 damage[3];
- int32 baseDamage[3];
- caster_guid.SetRawValue(fields[0].GetBinary());
- uint32 spellid = fields[1].GetUInt32();
- uint8 effmask = fields[2].GetUInt8();
- uint8 recalculatemask = fields[3].GetUInt8();
- uint8 stackcount = fields[4].GetUInt8();
- damage[0] = fields[5].GetInt32();
- damage[1] = fields[6].GetInt32();
- damage[2] = fields[7].GetInt32();
- baseDamage[0] = fields[8].GetInt32();
- baseDamage[1] = fields[9].GetInt32();
- baseDamage[2] = fields[10].GetInt32();
- int32 maxduration = fields[11].GetInt32();
- int32 remaintime = fields[12].GetInt32();
- uint8 remaincharges = fields[13].GetUInt8();
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellid);
+ Field* fields = effectResult->Fetch();
+ uint32 effectIndex = fields[4].GetUInt8();
+ if (effectIndex < MAX_SPELL_EFFECTS)
+ {
+ casterGuid.SetRawValue(fields[0].GetBinary());
+ itemGuid.SetRawValue(fields[1].GetBinary());
+ AuraKey key{ casterGuid, itemGuid, fields[2].GetUInt32(), fields[3].GetUInt32() };
+ AuraLoadEffectInfo& info = effectInfo[key];
+ info.Amounts[effectIndex] = fields[5].GetInt32();
+ info.BaseAmounts[effectIndex] = fields[6].GetInt32();
+ }
+ }
+ while (effectResult->NextRow());
+ }
+
+ /*
+ 0 1 2 3 4 5 6 7 8
+ SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = ?
+ */
+ if (auraResult)
+ {
+ do
+ {
+ Field* fields = auraResult->Fetch();
+ casterGuid.SetRawValue(fields[0].GetBinary());
+ itemGuid.SetRawValue(fields[1].GetBinary());
+ AuraKey key{ casterGuid, itemGuid, fields[2].GetUInt32(), fields[3].GetUInt32() };
+ uint32 recalculateMask = fields[4].GetUInt32();
+ uint8 stackCount = fields[5].GetUInt8();
+ int32 maxDuration = fields[6].GetInt32();
+ int32 remainTime = fields[7].GetInt32();
+ uint8 remainCharges = fields[8].GetUInt8();
+
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(key.SpellId);
if (!spellInfo)
{
- TC_LOG_ERROR("entities.player", "Unknown aura (spellid %u), ignore.", spellid);
+ TC_LOG_ERROR("entities.player", "Unknown aura (spellid %u), ignore.", key.SpellId);
continue;
}
// negative effects should continue counting down after logout
- if (remaintime != -1 && !spellInfo->IsPositive())
+ if (remainTime != -1 && !spellInfo->IsPositive())
{
- if (remaintime/IN_MILLISECONDS <= int32(timediff))
+ if (remainTime/IN_MILLISECONDS <= int32(timediff))
continue;
- remaintime -= timediff*IN_MILLISECONDS;
+ remainTime -= timediff*IN_MILLISECONDS;
}
- // prevent wrong values of remaincharges
+ // prevent wrong values of remainCharges
if (spellInfo->ProcCharges)
{
// we have no control over the order of applying auras and modifiers allow auras
// to have more charges than value in SpellInfo
- if (remaincharges <= 0/* || remaincharges > spellproto->procCharges*/)
- remaincharges = spellInfo->ProcCharges;
+ if (remainCharges <= 0/* || remainCharges > spellproto->procCharges*/)
+ remainCharges = spellInfo->ProcCharges;
}
else
- remaincharges = 0;
+ remainCharges = 0;
- if (Aura* aura = Aura::TryCreate(spellInfo, effmask, this, NULL, &baseDamage[0], NULL, caster_guid))
+ AuraLoadEffectInfo& info = effectInfo[key];
+ if (Aura* aura = Aura::TryCreate(spellInfo, key.EffectMask, this, NULL, info.BaseAmounts.data(), NULL, casterGuid))
{
if (!aura->CanBeSaved())
{
@@ -17535,12 +17553,12 @@ void Player::_LoadAuras(PreparedQueryResult result, uint32 timediff)
continue;
}
- aura->SetLoadedState(maxduration, remaintime, remaincharges, stackcount, recalculatemask, &damage[0]);
+ aura->SetLoadedState(maxDuration, remainTime, remainCharges, stackCount, recalculateMask, info.Amounts.data());
aura->ApplyForTargets();
- TC_LOG_INFO("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, effmask);
+ TC_LOG_INFO("entities.player", "Added aura spellid %u, effectmask %u", spellInfo->Id, key.EffectMask);
}
}
- while (result->NextRow());
+ while (auraResult->NextRow());
}
}
@@ -18165,7 +18183,7 @@ void Player::_LoadQuestStatusRewarded(PreparedQueryResult result)
// instead add them separately from load daily/weekly/monthly/seasonal
if (!quest->IsDailyOrWeekly() && !quest->IsMonthly() && !quest->IsSeasonal())
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits.set(questBit - 1);
+ _completedQuestBits->set(questBit - 1);
}
m_RewardedQuests.insert(quest_id);
@@ -18205,7 +18223,7 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result)
AddDynamicValue(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS, quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits.set(questBit - 1);
+ _completedQuestBits->set(questBit - 1);
TC_LOG_DEBUG("entities.player.loading", "Daily quest (%u) cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -18231,7 +18249,7 @@ void Player::_LoadWeeklyQuestStatus(PreparedQueryResult result)
m_weeklyquests.insert(quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits.set(questBit - 1);
+ _completedQuestBits->set(questBit - 1);
TC_LOG_DEBUG("entities.player.loading", "Weekly quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -18258,7 +18276,7 @@ void Player::_LoadSeasonalQuestStatus(PreparedQueryResult result)
m_seasonalquests[event_id].insert(quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits.set(questBit - 1);
+ _completedQuestBits->set(questBit - 1);
TC_LOG_DEBUG("entities.player.loading", "Seasonal quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -18284,7 +18302,7 @@ void Player::_LoadMonthlyQuestStatus(PreparedQueryResult result)
m_monthlyquests.insert(quest_id);
if (uint32 questBit = GetQuestUniqueBitFlag(quest_id))
- _completedQuestBits.set(questBit - 1);
+ _completedQuestBits->set(questBit - 1);
TC_LOG_DEBUG("entities.player.loading", "Monthly quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str());
}
@@ -18304,13 +18322,6 @@ void Player::_LoadSpells(PreparedQueryResult result)
AddSpell((*result)[0].GetUInt32(), (*result)[1].GetBool(), false, false, (*result)[2].GetBool(), true);
while (result->NextRow());
}
-
- std::list<uint32> learnList = GetSpellsForLevels(getClass(), getRaceMask(), GetActiveTalentSpec(), 0, getLevel());
- for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++)
- {
- if (!HasSpell(*iter))
- LearnSpell(*iter, true);
- }
}
void Player::_LoadGroup(PreparedQueryResult result)
@@ -18380,7 +18391,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result)
}
else
{
- MapDifficulty const* mapDiff = GetMapDifficultyData(mapId, Difficulty(difficulty));
+ MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(difficulty));
if (!mapDiff)
{
TC_LOG_ERROR("entities.player", "_LoadBoundInstances: player %s(%s) has bind to not existed difficulty %d instance for map %u (%s)", GetName().c_str(), GetGUID().ToString().c_str(), difficulty, mapId, mapname.c_str());
@@ -18416,7 +18427,7 @@ void Player::_LoadBoundInstances(PreparedQueryResult result)
InstancePlayerBind* Player::GetBoundInstance(uint32 mapid, Difficulty difficulty)
{
// some instances only have one difficulty
- MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty);
+ MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(mapid, difficulty);
if (!mapDiff)
return NULL;
@@ -18703,14 +18714,14 @@ bool Player::Satisfy(AccessRequirement const* ar, uint32 target_map, bool report
missingAchievement = ar->achievement;
Difficulty target_difficulty = GetDifficultyID(mapEntry);
- MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
+ MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(target_map, target_difficulty);
if (LevelMin || LevelMax || missingItem || missingQuest || missingAchievement)
{
if (report)
{
if (missingQuest && !ar->questFailedText.empty())
ChatHandler(GetSession()).PSendSysMessage("%s", ar->questFailedText.c_str());
- else if (mapDiff->hasErrorMessage) // if (missingAchievement) covered by this case
+ else if (mapDiff->HasMessage()) // if (missingAchievement) covered by this case
SendTransferAborted(target_map, TRANSFER_ABORT_DIFFICULTY, target_difficulty);
else if (missingItem)
GetSession()->SendAreaTriggerMessage(GetSession()->GetTrinityString(LANG_LEVEL_MINREQUIRED_AND_ITEM), LevelMin, sObjectMgr->GetItemTemplate(missingItem)->GetName(GetSession()->GetSessionDbcLocale()));
@@ -19222,57 +19233,55 @@ void Player::_SaveActions(SQLTransaction& trans)
void Player::_SaveAuras(SQLTransaction& trans)
{
- PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
+ PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA_EFFECT);
+ stmt->setUInt64(0, GetGUID().GetCounter());
+ trans->Append(stmt);
+
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHAR_AURA);
stmt->setUInt64(0, GetGUID().GetCounter());
trans->Append(stmt);
+ uint8 index;
for (AuraMap::const_iterator itr = m_ownedAuras.begin(); itr != m_ownedAuras.end(); ++itr)
{
if (!itr->second->CanBeSaved())
continue;
Aura* aura = itr->second;
+ uint32 recalculateMask = 0;
+ AuraKey key = aura->GenerateKey(recalculateMask);
- int32 damage[MAX_SPELL_EFFECTS];
- int32 baseDamage[MAX_SPELL_EFFECTS];
- uint8 effMask = 0;
- uint8 recalculateMask = 0;
- for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- {
- if (AuraEffect const* effect = aura->GetEffect(i))
- {
- baseDamage[i] = effect->GetBaseAmount();
- damage[i] = effect->GetAmount();
- effMask |= 1 << i;
- if (effect->CanBeRecalculated())
- recalculateMask |= 1 << i;
- }
- else
- {
- baseDamage[i] = 0;
- damage[i] = 0;
- }
- }
-
- uint8 index = 0;
+ index = 0;
stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA);
stmt->setUInt64(index++, GetGUID().GetCounter());
- stmt->setBinary(index++, itr->second->GetCasterGUID().GetRawValue());
- stmt->setBinary(index++, itr->second->GetCastItemGUID().GetRawValue());
- stmt->setUInt32(index++, itr->second->GetId());
- stmt->setUInt8(index++, effMask);
+ stmt->setBinary(index++, key.Caster.GetRawValue());
+ stmt->setBinary(index++, key.Item.GetRawValue());
+ stmt->setUInt32(index++, key.SpellId);
+ stmt->setUInt32(index++, key.EffectMask);
stmt->setUInt8(index++, recalculateMask);
- stmt->setUInt8(index++, itr->second->GetStackAmount());
- stmt->setInt32(index++, damage[0]);
- stmt->setInt32(index++, damage[1]);
- stmt->setInt32(index++, damage[2]);
- stmt->setInt32(index++, baseDamage[0]);
- stmt->setInt32(index++, baseDamage[1]);
- stmt->setInt32(index++, baseDamage[2]);
- stmt->setInt32(index++, itr->second->GetMaxDuration());
- stmt->setInt32(index++, itr->second->GetDuration());
- stmt->setUInt8(index, itr->second->GetCharges());
+ stmt->setUInt8(index++, aura->GetStackAmount());
+ stmt->setInt32(index++, aura->GetMaxDuration());
+ stmt->setInt32(index++, aura->GetDuration());
+ stmt->setUInt8(index, aura->GetCharges());
trans->Append(stmt);
+
+ for (AuraEffect const* effect : aura->GetAuraEffects())
+ {
+ if (effect)
+ {
+ index = 0;
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_AURA_EFFECT);
+ stmt->setUInt64(index++, GetGUID().GetCounter());
+ stmt->setBinary(index++, key.Caster.GetRawValue());
+ stmt->setBinary(index++, key.Item.GetRawValue());
+ stmt->setUInt32(index++, key.SpellId);
+ stmt->setUInt32(index++, key.EffectMask);
+ stmt->setUInt8(index++, effect->GetEffIndex());
+ stmt->setInt32(index++, effect->GetAmount());
+ stmt->setInt32(index++, effect->GetBaseAmount());
+ trans->Append(stmt);
+ }
+ }
}
}
@@ -22905,7 +22914,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
WorldPackets::Misc::WorldServerInfo worldServerInfo;
worldServerInfo.IneligibleForLootMask.Clear(); /// @todo
worldServerInfo.WeeklyReset = sWorld->GetNextWeeklyQuestsResetTime() - WEEK;
- worldServerInfo.InstanceGroupSize.Set(GetMap()->GetMapDifficulty()->maxPlayers);
+ worldServerInfo.InstanceGroupSize.Set(GetMap()->GetMapDifficulty()->MaxPlayers);
worldServerInfo.IsTournamentRealm = 0; /// @todo
worldServerInfo.RestrictedAccountMaxLevel.Clear(); /// @todo
worldServerInfo.RestrictedAccountMaxMoney.Clear(); /// @todo
@@ -22917,7 +22926,7 @@ void Player::SendInitialPacketsBeforeAddToMap()
WorldPackets::Character::InitialSetup initialSetup;
initialSetup.ServerExpansionLevel = sWorld->getIntConfig(CONFIG_EXPANSION);
- boost::to_block_range(_completedQuestBits, std::back_inserter(initialSetup.QuestsCompleted));
+ boost::to_block_range(*_completedQuestBits, std::back_inserter(initialSetup.QuestsCompleted));
SendDirectMessage(initialSetup.Write());
SetMover(this);
@@ -23422,8 +23431,13 @@ void Player::ResetDailyQuestStatus()
{
WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
for (uint32 questId : dailies)
+ {
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
+ {
clearCompletedBits.Qbits.push_back(questBit);
+ _completedQuestBits->reset(questBit - 1);
+ }
+ }
if (!clearCompletedBits.Qbits.empty())
SendDirectMessage(clearCompletedBits.Write());
@@ -23445,8 +23459,13 @@ void Player::ResetWeeklyQuestStatus()
WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
for (uint32 questId : m_weeklyquests)
+ {
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
+ {
clearCompletedBits.Qbits.push_back(questBit);
+ _completedQuestBits->reset(questBit - 1);
+ }
+ }
if (!clearCompletedBits.Qbits.empty())
SendDirectMessage(clearCompletedBits.Write());
@@ -23467,8 +23486,13 @@ void Player::ResetSeasonalQuestStatus(uint16 event_id)
WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
for (uint32 questId : eventItr->second)
+ {
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
+ {
clearCompletedBits.Qbits.push_back(questBit);
+ _completedQuestBits->reset(questBit - 1);
+ }
+ }
if (!clearCompletedBits.Qbits.empty())
SendDirectMessage(clearCompletedBits.Write());
@@ -23485,8 +23509,13 @@ void Player::ResetMonthlyQuestStatus()
WorldPackets::Quest::ClearQuestCompletedBits clearCompletedBits;
for (uint32 questId : m_monthlyquests)
+ {
if (uint32 questBit = GetQuestUniqueBitFlag(questId))
+ {
clearCompletedBits.Qbits.push_back(questBit);
+ _completedQuestBits->reset(questBit - 1);
+ }
+ }
if (!clearCompletedBits.Qbits.empty())
SendDirectMessage(clearCompletedBits.Write());
@@ -23987,7 +24016,7 @@ bool Player::isHonorOrXPTarget(Unit const* victim) const
uint8 k_grey = Trinity::XP::GetGrayLevel(getLevel());
// Victim level less gray level
- if (v_level <= k_grey)
+ if (v_level < k_grey)
return false;
if (Creature const* const creature = victim->ToCreature())
@@ -24308,9 +24337,9 @@ int32 Player::CalculateCorpseReclaimDelay(bool load)
void Player::SendCorpseReclaimDelay(uint32 delay)
{
- WorldPacket data(SMSG_CORPSE_RECLAIM_DELAY, 4);
- data << uint32(delay);
- GetSession()->SendPacket(&data);
+ WorldPackets::Misc::CorpseReclaimDelay packet;
+ packet.Remaining = delay;
+ GetSession()->SendPacket(packet.Write());
}
Player* Player::GetNextRandomRaidMember(float radius)
@@ -24973,7 +25002,7 @@ void Player::AutoStoreLoot(uint8 bag, uint8 slot, uint32 loot_id, LootStore cons
continue;
}
- Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId);
+ Item* pItem = StoreNewItem(dest, lootItem->itemid, true, lootItem->randomPropertyId, GuidSet(), lootItem->BonusListIDs);
SendNewItem(pItem, lootItem->count, false, false, broadcast);
}
}
@@ -25009,14 +25038,14 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
InventoryResult msg = CanStoreNewItem(NULL_BAG, NULL_SLOT, dest, item->itemid, item->count);
if (msg == EQUIP_ERR_OK)
{
- Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, item->GetAllowedLooters());
+ Item* newitem = StoreNewItem(dest, item->itemid, true, item->randomPropertyId, item->GetAllowedLooters(), item->BonusListIDs);
if (qitem)
{
qitem->is_looted = true;
//freeforall is 1 if everyone's supposed to get the quest item.
if (item->freeforall || loot->GetPlayerQuestItems().size() == 1)
- SendNotifyLootItemRemoved(lootSlot);
+ SendNotifyLootItemRemoved(GetLootGUID(), loot->GetGUID(), lootSlot);
else
loot->NotifyQuestItemRemoved(qitem->index);
}
@@ -25026,7 +25055,7 @@ void Player::StoreLootItem(uint8 lootSlot, Loot* loot)
{
//freeforall case, notify only one player of the removal
ffaitem->is_looted = true;
- SendNotifyLootItemRemoved(lootSlot);
+ SendNotifyLootItemRemoved(GetLootGUID(), loot->GetGUID(), lootSlot);
}
else
{
@@ -25455,13 +25484,6 @@ void Player::LearnTalentSpecialization(uint32 talentSpec)
SendTalentsInfoData();
- std::list<uint32> learnList = GetSpellsForLevels(0, getRaceMask(), GetActiveTalentSpec(), 0, getLevel());
- for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++)
- {
- if (!HasSpell(*iter))
- LearnSpell(*iter, true);
- }
-
SaveToDB();
SendTalentsInfoData();
@@ -26025,14 +26047,6 @@ void Player::ActivateTalentGroup(uint8 group)
RemoveSpell(effect->TriggerSpell, true);
}
- // Unlearn specialization specific spells
- std::list<uint32> learnList = GetSpellsForLevels(0, getRaceMask(), GetActiveTalentSpec(), 0, getLevel());
- for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++)
- {
- if (HasSpell(*iter))
- RemoveSpell(*iter, true);
- }
-
// remove glyphs
for (uint8 slot = 0; slot < MAX_GLYPH_SLOT_INDEX; ++slot)
// remove secondary glyph
@@ -26045,13 +26059,6 @@ void Player::ActivateTalentGroup(uint8 group)
uint32 spentTalents = 0;
- learnList = GetSpellsForLevels(getClass(), getRaceMask(), GetActiveTalentSpec(), 0, getLevel());
- for (std::list<uint32>::const_iterator iter = learnList.begin(); iter != learnList.end(); iter++)
- {
- if (!HasSpell(*iter))
- LearnSpell(*iter, true);
- }
-
for (uint32 talentId = 0; talentId < sTalentStore.GetNumRows(); ++talentId)
{
TalentEntry const* talentInfo = sTalentStore.LookupEntry(talentId);
@@ -26616,8 +26623,8 @@ VoidStorageItem* Player::GetVoidStorageItem(uint64 id, uint8& slot) const
void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply)
{
Movement::PacketSender(this, static_cast<OpcodeServer>(NULL_OPCODE), apply ?
- SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY :
- SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY).Send();
+ SMSG_MOVE_ENABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY :
+ SMSG_MOVE_DISABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY).Send();
}
void Player::SendMovementSetCollisionHeight(float height)
@@ -27156,7 +27163,7 @@ Difficulty Player::GetDifficultyID(MapEntry const* mapEntry) const
if (!mapEntry->IsRaid())
return m_dungeonDifficulty;
- MapDifficulty const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID);
+ MapDifficultyEntry const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID);
if (!defaultDifficulty)
return m_legacyRaidDifficulty;
@@ -27188,7 +27195,7 @@ Difficulty Player::CheckLoadedRaidDifficultyID(Difficulty difficulty)
if (!difficultyEntry)
return DIFFICULTY_NORMAL_RAID;
- if (difficultyEntry->InstanceType != MAP_INSTANCE)
+ if (difficultyEntry->InstanceType != MAP_RAID)
return DIFFICULTY_NORMAL_RAID;
if (!(difficultyEntry->Flags & DIFFICULTY_FLAG_CAN_SELECT) || (difficultyEntry->Flags & DIFFICULTY_FLAG_LEGACY))
@@ -27203,7 +27210,7 @@ Difficulty Player::CheckLoadedLegacyRaidDifficultyID(Difficulty difficulty)
if (!difficultyEntry)
return DIFFICULTY_10_N;
- if (difficultyEntry->InstanceType != MAP_INSTANCE)
+ if (difficultyEntry->InstanceType != MAP_RAID)
return DIFFICULTY_10_N;
if (!(difficultyEntry->Flags & DIFFICULTY_FLAG_CAN_SELECT) || !(difficultyEntry->Flags & DIFFICULTY_FLAG_LEGACY))
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index e7e6de95746..e895e696bb4 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -35,7 +35,7 @@
#include <limits>
#include <string>
#include <vector>
-#include <boost/dynamic_bitset.hpp>
+#include <boost/dynamic_bitset_fwd.hpp>
struct CreatureTemplate;
struct Mail;
@@ -71,7 +71,7 @@ enum SkillFieldOffset
SKILL_PERM_BONUS_OFFSET = SKILL_TEMP_BONUS_OFFSET + 64
};
-#define PLAYER_EXPLORED_ZONES_SIZE 189
+#define PLAYER_EXPLORED_ZONES_SIZE 200
// Note: SPELLMOD_* values is aura types in fact
enum SpellModType
@@ -908,6 +908,7 @@ enum PlayerLoginQueryIndex
PLAYER_LOGIN_QUERY_LOAD_GROUP,
PLAYER_LOGIN_QUERY_LOAD_BOUND_INSTANCES,
PLAYER_LOGIN_QUERY_LOAD_AURAS,
+ PLAYER_LOGIN_QUERY_LOAD_AURA_EFFECTS,
PLAYER_LOGIN_QUERY_LOAD_SPELLS,
PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS,
PLAYER_LOGIN_QUERY_LOAD_QUEST_STATUS_OBJECTIVES,
@@ -1454,7 +1455,7 @@ class Player : public Unit, public GridObject<Player>
InventoryResult CanUseItem(ItemTemplate const* pItem) const;
InventoryResult CanUseAmmo(uint32 item) const;
InventoryResult CanRollForItemInLFG(ItemTemplate const* item, WorldObject const* lootedObject) const;
- Item* StoreNewItem(ItemPosCountVec const& pos, uint32 item, bool update, int32 randomPropertyId = 0, GuidSet const& allowedLooters = GuidSet());
+ Item* StoreNewItem(ItemPosCountVec const& pos, uint32 itemId, bool update, int32 randomPropertyId = 0, GuidSet const& allowedLooters = GuidSet(), std::vector<int32> const& bonusListIDs = std::vector<int32>());
Item* StoreItem(ItemPosCountVec const& pos, Item* pItem, bool update);
Item* EquipNewItem(uint16 pos, uint32 item, bool update);
Item* EquipItem(uint16 pos, Item* pItem, bool update);
@@ -1736,7 +1737,7 @@ class Player : public Unit, public GridObject<Player>
bool m_mailsUpdated;
void SetBindPoint(ObjectGuid guid);
- void SendTalentWipeConfirm(ObjectGuid guid);
+ void SendRespecWipeConfirm(ObjectGuid const& guid, uint32 cost);
void ResetPetTalents();
void CalcRage(uint32 damage, bool attacker);
void RegenerateAll();
@@ -2285,8 +2286,8 @@ class Player : public Unit, public GridObject<Player>
void SendLoot(ObjectGuid guid, LootType loot_type);
void SendLootError(ObjectGuid guid, LootError error);
void SendLootRelease(ObjectGuid guid);
- void SendNotifyLootItemRemoved(uint8 lootSlot);
- void SendNotifyLootMoneyRemoved();
+ void SendNotifyLootItemRemoved(ObjectGuid owner, ObjectGuid lootObj, uint8 lootSlot);
+ void SendNotifyLootMoneyRemoved(ObjectGuid lootObj);
/*********************************************************/
/*** BATTLEGROUND SYSTEM ***/
@@ -2659,7 +2660,7 @@ class Player : public Unit, public GridObject<Player>
/*********************************************************/
void _LoadActions(PreparedQueryResult result);
- void _LoadAuras(PreparedQueryResult result, uint32 timediff);
+ void _LoadAuras(PreparedQueryResult auraResult, PreparedQueryResult effectResult, uint32 timediff);
void _LoadGlyphAuras();
void _LoadBoundInstances(PreparedQueryResult result);
void _LoadInventory(PreparedQueryResult result, uint32 timeDiff);
@@ -2783,7 +2784,7 @@ class Player : public Unit, public GridObject<Player>
RewardedQuestSet m_RewardedQuests;
QuestStatusSaveMap m_RewardedQuestsSave;
- boost::dynamic_bitset<uint8> _completedQuestBits;
+ boost::dynamic_bitset<uint8>* _completedQuestBits;
SkillStatusMap mSkillStatus;
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp
index 85c3744b63f..a2adb6a320c 100644
--- a/src/server/game/Entities/Unit/Unit.cpp
+++ b/src/server/game/Entities/Unit/Unit.cpp
@@ -631,7 +631,7 @@ uint32 Unit::DealDamage(Unit* victim, uint32 damage, CleanDamage const* cleanDam
// Rage from Damage made (only from direct weapon damage)
if (cleanDamage && damagetype == DIRECT_DAMAGE && this != victim && getPowerType() == POWER_RAGE)
{
- uint32 rage = uint32(GetAttackTime(cleanDamage->attackType) / 1000 * 8.125f);
+ uint32 rage = uint32(GetAttackTime(cleanDamage->attackType) / 1000.f * 8.125f);
switch (cleanDamage->attackType)
{
case OFF_ATTACK:
@@ -1378,7 +1378,7 @@ void Unit::DealMeleeDamage(CalcDamageInfo* damageInfo, bool durabilityLoss)
victim->DealDamageMods(this, damage, NULL);
/// @todo Move this to a packet handler
- WorldPacket data(SMSG_SPELLDAMAGESHIELD, 8 + 8 + 4 + 4 + 4 + 4 + 4);
+ WorldPacket data(SMSG_SPELL_DAMAGE_SHIELD, 8 + 8 + 4 + 4 + 4 + 4 + 4);
data << victim->GetGUID();
data << GetGUID();
data << uint32(i_spellProto->Id);
@@ -3353,6 +3353,12 @@ void Unit::RemoveOwnedAura(Aura* aura, AuraRemoveMode removeMode)
ASSERT(aura->GetOwner() == this);
+ if (removeMode == AURA_REMOVE_NONE)
+ {
+ TC_LOG_ERROR("spells", "Unit::RemoveOwnedAura() called with unallowed removeMode AURA_REMOVE_NONE, spellId %u", aura->GetId());
+ return;
+ }
+
uint32 spellId = aura->GetId();
AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
@@ -4797,7 +4803,7 @@ void Unit::SendPeriodicAuraLog(SpellPeriodicAuraLogInfo* pInfo)
void Unit::SendSpellMiss(Unit* target, uint32 spellID, SpellMissInfo missInfo)
{
- WorldPacket data(SMSG_SPELLLOGMISS, (4+8+1+4+8+1));
+ WorldPacket data(SMSG_SPELL_MISS_LOG, (4+8+1+4+8+1));
data << uint32(spellID);
data << GetGUID();
data << uint8(0); // can be 0 or 1
@@ -4821,7 +4827,7 @@ void Unit::SendSpellDamageResist(Unit* target, uint32 spellId)
void Unit::SendSpellDamageImmune(Unit* target, uint32 spellId)
{
- WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8+8+4+1);
+ WorldPacket data(SMSG_SPELL_OR_DAMAGE_IMMUNE, 8+8+4+1);
data << GetGUID();
data << target->GetGUID();
data << uint32(spellId);
@@ -8036,7 +8042,7 @@ void Unit::UnsummonAllTotems()
void Unit::SendHealSpellLog(Unit* victim, uint32 SpellID, uint32 Damage, uint32 OverHeal, uint32 Absorb, bool critical)
{
// we guess size
- WorldPacket data(SMSG_SPELLHEALLOG, 8 + 8 + 4 + 4 + 4 + 4 + 1 + 1);
+ WorldPacket data(SMSG_SPELL_HEAL_LOG, 8 + 8 + 4 + 4 + 4 + 4 + 1 + 1);
data << victim->GetPackGUID();
data << GetPackGUID();
data << uint32(SpellID);
@@ -8061,7 +8067,7 @@ int32 Unit::HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHeal
void Unit::SendEnergizeSpellLog(Unit* victim, uint32 spellId, int32 damage, Powers powerType)
{
- WorldPacket data(SMSG_SPELLENERGIZELOG, (8+8+4+4+4+1));
+ WorldPacket data(SMSG_SPELL_ENERGIZE_LOG, (8+8+4+4+4+1));
data << victim->GetPackGUID();
data << GetPackGUID();
data << uint32(spellId);
@@ -8573,7 +8579,7 @@ float Unit::GetUnitSpellCriticalChance(Unit* victim, SpellInfo const* spellProto
{
crit_chance *= 1.5f;
if (AuraEffect const* eff = (*i)->GetBase()->GetEffect(EFFECT_1))
- crit_chance += (*i)->GetAmount();
+ crit_chance += eff->GetAmount();
}
break;
case 7917: // Glyph of Shadowburn
@@ -10374,15 +10380,15 @@ void Unit::SetSpeed(UnitMoveType mtype, float rate, bool forced)
// Spline packets are for creatures and move_update are for players
static OpcodeServer const moveTypeToOpcode[MAX_MOVE_TYPE][3] =
{
- {SMSG_SPLINE_MOVE_SET_WALK_SPEED, SMSG_MOVE_SET_WALK_SPEED, SMSG_MOVE_UPDATE_WALK_SPEED },
- {SMSG_SPLINE_MOVE_SET_RUN_SPEED, SMSG_MOVE_SET_RUN_SPEED, SMSG_MOVE_UPDATE_RUN_SPEED },
- {SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED, SMSG_MOVE_SET_RUN_BACK_SPEED, SMSG_MOVE_UPDATE_RUN_BACK_SPEED },
- {SMSG_SPLINE_MOVE_SET_SWIM_SPEED, SMSG_MOVE_SET_SWIM_SPEED, SMSG_MOVE_UPDATE_SWIM_SPEED },
- {SMSG_SPLINE_MOVE_SET_SWIM_BACK_SPEED, SMSG_MOVE_SET_SWIM_BACK_SPEED, SMSG_MOVE_UPDATE_SWIM_BACK_SPEED },
- {SMSG_SPLINE_MOVE_SET_TURN_RATE, SMSG_MOVE_SET_TURN_RATE, SMSG_MOVE_UPDATE_TURN_RATE },
- {SMSG_SPLINE_MOVE_SET_FLIGHT_SPEED, SMSG_MOVE_SET_FLIGHT_SPEED, SMSG_MOVE_UPDATE_FLIGHT_SPEED },
- {SMSG_SPLINE_MOVE_SET_FLIGHT_BACK_SPEED, SMSG_MOVE_SET_FLIGHT_BACK_SPEED, SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED},
- {SMSG_SPLINE_MOVE_SET_PITCH_RATE, SMSG_MOVE_SET_PITCH_RATE, SMSG_MOVE_UPDATE_PITCH_RATE },
+ {SMSG_MOVE_SPLINE_SET_WALK_SPEED, SMSG_MOVE_SET_WALK_SPEED, SMSG_MOVE_UPDATE_WALK_SPEED },
+ {SMSG_MOVE_SPLINE_SET_RUN_SPEED, SMSG_MOVE_SET_RUN_SPEED, SMSG_MOVE_UPDATE_RUN_SPEED },
+ {SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED, SMSG_MOVE_SET_RUN_BACK_SPEED, SMSG_MOVE_UPDATE_RUN_BACK_SPEED },
+ {SMSG_MOVE_SPLINE_SET_SWIM_SPEED, SMSG_MOVE_SET_SWIM_SPEED, SMSG_MOVE_UPDATE_SWIM_SPEED },
+ {SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED, SMSG_MOVE_SET_SWIM_BACK_SPEED, SMSG_MOVE_UPDATE_SWIM_BACK_SPEED },
+ {SMSG_MOVE_SPLINE_SET_TURN_RATE, SMSG_MOVE_SET_TURN_RATE, SMSG_MOVE_UPDATE_TURN_RATE },
+ {SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED, SMSG_MOVE_SET_FLIGHT_SPEED, SMSG_MOVE_UPDATE_FLIGHT_SPEED },
+ {SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED, SMSG_MOVE_SET_FLIGHT_BACK_SPEED, SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED},
+ {SMSG_MOVE_SPLINE_SET_PITCH_RATE, SMSG_MOVE_SET_PITCH_RATE, SMSG_MOVE_UPDATE_PITCH_RATE },
};
if (GetTypeId() == TYPEID_PLAYER)
@@ -12195,6 +12201,7 @@ void Unit::ProcDamageAndSpellFor(bool isVictim, Unit* target, uint32 procFlag, u
uint32 Id = i->aura->GetId();
AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
+ ASSERT(aurApp);
bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
@@ -13774,9 +13781,9 @@ void Unit::SetRooted(bool apply, bool packetOnly /*= false*/)
}
if (apply)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_ROOT, SMSG_MOVE_ROOT, SMSG_MOVE_ROOT).Send();
+ Movement::PacketSender(this, SMSG_MOVE_SPLINE_ROOT, SMSG_MOVE_ROOT, SMSG_MOVE_ROOT).Send();
else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_UNROOT, SMSG_MOVE_UNROOT, SMSG_MOVE_UNROOT).Send();
+ Movement::PacketSender(this, SMSG_MOVE_SPLINE_UNROOT, SMSG_MOVE_UNROOT, SMSG_MOVE_UNROOT).Send();
}
void Unit::SetFeared(bool apply)
@@ -15876,9 +15883,9 @@ bool Unit::SetWalk(bool enable)
///@ TODO: Find proper opcode for walk mode setting in player mind controlling a player case
if (enable)
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_WALK_MODE, SMSG_SPLINE_MOVE_SET_WALK_MODE).Send();
+ Movement::PacketSender(this, SMSG_MOVE_SPLINE_SET_WALK_MODE, SMSG_MOVE_SPLINE_SET_WALK_MODE).Send();
else
- Movement::PacketSender(this, SMSG_SPLINE_MOVE_SET_RUN_MODE, SMSG_SPLINE_MOVE_SET_RUN_MODE).Send();
+ Movement::PacketSender(this, SMSG_MOVE_SPLINE_SET_RUN_MODE, SMSG_MOVE_SPLINE_SET_RUN_MODE).Send();
return true;
}
@@ -15906,8 +15913,8 @@ bool Unit::SetDisableGravity(bool disable, bool packetOnly /*= false*/)
static OpcodeServer const gravityOpcodeTable[2][2] =
{
- {SMSG_SPLINE_MOVE_GRAVITY_ENABLE, SMSG_MOVE_GRAVITY_ENABLE },
- {SMSG_SPLINE_MOVE_GRAVITY_DISABLE, SMSG_MOVE_GRAVITY_DISABLE }
+ { SMSG_MOVE_SPLINE_ENABLE_GRAVITY, SMSG_MOVE_ENABLE_GRAVITY },
+ { SMSG_MOVE_SPLINE_DISABLE_GRAVITY, SMSG_MOVE_DISABLE_GRAVITY }
};
bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
@@ -15955,7 +15962,7 @@ bool Unit::SetSwim(bool enable)
else
RemoveUnitMovementFlag(MOVEMENTFLAG_SWIMMING);
- static OpcodeServer const swimOpcodeTable[2] = {SMSG_SPLINE_MOVE_STOP_SWIM, SMSG_SPLINE_MOVE_START_SWIM};
+ static OpcodeServer const swimOpcodeTable[2] = { SMSG_MOVE_SPLINE_STOP_SWIM, SMSG_MOVE_SPLINE_START_SWIM};
WorldPackets::Movement::MoveSplineSetFlag packet(swimOpcodeTable[enable]);
packet.MoverGUID = GetGUID();
@@ -15984,8 +15991,8 @@ bool Unit::SetCanFly(bool enable)
static OpcodeServer const flyOpcodeTable[2][2] =
{
- {SMSG_SPLINE_MOVE_UNSET_FLYING, SMSG_MOVE_UNSET_CAN_FLY },
- {SMSG_SPLINE_MOVE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY }
+ { SMSG_MOVE_SPLINE_UNSET_FLYING, SMSG_MOVE_UNSET_CAN_FLY },
+ { SMSG_MOVE_SPLINE_SET_FLYING, SMSG_MOVE_SET_CAN_FLY }
};
bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
@@ -16022,8 +16029,8 @@ bool Unit::SetWaterWalking(bool enable, bool packetOnly /*= false */)
static OpcodeServer const waterWalkingOpcodeTable[2][2] =
{
- {SMSG_SPLINE_MOVE_SET_LAND_WALK, SMSG_MOVE_LAND_WALK },
- {SMSG_SPLINE_MOVE_SET_WATER_WALK, SMSG_MOVE_WATER_WALK}
+ { SMSG_MOVE_SPLINE_SET_LAND_WALK, SMSG_MOVE_SET_LAND_WALK },
+ { SMSG_MOVE_SPLINE_SET_WATER_WALK, SMSG_MOVE_SET_WATER_WALK }
};
bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
@@ -16060,8 +16067,8 @@ bool Unit::SetFeatherFall(bool enable, bool packetOnly /*= false */)
static OpcodeServer const featherFallOpcodeTable[2][2] =
{
- {SMSG_SPLINE_MOVE_SET_NORMAL_FALL, SMSG_MOVE_NORMAL_FALL },
- {SMSG_SPLINE_MOVE_SET_FEATHER_FALL, SMSG_MOVE_FEATHER_FALL }
+ { SMSG_MOVE_SPLINE_SET_NORMAL_FALL, SMSG_MOVE_SET_NORMAL_FALL },
+ { SMSG_MOVE_SPLINE_SET_FEATHER_FALL, SMSG_MOVE_SET_FEATHER_FALL }
};
bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
@@ -16113,8 +16120,8 @@ bool Unit::SetHover(bool enable, bool packetOnly /*= false*/)
static OpcodeServer const hoverOpcodeTable[2][2] =
{
- {SMSG_SPLINE_MOVE_UNSET_HOVER, SMSG_MOVE_UNSET_HOVER },
- {SMSG_SPLINE_MOVE_SET_HOVER, SMSG_MOVE_SET_HOVER }
+ { SMSG_MOVE_SPLINE_UNSET_HOVER, SMSG_MOVE_UNSET_HOVER },
+ { SMSG_MOVE_SPLINE_SET_HOVER, SMSG_MOVE_SET_HOVER }
};
bool player = GetTypeId() == TYPEID_PLAYER && ToPlayer()->m_mover->GetTypeId() == TYPEID_PLAYER;
@@ -16164,7 +16171,7 @@ void Unit::SendSetPlayHoverAnim(bool enable)
void Unit::SendMovementSetSplineAnim(Movement::AnimType anim)
{
- WorldPacket data(SMSG_SPLINE_MOVE_SET_ANIM, 8 + 4);
+ WorldPacket data(SMSG_MOVE_SPLINE_SET_ANIM, 8 + 4);
data << GetPackGUID();
data << uint32(anim);
SendMessageToSet(&data, false);
@@ -16359,7 +16366,7 @@ void Unit::DestroyForPlayer(Player* target) const
{
if (bg->isArena())
{
- WorldPacket data(SMSG_ARENA_UNIT_DESTROYED, 8);
+ WorldPacket data(SMSG_DESTROY_ARENA_UNIT, 18);
data << GetGUID();
target->GetSession()->SendPacket(&data);
}
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index 270674fdba6..1b8c188afb4 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -723,7 +723,7 @@ enum UnitFlags2
};
/// Non Player Character flags
-enum NPCFlags
+enum NPCFlags : uint32
{
UNIT_NPC_FLAG_NONE = 0x00000000,
UNIT_NPC_FLAG_GOSSIP = 0x00000001, // 100%
@@ -755,7 +755,8 @@ enum NPCFlags
UNIT_NPC_FLAG_MAILBOX = 0x04000000, // mailbox
UNIT_NPC_FLAG_REFORGER = 0x08000000, // reforging
UNIT_NPC_FLAG_TRANSMOGRIFIER = 0x10000000, // transmogrification
- UNIT_NPC_FLAG_VAULTKEEPER = 0x20000000 // void storage
+ UNIT_NPC_FLAG_VAULTKEEPER = 0x20000000, // void storage
+ UNIT_NPC_FLAG_BLACK_MARKET = 0x80000000 // black market
};
enum MovementFlags
diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp
index b3411b59f26..d588d048d3d 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -187,7 +187,10 @@ LanguageDesc lang_description[LANGUAGES_COUNT] =
{ LANG_GNOMISH_BINARY, 0, 0 },
{ LANG_GOBLIN_BINARY, 0, 0 },
{ LANG_WORGEN, 69270, SKILL_LANG_WORGEN },
- { LANG_GOBLIN, 69269, SKILL_LANG_GOBLIN }
+ { LANG_GOBLIN, 69269, SKILL_LANG_GOBLIN },
+ { LANG_PANDAREN_NEUTRAL, 108127, SKILL_LANG_PANDAREN_NEUTRAL },
+ { LANG_PANDAREN_ALLIANCE, 108130, SKILL_LANG_PANDAREN_ALLIANCE },
+ { LANG_PANDAREN_HORDE, 108131, SKILL_LANG_PANDAREN_HORDE }
};
LanguageDesc const* GetLanguageDescByID(uint32 lang)
@@ -244,6 +247,7 @@ template<> ObjectGuidGenerator<HighGuid::Item>* ObjectMgr::GetGenerator() { retu
template<> ObjectGuidGenerator<HighGuid::GameObject>* ObjectMgr::GetGenerator() { return &_gameObjectGuidGenerator; }
template<> ObjectGuidGenerator<HighGuid::DynamicObject>* ObjectMgr::GetGenerator() { return &_dynamicObjectGuidGenerator; }
template<> ObjectGuidGenerator<HighGuid::Corpse>* ObjectMgr::GetGenerator() { return &_corpseGuidGenerator; }
+template<> ObjectGuidGenerator<HighGuid::LootObject>* ObjectMgr::GetGenerator() { return &_lootObjectGuidGenerator; }
template<> ObjectGuidGenerator<HighGuid::AreaTrigger>* ObjectMgr::GetGenerator() { return &_areaTriggerGuidGenerator; }
template<> ObjectGuidGenerator<HighGuid::Transport>* ObjectMgr::GetGenerator() { return &_moTransportGuidGenerator; }
@@ -484,9 +488,9 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields)
creatureTemplate.GossipMenuId = fields[14].GetUInt32();
creatureTemplate.minlevel = fields[15].GetInt16();
creatureTemplate.maxlevel = fields[16].GetInt16();
- creatureTemplate.expansion = uint32(fields[17].GetInt16());
- creatureTemplate.expansionUnknown = uint32(fields[18].GetUInt16());
- creatureTemplate.faction = uint32(fields[19].GetUInt16());
+ creatureTemplate.expansion = fields[17].GetInt16();
+ creatureTemplate.expansionUnknown = fields[18].GetUInt16();
+ creatureTemplate.faction = fields[19].GetUInt16();
creatureTemplate.npcflag = fields[20].GetUInt32();
creatureTemplate.speed_walk = fields[21].GetFloat();
creatureTemplate.speed_run = fields[22].GetFloat();
@@ -978,7 +982,7 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo)
{
const_cast<CreatureTemplate*>(cInfo)->minlevel = (MAX_LEVEL + cInfo->minlevel);
const_cast<CreatureTemplate*>(cInfo)->maxlevel = (MAX_LEVEL + cInfo->maxlevel);
- const_cast<CreatureTemplate*>(cInfo)->expansion = EXPANSION_WARLORDS_OF_DRAENOR;
+ const_cast<CreatureTemplate*>(cInfo)->expansion = CURRENT_EXPANSION;
}
if (cInfo->minlevel < 1 || cInfo->minlevel > STRONG_MAX_LEVEL)
@@ -3285,56 +3289,59 @@ void ObjectMgr::LoadPlayerInfo()
{
uint32 oldMSTime = getMSTime();
- _playerXPperLevel.resize(sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL));
- for (uint8 level = 0; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
- _playerXPperLevel[level] = 0;
+ _playerXPperLevel.resize(sGtOCTLevelExperienceStore.GetTableRowCount() + 1, 0);
- // 0 1
- QueryResult result = WorldDatabase.Query("SELECT lvl, xp_for_next_level FROM player_xp_for_level");
+ // 0 1
+ QueryResult result = WorldDatabase.Query("SELECT Level, Experience FROM player_xp_for_level");
- if (!result)
+ // load the DBC's levels at first...
+ GtOCTLevelExperienceEntry const* exp;
+ for (uint32 level = 0; level < sGtOCTLevelExperienceStore.GetTableRowCount(); ++level)
{
- TC_LOG_ERROR("server.loading", ">> Loaded 0 xp for level definitions. DB table `player_xp_for_level` is empty.");
- exit(1);
+ exp = sGtOCTLevelExperienceStore.EvaluateTable(level, 0);
+ _playerXPperLevel[level + 1] = exp->Data;
}
uint32 count = 0;
- do
+ // ...overwrite if needed (custom values)
+ if (result)
{
- Field* fields = result->Fetch();
+ do
+ {
+ Field* fields = result->Fetch();
- uint32 current_level = fields[0].GetUInt8();
- uint32 current_xp = fields[1].GetUInt32();
+ uint32 current_level = fields[0].GetUInt8();
+ uint32 current_xp = fields[1].GetUInt32();
- if (current_level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
- {
- if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
- TC_LOG_ERROR("sql.sql", "Wrong (> %u) level %u in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL, current_level);
- else
+ if (current_level >= sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL))
{
- TC_LOG_INFO("misc", "Unused (> MaxPlayerLevel in worldserver.conf) level %u in `player_xp_for_levels` table, ignoring.", current_level);
- ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
+ if (current_level > STRONG_MAX_LEVEL) // hardcoded level maximum
+ TC_LOG_ERROR("sql.sql", "Wrong (> %u) level %u in `player_xp_for_level` table, ignoring.", STRONG_MAX_LEVEL, current_level);
+ else
+ {
+ TC_LOG_INFO("misc", "Unused (> MaxPlayerLevel in worldserver.conf) level %u in `player_xp_for_level` table, ignoring.", current_level);
+ ++count; // make result loading percent "expected" correct in case disabled detail mode for example.
+ }
+ continue;
}
- continue;
- }
- //PlayerXPperLevel
- _playerXPperLevel[current_level] = current_xp;
- ++count;
+ //PlayerXPperLevel
+ _playerXPperLevel[current_level] = current_xp;
+ ++count;
+ } while (result->NextRow());
}
- while (result->NextRow());
- // fill level gaps
+ // fill level gaps - only accounting levels > MAX_LEVEL
for (uint8 level = 1; level < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL); ++level)
{
if (_playerXPperLevel[level] == 0)
{
- TC_LOG_ERROR("sql.sql", "Level %i does not have XP for level data. Using data of level [%i] + 100.", level + 1, level);
- _playerXPperLevel[level] = _playerXPperLevel[level - 1] + 100;
+ TC_LOG_ERROR("sql.sql", "Level %i does not have XP for level data. Using data of level [%i] + 12000.", level + 1, level);
+ _playerXPperLevel[level] = _playerXPperLevel[level - 1] + 12000;
}
}
- TC_LOG_INFO("server.loading", ">> Loaded %u xp for level definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
+ TC_LOG_INFO("server.loading", ">> Loaded %u xp for level definition(s) from database in %u ms", count, GetMSTimeDiffToNow(oldMSTime));
}
}
@@ -8364,7 +8371,7 @@ CreatureBaseStats const* ObjectMgr::GetCreatureBaseStats(uint8 level, uint8 unit
void ObjectMgr::LoadCreatureClassLevelStats()
{
uint32 oldMSTime = getMSTime();
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 16
+ // 0 1 2 3 4 5 6 7 8 9 10 11
QueryResult result = WorldDatabase.Query("SELECT level, class, basemana, basearmor, attackpower, rangedattackpower, damage_base, damage_exp1, damage_exp2, damage_exp3, damage_exp4, damage_exp5 FROM creature_classlevelstats");
if (!result)
diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h
index 95bbe693335..579cc7a5d4e 100644
--- a/src/server/game/Globals/ObjectMgr.h
+++ b/src/server/game/Globals/ObjectMgr.h
@@ -1320,6 +1320,7 @@ class ObjectMgr
ObjectGuidGenerator<HighGuid::GameObject> _gameObjectGuidGenerator;
ObjectGuidGenerator<HighGuid::DynamicObject> _dynamicObjectGuidGenerator;
ObjectGuidGenerator<HighGuid::Corpse> _corpseGuidGenerator;
+ ObjectGuidGenerator<HighGuid::LootObject> _lootObjectGuidGenerator;
ObjectGuidGenerator<HighGuid::AreaTrigger> _areaTriggerGuidGenerator;
ObjectGuidGenerator<HighGuid::Transport> _moTransportGuidGenerator;
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index 41f432810ed..97450ec3f92 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -553,7 +553,7 @@ bool Group::RemoveMember(ObjectGuid guid, const RemoveMethod& method /*= GROUP_R
}
// Do we really need to send this opcode?
- data.Initialize(SMSG_GROUP_LIST, 1+1+1+1+8+4+4+8);
+ data.Initialize(SMSG_PARTY_UPDATE, 1+1+1+1+8+4+4+8);
data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
player->GetSession()->SendPacket(&data);
@@ -707,7 +707,7 @@ void Group::ChangeLeader(ObjectGuid newLeaderGuid)
m_leaderName = newLeader->GetName();
ToggleGroupMemberFlag(slot, MEMBER_FLAG_ASSISTANT, false);
- WorldPacket data(SMSG_GROUP_SET_LEADER, m_leaderName.size()+1);
+ WorldPacket data(SMSG_GROUP_NEW_LEADER, m_leaderName.size()+1);
data << slot->name;
BroadcastPacket(&data, true);
}
@@ -757,7 +757,7 @@ void Group::Disband(bool hideDestroy /* = false */)
}
else
{
- data.Initialize(SMSG_GROUP_LIST, 1+1+1+1+8+4+4+8);
+ data.Initialize(SMSG_PARTY_UPDATE, 1+1+1+1+8+4+4+8);
data << uint8(0x10) << uint8(0) << uint8(0) << uint8(0);
data << m_guid << uint32(m_counter) << uint32(0) << uint64(0);
player->GetSession()->SendPacket(&data);
@@ -805,7 +805,7 @@ void Group::Disband(bool hideDestroy /* = false */)
void Group::SendLootStartRoll(uint32 countDown, uint32 mapid, const Roll &r)
{
- WorldPacket data(SMSG_LOOT_START_ROLL, (8+4+4+4+4+4+4+1));
+ WorldPacket data(SMSG_START_LOOT_ROLL, (8+4+4+4+4+4+4+1));
data << r.itemGUID; // guid of rolled item
data << uint32(mapid); // 3.3.3 mapid
data << uint32(r.itemSlot); // itemslot
@@ -833,7 +833,7 @@ void Group::SendLootStartRollToPlayer(uint32 countDown, uint32 mapId, Player* p,
if (!p || !p->GetSession())
return;
- WorldPacket data(SMSG_LOOT_START_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
+ WorldPacket data(SMSG_START_LOOT_ROLL, (8 + 4 + 4 + 4 + 4 + 4 + 4 + 1));
data << r.itemGUID; // guid of rolled item
data << uint32(mapId); // 3.3.3 mapid
data << uint32(r.itemSlot); // itemslot
@@ -1388,7 +1388,7 @@ void Group::CountTheRoll(Rolls::iterator rollI)
item->is_looted = true;
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
roll->getLoot()->unlootedCount--;
- player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, item->GetAllowedLooters());
+ player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, item->GetAllowedLooters(), item->BonusListIDs);
}
else
{
@@ -1440,7 +1440,7 @@ void Group::CountTheRoll(Rolls::iterator rollI)
item->is_looted = true;
roll->getLoot()->NotifyItemRemoved(roll->itemSlot);
roll->getLoot()->unlootedCount--;
- player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, item->GetAllowedLooters());
+ player->StoreNewItem(dest, roll->itemid, true, item->randomPropertyId, item->GetAllowedLooters(), item->BonusListIDs);
}
else
{
@@ -1504,7 +1504,7 @@ void Group::SetTargetIcon(uint8 id, ObjectGuid whoGuid, ObjectGuid targetGuid)
m_targetIcons[id] = targetGuid;
- WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+8+1+8));
+ WorldPacket data(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, (1+8+1+8));
data << uint8(0); // set targets
data << whoGuid;
data << uint8(id);
@@ -1517,7 +1517,7 @@ void Group::SendTargetIconList(WorldSession* session)
if (!session)
return;
- WorldPacket data(MSG_RAID_TARGET_UPDATE, (1+TARGETICONCOUNT*9));
+ WorldPacket data(SMSG_SEND_RAID_TARGET_UPDATE_ALL, (1+TARGETICONCOUNT*9));
data << uint8(1); // list targets
for (uint8 i = 0; i < TARGETICONCOUNT; ++i)
@@ -1556,7 +1556,7 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot)
slot = &(*witr);
}
- WorldPacket data(SMSG_GROUP_LIST, (1+1+1+1+1+4+8+4+4+(GetMembersCount()-1)*(13+8+1+1+1+1)+8+1+8+1+1+1+1));
+ WorldPacket data(SMSG_PARTY_UPDATE, (1+1+1+1+1+4+8+4+4+(GetMembersCount()-1)*(13+8+1+1+1+1)+8+1+8+1+1+1+1));
data << uint8(m_groupType); // group type (flags in 3.3)
data << uint8(slot->group);
data << uint8(slot->flags);
@@ -1671,7 +1671,7 @@ void Group::OfflineReadyCheck()
Player* player = ObjectAccessor::FindConnectedPlayer(citr->guid);
if (!player || !player->GetSession())
{
- WorldPacket data(SMSG_RAID_READY_CHECK_CONFIRM, 9);
+ WorldPacket data(SMSG_READY_CHECK_RESPONSE, 9);
data << citr->guid;
data << uint8(0);
BroadcastReadyCheck(&data);
@@ -2003,7 +2003,7 @@ Difficulty Group::GetDifficultyID(MapEntry const* mapEntry) const
if (!mapEntry->IsRaid())
return m_dungeonDifficulty;
- MapDifficulty const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID);
+ MapDifficultyEntry const* defaultDifficulty = GetDefaultMapDifficulty(mapEntry->ID);
if (!defaultDifficulty)
return m_legacyRaidDifficulty;
diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp
index 7d7f68e87e9..44888c7bd6b 100644
--- a/src/server/game/Guilds/Guild.cpp
+++ b/src/server/game/Guilds/Guild.cpp
@@ -116,11 +116,11 @@ void Guild::SendCommandResult(WorldSession* session, GuildCommandType type, Guil
void Guild::SendSaveEmblemResult(WorldSession* session, GuildEmblemError errCode)
{
- WorldPacket data(MSG_SAVE_GUILD_EMBLEM, 4);
+ WorldPacket data(SMSG_SAVE_GUILD_EMBLEM, 4);
data << uint32(errCode);
session->SendPacket(&data);
- TC_LOG_DEBUG("guild", "MSG_SAVE_GUILD_EMBLEM [%s] Code: %u", session->GetPlayerInfo().c_str(), errCode);
+ TC_LOG_DEBUG("guild", "SMSG_SAVE_GUILD_EMBLEM [%s] Code: %u", session->GetPlayerInfo().c_str(), errCode);
}
// LogHolder
@@ -1366,7 +1366,7 @@ bool Guild::SetName(std::string const& name)
CharacterDatabase.Execute(stmt);
ObjectGuid guid = GetGUID();
- WorldPacket data(SMSG_GUILD_RENAMED, 24 + 8 + 1);
+ WorldPacket data(SMSG_GUILD_NAME_CHANGED, 24 + 8 + 1);
data.WriteBit(guid[5]);
data.WriteBits(name.length(), 8);
data.WriteBit(guid[4]);
@@ -1507,7 +1507,7 @@ void Guild::SendQueryResponse(WorldSession* session)
void Guild::SendGuildRankInfo(WorldSession* session) const
{
ByteBuffer rankData(100);
- WorldPacket data(SMSG_GUILD_RANK, 100);
+ WorldPacket data(SMSG_GUILD_RANKS, 100);
data.WriteBits(_GetRanksSize(), 18);
@@ -1550,19 +1550,20 @@ void Guild::HandleSetAchievementTracking(WorldSession* session, std::set<uint32>
{
std::set<uint32> criteriaIds;
- /*
- for (std::set<uint32>::iterator achievementId = achievementIds.begin(); achievementId != achievementIds.end(); ++achievementId)
+ for (uint32 achievementId : achievementIds)
{
- if (AchievementCriteriaEntryList const* cList = sAchievementMgr->GetAchievementCriteriaByAchievement(*achievementId))
+ if (AchievementEntry const* achievement = sAchievementMgr->GetAchievement(achievementId))
{
- for (AchievementCriteriaEntryList::const_iterator itr = cList->begin(); itr != cList->end(); ++itr)
+ if (AchievementCriteriaTree const* tree = sAchievementMgr->GetAchievementCriteriaTree(achievement->CriteriaTree))
{
- AchievementCriteriaTree const* criteria = *itr;
- criteriaIds.insert(criteria->ID);
+ sAchievementMgr->WalkCriteriaTree(tree, [&criteriaIds](AchievementCriteriaTree const* node)
+ {
+ if (node->Criteria)
+ criteriaIds.insert(node->Criteria->ID);
+ });
}
}
}
- */
member->SetTrackedCriteriaIds(criteriaIds);
m_achievementMgr.SendAllTrackedCriterias(player, member->GetTrackedCriteriaIds());
@@ -1950,6 +1951,7 @@ void Guild::HandleUpdateMemberRank(WorldSession* session, ObjectGuid guid, bool
}
Member const* memberMe = GetMember(player->GetGUID());
+ ASSERT(memberMe);
uint8 rankId = memberMe->GetRankId();
if (demote)
{
@@ -1988,6 +1990,8 @@ void Guild::HandleSetMemberRank(WorldSession* session, ObjectGuid targetGuid, Ob
{
Player* player = session->GetPlayer();
Member* member = GetMember(targetGuid);
+ if (!member)
+ return;
GuildRankRights rights = GR_RIGHT_PROMOTE;
GuildCommandType type = GUILD_COMMAND_PROMOTE;
@@ -2190,7 +2194,7 @@ void Guild::HandleGuildRequestChallengeUpdate(WorldSession* session)
void Guild::SendEventLog(WorldSession* session) const
{
- WorldPacket data(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, 1 + m_eventLog->GetSize() * (1 + 8 + 4));
+ WorldPacket data(SMSG_GUILD_EVENT_LOG_QUERY_RESULTS, 1 + m_eventLog->GetSize() * (1 + 8 + 4));
m_eventLog->WritePacket(data);
session->SendPacket(&data);
TC_LOG_DEBUG("guild", "SMSG_GUILD_EVENT_LOG_QUERY_RESULT [%s]", session->GetPlayerInfo().c_str());
@@ -2638,7 +2642,7 @@ void Guild::BroadcastPacket(WorldPacket const* packet) const
player->GetSession()->SendPacket(packet);
}
-void Guild::BroadcastPacketIfTrackingAchievement(WorldPacket* packet, uint32 criteriaId) const
+void Guild::BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint32 criteriaId) const
{
for (Members::const_iterator itr = m_members.begin(); itr != m_members.end(); ++itr)
if (itr->second->IsTrackingCriteriaId(criteriaId))
@@ -3489,7 +3493,7 @@ void Guild::SendGuildRanksUpdate(ObjectGuid setterGuid, ObjectGuid targetGuid, u
Member* member = GetMember(targetGuid);
ASSERT(member);
- WorldPacket data(SMSG_GUILD_RANKS_UPDATE, 100);
+ WorldPacket data(SMSG_GUILD_SEND_RANK_CHANGE, 100);
data.WriteBit(setterGuid[7]);
data.WriteBit(setterGuid[2]);
data.WriteBit(targetGuid[2]);
diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h
index 971ead81c3a..c20146d7bd1 100644
--- a/src/server/game/Guilds/Guild.h
+++ b/src/server/game/Guilds/Guild.h
@@ -847,7 +847,7 @@ public:
void BroadcastAddonToGuild(WorldSession* session, bool officerOnly, std::string const& msg, std::string const& prefix) const;
void BroadcastPacketToRank(WorldPacket* packet, uint8 rankId) const;
void BroadcastPacket(WorldPacket const* packet) const;
- void BroadcastPacketIfTrackingAchievement(WorldPacket* packet, uint32 criteriaId) const;
+ void BroadcastPacketIfTrackingAchievement(WorldPacket const* packet, uint32 criteriaId) const;
void MassInviteToEvent(WorldSession* session, uint32 minLevel, uint32 maxLevel, uint32 minRank);
diff --git a/src/server/game/Handlers/AuctionHouseHandler.cpp b/src/server/game/Handlers/AuctionHouseHandler.cpp
index 0cabbf3f220..bef8aa2fdb4 100644
--- a/src/server/game/Handlers/AuctionHouseHandler.cpp
+++ b/src/server/game/Handlers/AuctionHouseHandler.cpp
@@ -33,15 +33,12 @@
#include "AuctionHousePackets.h"
//void called when player click on auctioneer npc
-void WorldSession::HandleAuctionHelloOpcode(WorldPacket& recvData)
+void WorldSession::HandleAuctionHelloOpcode(WorldPackets::AuctionHouse::AuctionHelloRequest& packet)
{
- ObjectGuid guid; //NPC guid
- recvData >> guid;
-
- Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_AUCTIONEER);
+ Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Guid, UNIT_NPC_FLAG_AUCTIONEER);
if (!unit)
{
- TC_LOG_DEBUG("network", "WORLD: HandleAuctionHelloOpcode - Unit (%s) not found or you can't interact with him.", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: HandleAuctionHelloOpcode - Unit (%s) not found or you can't interact with him.", packet.Guid.ToString().c_str());
return;
}
@@ -49,7 +46,7 @@ void WorldSession::HandleAuctionHelloOpcode(WorldPacket& recvData)
if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
- SendAuctionHello(guid, unit);
+ SendAuctionHello(packet.Guid, unit);
}
//this void causes that auction window is opened
@@ -65,11 +62,10 @@ void WorldSession::SendAuctionHello(ObjectGuid guid, Creature* unit)
if (!ahEntry)
return;
- WorldPacket data(SMSG_AUCTION_HELLO, 12);
- data << guid;
- data << uint32(ahEntry->ID);
- data << uint8(1); // 3.3.3: 1 - AH enabled, 0 - AH disabled
- SendPacket(&data);
+ WorldPackets::AuctionHouse::AuctionHelloResponse auctionHelloResponse;
+ auctionHelloResponse.Guid = guid;
+ auctionHelloResponse.OpenForBusiness = true; // 3.3.3: 1 - AH enabled, 0 - AH disabled
+ SendPacket(auctionHelloResponse.Write());
}
void WorldSession::SendAuctionCommandResult(AuctionEntry* auction, uint32 action, uint32 errorCode, uint32 /*bidError = 0*/)
@@ -625,7 +621,7 @@ void WorldSession::HandleAuctionListBidderItems(WorldPacket& recvData)
AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction());
- WorldPacket data(SMSG_AUCTION_BIDDER_LIST_RESULT, (4+4+4));
+ WorldPacket data(SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, (4+4+4));
Player* player = GetPlayer();
data << uint32(0); //add 0 as count
uint32 count = 0;
@@ -674,7 +670,7 @@ void WorldSession::HandleAuctionListOwnerItems(WorldPacket& recvData)
AuctionHouseObject* auctionHouse = sAuctionMgr->GetAuctionsMap(creature->getFaction());
- WorldPacket data(SMSG_AUCTION_OWNER_LIST_RESULT, (4+4+4));
+ WorldPacket data(SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, (4+4+4));
data << uint32(0); // amount place holder
uint32 count = 0;
@@ -759,7 +755,7 @@ void WorldSession::HandleAuctionListPendingSales(WorldPacket& recvData)
uint32 count = 0;
- WorldPacket data(SMSG_AUCTION_LIST_PENDING_SALES, 4);
+ WorldPacket data(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, 4);
data << uint32(count); // count
/*for (uint32 i = 0; i < count; ++i)
{
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 8ec6779f2bb..cf6d599eb04 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -297,7 +297,7 @@ void WorldSession::HandleBattlegroundPlayerPositionsOpcode(WorldPacket& /*recvDa
ObjectGuid aguid = aplr ? aplr->GetGUID() : ObjectGuid::Empty;
ObjectGuid hguid = hplr ? hplr->GetGUID() : ObjectGuid::Empty;
- WorldPacket data(SMSG_BATTLEFIELD_PLAYER_POSITIONS);
+ WorldPacket data(SMSG_BATTLEGROUND_PLAYER_POSITIONS);
data.WriteBits(acount, 22);
for (uint8 i = 0; i < acount; i++)
@@ -599,7 +599,7 @@ void WorldSession::HandleBattlefieldLeaveOpcode(WorldPacket& /*recvData*/)
_player->LeaveBattleground();
}
-void WorldSession::HandleBattlefieldStatusOpcode(WorldPacket & /*recvData*/)
+void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPacket& /*recvData*/)
{
// empty opcode
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_BATTLEFIELD_STATUS Message");
diff --git a/src/server/game/Handlers/BlackMarketHandler.cpp b/src/server/game/Handlers/BlackMarketHandler.cpp
new file mode 100644
index 00000000000..0520d1e18f3
--- /dev/null
+++ b/src/server/game/Handlers/BlackMarketHandler.cpp
@@ -0,0 +1,46 @@
+/*
+* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+*
+* 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 "BlackMarketPackets.h"
+#include "ObjectMgr.h"
+#include "Player.h"
+#include "WorldPacket.h"
+#include "WorldSession.h"
+
+void WorldSession::HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen& packet)
+{
+ Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(packet.Guid, UNIT_NPC_FLAG_BLACK_MARKET);
+ if (!unit)
+ {
+ TC_LOG_DEBUG("network", "WORLD: HandleBlackMarketHello - Unit (GUID: %s) not found or you can't interact with him.", packet.Guid.ToString().c_str());
+ return;
+ }
+
+ // remove fake death
+ if (GetPlayer()->HasUnitState(UNIT_STATE_DIED))
+ GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH);
+
+ SendBlackMarketOpenResult(packet.Guid, unit);
+}
+
+void WorldSession::SendBlackMarketOpenResult(ObjectGuid guid, Creature* auctioneer)
+{
+ WorldPackets::BlackMarket::BlackMarketOpenResult packet;
+ packet.Guid = guid;
+ packet.Enable = false;
+ SendPacket(packet.Write());
+}
diff --git a/src/server/game/Handlers/CalendarHandler.cpp b/src/server/game/Handlers/CalendarHandler.cpp
index f2410f2ffd9..74df5b443bd 100644
--- a/src/server/game/Handlers/CalendarHandler.cpp
+++ b/src/server/game/Handlers/CalendarHandler.cpp
@@ -51,7 +51,7 @@ Copied events should probably have a new owner
void WorldSession::HandleCalendarGetCalendar(WorldPacket& /*recvData*/)
{
ObjectGuid guid = _player->GetGUID();
- TC_LOG_DEBUG("network", "CMSG_CALENDAR_GET_CALENDAR [%s]", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "CMSG_CALENDAR_GET [%s]", guid.ToString().c_str());
time_t currTime = time(NULL);
diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp
index 84e6ed34bb8..c255d786ce3 100644
--- a/src/server/game/Handlers/CharacterHandler.cpp
+++ b/src/server/game/Handlers/CharacterHandler.cpp
@@ -93,6 +93,10 @@ bool LoginQueryHolder::Initialize()
stmt->setUInt64(0, lowGuid);
res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AURAS, stmt);
+ stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_AURA_EFFECTS);
+ stmt->setUInt64(0, lowGuid);
+ res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_AURA_EFFECTS, stmt);
+
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHARACTER_SPELL);
stmt->setUInt64(0, lowGuid);
res &= SetPreparedQuery(PLAYER_LOGIN_QUERY_LOAD_SPELLS, stmt);
@@ -310,7 +314,7 @@ void WorldSession::HandleCharUndeleteEnum(PreparedQueryResult result)
SendPacket(charEnum.Write());
}
-void WorldSession::HandleCharUndeleteEnumOpcode(WorldPacket& /*recvData*/)
+void WorldSession::HandleCharUndeleteEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/)
{
/// get all the data necessary for loading all undeleted characters (along with their pets) on the account
PreparedStatement* stmt = nullptr;
@@ -1089,7 +1093,7 @@ void WorldSession::HandlePlayerLogin(LoginQueryHolder* holder)
void WorldSession::HandleSetFactionAtWar(WorldPacket& recvData)
{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_SET_FACTION_ATWAR");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_SET_FACTION_AT_WAR");
uint32 repListID;
uint8 flag;
@@ -2286,7 +2290,7 @@ void WorldSession::HandleOpeningCinematic(WorldPacket& /*recvData*/)
}
}
-void WorldSession::HandleUndeleteCooldownStatusQuery(WorldPacket& /*recvData*/)
+void WorldSession::HandleGetUndeleteCooldownStatus(WorldPackets::Character::GetUndeleteCooldownStatus& /*getCooldown*/)
{
/// empty result to force wait
PreparedQueryResultPromise result;
diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp
index 9f42c4591ea..0f010f5e21e 100644
--- a/src/server/game/Handlers/GroupHandler.cpp
+++ b/src/server/game/Handlers/GroupHandler.cpp
@@ -163,7 +163,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
if (group2)
{
// tell the player that they were invited but it failed as they were already in a group
- WorldPacket data(SMSG_GROUP_INVITE, 45);
+ WorldPacket data(SMSG_PARTY_INVITE, 45);
data.WriteBit(0);
@@ -265,7 +265,7 @@ void WorldSession::HandleGroupInviteOpcode(WorldPacket& recvData)
}
// ok, we do it
- WorldPacket data(SMSG_GROUP_INVITE, 45);
+ WorldPacket data(SMSG_PARTY_INVITE, 45);
data.WriteBit(0);
@@ -399,9 +399,9 @@ void WorldSession::HandleGroupInviteResponseOpcode(WorldPacket& recvData)
}
}
-void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket& recvData)
+void WorldSession::HandleGroupUninviteOpcode(WorldPacket& recvData)
{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_GROUP_UNINVITE_GUID");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_PARTY_UNINVITE");
ObjectGuid guid;
std::string reason;
@@ -442,52 +442,6 @@ void WorldSession::HandleGroupUninviteGuidOpcode(WorldPacket& recvData)
SendPartyResult(PARTY_OP_UNINVITE, "", ERR_TARGET_NOT_IN_GROUP_S);
}
-void WorldSession::HandleGroupUninviteOpcode(WorldPacket& recvData)
-{
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_GROUP_UNINVITE");
-
- std::string membername;
- recvData >> membername;
-
- // player not found
- if (!normalizePlayerName(membername))
- return;
-
- // can't uninvite yourself
- if (GetPlayer()->GetName() == membername)
- {
- TC_LOG_ERROR("network", "WorldSession::HandleGroupUninviteOpcode: leader %s (%s) tried to uninvite himself from the group.",
- GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str());
- return;
- }
-
- PartyResult res = GetPlayer()->CanUninviteFromGroup();
- if (res != ERR_PARTY_RESULT_OK)
- {
- SendPartyResult(PARTY_OP_UNINVITE, "", res);
- return;
- }
-
- Group* grp = GetPlayer()->GetGroup();
- if (!grp)
- return;
-
- ObjectGuid guid = grp->GetMemberGUID(membername);
- if (!guid.IsEmpty())
- {
- Player::RemoveFromGroup(grp, guid, GROUP_REMOVEMETHOD_KICK, GetPlayer()->GetGUID());
- return;
- }
-
- if (Player* player = grp->GetInvited(guid))
- {
- player->UninviteFromGroup();
- return;
- }
-
- SendPartyResult(PARTY_OP_UNINVITE, membername, ERR_TARGET_NOT_IN_GROUP_S);
-}
-
void WorldSession::HandleGroupSetLeaderOpcode(WorldPacket& recvData)
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_GROUP_SET_LEADER");
@@ -905,7 +859,7 @@ void WorldSession::HandlePartyAssignmentOpcode(WorldPacket& recvData)
void WorldSession::HandleRaidReadyCheckOpcode(WorldPacket& recvData)
{
- TC_LOG_DEBUG("network", "WORLD: Received MSG_RAID_READY_CHECK");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_DO_READY_CHECK");
Group* group = GetPlayer()->GetGroup();
if (!group)
@@ -919,7 +873,7 @@ void WorldSession::HandleRaidReadyCheckOpcode(WorldPacket& recvData)
/********************/
// everything's fine, do it
- WorldPacket data(MSG_RAID_READY_CHECK, 8);
+ WorldPacket data(SMSG_READY_CHECK_STARTED, 8);
data << GetPlayer()->GetGUID();
group->BroadcastPacket(&data, false, -1);
@@ -931,25 +885,13 @@ void WorldSession::HandleRaidReadyCheckOpcode(WorldPacket& recvData)
recvData >> state;
// everything's fine, do it
- WorldPacket data(SMSG_RAID_READY_CHECK_CONFIRM, 9);
+ WorldPacket data(SMSG_READY_CHECK_RESPONSE, 9);
data << GetPlayer()->GetGUID();
data << uint8(state);
group->BroadcastReadyCheck(&data);
}
}
-void WorldSession::HandleRaidReadyCheckFinishedOpcode(WorldPacket& /*recvData*/)
-{
- //Group* group = GetPlayer()->GetGroup();
- //if (!group)
- // return;
-
- //if (!group->IsLeader(GetPlayer()->GetGUID()) && !group->IsAssistant(GetPlayer()->GetGUID()))
- // return;
-
- // Is any reaction need?
-}
-
void WorldSession::BuildPartyMemberStatsChangedPacket(Player* player, WorldPacket* data)
{
uint32 mask = player->GetGroupUpdateFlag();
diff --git a/src/server/game/Handlers/GuildFinderHandler.cpp b/src/server/game/Handlers/GuildFinderHandler.cpp
index 663a4188e4e..76cca1c3954 100644
--- a/src/server/game/Handlers/GuildFinderHandler.cpp
+++ b/src/server/game/Handlers/GuildFinderHandler.cpp
@@ -98,19 +98,20 @@ void WorldSession::HandleGuildFinderBrowse(WorldPacket& recvPacket)
if (guildCount == 0)
{
- WorldPacket packet(SMSG_LF_GUILD_BROWSE_UPDATED, 0);
+ WorldPacket packet(SMSG_LF_GUILD_BROWSE, 0);
player->SendDirectMessage(&packet);
return;
}
ByteBuffer bufferData(65 * guildCount);
- WorldPacket data(SMSG_LF_GUILD_BROWSE_UPDATED, 3 + guildCount * 65); // Estimated size
+ WorldPacket data(SMSG_LF_GUILD_BROWSE, 3 + guildCount * 65); // Estimated size
data.WriteBits(guildCount, 19);
for (LFGuildStore::const_iterator itr = guildList.begin(); itr != guildList.end(); ++itr)
{
LFGuildSettings guildSettings = itr->second;
Guild* guild = sGuildMgr->GetGuildByGuid(itr->first);
+ ASSERT(guild);
ObjectGuid guildGUID = guild->GetGUID();
@@ -222,6 +223,7 @@ void WorldSession::HandleGuildFinderGetApplications(WorldPacket& /*recvPacket*/)
for (std::list<MembershipRequest>::const_iterator itr = applicatedGuilds.begin(); itr != applicatedGuilds.end(); ++itr)
{
Guild* guild = sGuildMgr->GetGuildByGuid(itr->GetGuildGuid());
+ ASSERT(guild);
LFGuildSettings guildSettings = sGuildFinderMgr->GetGuildSettings(itr->GetGuildGuid());
MembershipRequest request = *itr;
@@ -285,7 +287,7 @@ void WorldSession::HandleGuildFinderGetRecruits(WorldPacket& recvPacket)
uint32 recruitCount = recruitsList.size();
ByteBuffer dataBuffer(53 * recruitCount);
- WorldPacket data(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, 7 + 26 * recruitCount + 53 * recruitCount);
+ WorldPacket data(SMSG_LF_GUILD_RECRUITS, 7 + 26 * recruitCount + 53 * recruitCount);
data.WriteBits(recruitCount, 20);
for (std::vector<MembershipRequest>::const_iterator itr = recruitsList.begin(); itr != recruitsList.end(); ++itr)
@@ -353,7 +355,7 @@ void WorldSession::HandleGuildFinderPostRequest(WorldPacket& /*recvPacket*/)
LFGuildSettings settings = sGuildFinderMgr->GetGuildSettings(guild->GetGUID());
- WorldPacket data(SMSG_LF_GUILD_POST_UPDATED, 35);
+ WorldPacket data(SMSG_LF_GUILD_POST, 35);
data.WriteBit(isGuildMaster); // Guessed
if (isGuildMaster)
diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp
index be564135b86..103334db568 100644
--- a/src/server/game/Handlers/GuildHandler.cpp
+++ b/src/server/game/Handlers/GuildHandler.cpp
@@ -59,7 +59,7 @@ void WorldSession::HandleGuildInviteOpcode(WorldPacket& recvPacket)
guild->HandleInviteMember(this, invitedName);
}
-void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildOfficerRemoveMemberOpcode(WorldPacket& recvPacket)
{
ObjectGuid playerGuid;
@@ -81,7 +81,7 @@ void WorldSession::HandleGuildRemoveOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(playerGuid[3]);
recvPacket.ReadByteSeq(playerGuid[0]);
- TC_LOG_DEBUG("guild", "CMSG_GUILD_REMOVE [%s]: Target: %s", GetPlayerInfo().c_str(), playerGuid.ToString().c_str());
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_OFFICER_REMOVE_MEMBER [%s]: Target: %s", GetPlayerInfo().c_str(), playerGuid.ToString().c_str());
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleRemoveMember(this, playerGuid);
@@ -278,7 +278,7 @@ void WorldSession::HandleGuildSetNoteOpcode(WorldPacket& recvPacket)
guild->HandleSetMemberNote(this, note, playerGuid, ispublic);
}
-void WorldSession::HandleGuildQueryRanksOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildGetRanksOpcode(WorldPacket& recvPacket)
{
ObjectGuid guildGuid;
@@ -300,7 +300,7 @@ void WorldSession::HandleGuildQueryRanksOpcode(WorldPacket& recvPacket)
recvPacket.ReadByteSeq(guildGuid[6]);
recvPacket.ReadByteSeq(guildGuid[2]);
- TC_LOG_DEBUG("guild", "CMSG_GUILD_QUERY_RANKS [%s]: Guild: %s",
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_GET_RANKS [%s]: Guild: %s",
GetPlayerInfo().c_str(), guildGuid.ToString().c_str());
if (Guild* guild = sGuildMgr->GetGuildByGuid(guildGuid))
@@ -322,12 +322,12 @@ void WorldSession::HandleGuildAddRankOpcode(WorldPacket& recvPacket)
guild->HandleAddNewRank(this, rankName);
}
-void WorldSession::HandleGuildDelRankOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleGuildDeleteRankOpcode(WorldPacket& recvPacket)
{
uint32 rankId;
recvPacket >> rankId;
- TC_LOG_DEBUG("guild", "CMSG_GUILD_DEL_RANK [%s]: Rank: %u", GetPlayerInfo().c_str(), rankId);
+ TC_LOG_DEBUG("guild", "CMSG_GUILD_DELETE_RANK [%s]: Rank: %u", GetPlayerInfo().c_str(), rankId);
if (Guild* guild = GetPlayer()->GetGuild())
guild->HandleRemoveRank(this, rankId);
@@ -352,7 +352,7 @@ void WorldSession::HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket)
EmblemInfo emblemInfo;
emblemInfo.ReadPacket(recvPacket);
- TC_LOG_DEBUG("guild", "MSG_SAVE_GUILD_EMBLEM [%s]: Guid: [%s] Style: %d, Color: %d, BorderStyle: %d, BorderColor: %d, BackgroundColor: %d"
+ TC_LOG_DEBUG("guild", "CMSG_SAVE_GUILD_EMBLEM [%s]: Guid: [%s] Style: %d, Color: %d, BorderStyle: %d, BorderColor: %d, BackgroundColor: %d"
, GetPlayerInfo().c_str(), vendorGuid.ToString().c_str(), emblemInfo.GetStyle()
, emblemInfo.GetColor(), emblemInfo.GetBorderStyle()
, emblemInfo.GetBorderColor(), emblemInfo.GetBackgroundColor());
diff --git a/src/server/game/Handlers/ItemHandler.cpp b/src/server/game/Handlers/ItemHandler.cpp
index 921e883a4e4..d90cadaa119 100644
--- a/src/server/game/Handlers/ItemHandler.cpp
+++ b/src/server/game/Handlers/ItemHandler.cpp
@@ -327,7 +327,7 @@ void WorldSession::HandleReadItem(WorldPacket& recvData)
InventoryResult msg = _player->CanUseItem(pItem);
if (msg == EQUIP_ERR_OK)
{
- data.Initialize(SMSG_READ_ITEM_OK, 8);
+ data.Initialize(SMSG_READ_ITEM_RESULT_OK, 8);
TC_LOG_INFO("network", "STORAGE: Item page sent");
}
else
@@ -684,56 +684,45 @@ void WorldSession::SendListInventory(ObjectGuid vendorGuid)
SendPacket(packet.Write());
}
-void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData)
+void WorldSession::HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBagItem& packet)
{
- uint32 itemCount = recvData.ReadBits(2);
-
- if (itemCount)
+ if (!packet.Inv.Items.empty())
{
- TC_LOG_ERROR("network", "WORLD: HandleAutoStoreBagItemOpcode - Invalid itemCount (%u)", itemCount);
+ TC_LOG_ERROR("network", "HandleAutoStoreBagItemOpcode - Invalid itemCount (" SZFMTD ")", packet.Inv.Items.size());
return;
}
- /*for (uint32 i = 0; i < itemCount; ++i)
- {
- recvData.read_skip<uint8>();
- recvData.read_skip<uint8>();
- }*/
-
- //TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOSTORE_BAG_ITEM");
- uint8 srcbag, srcslot, dstbag;
+ TC_LOG_DEBUG("network", "HandleAutoStoreBagItemOpcode: receive ContainerSlotA: %u, SlotA: %u, ContainerSlotB: %u",
+ packet.ContainerSlotA, packet.SlotA, packet.ContainerSlotB);
- recvData >> srcbag >> dstbag >> srcslot;
- TC_LOG_DEBUG("network", "STORAGE: receive srcbag = %u, srcslot = %u, dstbag = %u", srcbag, srcslot, dstbag);
-
- Item* pItem = _player->GetItemByPos(srcbag, srcslot);
- if (!pItem)
+ Item* item = _player->GetItemByPos(packet.ContainerSlotA, packet.SlotA);
+ if (!item)
return;
- if (!_player->IsValidPos(dstbag, NULL_SLOT, false)) // can be autostore pos
+ if (!_player->IsValidPos(packet.ContainerSlotB, NULL_SLOT, false)) // can be autostore pos
{
- _player->SendEquipError(EQUIP_ERR_WRONG_SLOT, NULL, NULL);
+ _player->SendEquipError(EQUIP_ERR_WRONG_SLOT);
return;
}
- uint16 src = pItem->GetPos();
+ uint16 src = item->GetPos();
// check unequip potability for equipped items and bank bags
- if (_player->IsEquipmentPos (src) || _player->IsBagPos (src))
+ if (_player->IsEquipmentPos(src) || _player->IsBagPos(src))
{
- InventoryResult msg = _player->CanUnequipItem(src, !_player->IsBagPos (src));
+ InventoryResult msg = _player->CanUnequipItem(src, !_player->IsBagPos(src));
if (msg != EQUIP_ERR_OK)
{
- _player->SendEquipError(msg, pItem, NULL);
+ _player->SendEquipError(msg, item);
return;
}
}
ItemPosCountVec dest;
- InventoryResult msg = _player->CanStoreItem(dstbag, NULL_SLOT, dest, pItem, false);
+ InventoryResult msg = _player->CanStoreItem(packet.ContainerSlotB, NULL_SLOT, dest, item, false);
if (msg != EQUIP_ERR_OK)
{
- _player->SendEquipError(msg, pItem, NULL);
+ _player->SendEquipError(msg, item);
return;
}
@@ -741,12 +730,12 @@ void WorldSession::HandleAutoStoreBagItemOpcode(WorldPacket& recvData)
if (dest.size() == 1 && dest[0].pos == src)
{
// just remove grey item state
- _player->SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, pItem, NULL);
+ _player->SendEquipError(EQUIP_ERR_INTERNAL_BAG_ERROR, item);
return;
}
- _player->RemoveItem(srcbag, srcslot, true);
- _player->StoreItem(dest, pItem, true);
+ _player->RemoveItem(packet.ContainerSlotA, packet.SlotA, true);
+ _player->StoreItem(dest, item, true);
}
void WorldSession::HandleBuyBankSlotOpcode(WorldPacket& recvPacket)
@@ -885,7 +874,7 @@ void WorldSession::HandleAutoStoreBankItemOpcode(WorldPacket& recvPacket)
void WorldSession::SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId)
{
- WorldPacket data(SMSG_ENCHANTMENTLOG, (8+8+4+4));
+ WorldPacket data(SMSG_ENCHANTMENT_LOG, (8+8+4+4));
data << target.WriteAsPacked();
data << caster.WriteAsPacked();
data << uint32(itemId);
diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp
index 91353104be4..5e318219336 100644
--- a/src/server/game/Handlers/LootHandler.cpp
+++ b/src/server/game/Handlers/LootHandler.cpp
@@ -33,74 +33,77 @@
#include "LootPackets.h"
#include "WorldSession.h"
-void WorldSession::HandleAutostoreLootItemOpcode(WorldPacket& recvData)
+void WorldSession::HandleAutostoreLootItemOpcode(WorldPackets::Loot::AutoStoreLootItem& packet)
{
TC_LOG_DEBUG("network", "WORLD: CMSG_AUTOSTORE_LOOT_ITEM");
Player* player = GetPlayer();
ObjectGuid lguid = player->GetLootGUID();
- Loot* loot = NULL;
- uint8 lootSlot = 0;
-
- recvData >> lootSlot;
- if (lguid.IsGameObject())
+ /// @todo Implement looting by LootObject guid
+ for (WorldPackets::Loot::LootRequest const& req : packet.Loot)
{
- GameObject* go = player->GetMap()->GetGameObject(lguid);
+ Loot* loot = NULL;
- // not check distance for GO in case owned GO (fishing bobber case, for example) or Fishing hole GO
- if (!go || ((go->GetOwnerGUID() != _player->GetGUID() && go->GetGoType() != GAMEOBJECT_TYPE_FISHINGHOLE) && !go->IsWithinDistInMap(_player, INTERACTION_DISTANCE)))
+ if (lguid.IsGameObject())
{
- player->SendLootRelease(lguid);
- return;
- }
+ GameObject* go = player->GetMap()->GetGameObject(lguid);
- loot = &go->loot;
- }
- else if (lguid.IsItem())
- {
- Item* pItem = player->GetItemByGuid(lguid);
+ // not check distance for GO in case owned GO (fishing bobber case, for example) or Fishing hole GO
+ if (!go || ((go->GetOwnerGUID() != _player->GetGUID() && go->GetGoType() != GAMEOBJECT_TYPE_FISHINGHOLE) && !go->IsWithinDistInMap(_player, INTERACTION_DISTANCE)))
+ {
+ player->SendLootRelease(lguid);
+ continue;
+ }
- if (!pItem)
- {
- player->SendLootRelease(lguid);
- return;
+ loot = &go->loot;
}
-
- loot = &pItem->loot;
- }
- else if (lguid.IsCorpse())
- {
- Corpse* bones = ObjectAccessor::GetCorpse(*player, lguid);
- if (!bones)
+ else if (lguid.IsItem())
{
- player->SendLootRelease(lguid);
- return;
- }
+ Item* pItem = player->GetItemByGuid(lguid);
- loot = &bones->loot;
- }
- else
- {
- Creature* creature = GetPlayer()->GetMap()->GetCreature(lguid);
+ if (!pItem)
+ {
+ player->SendLootRelease(lguid);
+ continue;
+ }
- bool lootAllowed = creature && creature->IsAlive() == (player->getClass() == CLASS_ROGUE && creature->loot.loot_type == LOOT_PICKPOCKETING);
- if (!lootAllowed || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
+ loot = &pItem->loot;
+ }
+ else if (lguid.IsCorpse())
{
- player->SendLootError(lguid, lootAllowed ? LOOT_ERROR_TOO_FAR : LOOT_ERROR_DIDNT_KILL);
- return;
+ Corpse* bones = ObjectAccessor::GetCorpse(*player, lguid);
+ if (!bones)
+ {
+ player->SendLootRelease(lguid);
+ continue;
+ }
+
+ loot = &bones->loot;
}
+ else
+ {
+ Creature* creature = GetPlayer()->GetMap()->GetCreature(lguid);
- loot = &creature->loot;
- }
+ bool lootAllowed = creature && creature->IsAlive() == (player->getClass() == CLASS_ROGUE && creature->loot.loot_type == LOOT_PICKPOCKETING);
+ if (!lootAllowed || !creature->IsWithinDistInMap(_player, INTERACTION_DISTANCE))
+ {
+ player->SendLootError(lguid, lootAllowed ? LOOT_ERROR_TOO_FAR : LOOT_ERROR_DIDNT_KILL);
+ continue;
+ }
+
+ loot = &creature->loot;
+ }
- player->StoreLootItem(lootSlot, loot);
+ // Since 6.x client sends loot starting from 1 hence the -1
+ player->StoreLootItem(req.LootListID-1, loot);
- // If player is removing the last LootItem, delete the empty container.
- if (loot->isLooted() && lguid.IsItem())
- player->GetSession()->DoLootRelease(lguid);
+ // If player is removing the last LootItem, delete the empty container.
+ if (loot->isLooted() && lguid.IsItem())
+ player->GetSession()->DoLootRelease(lguid);
+ }
}
-void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/)
+void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet*/)
{
TC_LOG_DEBUG("network", "WORLD: CMSG_LOOT_MONEY");
@@ -193,10 +196,10 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/)
if (uint32 guildGold = CalculatePct(goldPerPlayer, (*i)->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT)))
guild->HandleMemberDepositMoney(this, guildGold, true);
- WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);
- data << uint32(goldPerPlayer);
- data << uint8(playersNear.size() <= 1); // Controls the text displayed in chat. 0 is "Your share is..." and 1 is "You loot..."
- (*i)->GetSession()->SendPacket(&data);
+ WorldPackets::Loot::LootMoneyNotify packet;
+ packet.Money = goldPerPlayer;
+ packet.SoleLooter = playersNear.size() <= 1 ? true : false;
+ (*i)->SendDirectMessage(packet.Write());
}
}
else
@@ -208,10 +211,10 @@ void WorldSession::HandleLootMoneyOpcode(WorldPacket& /*recvData*/)
if (uint32 guildGold = CalculatePct(loot->gold, player->GetTotalAuraModifier(SPELL_AURA_DEPOSIT_BONUS_MONEY_IN_GUILD_BANK_ON_LOOT)))
guild->HandleMemberDepositMoney(this, guildGold, true);
- WorldPacket data(SMSG_LOOT_MONEY_NOTIFY, 4 + 1);
- data << uint32(loot->gold);
- data << uint8(1); // "You loot..."
- SendPacket(&data);
+ WorldPackets::Loot::LootMoneyNotify packet;
+ packet.Money = loot->gold;
+ packet.SoleLooter = true; // "You loot..."
+ SendPacket(packet.Write());
}
loot->gold = 0;
@@ -241,18 +244,15 @@ void WorldSession::HandleLootOpcode(WorldPackets::Loot::LootUnit& packet)
GetPlayer()->InterruptNonMeleeSpells(false);
}
-void WorldSession::HandleLootReleaseOpcode(WorldPacket& recvData)
+void WorldSession::HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease& packet)
{
TC_LOG_DEBUG("network", "WORLD: CMSG_LOOT_RELEASE");
// cheaters can modify lguid to prevent correct apply loot release code and re-loot
// use internal stored guid
- ObjectGuid guid;
- recvData >> guid;
-
ObjectGuid lguid = GetPlayer()->GetLootGUID();
if (!lguid.IsEmpty())
- if (lguid == guid)
+ if (lguid == packet.Unit)
DoLootRelease(lguid);
}
@@ -478,7 +478,7 @@ void WorldSession::HandleLootMasterGiveOpcode(WorldPacket& recvData)
}
// now move item from loot to target inventory
- Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomPropertyId, item.GetAllowedLooters());
+ Item* newitem = target->StoreNewItem(dest, item.itemid, true, item.randomPropertyId, item.GetAllowedLooters(), item.BonusListIDs);
target->SendNewItem(newitem, uint32(item.count), false, false, true);
target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_ITEM, item.itemid, item.count);
target->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_LOOT_TYPE, item.itemid, item.count, loot->loot_type);
diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp
index bb45d4d8718..d173b409008 100644
--- a/src/server/game/Handlers/MailHandler.cpp
+++ b/src/server/game/Handlers/MailHandler.cpp
@@ -843,7 +843,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPacket& recvData)
/// @todo Fix me! ... this void has probably bad condition, but good data are sent
void WorldSession::HandleQueryNextMailTime(WorldPacket& /*recvData*/)
{
- WorldPacket data(MSG_QUERY_NEXT_MAIL_TIME, 8);
+ WorldPacket data(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, 8);
if (!_player->m_mailsLoaded)
_player->_LoadMail();
diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp
index 569bcf73ffa..aed2da5c534 100644
--- a/src/server/game/Handlers/MiscHandler.cpp
+++ b/src/server/game/Handlers/MiscHandler.cpp
@@ -60,13 +60,12 @@
#include "CharacterPackets.h"
#include "ClientConfigPackets.h"
#include "MiscPackets.h"
+#include "AchievementPackets.h"
-void WorldSession::HandleRepopRequestOpcode(WorldPacket& recvData)
+void WorldSession::HandleRepopRequest(WorldPackets::Misc::RepopRequest& packet)
{
TC_LOG_DEBUG("network", "WORLD: Recvd CMSG_REPOP_REQUEST Message");
- recvData.read_skip<uint8>();
-
if (GetPlayer()->IsAlive() || GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
return;
@@ -501,14 +500,14 @@ void WorldSession::HandleZoneUpdateOpcode(WorldPacket& recvData)
//GetPlayer()->SendInitWorldStates(true, newZone);
}
-void WorldSession::HandleReturnToGraveyard(WorldPacket& /*recvPacket*/)
+void WorldSession::HandlePortGraveyard(WorldPackets::Misc::PortGraveyard& /*packet*/)
{
if (GetPlayer()->IsAlive() || !GetPlayer()->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_GHOST))
return;
GetPlayer()->RepopAtGraveyard();
}
-void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/)
+void WorldSession::HandleRequestCemeteryList(WorldPackets::Misc::RequestCemeteryList& /*packet*/)
{
uint32 zoneId = _player->GetZoneId();
uint32 team = _player->GetTeam();
@@ -529,14 +528,14 @@ void WorldSession::HandleRequestCemeteryList(WorldPacket& /*recvPacket*/)
return;
}
- WorldPacket data(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, 4 + 4 * graveyardIds.size());
- data.WriteBit(0); // Is MicroDungeon (WorldMapFrame.lua)
+ WorldPackets::Misc::RequestCemeteryListResponse packet;
+ packet.IsGossipTriggered = false;
+ packet.CemeteryID.reserve(graveyardIds.size());
- data.WriteBits(graveyardIds.size(), 24);
for (uint32 id : graveyardIds)
- data << id;
+ packet.CemeteryID.push_back(id);
- SendPacket(&data);
+ SendPacket(packet.Write());
}
void WorldSession::HandleSetSelectionOpcode(WorldPackets::Misc::SetSelection& packet)
@@ -734,7 +733,7 @@ void WorldSession::HandleSetContactNotesOpcode(WorldPacket& recvData)
_player->GetSocial()->SetFriendNote(guid, note);
}
-void WorldSession::HandleBugOpcode(WorldPacket& recvData)
+void WorldSession::HandleBugReportOpcode(WorldPacket& recvData)
{
uint32 suggestion, contentlen, typelen;
std::string content, type;
@@ -746,9 +745,9 @@ void WorldSession::HandleBugOpcode(WorldPacket& recvData)
type = recvData.ReadString(typelen);
if (suggestion == 0)
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_BUG [Bug Report]");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_BUG_REPORT [Bug Report]");
else
- TC_LOG_DEBUG("network", "WORLD: Received CMSG_BUG [Suggestion]");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_BUG_REPORT [Suggestion]");
TC_LOG_DEBUG("network", "%s", type.c_str());
TC_LOG_DEBUG("network", "%s", content.c_str());
@@ -761,13 +760,10 @@ void WorldSession::HandleBugOpcode(WorldPacket& recvData)
CharacterDatabase.Execute(stmt);
}
-void WorldSession::HandleReclaimCorpseOpcode(WorldPacket& recvData)
+void WorldSession::HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& packet)
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_RECLAIM_CORPSE");
- ObjectGuid guid;
- recvData >> guid;
-
if (_player->IsAlive())
return;
@@ -798,25 +794,20 @@ void WorldSession::HandleReclaimCorpseOpcode(WorldPacket& recvData)
_player->SpawnCorpseBones();
}
-void WorldSession::HandleResurrectResponseOpcode(WorldPacket& recvData)
+void WorldSession::HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse& packet)
{
TC_LOG_DEBUG("network", "WORLD: Received CMSG_RESURRECT_RESPONSE");
- ObjectGuid guid;
- uint8 status;
- recvData >> guid;
- recvData >> status;
-
if (GetPlayer()->IsAlive())
return;
- if (status == 0)
+ if (packet.Response == 0)
{
GetPlayer()->ClearResurrectRequestData(); // reject
return;
}
- if (!GetPlayer()->IsResurrectRequestedBy(guid))
+ if (!GetPlayer()->IsResurrectRequestedBy(packet.Resurrecter))
return;
GetPlayer()->ResurrectUsingRequestData();
@@ -1142,7 +1133,7 @@ void WorldSession::HandleMoveUnRootAck(WorldPacket& recvData)
return;
}
- TC_LOG_DEBUG("network", "WORLD: CMSG_FORCE_MOVE_UNROOT_ACK");
+ TC_LOG_DEBUG("network", "WORLD: CMSG_MOVE_FORCE_UNROOT_ACK");
recvData.read_skip<uint32>(); // unk
@@ -1168,7 +1159,7 @@ void WorldSession::HandleMoveRootAck(WorldPacket& recvData)
return;
}
- TC_LOG_DEBUG("network", "WORLD: CMSG_FORCE_MOVE_ROOT_ACK");
+ TC_LOG_DEBUG("network", "WORLD: CMSG_MOVE_FORCE_ROOT_ACK");
recvData.read_skip<uint32>(); // unk
@@ -1273,7 +1264,7 @@ void WorldSession::HandleInspectHonorStatsOpcode(WorldPacket& recvData)
Player* player = ObjectAccessor::FindPlayer(guid);
if (!player)
{
- TC_LOG_DEBUG("network", "CMSG_INSPECT_HONOR_STATS: No player found from %s", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "CMSG_REQUEST_HONOR_STATS: No player found from %s", guid.ToString().c_str());
return;
}
@@ -1508,14 +1499,14 @@ void WorldSession::HandleSetTitleOpcode(WorldPacket& recvData)
GetPlayer()->SetUInt32Value(PLAYER_CHOSEN_TITLE, title);
}
-void WorldSession::HandleTimeSyncResp(WorldPackets::Misc::TimeSyncResponse& packet)
+void WorldSession::HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse& packet)
{
- TC_LOG_DEBUG("network", "CMSG_TIME_SYNC_RESP");
+ TC_LOG_DEBUG("network", "CMSG_TIME_SYNC_RESPONSE");
// Prevent crashing server if queue is empty
if (_player->m_timeSyncQueue.empty())
{
- TC_LOG_ERROR("network", "Received CMSG_TIME_SYNC_RESP from player %s without requesting it (hacker?)", _player->GetName().c_str());
+ TC_LOG_ERROR("network", "Received CMSG_TIME_SYNC_RESPONSE from player %s without requesting it (hacker?)", _player->GetName().c_str());
return;
}
@@ -1773,19 +1764,15 @@ void WorldSession::HandleQueryInspectAchievements(WorldPacket& recvData)
player->SendRespondInspectAchievements(_player);
}
-void WorldSession::HandleGuildAchievementProgressQuery(WorldPacket& recvData)
+void WorldSession::HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement)
{
- uint32 achievementId;
- recvData >> achievementId;
-
if (Guild* guild = sGuildMgr->GetGuildById(_player->GetGuildId()))
- guild->GetAchievementMgr().SendAchievementInfo(_player, achievementId);
+ guild->GetAchievementMgr().SendAchievementInfo(_player, setFocusedAchievement.AchievementID);
}
-void WorldSession::HandleWorldStateUITimerUpdate(WorldPacket& /*recvData*/)
+void WorldSession::HandleUITimeRequest(WorldPackets::Misc::UITimeRequest& /*request*/)
{
- // empty opcode
- TC_LOG_DEBUG("network", "WORLD: CMSG_WORLD_STATE_UI_TIMER_UPDATE");
+ TC_LOG_DEBUG("network", "WORLD: CMSG_UI_TIME_REQUEST");
WorldPackets::Misc::UITime response;
response.Time = time(NULL);
@@ -1796,7 +1783,7 @@ void WorldSession::SendSetPhaseShift(std::set<uint32> const& phaseIds, std::set<
{
ObjectGuid guid = _player->GetGUID();
- WorldPacket data(SMSG_SET_PHASE_SHIFT, 1 + 8 + 4 + 4 + 4 + 4 + 2 * phaseIds.size() + 4 + terrainswaps.size() * 2);
+ WorldPacket data(SMSG_SET_PHASE_SHIFT_CHANGE, 1 + 8 + 4 + 4 + 4 + 4 + 2 * phaseIds.size() + 4 + terrainswaps.size() * 2);
data.WriteBit(guid[2]);
data.WriteBit(guid[3]);
data.WriteBit(guid[1]);
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index e1e5ae49778..c47fe33e3b2 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -159,9 +159,9 @@ void WorldSession::HandleMoveWorldportAckOpcode()
if (mInstance)
{
Difficulty diff = GetPlayer()->GetDifficultyID(mEntry);
- if (MapDifficulty const* mapDiff = GetMapDifficultyData(mEntry->ID, diff))
+ if (MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mEntry->ID, diff))
{
- if (mapDiff->resetTime)
+ if (mapDiff->RaidDuration)
{
if (time_t timeReset = sInstanceSaveMgr->GetResetTimeFor(mEntry->ID, diff))
{
@@ -358,9 +358,9 @@ void WorldSession::HandleMovementOpcodes(WorldPackets::Movement::ClientPlayerMov
mover->UpdatePosition(movementInfo.pos);
- WorldPackets::Movement::ServerPlayerMovement playerMovement;
- playerMovement.movementInfo = &mover->m_movementInfo;
- mover->SendMessageToSet(const_cast<WorldPacket*>(playerMovement.Write()), _player);
+ WorldPackets::Movement::MoveUpdate moveUpdate;
+ moveUpdate.movementInfo = &mover->m_movementInfo;
+ mover->SendMessageToSet(moveUpdate.Write(), _player);
if (plrMover) // nothing is charmed, or player charmed
{
@@ -511,7 +511,7 @@ void WorldSession::HandleMoveNotActiveMover(WorldPacket &recvData)
void WorldSession::HandleMountSpecialAnimOpcode(WorldPacket& /*recvData*/)
{
- WorldPacket data(SMSG_MOUNTSPECIAL_ANIM, 8);
+ WorldPacket data(SMSG_SPECIAL_MOUNT_ANIM, 8);
data << GetPlayer()->GetGUID();
GetPlayer()->SendMessageToSet(&data, false);
diff --git a/src/server/game/Handlers/NPCHandler.cpp b/src/server/game/Handlers/NPCHandler.cpp
index 30f3b45b47b..154b3428022 100644
--- a/src/server/game/Handlers/NPCHandler.cpp
+++ b/src/server/game/Handlers/NPCHandler.cpp
@@ -71,7 +71,7 @@ void WorldSession::HandleTabardVendorActivateOpcode(WorldPacket& recvData)
void WorldSession::SendTabardVendorActivate(ObjectGuid guid)
{
- WorldPacket data(MSG_TABARDVENDOR_ACTIVATE, 8);
+ WorldPacket data(SMSG_TABARD_VENDOR_ACTIVATE, 18);
data << guid;
SendPacket(&data);
}
@@ -96,10 +96,9 @@ void WorldSession::HandleBankerActivateOpcode(WorldPackets::NPC::Hello& packet)
void WorldSession::SendShowBank(ObjectGuid guid)
{
- WorldPacket data(SMSG_SHOW_BANK, 8);
- data << guid;
- m_currentBankerGUID = guid;
- SendPacket(&data);
+ WorldPackets::NPC::ShowBank packet;
+ packet.Guid = guid;
+ SendPacket(packet.Write());
}
void WorldSession::SendShowMailBox(ObjectGuid guid)
@@ -515,9 +514,9 @@ void WorldSession::SendStablePetCallback(PreparedQueryResult result, ObjectGuid
if (!GetPlayer())
return;
- TC_LOG_DEBUG("network", "WORLD: Recv MSG_LIST_STABLED_PETS Send.");
+ TC_LOG_DEBUG("network", "WORLD: Recv CMSG_REQUEST_STABLED_PETS Send.");
- WorldPacket data(MSG_LIST_STABLED_PETS, 200); // guess size
+ WorldPacket data(SMSG_PET_STABLE_LIST, 200); // guess size
data << guid;
@@ -565,9 +564,9 @@ void WorldSession::SendStablePetCallback(PreparedQueryResult result, ObjectGuid
}
-void WorldSession::SendStableResult(uint8 res)
+void WorldSession::SendPetStableResult(uint8 res)
{
- WorldPacket data(SMSG_STABLE_RESULT, 1);
+ WorldPacket data(SMSG_PET_STABLE_RESULT, 1);
data << uint8(res);
SendPacket(&data);
}
@@ -581,13 +580,13 @@ void WorldSession::HandleStablePet(WorldPacket& recvData)
if (!GetPlayer()->IsAlive())
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
if (!CheckStableMaster(npcGUID))
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -600,7 +599,7 @@ void WorldSession::HandleStablePet(WorldPacket& recvData)
// can't place in stable dead pet
if (!pet || !pet->IsAlive() || pet->getPetType() != HUNTER_PET)
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -640,10 +639,10 @@ void WorldSession::HandleStablePetCallback(PreparedQueryResult result)
if (freeSlot > 0 && freeSlot <= GetPlayer()->m_stableSlots)
{
_player->RemovePet(_player->GetPet(), PetSaveMode(freeSlot));
- SendStableResult(STABLE_SUCCESS_STABLE);
+ SendPetStableResult(STABLE_SUCCESS_STABLE);
}
else
- SendStableResult(STABLE_ERR_INVALID_SLOT);
+ SendPetStableResult(STABLE_ERR_INVALID_SLOT);
}
void WorldSession::HandleUnstablePet(WorldPacket& recvData)
@@ -656,7 +655,7 @@ void WorldSession::HandleUnstablePet(WorldPacket& recvData)
if (!CheckStableMaster(npcGUID))
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -689,7 +688,7 @@ void WorldSession::HandleUnstablePetCallback(PreparedQueryResult result, uint32
if (!petEntry)
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -698,16 +697,16 @@ void WorldSession::HandleUnstablePetCallback(PreparedQueryResult result, uint32
{
// if problem in exotic pet
if (creatureInfo && creatureInfo->IsTameable(true))
- SendStableResult(STABLE_ERR_EXOTIC);
+ SendPetStableResult(STABLE_ERR_EXOTIC);
else
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
Pet* pet = _player->GetPet();
if (pet && pet->IsAlive())
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -720,11 +719,11 @@ void WorldSession::HandleUnstablePetCallback(PreparedQueryResult result, uint32
{
delete newPet;
newPet = NULL;
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
- SendStableResult(STABLE_SUCCESS_UNSTABLE);
+ SendPetStableResult(STABLE_SUCCESS_UNSTABLE);
}
void WorldSession::HandleBuyStableSlot(WorldPacket& recvData)
@@ -736,7 +735,7 @@ void WorldSession::HandleBuyStableSlot(WorldPacket& recvData)
if (!CheckStableMaster(npcGUID))
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -751,13 +750,13 @@ void WorldSession::HandleBuyStableSlot(WorldPacket& recvData)
{
++GetPlayer()->m_stableSlots;
_player->ModifyMoney(-int32(SlotPrice->Price));
- SendStableResult(STABLE_SUCCESS_BUY_SLOT);
+ SendPetStableResult(STABLE_SUCCESS_BUY_SLOT);
}
else
- SendStableResult(STABLE_ERR_MONEY);*/
+ SendPetStableResult(STABLE_ERR_MONEY);*/
}
else
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
}
void WorldSession::HandleStableRevivePet(WorldPacket &/* recvData */)
@@ -775,7 +774,7 @@ void WorldSession::HandleStableSwapPet(WorldPacket& recvData)
if (!CheckStableMaster(npcGUID))
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -787,7 +786,7 @@ void WorldSession::HandleStableSwapPet(WorldPacket& recvData)
if (!pet || pet->getPetType() != HUNTER_PET)
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -809,7 +808,7 @@ void WorldSession::HandleStableSwapPetCallback(PreparedQueryResult result, uint3
if (!result)
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -820,20 +819,20 @@ void WorldSession::HandleStableSwapPetCallback(PreparedQueryResult result, uint3
if (!petEntry)
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(petEntry);
if (!creatureInfo || !creatureInfo->IsTameable(true))
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
if (!creatureInfo->IsTameable(_player->CanTameExoticPets()))
{
- SendStableResult(STABLE_ERR_EXOTIC);
+ SendPetStableResult(STABLE_ERR_EXOTIC);
return;
}
@@ -841,7 +840,7 @@ void WorldSession::HandleStableSwapPetCallback(PreparedQueryResult result, uint3
// The player's pet could have been removed during the delay of the DB callback
if (!pet)
{
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
return;
}
@@ -853,10 +852,10 @@ void WorldSession::HandleStableSwapPetCallback(PreparedQueryResult result, uint3
if (!newPet->LoadPetFromDB(_player, petEntry, petId))
{
delete newPet;
- SendStableResult(STABLE_ERR_STABLE);
+ SendPetStableResult(STABLE_ERR_STABLE);
}
else
- SendStableResult(STABLE_SUCCESS_UNSTABLE);
+ SendPetStableResult(STABLE_SUCCESS_UNSTABLE);
}
void WorldSession::HandleRepairItemOpcode(WorldPackets::Item::RepairItem& packet)
diff --git a/src/server/game/Handlers/PetitionsHandler.cpp b/src/server/game/Handlers/PetitionsHandler.cpp
index d51720c2373..45f8b6dea1d 100644
--- a/src/server/game/Handlers/PetitionsHandler.cpp
+++ b/src/server/game/Handlers/PetitionsHandler.cpp
@@ -330,7 +330,7 @@ void WorldSession::SendPetitionQueryOpcode(ObjectGuid petitionguid)
return;
}
- WorldPacket data(SMSG_PETITION_QUERY_RESPONSE, (4+8+name.size()+1+1+4*12+2+10));
+ WorldPacket data(SMSG_QUERY_PETITION_RESPONSE, (4+8+name.size()+1+1+4*12+2+10));
data << uint32(petitionguid.GetCounter()); // guild/team guid (in Trinity always same as GUID_LOPART(petition guid)
data << ownerguid; // charter owner guid
data << name; // name (guild/arena team)
@@ -367,9 +367,10 @@ void WorldSession::SendPetitionQueryOpcode(ObjectGuid petitionguid)
SendPacket(&data);
}
-void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
+void WorldSession::HandlePetitionRenameGuildOpcode(WorldPacket& recvData)
{
- TC_LOG_DEBUG("network", "Received opcode MSG_PETITION_RENAME");
+ /// @todo: drop arena team code
+ TC_LOG_DEBUG("network", "Received opcode CMSG_PETITION_RENAME_GUILD");
ObjectGuid petitionGuid;
uint32 type;
@@ -434,7 +435,7 @@ void WorldSession::HandlePetitionRenameOpcode(WorldPacket& recvData)
CharacterDatabase.Execute(stmt);
TC_LOG_DEBUG("network", "Petition %s renamed to '%s'", petitionGuid.ToString().c_str(), newName.c_str());
- WorldPacket data(MSG_PETITION_RENAME, (8 + newName.size() + 1));
+ WorldPacket data(SMSG_PETITION_RENAME_GUILD_RESPONSE, (8 + newName.size() + 1));
data << petitionGuid;
data << newName;
SendPacket(&data);
@@ -595,9 +596,11 @@ void WorldSession::HandlePetitionDeclineOpcode(WorldPacket& recvData)
Player* owner = ObjectAccessor::FindConnectedPlayer(ownerguid);
if (owner) // petition owner online
{
- WorldPacket data(MSG_PETITION_DECLINE, 8);
+ /*
+ WorldPacket data(SMSG_DECLINE_PETITION, 18);
data << _player->GetGUID();
owner->GetSession()->SendPacket(&data);
+ */
}
}
@@ -919,7 +922,7 @@ void WorldSession::SendPetitionShowList(ObjectGuid guid)
return;
}
- WorldPacket data(SMSG_PETITION_SHOWLIST, 8+1+4*6);
+ WorldPacket data(SMSG_PETITION_SHOW_LIST, 8+1+4*6);
data << guid; // npc guid
if (creature->IsTabardDesigner())
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp
index 6556532cf98..49ac42f0abf 100644
--- a/src/server/game/Handlers/QueryHandler.cpp
+++ b/src/server/game/Handlers/QueryHandler.cpp
@@ -73,17 +73,17 @@ void WorldSession::HandleNameQueryOpcode(WorldPackets::Query::QueryPlayerName& p
SendNameQueryOpcode(packet.Player);
}
-void WorldSession::HandleQueryTimeOpcode(WorldPacket & /*recvData*/)
+void WorldSession::HandleQueryTimeOpcode(WorldPackets::Query::QueryTime& /*queryTime*/)
{
SendQueryTimeResponse();
}
void WorldSession::SendQueryTimeResponse()
{
- WorldPacket data(SMSG_QUERY_TIME_RESPONSE, 4+4);
- data << uint32(time(NULL));
- data << uint32(sWorld->GetNextDailyQuestsResetTime() - time(NULL));
- SendPacket(&data);
+ WorldPackets::Query::QueryTimeResponse queryTimeResponse;
+ queryTimeResponse.CurrentTime = time(nullptr);
+ queryTimeResponse.TimeOutRequest = sWorld->GetNextDailyQuestsResetTime() - queryTimeResponse.CurrentTime;
+ SendPacket(queryTimeResponse.Write());
}
/// Only _static_ data is sent in this packet !!!
@@ -165,38 +165,38 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj
SendPacket(response.Write());
}
-void WorldSession::HandleCorpseQueryOpcode(WorldPacket& /*recvData*/)
+void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& /*packet*/)
{
- TC_LOG_DEBUG("network", "WORLD: Received MSG_CORPSE_QUERY");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT");
Corpse* corpse = GetPlayer()->GetCorpse();
if (!corpse)
{
- WorldPacket data(MSG_CORPSE_QUERY, 1);
- data << uint8(0); // corpse not found
- SendPacket(&data);
+ WorldPackets::Query::CorpseLocation packet;
+ packet.Valid = false; // corpse not found
+ SendPacket(packet.Write());
return;
}
- uint32 mapid = corpse->GetMapId();
+ uint32 mapID = corpse->GetMapId();
float x = corpse->GetPositionX();
float y = corpse->GetPositionY();
float z = corpse->GetPositionZ();
- uint32 corpsemapid = mapid;
+ uint32 corpseMapID = mapID;
// if corpse at different map
- if (mapid != _player->GetMapId())
+ if (mapID != _player->GetMapId())
{
// search entrance map for proper show entrance
- if (MapEntry const* corpseMapEntry = sMapStore.LookupEntry(mapid))
+ if (MapEntry const* corpseMapEntry = sMapStore.LookupEntry(mapID))
{
if (corpseMapEntry->IsDungeon() && corpseMapEntry->CorpseMapID >= 0)
{
// if corpse map have entrance
if (Map const* entranceMap = sMapMgr->CreateBaseMap(corpseMapEntry->CorpseMapID))
{
- mapid = corpseMapEntry->CorpseMapID;
+ mapID = corpseMapEntry->CorpseMapID;
x = corpseMapEntry->CorpsePos.X;
y = corpseMapEntry->CorpsePos.Y;
z = entranceMap->GetHeight(GetPlayer()->GetPhaseMask(), x, y, MAX_HEIGHT);
@@ -205,15 +205,13 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket& /*recvData*/)
}
}
- WorldPacket data(MSG_CORPSE_QUERY, 1+(6*4));
- data << uint8(1); // corpse found
- data << int32(mapid);
- data << float(x);
- data << float(y);
- data << float(z);
- data << int32(corpsemapid);
- data << uint32(0); // unknown
- SendPacket(&data);
+ WorldPackets::Query::CorpseLocation packet;
+ packet.Valid = true;
+ packet.MapID = corpseMapID;
+ packet.ActualMapID = mapID;
+ packet.Position = G3D::Vector3(x, y, z);
+ packet.Transport = corpse->GetTransGUID();
+ SendPacket(packet.Write());
}
void WorldSession::HandleNpcTextQueryOpcode(WorldPackets::Query::QueryNPCText& packet)
@@ -280,19 +278,25 @@ void WorldSession::HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText&
}
}
-void WorldSession::HandleCorpseMapPositionQuery(WorldPacket& recvData)
+void WorldSession::HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& packet)
{
- TC_LOG_DEBUG("network", "WORLD: Recv CMSG_CORPSE_MAP_POSITION_QUERY");
+ TC_LOG_DEBUG("network", "WORLD: Recv CMSG_QUERY_CORPSE_TRANSPORT");
- uint32 transportGuidLow;
- recvData >> transportGuidLow;
+ Corpse* corpse = _player->GetCorpse();
- WorldPacket data(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, 4+4+4+4);
- data << float(0);
- data << float(0);
- data << float(0);
- data << float(0);
- SendPacket(&data);
+ WorldPackets::Query::CorpseTransportQuery response;
+ if (!corpse || corpse->GetTransGUID().IsEmpty() || corpse->GetTransGUID() != packet.Transport)
+ {
+ response.Position = G3D::Vector3(0.0f, 0.0f, 0.0f);
+ response.Facing = 0.0f;
+ }
+ else
+ {
+ response.Position = G3D::Vector3(corpse->GetTransOffsetX(), corpse->GetTransOffsetY(), corpse->GetTransOffsetZ());
+ response.Facing = corpse->GetTransOffsetO();
+ }
+
+ SendPacket(response.Write());
}
void WorldSession::HandleQuestNPCQuery(WorldPacket& recvData)
diff --git a/src/server/game/Handlers/QuestHandler.cpp b/src/server/game/Handlers/QuestHandler.cpp
index 57abbfeeaa2..c5e0fc2e3b5 100644
--- a/src/server/game/Handlers/QuestHandler.cpp
+++ b/src/server/game/Handlers/QuestHandler.cpp
@@ -608,17 +608,14 @@ void WorldSession::HandleQuestPushResult(WorldPacket& recvPacket)
uint8 msg;
recvPacket >> guid >> questId >> msg;
- TC_LOG_DEBUG("network", "WORLD: Received MSG_QUEST_PUSH_RESULT");
+ TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUEST_PUSH_RESULT");
if (!_player->GetDivider().IsEmpty() && _player->GetDivider() == guid)
{
Player* player = ObjectAccessor::FindPlayer(_player->GetDivider());
if (player)
{
- WorldPacket data(MSG_QUEST_PUSH_RESULT, 8 + 4 + 1);
- data << _player->GetGUID();
- data << uint8(msg); // valid values: 0-8
- player->SendDirectMessage(&data);
+ player->SendPushToPartyResponse(_player, msg);
_player->SetDivider(ObjectGuid::Empty);
}
}
diff --git a/src/server/game/Handlers/SkillHandler.cpp b/src/server/game/Handlers/SkillHandler.cpp
index 1c6dfd0b8b9..d7cf1226088 100644
--- a/src/server/game/Handlers/SkillHandler.cpp
+++ b/src/server/game/Handlers/SkillHandler.cpp
@@ -28,7 +28,7 @@
#include "WorldSession.h"
#include "TalentPackets.h"
-void WorldSession::HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet)
+void WorldSession::HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet)
{
bool anythingLearned = false;
for (uint32 talentId : packet.Talents)
@@ -41,7 +41,7 @@ void WorldSession::HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& pa
_player->SendTalentsInfoData();
}
-void WorldSession::HandleTalentWipeConfirmOpcode(WorldPacket& recvData)
+void WorldSession::HandleConfirmRespecWipeOpcode(WorldPacket& recvData)
{
TC_LOG_DEBUG("network", "MSG_TALENT_WIPE_CONFIRM");
ObjectGuid guid;
@@ -50,7 +50,7 @@ void WorldSession::HandleTalentWipeConfirmOpcode(WorldPacket& recvData)
Creature* unit = GetPlayer()->GetNPCIfCanInteractWith(guid, UNIT_NPC_FLAG_TRAINER);
if (!unit)
{
- TC_LOG_DEBUG("network", "WORLD: HandleTalentWipeConfirmOpcode - %s not found or you can't interact with him.", guid.ToString().c_str());
+ TC_LOG_DEBUG("network", "WORLD: HandleConfirmRespecWipeOpcode - %s not found or you can't interact with him.", guid.ToString().c_str());
return;
}
@@ -63,10 +63,7 @@ void WorldSession::HandleTalentWipeConfirmOpcode(WorldPacket& recvData)
if (!_player->ResetTalents())
{
- WorldPacket data(MSG_TALENT_WIPE_CONFIRM, 8+4); //you have not any talent
- data << uint64(0);
- data << uint32(0);
- SendPacket(&data);
+ GetPlayer()->SendRespecWipeConfirm(ObjectGuid::Empty, 0);
return;
}
diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp
index 25a185896ee..e1459f696f9 100644
--- a/src/server/game/Handlers/SpellHandler.cpp
+++ b/src/server/game/Handlers/SpellHandler.cpp
@@ -451,16 +451,9 @@ void WorldSession::HandleCancelCastOpcode(WorldPacket& recvPacket)
_player->InterruptNonMeleeSpells(false, spellId, false);
}
-void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
+void WorldSession::HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& cancelAura)
{
- uint32 spellId;
- recvPacket >> spellId;
-
- ObjectGuid guid;
- recvPacket >> guid;
-
-
- SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
+ SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(cancelAura.SpellID);
if (!spellInfo)
return;
@@ -472,7 +465,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
if (spellInfo->IsChanneled())
{
if (Spell* curSpell = _player->GetCurrentSpell(CURRENT_CHANNELED_SPELL))
- if (curSpell->m_spellInfo->Id == spellId)
+ if (curSpell->GetSpellInfo()->Id == cancelAura.SpellID)
_player->InterruptSpell(CURRENT_CHANNELED_SPELL);
return;
}
@@ -483,8 +476,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
if (!spellInfo->IsPositive() || spellInfo->IsPassive())
return;
- // maybe should only remove one buff when there are multiple?
- _player->RemoveOwnedAura(spellId, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
+ _player->RemoveOwnedAura(cancelAura.SpellID, cancelAura.CasterGUID, 0, AURA_REMOVE_BY_CANCEL);
// If spell being removed is a resource tracker, see if player was tracking both (herbs / minerals) and remove the other
if (sWorld->getBoolConfig(CONFIG_ALLOW_TRACK_BOTH_RESOURCES) && spellInfo->HasAura(DIFFICULTY_NONE, SPELL_AURA_TRACK_RESOURCES))
@@ -501,7 +493,7 @@ void WorldSession::HandleCancelAuraOpcode(WorldPacket& recvPacket)
// Remove all auras related to resource tracking (only Herbs and Minerals in 3.3.5a)
for (std::list<uint32>::iterator it = spellIDs.begin(); it != spellIDs.end(); ++it)
- _player->RemoveOwnedAura(*it, ObjectGuid::Empty, 0, AURA_REMOVE_BY_CANCEL);
+ _player->RemoveOwnedAura(*it, cancelAura.CasterGUID, 0, AURA_REMOVE_BY_CANCEL);
}
}
}
diff --git a/src/server/game/Handlers/TaxiHandler.cpp b/src/server/game/Handlers/TaxiHandler.cpp
index 5c16de1ee4c..b8f13f9d014 100644
--- a/src/server/game/Handlers/TaxiHandler.cpp
+++ b/src/server/game/Handlers/TaxiHandler.cpp
@@ -103,7 +103,7 @@ void WorldSession::SendTaxiMenu(Creature* unit)
TC_LOG_DEBUG("network", "WORLD: CMSG_TAXINODE_STATUS_QUERY %u ", curloc);
- WorldPacket data(SMSG_SHOWTAXINODES, (4 + 8 + 4 + 8 * 4));
+ WorldPacket data(SMSG_SHOW_TAXI_NODES, (4 + 8 + 4 + 8 * 4));
data << uint32(1);
data << unit->GetGUID();
data << uint32(curloc);
diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp
index 01a4f8c437d..0525a567c0b 100644
--- a/src/server/game/Handlers/TicketHandler.cpp
+++ b/src/server/game/Handlers/TicketHandler.cpp
@@ -114,7 +114,7 @@ void WorldSession::HandleGMTicketCreateOpcode(WorldPacket& recvData)
response = GMTICKET_RESPONSE_CREATE_SUCCESS;
}
- WorldPacket data(SMSG_GMTICKET_CREATE, 4);
+ WorldPacket data(SMSG_GM_TICKET_UPDATE, 4);
data << uint32(response);
SendPacket(&data);
}
@@ -136,7 +136,7 @@ void WorldSession::HandleGMTicketUpdateOpcode(WorldPacket& recvData)
response = GMTICKET_RESPONSE_UPDATE_SUCCESS;
}
- WorldPacket data(SMSG_GMTICKET_UPDATETEXT, 4);
+ WorldPacket data(SMSG_GM_TICKET_UPDATE, 4);
data << uint32(response);
SendPacket(&data);
}
@@ -145,7 +145,7 @@ void WorldSession::HandleGMTicketDeleteOpcode(WorldPacket & /*recvData*/)
{
if (GmTicket* ticket = sTicketMgr->GetTicketByPlayer(GetPlayer()->GetGUID()))
{
- WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
+ WorldPacket data(SMSG_GM_TICKET_UPDATE, 4);
data << uint32(GMTICKET_RESPONSE_TICKET_DELETED);
SendPacket(&data);
@@ -175,7 +175,7 @@ void WorldSession::HandleGMTicketSystemStatusOpcode(WorldPacket & /*recvData*/)
{
// Note: This only disables the ticket UI at client side and is not fully reliable
// are we sure this is a uint32? Should ask Zor
- WorldPacket data(SMSG_GMTICKET_SYSTEMSTATUS, 4);
+ WorldPacket data(SMSG_GM_TICKET_SYSTEM_STATUS, 4);
data << uint32(sTicketMgr->GetStatus() ? GMTICKET_QUEUE_STATUS_ENABLED : GMTICKET_QUEUE_STATUS_DISABLED);
SendPacket(&data);
}
@@ -261,11 +261,11 @@ void WorldSession::HandleGMResponseResolve(WorldPacket& /*recvPacket*/)
if (float(rand_chance()) < sWorld->getFloatConfig(CONFIG_CHANCE_OF_GM_SURVEY))
getSurvey = 1;
- WorldPacket data(SMSG_GMRESPONSE_STATUS_UPDATE, 4);
+ WorldPacket data(SMSG_GM_TICKET_STATUS_UPDATE, 4);
data << uint8(getSurvey);
SendPacket(&data);
- WorldPacket data2(SMSG_GMTICKET_DELETETICKET, 4);
+ WorldPacket data2(SMSG_GM_TICKET_UPDATE, 4);
data2 << uint32(GMTICKET_RESPONSE_TICKET_DELETED);
SendPacket(&data2);
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index 9423cd78aa3..c45358efa11 100644
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -373,7 +373,7 @@ void InstanceSaveManager::LoadResetTimes()
Difficulty difficulty = Difficulty(fields[1].GetUInt8());
uint64 oldresettime = fields[2].GetUInt32();
- MapDifficulty const* mapDiff = GetMapDifficultyData(mapid, difficulty);
+ MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty);
if (!mapDiff)
{
TC_LOG_ERROR("misc", "InstanceSaveManager::LoadResetTimes: invalid mapid(%u)/difficulty(%u) pair in instance_reset!", mapid, difficulty);
@@ -399,12 +399,12 @@ void InstanceSaveManager::LoadResetTimes()
for (auto& difficultyPair : mapDifficultyPair.second)
{
Difficulty difficulty = Difficulty(difficultyPair.first);
- MapDifficulty const* mapDiff = &difficultyPair.second;
- if (!mapDiff->resetTime)
+ MapDifficultyEntry const* mapDiff = difficultyPair.second;
+ if (!mapDiff->RaidDuration)
continue;
// the reset_delay must be at least one day
- uint32 period = uint32(((mapDiff->resetTime * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY);
+ uint32 period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME)) / DAY) * DAY);
if (period < DAY)
period = DAY;
@@ -577,8 +577,8 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b
if (!warn)
{
- MapDifficulty const* mapDiff = GetMapDifficultyData(mapid, difficulty);
- if (!mapDiff || !mapDiff->resetTime)
+ MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapid, difficulty);
+ if (!mapDiff || !mapDiff->RaidDuration)
{
TC_LOG_ERROR("misc", "InstanceSaveManager::ResetOrWarnAll: not valid difficulty or no reset delay for map %d", mapid);
return;
@@ -616,7 +616,7 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b
// calculate the next reset time
uint32 diff = sWorld->getIntConfig(CONFIG_INSTANCE_RESET_TIME_HOUR) * HOUR;
- uint32 period = uint32(((mapDiff->resetTime * sWorld->getRate(RATE_INSTANCE_RESET_TIME))/DAY) * DAY);
+ uint32 period = uint32(((mapDiff->RaidDuration * sWorld->getRate(RATE_INSTANCE_RESET_TIME))/DAY) * DAY);
if (period < DAY)
period = DAY;
diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp
index 78068d16436..b6a3cc3dd5e 100644
--- a/src/server/game/Loot/LootMgr.cpp
+++ b/src/server/game/Loot/LootMgr.cpp
@@ -27,6 +27,7 @@
#include "Group.h"
#include "Player.h"
#include "Containers.h"
+#include "LootPackets.h"
static Rates const qualityToRate[MAX_ITEM_QUALITY] =
{
@@ -413,6 +414,19 @@ void LootItem::AddAllowedLooter(const Player* player)
allowedGUIDs.insert(player->GetGUID());
}
+void LootItem::BuildItemInstance(WorldPackets::Item::ItemInstance& instance) const
+{
+ instance.ItemID = itemid;
+ instance.RandomPropertiesSeed = randomSuffix;
+ instance.RandomPropertiesID = randomPropertyId;
+ if (!BonusListIDs.empty())
+ {
+ WorldPackets::Item::ItemBonusInstanceData bonusData;
+ instance.ItemBonus.Value.BonusListIDs = BonusListIDs;
+ instance.ItemBonus.HasValue = true;
+ }
+}
+
//
// --------- Loot ---------
//
@@ -434,6 +448,12 @@ void Loot::AddItem(LootStoreItem const& item)
{
LootItem generatedLoot(item);
generatedLoot.count = std::min(count, proto->GetMaxStackSize());
+ if (_difficultyBonusTreeMod)
+ {
+ std::set<uint32> bonusListIDs = sDB2Manager.GetItemBonusTree(generatedLoot.itemid, _difficultyBonusTreeMod);
+ generatedLoot.BonusListIDs.insert(generatedLoot.BonusListIDs.end(), bonusListIDs.begin(), bonusListIDs.end());
+ }
+
lootItems.push_back(generatedLoot);
count -= proto->GetMaxStackSize();
@@ -461,6 +481,8 @@ bool Loot::FillLoot(uint32 lootId, LootStore const& store, Player* lootOwner, bo
return false;
}
+ _difficultyBonusTreeMod = lootOwner->GetMap()->GetDifficultyLootBonusTreeMod();
+
items.reserve(MAX_NR_LOOT_ITEMS);
quest_items.reserve(MAX_NR_QUEST_ITEMS);
@@ -633,7 +655,7 @@ void Loot::NotifyItemRemoved(uint8 lootIndex)
i_next = i;
++i_next;
if (Player* player = ObjectAccessor::FindPlayer(*i))
- player->SendNotifyLootItemRemoved(lootIndex);
+ player->SendNotifyLootItemRemoved(player->GetLootGUID(), GetGUID(), lootIndex);
else
PlayersLooting.erase(i);
}
@@ -648,7 +670,7 @@ void Loot::NotifyMoneyRemoved()
i_next = i;
++i_next;
if (Player* player = ObjectAccessor::FindPlayer(*i))
- player->SendNotifyLootMoneyRemoved();
+ player->SendNotifyLootMoneyRemoved(GetGUID());
else
PlayersLooting.erase(i);
}
@@ -680,7 +702,7 @@ void Loot::NotifyQuestItemRemoved(uint8 questIndex)
break;
if (j < pql.size())
- player->SendNotifyLootItemRemoved(items.size()+j);
+ player->SendNotifyLootItemRemoved(player->GetLootGUID(), GetGUID(), items.size()+j);
}
}
else
@@ -854,40 +876,14 @@ bool Loot::hasOverThresholdItem() const
return false;
}
-ByteBuffer& operator<<(ByteBuffer& b, LootItem const& li)
+void Loot::BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* viewer, PermissionTypes permission) const
{
- b << uint32(li.itemid);
- b << uint32(li.count); // nr of items of this type
- b << uint32(/*sObjectMgr->GetItemTemplate(li.itemid)->DisplayInfoID*/);
- b << uint32(li.randomSuffix);
- b << uint32(li.randomPropertyId);
- //b << uint8(0); // slot type - will send after this function call
- return b;
-}
-
-ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
-{
- if (lv.permission == NONE_PERMISSION)
- {
- b << uint32(0); // gold
- b << uint8(0); // item count
- b << uint8(0); // currency count
- return b;
- }
-
- Loot &l = lv.loot;
-
- uint8 itemsShown = 0;
- uint8 currenciesShown = 0;
-
- b << uint32(l.gold); //gold
+ if (permission == NONE_PERMISSION)
+ return;
- size_t count_pos = b.wpos(); // pos of item count byte
- b << uint8(0); // item count placeholder
- size_t currency_count_pos = b.wpos(); // pos of currency count byte
- b << uint8(0); // currency count placeholder
+ packet.Coins = gold;
- switch (lv.permission)
+ switch (permission)
{
case GROUP_PERMISSION:
case MASTER_PERMISSION:
@@ -895,22 +891,22 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
{
// if you are not the round-robin group looter, you can only see
// blocked rolled items and quest items, and !ffa items
- for (uint8 i = 0; i < l.items.size(); ++i)
+ for (uint8 i = 0; i < items.size(); ++i)
{
- if (!l.items[i].is_looted && !l.items[i].freeforall && l.items[i].conditions.empty() && l.items[i].AllowedForPlayer(lv.viewer))
+ if (!items[i].is_looted && !items[i].freeforall && items[i].conditions.empty() && items[i].AllowedForPlayer(viewer))
{
uint8 slot_type;
- if (l.items[i].is_blocked) // for ML & restricted is_blocked = !is_underthreshold
+ if (items[i].is_blocked) // for ML & restricted is_blocked = !is_underthreshold
{
- switch (lv.permission)
+ switch (permission)
{
case GROUP_PERMISSION:
slot_type = LOOT_SLOT_TYPE_ROLL_ONGOING;
break;
case MASTER_PERMISSION:
{
- if (lv.viewer->GetGroup() && lv.viewer->GetGroup()->GetMasterLooterGuid() == lv.viewer->GetGUID())
+ if (viewer->GetGroup() && viewer->GetGroup()->GetMasterLooterGuid() == viewer->GetGUID())
slot_type = LOOT_SLOT_TYPE_MASTER;
else
slot_type = LOOT_SLOT_TYPE_LOCKED;
@@ -923,7 +919,7 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
continue;
}
}
- else if (l.roundRobinPlayer.IsEmpty() || lv.viewer->GetGUID() == l.roundRobinPlayer || !l.items[i].is_underthreshold)
+ else if (roundRobinPlayer.IsEmpty() || viewer->GetGUID() == roundRobinPlayer || !items[i].is_underthreshold)
{
// no round robin owner or he has released the loot
// or it IS the round robin group owner
@@ -934,26 +930,32 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
// item shall not be displayed.
continue;
- b << uint8(i) << l.items[i];
- b << uint8(slot_type);
- ++itemsShown;
+ WorldPackets::Loot::LootItem lootItem;
+ lootItem.LootListID = packet.Items.size()+1;
+ lootItem.LootItemType = slot_type;
+ lootItem.Quantity = items[i].count;
+ items[i].BuildItemInstance(lootItem.Loot);
+ packet.Items.push_back(lootItem);
}
}
break;
}
case ROUND_ROBIN_PERMISSION:
{
- for (uint8 i = 0; i < l.items.size(); ++i)
+ for (uint8 i = 0; i < items.size(); ++i)
{
- if (!l.items[i].is_looted && !l.items[i].freeforall && l.items[i].conditions.empty() && l.items[i].AllowedForPlayer(lv.viewer))
+ if (!items[i].is_looted && !items[i].freeforall && items[i].conditions.empty() && items[i].AllowedForPlayer(viewer))
{
- if (!l.roundRobinPlayer.IsEmpty() && lv.viewer->GetGUID() != l.roundRobinPlayer)
+ if (!roundRobinPlayer.IsEmpty() && viewer->GetGUID() != roundRobinPlayer)
// item shall not be displayed.
continue;
- b << uint8(i) << l.items[i];
- b << uint8(LOOT_SLOT_TYPE_ALLOW_LOOT);
- ++itemsShown;
+ WorldPackets::Loot::LootItem lootItem;
+ lootItem.LootListID = packet.Items.size()+1;
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
+ lootItem.Quantity = items[i].count;
+ items[i].BuildItemInstance(lootItem.Loot);
+ packet.Items.push_back(lootItem);
}
}
break;
@@ -961,128 +963,133 @@ ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv)
case ALL_PERMISSION:
case OWNER_PERMISSION:
{
- uint8 slot_type = lv.permission == OWNER_PERMISSION ? LOOT_SLOT_TYPE_OWNER : LOOT_SLOT_TYPE_ALLOW_LOOT;
- for (uint8 i = 0; i < l.items.size(); ++i)
+ for (uint8 i = 0; i < items.size(); ++i)
{
- if (!l.items[i].is_looted && !l.items[i].freeforall && l.items[i].conditions.empty() && l.items[i].AllowedForPlayer(lv.viewer))
+ if (!items[i].is_looted && !items[i].freeforall && items[i].conditions.empty() && items[i].AllowedForPlayer(viewer))
{
- b << uint8(i) << l.items[i];
- b << uint8(slot_type);
- ++itemsShown;
+ WorldPackets::Loot::LootItem lootItem;
+ lootItem.LootListID = packet.Items.size()+1;
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
+ lootItem.Quantity = items[i].count;
+ items[i].BuildItemInstance(lootItem.Loot);
+ packet.Items.push_back(lootItem);
}
}
break;
}
default:
- return b;
+ return;
}
- LootSlotType slotType = lv.permission == OWNER_PERMISSION ? LOOT_SLOT_TYPE_OWNER : LOOT_SLOT_TYPE_ALLOW_LOOT;
- QuestItemMap const& lootPlayerQuestItems = l.GetPlayerQuestItems();
- QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(lv.viewer->GetGUID().GetCounter());
+ QuestItemMap const& lootPlayerQuestItems = GetPlayerQuestItems();
+ QuestItemMap::const_iterator q_itr = lootPlayerQuestItems.find(viewer->GetGUID().GetCounter());
if (q_itr != lootPlayerQuestItems.end())
{
QuestItemList* q_list = q_itr->second;
for (QuestItemList::const_iterator qi = q_list->begin(); qi != q_list->end(); ++qi)
{
- LootItem &item = l.quest_items[qi->index];
+ LootItem const& item = quest_items[qi->index];
if (!qi->is_looted && !item.is_looted)
{
- b << uint8(l.items.size() + (qi - q_list->begin()));
- b << item;
+ WorldPackets::Loot::LootItem lootItem;
+ lootItem.LootListID = packet.Items.size()+1;
+ lootItem.Quantity = item.count;
+ item.BuildItemInstance(lootItem.Loot);
+
if (item.follow_loot_rules)
{
- switch (lv.permission)
+ switch (permission)
{
case MASTER_PERMISSION:
- b << uint8(LOOT_SLOT_TYPE_MASTER);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_MASTER;
break;
case RESTRICTED_PERMISSION:
- b << (item.is_blocked ? uint8(LOOT_SLOT_TYPE_LOCKED) : uint8(slotType));
+ lootItem.LootItemType = item.is_blocked ? LOOT_SLOT_TYPE_LOCKED : LOOT_SLOT_TYPE_ALLOW_LOOT;
break;
case GROUP_PERMISSION:
case ROUND_ROBIN_PERMISSION:
if (!item.is_blocked)
- b << uint8(LOOT_SLOT_TYPE_ALLOW_LOOT);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
else
- b << uint8(LOOT_SLOT_TYPE_ROLL_ONGOING);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ROLL_ONGOING;
break;
default:
- b << uint8(slotType);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
break;
}
}
else
- b << uint8(slotType);
- ++itemsShown;
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
+
+ packet.Items.push_back(lootItem);
}
}
}
- QuestItemMap const& lootPlayerFFAItems = l.GetPlayerFFAItems();
- QuestItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(lv.viewer->GetGUID().GetCounter());
+ QuestItemMap const& lootPlayerFFAItems = GetPlayerFFAItems();
+ QuestItemMap::const_iterator ffa_itr = lootPlayerFFAItems.find(viewer->GetGUID().GetCounter());
if (ffa_itr != lootPlayerFFAItems.end())
{
QuestItemList* ffa_list = ffa_itr->second;
for (QuestItemList::const_iterator fi = ffa_list->begin(); fi != ffa_list->end(); ++fi)
{
- LootItem &item = l.items[fi->index];
+ LootItem const& item = items[fi->index];
if (!fi->is_looted && !item.is_looted)
{
- b << uint8(fi->index);
- b << item;
- b << uint8(slotType);
- ++itemsShown;
+ WorldPackets::Loot::LootItem lootItem;
+ lootItem.LootListID = packet.Items.size()+1;
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
+ lootItem.Quantity = item.count;
+ item.BuildItemInstance(lootItem.Loot);
+ packet.Items.push_back(lootItem);
}
}
}
- QuestItemMap const& lootPlayerNonQuestNonFFAConditionalItems = l.GetPlayerNonQuestNonFFAConditionalItems();
- QuestItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(lv.viewer->GetGUID().GetCounter());
+ QuestItemMap const& lootPlayerNonQuestNonFFAConditionalItems = GetPlayerNonQuestNonFFAConditionalItems();
+ QuestItemMap::const_iterator nn_itr = lootPlayerNonQuestNonFFAConditionalItems.find(viewer->GetGUID().GetCounter());
if (nn_itr != lootPlayerNonQuestNonFFAConditionalItems.end())
{
QuestItemList* conditional_list = nn_itr->second;
for (QuestItemList::const_iterator ci = conditional_list->begin(); ci != conditional_list->end(); ++ci)
{
- LootItem &item = l.items[ci->index];
+ LootItem const& item = items[ci->index];
if (!ci->is_looted && !item.is_looted)
{
- b << uint8(ci->index);
- b << item;
+ WorldPackets::Loot::LootItem lootItem;
+ lootItem.LootListID = packet.Items.size()+1;
+ lootItem.Quantity = item.count;
+ item.BuildItemInstance(lootItem.Loot);
+
if (item.follow_loot_rules)
{
- switch (lv.permission)
+ switch (permission)
{
case MASTER_PERMISSION:
- b << uint8(LOOT_SLOT_TYPE_MASTER);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_MASTER;
break;
case RESTRICTED_PERMISSION:
- b << (item.is_blocked ? uint8(LOOT_SLOT_TYPE_LOCKED) : uint8(slotType));
+ lootItem.LootItemType = item.is_blocked ? LOOT_SLOT_TYPE_LOCKED : LOOT_SLOT_TYPE_ALLOW_LOOT;
break;
case GROUP_PERMISSION:
case ROUND_ROBIN_PERMISSION:
if (!item.is_blocked)
- b << uint8(LOOT_SLOT_TYPE_ALLOW_LOOT);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
else
- b << uint8(LOOT_SLOT_TYPE_ROLL_ONGOING);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ROLL_ONGOING;
break;
default:
- b << uint8(slotType);
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
break;
}
}
else
- b << uint8(slotType);
- ++itemsShown;
+ lootItem.LootItemType = LOOT_SLOT_TYPE_ALLOW_LOOT;
+
+ packet.Items.push_back(lootItem);
}
}
}
-
- //update number of items and currencies shown
- b.put<uint8>(count_pos, itemsShown);
- b.put<uint8>(currency_count_pos, currenciesShown);
-
- return b;
}
//
diff --git a/src/server/game/Loot/LootMgr.h b/src/server/game/Loot/LootMgr.h
index 3bd5fadc49d..105a44f76d5 100644
--- a/src/server/game/Loot/LootMgr.h
+++ b/src/server/game/Loot/LootMgr.h
@@ -29,6 +29,19 @@
#include <vector>
#include <list>
+namespace WorldPackets
+{
+ namespace Loot
+ {
+ class LootResponse;
+ }
+
+ namespace Item
+ {
+ struct ItemInstance;
+ }
+}
+
enum RollType
{
ROLL_PASS = 0,
@@ -116,7 +129,7 @@ enum LootSlotType
LOOT_SLOT_TYPE_ROLL_ONGOING = 1, // roll is ongoing. player cannot loot.
LOOT_SLOT_TYPE_MASTER = 2, // item can only be distributed by group loot master.
LOOT_SLOT_TYPE_LOCKED = 3, // item is shown in red. player cannot loot.
- LOOT_SLOT_TYPE_OWNER = 4 // ignore binding confirmation and etc, for single player looting
+ LOOT_SLOT_TYPE_OWNER = 4 // ignore binding confirmation and etc, for single player looting (6.x no longer used)
};
class Player;
@@ -151,6 +164,7 @@ struct LootItem
uint32 itemid;
uint32 randomSuffix;
int32 randomPropertyId;
+ std::vector<int32> BonusListIDs;
ConditionList conditions; // additional loot condition
GuidSet allowedGUIDs;
uint8 count : 8;
@@ -176,6 +190,8 @@ struct LootItem
bool AllowedForPlayer(Player const* player) const;
void AddAllowedLooter(Player const* player);
GuidSet const& GetAllowedLooters() const { return allowedGUIDs; }
+
+ void BuildItemInstance(WorldPackets::Item::ItemInstance& instance) const;
};
struct QuestItem
@@ -301,15 +317,9 @@ class LootValidatorRefManager : public RefManager<Loot, LootValidatorRef>
};
//=====================================================
-struct LootView;
-
-ByteBuffer& operator<<(ByteBuffer& b, LootItem const& li);
-ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv);
struct Loot
{
- friend ByteBuffer& operator<<(ByteBuffer& b, LootView const& lv);
-
QuestItemMap const& GetPlayerQuestItems() const { return PlayerQuestItems; }
QuestItemMap const& GetPlayerFFAItems() const { return PlayerFFAItems; }
QuestItemMap const& GetPlayerNonQuestNonFFAConditionalItems() const { return PlayerNonQuestNonFFAConditionalItems; }
@@ -326,9 +336,12 @@ struct Loot
// Only set for inventory items that can be right-click looted
ObjectGuid containerID;
- Loot(uint32 _gold = 0) : gold(_gold), unlootedCount(0), roundRobinPlayer(), loot_type(LOOT_CORPSE), maxDuplicates(1) { }
+ Loot(uint32 _gold = 0) : gold(_gold), unlootedCount(0), roundRobinPlayer(), loot_type(LOOT_CORPSE), maxDuplicates(1), _difficultyBonusTreeMod(0){ }
~Loot() { clear(); }
+ ObjectGuid const& GetGUID() const { return _GUID; }
+ void SetGUID(ObjectGuid const& guid) { _GUID = guid; }
+
// For deleting items at loot removal since there is no backward interface to the Item()
void DeleteLootItemFromContainerItemDB(uint32 itemID);
void DeleteLootMoneyFromContainerItemDB();
@@ -362,6 +375,7 @@ struct Loot
roundRobinPlayer.Clear();
loot_type = LOOT_NONE;
i_LootValidatorRefManager.clearReferences();
+ _difficultyBonusTreeMod = 0;
}
bool empty() const { return items.empty() && gold == 0; }
@@ -384,28 +398,27 @@ struct Loot
bool hasItemFor(Player* player) const;
bool hasOverThresholdItem() const;
- private:
- void FillNotNormalLootFor(Player* player, bool presentAtLooting);
- QuestItemList* FillFFALoot(Player* player);
- QuestItemList* FillQuestLoot(Player* player);
- QuestItemList* FillNonQuestNonFFAConditionalLoot(Player* player, bool presentAtLooting);
-
- GuidSet PlayersLooting;
- QuestItemMap PlayerQuestItems;
- QuestItemMap PlayerFFAItems;
- QuestItemMap PlayerNonQuestNonFFAConditionalItems;
-
- // All rolls are registered here. They need to know, when the loot is not valid anymore
- LootValidatorRefManager i_LootValidatorRefManager;
-};
+ // Builds data for SMSG_LOOT_RESPONSE
+ void BuildLootResponse(WorldPackets::Loot::LootResponse& packet, Player* viewer, PermissionTypes permission = ALL_PERMISSION) const;
-struct LootView
-{
- Loot &loot;
- Player* viewer;
- PermissionTypes permission;
- LootView(Loot &_loot, Player* _viewer, PermissionTypes _permission = ALL_PERMISSION)
- : loot(_loot), viewer(_viewer), permission(_permission) { }
+private:
+
+ void FillNotNormalLootFor(Player* player, bool presentAtLooting);
+ QuestItemList* FillFFALoot(Player* player);
+ QuestItemList* FillQuestLoot(Player* player);
+ QuestItemList* FillNonQuestNonFFAConditionalLoot(Player* player, bool presentAtLooting);
+
+ GuidSet PlayersLooting;
+ QuestItemMap PlayerQuestItems;
+ QuestItemMap PlayerFFAItems;
+ QuestItemMap PlayerNonQuestNonFFAConditionalItems;
+
+ // All rolls are registered here. They need to know, when the loot is not valid anymore
+ LootValidatorRefManager i_LootValidatorRefManager;
+
+ // Loot GUID
+ ObjectGuid _GUID;
+ uint32 _difficultyBonusTreeMod;
};
extern LootStore LootTemplates_Creature;
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 29041b5bccb..41594ad7d94 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3201,11 +3201,23 @@ void InstanceMap::SetResetSchedule(bool on)
}
}
-MapDifficulty const* Map::GetMapDifficulty() const
+MapDifficultyEntry const* Map::GetMapDifficulty() const
{
return GetMapDifficultyData(GetId(), GetDifficultyID());
}
+uint32 Map::GetDifficultyLootBonusTreeMod() const
+{
+ if (MapDifficultyEntry const* mapDifficulty = GetMapDifficulty())
+ if (mapDifficulty->ItemBonusTreeModID)
+ return mapDifficulty->ItemBonusTreeModID;
+
+ if (DifficultyEntry const* difficulty = sDifficultyStore.LookupEntry(GetDifficultyID()))
+ return difficulty->ItemBonusTreeModID;
+
+ return 0;
+}
+
bool Map::IsHeroic() const
{
if (DifficultyEntry const* difficulty = sDifficultyStore.LookupEntry(i_spawnMode))
@@ -3215,17 +3227,17 @@ bool Map::IsHeroic() const
uint32 InstanceMap::GetMaxPlayers() const
{
- MapDifficulty const* mapDiff = GetMapDifficulty();
- if (mapDiff && mapDiff->maxPlayers)
- return mapDiff->maxPlayers;
+ MapDifficultyEntry const* mapDiff = GetMapDifficulty();
+ if (mapDiff && mapDiff->MaxPlayers)
+ return mapDiff->MaxPlayers;
return GetEntry()->MaxPlayers;
}
uint32 InstanceMap::GetMaxResetDelay() const
{
- MapDifficulty const* mapDiff = GetMapDifficulty();
- return mapDiff ? mapDiff->resetTime : 0;
+ MapDifficultyEntry const* mapDiff = GetMapDifficulty();
+ return mapDiff ? mapDiff->RaidDuration : 0;
}
/* ******* Battleground Instance Maps ******* */
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 94b89484e15..d38852e50c9 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -386,7 +386,8 @@ class Map : public GridRefManager<NGridType>
// have meaning only for instanced map (that have set real difficulty)
Difficulty GetDifficultyID() const { return Difficulty(GetSpawnMode()); }
- MapDifficulty const* GetMapDifficulty() const;
+ MapDifficultyEntry const* GetMapDifficulty() const;
+ uint32 GetDifficultyLootBonusTreeMod() const;
bool Instanceable() const { return i_mapEntry && i_mapEntry->Instanceable(); }
bool IsDungeon() const { return i_mapEntry && i_mapEntry->IsDungeon(); }
diff --git a/src/server/game/Maps/MapManager.cpp b/src/server/game/Maps/MapManager.cpp
index a9acb2ef30a..89ca656675b 100644
--- a/src/server/game/Maps/MapManager.cpp
+++ b/src/server/game/Maps/MapManager.cpp
@@ -37,6 +37,7 @@
#include "WorldSession.h"
#include "Opcodes.h"
#include "AchievementMgr.h"
+#include "MiscPackets.h"
MapManager::MapManager()
{
@@ -135,7 +136,7 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck)
Difficulty targetDifficulty, requestedDifficulty;
targetDifficulty = requestedDifficulty = player->GetDifficultyID(entry);
// Get the highest available difficulty if current setting is higher than the instance allows
- MapDifficulty const* mapDiff = GetDownscaledMapDifficultyData(entry->ID, targetDifficulty);
+ MapDifficultyEntry const* mapDiff = GetDownscaledMapDifficultyData(entry->ID, targetDifficulty);
if (!mapDiff)
{
player->SendTransferAborted(mapid, TRANSFER_ABORT_DIFFICULTY, requestedDifficulty);
@@ -179,8 +180,8 @@ bool MapManager::CanPlayerEnter(uint32 mapid, Player* player, bool loginCheck)
if (!corpseMap)
{
- WorldPacket data(SMSG_CORPSE_NOT_IN_INSTANCE);
- player->GetSession()->SendPacket(&data);
+ WorldPackets::Misc::AreaTriggerNoCorpse packet;
+ player->GetSession()->SendPacket(packet.Write());
TC_LOG_DEBUG("maps", "MAP: Player '%s' does not have a corpse in instance '%s' and cannot enter.", player->GetName().c_str(), mapName);
return false;
}
diff --git a/src/server/game/Miscellaneous/Formulas.h b/src/server/game/Miscellaneous/Formulas.h
index bdc78479494..9396bbc110f 100644
--- a/src/server/game/Miscellaneous/Formulas.h
+++ b/src/server/game/Miscellaneous/Formulas.h
@@ -47,14 +47,18 @@ namespace Trinity
{
uint8 level;
- if (pl_level <= 5)
+ if (pl_level < 7)
level = 0;
- else if (pl_level <= 39)
- level = pl_level - 5 - pl_level / 10;
- else if (pl_level <= 59)
- level = pl_level - 1 - pl_level / 5;
+ else if (pl_level < 35)
+ {
+ uint8 count = 0;
+ for (int i = 15; i <= pl_level; ++i)
+ if (i % 5 == 0) ++count;
+
+ level = (pl_level - 7) - (count - 1);
+ }
else
- level = pl_level - 9;
+ level = pl_level - 10;
sScriptMgr->OnGrayLevelCalculation(level, pl_level);
return level;
@@ -83,7 +87,7 @@ namespace Trinity
{
uint8 diff;
- if (pl_level < 8)
+ if (pl_level < 4)
diff = 5;
else if (pl_level < 10)
diff = 6;
@@ -112,30 +116,15 @@ namespace Trinity
return diff;
}
- inline uint32 BaseGain(uint8 pl_level, uint8 mob_level, ContentLevels content)
+ inline uint32 BaseGain(uint8 pl_level, uint8 mob_level)
{
uint32 baseGain;
- uint32 nBaseExp;
- switch (content)
- {
- case CONTENT_1_60:
- nBaseExp = 45;
- break;
- case CONTENT_61_70:
- nBaseExp = 235;
- break;
- case CONTENT_71_80:
- nBaseExp = 580;
- break;
- case CONTENT_81_85:
- nBaseExp = 1878;
- break;
- default:
- TC_LOG_ERROR("misc", "BaseGain: Unsupported content level %u", content);
- nBaseExp = 45;
- break;
- }
+ GtOCTLevelExperienceEntry const* BaseExpPlayer = sGtOCTLevelExperienceStore.EvaluateTable(pl_level - 1, 1);
+ GtOCTLevelExperienceEntry const* BaseExpMob = sGtOCTLevelExperienceStore.EvaluateTable(mob_level - 1, 1);
+
+ GtOCTLevelExperienceEntry const* CoefPlayer = sGtOCTLevelExperienceStore.EvaluateTable(pl_level - 1, 4);
+ GtOCTLevelExperienceEntry const* CoefMob = sGtOCTLevelExperienceStore.EvaluateTable(mob_level - 1, 4);
if (mob_level >= pl_level)
{
@@ -143,7 +132,7 @@ namespace Trinity
if (nLevelDiff > 4)
nLevelDiff = 4;
- baseGain = ((pl_level * 5 + nBaseExp) * (20 + nLevelDiff) / 10 + 1) / 2;
+ baseGain = round(BaseExpPlayer->Data * (1 + 0.05f * nLevelDiff));
}
else
{
@@ -151,13 +140,13 @@ namespace Trinity
if (mob_level > gray_level)
{
uint8 ZD = GetZeroDifference(pl_level);
- baseGain = (pl_level * 5 + nBaseExp) * (ZD + mob_level - pl_level) / ZD;
+ baseGain = round(BaseExpMob->Data * ((1 - ((pl_level - mob_level) / float(ZD))) * (CoefMob->Data / CoefPlayer->Data)));
}
else
baseGain = 0;
}
- sScriptMgr->OnBaseGainCalculation(baseGain, pl_level, mob_level, content);
+ sScriptMgr->OnBaseGainCalculation(baseGain, pl_level, mob_level);
return baseGain;
}
@@ -171,10 +160,14 @@ namespace Trinity
{
float xpMod = 1.0f;
- gain = BaseGain(player->getLevel(), u->getLevel(), GetContentLevelsForMapAndZone(u->GetMapId(), u->GetZoneId()));
+ gain = BaseGain(player->getLevel(), u->getLevel());
if (gain && creature)
{
+ // Players get only 10% xp for killing creatures of lower expansion levels than himself
+ if ((uint32(creature->GetCreatureTemplate()->expansion) < GetExpansionForLevel(player->getLevel())))
+ gain = uint32(round(gain / 10.0f));
+
if (creature->isElite())
{
// Elites in instances have a 2.75x XP bonus instead of the regular 2x world bonus.
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index dc1b403bb2e..122181fb313 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -85,6 +85,8 @@ enum Expansions
MAX_EXPANSIONS = 6
};
+#define CURRENT_EXPANSION EXPANSION_WARLORDS_OF_DRAENOR;
+
enum Gender
{
GENDER_UNKNOWN = -1,
diff --git a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
index 2ea19a02824..0341af299be 100644
--- a/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/RandomMovementGenerator.cpp
@@ -56,12 +56,12 @@ void RandomMovementGenerator<Creature>::_setRandomLocation(Creature* creature)
Trinity::NormalizeMapCoord(destX);
Trinity::NormalizeMapCoord(destY);
- travelDistZ = distanceX*distanceX + distanceY*distanceY;
+ travelDistZ = range; // sin^2+cos^2=1, so travelDistZ=range^2; no need for sqrt below
if (is_air_ok) // 3D system above ground and above water (flying mode)
{
// Limit height change
- const float distanceZ = float(rand_norm()) * std::sqrt(travelDistZ)/2.0f;
+ const float distanceZ = float(rand_norm()) * travelDistZ/2.0f;
destZ = respZ + distanceZ;
float levelZ = map->GetWaterOrGroundLevel(destX, destY, destZ-2.0f);
@@ -73,7 +73,7 @@ void RandomMovementGenerator<Creature>::_setRandomLocation(Creature* creature)
else // 2D only
{
// 10.0 is the max that vmap high can check (MAX_CAN_FALL_DISTANCE)
- travelDistZ = travelDistZ >= 100.0f ? 10.0f : std::sqrt(travelDistZ);
+ travelDistZ = travelDistZ >= 10.0f ? 10.0f : travelDistZ;
// The fastest way to get an accurate result 90% of the time.
// Better result can be obtained like 99% accuracy with a ray light, but the cost is too high and the code is too long.
diff --git a/src/server/game/Movement/MovementStructures.cpp b/src/server/game/Movement/MovementStructures.cpp
index 841f739ff09..edbbed3a343 100644
--- a/src/server/game/Movement/MovementStructures.cpp
+++ b/src/server/game/Movement/MovementStructures.cpp
@@ -5294,9 +5294,9 @@ MovementStatusElements const* GetMovementStatusElementsSequence(uint32 opcode)
return DismissControlledVehicle;
case SMSG_MOVE_UPDATE_TELEPORT:
return MoveUpdateTeleport;
- case CMSG_FORCE_MOVE_ROOT_ACK:
+ case CMSG_MOVE_FORCE_ROOT_ACK:
return ForceMoveRootAck;
- case CMSG_FORCE_MOVE_UNROOT_ACK:
+ case CMSG_MOVE_FORCE_UNROOT_ACK:
return ForceMoveUnrootAck;
case CMSG_MOVE_FALL_RESET:
return MovementFallReset;
@@ -5426,13 +5426,13 @@ MovementStatusElements const* GetMovementStatusElementsSequence(uint32 opcode)
return MoveSetHover;
case SMSG_MOVE_UNSET_HOVER:
return MoveUnsetHover;
- case SMSG_MOVE_WATER_WALK:
+ case SMSG_MOVE_SET_WATER_WALK:
return MoveWaterWalk;
- case SMSG_MOVE_LAND_WALK:
+ case SMSG_MOVE_SET_LAND_WALK:
return MoveLandWalk;
- case SMSG_MOVE_FEATHER_FALL:
+ case SMSG_MOVE_SET_FEATHER_FALL:
return MoveFeatherFall;
- case SMSG_MOVE_NORMAL_FALL:
+ case SMSG_MOVE_SET_NORMAL_FALL:
return MoveNormalFall;
case SMSG_MOVE_ROOT:
return MoveRoot;
diff --git a/src/server/game/Movement/MovementStructures.h b/src/server/game/Movement/MovementStructures.h
index afa30b4c1c7..96d85a6fd0e 100644
--- a/src/server/game/Movement/MovementStructures.h
+++ b/src/server/game/Movement/MovementStructures.h
@@ -139,7 +139,7 @@ namespace Movement
class PacketSender
{
public:
- PacketSender(Unit* unit, OpcodeServer serverControl, OpcodeServer playerControl, OpcodeServer broadcast = SMSG_PLAYER_MOVE, ExtraMovementStatusElement* extras = NULL);
+ PacketSender(Unit* unit, OpcodeServer serverControl, OpcodeServer playerControl, OpcodeServer broadcast = SMSG_MOVE_UPDATE, ExtraMovementStatusElement* extras = NULL);
void Send() const;
diff --git a/src/server/game/Scripting/ScriptMgr.cpp b/src/server/game/Scripting/ScriptMgr.cpp
index 9c49958f10a..735328a0f1f 100644
--- a/src/server/game/Scripting/ScriptMgr.cpp
+++ b/src/server/game/Scripting/ScriptMgr.cpp
@@ -519,9 +519,9 @@ void ScriptMgr::OnZeroDifferenceCalculation(uint8& diff, uint8 playerLevel)
FOREACH_SCRIPT(FormulaScript)->OnZeroDifferenceCalculation(diff, playerLevel);
}
-void ScriptMgr::OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content)
+void ScriptMgr::OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel)
{
- FOREACH_SCRIPT(FormulaScript)->OnBaseGainCalculation(gain, playerLevel, mobLevel, content);
+ FOREACH_SCRIPT(FormulaScript)->OnBaseGainCalculation(gain, playerLevel, mobLevel);
}
void ScriptMgr::OnGainCalculation(uint32& gain, Player* player, Unit* unit)
diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h
index 0e9cdd9808f..b3e4a2314db 100644
--- a/src/server/game/Scripting/ScriptMgr.h
+++ b/src/server/game/Scripting/ScriptMgr.h
@@ -294,7 +294,7 @@ class FormulaScript : public ScriptObject
virtual void OnZeroDifferenceCalculation(uint8& /*diff*/, uint8 /*playerLevel*/) { }
// Called after calculating base experience gain.
- virtual void OnBaseGainCalculation(uint32& /*gain*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/, ContentLevels /*content*/) { }
+ virtual void OnBaseGainCalculation(uint32& /*gain*/, uint8 /*playerLevel*/, uint8 /*mobLevel*/) { }
// Called after calculating experience gain.
virtual void OnGainCalculation(uint32& /*gain*/, Player* /*player*/, Unit* /*unit*/) { }
@@ -944,7 +944,7 @@ class ScriptMgr
void OnGrayLevelCalculation(uint8& grayLevel, uint8 playerLevel);
void OnColorCodeCalculation(XPColorChar& color, uint8 playerLevel, uint8 mobLevel);
void OnZeroDifferenceCalculation(uint8& diff, uint8 playerLevel);
- void OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel, ContentLevels content);
+ void OnBaseGainCalculation(uint32& gain, uint8 playerLevel, uint8 mobLevel);
void OnGainCalculation(uint32& gain, Player* player, Unit* unit);
void OnGroupRateCalculation(float& rate, uint32 count, bool isRaid);
diff --git a/src/server/game/Server/Packets/AchievementPackets.cpp b/src/server/game/Server/Packets/AchievementPackets.cpp
index ee94fdfca67..e8009066a04 100644
--- a/src/server/game/Server/Packets/AchievementPackets.cpp
+++ b/src/server/game/Server/Packets/AchievementPackets.cpp
@@ -17,32 +17,51 @@
#include "AchievementPackets.h"
-WorldPacket const* WorldPackets::Achievement::AllAchievements::Write()
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Achievement::EarnedAchievement const& earned)
{
- _worldPacket << uint32(Earned.size());
- _worldPacket << uint32(Progress.size());
+ data << uint32(earned.Id);
+ data.AppendPackedTime(earned.Date);
+ data << earned.Owner;
+ data << uint32(earned.VirtualRealmAddress);
+ data << uint32(earned.NativeRealmAddress);
+ return data;
+}
- for (EarnedAchievement const& earned : Earned)
- {
- _worldPacket << uint32(earned.Id);
- _worldPacket.AppendPackedTime(earned.Date);
- _worldPacket << earned.Owner;
- _worldPacket << uint32(earned.VirtualRealmAddress);
- _worldPacket << uint32(earned.NativeRealmAddress);
- }
+ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Achievement::AllAchievements const& allAchievements)
+{
+ data << uint32(allAchievements.Earned.size());
+ data << uint32(allAchievements.Progress.size());
+
+ for (WorldPackets::Achievement::EarnedAchievement const& earned : allAchievements.Earned)
+ data << earned;
- for (CriteriaProgress const& progress : Progress)
+ for (WorldPackets::Achievement::CriteriaProgress const& progress : allAchievements.Progress)
{
- _worldPacket << uint32(progress.Id);
- _worldPacket << uint64(progress.Quantity);
- _worldPacket << progress.Player;
- _worldPacket.AppendPackedTime(progress.Date);
- _worldPacket << uint32(progress.TimeFromStart);
- _worldPacket << uint32(progress.TimeFromCreate);
- _worldPacket.WriteBits(progress.Flags, 4);
- _worldPacket.FlushBits();
+ data << uint32(progress.Id);
+ data << uint64(progress.Quantity);
+ data << progress.Player;
+ data.AppendPackedTime(progress.Date);
+ data << uint32(progress.TimeFromStart);
+ data << uint32(progress.TimeFromCreate);
+ data.WriteBits(progress.Flags, 4);
+ data.FlushBits();
}
+ return data;
+}
+
+WorldPacket const* WorldPackets::Achievement::AllAchievementData::Write()
+{
+ _worldPacket << Data;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::RespondInspectAchievements::Write()
+{
+ _worldPacket << Player;
+ _worldPacket << Data;
+
return &_worldPacket;
}
@@ -59,6 +78,21 @@ WorldPacket const* WorldPackets::Achievement::CriteriaUpdate::Write()
return &_worldPacket;
}
+WorldPacket const* WorldPackets::Achievement::CriteriaDeleted::Write()
+{
+ _worldPacket << uint32(CriteriaID);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::AchievementDeleted::Write()
+{
+ _worldPacket << uint32(AchievementID);
+ _worldPacket << uint32(Immunities);
+
+ return &_worldPacket;
+}
+
WorldPacket const* WorldPackets::Achievement::AchievementEarned::Write()
{
_worldPacket << Sender;
@@ -72,3 +106,73 @@ WorldPacket const* WorldPackets::Achievement::AchievementEarned::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Achievement::ServerFirstAchievement::Write()
+{
+ _worldPacket.WriteBits(Name.length(), 7);
+ _worldPacket.WriteBit(GuildAchievement);
+ _worldPacket << PlayerGUID;
+ _worldPacket << AchievementID;
+ _worldPacket.WriteString(Name);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::GuildCriteriaUpdate::Write()
+{
+ _worldPacket << uint32(Progress.size());
+
+ for (GuildCriteriaProgress const& progress : Progress)
+ {
+ _worldPacket << int32(progress.CriteriaID);
+ _worldPacket << uint32(progress.DateCreated);
+ _worldPacket << uint32(progress.DateStarted);
+ _worldPacket.AppendPackedTime(progress.DateUpdated);
+ _worldPacket << uint64(progress.Quantity);
+ _worldPacket << progress.PlayerGUID;
+ _worldPacket << int32(progress.Flags);
+ }
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::GuildCriteriaDeleted::Write()
+{
+ _worldPacket << GuildGUID;
+ _worldPacket << int32(CriteriaID);
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Achievement::GuildSetFocusedAchievement::Read()
+{
+ _worldPacket >> AchievementID;
+}
+
+WorldPacket const* WorldPackets::Achievement::GuildAchievementDeleted::Write()
+{
+ _worldPacket << GuildGUID;
+ _worldPacket << uint32(AchievementID);
+ _worldPacket.AppendPackedTime(TimeDeleted);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::GuildAchievementEarned::Write()
+{
+ _worldPacket << GuildGUID;
+ _worldPacket << uint32(AchievementID);
+ _worldPacket.AppendPackedTime(TimeEarned);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Achievement::AllGuildAchievements::Write()
+{
+ _worldPacket << uint32(Earned.size());
+
+ for (EarnedAchievement const& earned : Earned)
+ _worldPacket << earned;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/AchievementPackets.h b/src/server/game/Server/Packets/AchievementPackets.h
index 27d82ab0906..18bf512165f 100644
--- a/src/server/game/Server/Packets/AchievementPackets.h
+++ b/src/server/game/Server/Packets/AchievementPackets.h
@@ -45,15 +45,31 @@ namespace WorldPackets
uint32 TimeFromCreate = 0;
};
- class AllAchievements final : public ServerPacket
+ struct AllAchievements
+ {
+ std::vector<EarnedAchievement> Earned;
+ std::vector<CriteriaProgress> Progress;
+ };
+
+ class AllAchievementData final : public ServerPacket
{
public:
- AllAchievements() : ServerPacket(SMSG_ALL_ACHIEVEMENT_DATA) { }
+ AllAchievementData() : ServerPacket(SMSG_ALL_ACHIEVEMENT_DATA) { }
WorldPacket const* Write() override;
- std::vector<EarnedAchievement> Earned;
- std::vector<CriteriaProgress> Progress;
+ AllAchievements Data;
+ };
+
+ class RespondInspectAchievements final : public ServerPacket
+ {
+ public:
+ RespondInspectAchievements() : ServerPacket(SMSG_RESPOND_INSPECT_ACHIEVEMENTS) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Player;
+ AllAchievements Data;
};
class CriteriaUpdate final : public ServerPacket
@@ -72,6 +88,27 @@ namespace WorldPackets
uint32 CreationTime = 0;
};
+ class CriteriaDeleted final : public ServerPacket
+ {
+ public:
+ CriteriaDeleted() : ServerPacket(SMSG_CRITERIA_DELETED, 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 CriteriaID = 0;
+ };
+
+ class AchievementDeleted final : public ServerPacket
+ {
+ public:
+ AchievementDeleted() : ServerPacket(SMSG_ACHIEVEMENT_DELETED, 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 AchievementID = 0;
+ uint32 Immunities = 0; // this is just garbage, not used by client
+ };
+
class AchievementEarned final : public ServerPacket
{
public:
@@ -87,6 +124,95 @@ namespace WorldPackets
bool Initial = false;
ObjectGuid Sender;
};
+
+ class ServerFirstAchievement final : public ServerPacket
+ {
+ public:
+ ServerFirstAchievement() : ServerPacket(SMSG_SERVER_FIRST_ACHIEVEMENT) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid PlayerGUID;
+ std::string Name;
+ uint32 AchievementID = 0;
+ bool GuildAchievement = false;
+ };
+
+ struct GuildCriteriaProgress
+ {
+ int32 CriteriaID = 0;
+ uint32 DateCreated = 0;
+ uint32 DateStarted = 0;
+ time_t DateUpdated = 0;
+ uint64 Quantity = 0;
+ ObjectGuid PlayerGUID;
+ int32 Flags = 0;
+ };
+
+ class GuildCriteriaUpdate final : public ServerPacket
+ {
+ public:
+ GuildCriteriaUpdate() : ServerPacket(SMSG_GUILD_CRITERIA_UPDATE) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<GuildCriteriaProgress> Progress;
+ };
+
+ class GuildCriteriaDeleted final : public ServerPacket
+ {
+ public:
+ GuildCriteriaDeleted() : ServerPacket(SMSG_GUILD_CRITERIA_DELETED, 16 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid GuildGUID;
+ int32 CriteriaID = 0;
+ };
+
+ class GuildSetFocusedAchievement final : public ClientPacket
+ {
+ public:
+ GuildSetFocusedAchievement(WorldPacket&& packet) : ClientPacket(CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT, std::move(packet)) { }
+
+ void Read() override;
+
+ uint32 AchievementID = 0;
+ };
+
+ class GuildAchievementDeleted final : public ServerPacket
+ {
+ public:
+ GuildAchievementDeleted() : ServerPacket(SMSG_GUILD_ACHIEVEMENT_DELETED, 16 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid GuildGUID;
+ uint32 AchievementID = 0;
+ time_t TimeDeleted = time_t(0);
+ };
+
+ class GuildAchievementEarned final : public ServerPacket
+ {
+ public:
+ GuildAchievementEarned() : ServerPacket(SMSG_GUILD_ACHIEVEMENT_EARNED, 16 + 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 AchievementID = 0;
+ ObjectGuid GuildGUID;
+ time_t TimeEarned = time_t(0);
+ };
+
+ class AllGuildAchievements final : public ServerPacket
+ {
+ public:
+ AllGuildAchievements() : ServerPacket(SMSG_ALL_GUILD_ACHIEVEMENTS) { }
+
+ WorldPacket const* Write() override;
+
+ std::vector<EarnedAchievement> Earned;
+ };
}
}
diff --git a/src/server/game/Server/Packets/AuctionHousePackets.cpp b/src/server/game/Server/Packets/AuctionHousePackets.cpp
index 596419d71c7..6135e294e4c 100644
--- a/src/server/game/Server/Packets/AuctionHousePackets.cpp
+++ b/src/server/game/Server/Packets/AuctionHousePackets.cpp
@@ -19,6 +19,20 @@
#include "AuctionHouseMgr.h"
#include "ObjectGuid.h"
+void WorldPackets::AuctionHouse::AuctionHelloRequest::Read()
+{
+ _worldPacket >> Guid;
+}
+
+WorldPacket const* WorldPackets::AuctionHouse::AuctionHelloResponse::Write()
+{
+ _worldPacket << Guid;
+ _worldPacket.WriteBit(OpenForBusiness);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
WorldPackets::AuctionHouse::AuctionCommandResult::AuctionCommandResult()
: ServerPacket(SMSG_AUCTION_COMMAND_RESULT, 4 + 4 + 4 + 8 + 4 + 8 + 8 + 8) { }
diff --git a/src/server/game/Server/Packets/AuctionHousePackets.h b/src/server/game/Server/Packets/AuctionHousePackets.h
index 5c8f7f53d5f..0af8f488dfd 100644
--- a/src/server/game/Server/Packets/AuctionHousePackets.h
+++ b/src/server/game/Server/Packets/AuctionHousePackets.h
@@ -26,6 +26,26 @@ namespace WorldPackets
{
namespace AuctionHouse
{
+ class AuctionHelloRequest final : public ClientPacket
+ {
+ public:
+ AuctionHelloRequest(WorldPacket&& packet) : ClientPacket(CMSG_AUCTION_HELLO_REQUEST, std::move(packet)) { }
+
+ void Read() override;
+ ObjectGuid Guid;
+ };
+
+ class AuctionHelloResponse final : public ServerPacket
+ {
+ public:
+ AuctionHelloResponse() : ServerPacket(SMSG_AUCTION_HELLO_RESPONSE, 1 + 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Guid;
+ bool OpenForBusiness = true;
+ };
+
class AuctionCommandResult final : public ServerPacket
{
public:
diff --git a/src/server/game/Server/Packets/BlackMarketPackets.cpp b/src/server/game/Server/Packets/BlackMarketPackets.cpp
new file mode 100644
index 00000000000..5a4bad63d65
--- /dev/null
+++ b/src/server/game/Server/Packets/BlackMarketPackets.cpp
@@ -0,0 +1,32 @@
+/*
+* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+*
+* 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 "BlackMarketPackets.h"
+
+void WorldPackets::BlackMarket::BlackMarketOpen::Read()
+{
+ _worldPacket >> Guid;
+}
+
+WorldPacket const* WorldPackets::BlackMarket::BlackMarketOpenResult::Write()
+{
+ _worldPacket << Guid;
+ _worldPacket.WriteBit(Enable);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/BlackMarketPackets.h b/src/server/game/Server/Packets/BlackMarketPackets.h
new file mode 100644
index 00000000000..9c04a639fc0
--- /dev/null
+++ b/src/server/game/Server/Packets/BlackMarketPackets.h
@@ -0,0 +1,51 @@
+/*
+* Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+*
+* This program is free software; you can redistribute it and/or modify it
+* under the terms of the GNU General Public License as published by the
+* Free Software Foundation; either version 2 of the License, or (at your
+* option) any later version.
+*
+* This program is distributed in the hope that it will be useful, but WITHOUT
+* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+* more details.
+*
+* You should have received a copy of the GNU General Public License along
+* with this program. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef BlackMarketPackets_h__
+#define BlackMarketPackets_h__
+
+#include "Packet.h"
+#include "ObjectGuid.h"
+#include "WorldSession.h"
+
+namespace WorldPackets
+{
+ namespace BlackMarket
+ {
+ class BlackMarketOpen final : public ClientPacket
+ {
+ public:
+ BlackMarketOpen(WorldPacket&& packet) : ClientPacket(CMSG_BLACK_MARKET_OPEN, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Guid;
+ };
+
+ class BlackMarketOpenResult final : public ServerPacket
+ {
+ public:
+ BlackMarketOpenResult() : ServerPacket(SMSG_BLACK_MARKET_OPEN_RESULT, 15) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Guid;
+ bool Enable = true;
+ };
+ }
+}
+#endif // BlackMarketPackets_h__
diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h
index c65de450e6c..1004b5656a8 100644
--- a/src/server/game/Server/Packets/CharacterPackets.h
+++ b/src/server/game/Server/Packets/CharacterPackets.h
@@ -28,7 +28,10 @@ namespace WorldPackets
class EnumCharacters final : public ClientPacket
{
public:
- EnumCharacters(WorldPacket&& packet) : ClientPacket(CMSG_CHAR_ENUM, std::move(packet)) { }
+ EnumCharacters(WorldPacket&& packet) : ClientPacket(std::move(packet))
+ {
+ ASSERT(GetOpcode() == CMSG_CHAR_ENUM || GetOpcode() == CMSG_CHAR_UNDELETE_ENUM);
+ }
void Read() override { }
};
@@ -383,6 +386,14 @@ namespace WorldPackets
uint32 Result = 0; ///< @see enum CharacterUndeleteResult
};
+ class GetUndeleteCooldownStatus final : public ClientPacket
+ {
+ public:
+ GetUndeleteCooldownStatus(WorldPacket&& packet) : ClientPacket(CMSG_GET_UNDELETE_COOLDOWN_STATUS, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
class UndeleteCooldownStatusResponse final : public ServerPacket
{
public:
diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h
index 842382df00d..3ab4fea2220 100644
--- a/src/server/game/Server/Packets/CombatLogPackets.h
+++ b/src/server/game/Server/Packets/CombatLogPackets.h
@@ -28,7 +28,7 @@ namespace WorldPackets
class SpellNonMeleeDamageLog final : public ServerPacket
{
public:
- SpellNonMeleeDamageLog() : ServerPacket(SMSG_SPELLNONMELEEDAMAGELOG, 60) { }
+ SpellNonMeleeDamageLog() : ServerPacket(SMSG_SPELL_NON_MELEE_DAMAGE_LOG, 60) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/ItemPackets.cpp b/src/server/game/Server/Packets/ItemPackets.cpp
index 3d62b1bb575..17f26852315 100644
--- a/src/server/game/Server/Packets/ItemPackets.cpp
+++ b/src/server/game/Server/Packets/ItemPackets.cpp
@@ -157,6 +157,14 @@ void WorldPackets::Item::AutoEquipItem::Read()
>> Slot;
}
+void WorldPackets::Item::AutoStoreBagItem::Read()
+{
+ _worldPacket >> Inv
+ >> ContainerSlotB
+ >> ContainerSlotA
+ >> SlotA;
+}
+
void WorldPackets::Item::DestroyItem::Read()
{
_worldPacket >> Count
diff --git a/src/server/game/Server/Packets/ItemPackets.h b/src/server/game/Server/Packets/ItemPackets.h
index f5c8bbf24b7..079d7839e90 100644
--- a/src/server/game/Server/Packets/ItemPackets.h
+++ b/src/server/game/Server/Packets/ItemPackets.h
@@ -28,7 +28,7 @@ namespace WorldPackets
class BuyBackItem final : public ClientPacket
{
public:
- BuyBackItem(WorldPacket&& packet) : ClientPacket(CMSG_BUYBACK_ITEM, std::move(packet)) { }
+ BuyBackItem(WorldPacket&& packet) : ClientPacket(CMSG_BUY_BACK_ITEM, std::move(packet)) { }
void Read() override;
@@ -188,6 +188,19 @@ namespace WorldPackets
uint8 PackSlot = 0;
};
+ class AutoStoreBagItem final : public ClientPacket
+ {
+ public:
+ AutoStoreBagItem(WorldPacket&& packet) : ClientPacket(CMSG_AUTOSTORE_BAG_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ uint8 ContainerSlotB = 0;
+ InvUpdate Inv;
+ uint8 ContainerSlotA = 0;
+ uint8 SlotA = 0;
+ };
+
class DestroyItem final : public ClientPacket
{
public:
diff --git a/src/server/game/Server/Packets/LootPackets.cpp b/src/server/game/Server/Packets/LootPackets.cpp
index 5a8027858e3..e8c365ea45b 100644
--- a/src/server/game/Server/Packets/LootPackets.cpp
+++ b/src/server/game/Server/Packets/LootPackets.cpp
@@ -21,3 +21,88 @@ void WorldPackets::Loot::LootUnit::Read()
{
_worldPacket >> Unit;
}
+
+WorldPacket const* WorldPackets::Loot::LootResponse::Write()
+{
+ _worldPacket << LootObj;
+ _worldPacket << Owner;
+ _worldPacket << Threshold;
+ _worldPacket << LootMethod;
+ _worldPacket << AcquireReason;
+ _worldPacket << FailureReason;
+ _worldPacket << Coins;
+ _worldPacket << uint32(Items.size());
+ _worldPacket << uint32(Currencies.size());
+
+ for (LootItem const& item : Items)
+ {
+ _worldPacket.WriteBits(item.Type, 2);
+ _worldPacket.WriteBits(item.UIType, 3);
+ _worldPacket.WriteBit(item.CanTradeToTapList);
+ _worldPacket.FlushBits();
+
+ _worldPacket << item.Quantity;
+ _worldPacket << item.LootItemType;
+ _worldPacket << item.LootListID;
+ _worldPacket << item.Loot; // WorldPackets::Item::ItemInstance
+ }
+
+ for (LootCurrency const& currency : Currencies)
+ {
+ _worldPacket << currency.CurrencyID;
+ _worldPacket << currency.Quantity;
+ _worldPacket << currency.LootListID;
+ _worldPacket.WriteBits(currency.UIType, 3);
+ _worldPacket.FlushBits();
+ }
+
+ _worldPacket.WriteBit(PersonalLooting);
+ _worldPacket.WriteBit(Acquired);
+ _worldPacket.WriteBit(AELooting);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Loot::AutoStoreLootItem::Read()
+{
+ uint32 Count;
+ _worldPacket >> Count;
+
+ Loot.resize(Count);
+ for (uint32 i = 0; i < Count; ++i)
+ {
+ _worldPacket >> Loot[i].Object;
+ _worldPacket >> Loot[i].LootListID;
+ }
+}
+
+WorldPacket const* WorldPackets::Loot::LootRemoved::Write()
+{
+ _worldPacket << Owner;
+ _worldPacket << LootObj;
+ _worldPacket << LootListID;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Loot::LootRelease::Read()
+{
+ _worldPacket >> Unit;
+}
+
+WorldPacket const* WorldPackets::Loot::LootMoneyNotify::Write()
+{
+ _worldPacket << Money;
+ _worldPacket.WriteBit(SoleLooter);
+ _worldPacket.FlushBits();
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Loot::CoinRemoved::Write()
+{
+ _worldPacket << LootObj;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/LootPackets.h b/src/server/game/Server/Packets/LootPackets.h
index c12cc7224c7..74a5c58d649 100644
--- a/src/server/game/Server/Packets/LootPackets.h
+++ b/src/server/game/Server/Packets/LootPackets.h
@@ -20,6 +20,7 @@
#include "Packet.h"
#include "ObjectGuid.h"
+#include "ItemPackets.h"
namespace WorldPackets
{
@@ -34,6 +35,114 @@ namespace WorldPackets
ObjectGuid Unit;
};
+
+ struct LootItem
+ {
+ uint8 Type = 0;
+ uint8 UIType = 0;
+ uint32 Quantity = 0;
+ uint8 LootItemType = 0;
+ uint8 LootListID = 0;
+ bool CanTradeToTapList = false;
+ WorldPackets::Item::ItemInstance Loot;
+ };
+
+ struct LootCurrency
+ {
+ uint32 CurrencyID = 0;
+ uint32 Quantity = 0;
+ uint8 LootListID = 0;
+ uint8 UIType = 0;
+ };
+
+ class LootResponse final : public ServerPacket
+ {
+ public:
+ LootResponse() : ServerPacket(SMSG_LOOT_RESPONSE, 100) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid LootObj;
+ ObjectGuid Owner;
+ uint8 Threshold = 17; // Most common value
+ uint8 LootMethod = 0;
+ uint8 AcquireReason = 0;
+ uint8 FailureReason = 2; // Most common value
+ uint32 Coins = 0;
+ std::vector<LootItem> Items;
+ std::vector<LootCurrency> Currencies;
+ bool PersonalLooting = false;
+ bool Acquired = false;
+ bool AELooting = false;
+ };
+
+ struct LootRequest
+ {
+ ObjectGuid Object;
+ uint8 LootListID = 0;
+ };
+
+ // PlayerCliLootItem
+ class AutoStoreLootItem final : public ClientPacket
+ {
+ public:
+ AutoStoreLootItem(WorldPacket&& packet) : ClientPacket(CMSG_AUTOSTORE_LOOT_ITEM, std::move(packet)) { }
+
+ void Read() override;
+
+ std::vector<LootRequest> Loot;
+ };
+
+ class LootRemoved final : public ServerPacket
+ {
+ public:
+ LootRemoved() : ServerPacket(SMSG_LOOT_REMOVED, 30) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid LootObj;
+ ObjectGuid Owner;
+ uint8 LootListID = 0;
+ };
+
+ class LootRelease final : public ClientPacket
+ {
+ public:
+ LootRelease(WorldPacket&& packet) : ClientPacket(CMSG_LOOT_RELEASE, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Unit;
+ };
+
+ class LootMoney final : public ClientPacket
+ {
+ public:
+ LootMoney(WorldPacket&& packet) : ClientPacket(CMSG_LOOT_MONEY, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class LootMoneyNotify final : public ServerPacket
+ {
+ public:
+ LootMoneyNotify() : ServerPacket(SMSG_LOOT_MONEY_NOTIFY, 5) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 Money = 0;
+ bool SoleLooter = false;
+ };
+
+ class CoinRemoved final : public ServerPacket
+ {
+ public:
+ CoinRemoved() : ServerPacket(SMSG_COIN_REMOVED, 9) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid LootObj;
+ };
}
}
diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp
index 937bd75c4b9..da92f65020a 100644
--- a/src/server/game/Server/Packets/MiscPackets.cpp
+++ b/src/server/game/Server/Packets/MiscPackets.cpp
@@ -207,3 +207,55 @@ WorldPacket const* WorldPackets::Misc::RaidDifficultySet::Write()
_worldPacket << uint8(Legacy);
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Misc::CorpseReclaimDelay::Write()
+{
+ _worldPacket << Remaining;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Misc::DeathReleaseLoc::Write()
+{
+ _worldPacket << MapID;
+ _worldPacket << float(Loc.x);
+ _worldPacket << float(Loc.y);
+ _worldPacket << float(Loc.z);
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Misc::PreRessurect::Write()
+{
+ _worldPacket << PlayerGUID;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Misc::ReclaimCorpse::Read()
+{
+ _worldPacket >> CorpseGUID;
+}
+
+void WorldPackets::Misc::RepopRequest::Read()
+{
+ CheckInstance = _worldPacket.ReadBit();
+}
+
+WorldPacket const* WorldPackets::Misc::RequestCemeteryListResponse::Write()
+{
+ _worldPacket.WriteBit(IsGossipTriggered);
+ _worldPacket.FlushBits();
+
+ _worldPacket << uint32(CemeteryID.size());
+ for (uint32 cemetery : CemeteryID)
+ _worldPacket << cemetery;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Misc::ResurrectResponse::Read()
+{
+ _worldPacket >> Resurrecter;
+ _worldPacket >> Response;
+}
diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h
index ae12389e791..b46b0aed60a 100644
--- a/src/server/game/Server/Packets/MiscPackets.h
+++ b/src/server/game/Server/Packets/MiscPackets.h
@@ -132,7 +132,7 @@ namespace WorldPackets
class TimeSyncResponse final : public ClientPacket
{
public:
- TimeSyncResponse(WorldPacket&& packet) : ClientPacket(CMSG_TIME_SYNC_RESP, std::move(packet)) { }
+ TimeSyncResponse(WorldPacket&& packet) : ClientPacket(CMSG_TIME_SYNC_RESPONSE, std::move(packet)) { }
void Read() override;
@@ -160,10 +160,18 @@ namespace WorldPackets
uint32 MovieID = 0;
};
+ class UITimeRequest final : public ClientPacket
+ {
+ public:
+ UITimeRequest(WorldPacket&& packet) : ClientPacket(CMSG_UI_TIME_REQUEST, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
class UITime final : public ServerPacket
{
public:
- UITime() : ServerPacket(SMSG_WORLD_STATE_UI_TIMER_UPDATE, 4) { }
+ UITime() : ServerPacket(SMSG_UI_TIME, 4) { }
WorldPacket const* Write() override;
@@ -229,7 +237,7 @@ namespace WorldPackets
void Read() override;
- int32 DifficultyID;
+ int32 DifficultyID = 0;
};
class SetRaidDifficulty final : public ClientPacket
@@ -239,8 +247,8 @@ namespace WorldPackets
void Read() override;
- int32 DifficultyID;
- uint8 Legacy;
+ int32 DifficultyID = 0;
+ uint8 Legacy = 0;
};
class DungeonDifficultySet final : public ServerPacket
@@ -250,7 +258,7 @@ namespace WorldPackets
WorldPacket const* Write() override;
- int32 DifficultyID;
+ int32 DifficultyID = 0;
};
class RaidDifficultySet final : public ServerPacket
@@ -260,8 +268,105 @@ namespace WorldPackets
WorldPacket const* Write() override;
- int32 DifficultyID;
- uint8 Legacy;
+ int32 DifficultyID = 0;
+ uint8 Legacy = 0;
+ };
+
+ class CorpseReclaimDelay : public ServerPacket
+ {
+ public:
+ CorpseReclaimDelay() : ServerPacket(SMSG_CORPSE_RECLAIM_DELAY, 4) { }
+
+ WorldPacket const* Write() override;
+
+ uint32 Remaining = 0;
+ };
+
+ class DeathReleaseLoc : public ServerPacket
+ {
+ public:
+ DeathReleaseLoc() : ServerPacket(SMSG_DEATH_RELEASE_LOC, 4 + (3 * 4)) { }
+
+ WorldPacket const* Write() override;
+
+ int32 MapID = 0;
+ G3D::Vector3 Loc;
+ };
+
+ class PortGraveyard final : public ClientPacket
+ {
+ public:
+ PortGraveyard(WorldPacket&& packet) : ClientPacket(CMSG_PORT_GRAVEYARD, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class PreRessurect : public ServerPacket
+ {
+ public:
+ PreRessurect() : ServerPacket(SMSG_PRE_RESSURECT, 18) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid PlayerGUID;
+ };
+
+ class ReclaimCorpse final : public ClientPacket
+ {
+ public:
+ ReclaimCorpse(WorldPacket&& packet) : ClientPacket(CMSG_RECLAIM_CORPSE, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid CorpseGUID;
+ };
+
+ class RepopRequest final : public ClientPacket
+ {
+ public:
+ RepopRequest(WorldPacket&& packet) : ClientPacket(CMSG_REPOP_REQUEST, std::move(packet)) { }
+
+ void Read() override;
+
+ bool CheckInstance = false;
+ };
+
+ class RequestCemeteryList final : public ClientPacket
+ {
+ public:
+ RequestCemeteryList(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_CEMETERY_LIST, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class RequestCemeteryListResponse : public ServerPacket
+ {
+ public:
+ RequestCemeteryListResponse() : ServerPacket(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, 1) { }
+
+ WorldPacket const* Write() override;
+
+ bool IsGossipTriggered = false;
+ std::vector<uint32> CemeteryID;
+ };
+
+ class ResurrectResponse final : public ClientPacket
+ {
+ public:
+ ResurrectResponse(WorldPacket&& packet) : ClientPacket(CMSG_RESURRECT_RESPONSE, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Resurrecter;
+ uint32 Response = 0;
+ };
+
+ class AreaTriggerNoCorpse : public ServerPacket
+ {
+ public:
+ AreaTriggerNoCorpse() : ServerPacket(SMSG_AREA_TRIGGER_NO_CORPSE, 0) { }
+
+ WorldPacket const* Write() override { return &_worldPacket; }
};
}
}
diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp
index 242515e52b6..9a208670804 100644
--- a/src/server/game/Server/Packets/MovementPackets.cpp
+++ b/src/server/game/Server/Packets/MovementPackets.cpp
@@ -476,7 +476,7 @@ WorldPacket const* WorldPackets::Movement::MoveSetFlag::Write()
return &_worldPacket;
}
-WorldPacket const* WorldPackets::Movement::ServerPlayerMovement::Write()
+WorldPacket const* WorldPackets::Movement::MoveUpdate::Write()
{
_worldPacket << *movementInfo;
diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h
index 4f511acb0e8..31f30d74c04 100644
--- a/src/server/game/Server/Packets/MovementPackets.h
+++ b/src/server/game/Server/Packets/MovementPackets.h
@@ -42,10 +42,10 @@ namespace WorldPackets
MovementInfo movementInfo;
};
- class ServerPlayerMovement final : public ServerPacket
+ class MoveUpdate final : public ServerPacket
{
public:
- ServerPlayerMovement() : ServerPacket(SMSG_PLAYER_MOVE) { }
+ MoveUpdate() : ServerPacket(SMSG_MOVE_UPDATE) { }
WorldPacket const* Write() override;
@@ -107,7 +107,7 @@ namespace WorldPackets
class MonsterMove final : public ServerPacket
{
public:
- MonsterMove() : ServerPacket(SMSG_MONSTER_MOVE) { }
+ MonsterMove() : ServerPacket(SMSG_ON_MONSTER_MOVE) { }
void InitializeSplineData(::Movement::MoveSpline const& moveSpline);
diff --git a/src/server/game/Server/Packets/NPCPackets.cpp b/src/server/game/Server/Packets/NPCPackets.cpp
index 1df59cd469d..bd3fe1e5803 100644
--- a/src/server/game/Server/Packets/NPCPackets.cpp
+++ b/src/server/game/Server/Packets/NPCPackets.cpp
@@ -118,3 +118,10 @@ WorldPacket const* WorldPackets::NPC::TrainerList::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::NPC::ShowBank::Write()
+{
+ _worldPacket << Guid;
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/NPCPackets.h b/src/server/game/Server/Packets/NPCPackets.h
index 823632e8f6f..840041983d9 100644
--- a/src/server/game/Server/Packets/NPCPackets.h
+++ b/src/server/game/Server/Packets/NPCPackets.h
@@ -127,6 +127,16 @@ namespace WorldPackets
int32 TrainerID = 1;
std::vector<TrainerListSpell> Spells;
};
+
+ class ShowBank final : public ServerPacket
+ {
+ public:
+ ShowBank() : ServerPacket(SMSG_SHOW_BANK, 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Guid;
+ };
}
}
diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp
index e3f8dc01335..4d6a0a56463 100644
--- a/src/server/game/Server/Packets/QueryPackets.cpp
+++ b/src/server/game/Server/Packets/QueryPackets.cpp
@@ -265,3 +265,41 @@ WorldPacket const* WorldPackets::Query::QueryGameObjectResponse::Write()
return &_worldPacket;
}
+
+WorldPacket const* WorldPackets::Query::CorpseLocation::Write()
+{
+ _worldPacket.WriteBit(Valid);
+ _worldPacket.FlushBits();
+
+ _worldPacket << ActualMapID;
+ _worldPacket << Position.x;
+ _worldPacket << Position.y;
+ _worldPacket << Position.z;
+ _worldPacket << MapID;
+ _worldPacket << Transport;
+
+ return &_worldPacket;
+}
+
+void WorldPackets::Query::QueryCorpseTransport::Read()
+{
+ _worldPacket >> Transport;
+}
+
+WorldPacket const* WorldPackets::Query::CorpseTransportQuery::Write()
+{
+ _worldPacket << Position.x;
+ _worldPacket << Position.y;
+ _worldPacket << Position.z;
+ _worldPacket << Facing;
+
+ return &_worldPacket;
+}
+
+WorldPacket const* WorldPackets::Query::QueryTimeResponse::Write()
+{
+ _worldPacket << uint32(CurrentTime);
+ _worldPacket << int32(TimeOutRequest);
+
+ return &_worldPacket;
+}
diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h
index f2ab09f2b6b..9b131ae82be 100644
--- a/src/server/game/Server/Packets/QueryPackets.h
+++ b/src/server/game/Server/Packets/QueryPackets.h
@@ -22,6 +22,7 @@
#include "Creature.h"
#include "DB2Stores.h"
#include "NPCHandler.h"
+#include "G3D/Vector3.h"
namespace WorldPackets
{
@@ -253,6 +254,68 @@ namespace WorldPackets
bool Allow = false;
GameObjectStats Stats;
};
+
+ class QueryCorpseLocationFromClient final : public ClientPacket
+ {
+ public:
+ QueryCorpseLocationFromClient(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class CorpseLocation final : public ServerPacket
+ {
+ public:
+ CorpseLocation() : ServerPacket(SMSG_CORPSE_LOCATION, 1 + (5 * 4) + 16) { }
+
+ WorldPacket const* Write() override;
+
+ ObjectGuid Transport;
+ G3D::Vector3 Position;
+ int32 ActualMapID = 0;
+ int32 MapID = 0;
+ bool Valid = false;
+ };
+
+ class QueryCorpseTransport final : public ClientPacket
+ {
+ public:
+ QueryCorpseTransport(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_CORPSE_TRANSPORT , std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid Transport;
+ };
+
+ class CorpseTransportQuery final : public ServerPacket
+ {
+ public:
+ CorpseTransportQuery() : ServerPacket(SMSG_CORPSE_TRANSPORT_QUERY, 16) { }
+
+ WorldPacket const* Write() override;
+
+ G3D::Vector3 Position;
+ float Facing = 0.0f;
+ };
+
+ class QueryTime final : public ClientPacket
+ {
+ public:
+ QueryTime(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_TIME, std::move(packet)) { }
+
+ void Read() override { }
+ };
+
+ class QueryTimeResponse final : public ServerPacket
+ {
+ public:
+ QueryTimeResponse() : ServerPacket(SMSG_QUERY_TIME_RESPONSE, 4 + 4) { }
+
+ WorldPacket const* Write() override;
+
+ time_t CurrentTime = time_t(0);
+ int32 TimeOutRequest;
+ };
}
}
diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h
index 8776e680775..3796649f2c9 100644
--- a/src/server/game/Server/Packets/QuestPackets.h
+++ b/src/server/game/Server/Packets/QuestPackets.h
@@ -184,7 +184,7 @@ namespace WorldPackets
class QuestUpdateAddCredit final : public ServerPacket
{
public:
- QuestUpdateAddCredit() : ServerPacket(SMSG_QUESTUPDATE_ADD_KILL, 16+4+4+2+2+1) { }
+ QuestUpdateAddCredit() : ServerPacket(SMSG_QUEST_UPDATE_ADD_CREDIT, 16+4+4+2+2+1) { }
WorldPacket const* Write() override;
diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp
index 53ec8a7f3cf..053bb6c504f 100644
--- a/src/server/game/Server/Packets/SpellPackets.cpp
+++ b/src/server/game/Server/Packets/SpellPackets.cpp
@@ -19,6 +19,12 @@
#include "SpellAuraEffects.h"
#include "MovementPackets.h"
+void WorldPackets::Spells::CancelAura::Read()
+{
+ _worldPacket >> SpellID;
+ _worldPacket >> CasterGUID;
+}
+
WorldPacket const* WorldPackets::Spells::CategoryCooldown::Write()
{
_worldPacket.reserve(4 + 8 * CategoryCooldowns.size());
diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h
index 8357c470573..fa7b8e0b04a 100644
--- a/src/server/game/Server/Packets/SpellPackets.h
+++ b/src/server/game/Server/Packets/SpellPackets.h
@@ -27,6 +27,17 @@ namespace WorldPackets
{
namespace Spells
{
+ class CancelAura final : public ClientPacket
+ {
+ public:
+ CancelAura(WorldPacket&& packet) : ClientPacket(CMSG_CANCEL_AURA, std::move(packet)) { }
+
+ void Read() override;
+
+ ObjectGuid CasterGUID;
+ int32 SpellID = 0;
+ };
+
class CategoryCooldown final : public ServerPacket
{
public:
diff --git a/src/server/game/Server/Packets/TalentPackets.cpp b/src/server/game/Server/Packets/TalentPackets.cpp
index 9713951ed7d..1120680a97b 100644
--- a/src/server/game/Server/Packets/TalentPackets.cpp
+++ b/src/server/game/Server/Packets/TalentPackets.cpp
@@ -43,7 +43,7 @@ void WorldPackets::Talent::SetSpecialization::Read()
}
-void WorldPackets::Talent::LearnTalent::Read()
+void WorldPackets::Talent::LearnTalents::Read()
{
uint32 count;
_worldPacket >> count;
diff --git a/src/server/game/Server/Packets/TalentPackets.h b/src/server/game/Server/Packets/TalentPackets.h
index 3a1e6229ee9..4147eeb58b6 100644
--- a/src/server/game/Server/Packets/TalentPackets.h
+++ b/src/server/game/Server/Packets/TalentPackets.h
@@ -58,12 +58,12 @@ namespace WorldPackets
uint32 SpecGroupIndex = 0;
};
- class LearnTalent final : public ClientPacket
+ class LearnTalents final : public ClientPacket
{
public:
- LearnTalent(WorldPacket&& packet) : ClientPacket(std::move(packet))
+ LearnTalents(WorldPacket&& packet) : ClientPacket(std::move(packet))
{
- ASSERT(packet.GetOpcode() == CMSG_LEARN_TALENT);
+ ASSERT(packet.GetOpcode() == CMSG_LEARN_TALENTS);
}
void Read() override;
diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp
index 009c3c2a895..cb8cd23482f 100644
--- a/src/server/game/Server/Protocol/Opcodes.cpp
+++ b/src/server/game/Server/Protocol/Opcodes.cpp
@@ -19,6 +19,8 @@
#include "Opcodes.h"
#include "WorldSession.h"
#include "Packets/AchievementPackets.h"
+#include "Packets/AuctionHousePackets.h"
+#include "Packets/BlackMarketPackets.h"
#include "Packets/CharacterPackets.h"
#include "Packets/ChannelPackets.h"
#include "Packets/ChatPackets.h"
@@ -134,11 +136,11 @@ void OpcodeTable::Initialize()
#define DEFINE_HANDLER(opcode, status, processing, packetclass, handler) \
ValidateAndSetClientOpcode<packetclass, handler>(opcode, #opcode, status, processing);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_GUILD_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_LEVEL_GRANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptGrantLevel );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAcceptTradeOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATETAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATETAXIEXPRESS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiExpressOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ADDON_REGISTERED_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonRegisteredPrefixesOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI_EXPRESS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiExpressOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_FRIEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddFriendOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddIgnoreOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ADD_MUTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -159,24 +161,28 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_ARENA_TEAM_ROSTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleArenaTeamRosterOpcode );
DEFINE_HANDLER(CMSG_ATTACKSTOP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackStop, &WorldSession::HandleAttackStopOpcode);
DEFINE_HANDLER(CMSG_ATTACKSWING, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackSwing, &WorldSession::HandleAttackSwingOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionHelloOpcode );
+ DEFINE_HANDLER(CMSG_AUCTION_HELLO_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionHelloRequest, &WorldSession::HandleAuctionHelloOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListBidderItems );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_LIST_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListItems );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_LIST_OWNER_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListOwnerItems );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_LIST_PENDING_SALES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionListPendingSales );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_PLACE_BID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionPlaceBid );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_REMOVE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionRemoveItem );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_REPLICATE_ITEMS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUCTION_SELL_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAuctionSellItem );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOBANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoBankItemOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_AUTOEQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOEQUIP_ITEM_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoEquipItemSlotOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBagItemOpcode );
+ DEFINE_HANDLER(CMSG_AUTOSTORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoStoreBankItemOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutostoreLootItemOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTOSTORE_GROUND_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_AUTOSTORE_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::AutoStoreLootItem, &WorldSession::HandleAutostoreLootItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_AUTO_DECLINE_GUILD_INVITES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAutoDeclineGuildInvites );
DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBattlefieldLeaveOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldListOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfEntryInviteResponse );
@@ -184,28 +190,46 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_MGR_QUEUE_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfQueueInviteResponse );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_MGR_QUEUE_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_PORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattleFieldPortOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlefieldStatusOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEFIELD_REQUEST_SCORE_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBattlegroundPlayerPositionsOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterHelloOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN_RATED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLENET_CHALLENGE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_GET_PRODUCT_LIST_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_GET_PURCHASE_LIST_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PAY_START_PURCHASE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_DELETE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_DELETE_PET_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_MODIFY_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_NAME_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_REQUEST_JOURNAL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_REQUEST_UPDATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_SET_BATTLE_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_SET_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_SUMMON, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BEGIN_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBeginTradeOpcode );
DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBinderActivateOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_BUG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBugOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BLACK_MARKET_BID_ON_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BLACK_MARKET_REQUEST_ITEMS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BOT_DETECTED2, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_BUG_REPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBugReportOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUSY_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBusyTradeOpcode );
- DEFINE_HANDLER(CMSG_BUYBACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem);
+ DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem);
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUY_BANK_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyBankSlotOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_BUY_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBuyItemOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CAGE_BATTLE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_ADD_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarAddEvent );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_ARENA_TEAM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarArenaTeam );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_COMPLAIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarComplain );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_CONTEXT_EVENT_SIGNUP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_COPY_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarCopyEvent );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventInvite );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_MODERATOR_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventModeratorStatus);
@@ -213,24 +237,31 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_RSVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventRsvp );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_SIGNUP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventSignup );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_EVENT_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarEventStatus );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GET_CALENDAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetCalendar );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetCalendar );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GET_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetEvent );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GET_NUM_PENDING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGetNumPending );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_GUILD_FILTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarGuildFilter );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_REMOVE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarRemoveEvent );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_REMOVE_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_UPDATE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarUpdateEvent );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAuraOpcode );
+ DEFINE_HANDLER(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelAura, &WorldSession::HandleCancelAuraOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAutoRepeatSpellOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_CAST, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleCancelCastOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_CHANNELLING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelChanneling );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_GROWTH_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelGrowthAuraOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_MASTER_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_MOUNT_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelMountAuraOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelTempEnchantmentOpcode);
DEFINE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, WorldPackets::Trade::CancelTrade, &WorldSession::HandleCancelTradeOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CAN_DUEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::SpellCastRequest, &WorldSession::HandleCastSpellOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGEPLAYER_DIFFICULTY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CHALLENGE_MODE_REQUEST_LEADERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_SUB_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CHANGE_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_CHANNEL_ANNOUNCEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelPlayerCommand, &WorldSession::HandleChannelCommand<&Channel::Announce>);
DEFINE_HANDLER(CMSG_CHANNEL_BAN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelPlayerCommand, &WorldSession::HandleChannelPlayerCommand<&Channel::Ban>);
DEFINE_HANDLER(CMSG_CHANNEL_DECLINE_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Channel::ChannelPlayerCommand, &WorldSession::HandleChannelCommand<&Channel::DeclineInvite>);
@@ -259,11 +290,13 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_CHAR_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharEnumOpcode);
DEFINE_HANDLER(CMSG_CHAR_RACE_OR_FACTION_CHANGE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharRaceOrFactionChange, &WorldSession::HandleCharRaceOrFactionChangeOpcode);
DEFINE_HANDLER(CMSG_CHAR_RENAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterRenameRequest, &WorldSession::HandleCharRenameOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAR_UNDELETE_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleCharUndeleteEnumOpcode );
+ DEFINE_HANDLER(CMSG_CHAR_UNDELETE_ENUM, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharUndeleteEnumOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_FILTERED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_IGNORED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChatIgnoredOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CHOICE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CLEAR_RAID_MARKER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CLEAR_TRADE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleClearTradeItemOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CLOSE_INTERACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMMENTATOR_ENABLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMMENTATOR_ENTER_INSTANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMMENTATOR_EXIT_INSTANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -276,38 +309,69 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMPLAIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleComplainOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMPLETE_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCompleteCinematic );
DEFINE_OPCODE_HANDLER_OLD(CMSG_COMPLETE_MOVIE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CONFIRM_RESPEC_WIPE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleConfirmRespecWipeOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CONNECT_TO_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_CONTACT_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleContactListOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_CORPSE_MAP_POSITION_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseMapPositionQuery );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CONVERSATION_UNK1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CONVERT_RAID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_CREATE_SHIPMENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_CREATURE_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryCreature, &WorldSession::HandleCreatureQuery);
DEFINE_OPCODE_HANDLER_OLD(CMSG_DANCE_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_DB_QUERY_BULK, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Query::DBQueryBulk, &WorldSession::HandleDBQueryBulk);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DECLINE_GUILD_INVITES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DECLINE_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionDeclineOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DELETE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_FRIEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelFriendOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDelIgnoreOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_MUTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DEL_VOICE_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DEPOSIT_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_PROPOSAL_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_SET_ROLES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_TELEPORT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DISCARDED_TIME_SYNC_ACKS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DISMISS_CONTROLLED_VEHICLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissControlledVehicle );
DEFINE_OPCODE_HANDLER_OLD(CMSG_DISMISS_CRITTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DO_MASTER_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_DO_READY_CHECK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRaidReadyCheckOpcode );
DEFINE_HANDLER(CMSG_DUEL_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Duel::DuelResponse, &WorldSession::HandleDuelResponseOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_EJECT_PASSENGER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEmoteOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLETAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetDelete );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLE_TAXI_NODE, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes );
DEFINE_HANDLER(CMSG_EQUIPMENT_SET_SAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave);
DEFINE_OPCODE_HANDLER_OLD(CMSG_EQUIPMENT_SET_USE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEquipmentSetUse );
DEFINE_OPCODE_HANDLER_OLD(CMSG_FAR_SIGHT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleFarSightOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_FORCE_MOVE_ROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_FORCE_MOVE_UNROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck );
DEFINE_HANDLER(CMSG_GAMEOBJECT_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryGameObject, &WorldSession::HandleGameObjectQueryOpcode);
DEFINE_HANDLER(CMSG_GAMEOBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjectReportUse, &WorldSession::HandleGameobjectReportUse);
DEFINE_HANDLER(CMSG_GAMEOBJ_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjectUse, &WorldSession::HandleGameObjectUseOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GAMESPEED_SET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GAMETIME_SET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_COMPLETE_MISSION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_MISSION_BONUS_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_PURCHASE_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_REQUEST_UPGRADEABLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_SET_FOLLOWER_INACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_START_MISSION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MAIL_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGetMailList);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GARRISON_UNK1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GETDEATHBINDZONE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_GARRISON_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MAIL_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGetMailList );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MIRRORIMAGE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_TROPHY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_GET_UNDELETE_COOLDOWN_STATUS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GetUndeleteCooldownStatus, &WorldSession::HandleGetUndeleteCooldownStatus);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GHOST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMRESPONSE_RESOLVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMResponseResolve );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMSURVEY_SUBMIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMSurveySubmit );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMTICKET_CREATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketCreateOpcode );
@@ -315,24 +379,32 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMTICKET_GETTICKET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketGetTicketOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMTICKET_SYSTEMSTATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketSystemStatusOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GMTICKET_UPDATETEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketUpdateOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_INVIS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_NUKE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_REPORT_LAG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReportLag );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_SET_SECURITY_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_CREATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_DELETE_TICKET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_GET_TICKET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_RESPONSE_RESOLVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GM_TICKET_UPDATE_TEXT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_GOSSIP_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GOSSIP_SELECT_OPTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGossipSelectOptionOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GRANT_LEVEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGrantLevel );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_ASSISTANT_LEADER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupAssistantLeaderOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_CANCEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_CHANGE_SUB_GROUP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupChangeSubGroupOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_DISBAND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupDisbandOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupInviteOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupInviteResponseOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_RAID_CONVERT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupRaidConvertOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_REQUEST_JOIN_UPDATES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupRequestJoinUpdates );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_SET_LEADER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupSetLeaderOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_SET_ROLES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGroupSetRolesOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_SWAP_SUB_GROUP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupSwapSubGroupOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GROUP_UNINVITE_GUID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupUninviteGuidOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ACCEPT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAcceptOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ACHIEVEMENT_PROGRESS_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAchievementProgressQuery);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ADD_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAddRankOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ASSIGN_MEMBER_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildAssignRankOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_AUTO_DECLINE_INVITATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
@@ -341,57 +413,78 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_DEPOSIT_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankDepositMoney );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_LOG_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankLogQuery );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_MONEY_WITHDRAWN_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankMoneyWithdrawn );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_NOTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_QUERY_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankQueryTab );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_QUERY_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryGuildBankTabText );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_SWAP_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankSwapItems );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_UPDATE_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankUpdateTab );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_BANK_WITHDRAW_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildBankWithdrawMoney );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_CHANGE_NAME_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_DECLINE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDeclineOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_DEL_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDelRankOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_DELETE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_DELETE_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDeleteRankOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_DEMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDemoteOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_DISBAND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildDisbandOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_EVENT_LOG_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildEventLogQueryOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_INFO_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildChangeInfoTextOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildInviteOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_GET_RANKS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildGetRanksOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_GET_ROSTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRosterOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_INVITE_BY_NAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildInviteOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildLeaveOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_MEMBER_SEND_SOR_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_MOTD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildMOTDOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGuildNewsUpdateStickyOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_PERMISSIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildPermissions );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_PROMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildPromoteOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_OFFICER_REMOVE_MEMBER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildOfficerRemoveMemberOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_PERMISSIONS_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildPermissions );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_PROMOTE_MEMBER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildPromoteOpcode );
DEFINE_HANDLER(CMSG_GUILD_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Guild::QueryGuildInfo, &WorldSession::HandleGuildQueryOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_MEMBER_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_NEWS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGuildQueryNewsOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_RANKS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryRanksOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REMOVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRemoveOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_QUERY_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REPLACE_GUILD_MASTER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REQUEST_CHALLENGE_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REQUEST_CHALLENGE_UPDATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestChallengeUpdate);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REQUEST_MAX_DAILY_XP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestMaxDailyXP );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_REQUEST_PARTY_STATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRequestPartyState );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_ROSTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRosterOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetAchievementTracking);
+ DEFINE_HANDLER(CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Achievement::GuildSetFocusedAchievement, &WorldSession::HandleGuildSetFocusedAchievement);
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_SET_GUILD_MASTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetGuildMaster );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_SET_NOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetNoteOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_SET_RANK_PERMISSIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildSetRankPermissionsOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_SWITCH_RANK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_SHIFT_RANK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildChangeInfoTextOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildMOTDOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_HEARTH_AND_RESURRECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleHearthAndResurrect );
DEFINE_OPCODE_HANDLER_OLD(CMSG_IGNORE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleIgnoreTradeOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_INITIATE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_INSPECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_INSPECT_HONOR_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectHonorStatsOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_INSTANCE_LOCK_WARNING_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund );
DEFINE_HANDLER(CMSG_ITEM_REFUND_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::ItemRefundInfo, &WorldSession::HandleItemRefundInfoRequest);
DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemTextQuery );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_JOIN_ARENA_SKIRMISH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_JOIN_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::JoinChannel, &WorldSession::HandleJoinChannel);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_JOIN_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_JOIN_RATED_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_THREADUNSAFE, &WorldSession::Handle_EarlyProccess );
- DEFINE_HANDLER(CMSG_LEARN_TALENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalent, &WorldSession::HandleLearnTalentOpcode);
+ DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode);
DEFINE_HANDLER(CMSG_LEAVE_CHANNEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Channel::LeaveChannel, &WorldSession::HandleLeaveChannel);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LEAVE_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LEAVE_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_GET_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetStatus );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgJoinOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgLeaveOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LFR_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LFR_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LIST_DECLINE_APPLICANT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LIST_GET_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LIST_INVITE_APPLICANT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LIST_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LIST_JOIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LIST_LEAVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LIST_SEARCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_LOCK_INFO_REQUEST, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleLfgGetLockInfoOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_PROPOSAL_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgProposalResultOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LFG_SET_BOOT_VOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode );
@@ -402,6 +495,7 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_BROWSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderBrowse );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_DECLINE_RECRUIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderDeclineRecruit );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_GET_APPLICATIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderGetApplications);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_GET_GUILD_POST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_GET_RECRUITS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderGetRecruits );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_POST_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderPostRequest );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderRemoveRecruit );
@@ -415,8 +509,8 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_CURRENCY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_MASTER_GIVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_METHOD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMethodOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMoneyOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_RELEASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootReleaseOpcode );
+ DEFINE_HANDLER(CMSG_LOOT_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootMoney, &WorldSession::HandleLootMoneyOpcode);
+ DEFINE_HANDLER(CMSG_LOOT_RELEASE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRelease, &WorldSession::HandleLootReleaseOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootRoll );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailCreateTextItem );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailDelete );
@@ -424,7 +518,10 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_RETURN_TO_SENDER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailReturnToSender );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeItem );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MAIL_TAKE_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMailTakeMoney );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MASTER_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MEETINGSTONE_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MESSAGECHAT_ADDON_INSTANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_OFFICER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_PARTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
DEFINE_HANDLER(CMSG_MESSAGECHAT_ADDON_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatAddonMessage, &WorldSession::HandleChatAddonMessageOpcode);
@@ -440,43 +537,61 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
DEFINE_HANDLER(CMSG_MESSAGECHAT_RAID_WARNING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
DEFINE_HANDLER(CMSG_MESSAGECHAT_SAY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
- DEFINE_HANDLER(CMSG_MESSAGECHAT_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
DEFINE_HANDLER(CMSG_MESSAGECHAT_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageWhisper, &WorldSession::HandleChatMessageWhisperOpcode);
+ DEFINE_HANDLER(CMSG_MESSAGECHAT_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIGAME_MOVE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMinimapPingOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MISSILE_TRAJECTORY_COLLISION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNT_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNT_SPECIAL_ANIM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_CHANGE_TRANSPORT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_CHANGE_VEHICLE_SEATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_MOVE_CHNG_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_DISMISS_VEHICLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_FALL_RESET, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FEATHER_FALL_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleFeatherFallAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_ROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveRootAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_UNROOT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveUnRootAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleForceSpeedChangeAck );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_GRAVITY_ENABLE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_HANDLER(CMSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_HANDLER(CMSG_MOVE_HEARTBEAT, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_HOVER_ACK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveHoverAck );
- DEFINE_HANDLER(CMSG_MOVE_FALL_LAND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_HANDLER(CMSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_KNOCK_BACK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveKnockBackAck );
- DEFINE_HANDLER(CMSG_MOVE_JUMP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_NOT_ACTIVE_MOVER, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveNotActiveMover );
- DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_REMOVE_MOVEMENT_FORCES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_MOVE_SET_CAN_FLY, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_CAN_FLY_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveSetCanFlyAckOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_COLLISION_HEIGHT_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleSetCollisionHeightAck );
- DEFINE_HANDLER(CMSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
- DEFINE_HANDLER(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_HANDLER(CMSG_MOVE_SET_FACING, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_FLY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_MOVE_SET_PITCH, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_RUN_MODE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_VEHICLE_REC_ID_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SET_WALK_MODE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_SPLINE_DONE, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveSplineDoneOpcode );
- DEFINE_HANDLER(CMSG_MOVE_START_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
- DEFINE_HANDLER(CMSG_MOVE_START_BACKWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
- DEFINE_HANDLER(CMSG_MOVE_START_DESCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_HANDLER(CMSG_MOVE_START_ASCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_HANDLER(CMSG_MOVE_START_BACKWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
+ DEFINE_HANDLER(CMSG_MOVE_START_DESCEND, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_START_FORWARD, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_START_PITCH_DOWN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_START_PITCH_UP, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
@@ -492,128 +607,188 @@ void OpcodeTable::Initialize()
DEFINE_HANDLER(CMSG_MOVE_STOP_SWIM, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_STOP_TURN, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::ClientPlayerMovement, &WorldSession::HandleMovementOpcodes);
DEFINE_HANDLER(CMSG_MOVE_TELEPORT_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MoveTeleportAck, &WorldSession::HandleMoveTeleportAck);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TIME_SKIPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TOGGLE_COLLISION_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WATER_WALK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck );
DEFINE_HANDLER(CMSG_MOVE_WORLDPORT_ACK, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortAck, &WorldSession::HandleMoveWorldportAckOpcode);
DEFINE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_NEW_SPELL_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera );
DEFINE_HANDLER(CMSG_NPC_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryNPCText, &WorldSession::HandleNpcTextQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_OBJECT_UPDATE_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleObjectUpdateFailedOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OBJECT_UPDATE_RESCUED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OFFER_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOfferPetitionOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_GARRISON_MISSION_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpenItemOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_SHIPMENT_GAME_OBJ, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_SHIPMENT_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_OPT_OUT_OF_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOptOutOfLootOpcode );
DEFINE_HANDLER(CMSG_PAGE_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPageText, &WorldSession::HandlePageTextQueryOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupInviteOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupInviteResponseOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_SILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_UNINVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGroupUninviteOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_UNSILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_BUY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionBuyOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionQueryOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_SHOWLIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionShowListOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_RENAME_GUILD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionRenameGuildOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_SHOW_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionShowListOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_SHOW_SIGNATURES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionShowSignOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_SIGN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionSignOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_ABANDON, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAbandon );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_ACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetAction );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_FINAL_NOTIF, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_INPUT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_QUIT_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_REPLACE_FRONT_PET, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_REQUEST_PVP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_REQUEST_WILD, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_CANCEL_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetCancelAuraOpcode );
DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SpellCastRequest, &WorldSession::HandlePetCastSpellOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_LEARN_TALENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetLearnTalent );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_NAME_CACHE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_NAME_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetNameQuery );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetRename );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_SET_ACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetSetAction );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_SET_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_SPELL_AUTOCAST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetSpellAutocastOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PET_STOP_ATTACK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetStopAttack );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PING, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_EarlyProccess );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PLAYED_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePlayedTime );
- DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::PlayerLogin, &WorldSession::HandlePlayerLoginOpcode);
+ DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::PlayerLogin, &WorldSession::HandlePlayerLoginOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_PLAYER_VEHICLE_ENTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleEnterPlayerVehicle );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PLAY_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_PUSHQUESTTOPARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty );
+ DEFINE_HANDLER(CMSG_PORT_GRAVEYARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::PortGraveyard, &WorldSession::HandlePortGraveyard);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_PUSH_QUEST_TO_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty );
DEFINE_OPCODE_HANDLER_OLD(CMSG_PVP_LOG_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandlePVPLogDataOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_BATTLEFIELD_STATE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_MEMBERS_FOR_RECIPE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_MEMBER_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleGuildRewardsQueryOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_XP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryXPOpcode ); // STATUS_AUTHED
+ DEFINE_HANDLER(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseLocationFromClient, &WorldSession::HandleQueryCorpseLocation);
+ DEFINE_HANDLER(CMSG_QUERY_CORPSE_TRANSPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseTransport, &WorldSession::HandleQueryCorpseTransport);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_COUNTDOWN_TIMER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_GUILD_XP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildQueryXPOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryInspectAchievements );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryNextMailTime );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryTimeOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_PETITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_SCENARIO_POI, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryTime, &WorldSession::HandleQueryTimeOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_ACCEPT_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestgiverAcceptQuestOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_CANCEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_QUESTGIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverChooseReward, &WorldSession::HandleQuestgiverChooseRewardOpcode);
DEFINE_HANDLER(CMSG_QUESTGIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverCompleteQuest, &WorldSession::HandleQuestgiverCompleteQuest);
DEFINE_HANDLER(CMSG_QUESTGIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverHello, &WorldSession::HandleQuestgiverHelloOpcode);
DEFINE_HANDLER(CMSG_QUESTGIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverQueryQuest, &WorldSession::HandleQuestgiverQueryQuestOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTGIVER_QUEST_AUTOLAUNCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_QUESTGIVER_REQUEST_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverRequestReward, &WorldSession::HandleQuestgiverRequestRewardOpcode);
DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverStatusMultipleQuery, &WorldSession::HandleQuestgiverStatusMultipleQuery);
DEFINE_HANDLER(CMSG_QUESTGIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Quest::QuestGiverStatusQuery, &WorldSession::HandleQuestgiverStatusQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTLOG_REMOVE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestLogRemoveQuest );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUESTLOG_SWAP_QUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestConfirmAccept );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_NPC_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery );
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_POI_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPOIQuery );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_PUSH_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPushResult );
DEFINE_HANDLER(CMSG_QUEST_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QueryQuestInfo, &WorldSession::HandleQuestQueryOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEUED_MESSAGES_END, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_RANDOM_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomRollOpcode );
DEFINE_HANDLER(CMSG_RANDOMIZE_CHAR_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GenerateRandomCharacterName, &WorldSession::HandleRandomizeCharNameOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_RANDOM_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomRollOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_READ_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReadItem );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REALM_NAME_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_RECLAIM_CORPSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReclaimCorpseOpcode );
+ DEFINE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ReclaimCorpse, &WorldSession::HandleReclaimCorpse);
DEFINE_OPCODE_HANDLER_OLD(CMSG_RECRUIT_A_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REGISTER_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleAddonRegisteredPrefixesOpcode);
DEFINE_HANDLER(CMSG_REORDER_CHARACTERS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::ReorderCharacters, &WorldSession::HandleReorderCharacters);
DEFINE_HANDLER(CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::RepairItem, &WorldSession::HandleRepairItemOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_REPOP_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRepopRequestOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REPLACE_ACCOUNT_DATA, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REPLACE_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RepopRequest, &WorldSession::HandleRepopRequest);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REPORT_PVP_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReportPvPAFK );
DEFINE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::RequestAccountData, &WorldSession::HandleRequestAccountData);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_ARTIFACT_COMPLETION_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_BATTLEFIELD_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestBattlefieldStatusOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestCategoryCooldowns );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CEMETERY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestCemeteryList );
+ DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::RequestCemeteryList, &WorldSession::HandleRequestCemeteryList);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_FORCED_REACTIONS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildRewardsQueryOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_HONOR_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectHonorStatsOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_INSPECT_PVP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PET_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfoOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestPvpOptions );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PVP_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestPvpReward );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_RAID_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRaidInfoOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_RATED_BATTLEFIELD_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_RATED_BG_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestRatedBgInfo );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestRatedBgStats );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_RESEARCH_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_STABLED_PETS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleListStabledPetsOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_VEHICLE_EXIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestVehicleExit );
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle);
DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChangeSeatsOnControlledVehicle);
DEFINE_OPCODE_HANDLER_OLD(CMSG_RESET_FACTION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_RESET_INSTANCES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleResetInstancesOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_RESURRECT_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleResurrectResponseOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_RETURN_TO_GRAVEYARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleReturnToGraveyard );
+ DEFINE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ResurrectResponse, &WorldSession::HandleResurrectResponse);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_REVERT_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ROLE_POLL_BEGIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRolePollBeginOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ROUTER_CLIENT_LOG_STREAMING_ERROR, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SAVE_CUF_PROFILES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSaveCUFProfiles );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SAVE_GUILD_EMBLEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSaveGuildEmblemOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SAVE_PLAYER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SCENE_PLAYBACK_CANCELED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SCENE_PLAYBACK_COMPLETE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SCENE_TRIGGER_EVENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SELF_RES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSelfResOpcode );
DEFINE_HANDLER(CMSG_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SellItem, &WorldSession::HandleSellItemOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_CONTACT_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_MAIL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSendMail );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_ADDRESS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SERVERTIME, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SETDEATHBINDPOINT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SETSHEATHED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleSetSheathedOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIONBAR_TOGGLES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActionBarToggles );
DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SetActionButton, &WorldSession::HandleSetActionButtonOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_MOVER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveMoverOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveVoiceChannel ); // STATUS_AUTHED
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveVoiceChannel );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ALLOW_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ALLOW_LOW_LEVEL_RAID2, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_BANK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_CONTACT_NOTES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetContactNotesOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_CURRENCY_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_SET_DUNGEON_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetDungeonDifficulty, &WorldSession::HandleSetDungeonDifficultyOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_EVERYONE_IS_ASSISTANT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_FACTION_ATWAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetFactionAtWar );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_FACTION_AT_WAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetFactionAtWar );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_FACTION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_FACTION_INACTIVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetFactionInactiveOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_FACTION_NOT_AT_WAR, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_GUILD_BANK_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetGuildBankTabText );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_LFG_BONUS_FACTION_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_LFG_COMMENT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_LOOT_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PARTY_ASSIGNMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PARTY_LEADER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PET_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PLAYER_DECLINED_NAMES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetPlayerDeclinedNames );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PREFERED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PVP, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_SET_RAID_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetRaidDifficulty, &WorldSession::HandleSetRaidDifficultyOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_RELATIVE_POSITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ROLE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SAVED_INSTANCE_EXTEND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetSavedInstanceExtend );
DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SKILL_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TITLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTitleOpcode );
@@ -624,79 +799,100 @@ void OpcodeTable::Initialize()
DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_WATCHED_FACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetWatchedFactionOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SHOWING_CLOAK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingCloakOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SHOWING_HELM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleShowingHelmOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SHOW_TRADE_SKILL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SIGN_PETITION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SILENCE_PARTY_TALKER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SOCKET_GEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SORT_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SORT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SPELLCLICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpellClick );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpiritHealerActivateOpcode);
DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_STANDSTATECHANGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleStandStateChangeOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_START_QUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_STOP_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_STORE_LOOT_IN_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUBMIT_BUG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUBMIT_COMPLAIN, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUGGESTION_SUBMIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUMMON_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSummonResponseOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SUPPORT_TICKET_SUBMIT_BUG, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode);
DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_SWAP_SUB_GROUPS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_SYNC_DANCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXINODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXIQUERYAVAILABLENODES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTabardVendorActivateOpcode);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXICLEARALLNODES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXIENABLEALLNODES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXISHOWNODES, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXI_NODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXI_QUERY_AVAILABLE_NODES, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TELEPORT_TO_UNIT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::CTextEmote, &WorldSession::HandleTextEmoteOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_ADJUSTMENT_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_HANDLER(CMSG_TIME_SYNC_RESP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::TimeSyncResponse, &WorldSession::HandleTimeSyncResp);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESP_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_HANDLER(CMSG_TIME_SYNC_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::TimeSyncResponse, &WorldSession::HandleTimeSyncResponse);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESPONSE_DROPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TIME_SYNC_RESPONSE_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TOGGLE_PVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTogglePvP );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TOTEM_DESTROYED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTotemDestroyed );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TRAINER_BUY_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTrainerBuySpellOpcode );
DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode);
DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TRIGGER_CINEMATIC_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_TROPHY_MONUMENT_LOAD_SELECTED_TROPHY_ID, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_TURN_IN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTurnInPetitionOpcode );
DEFINE_HANDLER(CMSG_TUTORIAL_FLAG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag);
+ DEFINE_HANDLER(CMSG_UI_TIME_REQUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::UITimeRequest, &WorldSession::HandleUITimeRequest);
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnacceptTradeOpcode );
DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode);
- DEFINE_OPCODE_HANDLER_OLD(CMSG_UNDELETE_COOLDOWN_STATUS_QUERY, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleUndeleteCooldownStatusQuery);
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnlearnSkillOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUnregisterAddonPrefixesOpcode);
DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData);
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_CLIENT_SETTINGS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory );
DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_PROJECTILE_POSITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_RAID_TARGET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRaidTargetUpdateOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_CRITTER_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUseItemOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel);
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOICE_SESSION_ENABLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleVoiceSessionEnableOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOID_STORAGE_QUERY, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleVoidStorageQuery );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOID_STORAGE_TRANSFER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleVoidStorageTransfer );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOID_STORAGE_UNLOCK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleVoidStorageUnlock );
DEFINE_OPCODE_HANDLER_OLD(CMSG_VOID_SWAP_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleVoidSwapItem );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_WARDEN_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenDataOpcode ); // STATUS_AUTHED
+ DEFINE_OPCODE_HANDLER_OLD(CMSG_WARDEN_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenDataOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WARGAME_ACCEPT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WARGAME_START, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WHO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WHOIS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWhoisOpcode );
- DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleWorldStateUITimerUpdate );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_WRAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWrapItemOpcode );
DEFINE_OPCODE_HANDLER_OLD(CMSG_ZONEUPDATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleZoneUpdateOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_CORPSE_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseQueryOpcode );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_GM_BIND_OTHER, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_GM_SHOWLABEL, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_GM_SUMMON, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(MSG_INSPECT_ARENA_TEAMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectArenaTeamsOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_LIST_STABLED_PETS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleListStabledPetsOpcode );
DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_CHARM_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_ALL_SPEED_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_FLIGHT_SPEED_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_RAW_POSITION_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_RUN_BACK_SPEED_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_RUN_SPEED_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_SWIM_BACK_SPEED_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_SWIM_SPEED_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_TURN_RATE_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_SET_WALK_SPEED_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TOGGLE_FALL_LOGGING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
+ DEFINE_OPCODE_HANDLER_OLD(MSG_MOVE_TOGGLE_LOGGING, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
DEFINE_OPCODE_HANDLER_OLD(MSG_NOTIFY_PARTY_SQUELCH, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL );
- DEFINE_OPCODE_HANDLER_OLD(MSG_PARTY_ASSIGNMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_PETITION_DECLINE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionDeclineOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_PETITION_RENAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionRenameOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_QUEST_PUSH_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPushResult );
- DEFINE_OPCODE_HANDLER_OLD(MSG_RAID_READY_CHECK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRaidReadyCheckOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_RAID_READY_CHECK_FINISHED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRaidReadyCheckFinishedOpcode);
- DEFINE_OPCODE_HANDLER_OLD(MSG_RAID_TARGET_UPDATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRaidTargetUpdateOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_SAVE_GUILD_EMBLEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSaveGuildEmblemOpcode );
- DEFINE_OPCODE_HANDLER_OLD(MSG_TABARDVENDOR_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTabardVendorActivateOpcode);
- DEFINE_OPCODE_HANDLER_OLD(MSG_TALENT_WIPE_CONFIRM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTalentWipeConfirmOpcode );
#undef DEFINE_OPCODE_HANDLER_OLD
#undef DEFINE_HANDLER
@@ -704,26 +900,34 @@ void OpcodeTable::Initialize()
#define DEFINE_SERVER_OPCODE_HANDLER(opcode, status, con) \
ValidateAndSetServerOpcode(opcode, #opcode, status, con)
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ABORT_NEW_WORLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_CRITERIA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_RESTRICTED_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_TOYS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTION_BUTTONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACTIVATE_TAXI_REPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADDON_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADD_RUNE_POWER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ADJUST_SPLINE_DURATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AE_LOOT_TARGET_ACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AI_REACTION, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACCOUNT_CRITERIA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACHIEVEMENT_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_GUILD_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_SPIRIT_HEALER_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_MOVEMENT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_NO_CORPSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_UNIT_DESTROYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_CHANGE_FAILED_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_TEAM_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -739,15 +943,21 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_DEADTARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKSWING_NOTINRANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_BIDDER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_BIDDER_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_CLOSED_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OUTBID_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_BID_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REMOVED_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REPLICATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_WON_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURACASTLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_POINTS_DEPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AURA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -761,44 +971,76 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_ENTERED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_ENTRY_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_EXIT_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_QUEUE_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_STATE_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PLAYER_POSITIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_MGR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_RATED_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NONE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEEDCONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NONE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_WAITFORGROUPS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INFO_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_INIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_CHALLENGE_ABORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLENET_CHALLENGE_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_ACK_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_CONFIRM_PURCHASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DELIVERY_ENDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DELIVERY_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_PURCHASE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PAY_START_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_PET_CAGE_DATE_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_HEALED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_NAME_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_LICENSE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_REVOKED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_SLOT_UPDATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_TRAP_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLE_PET_UPDATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDPOINTUPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDZONEREPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OPEN_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OUTBID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_BONUS_ROLL_EMPTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_BANK_SLOT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_ITEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ACTION_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_ARENA_TEAM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_CLEAR_PENDING_ACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INITIAL_INVITES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_EVENT_REMOVED_ALERT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -811,10 +1053,22 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_CALENDAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_SEND_NUM_PENDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CALENDAR_UPDATE_INVITE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAMERA_SHAKE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_ORPHAN_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SCENE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAN_DUEL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_ALL_MAP_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY_JOINED, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -835,8 +1089,11 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_PLAYER_NOT_FOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_RESTRICTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_DISCONNECTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_DISCONNECTED_2, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_SERVER_RECONNECTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_WRONG_FACTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_FOR_BOTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -846,8 +1103,9 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENTCACHE_VERSION, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLIENT_CONTROL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_EVENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_LOG_MULTIPLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_MAP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PARTY_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -855,6 +1113,7 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT2, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLAIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLETE_SHIPMENT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_MOVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPRESSED_PACKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMSAT_CONNECT_FAIL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -866,23 +1125,28 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONVERT_RUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_COOLDOWN_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_NOT_IN_INSTANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_LOCATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_TRANSPORT_QUERY, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATE_SHIPMENT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATURE_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_DELETED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CROSSED_INEBRIATION_THRESHOLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CURRENCY_LOOT_RESTORED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_CUSTOM_LOAD_SCREEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DAILY_QUESTS_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DAMAGE_CALC_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DAMAGE_DONE_OBSOLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DANCE_STUDIO_CREATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEBUG_RUNE_REGEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEBUG_SERVER_GEO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTROY_ARENA_UNIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DESTRUCTIBLE_BUILDING_DAMAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DIFFERENT_INSTANCE_FROM_PARTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISENCHANT_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -890,21 +1154,26 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNTRESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPEL_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_GAME_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PLAYER_CHOICE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_PROMOTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_QUEST_POPUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISPLAY_TOAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DROP_NEW_CONNECTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COUNTDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_INBOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_OUTOFBOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_REQUESTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_REQUESTED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUMP_RIDE_TICKETS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ECHO_PARTY_SQUELCH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENTLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCHANTMENT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTALDAMAGELOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_SAVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -923,110 +1192,156 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCEACTIONSHOW, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCED_DEATH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORCE_DISPLAY_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FORGE_MASTER_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_ACTIVATE_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_CUSTOM_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_PAGETEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_PLAY_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_QUERY_RESPONSE, STATUS_LOGGEDIN, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_RESET_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMESPEED_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMETIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_EVENT_DEBUG_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_ACTIVATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LANDINGPAGE_SHIPMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MONUMENT_SELECTED_TROPHY_ID_LOADED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_TRADESKILL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_DB_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_RECEIVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMRESPONSE_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_CREATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_DELETETICKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_GETTICKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_SYSTEMSTATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_UPDATETEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_SET_NUM_FOLLOWER_ACTIVATIONS_REMAINING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_START_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNK1, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNK3, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPGRADEABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPGRADE_FOLLOWER_ITEM_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENT_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_MESSAGECHAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_GET_TICKET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESOLVE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GODMODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUPACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_ACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_LEADER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_NEW_LEADER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_SET_ROLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_MONEY_WITHDRAWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_TEXT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHALLENGE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CHANGE_NAME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_COMMAND_RESULT_2, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_DECLINE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_DISBANDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_MOTD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_NEW_LEADER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PLAYER_JOINED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PLAYER_LEFT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_RANKS_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_RANK_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_MODIFIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_TEXT_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_FLAGGED_FOR_RENAME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_DECLINED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_KNOWN_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MAX_DAILY_XP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_FOR_RECIPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBERS_WITH_RECIPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_UPDATE_NOTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MOVE_STARTING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NAME_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_DELETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_NEWS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RECIPES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RENAMED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_REACTION_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REPUTATION_WEEKLY_CAP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARDS_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_UPDATE_ROSTER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_SEND_RANK_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_SET_NOTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_TRADESKILL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_XP_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_HOTFIX_NOTIFY_BLOB, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_IGNORE_REQUIREMENTS_CHEAT, 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_INITIAL_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_PVP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULTS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_TALENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_GROUP_SIZE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_LOCK_WARNING_QUERY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1036,10 +1351,12 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALID_PROMOTION_CODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_IS_QUEST_COMPLETE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ADD_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_EXPIRE_PURCHASE_REFUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PURCHASE_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1047,14 +1364,21 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_SEND_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TEXT_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_JOINED_BATTLEGROUND_QUEUE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_DANCE_MOVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEARN_TALENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LEVELUP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PLAYER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_BOOT_PROPOSAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_DISABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_JOIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_JOIN_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_UPDATE_BLACKLIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_LIST_UPDATE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_OFFER_CONTINUE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_OPEN_FROM_GOSSIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PARTY_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_PLAYER_REWARD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1062,18 +1386,24 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_QUEUE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHECK_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_ROLE_CHOSEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SEARCH_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_SLOT_INVALID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_TELEPORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_SEARCH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LFG_UPDATE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICANT_LIST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_BROWSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_POST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUIT_LIST_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_POST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LF_GUILD_RECRUITS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIST_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_CHARACTER_COPY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SETTIMESPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_VERIFY_WORLD, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1084,71 +1414,119 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CLEAR_MONEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ITEM_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MASTER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RELEASE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLLS_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ROLL_WON, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_SLOT_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_START_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOSS_OF_CONTROL_AURA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAP_OBJECTIVES_INIT, 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_MEETINGSTONE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_IN_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_MEMBER_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MEETINGSTONE_SETQUEUE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGECHAT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MESSAGE_BOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_SETUP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIGAME_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRRORIMAGE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MIRROR_IMAGE_CREATURE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MISSILE_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONEY_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONSTER_MOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MONSTER_MOVE_TRANSPORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTRESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNTSPECIAL_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_FEATHER_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOUNT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_DISABLE_GRAVITY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ENABLE_GRAVITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_KNOCK_BACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_LAND_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_NORMAL_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_REMOVE_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_ROOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ACTIVE_MOVER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COLLISION_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_COMPOUND_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FEATHER_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_FLIGHT_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_LAND_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_NORMAL_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_PITCH_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_SWIM_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_TURN_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_IN_AIR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WALK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SET_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SKIP_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_DISABLE_GRAVITY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ENABLE_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ENABLE_GRAVITY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_ROOT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FEATHER_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_FLYING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_HOVER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_LAND_WALK, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_NORMAL_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_PITCH_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_RUN_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_RUN_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_SWIM_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_TURN_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WALK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_SET_WATER_WALK, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_START_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_STOP_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNROOT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_FLYING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_SPLINE_UNSET_HOVER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_WALK_IN_AIR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_COLLISION_HEIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_FLIGHT_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_KNOCK_BACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_PITCH_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_SWIM_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1156,39 +1534,64 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TELEPORT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_TURN_RATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD_ABORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFICATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_DEST_LOC_SPELL_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_TEXT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_NPC_WONT_TALK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OFFER_PETITION_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_MONSTER_MOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_CONTAINER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_LFG_DUNGEON_FINDER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_KILL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATS_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PERIODICAURALOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETGODMODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOWLIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_RENAME_GUILD_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_SIGNATURES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SIGN_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_FEEDBACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ACTION_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_CHAT_RESTRICTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_FINALIZE_LOCATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_FINAL_ROUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_FINISHED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_FIRST_ROUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_INITIAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_PVP_CHALLENGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_QUEUE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_REPLACEMENTS_MADE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_REQUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_ROUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_SLOT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BROKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CAST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CLEAR_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_DISMISS_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_GUIDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_LEARNED_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1198,34 +1601,44 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_REMOVED_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_RENAMEABLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SLOT_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SPECIALIZATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_STABLE_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_STABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_TAME_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_UPDATE_COMBO_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYED_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBINDERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYERBOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_BOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_DIFFICULTY_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_MOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_VEHICLE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_MUSIC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_OBJECT_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ONE_SHOT_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_ORPHAN_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SCENE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPEAKERBOT_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_TIME_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PONG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESURRECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROCRESIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROC_RESIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_PUREMOUNT_CANCELLED_OBSOLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_BATTLE_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_INVALID_QUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_OFFER_REWARD, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1235,70 +1648,100 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTGIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTLOG_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_KILL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_ADD_PVP_KILL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUESTUPDATE_FAILEDTIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_FORCE_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_LOG_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_NPC_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_PUSH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_PVP_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_FAILED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_GROUP_ONLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_INSTANCE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_READY_CHECK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_READY_CHECK_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_READY_CHECK_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_READY_CHECK_THROTTLED_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_SUMMON_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOMIZE_CHAR_NAME, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_RATING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_OK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_QUERY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REALM_SPLIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REAL_GROUP_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECEIVED_MAIL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REDIRECT_CLIENT, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_EXPIRED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVED_SPELL, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPLACE_TROPHY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_AFK_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_SETUP_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_COMPRESSION_CONTEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_RANGED_COMBAT_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_WEEKLY_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESISTLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPEC_WIPE_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPOND_INSPECT_ACHIEVEMENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESTRICTED_ACCOUNT_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
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_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESYNC_RUNES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHANGED_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_CHOSEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_BEGIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_RWHOIS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SAVE_GUILD_EMBLEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_BOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_COMPLETED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_POIS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_PROGRESS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENARIO_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SCRIPT_CAST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_ITEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_MAIL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_ALL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVERTIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENT, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_FIRST_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_PERF, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_TROPHY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ANIM_TIER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DF_FAST_LAUNCH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DUNGEON_DIFFICULTY, STATUS_NEVER, CONNECTION_TYPE_REALM);
@@ -1308,89 +1751,76 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ITEM_PURCHASE_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LFG_TIME_WALKER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_LOOT_METHOD_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MAX_WEEKLY_QUANTITY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MELEE_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_MOVEMENT_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PHASE_SHIFT_CHANGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAYER_DECLINED_NAMES_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROJECTILE_POSITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_QUEST_COMPLETED_BIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_RAID_DIFFICULTY, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TASK_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_TIME_ZONE_INFORMATION, STATUS_NEVER, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOWTAXINODES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VIGNETTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_RATINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TAXI_NODES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_TRADE_SKILL_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOCKET_GEMS_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SORT_BAGS_ACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SOR_START_EXPERIENCE_INCOMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPECIAL_MOUNT_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLBREAKLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDAMAGESHIELD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLDISPELLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLENERGIZELOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLHEALLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINSTAKILLLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLINTERRUPTLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLLOGEXECUTE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLLOGMISS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLNONMELEEDAMAGELOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLORDAMAGE_IMMUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELLSTEALLOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ABSORB_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DAMAGE_SHIELD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DELAYED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_DISPEL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INSTAKILL_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INTERRUPT_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MISS_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_MULTISTRIKE_EFFECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_NON_MELEE_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_OR_DAMAGE_IMMUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_DISABLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_COLLISION_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_DISABLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_GRAVITY_ENABLE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_ROOT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FEATHER_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLIGHT_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLIGHT_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_FLYING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_HOVER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_LAND_WALK, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_NORMAL_FALL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_PITCH_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_RUN_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_SWIM_BACK_SPEED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_SWIM_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_TURN_RATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WALK_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_SET_WATER_WALK, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_START_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_STOP_SWIM, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNROOT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_FLYING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPLINE_MOVE_UNSET_HOVER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_STABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STANDSTATE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_ELAPSED_TIMERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_LOOT_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_START_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_DANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_STREAMING_MOVIE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_REQUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPERCEDED_SPELL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUPPRESS_NPC_GREETINGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_COMMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TABARD_VENDOR_ACTIVATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1403,10 +1833,12 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_ADJUSTMENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQ, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOGGLE_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_LOST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_CREATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOTEM_MOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS_EXTENDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_SUCCEEDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
@@ -1416,11 +1848,14 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UI_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_CHARACTER_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_HEALTH_FREQUENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNIT_SPELLCAST_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLEARNED_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM);
+ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CAPTURE_POINT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_COMBO_POINTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CURRENCY_WEEK_LIMIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
@@ -1458,7 +1893,6 @@ void OpcodeTable::Initialize()
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHOIS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE);
- DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_STATE_UI_TIMER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ABORTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
DEFINE_SERVER_OPCODE_HANDLER(SMSG_ZONE_UNDER_ATTACK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM);
diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h
index e1624d076c3..971c69a2151 100644
--- a/src/server/game/Server/Protocol/Opcodes.h
+++ b/src/server/game/Server/Protocol/Opcodes.h
@@ -46,19 +46,19 @@ enum OpcodeMisc : uint32
// CMSGs 6.0.3.19342
enum OpcodeClient : uint32
{
- CMSG_ACCEPT_LEVEL_GRANT = 0x1921,
- CMSG_ACCEPT_TRADE = 0xBADD,
- CMSG_ACTIVATETAXI = 0x0311,
- CMSG_ACTIVATETAXIEXPRESS = 0x1B52,
- CMSG_ADDON_REGISTERED_PREFIXES = 0x03F4,
+ CMSG_ACCEPT_GUILD_INVITE = 0x0384,
+ CMSG_ACCEPT_LEVEL_GRANT = 0x0B12,
+ CMSG_ACCEPT_TRADE = 0x01E5,
+ CMSG_ACTIVATE_TAXI = 0x0311,
+ CMSG_ACTIVATE_TAXI_EXPRESS = 0x1B52,
CMSG_ADD_FRIEND = 0x0DB9,
CMSG_ADD_IGNORE = 0x1321,
CMSG_ADD_MUTE = 0x098A,
CMSG_ADD_VOICE_IGNORE = 0xBADD,
CMSG_ALTER_APPEARANCE = 0x13E9,
CMSG_AREATRIGGER = 0x01B4,
- CMSG_AREA_SPIRIT_HEALER_QUERY = 0xBADD,
- CMSG_AREA_SPIRIT_HEALER_QUEUE = 0xBADD,
+ CMSG_AREA_SPIRIT_HEALER_QUERY = 0x0A08,
+ CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x1921,
CMSG_ARENA_TEAM_ACCEPT = 0xBADD,
CMSG_ARENA_TEAM_CREATE = 0xBADD,
CMSG_ARENA_TEAM_DECLINE = 0xBADD,
@@ -71,20 +71,21 @@ enum OpcodeClient : uint32
CMSG_ARENA_TEAM_ROSTER = 0xBADD,
CMSG_ATTACKSTOP = 0x065B,
CMSG_ATTACKSWING = 0x1E9B,
- CMSG_AUCTION_HELLO = 0x13EA,
- CMSG_AUCTION_LIST_BIDDER_ITEMS = 0xBADD,
- CMSG_AUCTION_LIST_ITEMS = 0xBADD,
- CMSG_AUCTION_LIST_OWNER_ITEMS = 0xBADD,
- CMSG_AUCTION_LIST_PENDING_SALES = 0xBADD,
- CMSG_AUCTION_PLACE_BID = 0xBADD,
- CMSG_AUCTION_REMOVE_ITEM = 0xBADD,
- CMSG_AUCTION_SELL_ITEM = 0xBADD,
+ CMSG_AUCTION_HELLO_REQUEST = 0x13EA,
+ CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x050E,
+ CMSG_AUCTION_LIST_ITEMS = 0x0B53,
+ CMSG_AUCTION_LIST_OWNER_ITEMS = 0x03E2,
+ CMSG_AUCTION_LIST_PENDING_SALES = 0x11E2,
+ CMSG_AUCTION_PLACE_BID = 0x0B11,
+ CMSG_AUCTION_REMOVE_ITEM = 0x1BEB,
+ CMSG_AUCTION_REPLICATE_ITEMS = 0x0805,
+ CMSG_AUCTION_SELL_ITEM = 0x0027,
CMSG_AUTH_CONTINUED_SESSION = 0x0485,
CMSG_AUTH_SESSION = 0x0487,
CMSG_AUTOBANK_ITEM = 0x0751,
CMSG_AUTOEQUIP_GROUND_ITEM = 0xBADD,
CMSG_AUTOEQUIP_ITEM = 0x0F35,
- CMSG_AUTOEQUIP_ITEM_SLOT = 0xBADD,
+ CMSG_AUTOEQUIP_ITEM_SLOT = 0x07B1,
CMSG_AUTOSTORE_BAG_ITEM = 0x0F18,
CMSG_AUTOSTORE_BANK_ITEM = 0x0732,
CMSG_AUTOSTORE_GROUND_ITEM = 0xBADD,
@@ -97,58 +98,80 @@ enum OpcodeClient : uint32
CMSG_BATTLEFIELD_MGR_ENTRY_INVITE_RESPONSE = 0x059A,
CMSG_BATTLEFIELD_MGR_EXIT_REQUEST = 0x1381,
CMSG_BATTLEFIELD_MGR_QUEUE_INVITE_RESPONSE = 0x122A,
- CMSG_BATTLEFIELD_MGR_QUEUE_REQUEST = 0xBADD,
+ CMSG_BATTLEFIELD_MGR_QUEUE_REQUEST = 0x0B49,
CMSG_BATTLEFIELD_PORT = 0x11EB,
CMSG_BATTLEFIELD_REQUEST_SCORE_DATA = 0xBADD,
- CMSG_BATTLEFIELD_STATUS = 0x0320,
CMSG_BATTLEGROUND_PLAYER_POSITIONS = 0xBADD,
+ CMSG_BATTLEMASTER_HELLO = 0xBADD,
CMSG_BATTLEMASTER_JOIN = 0x0D2E,
CMSG_BATTLEMASTER_JOIN_ARENA = 0x0DAE,
CMSG_BATTLEMASTER_JOIN_RATED = 0xBADD,
- CMSG_BATTLEMASTER_HELLO = 0xBADD,
+ CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x0138,
+ CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x052A,
+ CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x012E,
+ CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x198A,
CMSG_BATTLE_PAY_GET_PRODUCT_LIST_QUERY = 0x1389,
CMSG_BATTLE_PAY_GET_PURCHASE_LIST_QUERY = 0x120C,
- CMSG_BATTLE_PET_DELETE_PET = 0x07B9,
+ CMSG_BATTLE_PAY_START_PURCHASE = 0x011E,
+ CMSG_BATTLE_PET_DELETE_PET = 0x0928,
+ CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x07B9,
CMSG_BATTLE_PET_MODIFY_NAME = 0x03A9,
CMSG_BATTLE_PET_NAME_QUERY = 0x041C,
+ CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x0117,
+ CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x07AA,
+ CMSG_BATTLE_PET_REQUEST_UPDATE = 0x134A,
CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x120B,
- CMSG_BEGIN_TRADE = 0xBADD,
+ CMSG_BATTLE_PET_SET_FLAGS = 0x0BA2,
+ CMSG_BATTLE_PET_SUMMON = 0x0B38,
+ CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x03B5,
+ CMSG_BEGIN_TRADE = 0x06CC,
CMSG_BINDER_ACTIVATE = 0x02F3,
+ CMSG_BLACK_MARKET_BID_ON_ITEM = 0x13C2,
+ CMSG_BLACK_MARKET_OPEN = 0x1B39,
+ CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x0B21,
CMSG_BOT_DETECTED2 = 0xBADD,
- CMSG_BUG = 0xBADD,
- CMSG_BUSY_TRADE = 0xBADD,
- CMSG_BUYBACK_ITEM = 0x02D3,
+ CMSG_BUG_REPORT = 0x0181,
+ CMSG_BUSY_TRADE = 0x00D5,
+ CMSG_BUY_BACK_ITEM = 0x02D3,
CMSG_BUY_BANK_SLOT = 0x0A25,
CMSG_BUY_ITEM = 0x0352,
- CMSG_CALENDAR_ADD_EVENT = 0xBADD,
+ CMSG_CAGE_BATTLE_PET = 0x0AFE,
+ CMSG_CALENDAR_ADD_EVENT = 0x09A3,
CMSG_CALENDAR_ARENA_TEAM = 0xBADD,
- CMSG_CALENDAR_COMPLAIN = 0xBADD,
+ CMSG_CALENDAR_COMPLAIN = 0x0D19,
CMSG_CALENDAR_CONTEXT_EVENT_SIGNUP = 0xBADD,
- CMSG_CALENDAR_COPY_EVENT = 0xBADD,
- CMSG_CALENDAR_EVENT_INVITE = 0xBADD,
- CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0xBADD,
+ CMSG_CALENDAR_COPY_EVENT = 0x0317,
+ CMSG_CALENDAR_EVENT_INVITE = 0x010E,
+ CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x118C,
CMSG_CALENDAR_EVENT_REMOVE_INVITE = 0xBADD,
- CMSG_CALENDAR_EVENT_RSVP = 0xBADD,
- CMSG_CALENDAR_EVENT_SIGNUP = 0xBADD,
- CMSG_CALENDAR_EVENT_STATUS = 0xBADD,
- CMSG_CALENDAR_GET_CALENDAR = 0xBADD,
- CMSG_CALENDAR_GET_EVENT = 0xBADD,
- CMSG_CALENDAR_GET_NUM_PENDING = 0xBADD,
- CMSG_CALENDAR_GUILD_FILTER = 0xBADD,
- CMSG_CALENDAR_REMOVE_EVENT = 0xBADD,
- CMSG_CALENDAR_UPDATE_EVENT = 0xBADD,
+ CMSG_CALENDAR_EVENT_RSVP = 0x11A4,
+ CMSG_CALENDAR_EVENT_SIGNUP = 0x0BAA,
+ CMSG_CALENDAR_EVENT_STATUS = 0x1201,
+ CMSG_CALENDAR_GET = 0x0336,
+ CMSG_CALENDAR_GET_EVENT = 0x1229,
+ CMSG_CALENDAR_GET_NUM_PENDING = 0x033E,
+ CMSG_CALENDAR_GUILD_FILTER = 0x070A,
+ CMSG_CALENDAR_REMOVE_EVENT = 0x0330,
+ CMSG_CALENDAR_REMOVE_INVITE = 0x03A3,
+ CMSG_CALENDAR_UPDATE_EVENT = 0x12A2,
CMSG_CANCEL_AURA = 0x08AE,
- CMSG_CANCEL_AUTO_REPEAT_SPELL = 0xBADD,
+ CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x0939,
CMSG_CANCEL_CAST = 0x0071,
CMSG_CANCEL_CHANNELLING = 0x0BE6,
CMSG_CANCEL_GROWTH_AURA = 0xBADD,
+ CMSG_CANCEL_MASTER_LOOT_ROLL = 0x0664,
CMSG_CANCEL_MOUNT_AURA = 0x03E6,
CMSG_CANCEL_QUEUED_SPELL = 0xBADD,
- CMSG_CANCEL_TEMP_ENCHANTMENT = 0xBADD,
+ CMSG_CANCEL_TEMP_ENCHANTMENT = 0x13C4,
CMSG_CANCEL_TRADE = 0x1159,
+ CMSG_CAN_DUEL = 0x0B25,
CMSG_CAST_SPELL = 0x08FE,
- CMSG_CHANGEPLAYER_DIFFICULTY = 0xBADD,
+ CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x0E66,
+ CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x0E78,
+ CMSG_CHANGE_BAG_SLOT_FLAG = 0x1959,
CMSG_CHANGE_SEATS_ON_CONTROLLED_VEHICLE = 0xBADD,
+ CMSG_CHANGE_SUB_GROUP = 0x0BA4,
+ CMSG_CHANGE_TROPHY = 0x0B91,
CMSG_CHANNEL_ANNOUNCEMENTS = 0x1313,
CMSG_CHANNEL_BAN = 0x1A82,
CMSG_CHANNEL_DECLINE_INVITE = 0x19DB,
@@ -180,8 +203,10 @@ enum OpcodeClient : uint32
CMSG_CHAR_UNDELETE_ENUM = 0x0F2D,
CMSG_CHAT_FILTERED = 0xBADD,
CMSG_CHAT_IGNORED = 0xBADD,
+ CMSG_CHOICE_RESPONSE = 0x00C3,
CMSG_CLEAR_RAID_MARKER = 0xBADD,
- CMSG_CLEAR_TRADE_ITEM = 0xBADD,
+ CMSG_CLEAR_TRADE_ITEM = 0x1149,
+ CMSG_CLOSE_INTERACTION = 0x1B19,
CMSG_COMMENTATOR_ENABLE = 0xBADD,
CMSG_COMMENTATOR_ENTER_INSTANCE = 0xBADD,
CMSG_COMMENTATOR_EXIT_INSTANCE = 0xBADD,
@@ -192,43 +217,70 @@ enum OpcodeClient : uint32
CMSG_COMMENTATOR_SKIRMISH_QUEUE_COMMAND = 0xBADD,
CMSG_COMMENTATOR_START_WARGAME = 0xBADD,
CMSG_COMPLAIN = 0x0917,
- CMSG_COMPLETE_CINEMATIC = 0xBADD,
- CMSG_COMPLETE_MOVIE = 0xBADD,
+ CMSG_COMPLETE_CINEMATIC = 0x1B51,
+ CMSG_COMPLETE_MOVIE = 0x13D4,
+ CMSG_CONFIRM_RESPEC_WIPE = 0x14B4,
CMSG_CONNECT_TO_FAILED = 0x0135,
CMSG_CONTACT_LIST = 0xBADD,
- CMSG_CORPSE_MAP_POSITION_QUERY = 0xBADD,
+ CMSG_CONVERSATION_UNK1 = 0x0912,
+ CMSG_CONVERT_RAID = 0x0137,
+ CMSG_CREATE_SHIPMENT = 0x068B,
CMSG_CREATURE_QUERY = 0x0505,
CMSG_DANCE_QUERY = 0xBADD,
CMSG_DB_QUERY_BULK = 0x138B,
+ CMSG_DECLINE_GUILD_INVITES = 0x148A,
+ CMSG_DECLINE_PETITION = 0x03EA,
+ CMSG_DELETE_EQUIPMENT_SET = 0x03C3,
CMSG_DEL_FRIEND = 0x0F2A,
CMSG_DEL_IGNORE = 0x033D,
CMSG_DEL_MUTE = 0x0128,
CMSG_DEL_VOICE_IGNORE = 0xBADD,
+ CMSG_DEPOSIT_REAGENT_BANK = 0x039B,
CMSG_DESTROY_ITEM = 0x01EE,
+ CMSG_DF_BOOT_PLAYER_VOTE = 0x0308,
+ CMSG_DF_JOIN = 0x0925,
+ CMSG_DF_LEAVE = 0x01A2,
+ CMSG_DF_PROPOSAL_RESPONSE = 0x0509,
+ CMSG_DF_SET_ROLES = 0x1B82,
+ CMSG_DF_TELEPORT = 0x0316,
+ CMSG_DISCARDED_TIME_SYNC_ACKS = 0x0142,
CMSG_DISMISS_CONTROLLED_VEHICLE = 0xBADD,
- CMSG_DISMISS_CRITTER = 0xBADD,
+ CMSG_DISMISS_CRITTER = 0x02F1,
+ CMSG_DO_MASTER_LOOT_ROLL = 0x09BE,
+ CMSG_DO_READY_CHECK = 0x1221,
CMSG_DUEL_RESPONSE = 0x1BD2,
CMSG_EJECT_PASSENGER = 0xBADD,
- CMSG_EMOTE = 0xBADD,
- CMSG_ENABLETAXI = 0x00D2,
+ CMSG_EMOTE = 0x0A27,
CMSG_ENABLE_NAGLE = 0x0460,
- CMSG_EQUIPMENT_SET_DELETE = 0xBADD,
+ CMSG_ENABLE_TAXI_NODE = 0x00D2,
CMSG_EQUIPMENT_SET_SAVE = 0x1B54,
CMSG_EQUIPMENT_SET_USE = 0xBADD,
- CMSG_FAR_SIGHT = 0xBADD,
- CMSG_FORCE_MOVE_ROOT_ACK = 0x0B73,
- CMSG_FORCE_MOVE_UNROOT_ACK = 0xBADD,
+ CMSG_FAR_SIGHT = 0x1C8A,
CMSG_GAMEOBJECT_QUERY = 0x03AE,
- CMSG_GAMEOBJ_REPORT_USE = 0x0B19,
- CMSG_GAMEOBJ_USE = 0x082E,
+ CMSG_GAMEOBJ_REPORT_USE = 0x082E,
+ CMSG_GAMEOBJ_USE = 0x0B19,
CMSG_GAMESPEED_SET = 0xBADD,
CMSG_GAMETIME_SET = 0xBADD,
+ CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x095A,
CMSG_GARRISON_COMPLETE_MISSION = 0x102C,
CMSG_GARRISON_MISSION_BONUS_ROLL = 0x02C2,
+ CMSG_GARRISON_PURCHASE_BUILDING = 0x04A2,
+ CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x01BB,
+ CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x16F2,
+ CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x0623,
+ CMSG_GARRISON_REQUEST_UPGRADEABLE = 0x02BD,
+ CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x03BC,
CMSG_GARRISON_START_MISSION = 0x1624,
+ CMSG_GARRISON_UNK1 = 0x02F5,
CMSG_GETDEATHBINDZONE = 0xBADD,
+ CMSG_GET_CHALLENGE_MODE_REWARDS = 0x1C2F,
+ CMSG_GET_GARRISON_INFO = 0x03CA,
CMSG_GET_MAIL_LIST = 0x0BD3,
CMSG_GET_MIRRORIMAGE_DATA = 0xBADD,
+ CMSG_GET_MIRROR_IMAGE_DATA = 0x08F6,
+ CMSG_GET_SHIPMENT_INFO = 0x06E3,
+ CMSG_GET_TROPHY_LIST = 0x13B1,
+ CMSG_GET_UNDELETE_COOLDOWN_STATUS = 0x19A9,
CMSG_GHOST = 0xBADD,
CMSG_GMRESPONSE_RESOLVE = 0xBADD,
CMSG_GMSURVEY_SUBMIT = 0xBADD,
@@ -241,6 +293,14 @@ enum OpcodeClient : uint32
CMSG_GM_NUKE = 0xBADD,
CMSG_GM_REPORT_LAG = 0xBADD,
CMSG_GM_SET_SECURITY_GROUP = 0xBADD,
+ CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x0327,
+ CMSG_GM_TICKET_CREATE = 0x0935,
+ CMSG_GM_TICKET_DELETE_TICKET = 0x0F2E,
+ CMSG_GM_TICKET_GET_CASE_STATUS = 0x0F0A,
+ CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x0B0E,
+ CMSG_GM_TICKET_GET_TICKET = 0x0B28,
+ CMSG_GM_TICKET_RESPONSE_RESOLVE = 0x0B20,
+ CMSG_GM_TICKET_UPDATE_TEXT = 0x0323,
CMSG_GOSSIP_HELLO = 0x00F3,
CMSG_GOSSIP_SELECT_OPTION = 0x0332,
CMSG_GRANT_LEVEL = 0x0BE3,
@@ -248,93 +308,108 @@ enum OpcodeClient : uint32
CMSG_GROUP_CANCEL = 0xBADD,
CMSG_GROUP_CHANGE_SUB_GROUP = 0xBADD,
CMSG_GROUP_DISBAND = 0xBADD,
- CMSG_GROUP_INVITE = 0xBADD,
- CMSG_GROUP_INVITE_RESPONSE = 0xBADD,
CMSG_GROUP_RAID_CONVERT = 0xBADD,
CMSG_GROUP_REQUEST_JOIN_UPDATES = 0xBADD,
CMSG_GROUP_SET_LEADER = 0xBADD,
CMSG_GROUP_SET_ROLES = 0xBADD,
CMSG_GROUP_SWAP_SUB_GROUP = 0xBADD,
- CMSG_GROUP_UNINVITE = 0xBADD,
- CMSG_GROUP_UNINVITE_GUID = 0xBADD,
CMSG_GUILD_ACCEPT = 0xBADD,
- CMSG_GUILD_ACHIEVEMENT_MEMBERS = 0xBADD,
- CMSG_GUILD_ACHIEVEMENT_PROGRESS_QUERY = 0xBADD,
- CMSG_GUILD_ADD_RANK = 0x0C2F,
+ CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x1437,
+ CMSG_GUILD_ADD_RANK = 0x1630,
CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x0436,
CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x062F,
- CMSG_GUILD_BANKER_ACTIVATE = 0xBADD,
+ CMSG_GUILD_BANKER_ACTIVATE = 0x19E3,
CMSG_GUILD_BANK_BUY_TAB = 0x1BC3,
CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x1B11,
CMSG_GUILD_BANK_LOG_QUERY = 0x0428,
- CMSG_GUILD_BANK_MONEY_WITHDRAWN_QUERY = 0x063D,
+ CMSG_GUILD_BANK_MONEY_WITHDRAWN_QUERY = 0x020D,
CMSG_GUILD_BANK_NOTE = 0xBADD,
- CMSG_GUILD_BANK_QUERY_TAB = 0x13C1,
- CMSG_GUILD_BANK_QUERY_TEXT = 0xBADD,
- CMSG_GUILD_BANK_SWAP_ITEMS = 0xBADD,
- CMSG_GUILD_BANK_UPDATE_TAB = 0xBADD,
+ CMSG_GUILD_BANK_QUERY_TAB = 0x1139,
+ CMSG_GUILD_BANK_QUERY_TEXT = 0x062D,
+ CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x063D,
+ CMSG_GUILD_BANK_SWAP_ITEMS = 0x1131,
+ CMSG_GUILD_BANK_UPDATE_TAB = 0x13C1,
CMSG_GUILD_BANK_WITHDRAW_MONEY = 0xBADD,
- CMSG_GUILD_CHANGE_NAME_REQUEST = 0xBADD,
+ CMSG_GUILD_CHANGE_NAME_REQUEST = 0x043E,
CMSG_GUILD_DECLINE = 0x0667,
- CMSG_GUILD_DEL_RANK = 0x0C28,
+ CMSG_GUILD_DELETE = 0x1427,
+ CMSG_GUILD_DELETE_RANK = 0x0C28,
CMSG_GUILD_DEMOTE = 0x142F,
- CMSG_GUILD_DISBAND = 0x0E68,
+ CMSG_GUILD_DISBAND = 0xBADD,
CMSG_GUILD_EVENT_LOG_QUERY = 0x0E37,
- CMSG_GUILD_INFO = 0xBADD,
- CMSG_GUILD_INFO_TEXT = 0x0C75,
- CMSG_GUILD_INVITE = 0x19A4,
+ CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x0C40,
+ CMSG_GUILD_GET_RANKS = 0x0C37,
+ CMSG_GUILD_GET_ROSTER = 0x0638,
+ CMSG_GUILD_INVITE_BY_NAME = 0x19A4,
CMSG_GUILD_LEAVE = 0x0476,
- CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0xBADD,
- CMSG_GUILD_MOTD = 0xBADD,
- CMSG_GUILD_NEWS_UPDATE_STICKY = 0xBADD,
- CMSG_GUILD_PERMISSIONS = 0x1436,
- CMSG_GUILD_PROMOTE = 0xBADD,
+ CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x0666,
+ CMSG_GUILD_NEWS_UPDATE_STICKY = 0x1625,
+ CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x042F,
+ CMSG_GUILD_PERMISSIONS_QUERY = 0x1436,
+ CMSG_GUILD_PROMOTE_MEMBER = 0x1467,
CMSG_GUILD_QUERY = 0x0930,
+ CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x0E2E,
+ CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x163D,
CMSG_GUILD_QUERY_NEWS = 0x0676,
- CMSG_GUILD_QUERY_RANKS = 0x0C37,
- CMSG_GUILD_REMOVE = 0x042F,
- CMSG_GUILD_REPLACE_GUILD_MASTER = 0xBADD,
+ CMSG_GUILD_QUERY_RECIPES = 0x1438,
+ CMSG_GUILD_REPLACE_GUILD_MASTER = 0x163E,
+ CMSG_GUILD_REQUEST_CHALLENGE_INFO = 0x166E,
CMSG_GUILD_REQUEST_CHALLENGE_UPDATE = 0xBADD,
CMSG_GUILD_REQUEST_MAX_DAILY_XP = 0xBADD,
CMSG_GUILD_REQUEST_PARTY_STATE = 0x0A8E,
- CMSG_GUILD_ROSTER = 0x0638,
- CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0xBADD,
+ CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x1640,
+ CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x0C7E,
CMSG_GUILD_SET_GUILD_MASTER = 0x1184,
+ CMSG_GUILD_SET_MEMBER_NOTE = 0x1C27,
CMSG_GUILD_SET_NOTE = 0xBADD,
CMSG_GUILD_SET_RANK_PERMISSIONS = 0x0E38,
- CMSG_GUILD_SWITCH_RANK = 0xBADD,
+ CMSG_GUILD_SHIFT_RANK = 0x0627,
+ CMSG_GUILD_UPDATE_INFO_TEXT = 0x0C75,
+ CMSG_GUILD_UPDATE_MOTD_TEXT = 0x0C2F,
CMSG_HEARTH_AND_RESURRECT = 0x0D9D,
- CMSG_IGNORE_TRADE = 0xBADD,
- CMSG_INITIATE_TRADE = 0xBADD,
+ CMSG_IGNORE_TRADE = 0x1419,
+ CMSG_INITIATE_TRADE = 0x19BB,
CMSG_INSPECT = 0x01EC,
- CMSG_INSPECT_HONOR_STATS = 0xBADD,
CMSG_INSTANCE_LOCK_WARNING_RESPONSE = 0xBADD,
CMSG_ITEM_REFUND = 0xBADD,
CMSG_ITEM_REFUND_INFO = 0x0924,
CMSG_ITEM_TEXT_QUERY = 0xBADD,
+ CMSG_JOIN_ARENA_SKIRMISH = 0x09EB,
CMSG_JOIN_CHANNEL = 0x0B4B,
- CMSG_KEEP_ALIVE = 0xBADD,
- CMSG_LEARN_TALENT = 0x0BB6,
+ CMSG_JOIN_PET_BATTLE_QUEUE = 0x04F4,
+ CMSG_JOIN_RATED_BATTLEGROUND = 0x065A,
+ CMSG_KEEP_ALIVE = 0x0981,
+ CMSG_LEARN_TALENTS = 0x0BB6,
CMSG_LEAVE_CHANNEL = 0x19F2,
+ CMSG_LEAVE_GROUP = 0x1BA3,
+ CMSG_LEAVE_PET_BATTLE_QUEUE = 0x038D,
CMSG_LFG_GET_STATUS = 0x1BA4,
CMSG_LFG_JOIN = 0xBADD,
CMSG_LFG_LEAVE = 0xBADD,
CMSG_LFG_LFR_JOIN = 0xBADD,
CMSG_LFG_LFR_LEAVE = 0xBADD,
+ CMSG_LFG_LIST_DECLINE_APPLICANT = 0x0916,
+ CMSG_LFG_LIST_GET_STATUS = 0x0B17,
+ CMSG_LFG_LIST_INVITE_APPLICANT = 0x12AB,
+ CMSG_LFG_LIST_INVITE_RESPONSE = 0x13AB,
+ CMSG_LFG_LIST_JOIN = 0x0B84,
+ CMSG_LFG_LIST_LEAVE = 0x0DA9,
+ CMSG_LFG_LIST_SEARCH = 0x0915,
CMSG_LFG_LOCK_INFO_REQUEST = 0x030F,
CMSG_LFG_PROPOSAL_RESULT = 0xBADD,
CMSG_LFG_SET_BOOT_VOTE = 0xBADD,
CMSG_LFG_SET_COMMENT = 0xBADD,
CMSG_LFG_SET_ROLES = 0xBADD,
CMSG_LFG_TELEPORT = 0xBADD,
- CMSG_LF_GUILD_ADD_RECRUIT = 0xBADD,
- CMSG_LF_GUILD_BROWSE = 0xBADD,
- CMSG_LF_GUILD_DECLINE_RECRUIT = 0xBADD,
- CMSG_LF_GUILD_GET_APPLICATIONS = 0xBADD,
- CMSG_LF_GUILD_GET_RECRUITS = 0xBADD,
+ CMSG_LF_GUILD_ADD_RECRUIT = 0x1223,
+ CMSG_LF_GUILD_BROWSE = 0x0BA3,
+ CMSG_LF_GUILD_DECLINE_RECRUIT = 0x066D,
+ CMSG_LF_GUILD_GET_APPLICATIONS = 0x043F,
+ CMSG_LF_GUILD_GET_GUILD_POST = 0x0E68,
+ CMSG_LF_GUILD_GET_RECRUITS = 0x0430,
CMSG_LF_GUILD_POST_REQUEST = 0xBADD,
- CMSG_LF_GUILD_REMOVE_RECRUIT = 0xBADD,
- CMSG_LF_GUILD_SET_GUILD_POST = 0xBADD,
+ CMSG_LF_GUILD_REMOVE_RECRUIT = 0x0680,
+ CMSG_LF_GUILD_SET_GUILD_POST = 0x0B3D,
CMSG_LIST_INVENTORY = 0x0B39,
CMSG_LOAD_SCREEN = 0x0B08,
CMSG_LOGOUT_CANCEL = 0x03C2,
@@ -344,17 +419,19 @@ enum OpcodeClient : uint32
CMSG_LOOT_CURRENCY = 0xBADD,
CMSG_LOOT_MASTER_GIVE = 0xBADD,
CMSG_LOOT_METHOD = 0x0729,
- CMSG_LOOT_MONEY = 0xBADD,
+ CMSG_LOOT_MONEY = 0x1991,
CMSG_LOOT_RELEASE = 0x1199,
- CMSG_LOOT_ROLL = 0xBADD,
+ CMSG_LOOT_ROLL = 0x09C5,
CMSG_MAIL_CREATE_TEXT_ITEM = 0x13D1,
CMSG_MAIL_DELETE = 0x068C,
CMSG_MAIL_MARK_AS_READ = 0x02D1,
CMSG_MAIL_RETURN_TO_SENDER = 0x1B84,
CMSG_MAIL_TAKE_ITEM = 0x0030,
CMSG_MAIL_TAKE_MONEY = 0x0806,
+ CMSG_MASTER_LOOT_ITEM = 0x0AA6,
CMSG_MEETINGSTONE_INFO = 0xBADD,
CMSG_MESSAGECHAT_ADDON_GUILD = 0x137C,
+ CMSG_MESSAGECHAT_ADDON_INSTANCE = 0x1823,
CMSG_MESSAGECHAT_ADDON_OFFICER = 0x188A,
CMSG_MESSAGECHAT_ADDON_PARTY = 0x015C,
CMSG_MESSAGECHAT_ADDON_RAID = 0x082C,
@@ -373,109 +450,142 @@ enum OpcodeClient : uint32
CMSG_MESSAGECHAT_WHISPER = 0x1829,
CMSG_MESSAGECHAT_YELL = 0x1161,
CMSG_MINIGAME_MOVE = 0xBADD,
- CMSG_MINIMAP_PING = 0x0837,
+ CMSG_MINIMAP_PING = 0x0116,
+ CMSG_MISSILE_TRAJECTORY_COLLISION = 0x1B92,
CMSG_MOUNTSPECIAL_ANIM = 0xBADD,
- CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0xBADD,
+ CMSG_MOUNT_SET_FAVORITE = 0x090E,
+ CMSG_MOUNT_SPECIAL_ANIM = 0x06DB,
+ CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x196C,
+ CMSG_MOVE_CHANGE_TRANSPORT = 0x0969,
+ CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x0581,
+ CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x1942,
CMSG_MOVE_CHNG_TRANSPORT = 0xBADD,
- CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0xBADD,
+ CMSG_MOVE_DISMISS_VEHICLE = 0x020A,
+ CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x0284,
+ CMSG_MOVE_FALL_LAND = 0x0D54,
CMSG_MOVE_FALL_RESET = 0x0522,
- CMSG_MOVE_FEATHER_FALL_ACK = 0xBADD,
- CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0xBADD,
- CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0xBADD,
- CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0xBADD,
- CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0xBADD,
+ CMSG_MOVE_FEATHER_FALL_ACK = 0x1142,
+ CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x05D3,
+ CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x028B,
+ CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x0591,
+ CMSG_MOVE_FORCE_ROOT_ACK = 0x0B73,
+ CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x0089,
CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x0B7C,
- CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0xBADD,
+ CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x0533,
CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x008A,
- CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0xBADD,
- CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0xBADD,
+ CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x0DC1,
+ CMSG_MOVE_FORCE_UNROOT_ACK = 0x0B6C,
+ CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x0204,
CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x0553,
- CMSG_MOVE_GRAVITY_ENABLE_ACK = 0xBADD,
+ CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x1952,
CMSG_MOVE_HEARTBEAT = 0x19C1,
- CMSG_MOVE_HOVER_ACK = 0x0543,
+ CMSG_MOVE_HOVER_ACK = 0x0542,
CMSG_MOVE_JUMP = 0x0282,
- CMSG_MOVE_KNOCK_BACK_ACK = 0xBADD,
- CMSG_MOVE_FALL_LAND = 0x0D54,
+ CMSG_MOVE_KNOCK_BACK_ACK = 0x09C1,
CMSG_MOVE_NOT_ACTIVE_MOVER = 0xBADD,
+ CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x0D52,
+ CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x01C1,
CMSG_MOVE_SET_CAN_FLY = 0xBADD,
- CMSG_MOVE_SET_CAN_FLY_ACK = 0xBADD,
+ CMSG_MOVE_SET_CAN_FLY_ACK = 0x0202,
CMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY_ACK = 0xBADD,
+ CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x0531,
CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x0141,
CMSG_MOVE_SET_FACING = 0x19D2,
+ CMSG_MOVE_SET_FLY = 0x09D2,
+ CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x05C3,
CMSG_MOVE_SET_PITCH = 0x0D92,
- CMSG_MOVE_SET_RELATIVE_POSITION = 0xBADD,
+ CMSG_MOVE_SET_RELATIVE_POSITION = 0x0973,
CMSG_MOVE_SET_RUN_MODE = 0x0D51,
- CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0xBADD,
+ CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x1973,
CMSG_MOVE_SET_WALK_MODE = 0x0544,
CMSG_MOVE_SPLINE_DONE = 0x0B63,
CMSG_MOVE_START_ASCEND = 0x0D41,
CMSG_MOVE_START_BACKWARD = 0x0583,
CMSG_MOVE_START_DESCEND = 0x0B79,
CMSG_MOVE_START_FORWARD = 0x0521,
- CMSG_MOVE_START_PITCH_DOWN = 0x1974,
- CMSG_MOVE_START_PITCH_UP = 0x0151,
+ CMSG_MOVE_START_PITCH_DOWN = 0x0151,
+ CMSG_MOVE_START_PITCH_UP = 0x1974,
CMSG_MOVE_START_STRAFE_LEFT = 0x0082,
CMSG_MOVE_START_STRAFE_RIGHT = 0x1151,
CMSG_MOVE_START_SWIM = 0x0B7A,
- CMSG_MOVE_START_TURN_LEFT = 0x000B,
- CMSG_MOVE_START_TURN_RIGHT = 0x0D14,
+ CMSG_MOVE_START_TURN_LEFT = 0x0D14,
+ CMSG_MOVE_START_TURN_RIGHT = 0x0964,
CMSG_MOVE_STOP = 0x0513,
CMSG_MOVE_STOP_ASCEND = 0x197C,
CMSG_MOVE_STOP_PITCH = 0x0503,
CMSG_MOVE_STOP_STRAFE = 0x01D1,
CMSG_MOVE_STOP_SWIM = 0x097C,
- CMSG_MOVE_STOP_TURN = 0x0964,
+ CMSG_MOVE_STOP_TURN = 0x000B,
CMSG_MOVE_TELEPORT_ACK = 0x0D01,
+ CMSG_MOVE_TELEPORT_CHEAT = 0x196A,
CMSG_MOVE_TIME_SKIPPED = 0x19C2,
CMSG_MOVE_TOGGLE_COLLISION_ACK = 0xBADD,
- CMSG_MOVE_WATER_WALK_ACK = 0x0B6C,
+ CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x008B,
+ CMSG_MOVE_WATER_WALK_ACK = 0x0543,
CMSG_MOVE_WORLDPORT_ACK = 0x0938,
CMSG_NAME_QUERY = 0x0B15,
+ CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x0B5A,
CMSG_NEW_SPELL_SLOT = 0xBADD,
- CMSG_NEXT_CINEMATIC_CAMERA = 0xBADD,
+ CMSG_NEXT_CINEMATIC_CAMERA = 0x1B3A,
CMSG_NPC_TEXT_QUERY = 0x0ECB,
- CMSG_OBJECT_UPDATE_FAILED = 0xBADD,
- CMSG_OBJECT_UPDATE_RESCUED = 0xBADD,
- CMSG_OFFER_PETITION = 0xBADD,
+ CMSG_OBJECT_UPDATE_FAILED = 0x14E2,
+ CMSG_OBJECT_UPDATE_RESCUED = 0x0AD6,
+ CMSG_OFFER_PETITION = 0x0315,
CMSG_OPENING_CINEMATIC = 0xBADD,
+ CMSG_OPEN_GARRISON_MISSION_NPC = 0x03D9,
CMSG_OPEN_ITEM = 0x08AD,
- CMSG_OPT_OUT_OF_LOOT = 0xBADD,
+ CMSG_OPEN_SHIPMENT_GAME_OBJ = 0x1359,
+ CMSG_OPEN_SHIPMENT_NPC = 0x0432,
+ CMSG_OPT_OUT_OF_LOOT = 0x0810,
CMSG_PAGE_TEXT_QUERY = 0x0BBB,
+ CMSG_PARTY_INVITE = 0x122C,
+ CMSG_PARTY_INVITE_RESPONSE = 0x118A,
CMSG_PARTY_SILENCE = 0xBADD,
+ CMSG_PARTY_UNINVITE = 0x1982,
CMSG_PARTY_UNSILENCE = 0xBADD,
- CMSG_PETITION_BUY = 0xBADD,
+ CMSG_PETITION_BUY = 0x0010,
CMSG_PETITION_QUERY = 0xBADD,
- CMSG_PETITION_SHOWLIST = 0xBADD,
- CMSG_PETITION_SHOW_SIGNATURES = 0xBADD,
+ CMSG_PETITION_RENAME_GUILD = 0x0920,
+ CMSG_PETITION_SHOW_LIST = 0x000F,
+ CMSG_PETITION_SHOW_SIGNATURES = 0x0BC4,
CMSG_PETITION_SIGN = 0xBADD,
CMSG_PET_ABANDON = 0x0005,
CMSG_PET_ACTION = 0x133A,
+ CMSG_PET_BATTLE_FINAL_NOTIF = 0x0565,
+ CMSG_PET_BATTLE_INPUT = 0x0989,
+ CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x140A,
+ CMSG_PET_BATTLE_QUIT_NOTIFY = 0x03D5,
+ CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x0936,
+ CMSG_PET_BATTLE_REQUEST_PVP = 0x1CDC,
+ CMSG_PET_BATTLE_REQUEST_WILD = 0x03C6,
+ CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x09CA,
CMSG_PET_CANCEL_AURA = 0xBADD,
CMSG_PET_CAST_SPELL = 0x0286,
CMSG_PET_LEARN_TALENT = 0xBADD,
CMSG_PET_NAME_CACHE = 0xBADD,
CMSG_PET_NAME_QUERY = 0x1433,
- CMSG_PET_RENAME = 0xBADD,
- CMSG_PET_SET_ACTION = 0xBADD,
- CMSG_PET_SPELL_AUTOCAST = 0xBADD,
- CMSG_PET_STOP_ATTACK = 0xBADD,
+ CMSG_PET_RENAME = 0x093F,
+ CMSG_PET_SET_ACTION = 0x020F,
+ CMSG_PET_SET_SPECIALIZATION = 0x08D6,
+ CMSG_PET_SPELL_AUTOCAST = 0x0A2F,
+ CMSG_PET_STOP_ATTACK = 0x19E2,
CMSG_PING = 0x0416,
CMSG_PLAYED_TIME = 0x1BB2,
- CMSG_PLAYER_DIFFICULTY_CHANGE = 0xBADD,
CMSG_PLAYER_LOGIN = 0x0B1D,
CMSG_PLAYER_VEHICLE_ENTER = 0xBADD,
CMSG_PLAY_DANCE = 0xBADD,
- CMSG_PUSHQUESTTOPARTY = 0xBADD,
+ CMSG_PORT_GRAVEYARD = 0x0D3E,
+ CMSG_PUSH_QUEST_TO_PARTY = 0x13E3,
CMSG_PVP_LOG_DATA = 0x08B5,
- CMSG_QUERY_BATTLEFIELD_STATE = 0x0359,
- CMSG_QUERY_GUILD_MEMBERS_FOR_RECIPE = 0xBADD,
- CMSG_QUERY_GUILD_MEMBER_RECIPES = 0xBADD,
- CMSG_QUERY_GUILD_RECIPES = 0xBADD,
- CMSG_QUERY_GUILD_REWARDS = 0xBADD,
+ CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x128A,
+ CMSG_QUERY_CORPSE_TRANSPORT = 0x0908,
+ CMSG_QUERY_COUNTDOWN_TIMER = 0x09DE,
CMSG_QUERY_GUILD_XP = 0xBADD,
- CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0xBADD,
+ CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x0A07,
CMSG_QUERY_NEXT_MAIL_TIME = 0x0B31,
- CMSG_QUERY_TIME = 0xBADD,
+ CMSG_QUERY_PETITION = 0x048B,
+ CMSG_QUERY_SCENARIO_POI = 0x09A1,
+ CMSG_QUERY_TIME = 0x1489,
CMSG_QUESTGIVER_ACCEPT_QUEST = 0x13D3,
CMSG_QUESTGIVER_CANCEL = 0xBADD,
CMSG_QUESTGIVER_CHOOSE_REWARD = 0x0DAD,
@@ -486,53 +596,70 @@ enum OpcodeClient : uint32
CMSG_QUESTGIVER_REQUEST_REWARD = 0x022E,
CMSG_QUESTGIVER_STATUS_MULTIPLE_QUERY = 0x0131,
CMSG_QUESTGIVER_STATUS_QUERY = 0x01E2,
- CMSG_QUESTLOG_REMOVE_QUEST = 0xBADD,
+ CMSG_QUESTLOG_REMOVE_QUEST = 0x0139,
CMSG_QUESTLOG_SWAP_QUEST = 0xBADD,
- CMSG_QUEST_CONFIRM_ACCEPT = 0xBADD,
+ CMSG_QUEST_CONFIRM_ACCEPT = 0x058D,
CMSG_QUEST_NPC_QUERY = 0x0B81,
CMSG_QUEST_POI_QUERY = 0x0BD9,
+ CMSG_QUEST_PUSH_RESULT = 0x03D2,
CMSG_QUEST_QUERY = 0x09A6,
CMSG_QUEUED_MESSAGES_END = 0x04DF,
- CMSG_RANDOM_ROLL = 0x12AA,
CMSG_RANDOMIZE_CHAR_NAME = 0x1981,
- CMSG_READ_ITEM = 0xBADD,
+ CMSG_RANDOM_ROLL = 0x12AA,
+ CMSG_READY_CHECK_RESPONSE = 0x071A,
+ CMSG_READ_ITEM = 0x09B9,
CMSG_REALM_NAME_QUERY = 0x1189,
- CMSG_RECLAIM_CORPSE = 0xBADD,
+ CMSG_RECLAIM_CORPSE = 0x1BC4,
CMSG_RECRUIT_A_FRIEND = 0x07BA,
+ CMSG_REGISTER_ADDON_PREFIXES = 0x03F4,
CMSG_REORDER_CHARACTERS = 0x0DAA,
CMSG_REPAIR_ITEM = 0x0B54,
CMSG_REPLACE_ACCOUNT_DATA = 0xBADD,
+ CMSG_REPLACE_TROPHY = 0x1431,
CMSG_REPOP_REQUEST = 0x1BC2,
- CMSG_REPORT_PVP_AFK = 0xBADD,
+ CMSG_REPORT_PVP_AFK = 0x113A,
CMSG_REQUEST_ACCOUNT_DATA = 0x0F3E,
- CMSG_REQUEST_CATEGORY_COOLDOWNS = 0xBADD,
+ CMSG_REQUEST_ARTIFACT_COMPLETION_HISTORY = 0x13D9,
+ CMSG_REQUEST_BATTLEFIELD_STATUS = 0x0320,
+ CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x1B99,
CMSG_REQUEST_CEMETERY_LIST = 0x10A2,
+ CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x0359,
+ CMSG_REQUEST_FORCED_REACTIONS = 0x02C3,
+ CMSG_REQUEST_GUILD_REWARDS_LIST = 0x028D,
+ CMSG_REQUEST_HONOR_STATS = 0x09FD,
+ CMSG_REQUEST_INSPECT_PVP = 0x0382,
CMSG_REQUEST_INSPECT_RATED_BG_STATS = 0xBADD,
- CMSG_REQUEST_PARTY_MEMBER_STATS = 0xBADD,
- CMSG_REQUEST_PET_INFO = 0xBADD,
- CMSG_REQUEST_PVP_OPTIONS_ENABLED = 0xBADD,
- CMSG_REQUEST_PVP_REWARDS = 0xBADD,
- CMSG_REQUEST_RAID_INFO = 0xBADD,
+ CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x0BCA,
+ CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x071D,
+ CMSG_REQUEST_PARTY_MEMBER_STATS = 0x031D,
+ CMSG_REQUEST_PET_INFO = 0x1B12,
+ CMSG_REQUEST_PVP_OPTIONS_ENABLED = 0x1101,
+ CMSG_REQUEST_PVP_REWARDS = 0x1399,
+ CMSG_REQUEST_RAID_INFO = 0x0104,
+ CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x1323,
CMSG_REQUEST_RATED_BG_INFO = 0xBADD,
CMSG_REQUEST_RATED_BG_STATS = 0xBADD,
CMSG_REQUEST_RESEARCH_HISTORY = 0xBADD,
CMSG_REQUEST_STABLED_PETS = 0x059D,
- CMSG_REQUEST_VEHICLE_EXIT = 0xBADD,
+ CMSG_REQUEST_VEHICLE_EXIT = 0x09CE,
CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0xBADD,
- CMSG_REQUEST_VEHICLE_PREV_SEAT = 0xBADD,
+ CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x0527,
CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0xBADD,
CMSG_RESET_FACTION_CHEAT = 0xBADD,
CMSG_RESET_INSTANCES = 0x0389,
- CMSG_RESURRECT_RESPONSE = 0xBADD,
- CMSG_RETURN_TO_GRAVEYARD = 0x12EA,
+ CMSG_RESURRECT_RESPONSE = 0x073E,
+ CMSG_REVERT_TROPHY = 0x0085,
CMSG_ROLE_POLL_BEGIN = 0xBADD,
CMSG_ROUTER_CLIENT_LOG_STREAMING_ERROR = 0x0C10,
CMSG_SAVE_CUF_PROFILES = 0x0053,
+ CMSG_SAVE_GUILD_EMBLEM = 0x00F6,
CMSG_SAVE_PLAYER = 0xBADD,
- CMSG_SEARCH_LFG_JOIN = 0xBADD,
- CMSG_SEARCH_LFG_LEAVE = 0xBADD,
+ CMSG_SCENE_PLAYBACK_CANCELED = 0x14B3,
+ CMSG_SCENE_PLAYBACK_COMPLETE = 0x0537,
+ CMSG_SCENE_TRIGGER_EVENT = 0x11B9,
CMSG_SELF_RES = 0x1343,
CMSG_SELL_ITEM = 0x0351,
+ CMSG_SEND_CONTACT_LIST = 0x079E,
CMSG_SEND_MAIL = 0x0910,
CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0xBADD,
CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0xBADD,
@@ -545,38 +672,52 @@ enum OpcodeClient : uint32
CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x031E,
CMSG_SET_ALLOW_LOW_LEVEL_RAID1 = 0xBADD,
CMSG_SET_ALLOW_LOW_LEVEL_RAID2 = 0xBADD,
+ CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x0C9C,
+ CMSG_SET_BANK_AUTOSORT_DISABLED = 0x1393,
CMSG_SET_CONTACT_NOTES = 0xBADD,
CMSG_SET_CURRENCY_FLAGS = 0xBADD,
CMSG_SET_DUNGEON_DIFFICULTY = 0x012F,
CMSG_SET_EVERYONE_IS_ASSISTANT = 0xBADD,
- CMSG_SET_FACTION_ATWAR = 0xBADD,
+ CMSG_SET_FACTION_AT_WAR = 0x051E,
CMSG_SET_FACTION_CHEAT = 0xBADD,
- CMSG_SET_FACTION_INACTIVE = 0xBADD,
+ CMSG_SET_FACTION_INACTIVE = 0x09E2,
+ CMSG_SET_FACTION_NOT_AT_WAR = 0x0A06,
CMSG_SET_GUILD_BANK_TEXT = 0xBADD,
+ CMSG_SET_LFG_BONUS_FACTION_ID = 0x009D,
CMSG_SET_LFG_COMMENT = 0xBADD,
CMSG_SET_LOOT_SPECIALIZATION = 0x0226,
+ CMSG_SET_PARTY_ASSIGNMENT = 0x050A,
+ CMSG_SET_PARTY_LEADER = 0x091E,
CMSG_SET_PET_SLOT = 0xBADD,
- CMSG_SET_PLAYER_DECLINED_NAMES = 0xBADD,
+ CMSG_SET_PLAYER_DECLINED_NAMES = 0x018B,
CMSG_SET_PREFERED_CEMETERY = 0xBADD,
CMSG_SET_PVP = 0x19B9,
CMSG_SET_RAID_DIFFICULTY = 0x1121,
CMSG_SET_RELATIVE_POSITION = 0xBADD,
- CMSG_SET_SAVED_INSTANCE_EXTEND = 0xBADD,
+ CMSG_SET_ROLE = 0x0326,
+ CMSG_SET_SAVED_INSTANCE_EXTEND = 0x1222,
CMSG_SET_SELECTION = 0x05BD,
CMSG_SET_SKILL_CHEAT = 0xBADD,
+ CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x089D,
CMSG_SET_SPECIALIZATION = 0x0AC5,
- CMSG_SET_TAXI_BENCHMARK_MODE = 0xBADD,
+ CMSG_SET_TAXI_BENCHMARK_MODE = 0x1332,
CMSG_SET_TITLE = 0x0BC6,
CMSG_SET_TRADE_CURRENCY = 0xBADD,
- CMSG_SET_TRADE_GOLD = 0xBADD,
- CMSG_SET_TRADE_ITEM = 0xBADD,
+ CMSG_SET_TRADE_GOLD = 0x064C,
+ CMSG_SET_TRADE_ITEM = 0x14A2,
CMSG_SET_VEHICLE_REC_ID_ACK = 0xBADD,
- CMSG_SET_WATCHED_FACTION = 0xBADD,
+ CMSG_SET_WATCHED_FACTION = 0x0206,
CMSG_SHOWING_CLOAK = 0x0132,
CMSG_SHOWING_HELM = 0x11E1,
+ CMSG_SHOW_TRADE_SKILL = 0x07AD,
+ CMSG_SIGN_PETITION = 0x0B03,
+ CMSG_SILENCE_PARTY_TALKER = 0x0BAC,
CMSG_SOCKET_GEMS = 0x1BE1,
+ CMSG_SORT_BAGS = 0x0AE6,
+ CMSG_SORT_BANK_BAGS = 0x06E4,
+ CMSG_SORT_REAGENT_BANK_BAGS = 0x0557,
CMSG_SPELLCLICK = 0x0BC2,
- CMSG_SPIRIT_HEALER_ACTIVATE = 0xBADD,
+ CMSG_SPIRIT_HEALER_ACTIVATE = 0x03EC,
CMSG_SPLIT_ITEM = 0x0795,
CMSG_STANDSTATECHANGE = 0x0ABD,
CMSG_START_QUEST = 0xBADD,
@@ -586,41 +727,51 @@ enum OpcodeClient : uint32
CMSG_SUBMIT_COMPLAIN = 0xBADD,
CMSG_SUGGESTION_SUBMIT = 0xBADD,
CMSG_SUMMON_RESPONSE = 0xBADD,
+ CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x0B0D,
CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x0B37,
+ CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x0D0A,
CMSG_SUSPEND_COMMS_ACK = 0x0C56,
CMSG_SUSPEND_TOKEN_RESPONSE = 0x041E,
CMSG_SWAP_INV_ITEM = 0x0F17,
CMSG_SWAP_ITEM = 0x0736,
+ CMSG_SWAP_SUB_GROUPS = 0x0106,
CMSG_SYNC_DANCE = 0xBADD,
+ CMSG_TABARD_VENDOR_ACTIVATE = 0x08EE,
CMSG_TAXICLEARALLNODES = 0xBADD,
CMSG_TAXIENABLEALLNODES = 0xBADD,
- CMSG_TAXINODE_STATUS_QUERY = 0x1BC1,
- CMSG_TAXIQUERYAVAILABLENODES = 0xBADD,
CMSG_TAXISHOWNODES = 0xBADD,
+ CMSG_TAXI_NODE_STATUS_QUERY = 0x1BC1,
+ CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x000E,
CMSG_TELEPORT_TO_UNIT = 0xBADD,
CMSG_TEXT_EMOTE = 0x1901,
CMSG_TIME_ADJUSTMENT_RESPONSE = 0xBADD,
- CMSG_TIME_SYNC_RESP = 0x0003,
- CMSG_TIME_SYNC_RESP_FAILED = 0xBADD,
+ CMSG_TIME_SYNC_RESPONSE = 0x0003,
+ CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x0D93,
+ CMSG_TIME_SYNC_RESPONSE_FAILED = 0x1B73,
CMSG_TOGGLE_PVP = 0x149B,
- CMSG_TOTEM_DESTROYED = 0xBADD,
+ CMSG_TOTEM_DESTROYED = 0x000D,
CMSG_TRAINER_BUY_SPELL = 0x0A28,
CMSG_TRAINER_LIST = 0x0A2E,
CMSG_TRANSMOGRIFY_ITEMS = 0x0A85,
CMSG_TRIGGER_CINEMATIC_CHEAT = 0xBADD,
- CMSG_TURN_IN_PETITION = 0xBADD,
+ CMSG_TROPHY_MONUMENT_LOAD_SELECTED_TROPHY_ID = 0x03DE,
+ CMSG_TURN_IN_PETITION = 0x1C89,
CMSG_TUTORIAL_FLAG = 0x0B16,
- CMSG_UNACCEPT_TRADE = 0xBADD,
+ CMSG_UI_TIME_REQUEST = 0x0302,
+ CMSG_UNACCEPT_TRADE = 0x13BA,
CMSG_UNDELETE_CHARACTER = 0x0D99,
- CMSG_UNDELETE_COOLDOWN_STATUS_QUERY = 0x19A9,
CMSG_UNLEARN_SKILL = 0x0A26,
- CMSG_UNLEARN_SPECIALIZATION = 0xBADD,
- CMSG_UNREGISTER_ALL_ADDON_PREFIXES = 0xBADD,
+ CMSG_UNREGISTER_ALL_ADDON_PREFIXES = 0x082A,
CMSG_UPDATE_ACCOUNT_DATA = 0x12A1,
+ CMSG_UPDATE_CLIENT_SETTINGS = 0x090F,
CMSG_UPDATE_MISSILE_TRAJECTORY = 0xBADD,
CMSG_UPDATE_PROJECTILE_POSITION = 0xBADD,
- CMSG_USED_FOLLOW = 0xBADD,
+ CMSG_UPDATE_RAID_TARGET = 0x1122,
+ CMSG_UPGRADE_GARRISON = 0x0526,
+ CMSG_USED_FOLLOW = 0x1609,
+ CMSG_USE_CRITTER_ITEM = 0x0BBE,
CMSG_USE_ITEM = 0x08B6,
+ CMSG_USE_TOY = 0x16E2,
CMSG_VIOLENCE_LEVEL = 0x098D,
CMSG_VOICE_SESSION_ENABLE = 0x1102,
CMSG_VOID_STORAGE_QUERY = 0x019E,
@@ -631,17 +782,14 @@ enum OpcodeClient : uint32
CMSG_WARGAME_ACCEPT = 0xBADD,
CMSG_WARGAME_START = 0xBADD,
CMSG_WHO = 0x1322,
- CMSG_WHOIS = 0xBADD,
- CMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x0302,
+ CMSG_WHOIS = 0x011F,
CMSG_WORLD_TELEPORT = 0xBADD,
CMSG_WRAP_ITEM = 0xBADD,
CMSG_ZONEUPDATE = 0xBADD,
- MSG_CORPSE_QUERY = 0xBADD,
MSG_GM_BIND_OTHER = 0xBADD,
MSG_GM_SHOWLABEL = 0xBADD,
MSG_GM_SUMMON = 0xBADD,
MSG_INSPECT_ARENA_TEAMS = 0xBADD,
- MSG_LIST_STABLED_PETS = 0xBADD,
MSG_MOVE_CHARM_TELEPORT_CHEAT = 0xBADD,
MSG_MOVE_SET_ALL_SPEED_CHEAT = 0xBADD,
MSG_MOVE_SET_FLIGHT_SPEED_CHEAT = 0xBADD,
@@ -652,50 +800,42 @@ enum OpcodeClient : uint32
MSG_MOVE_SET_SWIM_SPEED_CHEAT = 0xBADD,
MSG_MOVE_SET_TURN_RATE_CHEAT = 0xBADD,
MSG_MOVE_SET_WALK_SPEED_CHEAT = 0xBADD,
- MSG_MOVE_TELEPORT_CHEAT = 0xBADD,
- MSG_MOVE_TOGGLE_COLLISION_CHEAT = 0xBADD,
MSG_MOVE_TOGGLE_FALL_LOGGING = 0xBADD,
MSG_MOVE_TOGGLE_LOGGING = 0xBADD,
- MSG_MOVE_UPDATE_MOUSE = 0xBADD,
- MSG_NOTIFY_PARTY_SQUELCH = 0xBADD,
- MSG_PARTY_ASSIGNMENT = 0xBADD,
- MSG_PETITION_DECLINE = 0xBADD,
- MSG_PETITION_RENAME = 0xBADD,
- MSG_QUERY_NEXT_MAIL_TIME = 0xBADD,
- MSG_QUEST_PUSH_RESULT = 0xBADD,
- MSG_RAID_READY_CHECK = 0xBADD,
- MSG_RAID_READY_CHECK_FINISHED = 0xBADD,
- MSG_RAID_TARGET_UPDATE = 0xBADD,
- MSG_SAVE_GUILD_EMBLEM = 0xBADD,
- MSG_TABARDVENDOR_ACTIVATE = 0xBADD,
- MSG_TALENT_WIPE_CONFIRM = 0xBADD
+ MSG_NOTIFY_PARTY_SQUELCH = 0xBADD
};
// SMSGs 6.0.3.19342
enum OpcodeServer : uint32
{
+ SMSG_ABORT_NEW_WORLD = 0x138C,
+ SMSG_ACCOUNT_CRITERIA_UPDATE = 0x0912,
SMSG_ACCOUNT_DATA_TIMES = 0x0120,
SMSG_ACCOUNT_INFO_RESPONSE = 0xBADD,
SMSG_ACCOUNT_MOUNT_UPDATE = 0x0140,
SMSG_ACCOUNT_RESTRICTED_WARNING = 0xBADD,
SMSG_ACCOUNT_TOYS_UPDATE = 0x0590,
- SMSG_ACHIEVEMENT_DELETED = 0xBADD,
+ SMSG_ACHIEVEMENT_DELETED = 0x050E,
SMSG_ACHIEVEMENT_EARNED = 0x010E,
SMSG_ACTION_BUTTONS = 0x1D1F,
SMSG_ACTIVATE_TAXI_REPLY = 0x1321,
SMSG_ADDON_INFO = 0x1D9F,
- SMSG_ADD_RUNE_POWER = 0xBADD,
+ SMSG_ADD_LOSS_OF_CONTROL = 0x02F4,
+ SMSG_ADD_RUNE_POWER = 0x0322,
SMSG_ADJUST_SPLINE_DURATION = 0x0104,
SMSG_AE_LOOT_TARGETS = 0x15AF,
+ SMSG_AE_LOOT_TARGET_ACK = 0x031D,
SMSG_AI_REACTION = 0x0BA1,
- SMSG_ACCOUNT_CRITERIA_UPDATE = 0x0912,
SMSG_ALL_ACCOUNT_CRITERIA = 0x0123,
SMSG_ALL_ACHIEVEMENT_DATA = 0x0030,
- SMSG_AREA_SPIRIT_HEALER_TIME = 0xBADD,
+ SMSG_ALL_GUILD_ACHIEVEMENTS = 0x1866,
+ SMSG_AREA_SPIRIT_HEALER_TIME = 0x1182,
+ SMSG_AREA_TRIGGER_DENIED = 0x018A,
SMSG_AREA_TRIGGER_MESSAGE = 0xBADD,
SMSG_AREA_TRIGGER_MOVEMENT_UPDATE = 0xBADD,
+ SMSG_AREA_TRIGGER_NO_CORPSE = 0x0D3F,
+ SMSG_AREA_TRIGGER_RE_PATH = 0x0D20,
SMSG_ARENA_ERROR = 0xBADD,
- SMSG_ARENA_UNIT_DESTROYED = 0x19E1,
SMSG_ARENA_TEAM_CHANGE_FAILED_QUEUED = 0xBADD,
SMSG_ARENA_TEAM_COMMAND_RESULT = 0xBADD,
SMSG_ARENA_TEAM_EVENT = 0xBADD,
@@ -711,15 +851,20 @@ enum OpcodeServer : uint32
SMSG_ATTACKSWING_DEADTARGET = 0xBADD,
SMSG_ATTACKSWING_ERROR = 0x0509,
SMSG_ATTACKSWING_NOTINRANGE = 0xBADD,
- SMSG_AUCTION_BIDDER_LIST_RESULT = 0xBADD,
SMSG_AUCTION_BIDDER_NOTIFICATION = 0xBADD,
+ SMSG_AUCTION_CLOSED_NOTIFICATION = 0x058E,
SMSG_AUCTION_COMMAND_RESULT = 0x0B2D,
- SMSG_AUCTION_HELLO = 0x011F,
- SMSG_AUCTION_LIST_PENDING_SALES = 0xBADD,
+ SMSG_AUCTION_HELLO_RESPONSE = 0x011F,
+ SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x01E9,
SMSG_AUCTION_LIST_ITEMS_RESULT = 0x0BA4,
- SMSG_AUCTION_OWNER_LIST_RESULT = 0xBADD,
+ SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x0B42,
+ SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x0332,
+ SMSG_AUCTION_OUTBID_NOTIFICATION = 0x172E,
+ SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x0026,
SMSG_AUCTION_OWNER_NOTIFICATION = 0xBADD,
SMSG_AUCTION_REMOVED_NOTIFICATION = 0xBADD,
+ SMSG_AUCTION_REPLICATE_RESPONSE = 0x0325,
+ SMSG_AUCTION_WON_NOTIFICATION = 0x0D90,
SMSG_AURACASTLOG = 0xBADD,
SMSG_AURA_POINTS_DEPLETED = 0x093B,
SMSG_AURA_UPDATE = 0x091C,
@@ -730,73 +875,115 @@ enum OpcodeServer : uint32
SMSG_BARBER_SHOP_RESULT = 0x150D,
SMSG_BATTLEFIELD_LIST = 0x11A1,
SMSG_BATTLEFIELD_MGR_EJECTED = 0x0DAF,
- SMSG_BATTLEFIELD_MGR_EJECT_PENDING = 0xBADD,
+ SMSG_BATTLEFIELD_MGR_EJECT_PENDING = 0x09A1,
SMSG_BATTLEFIELD_MGR_ENTERED = 0x11A3,
SMSG_BATTLEFIELD_MGR_ENTRY_INVITE = 0xBADD,
SMSG_BATTLEFIELD_MGR_EXIT_REQUEST = 0xBADD,
- SMSG_BATTLEFIELD_MGR_QUEUE_INVITE = 0xBADD,
- SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE = 0xBADD,
- SMSG_BATTLEFIELD_MGR_STATE_CHANGE = 0xBADD,
- SMSG_BATTLEFIELD_PLAYER_POSITIONS = 0xBADD,
- SMSG_BATTLEFIELD_PORT_DENIED = 0xBADD,
+ SMSG_BATTLEFIELD_MGR_INVITE = 0x128B,
+ SMSG_BATTLEFIELD_MGR_QUEUE_INVITE = 0x0B32,
+ SMSG_BATTLEFIELD_MGR_QUEUE_REQUEST_RESPONSE = 0x0B28,
+ SMSG_BATTLEFIELD_MGR_STATE_CHANGED = 0x13C3,
+ SMSG_BATTLEFIELD_PORT_DENIED = 0x0930,
SMSG_BATTLEFIELD_RATED_INFO = 0x1F0A,
- SMSG_BATTLEFIELD_STATUS_NONE = 0x1E89,
- SMSG_BATTLEFIELD_STATUS_QUEUED = 0x002D,
SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x1284,
+ SMSG_BATTLEFIELD_STATUS_FAILED = 0x0308,
SMSG_BATTLEFIELD_STATUS_NEEDCONFIRMATION = 0x1719,
+ SMSG_BATTLEFIELD_STATUS_NONE = 0x1E89,
+ SMSG_BATTLEFIELD_STATUS_QUEUED = 0x002D,
SMSG_BATTLEFIELD_STATUS_WAITFORGROUPS = 0x082D,
- SMSG_BATTLEFIELD_STATUS_FAILED = 0x0308,
- SMSG_BATTLEGROUND_INFO_THROTTLED = 0xBADD,
+ SMSG_BATTLEGROUND_INFO_THROTTLED = 0x19E2,
+ SMSG_BATTLEGROUND_INIT = 0x13C4,
SMSG_BATTLEGROUND_PLAYER_JOINED = 0x13EA,
SMSG_BATTLEGROUND_PLAYER_LEFT = 0x1BD1,
+ SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x1BE9,
+ SMSG_BATTLEGROUND_POINTS = 0x122A,
+ SMSG_BATTLENET_CHALLENGE_ABORT = 0x0010,
+ SMSG_BATTLENET_CHALLENGE_START = 0x1322,
+ SMSG_BATTLE_PAY_ACK_FAILED = 0x013D,
+ SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x0938,
+ SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x1D2F,
+ SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x0927,
SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x0BE3,
SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x0F2A,
SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x12A4,
SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x168A,
+ SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x092F,
+ SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x03A2,
+ SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x0BA3,
+ SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x1D1E,
+ SMSG_BATTLE_PET_DELETED = 0x0138,
+ SMSG_BATTLE_PET_ERROR = 0x0227,
+ SMSG_BATTLE_PET_HEALED = 0x1BC1,
SMSG_BATTLE_PET_JOURNAL = 0x19A2,
SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x01A3,
- SMSG_BATTLE_PET_NAME_QUERY_RESPONSE = 0x09EC,
+ SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x1BEC,
+ SMSG_BATTLE_PET_LICENSE_CHANGED = 0x0FA9,
+ SMSG_BATTLE_PET_RESTORED = 0x159D,
+ SMSG_BATTLE_PET_REVOKED = 0x0936,
+ SMSG_BATTLE_PET_SLOT_UPDATES = 0x1D8F,
+ SMSG_BATTLE_PET_TRAP_LEVEL = 0x0911,
+ SMSG_BATTLE_PET_UPDATES = 0x0354,
SMSG_BINDER_CONFIRM = 0x0B11,
SMSG_BINDPOINTUPDATE = 0x0A30,
SMSG_BINDZONEREPLY = 0xBADD,
- SMSG_BREAK_TARGET = 0xBADD,
+ SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x0825,
+ SMSG_BLACK_MARKET_OPEN_RESULT = 0x0A05,
+ SMSG_BLACK_MARKET_OUTBID = 0x0B1D,
+ SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x1BC2,
+ SMSG_BLACK_MARKET_WON = 0x1BAA,
+ SMSG_BONUS_ROLL_EMPTY = 0x0BEA,
+ SMSG_BREAK_TARGET = 0x11A2,
SMSG_BUY_BANK_SLOT_RESULT = 0xBADD,
SMSG_BUY_FAILED = 0x013A,
SMSG_BUY_ITEM = 0x0BD1,
SMSG_CALENDAR_ACTION_PENDING = 0xBADD,
SMSG_CALENDAR_ARENA_TEAM = 0xBADD,
- SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0xBADD,
- SMSG_CALENDAR_COMMAND_RESULT = 0xBADD,
- SMSG_CALENDAR_EVENT_INVITE = 0xBADD,
- SMSG_CALENDAR_EVENT_INVITE_ALERT = 0xBADD,
- SMSG_CALENDAR_EVENT_INVITE_NOTES = 0xBADD,
- SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0xBADD,
- SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0xBADD,
- SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0xBADD,
- SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0xBADD,
+ SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x1E8A,
+ SMSG_CALENDAR_COMMAND_RESULT = 0x138A,
+ SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x0139,
+ SMSG_CALENDAR_EVENT_INVITE = 0x0BA2,
+ SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x0A0F,
+ SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x0B52,
+ SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x0208,
+ SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x1124,
+ SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x1F0E,
+ SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x0116,
+ SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x1183,
+ SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x1BD3,
SMSG_CALENDAR_EVENT_MODERATOR_STATUS_ALERT = 0xBADD,
SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0xBADD,
SMSG_CALENDAR_EVENT_STATUS = 0xBADD,
- SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0xBADD,
+ SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x1D9D,
SMSG_CALENDAR_FILTER_GUILD = 0xBADD,
- SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0xBADD,
- SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0xBADD,
- SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0xBADD,
- SMSG_CALENDAR_SEND_CALENDAR = 0xBADD,
- SMSG_CALENDAR_SEND_EVENT = 0xBADD,
+ SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x0901,
+ SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x0122,
+ SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x09A4,
+ SMSG_CALENDAR_SEND_CALENDAR = 0x0184,
+ SMSG_CALENDAR_SEND_EVENT = 0x0225,
SMSG_CALENDAR_SEND_NUM_PENDING = 0x1B3A,
SMSG_CALENDAR_UPDATE_INVITE_LIST = 0xBADD,
SMSG_CAMERA_SHAKE = 0xBADD,
SMSG_CANCEL_AUTO_REPEAT = 0x0B18,
SMSG_CANCEL_COMBAT = 0x05AD,
+ SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x1BFB,
+ SMSG_CANCEL_SCENE = 0x033F,
+ SMSG_CANCEL_SPELL_VISUAL = 0x0361,
+ SMSG_CAN_DUEL_RESULT = 0x03E9,
SMSG_CAST_FAILED = 0x1A89,
+ SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x0904,
+ SMSG_CHALLENGE_MODE_COMPLETE = 0x1B31,
+ SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x0135,
+ SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x13A3,
+ SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x07AA,
+ SMSG_CHALLENGE_MODE_REWARDS = 0x1CC9,
+ SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x0826,
SMSG_CHANNEL_LIST = 0x1411,
SMSG_CHANNEL_NOTIFY = 0x0643,
SMSG_CHANNEL_NOTIFY_JOINED = 0x1602,
SMSG_CHANNEL_NOTIFY_LEFT = 0x1452,
SMSG_CHANNEL_START = 0x016C,
SMSG_CHANNEL_UPDATE = 0x19DB,
- SMSG_CHARACTER_LOGIN_FAILED = 0xBADD,
+ SMSG_CHARACTER_LOGIN_FAILED = 0x091E,
SMSG_CHAR_CREATE = 0x0107,
SMSG_CHAR_CUSTOMIZE = 0x1932,
SMSG_CHAR_CUSTOMIZE_RESULT = 0x0BAA,
@@ -805,22 +992,23 @@ enum OpcodeServer : uint32
SMSG_CHAR_FACTION_CHANGE = 0x0810,
SMSG_CHAR_RENAME = 0x0D89,
SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0xBADD,
- SMSG_CHAT_NOT_IN_PARTY = 0xBADD,
+ SMSG_CHAT_NOT_IN_PARTY = 0x0604,
SMSG_CHAT_PLAYER_AMBIGUOUS = 0xBADD,
SMSG_CHAT_PLAYER_NOT_FOUND = 0x0614,
- SMSG_CHAT_RESTRICTED = 0xBADD,
+ SMSG_CHAT_RESTRICTED = 0x0484,
SMSG_CHAT_SERVER_DISCONNECTED = 0xBADD,
SMSG_CHAT_SERVER_DISCONNECTED_2 = 0xBADD,
SMSG_CHAT_SERVER_RECONNECTED = 0xBADD,
SMSG_CHAT_WRONG_FACTION = 0xBADD,
SMSG_CHECK_FOR_BOTS = 0xBADD,
- SMSG_CLEAR_BOSS_EMOTES = 0xBADD,
- SMSG_CLEAR_COOLDOWN = 0xBADD,
- SMSG_CLEAR_COOLDOWNS = 0xBADD,
+ SMSG_CLEAR_ALL_SPELL_CHARGE = 0x088B,
+ SMSG_CLEAR_BOSS_EMOTES = 0x118B,
+ SMSG_CLEAR_COOLDOWN = 0x0226,
+ SMSG_CLEAR_COOLDOWNS = 0x0BFA,
SMSG_CLEAR_FAR_SIGHT_IMMEDIATE = 0xBADD,
- SMSG_CLEAR_QUEST_COMPLETED_BIT = 0xBADD,
+ SMSG_CLEAR_QUEST_COMPLETED_BIT = 0x1563,
SMSG_CLEAR_QUEST_COMPLETED_BITS = 0x1D47,
- SMSG_CLEAR_TARGET = 0xBADD,
+ SMSG_CLEAR_TARGET = 0x17AE,
SMSG_CLIENTCACHE_VERSION = 0x080D,
SMSG_CLIENT_CONTROL_UPDATE = 0x080E,
SMSG_COIN_REMOVED = 0x0D30,
@@ -833,6 +1021,7 @@ enum OpcodeServer : uint32
SMSG_COMMENTATOR_SKIRMISH_QUEUE_RESULT2 = 0xBADD,
SMSG_COMMENTATOR_STATE_CHANGED = 0xBADD,
SMSG_COMPLAIN_RESULT = 0xBADD,
+ SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x0F3A,
SMSG_COMPRESSED_MOVES = 0xBADD,
SMSG_COMPRESSED_PACKET = 0x07CA,
SMSG_COMSAT_CONNECT_FAIL = 0xBADD,
@@ -843,168 +1032,203 @@ enum OpcodeServer : uint32
SMSG_CONTACT_STATUS = 0x1BEA,
SMSG_CONVERT_RUNE = 0x1C89,
SMSG_COOLDOWN_CHEAT = 0xBADD,
- SMSG_COOLDOWN_EVENT = 0xBADD,
- SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE = 0xBADD,
- SMSG_CORPSE_NOT_IN_INSTANCE = 0xBADD,
+ SMSG_COOLDOWN_EVENT = 0x05B0,
+ SMSG_CORPSE_LOCATION = 0x09E1,
SMSG_CORPSE_RECLAIM_DELAY = 0x0BE2,
+ SMSG_CORPSE_TRANSPORT_QUERY = 0x13AB,
+ SMSG_CREATE_SHIPMENT_RESPONSE = 0x11AB,
SMSG_CREATURE_QUERY_RESPONSE = 0x0A26,
- SMSG_CRITERIA_DELETED = 0xBADD,
+ SMSG_CRITERIA_DELETED = 0x0105,
SMSG_CRITERIA_UPDATE = 0x1904,
- SMSG_CROSSED_INEBRIATION_THRESHOLD = 0xBADD,
+ SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x0103,
SMSG_CURRENCY_LOOT_REMOVED = 0xBADD,
SMSG_CURRENCY_LOOT_RESTORED = 0xBADD,
- SMSG_CUSTOM_LOAD_SCREEN = 0xBADD,
+ SMSG_CUSTOM_LOAD_SCREEN = 0x0D1A,
+ SMSG_DAILY_QUESTS_RESET = 0x1514,
SMSG_DAMAGE_CALC_LOG = 0xBADD,
SMSG_DAMAGE_DONE_OBSOLETE = 0xBADD,
SMSG_DANCE_QUERY_RESPONSE = 0xBADD,
SMSG_DANCE_STUDIO_CREATE_RESULT = 0x178D,
SMSG_DB_REPLY = 0x1939,
- SMSG_DEATH_RELEASE_LOC = 0xBADD,
+ SMSG_DEATH_RELEASE_LOC = 0x098C,
SMSG_DEBUG_RUNE_REGEN = 0xBADD,
SMSG_DEBUG_SERVER_GEO = 0xBADD,
SMSG_DEFENSE_MESSAGE = 0x1442,
- SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0xBADD,
- SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0xBADD,
- SMSG_DISENCHANT_CREDIT = 0xBADD,
- SMSG_DISMOUNT = 0xBADD,
+ SMSG_DESTROY_ARENA_UNIT = 0x19E1,
+ SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x0A28,
+ SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x0B12,
+ SMSG_DISENCHANT_CREDIT = 0x050F,
+ SMSG_DISMOUNT = 0x0B89,
SMSG_DISMOUNTRESULT = 0xBADD,
SMSG_DISPEL_FAILED = 0xBADD,
- SMSG_DISPLAY_GAME_ERROR = 0xBADD,
+ SMSG_DISPLAY_GAME_ERROR = 0x090D,
+ SMSG_DISPLAY_PLAYER_CHOICE = 0x0907,
SMSG_DISPLAY_PROMOTION = 0x151D,
+ SMSG_DISPLAY_QUEST_POPUP = 0x15D7,
+ SMSG_DISPLAY_TOAST = 0x17BD,
SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0xBADD,
SMSG_DROP_NEW_CONNECTION = 0xBADD,
- SMSG_DUEL_COMPLETE = 0xBADD,
+ SMSG_DUEL_COMPLETE = 0x14C9,
SMSG_DUEL_COUNTDOWN = 0x020E,
SMSG_DUEL_INBOUNDS = 0xBADD,
SMSG_DUEL_OUTOFBOUNDS = 0xBADD,
- SMSG_DUEL_REQUESTED = 0xBADD,
+ SMSG_DUEL_REQUESTED = 0x0827,
SMSG_DUEL_WINNER = 0x0935,
SMSG_DUMP_RIDE_TICKETS_RESPONSE = 0xBADD,
- SMSG_DURABILITY_DAMAGE_DEATH = 0xBADD,
+ SMSG_DURABILITY_DAMAGE_DEATH = 0x01EC,
SMSG_ECHO_PARTY_SQUELCH = 0xBADD,
SMSG_EMOTE = 0x071D,
- SMSG_ENABLE_BARBER_SHOP = 0xBADD,
- SMSG_ENCHANTMENTLOG = 0xBADD,
+ SMSG_ENABLE_BARBER_SHOP = 0x13A2,
+ SMSG_ENCHANTMENT_LOG = 0x15AD,
+ SMSG_ENCOUNTER_END = 0x0311,
+ SMSG_ENCOUNTER_START = 0x1B8A,
SMSG_ENVIRONMENTALDAMAGELOG = 0x0AAB,
SMSG_EQUIPMENT_SET_LIST = 0x0F1E,
SMSG_EQUIPMENT_SET_SAVED = 0x0027,
SMSG_EQUIPMENT_SET_USE_RESULT = 0xBADD,
SMSG_EXPECTED_SPAM_RECORDS = 0xBADD,
- SMSG_EXPLORATION_EXPERIENCE = 0xBADD,
+ SMSG_EXPLORATION_EXPERIENCE = 0x07AE,
SMSG_FACTION_BONUS_INFO = 0x0928,
- SMSG_FAILED_PLAYER_CONDITION = 0xBADD,
+ SMSG_FAILED_PLAYER_CONDITION = 0x09AB,
SMSG_FEATURE_SYSTEM_STATUS = 0x0B1E,
SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x1540,
SMSG_FEIGN_DEATH_RESISTED = 0xBADD,
SMSG_FISH_ESCAPED = 0xBADD,
- SMSG_FISH_NOT_HOOKED = 0xBADD,
+ SMSG_FISH_NOT_HOOKED = 0x0DC0,
SMSG_FLIGHT_SPLINE_SYNC = 0x08A5,
SMSG_FLOOD_DETECTED = 0xBADD,
SMSG_FORCEACTIONSHOW = 0xBADD,
SMSG_FORCED_DEATH_UPDATE = 0xBADD,
SMSG_FORCE_ANIM = 0xBADD,
SMSG_FORCE_DISPLAY_UPDATE = 0xBADD,
- SMSG_FORCE_SET_VEHICLE_REC_ID = 0xBADD,
SMSG_FORGE_MASTER_SET = 0xBADD,
SMSG_FRIEND_STATUS = 0xBADD,
SMSG_GAMEOBJECT_ACTIVATE_ANIM_KIT = 0x038C,
SMSG_GAMEOBJECT_CUSTOM_ANIM = 0x03EB,
- SMSG_GAMEOBJECT_DESPAWN_ANIM = 0xBADD,
SMSG_GAMEOBJECT_DESPAWN = 0x0D29,
+ SMSG_GAMEOBJECT_DESPAWN_ANIM = 0xBADD,
SMSG_GAMEOBJECT_PAGETEXT = 0xBADD,
+ SMSG_GAMEOBJECT_PLAY_SPELL_VISUAL = 0x191B,
SMSG_GAMEOBJECT_QUERY_RESPONSE = 0x128A,
- SMSG_GAMEOBJECT_RESET_STATE = 0xBADD,
+ SMSG_GAMEOBJECT_RESET_STATE = 0x090E,
SMSG_GAMESPEED_SET = 0xBADD,
SMSG_GAMETIME_SET = 0xBADD,
- SMSG_GAMETIME_UPDATE = 0xBADD,
SMSG_GAME_EVENT_DEBUG_LOG = 0xBADD,
- SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x0952,
+ SMSG_GAME_TIME_UPDATE = 0x1709,
+ SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x0544,
+ SMSG_GARRISON_ADD_MISSION_RESULT = 0x0973,
+ SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x0B7C,
+ SMSG_GARRISON_BUILDING_ACTIVATED = 0x1974,
+ SMSG_GARRISON_BUILDING_REMOVED = 0x1151,
+ SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x0D54,
+ SMSG_GARRISON_FOLLOWER_XP_CHANGED = 0x1B64,
+ SMSG_GARRISON_LANDINGPAGE_SHIPMENTS = 0x1901,
+ SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x0952,
+ SMSG_GARRISON_MONUMENT_SELECTED_TROPHY_ID_LOADED = 0x09EA,
+ SMSG_GARRISON_OPEN_TRADESKILL = 0x09C1,
+ SMSG_GARRISON_PLOT_REMOVED = 0x0513,
SMSG_GARRISON_REMOTE_INFO = 0x0151,
- SMSG_GMRESPONSE_DB_ERROR = 0xBADD,
- SMSG_GMRESPONSE_RECEIVED = 0xBADD,
- SMSG_GMRESPONSE_STATUS_UPDATE = 0xBADD,
- SMSG_GMTICKET_CREATE = 0xBADD,
- SMSG_GMTICKET_DELETETICKET = 0xBADD,
- SMSG_GMTICKET_GETTICKET = 0xBADD,
- SMSG_GMTICKET_SYSTEMSTATUS = 0xBADD,
- SMSG_GMTICKET_UPDATETEXT = 0xBADD,
+ SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x0964,
+ SMSG_GARRISON_SET_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x0D92,
+ SMSG_GARRISON_START_MISSION_RESULT = 0x0D01,
+ SMSG_GARRISON_UNK1 = 0x0543,
+ SMSG_GARRISON_UNK3 = 0x096B,
+ SMSG_GARRISON_UPGRADEABLE_RESULT = 0x0522,
+ SMSG_GARRISON_UPGRADE_FOLLOWER_ITEM_LEVEL = 0x000C,
+ SMSG_GARRISON_UPGRADE_RESULT = 0x0D51,
+ SMSG_GET_GARRISON_INFO_RESULT = 0x0521,
+ SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x1BAB,
+ SMSG_GET_TROPHY_LIST_RESPONSE = 0x0126,
SMSG_GM_MESSAGECHAT = 0xBADD,
SMSG_GM_PLAYER_INFO = 0xBADD,
SMSG_GM_TICKET_CASE_STATUS = 0x1D8D,
SMSG_GM_TICKET_GET_TICKET_RESPONSE = 0x0389,
- SMSG_GM_TICKET_STATUS_UPDATE = 0xBADD,
+ SMSG_GM_TICKET_RESOLVE_RESPONSE = 0x091F,
+ SMSG_GM_TICKET_RESPONSE = 0x03EA,
+ SMSG_GM_TICKET_RESPONSE_ERROR = 0x070D,
+ SMSG_GM_TICKET_STATUS_UPDATE = 0x1D2E,
SMSG_GM_TICKET_SYSTEM_STATUS = 0x1229,
+ SMSG_GM_TICKET_UPDATE = 0x13EB,
SMSG_GODMODE = 0xBADD,
SMSG_GOSSIP_COMPLETE = 0x15D1,
SMSG_GOSSIP_MESSAGE = 0x1746,
SMSG_GOSSIP_POI = 0x011E,
- SMSG_GROUPACTION_THROTTLED = 0xBADD,
+ SMSG_GROUP_ACTION_THROTTLED = 0x0136,
SMSG_GROUP_CANCEL = 0xBADD,
- SMSG_GROUP_DECLINE = 0xBADD,
- SMSG_GROUP_DESTROYED = 0xBADD,
- SMSG_GROUP_INVITE = 0x0920,
- SMSG_GROUP_LIST = 0x15BE,
- SMSG_GROUP_SET_LEADER = 0xBADD,
+ SMSG_GROUP_DECLINE = 0x153F,
+ SMSG_GROUP_DESTROYED = 0x1982,
+ SMSG_GROUP_NEW_LEADER = 0x0984,
SMSG_GROUP_SET_ROLE = 0xBADD,
- SMSG_GROUP_UNINVITE = 0xBADD,
- SMSG_GUILD_ACHIEVEMENT_DATA = 0x1866,
- SMSG_GUILD_ACHIEVEMENT_DELETED = 0xBADD,
- SMSG_GUILD_ACHIEVEMENT_EARNED = 0xBADD,
- SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0xBADD,
+ SMSG_GROUP_UNINVITE = 0x0110,
+ SMSG_GUILD_ACHIEVEMENT_DELETED = 0x1058,
+ SMSG_GUILD_ACHIEVEMENT_EARNED = 0x1048,
+ SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x1826,
SMSG_GUILD_BANK_LIST = 0x1245,
SMSG_GUILD_BANK_LOG_QUERY_RESULT = 0x1237,
SMSG_GUILD_BANK_MONEY_WITHDRAWN = 0x1047,
- SMSG_GUILD_BANK_QUERY_TEXT_RESULT = 0xBADD,
+ SMSG_GUILD_BANK_QUERY_TEXT_RESULT = 0x1875,
SMSG_GUILD_CANCEL = 0xBADD,
- SMSG_GUILD_CHALLENGE_COMPLETED = 0xBADD,
+ SMSG_GUILD_CHALLENGE_COMPLETED = 0x1836,
SMSG_GUILD_CHALLENGE_UPDATED = 0x1A06,
- SMSG_GUILD_CHANGE_NAME_RESULT = 0xBADD,
- SMSG_GUILD_COMMAND_RESULT = 0xBADD,
+ SMSG_GUILD_CHANGE_NAME_RESULT = 0x1006,
+ SMSG_GUILD_COMMAND_RESULT = 0x1205,
SMSG_GUILD_COMMAND_RESULT_2 = 0xBADD,
- SMSG_GUILD_CRITERIA_DATA = 0xBADD,
- SMSG_GUILD_CRITERIA_DELETED = 0xBADD,
+ SMSG_GUILD_CRITERIA_DELETED = 0x1805,
SMSG_GUILD_CRITERIA_UPDATE = 0x1208,
SMSG_GUILD_DECLINE = 0xBADD,
- SMSG_GUILD_EVENT = 0x1027,
+ SMSG_GUILD_EVENT = 0xBADD,
+ SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x1045,
SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x1077,
- SMSG_GUILD_EVENT_LOG_QUERY_RESULT = 0xBADD,
+ SMSG_GUILD_EVENT_DISBANDED = 0x1A08,
+ SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x1075,
+ SMSG_GUILD_EVENT_MOTD = 0x1825,
+ SMSG_GUILD_EVENT_NEW_LEADER = 0x1005,
+ SMSG_GUILD_EVENT_PLAYER_JOINED = 0x1257,
+ SMSG_GUILD_EVENT_PLAYER_LEFT = 0x1206,
SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x1228,
+ SMSG_GUILD_EVENT_RANKS_UPDATED = 0x1018,
SMSG_GUILD_EVENT_RANK_CHANGED = 0x1276,
- SMSG_GUILD_FLAGGED_FOR_RENAME = 0xBADD,
+ SMSG_GUILD_EVENT_TAB_ADDED = 0x1868,
+ SMSG_GUILD_EVENT_TAB_DELETED = 0x1808,
+ SMSG_GUILD_EVENT_TAB_MODIFIED = 0x1035,
+ SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x1076,
+ SMSG_GUILD_FLAGGED_FOR_RENAME = 0x1248,
SMSG_GUILD_INVITE = 0x1025,
SMSG_GUILD_INVITE_CANCEL = 0xBADD,
- SMSG_GUILD_KNOWN_RECIPES = 0xBADD,
+ SMSG_GUILD_INVITE_DECLINED = 0x1226,
+ SMSG_GUILD_INVITE_EXPIRED = 0x1246,
+ SMSG_GUILD_KNOWN_RECIPES = 0x1078,
SMSG_GUILD_MAX_DAILY_XP = 0xBADD,
- SMSG_GUILD_MEMBERS_FOR_RECIPE = 0xBADD,
+ SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x1277,
SMSG_GUILD_MEMBER_DAILY_RESET = 0x1015,
- SMSG_GUILD_MEMBER_RECIPES = 0xBADD,
- SMSG_GUILD_MEMBER_UPDATE_NOTE = 0xBADD,
- SMSG_GUILD_MOTD = 0x1825,
+ SMSG_GUILD_MEMBER_RECIPES = 0x1036,
+ SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x1846,
+ SMSG_GUILD_MOVED = 0x1838,
SMSG_GUILD_MOVE_COMPLETE = 0xBADD,
- SMSG_GUILD_MOVE_STARTING = 0xBADD,
- SMSG_GUILD_NEWS_DELETED = 0xBADD,
+ SMSG_GUILD_MOVE_STARTING = 0x1877,
+ SMSG_GUILD_NAME_CHANGED = 0x1A07,
+ SMSG_GUILD_NEWS = 0x1027,
+ SMSG_GUILD_NEWS_DELETED = 0x1007,
SMSG_GUILD_NEWS_UPDATE = 0xBADD,
SMSG_GUILD_PARTY_STATE_RESPONSE = 0x1225,
SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x1827,
SMSG_GUILD_QUERY_RESPONSE = 0x1046,
- SMSG_GUILD_RANK = 0x1218,
- SMSG_GUILD_RANKS_UPDATE = 0x1207,
- SMSG_GUILD_RECIPES = 0x1078,
- SMSG_GUILD_RENAMED = 0xBADD,
- SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0xBADD,
+ SMSG_GUILD_RANKS = 0x1218,
+ SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x1068,
SMSG_GUILD_REPUTATION_WEEKLY_CAP = 0xBADD,
- SMSG_GUILD_RESET = 0xBADD,
+ SMSG_GUILD_RESET = 0x1258,
SMSG_GUILD_REWARDS_LIST = 0x1818,
SMSG_GUILD_ROSTER = 0x1026,
+ SMSG_GUILD_ROSTER_UPDATE = 0x1265,
+ SMSG_GUILD_SEND_RANK_CHANGE = 0x1207,
SMSG_GUILD_SET_NOTE = 0xBADD,
SMSG_GUILD_TRADESKILL_UPDATE = 0xBADD,
- SMSG_GUILD_UPDATE_ROSTER = 0xBADD,
SMSG_GUILD_XP = 0xBADD,
SMSG_GUILD_XP_GAIN = 0xBADD,
SMSG_GUILD_XP_UPDATE = 0xBADD,
- SMSG_HEALTH_UPDATE = 0xBADD,
+ SMSG_HEALTH_UPDATE = 0x0BE1,
SMSG_HIGHEST_THREAT_UPDATE = 0x059A,
- SMSG_HOTFIX_NOTIFY = 0xBADD,
+ SMSG_HOTFIX_NOTIFY = 0x1304,
SMSG_HOTFIX_NOTIFY_BLOB = 0x1D1D,
SMSG_IGNORE_DIMINISHING_RETURNS_CHEAT = 0xBADD,
SMSG_IGNORE_REQUIREMENTS_CHEAT = 0xBADD,
@@ -1013,23 +1237,35 @@ enum OpcodeServer : uint32
SMSG_INITIAL_SPELLS = 0x0A81,
SMSG_INIT_WORLD_STATES = 0x0B04,
SMSG_INSPECT = 0xBADD,
- SMSG_INSPECT_HONOR_STATS = 0xBADD,
+ SMSG_INSPECT_HONOR_STATS = 0x02D3,
+ SMSG_INSPECT_PVP = 0x050A,
SMSG_INSPECT_RATED_BG_STATS = 0xBADD,
- SMSG_INSPECT_RESULTS_UPDATE = 0xBADD,
+ SMSG_INSPECT_RESULT = 0x052E,
SMSG_INSPECT_TALENT = 0xBADD,
+ SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x0B03,
+ SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x05AE,
+ SMSG_INSTANCE_ENCOUNTER_END = 0x0B1A,
+ SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x0137,
+ SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x15BD,
+ SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x13A1,
+ SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x19EA,
+ SMSG_INSTANCE_ENCOUNTER_START = 0x051A,
+ SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x1B8B,
SMSG_INSTANCE_INFO = 0x0DA0,
SMSG_INSTANCE_LOCK_WARNING_QUERY = 0xBADD,
SMSG_INSTANCE_RESET = 0x0B16,
- SMSG_INSTANCE_RESET_FAILED = 0xBADD,
- SMSG_INSTANCE_SAVE_CREATED = 0xBADD,
+ SMSG_INSTANCE_RESET_FAILED = 0x1189,
+ SMSG_INSTANCE_SAVE_CREATED = 0x093A,
SMSG_INVALIDATE_DANCE = 0xBADD,
SMSG_INVALIDATE_PLAYER = 0x0B37,
SMSG_INVALID_PROMOTION_CODE = 0xBADD,
SMSG_INVENTORY_CHANGE_FAILURE = 0x0112,
+ SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x17E1,
SMSG_ITEM_ADD_PASSIVE = 0xBADD,
- SMSG_ITEM_COOLDOWN = 0xBADD,
+ SMSG_ITEM_COOLDOWN = 0x090F,
SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x010D,
- SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0xBADD,
+ SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x1282,
+ SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x0B3D,
SMSG_ITEM_PUSH_RESULT = 0x0183,
SMSG_ITEM_REFUND_INFO_RESPONSE = 0xBADD,
SMSG_ITEM_REFUND_RESULT = 0xBADD,
@@ -1041,32 +1277,42 @@ enum OpcodeServer : uint32
SMSG_KICK_REASON = 0xBADD,
SMSG_LEARNED_DANCE_MOVES = 0xBADD,
SMSG_LEARNED_SPELLS = 0x08AB,
+ SMSG_LEARN_TALENT_FAILED = 0x1BA3,
SMSG_LEVELUP_INFO = 0x1BE4,
+ SMSG_LFG_BOOT_PLAYER = 0x07B3,
SMSG_LFG_BOOT_PROPOSAL_UPDATE = 0xBADD,
- SMSG_LFG_DISABLED = 0xBADD,
+ SMSG_LFG_DISABLED = 0x0714,
SMSG_LFG_JOIN_RESULT = 0x0F72,
- SMSG_LFG_OFFER_CONTINUE = 0xBADD,
+ SMSG_LFG_LIST_JOIN_RESULT = 0x0793,
+ SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x0754,
+ SMSG_LFG_LIST_UPDATE_STATUS = 0x0F18,
+ SMSG_LFG_OFFER_CONTINUE = 0x0797,
SMSG_LFG_OPEN_FROM_GOSSIP = 0xBADD,
- SMSG_LFG_PARTY_INFO = 0xBADD,
+ SMSG_LFG_PARTY_INFO = 0x0F92,
SMSG_LFG_PLAYER_INFO = 0x0F36,
- SMSG_LFG_PLAYER_REWARD = 0xBADD,
- SMSG_LFG_PROPOSAL_UPDATE = 0xBADD,
+ SMSG_LFG_PLAYER_REWARD = 0x0F15,
+ SMSG_LFG_PROPOSAL_UPDATE = 0x0F32,
SMSG_LFG_QUEUE_STATUS = 0x07F1,
- SMSG_LFG_ROLE_CHECK_UPDATE = 0xBADD,
+ SMSG_LFG_ROLE_CHECK_UPDATE = 0x0736,
SMSG_LFG_ROLE_CHOSEN = 0xBADD,
- SMSG_LFG_SLOT_INVALID = 0xBADD,
- SMSG_LFG_TELEPORT_DENIED = 0xBADD,
+ SMSG_LFG_SEARCH_RESULTS = 0x0798,
+ SMSG_LFG_SLOT_INVALID = 0x07B1,
+ SMSG_LFG_TELEPORT_DENIED = 0x0795,
SMSG_LFG_UPDATE_LIST = 0xBADD,
SMSG_LFG_UPDATE_SEARCH = 0xBADD,
SMSG_LFG_UPDATE_STATUS = 0x07F7,
- SMSG_LF_GUILD_APPLICANT_LIST_UPDATED = 0xBADD,
- SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0xBADD,
- SMSG_LF_GUILD_BROWSE_UPDATED = 0xBADD,
- SMSG_LF_GUILD_COMMAND_RESULT = 0xBADD,
+ SMSG_LF_GUILD_APPLICANT_LIST_UPDATED = 0x1815,
+ SMSG_LF_GUILD_APPLICATIONS = 0x1227,
+ SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x1247,
+ SMSG_LF_GUILD_BROWSE = 0x1215,
+ SMSG_LF_GUILD_COMMAND_RESULT = 0x1217,
SMSG_LF_GUILD_MEMBERSHIP_LIST_UPDATED = 0xBADD,
- SMSG_LF_GUILD_POST_UPDATED = 0xBADD,
- SMSG_LF_GUILD_RECRUIT_LIST_UPDATED = 0xBADD,
+ SMSG_LF_GUILD_POST = 0x1817,
+ SMSG_LF_GUILD_RECRUITS = 0x1008,
SMSG_LIST_INVENTORY = 0x0940,
+ SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x113A,
+ SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x082E,
+ SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x11E1,
SMSG_LOAD_CUF_PROFILES = 0x1530,
SMSG_LOGIN_SETTIMESPEED = 0x09AA,
SMSG_LOGIN_VERIFY_WORLD = 0x0B19,
@@ -1074,23 +1320,28 @@ enum OpcodeServer : uint32
SMSG_LOGOUT_COMPLETE = 0x0B21,
SMSG_LOGOUT_RESPONSE = 0x052D,
SMSG_LOG_XPGAIN = 0x1B53,
- SMSG_LOOT_ALL_PASSED = 0xBADD,
+ SMSG_LOOT_ALL_PASSED = 0x0DBD,
SMSG_LOOT_CLEAR_MONEY = 0xBADD,
- SMSG_LOOT_CONTENTS = 0xBADD,
+ SMSG_LOOT_CONTENTS = 0x02F1,
+ SMSG_LOOT_ITEM_LIST = 0x1789,
SMSG_LOOT_ITEM_NOTIFY = 0xBADD,
- SMSG_LOOT_LIST = 0xBADD,
+ SMSG_LOOT_LIST = 0x03A4,
SMSG_LOOT_MASTER_LIST = 0xBADD,
SMSG_LOOT_MONEY_NOTIFY = 0x12A9,
- SMSG_LOOT_RELEASE_RESPONSE = 0xBADD,
+ SMSG_LOOT_RELEASE = 0x0BD3,
+ SMSG_LOOT_RELEASE_ALL = 0x198C,
SMSG_LOOT_REMOVED = 0x0906,
SMSG_LOOT_RESPONSE = 0x0F8A,
- SMSG_LOOT_ROLL = 0xBADD,
- SMSG_LOOT_ROLL_WON = 0xBADD,
+ SMSG_LOOT_ROLL = 0x1BE2,
+ SMSG_LOOT_ROLLS_COMPLETE = 0x0D2F,
+ SMSG_LOOT_ROLL_WON = 0x071E,
SMSG_LOOT_SLOT_CHANGED = 0xBADD,
- SMSG_LOOT_START_ROLL = 0xBADD,
+ SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x0305,
SMSG_MAIL_LIST_RESULT = 0x0B3F,
SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x153D,
- SMSG_MAP_OBJ_EVENTS = 0xBADD,
+ SMSG_MAP_OBJECTIVES_INIT = 0x1323,
+ SMSG_MAP_OBJ_EVENTS = 0x031A,
+ SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x171D,
SMSG_MEETINGSTONE_COMPLETE = 0xBADD,
SMSG_MEETINGSTONE_IN_PROGRESS = 0xBADD,
SMSG_MEETINGSTONE_MEMBER_ADDED = 0xBADD,
@@ -1101,300 +1352,384 @@ enum OpcodeServer : uint32
SMSG_MINIGAME_STATE = 0xBADD,
SMSG_MINIMAP_PING = 0x07BA,
SMSG_MIRRORIMAGE_DATA = 0xBADD,
- SMSG_MISSILE_CANCEL = 0xBADD,
- SMSG_MODIFY_COOLDOWN = 0xBADD,
+ SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x1B5C,
+ SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x1B14,
+ SMSG_MISSILE_CANCEL = 0x0337,
+ SMSG_MODIFY_COOLDOWN = 0x17BA,
SMSG_MONEY_NOTIFY = 0xBADD,
- SMSG_MONSTER_MOVE = 0x0994,
- SMSG_MONSTER_MOVE_TRANSPORT = 0xBADD,
SMSG_MOTD = 0x0442,
- SMSG_MOUNTRESULT = 0xBADD,
- SMSG_MOUNTSPECIAL_ANIM = 0xBADD,
- SMSG_MOVE_COLLISION_DISABLE = 0xBADD,
- SMSG_MOVE_COLLISION_ENABLE = 0xBADD,
- SMSG_MOVE_FEATHER_FALL = 0xBADD,
- SMSG_MOVE_GRAVITY_DISABLE = 0x02C6,
- SMSG_MOVE_GRAVITY_ENABLE = 0xBADD,
- SMSG_MOVE_KNOCK_BACK = 0xBADD,
- SMSG_MOVE_LAND_WALK = 0x13DA,
- SMSG_MOVE_NORMAL_FALL = 0xBADD,
+ SMSG_MOUNT_RESULT = 0x000F,
+ SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x06CB,
+ SMSG_MOVE_DISABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x00C5,
+ SMSG_MOVE_DISABLE_COLLISION = 0xBADD,
+ SMSG_MOVE_DISABLE_GRAVITY = 0x02C6,
+ SMSG_MOVE_ENABLE_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x08CE,
+ SMSG_MOVE_ENABLE_COLLISION = 0xBADD,
+ SMSG_MOVE_ENABLE_GRAVITY = 0x03B4,
+ SMSG_MOVE_KNOCK_BACK = 0x0CCB,
+ SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x0073,
SMSG_MOVE_ROOT = 0x1B5A,
- SMSG_MOVE_SET_ACTIVE_MOVER = 0xBADD,
+ SMSG_MOVE_SET_ACTIVE_MOVER = 0x1021,
+ SMSG_MOVE_SET_ANIM_KIT = 0x052F,
SMSG_MOVE_SET_CAN_FLY = 0x01F6,
- SMSG_MOVE_SET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x08CE,
+ SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x09B2,
SMSG_MOVE_SET_COLLISION_HEIGHT = 0x008D,
- SMSG_MOVE_SET_COMPOUND_STATE = 0xBADD,
+ SMSG_MOVE_SET_COMPOUND_STATE = 0x02E5,
+ SMSG_MOVE_SET_FEATHER_FALL = 0x01DD,
SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0xBADD,
- SMSG_MOVE_SET_FLIGHT_SPEED = 0xBADD,
+ SMSG_MOVE_SET_FLIGHT_SPEED = 0x100B,
SMSG_MOVE_SET_HOVER = 0x0296,
+ SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x1BD9,
+ SMSG_MOVE_SET_LAND_WALK = 0x13DA,
+ SMSG_MOVE_SET_NORMAL_FALL = 0x0193,
SMSG_MOVE_SET_PITCH_RATE = 0xBADD,
- SMSG_MOVE_SET_RUN_BACK_SPEED = 0xBADD,
+ SMSG_MOVE_SET_RUN_BACK_SPEED = 0x09C5,
SMSG_MOVE_SET_RUN_SPEED = 0x08F5,
SMSG_MOVE_SET_SWIM_BACK_SPEED = 0xBADD,
SMSG_MOVE_SET_SWIM_SPEED = 0x061A,
SMSG_MOVE_SET_TURN_RATE = 0xBADD,
- SMSG_MOVE_SET_VEHICLE_REC_ID = 0xBADD,
+ SMSG_MOVE_SET_VEHICLE_REC_ID = 0x09DD,
SMSG_MOVE_SET_WALK_IN_AIR = 0xBADD,
- SMSG_MOVE_SET_WALK_SPEED = 0xBADD,
+ SMSG_MOVE_SET_WALK_SPEED = 0x0396,
+ SMSG_MOVE_SET_WATER_WALK = 0x02A6,
+ SMSG_MOVE_SKIP_TIME = 0x08A6,
+ SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x1349,
+ SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x0A86,
+ SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x02DE,
+ SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x0659,
+ SMSG_MOVE_SPLINE_ROOT = 0x1959,
+ SMSG_MOVE_SPLINE_SET_ANIM = 0xBADD,
+ SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x01FD,
+ SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x0061,
+ SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x060C,
+ SMSG_MOVE_SPLINE_SET_FLYING = 0x02BD,
+ SMSG_MOVE_SPLINE_SET_HOVER = 0x0BD6,
+ SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x01BC,
+ SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x11B1,
+ SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x045C,
+ SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x0086,
+ SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x0896,
+ SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x1B9A,
+ SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x0895,
+ SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x098D,
+ SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x03F6,
+ SMSG_MOVE_SPLINE_SET_WALK_BACK_SPEED = 0x01D5,
+ SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x03D6,
+ SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0xBADD,
+ SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x02D5,
+ SMSG_MOVE_SPLINE_START_SWIM = 0x01BB,
+ SMSG_MOVE_SPLINE_STOP_SWIM = 0x1391,
+ SMSG_MOVE_SPLINE_UNROOT = 0x03B2,
+ SMSG_MOVE_SPLINE_UNSET_FLYING = 0x09D9,
+ SMSG_MOVE_SPLINE_UNSET_HOVER = 0x1B4A,
SMSG_MOVE_TELEPORT = 0x03A6,
SMSG_MOVE_UNROOT = 0x08BD,
SMSG_MOVE_UNSET_CAN_FLY = 0x0BAE,
- SMSG_MOVE_UNSET_CAN_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x00C5,
SMSG_MOVE_UNSET_HOVER = 0x01A5,
SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x039E,
SMSG_MOVE_UNSET_WALK_IN_AIR = 0xBADD,
- SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0xBADD,
- SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0xBADD,
- SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0xBADD,
- SMSG_MOVE_UPDATE_KNOCK_BACK = 0xBADD,
+ SMSG_MOVE_UPDATE = 0x0ACE,
+ SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x02B5,
+ SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x0ABD,
+ SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x00BE,
+ SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x1083,
+ SMSG_MOVE_UPDATE_KNOCK_BACK = 0x13CA,
SMSG_MOVE_UPDATE_PITCH_RATE = 0x13D9,
+ SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x0B99,
SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x09DE,
SMSG_MOVE_UPDATE_RUN_SPEED = 0x09AD,
- SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x1083,
+ SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x0992,
SMSG_MOVE_UPDATE_SWIM_SPEED = 0x0B95,
SMSG_MOVE_UPDATE_TELEPORT = 0x03D5,
SMSG_MOVE_UPDATE_TURN_RATE = 0x08BE,
SMSG_MOVE_UPDATE_WALK_SPEED = 0x01E5,
- SMSG_MOVE_WATER_WALK = 0x02A6,
SMSG_MULTIPLE_PACKETS = 0xBADD,
SMSG_NAME_QUERY_RESPONSE = 0x0828,
- SMSG_NEW_TAXI_PATH = 0xBADD,
+ SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x0D0D,
+ SMSG_NEW_TAXI_PATH = 0x080F,
SMSG_NEW_WORLD = 0x0206,
SMSG_NEW_WORLD_ABORT = 0xBADD,
SMSG_NOTIFICATION = 0x0B22,
SMSG_NOTIFY_DANCE = 0xBADD,
- SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0xBADD,
+ SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x01F1,
+ SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x0B84,
+ SMSG_NOTIFY_RECEIVED_MAIL = 0x1F0D,
SMSG_NPC_TEXT_UPDATE = 0x1122,
SMSG_NPC_WONT_TALK = 0xBADD,
- SMSG_OFFER_PETITION_ERROR = 0xBADD,
+ SMSG_OFFER_PETITION_ERROR = 0x0B41,
SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x053F,
+ SMSG_ON_MONSTER_MOVE = 0x0994,
SMSG_OPEN_CONTAINER = 0xBADD,
- SMSG_OPEN_LFG_DUNGEON_FINDER = 0xBADD,
- SMSG_OVERRIDE_LIGHT = 0xBADD,
+ SMSG_OPEN_LFG_DUNGEON_FINDER = 0x0F17,
+ SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x0709,
+ SMSG_OVERRIDE_LIGHT = 0x01EA,
+ SMSG_PAGE_TEXT = 0x158D,
SMSG_PAGE_TEXT_QUERY_RESPONSE = 0x05A0,
- SMSG_PARTY_COMMAND_RESULT = 0xBADD,
+ SMSG_PARTY_COMMAND_RESULT = 0x0B44,
+ SMSG_PARTY_INVITE = 0x0920,
SMSG_PARTY_KILL_LOG = 0x1312,
+ SMSG_PARTY_MEMBER_STATE = 0x0B8B,
SMSG_PARTY_MEMBER_STATS = 0x1729,
SMSG_PARTY_MEMBER_STATS_FULL = 0xBADD,
+ SMSG_PARTY_UPDATE = 0x15BE,
SMSG_PAUSE_MIRROR_TIMER = 0xBADD,
SMSG_PERIODICAURALOG = 0x0B1B,
SMSG_PETGODMODE = 0xBADD,
- SMSG_PETITION_ALREADY_SIGNED = 0xBADD,
- SMSG_PETITION_QUERY_RESPONSE = 0xBADD,
- SMSG_PETITION_SHOWLIST = 0xBADD,
- SMSG_PETITION_SHOW_SIGNATURES = 0xBADD,
- SMSG_PETITION_SIGN_RESULTS = 0xBADD,
+ SMSG_PETITION_ALREADY_SIGNED = 0x0D8E,
+ SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x1055,
+ SMSG_PETITION_SHOW_LIST = 0x0915,
+ SMSG_PETITION_SHOW_SIGNATURES = 0x0830,
+ SMSG_PETITION_SIGN_RESULTS = 0x11E9,
SMSG_PET_ACTION_FEEDBACK = 0xBADD,
- SMSG_PET_ACTION_SOUND = 0xBADD,
- SMSG_PET_ADDED = 0xBADD,
+ SMSG_PET_ACTION_SOUND = 0x0D39,
+ SMSG_PET_ADDED = 0x0327,
+ SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x0982,
+ SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x0B35,
+ SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x0F09,
+ SMSG_PET_BATTLE_FINAL_ROUND = 0x05BA,
+ SMSG_PET_BATTLE_FINISHED = 0x0D1F,
+ SMSG_PET_BATTLE_FIRST_ROUND = 0x1981,
+ SMSG_PET_BATTLE_INITIAL_UPDATE = 0x0D19,
+ SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x0F1A,
+ SMSG_PET_BATTLE_PVP_CHALLENGE = 0x11EC,
+ SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x0F19,
+ SMSG_PET_BATTLE_QUEUE_STATUS = 0x0905,
+ SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x1B83,
+ SMSG_PET_BATTLE_REQUEST_FAILED = 0x1353,
+ SMSG_PET_BATTLE_ROUND_RESULT = 0x0341,
+ SMSG_PET_BATTLE_SLOT_UPDATE = 0x1D8E,
SMSG_PET_BROKEN = 0xBADD,
- SMSG_PET_CAST_FAILED = 0xBADD,
- SMSG_PET_DISMISS_SOUND = 0xBADD,
- SMSG_PET_GUIDS = 0xBADD,
- SMSG_PET_LEARNED_SPELL = 0xBADD,
- SMSG_PET_MODE = 0xBADD,
+ SMSG_PET_CAST_FAILED = 0x1914,
+ SMSG_PET_CLEAR_SPELLS = 0x1113,
+ SMSG_PET_DISMISS_SOUND = 0x09A3,
+ SMSG_PET_GUIDS = 0x150F,
+ SMSG_PET_LEARNED_SPELL = 0x1822,
+ SMSG_PET_MODE = 0x1D40,
SMSG_PET_NAME_INVALID = 0xBADD,
SMSG_PET_NAME_QUERY_RESPONSE = 0x0D0E,
- SMSG_PET_REMOVED_SPELL = 0xBADD,
+ SMSG_PET_REMOVED_SPELL = 0x011B,
SMSG_PET_RENAMEABLE = 0xBADD,
- SMSG_PET_SLOT_UPDATED = 0xBADD,
+ SMSG_PET_SLOT_UPDATED = 0x0B26,
+ SMSG_PET_SPECIALIZATION = 0x1989,
SMSG_PET_SPELLS = 0x0174,
+ SMSG_PET_STABLE_LIST = 0x0B1F,
+ SMSG_PET_STABLE_RESULT = 0x1383,
SMSG_PET_TAME_FAILURE = 0xBADD,
SMSG_PET_UPDATE_COMBO_POINTS = 0xBADD,
SMSG_PLAYED_TIME = 0x038B,
SMSG_PLAYERBINDERROR = 0xBADD,
- SMSG_PLAYERBOUND = 0xBADD,
+ SMSG_PLAYER_BOUND = 0x078E,
SMSG_PLAYER_DIFFICULTY_CHANGE = 0xBADD,
- SMSG_PLAYER_MOVE = 0x0ACE,
- SMSG_PLAYER_SKINNED = 0xBADD,
+ SMSG_PLAYER_SKINNED = 0x00D2,
SMSG_PLAYER_VEHICLE_DATA = 0xBADD,
SMSG_PLAY_DANCE = 0xBADD,
- SMSG_PLAY_MUSIC = 0xBADD,
- SMSG_PLAY_OBJECT_SOUND = 0xBADD,
+ SMSG_PLAY_MUSIC = 0x0981,
+ SMSG_PLAY_OBJECT_SOUND = 0x0519,
SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x078D,
+ SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x0BF9,
+ SMSG_PLAY_SCENE = 0x0917,
SMSG_PLAY_SOUND = 0x02D2,
+ SMSG_PLAY_SPEAKERBOT_SOUND = 0x1C8A,
SMSG_PLAY_SPELL_VISUAL = 0x1A84,
SMSG_PLAY_SPELL_VISUAL_KIT = 0x0171,
- SMSG_PLAY_TIME_WARNING = 0xBADD,
+ SMSG_PLAY_TIME_WARNING = 0x082F,
SMSG_PONG = 0x17CA,
SMSG_POWER_UPDATE = 0x0B27,
- SMSG_PRE_RESURRECT = 0xBADD,
+ SMSG_PRE_RESSURECT = 0x0D2E,
SMSG_PROCRESIST = 0xBADD,
+ SMSG_PROC_RESIST = 0x1DAD,
SMSG_PROPOSE_LEVEL_GRANT = 0xBADD,
SMSG_PUREMOUNT_CANCELLED_OBSOLETE = 0xBADD,
- SMSG_PVP_CREDIT = 0xBADD,
+ SMSG_PVP_CREDIT = 0x13A9,
SMSG_PVP_LOG_DATA = 0x1ECA,
- SMSG_PVP_OPTIONS_ENABLED = 0xBADD,
+ SMSG_PVP_OPTIONS_ENABLED = 0x0320,
SMSG_PVP_SEASON = 0x09E3,
+ SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x09EC,
+ SMSG_QUERY_PETITION_RESPONSE = 0x13AC,
SMSG_QUERY_TIME_RESPONSE = 0x1DB0,
+ SMSG_QUESTGIVER_INVALID_QUEST = 0x15E1,
SMSG_QUESTGIVER_OFFER_REWARD = 0x17B2,
SMSG_QUESTGIVER_QUEST_COMPLETE = 0x1773,
SMSG_QUESTGIVER_QUEST_DETAILS = 0x15B3,
- SMSG_QUESTGIVER_QUEST_FAILED = 0xBADD,
+ SMSG_QUESTGIVER_QUEST_FAILED = 0x1D42,
SMSG_QUESTGIVER_QUEST_INVALID = 0xBADD,
SMSG_QUESTGIVER_QUEST_LIST = 0x17A5,
SMSG_QUESTGIVER_REQUEST_ITEMS = 0x17B8,
SMSG_QUESTGIVER_STATUS = 0x1567,
SMSG_QUESTGIVER_STATUS_MULTIPLE = 0x17C6,
- SMSG_QUESTLOG_FULL = 0xBADD,
- SMSG_QUESTUPDATE_ADD_ITEM = 0xBADD,
- SMSG_QUESTUPDATE_ADD_KILL = 0x1515,
- SMSG_QUESTUPDATE_ADD_PVP_KILL = 0xBADD,
- SMSG_QUESTUPDATE_COMPLETE = 0x1787,
- SMSG_QUESTUPDATE_FAILED = 0xBADD,
- SMSG_QUESTUPDATE_FAILEDTIMER = 0xBADD,
+ SMSG_QUEST_CONFIRM_ACCEPT = 0x15B2,
+ SMSG_QUEST_FORCE_REMOVED = 0x1D13,
+ SMSG_QUEST_LOG_FULL = 0x17E4,
SMSG_QUEST_NPC_QUERY_RESPONSE = 0x1591,
- SMSG_QUEST_CONFIRM_ACCEPT = 0xBADD,
- SMSG_QUEST_FORCE_REMOVE = 0xBADD,
SMSG_QUEST_POI_QUERY_RESPONSE = 0x1715,
+ SMSG_QUEST_PUSH_RESULT = 0x1797,
SMSG_QUEST_QUERY_RESPONSE = 0x1547,
- SMSG_RAID_GROUP_ONLY = 0xBADD,
+ SMSG_QUEST_UPDATE_ADD_CREDIT = 0x1515,
+ SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x1D11,
+ SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x15A6,
+ SMSG_QUEST_UPDATE_COMPLETE = 0x1787,
+ SMSG_QUEST_UPDATE_FAILED = 0x1542,
+ SMSG_QUEST_UPDATE_FAILED_TIMER = 0x1D01,
+ SMSG_RAID_GROUP_ONLY = 0x0D9D,
SMSG_RAID_INSTANCE_INFO = 0xBADD,
- SMSG_RAID_INSTANCE_MESSAGE = 0xBADD,
- SMSG_RAID_MARKERS_CHANGED = 0xBADD,
- SMSG_RAID_READY_CHECK = 0x17A9,
- SMSG_RAID_READY_CHECK_COMPLETED = 0x0BC3,
- SMSG_RAID_READY_CHECK_CONFIRM = 0x0A10,
- SMSG_RAID_READY_CHECK_THROTTLED_ERROR = 0xBADD,
+ SMSG_RAID_INSTANCE_MESSAGE = 0x0494,
+ SMSG_RAID_MARKERS_CHANGED = 0x0384,
SMSG_RAID_SUMMON_FAILED = 0xBADD,
- SMSG_RANDOM_ROLL = 0x1B04,
SMSG_RANDOMIZE_CHAR_NAME = 0x0D8F,
+ SMSG_RANDOM_ROLL = 0x1B04,
SMSG_RATED_BG_RATING = 0xBADD,
SMSG_RATED_BG_STATS = 0xBADD,
+ SMSG_READY_CHECK_COMPLETED = 0x0BC3,
+ SMSG_READY_CHECK_RESPONSE = 0x0A10,
+ SMSG_READY_CHECK_STARTED = 0x17A9,
SMSG_READ_ITEM_FAILED = 0xBADD,
- SMSG_READ_ITEM_OK = 0xBADD,
+ SMSG_READ_ITEM_RESULT_OK = 0x1BE1,
SMSG_REALM_QUERY_RESPONSE = 0x011D,
SMSG_REALM_SPLIT = 0xBADD,
SMSG_REAL_GROUP_UPDATE = 0xBADD,
SMSG_RECEIVED_MAIL = 0xBADD,
+ SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x0B3E,
SMSG_REDIRECT_CLIENT = 0x175A,
SMSG_REFER_A_FRIEND_EXPIRED = 0xBADD,
SMSG_REFER_A_FRIEND_FAILURE = 0xBADD,
SMSG_REFRESH_SPELL_HISTORY = 0x0A2A,
SMSG_REMOVED_SPELL = 0x0B3B,
- SMSG_REPORT_PVP_AFK_RESULT = 0xBADD,
+ SMSG_REPLACE_TROPHY_RESPONSE = 0x13C2,
+ SMSG_REPORT_PVP_AFK_RESULT = 0x0A0E,
SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x059E,
- SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0xBADD,
+ SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x1DAE,
SMSG_RESEARCH_COMPLETE = 0xBADD,
SMSG_RESEARCH_SETUP_HISTORY = 0x0A25,
SMSG_RESET_COMPRESSION_CONTEXT = 0xBADD,
- SMSG_RESET_FAILED_NOTIFY = 0xBADD,
+ SMSG_RESET_FAILED_NOTIFY = 0x1B01,
+ SMSG_RESET_RANGED_COMBAT_TIMER = 0x0106,
+ SMSG_RESET_WEEKLY_CURRENCY = 0x0916,
SMSG_RESISTLOG = 0xBADD,
- SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0xBADD,
+ SMSG_RESPEC_WIPE_CONFIRM = 0x1341,
+ SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x1BA2,
+ SMSG_RESTRICTED_ACCOUNT_WARNING = 0x0A2E,
SMSG_RESUME_CAST_BAR = 0x082C,
SMSG_RESUME_COMMS = 0x07C9,
SMSG_RESUME_TOKEN = 0x0326,
SMSG_RESURRECT_FAILED = 0xBADD,
- SMSG_RESURRECT_REQUEST = 0xBADD,
- SMSG_RESYNC_RUNES = 0xBADD,
+ SMSG_RESURRECT_REQUEST = 0x0336,
+ SMSG_RESYNC_RUNES = 0x00F4,
+ SMSG_ROLE_CHANGED_INFORM = 0x0729,
+ SMSG_ROLE_CHOSEN = 0x07D3,
SMSG_ROLE_POLL_BEGIN = 0xBADD,
+ SMSG_ROLE_POLL_INFORM = 0x0F89,
SMSG_RWHOIS = 0xBADD,
+ SMSG_SAVE_GUILD_EMBLEM = 0x1037,
+ SMSG_SCENARIO_BOOT = 0x1BEB,
+ SMSG_SCENARIO_COMPLETED = 0x1BA4,
+ SMSG_SCENARIO_POIS = 0x0343,
+ SMSG_SCENARIO_PROGRESS_UPDATE = 0x0324,
+ SMSG_SCENARIO_STATE = 0x152D,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x092E,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x1B44,
+ SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x000E,
+ SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x0540,
+ SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x098A,
+ SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x0130,
+ SMSG_SCRIPT_CAST = 0x1B1C,
SMSG_SELL_ITEM = 0xBADD,
SMSG_SELL_RESPONSE = 0x1352,
SMSG_SEND_MAIL_RESULT = 0x0302,
+ SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x000D,
+ SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x0D3E,
SMSG_SEND_SPELL_CHARGES = 0x1A82,
SMSG_SEND_SPELL_HISTORY = 0x1933,
SMSG_SEND_UNLEARN_SPELLS = 0x0BCB,
SMSG_SERVERTIME = 0xBADD,
- SMSG_SERVER_FIRST_ACHIEVEMENT = 0xBADD,
+ SMSG_SERVER_FIRST_ACHIEVEMENT = 0x1413,
+ SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x0BAC,
SMSG_SERVER_INFO_RESPONSE = 0xBADD,
SMSG_SERVER_MESSAGE = 0x0683,
SMSG_SERVER_PERF = 0xBADD,
+ SMSG_SETUP_CURRENCY = 0x0B06,
+ SMSG_SETUP_TROPHY = 0x0B63,
SMSG_SET_AI_ANIM_KIT = 0x0335,
SMSG_SET_ALL_TASK_PROGRESS = 0x1B52,
+ SMSG_SET_ANIM_TIER = 0x079E,
SMSG_SET_CURRENCY = 0x17BE,
- SMSG_SET_DF_FAST_LAUNCH_RESULT = 0xBADD,
+ SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x0F52,
SMSG_SET_DUNGEON_DIFFICULTY = 0x0719,
SMSG_SET_FACTION_ATWAR = 0xBADD,
- SMSG_SET_FACTION_NOT_VISIBLE = 0xBADD,
- SMSG_SET_FACTION_STANDING = 0xBADD,
+ SMSG_SET_FACTION_NOT_VISIBLE = 0x1224,
+ SMSG_SET_FACTION_STANDING = 0x1B03,
SMSG_SET_FACTION_VISIBLE = 0x138B,
SMSG_SET_FLAT_SPELL_MODIFIER = 0x1884,
SMSG_SET_FORCED_REACTIONS = 0x09A9,
+ SMSG_SET_ITEM_PURCHASE_DATA = 0x0316,
+ SMSG_SET_LFG_TIME_WALKER = 0x0731,
+ SMSG_SET_LOOT_METHOD_FAILED = 0x070E,
SMSG_SET_MAX_WEEKLY_QUANTITY = 0x1489,
SMSG_SET_MELEE_ANIM_KIT = 0xBADD,
SMSG_SET_MOVEMENT_ANIM_KIT = 0xBADD,
SMSG_SET_PCT_SPELL_MODIFIER = 0x113C,
- SMSG_SET_PHASE_SHIFT = 0x00D1,
+ SMSG_SET_PHASE_SHIFT_CHANGE = 0x00D1,
SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0xBADD,
SMSG_SET_PLAY_HOVER_ANIM = 0x02D4,
SMSG_SET_PROFICIENCY = 0x00D3,
SMSG_SET_PROJECTILE_POSITION = 0xBADD,
SMSG_SET_QUEST_COMPLETED_BIT = 0x15D3,
SMSG_SET_RAID_DIFFICULTY = 0x051F,
+ SMSG_SET_SPELL_CHARGES = 0x18AB,
+ SMSG_SET_TASK_COMPLETE = 0x0B24,
SMSG_SET_TIME_ZONE_INFORMATION = 0x153E,
+ SMSG_SET_VEHICLE_REC_ID = 0x1BA1,
SMSG_SET_VIGNETTE = 0x09AC,
- SMSG_SETUP_CURRENCY = 0x0B06,
- SMSG_SHOWTAXINODES = 0x12A1,
- SMSG_SHOW_BANK = 0x0204,
+ SMSG_SHOW_BANK = 0x1B51,
SMSG_SHOW_MAILBOX = 0xBADD,
+ SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x053D,
SMSG_SHOW_RATINGS = 0xBADD,
+ SMSG_SHOW_TAXI_NODES = 0x12A1,
+ SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x15C0,
SMSG_SOCKET_GEMS_RESULT = 0xBADD,
+ SMSG_SORT_BAGS_ACK = 0x09E4,
SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0xBADD,
+ SMSG_SPECIAL_MOUNT_ANIM = 0x159F,
SMSG_SPELLBREAKLOG = 0xBADD,
- SMSG_SPELLDAMAGESHIELD = 0x0B4C,
- SMSG_SPELLDISPELLOG = 0x18A2,
- SMSG_SPELLENERGIZELOG = 0x137C,
- SMSG_SPELLHEALLOG = 0x0114,
- SMSG_SPELLINSTAKILLLOG = 0xBADD,
- SMSG_SPELLINTERRUPTLOG = 0xBADD,
- SMSG_SPELLLOGEXECUTE = 0x1823,
- SMSG_SPELLLOGMISS = 0xBADD,
- SMSG_SPELLNONMELEEDAMAGELOG = 0x11FB,
- SMSG_SPELLORDAMAGE_IMMUNE = 0xBADD,
SMSG_SPELLSTEALLOG = 0xBADD,
+ SMSG_SPELL_ABSORB_LOG = 0x188A,
SMSG_SPELL_CATEGORY_COOLDOWN = 0x082A,
- SMSG_SPELL_COOLDOWN = 0xBADD,
- SMSG_SPELL_DELAYED = 0xBADD,
+ SMSG_SPELL_COOLDOWN = 0x03F4,
+ SMSG_SPELL_DAMAGE_SHIELD = 0x0B4C,
+ SMSG_SPELL_DELAYED = 0x0134,
+ SMSG_SPELL_DISPEL_LOG = 0x18A2,
+ SMSG_SPELL_ENERGIZE_LOG = 0x137C,
+ SMSG_SPELL_EXECUTE_LOG = 0x1823,
SMSG_SPELL_FAILED_OTHER = 0x1A03,
SMSG_SPELL_FAILURE = 0x11DB,
SMSG_SPELL_GO = 0x1161,
+ SMSG_SPELL_HEAL_LOG = 0x0114,
+ SMSG_SPELL_INSTAKILL_LOG = 0x1164,
+ SMSG_SPELL_INTERRUPT_LOG = 0x1BDC,
+ SMSG_SPELL_MISS_LOG = 0x0313,
SMSG_SPELL_MULTISTRIKE_EFFECT = 0x131C,
+ SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x11FB,
+ SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x1313,
SMSG_SPELL_START = 0x0803,
SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x0374,
- SMSG_SPIRIT_HEALER_CONFIRM = 0xBADD,
- SMSG_SPLINE_MOVE_COLLISION_DISABLE = 0xBADD,
- SMSG_SPLINE_MOVE_COLLISION_ENABLE = 0xBADD,
- SMSG_SPLINE_MOVE_GRAVITY_DISABLE = 0x03B2,
- SMSG_SPLINE_MOVE_GRAVITY_ENABLE = 0xBADD,
- SMSG_SPLINE_MOVE_ROOT = 0xBADD,
- SMSG_SPLINE_MOVE_SET_ANIM = 0xBADD,
- SMSG_SPLINE_MOVE_SET_FEATHER_FALL = 0xBADD,
- SMSG_SPLINE_MOVE_SET_FLIGHT_BACK_SPEED = 0xBADD,
- SMSG_SPLINE_MOVE_SET_FLIGHT_SPEED = 0x060C,
- SMSG_SPLINE_MOVE_SET_FLYING = 0xBADD,
- SMSG_SPLINE_MOVE_SET_HOVER = 0xBADD,
- SMSG_SPLINE_MOVE_SET_LAND_WALK = 0xBADD,
- SMSG_SPLINE_MOVE_SET_NORMAL_FALL = 0xBADD,
- SMSG_SPLINE_MOVE_SET_PITCH_RATE = 0xBADD,
- SMSG_SPLINE_MOVE_SET_RUN_BACK_SPEED = 0x0086,
- SMSG_SPLINE_MOVE_SET_RUN_MODE = 0xBADD,
- SMSG_SPLINE_MOVE_SET_RUN_SPEED = 0x1B9A,
- SMSG_SPLINE_MOVE_SET_SWIM_BACK_SPEED = 0xBADD,
- SMSG_SPLINE_MOVE_SET_SWIM_SPEED = 0x098D,
- SMSG_SPLINE_MOVE_SET_TURN_RATE = 0xBADD,
- SMSG_SPLINE_MOVE_SET_WALK_MODE = 0xBADD,
- SMSG_SPLINE_MOVE_SET_WALK_SPEED = 0x01D5,
- SMSG_SPLINE_MOVE_SET_WATER_WALK = 0xBADD,
- SMSG_SPLINE_MOVE_START_SWIM = 0xBADD,
- SMSG_SPLINE_MOVE_STOP_SWIM = 0xBADD,
- SMSG_SPLINE_MOVE_UNROOT = 0xBADD,
- SMSG_SPLINE_MOVE_UNSET_FLYING = 0xBADD,
- SMSG_SPLINE_MOVE_UNSET_HOVER = 0x1959,
- SMSG_SPLINE_MOVE_WATER_WALK = 0xBADD,
- SMSG_STABLE_RESULT = 0xBADD,
+ SMSG_SPIRIT_HEALER_CONFIRM = 0x1331,
SMSG_STANDSTATE_UPDATE = 0x1311,
+ SMSG_START_ELAPSED_TIMER = 0x0D2A,
SMSG_START_ELAPSED_TIMERS = 0x093F,
+ SMSG_START_LOOT_ROLL = 0x1B84,
SMSG_START_MIRROR_TIMER = 0x051E,
- SMSG_START_TIMER = 0xBADD,
+ SMSG_START_TIMER = 0x0317,
SMSG_STOP_DANCE = 0xBADD,
- SMSG_STOP_MIRROR_TIMER = 0xBADD,
- SMSG_STREAMING_MOVIE = 0xBADD,
+ SMSG_STOP_ELAPSED_TIMER = 0x1D10,
+ SMSG_STOP_MIRROR_TIMER = 0x0D1E,
+ SMSG_STREAMING_MOVIE = 0x158F,
SMSG_SUMMON_CANCEL = 0xBADD,
+ SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x1B24,
SMSG_SUMMON_REQUEST = 0xBADD,
- SMSG_SUPERCEDED_SPELL = 0xBADD,
- SMSG_SUPPRESS_NPC_GREETINGS = 0xBADD,
+ SMSG_SUPERCEDED_SPELL = 0x0172,
+ SMSG_SUPPRESS_NPC_GREETINGS = 0x193A,
SMSG_SUSPEND_COMMS = 0x076A,
SMSG_SUSPEND_TOKEN = 0x12A2,
+ SMSG_TABARD_VENDOR_ACTIVATE = 0x1389,
SMSG_TALENTS_ERROR = 0xBADD,
SMSG_TALENTS_INFO = 0x012D,
SMSG_TALENTS_INVOLUNTARILY_RESET = 0xBADD,
@@ -1404,33 +1739,38 @@ enum OpcodeServer : uint32
SMSG_THREAT_CLEAR = 0x030F,
SMSG_THREAT_REMOVE = 0x0F3D,
SMSG_THREAT_UPDATE = 0x03A9,
- SMSG_TIME_ADJUSTMENT = 0xBADD,
+ SMSG_TIME_ADJUSTMENT = 0x04CB,
SMSG_TIME_SYNC_REQ = 0x03B1,
- SMSG_TITLE_EARNED = 0xBADD,
- SMSG_TOGGLE_XP_GAIN = 0xBADD,
- SMSG_TOTEM_CREATED = 0xBADD,
- SMSG_TRADE_STATUS = 0xBADD,
+ SMSG_TITLE_EARNED = 0x1324,
+ SMSG_TITLE_LOST = 0x1D0E,
+ SMSG_TOTEM_CREATED = 0x0352,
+ SMSG_TOTEM_MOVED = 0x12AB,
+ SMSG_TRADE_STATUS = 0x093D,
SMSG_TRADE_STATUS_EXTENDED = 0xBADD,
- SMSG_TRAINER_BUY_FAILED = 0xBADD,
+ SMSG_TRADE_UPDATED = 0x0B43,
+ SMSG_TRAINER_BUY_FAILED = 0x1BD2,
SMSG_TRAINER_BUY_SUCCEEDED = 0xBADD,
SMSG_TRAINER_LIST = 0x0BA9,
SMSG_TRANSFER_ABORTED = 0x03C2,
SMSG_TRANSFER_PENDING = 0x172A,
SMSG_TRIGGER_CINEMATIC = 0x032F,
SMSG_TRIGGER_MOVIE = 0x151F,
- SMSG_TURN_IN_PETITION_RESULTS = 0xBADD,
+ SMSG_TURN_IN_PETITION_RESULTS = 0x0919,
SMSG_TUTORIAL_FLAGS = 0x020F,
+ SMSG_UI_TIME = 0x0B83,
SMSG_UNDELETE_CHARACTER_RESPONSE = 0x0344,
SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x0310,
SMSG_UNIT_HEALTH_FREQUENT = 0xBADD,
SMSG_UNIT_SPELLCAST_START = 0xBADD,
+ SMSG_UNLEARNED_SPELLS = 0x0B3B,
SMSG_UPDATE_ACCOUNT_DATA = 0x1520,
+ SMSG_UPDATE_CAPTURE_POINT = 0x1B11,
SMSG_UPDATE_COMBO_POINTS = 0xBADD,
SMSG_UPDATE_CURRENCY_WEEK_LIMIT = 0xBADD,
- SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0xBADD,
+ SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x0774,
SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT = 0xBADD,
SMSG_UPDATE_INSTANCE_OWNERSHIP = 0xBADD,
- SMSG_UPDATE_LAST_INSTANCE = 0xBADD,
+ SMSG_UPDATE_LAST_INSTANCE = 0x13A4,
SMSG_UPDATE_OBJECT = 0x122C,
SMSG_UPDATE_SERVER_PLAYER_POSITION = 0xBADD,
SMSG_UPDATE_TASK_PROGRESS = 0x1209,
@@ -1446,7 +1786,7 @@ enum OpcodeServer : uint32
SMSG_VOICE_SET_TALKER_MUTED = 0xBADD,
SMSG_VOID_ITEM_SWAP_RESPONSE = 0x1131,
SMSG_VOID_STORAGE_CONTENTS = 0x0108,
- SMSG_VOID_STORAGE_FAILED = 0xBADD,
+ SMSG_VOID_STORAGE_FAILED = 0x0B01,
SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x0321,
SMSG_VOID_TRANSFER_RESULT = 0x0539,
SMSG_WAIT_QUEUE_FINISH = 0x198A,
@@ -1460,10 +1800,9 @@ enum OpcodeServer : uint32
SMSG_WEEKLY_SPELL_USAGE = 0x13DC,
SMSG_WEEKLY_SPELL_USAGE_UPDATE = 0x1829,
SMSG_WHO = 0x0601,
- SMSG_WHOIS = 0xBADD,
+ SMSG_WHOIS = 0x1D30,
SMSG_WORLD_SERVER_INFO = 0x11AC,
- SMSG_WORLD_STATE_UI_TIMER_UPDATE = 0x0B83,
- SMSG_XP_GAIN_ABORTED = 0xBADD,
+ SMSG_XP_GAIN_ABORTED = 0x031E,
SMSG_XP_GAIN_ENABLED = 0x0FAA,
SMSG_ZONE_UNDER_ATTACK = 0x1401
};
@@ -1473,39 +1812,37 @@ inline bool IsInstanceOnlyOpcode(uint32 opcode)
// TODO: Use names when known
switch (opcode)
{
- case 0x000F: // Client
+ case SMSG_MOUNT_RESULT: // Client
case 0x0111: // Client
case 0x03E4: // Client
case 0x0549: // Client
- case 0x054C: // Client
case 0x055A: // Client
- case 0x056C: // Client
+ case 0x055C: // Client
case 0x057A: // Client
- case 0x057B: // Client
- case 0x05CC: // Client
- case 0x05EA: // Client
- case 0x05EC: // Client
+ case 0x057C: // Client
+ case 0x05C9: // Client
+ case 0x05CA: // Client
+ case 0x05D9: // Client
+ case 0x05DA: // Client
+ case 0x05DC: // Client
+ case 0x05E9: // Client
case 0x05F9: // Client
- case 0x05FB: // Client
+ case 0x05FC: // Client
+ case 0x074B: // Client
case 0x074C: // Client
case 0x075B: // Client
+ case 0x075C: // Client
case 0x076C: // Client
- case 0x077B: // Client
- case 0x077C: // Client
+ case 0x07CB: // Client
case 0x07CC: // Client
case 0x07DB: // Client
+ case 0x07DC: // Client
case 0x07EC: // Client
- case 0x07FB: // Client
- case 0x07FC: // Client
- case 0x0827: // Client
- case 0x0935: // Client
- case 0x0F0C: // ClientSpell
+ case SMSG_DUEL_REQUESTED: // Client
+ case SMSG_DUEL_WINNER: // Client
+ case 0x0F0F: // ClientSpell
case 0x0F10: // ClientSpell
- case 0x0F1B: // ClientSpell
- case 0x0F1C: // ClientSpell
- case 0x0F20: // ClientSpell
- case 0x0F2C: // ClientSpell
- case 0x0F2F: // ClientSpell
+ case 0x0F30: // ClientSpell
case 0x0F3B: // ClientSpell
case 0x0F8B: // ClientSpell
case 0x0F8C: // ClientSpell
@@ -1513,35 +1850,43 @@ inline bool IsInstanceOnlyOpcode(uint32 opcode)
case 0x0F9F: // ClientSpell
case 0x0FA0: // ClientSpell
case SMSG_ATTACKSTOP: // Client
- case 0x14C9: // Client
- case 0x154A: // Client
+ case SMSG_DUEL_COMPLETE: // Client
+ case 0x154B: // Client
+ case 0x154C: // Client
case 0x155A: // Client
+ case 0x155B: // Client
case 0x155C: // Client
case SMSG_QUESTGIVER_STATUS: // ClientQuest
- case 0x156A: // Client
case 0x156B: // Client
- case 0x157A: // Client
+ case 0x1579: // Client
case 0x157B: // Client
+ case 0x15CB: // Client
+ case 0x15CC: // Client
+ case 0x15DB: // Client
case 0x15DC: // Client
case 0x15EB: // Client
case 0x15FB: // Client
- case 0x170C: // ClientSpell
- case 0x171C: // ClientSpell
- case 0x171F: // ClientSpell
+ case 0x1710: // ClientSpell
+ case 0x1720: // ClientSpell
+ case 0x172B: // ClientSpell
case 0x172C: // ClientSpell
case 0x172F: // ClientSpell
+ case 0x1730: // ClientSpell
case 0x173C: // ClientSpell
- case 0x173F: // ClientSpell
- case 0x1740: // ClientSpell
+ case 0x178B: // ClientSpell
+ case 0x178C: // ClientSpell
+ case 0x178F: // ClientSpell
case 0x1790: // ClientSpell
case 0x179B: // ClientSpell
case 0x179F: // ClientSpell
case SMSG_ATTACKSTART: // Client
case 0x1D82: // ClientQuest
case 0x1D83: // ClientQuest
- case 0x1D85: // ClientQuest
- case 0x1D87: // ClientQuest
- case 0x1D93: // ClientQuest
+ case 0x1D84: // ClientQuest
+ case 0x1D86: // ClientQuest
+ case 0x1D91: // ClientQuest
+ case 0x1D92: // ClientQuest
+ case 0x1D94: // ClientQuest
case 0x1D96: // ClientQuest
case 0x1D97: // ClientQuest
case 0x1DA1: // ClientQuest
@@ -1551,39 +1896,47 @@ inline bool IsInstanceOnlyOpcode(uint32 opcode)
case 0x1DA5: // ClientQuest
case 0x1DA7: // ClientQuest
case SMSG_QUERY_TIME_RESPONSE: // Client
- case 0x1DC2: // ClientQuest
- case 0x1DC6: // ClientQuest
- case 0x1DC7: // ClientQuest
+ case 0x1DC4: // ClientQuest
+ case 0x1DC8: // ClientQuest
+ case 0x1DD1: // ClientQuest
case 0x1DD2: // ClientQuest
case 0x1DD3: // ClientQuest
+ case 0x1DD4: // ClientQuest
case 0x1DD6: // ClientQuest
- case 0x1DD7: // ClientQuest
- case 0x1DD8: // ClientQuest
+ case 0x1DE1: // ClientQuest
+ case 0x1DE2: // ClientQuest
+ case 0x1DE3: // ClientQuest
case 0x1DE4: // ClientQuest
case 0x1DE5: // ClientQuest
case 0x1DE7: // ClientQuest
- case 0x1F02: // ClientQuest
- case 0x1F06: // ClientQuest
- case 0x1F07: // ClientQuest
- case 0x1F0C: // ClientSpell
+ case 0x1F04: // ClientQuest
+ case 0x1F08: // ClientQuest
+ case 0x1F10: // ClientSpell
+ case 0x1F11: // ClientQuest
case 0x1F12: // ClientQuest
case 0x1F13: // ClientQuest
+ case 0x1F14: // ClientQuest
case 0x1F16: // ClientQuest
- case 0x1F17: // ClientQuest
- case 0x1F18: // ClientQuest
- case 0x1F1C: // ClientSpell
- case 0x1F1F: // ClientSpell
+ case 0x1F20: // ClientSpell
+ case 0x1F21: // ClientQuest
+ case 0x1F22: // ClientQuest
+ case 0x1F23: // ClientQuest
case 0x1F24: // ClientQuest
case 0x1F25: // ClientQuest
case 0x1F27: // ClientQuest
+ case 0x1F2B: // ClientSpell
case 0x1F2C: // ClientSpell
case 0x1F2F: // ClientSpell
+ case 0x1F30: // ClientSpell
case 0x1F3C: // ClientSpell
- case 0x1F3F: // ClientSpell
- case 0x1F40: // ClientSpell
+ case 0x1F41: // ClientQuest
+ case 0x1F42: // ClientQuest
case 0x1F44: // ClientQuest
+ case 0x1F46: // ClientQuest
+ case 0x1F47: // ClientQuest
case 0x1F48: // ClientQuest
- case 0x1F51: // ClientQuest
+ case 0x1F52: // ClientQuest
+ case 0x1F53: // ClientQuest
case 0x1F55: // ClientQuest
case 0x1F57: // ClientQuest
case 0x1F61: // ClientQuest
@@ -1591,12 +1944,14 @@ inline bool IsInstanceOnlyOpcode(uint32 opcode)
case 0x1F64: // ClientQuest
case 0x1F65: // ClientQuest
case 0x1F67: // ClientQuest
- case 0x1F85: // ClientQuest
- case 0x1F86: // ClientQuest
+ case 0x1F84: // ClientQuest
case 0x1F87: // ClientQuest
+ case 0x1F8B: // ClientSpell
+ case 0x1F8C: // ClientSpell
+ case 0x1F8F: // ClientSpell
case 0x1F90: // ClientSpell
- case 0x1F92: // ClientQuest
- case 0x1F94: // ClientQuest
+ case 0x1F91: // ClientQuest
+ case 0x1F95: // ClientQuest
case 0x1F96: // ClientQuest
case 0x1F97: // ClientQuest
case 0x1F9B: // ClientSpell
@@ -1607,14 +1962,16 @@ inline bool IsInstanceOnlyOpcode(uint32 opcode)
case 0x1FA4: // ClientQuest
case 0x1FA5: // ClientQuest
case 0x1FA7: // ClientQuest
- case 0x1FC2: // ClientQuest
- case 0x1FC6: // ClientQuest
- case 0x1FC7: // ClientQuest
+ case 0x1FC4: // ClientQuest
+ case 0x1FC8: // ClientQuest
+ case 0x1FD1: // ClientQuest
case 0x1FD2: // ClientQuest
case 0x1FD3: // ClientQuest
+ case 0x1FD4: // ClientQuest
case 0x1FD6: // ClientQuest
- case 0x1FD7: // ClientQuest
- case 0x1FD8: // ClientQuest
+ case 0x1FE1: // ClientQuest
+ case 0x1FE2: // ClientQuest
+ case 0x1FE3: // ClientQuest
case 0x1FE4: // ClientQuest
case 0x1FE5: // ClientQuest
case 0x1FE7: // ClientQuest
diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp
index 4e96d829554..17ca3e3c58c 100644
--- a/src/server/game/Server/WorldSession.cpp
+++ b/src/server/game/Server/WorldSession.cpp
@@ -640,7 +640,7 @@ void WorldSession::KickPlayer()
}
}
-void WorldSession::SendNotification(const char *format, ...)
+void WorldSession::SendNotification(char const* format, ...)
{
if (format)
{
@@ -660,15 +660,15 @@ void WorldSession::SendNotification(const char *format, ...)
}
}
-void WorldSession::SendNotification(uint32 string_id, ...)
+void WorldSession::SendNotification(uint32 stringId, ...)
{
- char const* format = GetTrinityString(string_id);
+ char const* format = GetTrinityString(stringId);
if (format)
{
va_list ap;
char szStr[1024];
szStr[0] = '\0';
- va_start(ap, string_id);
+ va_start(ap, stringId);
vsnprintf(szStr, 1024, format, ap);
va_end(ap);
@@ -704,12 +704,6 @@ void WorldSession::Handle_ServerSide(WorldPacket& recvPacket)
, GetOpcodeNameForLogging(static_cast<OpcodeClient>(recvPacket.GetOpcode())).c_str(), GetPlayerInfo().c_str());
}
-void WorldSession::Handle_Deprecated(WorldPacket& recvPacket)
-{
- TC_LOG_ERROR("network.opcode", "Received deprecated opcode %s from %s"
- , GetOpcodeNameForLogging(static_cast<OpcodeClient>(recvPacket.GetOpcode())).c_str(), GetPlayerInfo().c_str());
-}
-
void WorldSession::LoadGlobalAccountData()
{
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_DATA);
@@ -1230,8 +1224,8 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co
case CMSG_QUESTGIVER_STATUS_QUERY: // 0 1.5
case CMSG_GUILD_QUERY: // 0 1.5
//case CMSG_ARENA_TEAM_QUERY: // 0 1.5
- case CMSG_TAXINODE_STATUS_QUERY: // 0 1.5
- //case CMSG_TAXIQUERYAVAILABLENODES: // 0 1.5
+ case CMSG_TAXI_NODE_STATUS_QUERY: // 0 1.5
+ //case CMSG_TAXI_QUERY_AVAILABLE_NODES: // 0 1.5
case CMSG_QUESTGIVER_QUERY_QUEST: // 0 1.5
case CMSG_PAGE_TEXT_QUERY: // 0 1.5
//case CMSG_GUILD_BANK_QUERY_TEXT: // 0 1.5
@@ -1244,12 +1238,12 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co
case CMSG_HEARTH_AND_RESURRECT: // 0 1.5
case CMSG_TOGGLE_PVP: // 0 1.5
case CMSG_PET_ABANDON: // 0 1.5
- case CMSG_ACTIVATETAXIEXPRESS: // 0 1.5
- case CMSG_ACTIVATETAXI: // 0 1.5
+ case CMSG_ACTIVATE_TAXI_EXPRESS: // 0 1.5
+ case CMSG_ACTIVATE_TAXI: // 0 1.5
case CMSG_SELF_RES: // 0 1.5
case CMSG_UNLEARN_SKILL: // 0 1.5
case CMSG_EQUIPMENT_SET_SAVE: // 0 1.5
- case CMSG_EQUIPMENT_SET_DELETE: // 0 1.5
+ case CMSG_DELETE_EQUIPMENT_SET: // 0 1.5
//case CMSG_DISMISS_CRITTER: // 0 1.5
case CMSG_REPOP_REQUEST: // 0 1.5
//case CMSG_GROUP_INVITE: // 0 1.5
@@ -1287,7 +1281,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co
//case CMSG_AREA_SPIRIT_HEALER_QUERY: // not profiled
case CMSG_STANDSTATECHANGE: // not profiled
case CMSG_RANDOM_ROLL: // not profiled
- case CMSG_TIME_SYNC_RESP: // not profiled
+ case CMSG_TIME_SYNC_RESPONSE: // not profiled
case CMSG_TRAINER_BUY_SPELL: // not profiled
{
// "0" is a magic number meaning there's no limit for the opcode.
@@ -1312,7 +1306,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co
//case CMSG_GUILD_SET_NOTE: // 1 2 1 async db query
//case CMSG_SET_CONTACT_NOTES: // 1 2.5 1 async db query
- //case CMSG_CALENDAR_GET_CALENDAR: // 0 1.5 medium upload bandwidth usage
+ //case CMSG_CALENDAR_GET: // 0 1.5 medium upload bandwidth usage
case CMSG_GUILD_BANK_QUERY_TAB: // 0 3.5 medium upload bandwidth usage
//case CMSG_QUERY_INSPECT_ACHIEVEMENTS: // 0 13 high upload bandwidth usage
case CMSG_GAMEOBJ_REPORT_USE: // not profiled
@@ -1391,7 +1385,7 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co
//case CMSG_ARENA_TEAM_REMOVE: // not profiled
//case CMSG_ARENA_TEAM_LEADER: // not profiled
case CMSG_LOOT_METHOD: // not profiled
- case CMSG_GUILD_INVITE: // not profiled
+ case CMSG_GUILD_INVITE_BY_NAME: // not profiled
//case CMSG_GUILD_ACCEPT: // not profiled
case CMSG_GUILD_DECLINE: // not profiled
case CMSG_GUILD_LEAVE: // not profiled
@@ -1400,20 +1394,20 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co
//case CMSG_GUILD_MOTD: // not profiled
case CMSG_GUILD_SET_RANK_PERMISSIONS: // not profiled
case CMSG_GUILD_ADD_RANK: // not profiled
- case CMSG_GUILD_DEL_RANK: // not profiled
- case CMSG_GUILD_INFO_TEXT: // not profiled
+ case CMSG_GUILD_DELETE_RANK: // not profiled
+ case CMSG_GUILD_UPDATE_INFO_TEXT: // not profiled
case CMSG_GUILD_BANK_DEPOSIT_MONEY: // not profiled
//case CMSG_GUILD_BANK_WITHDRAW_MONEY: // not profiled
case CMSG_GUILD_BANK_BUY_TAB: // not profiled
//case CMSG_GUILD_BANK_UPDATE_TAB: // not profiled
//case CMSG_SET_GUILD_BANK_TEXT: // not profiled
- //case MSG_SAVE_GUILD_EMBLEM: // not profiled
+ //case CMSG_SAVE_GUILD_EMBLEM: // not profiled
//case MSG_PETITION_RENAME: // not profiled
//case MSG_TALENT_WIPE_CONFIRM: // not profiled
case CMSG_SET_DUNGEON_DIFFICULTY: // not profiled
case CMSG_SET_RAID_DIFFICULTY: // not profiled
//case MSG_PARTY_ASSIGNMENT: // not profiled
- //case MSG_RAID_READY_CHECK: // not profiled
+ //case CMSG_DO_READY_CHECK: // not profiled
{
maxPacketCounterAllowed = 3;
break;
diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h
index baf5232cd9b..0707ffbb6fc 100644
--- a/src/server/game/Server/WorldSession.h
+++ b/src/server/game/Server/WorldSession.h
@@ -75,6 +75,21 @@ class RBACData;
namespace WorldPackets
{
+ namespace Achievement
+ {
+ class GuildSetFocusedAchievement;
+ }
+
+ namespace AuctionHouse
+ {
+ class AuctionHelloRequest;
+ }
+
+ namespace BlackMarket
+ {
+ class BlackMarketOpen;
+ }
+
namespace Character
{
struct CharacterCreateInfo;
@@ -90,6 +105,7 @@ namespace WorldPackets
class CharCustomize;
class CharRaceOrFactionChange;
class GenerateRandomCharacterName;
+ class GetUndeleteCooldownStatus;
class ReorderCharacters;
class UndeleteCharacter;
class PlayerLogin;
@@ -153,20 +169,24 @@ namespace WorldPackets
namespace Item
{
+ class AutoEquipItem;
+ class AutoStoreBagItem;
class BuyBackItem;
+ class DestroyItem;
class ItemRefundInfo;
class RepairItem;
class SellItem;
class SplitItem;
class SwapInvItem;
class SwapItem;
- class AutoEquipItem;
- class DestroyItem;
}
namespace Loot
{
class LootUnit;
+ class AutoStoreLootItem;
+ class LootRelease;
+ class LootMoney;
}
namespace Misc
@@ -178,6 +198,12 @@ namespace WorldPackets
class TutorialSetFlag;
class SetDungeonDifficulty;
class SetRaidDifficulty;
+ class PortGraveyard;
+ class ReclaimCorpse;
+ class RepopRequest;
+ class RequestCemeteryList;
+ class ResurrectResponse;
+ class UITimeRequest;
}
namespace Movement
@@ -200,6 +226,9 @@ namespace WorldPackets
class QueryNPCText;
class DBQueryBulk;
class QueryGameObject;
+ class QueryCorpseLocationFromClient;
+ class QueryCorpseTransport;
+ class QueryTime;
}
namespace Quest
@@ -216,6 +245,7 @@ namespace WorldPackets
namespace Spells
{
+ class CancelAura;
class SpellCastRequest;
class SetActionButton;
}
@@ -223,7 +253,7 @@ namespace WorldPackets
namespace Talent
{
class SetSpecialization;
- class LearnTalent;
+ class LearnTalents;
}
namespace Trade
@@ -409,8 +439,8 @@ class WorldSession
void SendPacket(WorldPacket const* packet, bool forced = false);
void AddInstanceConnection(std::shared_ptr<WorldSocket> sock) { m_Socket[1] = sock; }
- void SendNotification(const char *format, ...) ATTR_PRINTF(2, 3);
- void SendNotification(uint32 string_id, ...);
+ void SendNotification(char const* format, ...) ATTR_PRINTF(2, 3);
+ void SendNotification(uint32 stringId, ...);
void SendPetNameInvalid(uint32 error, std::string const& name, DeclinedName *declinedName);
void SendPartyResult(PartyOperation operation, std::string const& member, PartyResult res, uint32 val = 0);
void SendAreaTriggerMessage(const char* Text, ...) ATTR_PRINTF(2, 3);
@@ -500,7 +530,7 @@ class WorldSession
void SendPetNameQuery(ObjectGuid guid, uint32 petnumber);
void SendStablePet(ObjectGuid guid);
void SendStablePetCallback(PreparedQueryResult result, ObjectGuid guid);
- void SendStableResult(uint8 guid);
+ void SendPetStableResult(uint8 guid);
bool CheckStableMaster(ObjectGuid guid);
// Account Data
@@ -542,6 +572,9 @@ class WorldSession
void SendAuctionOwnerNotification(AuctionEntry* auction);
void SendAuctionRemovedNotification(uint32 auctionId, uint32 itemEntry, int32 randomPropertyId);
+ // Black Market
+ void SendBlackMarketOpenResult(ObjectGuid guid, Creature* auctioneer);
+
//Item Enchantment
void SendEnchantmentLog(ObjectGuid target, ObjectGuid caster, uint32 itemId, uint32 enchantId);
void SendItemEnchantTimeUpdate(ObjectGuid Playerguid, ObjectGuid Itemguid, uint32 slot, uint32 Duration);
@@ -600,12 +633,11 @@ class WorldSession
void Handle_NULL(WorldPacket& recvPacket); // not used
void Handle_EarlyProccess(WorldPacket& recvPacket); // just mark packets processed in WorldSocket::OnRead
void Handle_ServerSide(WorldPacket& recvPacket); // sever side only, can't be accepted from client
- void Handle_Deprecated(WorldPacket& recvPacket); // never used anymore by client
void HandleCharEnum(PreparedQueryResult result);
void HandleCharEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/);
void HandleCharUndeleteEnum(PreparedQueryResult result);
- void HandleCharUndeleteEnumOpcode(WorldPacket& /*recvData*/);
+ void HandleCharUndeleteEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/);
void HandleCharDeleteOpcode(WorldPackets::Character::DeleteChar& charDelete);
void HandleCharCreateOpcode(WorldPackets::Character::CreateChar& charCreate);
void HandleCharCreateCallback(PreparedQueryResult result, WorldPackets::Character::CharacterCreateInfo* createInfo);
@@ -624,7 +656,7 @@ class WorldSession
void HandleRandomizeCharNameOpcode(WorldPackets::Character::GenerateRandomCharacterName& packet);
void HandleReorderCharacters(WorldPackets::Character::ReorderCharacters& reorderChars);
void HandleOpeningCinematic(WorldPacket& recvData);
- void HandleUndeleteCooldownStatusQuery(WorldPacket& /*recvData*/);
+ void HandleGetUndeleteCooldownStatus(WorldPackets::Character::GetUndeleteCooldownStatus& /*getCooldown*/);
void HandleUndeleteCooldownStatusCallback(PreparedQueryResult result);
void HandleCharUndeleteOpcode(WorldPackets::Character::UndeleteCharacter& undeleteInfo);
void HandleCharUndeleteCallback(PreparedQueryResult result, WorldPackets::Character::CharacterUndeleteInfo* undeleteInfo);
@@ -648,8 +680,8 @@ class WorldSession
void HandleLookingForGroup(WorldPacket& recvPacket);
// cemetery/graveyard related
- void HandleReturnToGraveyard(WorldPacket& recvPacket);
- void HandleRequestCemeteryList(WorldPacket& recvPacket);
+ void HandlePortGraveyard(WorldPackets::Misc::PortGraveyard& packet);
+ void HandleRequestCemeteryList(WorldPackets::Misc::RequestCemeteryList& packet);
// new inspect
void HandleInspectOpcode(WorldPacket& recvPacket);
@@ -679,11 +711,11 @@ class WorldSession
void HandleSetCollisionHeightAck(WorldPacket& recvPacket);
void HandlePingOpcode(WorldPacket& recvPacket);
- void HandleRepopRequestOpcode(WorldPacket& recvPacket);
- void HandleAutostoreLootItemOpcode(WorldPacket& recvPacket);
- void HandleLootMoneyOpcode(WorldPacket& recvPacket);
+ void HandleRepopRequest(WorldPackets::Misc::RepopRequest& packet);
+ void HandleAutostoreLootItemOpcode(WorldPackets::Loot::AutoStoreLootItem& packet);
+ void HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& packet);
void HandleLootOpcode(WorldPackets::Loot::LootUnit& packet);
- void HandleLootReleaseOpcode(WorldPacket& recvPacket);
+ void HandleLootReleaseOpcode(WorldPackets::Loot::LootRelease& packet);
void HandleLootMasterGiveOpcode(WorldPacket& recvPacket);
void HandleWhoOpcode(WorldPacket& recvPacket);
void HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequest& logoutRequest);
@@ -713,7 +745,7 @@ class WorldSession
void HandleAddIgnoreOpcodeCallBack(PreparedQueryResult result);
void HandleDelIgnoreOpcode(WorldPacket& recvPacket);
void HandleSetContactNotesOpcode(WorldPacket& recvPacket);
- void HandleBugOpcode(WorldPacket& recvPacket);
+ void HandleBugReportOpcode(WorldPacket& recvPacket);
void HandleAreaTriggerOpcode(WorldPackets::Misc::AreaTrigger& packet);
@@ -731,7 +763,7 @@ class WorldSession
void HandleGameobjectReportUse(WorldPackets::GameObject::GameObjectReportUse& packet);
void HandleNameQueryOpcode(WorldPackets::Query::QueryPlayerName& packet);
- void HandleQueryTimeOpcode(WorldPacket& recvPacket);
+ void HandleQueryTimeOpcode(WorldPackets::Query::QueryTime& queryTime);
void HandleCreatureQuery(WorldPackets::Query::QueryCreature& packet);
void HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet);
@@ -750,14 +782,13 @@ class WorldSession
void HandleRequestRaidInfoOpcode(WorldPacket& recvData);
- void HandleBattlefieldStatusOpcode(WorldPacket& recvData);
+ void HandleRequestBattlefieldStatusOpcode(WorldPacket& recvData);
void HandleBattleMasterHelloOpcode(WorldPacket& recvData);
void HandleGroupInviteOpcode(WorldPacket& recvPacket);
//void HandleGroupCancelOpcode(WorldPacket& recvPacket);
void HandleGroupInviteResponseOpcode(WorldPacket& recvPacket);
void HandleGroupUninviteOpcode(WorldPacket& recvPacket);
- void HandleGroupUninviteGuidOpcode(WorldPacket& recvPacket);
void HandleGroupSetLeaderOpcode(WorldPacket& recvPacket);
void HandleGroupSetRolesOpcode(WorldPacket& recvData);
void HandleGroupDisbandOpcode(WorldPacket& recvPacket);
@@ -767,7 +798,6 @@ class WorldSession
void HandleRequestPartyMemberStatsOpcode(WorldPacket& recvData);
void HandleRaidTargetUpdateOpcode(WorldPacket& recvData);
void HandleRaidReadyCheckOpcode(WorldPacket& recvData);
- void HandleRaidReadyCheckFinishedOpcode(WorldPacket& recvData);
void HandleGroupRaidConvertOpcode(WorldPacket& recvData);
void HandleGroupRequestJoinUpdates(WorldPacket& recvData);
void HandleGroupChangeSubGroupOpcode(WorldPacket& recvData);
@@ -779,7 +809,7 @@ class WorldSession
void HandlePetitionBuyOpcode(WorldPacket& recvData);
void HandlePetitionShowSignOpcode(WorldPacket& recvData);
void HandlePetitionQueryOpcode(WorldPacket& recvData);
- void HandlePetitionRenameOpcode(WorldPacket& recvData);
+ void HandlePetitionRenameGuildOpcode(WorldPacket& recvData);
void HandlePetitionSignOpcode(WorldPacket& recvData);
void HandlePetitionDeclineOpcode(WorldPacket& recvData);
void HandleOfferPetitionOpcode(WorldPacket& recvData);
@@ -787,7 +817,7 @@ class WorldSession
void HandleGuildQueryOpcode(WorldPackets::Guild::QueryGuildInfo& query);
void HandleGuildInviteOpcode(WorldPacket& recvPacket);
- void HandleGuildRemoveOpcode(WorldPacket& recvPacket);
+ void HandleGuildOfficerRemoveMemberOpcode(WorldPacket& recvPacket);
void HandleGuildAcceptOpcode(WorldPacket& recvPacket);
void HandleGuildDeclineOpcode(WorldPacket& recvPacket);
void HandleGuildEventLogQueryOpcode(WorldPacket& recvPacket);
@@ -803,11 +833,11 @@ class WorldSession
void HandleGuildMOTDOpcode(WorldPacket& recvPacket);
void HandleGuildNewsUpdateStickyOpcode(WorldPacket& recvPacket);
void HandleGuildSetNoteOpcode(WorldPacket& recvPacket);
- void HandleGuildQueryRanksOpcode(WorldPacket& recvPacket);
+ void HandleGuildGetRanksOpcode(WorldPacket& recvPacket);
void HandleGuildQueryNewsOpcode(WorldPacket& recvPacket);
void HandleGuildSetRankPermissionsOpcode(WorldPacket& recvPacket);
void HandleGuildAddRankOpcode(WorldPacket& recvPacket);
- void HandleGuildDelRankOpcode(WorldPacket& recvPacket);
+ void HandleGuildDeleteRankOpcode(WorldPacket& recvPacket);
void HandleGuildChangeInfoTextOpcode(WorldPacket& recvPacket);
void HandleSaveGuildEmblemOpcode(WorldPacket& recvPacket);
void HandleGuildRequestPartyState(WorldPacket& recvPacket);
@@ -868,7 +898,7 @@ class WorldSession
void HandleSetTradeItemOpcode(WorldPacket& recvPacket);
void HandleUnacceptTradeOpcode(WorldPacket& recvPacket);
- void HandleAuctionHelloOpcode(WorldPacket& recvPacket);
+ void HandleAuctionHelloOpcode(WorldPackets::AuctionHouse::AuctionHelloRequest& packet);
void HandleAuctionListItems(WorldPacket& recvData);
void HandleAuctionListBidderItems(WorldPacket& recvData);
void HandleAuctionSellItem(WorldPacket& recvData);
@@ -877,6 +907,9 @@ class WorldSession
void HandleAuctionPlaceBid(WorldPacket& recvData);
void HandleAuctionListPendingSales(WorldPacket& recvData);
+ // Black Market
+ void HandleBlackMarketOpen(WorldPackets::BlackMarket::BlackMarketOpen& packet);
+
void HandleGetMailList(WorldPacket& recvData);
void HandleSendMail(WorldPacket& recvData);
void HandleMailTakeMoney(WorldPacket& recvData);
@@ -898,7 +931,7 @@ class WorldSession
void HandleBuyItemInSlotOpcode(WorldPacket& recvPacket);
void HandleBuyItemOpcode(WorldPacket& recvPacket);
void HandleListInventoryOpcode(WorldPackets::NPC::Hello& packet);
- void HandleAutoStoreBagItemOpcode(WorldPacket& recvPacket);
+ void HandleAutoStoreBagItemOpcode(WorldPackets::Item::AutoStoreBagItem& packet);
void HandleReadItem(WorldPacket& recvPacket);
void HandleAutoEquipItemSlotOpcode(WorldPacket& recvPacket);
void HandleSwapItem(WorldPackets::Item::SwapItem& swapItem);
@@ -915,12 +948,12 @@ class WorldSession
void HandleOpenItemOpcode(WorldPacket& recvPacket);
void HandleCastSpellOpcode(WorldPackets::Spells::SpellCastRequest& castRequest);
void HandleCancelCastOpcode(WorldPacket& recvPacket);
- void HandleCancelAuraOpcode(WorldPacket& recvPacket);
+ void HandleCancelAuraOpcode(WorldPackets::Spells::CancelAura& cancelAura);
void HandleCancelGrowthAuraOpcode(WorldPacket& recvPacket);
void HandleCancelAutoRepeatSpellOpcode(WorldPacket& recvPacket);
- void HandleLearnTalentOpcode(WorldPackets::Talent::LearnTalent& packet);
- void HandleTalentWipeConfirmOpcode(WorldPacket& recvPacket);
+ void HandleLearnTalentsOpcode(WorldPackets::Talent::LearnTalents& packet);
+ void HandleConfirmRespecWipeOpcode(WorldPacket& recvPacket);
void HandleUnlearnSkillOpcode(WorldPacket& recvPacket);
void HandleSetSpecializationOpcode(WorldPackets::Talent::SetSpecialization& packet);
@@ -961,10 +994,10 @@ class WorldSession
void HandleUnregisterAddonPrefixesOpcode(WorldPacket& recvPacket);
void HandleAddonRegisteredPrefixesOpcode(WorldPacket& recvPacket);
- void HandleReclaimCorpseOpcode(WorldPacket& recvPacket);
- void HandleCorpseQueryOpcode(WorldPacket& recvPacket);
- void HandleCorpseMapPositionQuery(WorldPacket& recvPacket);
- void HandleResurrectResponseOpcode(WorldPacket& recvPacket);
+ void HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& packet);
+ void HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& packet);
+ void HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& packet);
+ void HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse& packet);
void HandleSummonResponseOpcode(WorldPacket& recvData);
void HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet);
@@ -1039,7 +1072,7 @@ class WorldSession
void HandleMoveSetCanFlyAckOpcode(WorldPacket& recvData);
void HandleSetTitleOpcode(WorldPacket& recvData);
void HandleRealmSplitOpcode(WorldPacket& recvData);
- void HandleTimeSyncResp(WorldPackets::Misc::TimeSyncResponse& packet);
+ void HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse& packet);
void HandleWhoisOpcode(WorldPacket& recvData);
void HandleResetInstancesOpcode(WorldPacket& recvData);
void HandleHearthAndResurrect(WorldPacket& recvData);
@@ -1160,11 +1193,11 @@ class WorldSession
void HandleMirrorImageDataRequest(WorldPacket& recvData);
void HandleRemoveGlyph(WorldPacket& recvData);
void HandleQueryInspectAchievements(WorldPacket& recvData);
- void HandleGuildAchievementProgressQuery(WorldPacket& recvData);
+ void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement);
void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet);
void HandleEquipmentSetDelete(WorldPacket& recvData);
void HandleEquipmentSetUse(WorldPacket& recvData);
- void HandleWorldStateUITimerUpdate(WorldPacket& recvData);
+ void HandleUITimeRequest(WorldPackets::Misc::UITimeRequest& /*request*/);
void HandleQuestNPCQuery(WorldPacket& recvData);
void HandleQuestPOIQuery(WorldPacket& recvData);
void HandleEjectPassenger(WorldPacket& data);
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index 28c2927bd8b..4e239f8a373 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -327,6 +327,9 @@ Aura* Aura::Create(SpellInfo const* spellproto, uint32 effMask, WorldObject* own
else
casterGUID = caster->GetGUID();
+ // at this point of Aura::Create() there MUST be a valid caster
+ ASSERT(caster);
+
// check if aura can be owned by owner
if (owner->isType(TYPEMASK_UNIT))
if (!owner->IsInWorld() || ((Unit*)owner)->IsDuringRemoveFromWorld())
@@ -398,7 +401,7 @@ void Aura::_InitEffects(uint32 effMask, Unit* caster, int32 *baseAmount)
for (SpellEffectInfo const* effect : GetSpellEffectInfos())
{
- if (effect && effMask & (uint8(1) << effect->EffectIndex))
+ if (effect && effMask & (1 << effect->EffectIndex))
_effects[effect->EffectIndex] = new AuraEffect(this, effect->EffectIndex, baseAmount ? baseAmount + effect->EffectIndex : NULL, caster);
}
}
@@ -414,9 +417,8 @@ Aura::~Aura()
m_loadedScripts.erase(itr);
}
- // free effects memory todo 6.x
- //for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
- // delete m_effects[i];
+ for (AuraEffect* effect : _effects)
+ delete effect;
ASSERT(m_applications.empty());
_DeleteRemovedApplications();
@@ -1113,18 +1115,40 @@ int32 Aura::CalcDispelChance(Unit* auraTarget, bool offensive) const
return 100 - resistChance;
}
-void Aura::SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint8 stackamount, uint8 recalculateMask, int32 *amount)
+AuraKey Aura::GenerateKey(uint32& recalculateMask) const
+{
+ AuraKey key;
+ key.Caster = GetCasterGUID();
+ key.Item = GetCastItemGUID();
+ key.SpellId = GetId();
+ key.EffectMask = 0;
+ recalculateMask = 0;
+ for (uint32 i = 0; i < _effects.size(); ++i)
+ {
+ if (AuraEffect const* effect = _effects[i])
+ {
+ key.EffectMask |= 1 << i;
+ if (effect->CanBeRecalculated())
+ recalculateMask |= 1 << i;
+ }
+ }
+
+ return key;
+}
+
+void Aura::SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint8 stackAmount, uint32 recalculateMask, int32* amount)
{
- m_maxDuration = maxduration;
+ m_maxDuration = maxDuration;
m_duration = duration;
m_procCharges = charges;
m_isUsingCharges = m_procCharges != 0;
- m_stackAmount = stackamount;
+ m_stackAmount = stackAmount;
Unit* caster = GetCaster();
for (AuraEffect* effect : GetAuraEffects())
{
if (!effect)
continue;
+
effect->SetAmount(amount[effect->GetEffIndex()]);
effect->SetCanBeRecalculated((recalculateMask & (1 << effect->GetEffIndex())) != 0);
effect->CalculatePeriodic(caster, false, true);
diff --git a/src/server/game/Spells/Auras/SpellAuras.h b/src/server/game/Spells/Auras/SpellAuras.h
index 8841d887e86..3a05da9cd1e 100644
--- a/src/server/game/Spells/Auras/SpellAuras.h
+++ b/src/server/game/Spells/Auras/SpellAuras.h
@@ -91,6 +91,28 @@ class AuraApplication
void ClientUpdate(bool remove = false);
};
+#pragma pack(push, 1)
+// Structure representing database aura primary key fields
+struct AuraKey
+{
+ ObjectGuid Caster;
+ ObjectGuid Item;
+ uint32 SpellId;
+ uint32 EffectMask;
+
+ bool operator<(AuraKey const& right) const
+ {
+ return memcmp(this, &right, sizeof(*this)) < 0;
+ }
+};
+
+struct AuraLoadEffectInfo
+{
+ std::array<int32, MAX_SPELL_EFFECTS> Amounts;
+ std::array<int32, MAX_SPELL_EFFECTS> BaseAmounts;
+};
+#pragma pack(pop)
+
class Aura
{
friend Aura* Unit::_TryStackingOrRefreshingExistingAura(SpellInfo const* newAura, uint32 effMask, Unit* caster, int32 *baseAmount, Item* castItem, ObjectGuid casterGUID);
@@ -184,12 +206,21 @@ class Aura
void UnregisterSingleTarget();
int32 CalcDispelChance(Unit* auraTarget, bool offensive) const;
- void SetLoadedState(int32 maxduration, int32 duration, int32 charges, uint8 stackamount, uint8 recalculateMask, int32 *baseAmount);
+ /**
+ * @fn AuraKey Aura::GenerateKey(uint32& recalculateMask) const
+ *
+ * @brief Fills a helper structure containing aura primary key for `character_aura`, `character_aura_effect`, `pet_aura`, `pet_aura_effect` tables.
+ *
+ * @param [out] recalculateMask Mask of effects that can be recalculated to store in database - not part of aura key.
+ *
+ * @return Aura key.
+ */
+ AuraKey GenerateKey(uint32& recalculateMask) const;
+ void SetLoadedState(int32 maxDuration, int32 duration, int32 charges, uint8 stackAmount, uint32 recalculateMask, int32* amount);
// helpers for aura effects
bool HasEffect(uint8 effIndex) const { return GetEffect(effIndex) != NULL; }
bool HasEffectType(AuraType type) const;
- //AuraEffect* GetEffect(uint8 effIndex) const { ASSERT (effIndex < MAX_SPELL_EFFECTS); return Effects[effIndex]; }
AuraEffect* GetEffect(uint32 index) const;
uint32 GetEffectMask() const;
void RecalculateAmountOfEffects();
@@ -335,4 +366,5 @@ class ChargeDropEvent : public BasicEvent
Aura* _base;
AuraRemoveMode _mode;
};
+
#endif
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index d7b2af5d1d1..d729d76a1d5 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -4275,7 +4275,7 @@ void Spell::WriteSpellGoTargets(WorldPacket* data)
void Spell::SendLogExecute()
{
- WorldPacket data(SMSG_SPELLLOGEXECUTE, (8+4+4+4+4+8));
+ WorldPacket data(SMSG_SPELL_EXECUTE_LOG, (8+4+4+4+4+8));
data << m_caster->GetPackGUID();
@@ -4328,7 +4328,7 @@ void Spell::ExecuteLogEffectInterruptCast(uint8 /*effIndex*/, Unit* victim, uint
ObjectGuid casterGuid = m_caster->GetGUID();
ObjectGuid targetGuid = victim->GetGUID();
- WorldPacket data(SMSG_SPELLINTERRUPTLOG, 8 + 8 + 4 + 4);
+ WorldPacket data(SMSG_SPELL_INTERRUPT_LOG, 8 + 8 + 4 + 4);
data.WriteBit(targetGuid[4]);
data.WriteBit(casterGuid[5]);
data.WriteBit(casterGuid[6]);
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index ceb16e30536..3eeb50a2d39 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -367,7 +367,7 @@ void Spell::EffectInstaKill(SpellEffIndex /*effIndex*/)
if (m_caster == unitTarget) // prevent interrupt message
finish();
- WorldPacket data(SMSG_SPELLINSTAKILLLOG, 8+8+4);
+ WorldPacket data(SMSG_SPELL_INSTAKILL_LOG, 8+8+4);
data << m_caster->GetGUID();
data << unitTarget->GetGUID();
data << uint32(m_spellInfo->Id);
@@ -2333,7 +2333,7 @@ void Spell::EffectDispel(SpellEffIndex effIndex)
if (success_list.empty())
return;
- WorldPacket dataSuccess(SMSG_SPELLDISPELLOG, 8+8+4+1+4+success_list.size()*5);
+ WorldPacket dataSuccess(SMSG_SPELL_DISPEL_LOG, 8+8+4+1+4+success_list.size()*5);
// Send packet header
dataSuccess << unitTarget->GetPackGUID(); // Victim GUID
dataSuccess << m_caster->GetPackGUID(); // Caster GUID
@@ -2436,7 +2436,7 @@ void Spell::EffectUntrainTalents(SpellEffIndex /*effIndex*/)
if (!unitTarget || m_caster->GetTypeId() == TYPEID_PLAYER)
return;
- unitTarget->ToPlayer()->SendTalentWipeConfirm(m_caster->GetGUID());
+ unitTarget->ToPlayer()->SendRespecWipeConfirm(m_caster->GetGUID(), sWorld->getBoolConfig(CONFIG_NO_RESET_TALENT_COST) ? 0 : unitTarget->ToPlayer()->GetNextResetTalentsCost());
}
void Spell::EffectTeleUnitsFaceCaster(SpellEffIndex /*effIndex*/)
@@ -3933,9 +3933,17 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/)
if (player->IsInFlight())
return;
- player->TeleportTo(player->GetStartPosition(), TELE_TO_SPELL);
- // homebind location is loaded always
- // target->TeleportTo(target->m_homebindMapId, target->m_homebindX, target->m_homebindY, target->m_homebindZ, target->GetOrientation(), (m_caster == m_caster ? TELE_TO_SPELL : 0));
+ // if player is dead without death timer is teleported to graveyard, otherwise not apply the effect
+ if (player->isDead())
+ {
+ if (!player->GetDeathTimer())
+ player->RepopAtGraveyard();
+
+ return;
+ }
+
+ // the player is teleported to home
+ player->TeleportTo(player->m_homebindMapId, player->m_homebindX, player->m_homebindY, player->m_homebindZ, player->GetOrientation(), TELE_TO_SPELL);
// Stuck spell trigger Hearthstone cooldown
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(8690);
@@ -5676,7 +5684,7 @@ void Spell::EffectBind(SpellEffIndex /*effIndex*/)
homeLoc.GetPositionX(), homeLoc.GetPositionY(), homeLoc.GetPositionZ(), homeLoc.GetMapId(), areaId);
// zone update
- WorldPacket data(SMSG_PLAYERBOUND, 8 + 4);
+ WorldPacket data(SMSG_PLAYER_BOUND, 8 + 4);
data << m_caster->GetGUID();
data << uint32(areaId);
player->SendDirectMessage(&data);
diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h
index 7e60e11448d..5b9cfacb56b 100644
--- a/src/server/game/Spells/SpellInfo.h
+++ b/src/server/game/Spells/SpellInfo.h
@@ -574,7 +574,7 @@ public:
SpellEffectInfoVector GetEffectsForDifficulty(uint32 difficulty) const;
SpellEffectInfo const* GetEffect(uint32 difficulty, uint32 index) const;
SpellEffectInfo const* GetEffect(uint32 index) const { return GetEffect(DIFFICULTY_NONE, index); }
- SpellEffectInfo const* GetEffect(WorldObject* obj, uint32 index) const { return GetEffect(obj->GetMap()->GetDifficultyID(), index); }
+ SpellEffectInfo const* GetEffect(WorldObject const* obj, uint32 index) const { return GetEffect(obj->GetMap()->GetDifficultyID(), index); }
SpellEffectInfoMap _effects;
};
diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp
index c1ea5b86498..33773a57631 100644
--- a/src/server/game/Spells/SpellScript.cpp
+++ b/src/server/game/Spells/SpellScript.cpp
@@ -1023,9 +1023,9 @@ DynamicObject* AuraScript::GetDynobjOwner() const
return m_aura->GetDynobjOwner();
}
-void AuraScript::Remove(uint32 removeMode)
+void AuraScript::Remove(AuraRemoveMode removeMode)
{
- m_aura->Remove((AuraRemoveMode)removeMode);
+ m_aura->Remove(removeMode);
}
Aura* AuraScript::GetAura() const
diff --git a/src/server/game/Spells/SpellScript.h b/src/server/game/Spells/SpellScript.h
index f9f62ab14c6..fb9e1ed3937 100644
--- a/src/server/game/Spells/SpellScript.h
+++ b/src/server/game/Spells/SpellScript.h
@@ -815,7 +815,7 @@ class AuraScript : public _SpellScript
DynamicObject* GetDynobjOwner() const;
// removes aura with remove mode (see AuraRemoveMode enum)
- void Remove(uint32 removeMode = 0);
+ void Remove(AuraRemoveMode removeMode = AURA_REMOVE_BY_DEFAULT);
// returns aura object of script
Aura* GetAura() const;
diff --git a/src/server/game/Tickets/TicketMgr.cpp b/src/server/game/Tickets/TicketMgr.cpp
index fb812cfbeec..7cd27fdaa62 100644
--- a/src/server/game/Tickets/TicketMgr.cpp
+++ b/src/server/game/Tickets/TicketMgr.cpp
@@ -139,7 +139,7 @@ void GmTicket::WritePacket(WorldPacket& data) const
void GmTicket::SendResponse(WorldSession* session) const
{
- WorldPacket data(SMSG_GMRESPONSE_RECEIVED);
+ WorldPacket data(SMSG_GM_TICKET_RESPONSE);
data << uint32(1); // responseID
data << uint32(_id); // ticketID
data << _message.c_str();
@@ -408,7 +408,7 @@ void TicketMgr::ShowEscalatedList(ChatHandler& handler) const
void TicketMgr::SendTicket(WorldSession* session, GmTicket* ticket) const
{
- WorldPacket data(SMSG_GMTICKET_GETTICKET, (ticket ? (4 + 4 + 1 + 4 + 4 + 4 + 1 + 1) : 4));
+ WorldPacket data(SMSG_GM_TICKET_GET_TICKET_RESPONSE, (ticket ? (4 + 4 + 1 + 4 + 4 + 4 + 1 + 1) : 4));
if (ticket)
ticket->WritePacket(data);
diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp
index abcd2468e11..fe3c4b76167 100644
--- a/src/server/game/World/World.cpp
+++ b/src/server/game/World/World.cpp
@@ -1189,6 +1189,25 @@ void World::LoadConfigSettings(bool reload)
m_int_configs[CONFIG_CHARDELETE_HEROIC_MIN_LEVEL] = sConfigMgr->GetIntDefault("CharDelete.Heroic.MinLevel", 0);
m_int_configs[CONFIG_CHARDELETE_KEEP_DAYS] = sConfigMgr->GetIntDefault("CharDelete.KeepDays", 30);
+ // No aggro from gray mobs
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] = sConfigMgr->GetIntDefault("NoGrayAggro.Above", 0);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] = sConfigMgr->GetIntDefault("NoGrayAggro.Below", 0);
+ if (m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
+ {
+ TC_LOG_ERROR("server.loading", "NoGrayAggro.Above (%i) must be in range 0..%u. Set to %u.", m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
+ }
+ if (m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] > m_int_configs[CONFIG_MAX_PLAYER_LEVEL])
+ {
+ TC_LOG_ERROR("server.loading", "NoGrayAggro.Below (%i) must be in range 0..%u. Set to %u.", m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW], m_int_configs[CONFIG_MAX_PLAYER_LEVEL], m_int_configs[CONFIG_MAX_PLAYER_LEVEL]);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] = m_int_configs[CONFIG_MAX_PLAYER_LEVEL];
+ }
+ if (m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] > 0 && m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE] < m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW])
+ {
+ TC_LOG_ERROR("server.loading", "NoGrayAggro.Below (%i) cannot be greater than NoGrayAggro.Above (%i). Set to %i.", m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW], m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE], m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE]);
+ m_int_configs[CONFIG_NO_GRAY_AGGRO_BELOW] = m_int_configs[CONFIG_NO_GRAY_AGGRO_ABOVE];
+ }
+
///- Read the "Data" directory from the config file
std::string dataPath = sConfigMgr->GetStringDefault("DataDir", "./");
if (dataPath.empty() || (dataPath.at(dataPath.length()-1) != '/' && dataPath.at(dataPath.length()-1) != '\\'))
@@ -2292,7 +2311,10 @@ namespace Trinity
va_end(ap);
}
else
- std::strcpy(strBuffer, text);
+ {
+ std::strncpy(strBuffer, text, BufferSize);
+ strBuffer[BufferSize - 1] = '\0';
+ }
do_helper(dataList, strBuffer);
}
diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h
index ac7193e4267..2526516d778 100644
--- a/src/server/game/World/World.h
+++ b/src/server/game/World/World.h
@@ -369,6 +369,8 @@ enum WorldIntConfigs
CONFIG_CHARTER_COST_ARENA_2v2,
CONFIG_CHARTER_COST_ARENA_3v3,
CONFIG_CHARTER_COST_ARENA_5v5,
+ CONFIG_NO_GRAY_AGGRO_ABOVE,
+ CONFIG_NO_GRAY_AGGRO_BELOW,
INT_CONFIG_VALUE_COUNT
};
diff --git a/src/server/scripts/Commands/cs_battlenet_account.cpp b/src/server/scripts/Commands/cs_battlenet_account.cpp
index f92f541c0a2..767a75f0b36 100644
--- a/src/server/scripts/Commands/cs_battlenet_account.cpp
+++ b/src/server/scripts/Commands/cs_battlenet_account.cpp
@@ -21,6 +21,7 @@
#include "Language.h"
#include "Player.h"
#include "ScriptMgr.h"
+#include "Util.h"
class battlenet_account_commandscript : public CommandScript
{
@@ -84,7 +85,12 @@ public:
return false;
}
- switch (Battlenet::AccountMgr::CreateBattlenetAccount(std::string(accountName), std::string(password)))
+ char* createGameAccountParam = strtok(NULL, " ");
+ bool createGameAccount = true;
+ if (createGameAccountParam)
+ createGameAccount = StringToBool(createGameAccountParam);
+
+ switch (Battlenet::AccountMgr::CreateBattlenetAccount(std::string(accountName), std::string(password), createGameAccount))
{
case AccountOpResult::AOR_OK:
handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName);
@@ -417,7 +423,11 @@ public:
uint8 index = Battlenet::AccountMgr::GetMaxIndex(accountId) + 1;
std::string accountName = std::to_string(accountId) + '#' + std::to_string(uint32(index));
- switch (sAccountMgr->CreateAccount(accountName, "DUMMY", bnetAccountName, accountId, index))
+ // Generate random hex string for password, these accounts must not be logged on with GRUNT
+ BigNumber randPassword;
+ randPassword.SetRand(8 * 16);
+
+ switch (sAccountMgr->CreateAccount(accountName, ByteArrayToHexStr(randPassword.AsByteArray().get(), randPassword.GetNumBytes()), bnetAccountName, accountId, index))
{
case AccountOpResult::AOR_OK:
handler->PSendSysMessage(LANG_ACCOUNT_CREATED, accountName.c_str());
diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp
index 8530a226ab1..b697eba36a1 100644
--- a/src/server/scripts/Commands/cs_debug.cpp
+++ b/src/server/scripts/Commands/cs_debug.cpp
@@ -1343,7 +1343,7 @@ public:
target->DestroyForNearbyPlayers(); // Force new SMSG_UPDATE_OBJECT:CreateObject
else
{
- WorldPacket data(SMSG_PLAYER_MOVE);
+ WorldPacket data(SMSG_MOVE_UPDATE);
target->WriteMovementInfo(data);
target->SendMessageToSet(&data, true);
}
diff --git a/src/server/scripts/Commands/cs_rbac.cpp b/src/server/scripts/Commands/cs_rbac.cpp
index d6f5f40a9c6..93593870975 100644
--- a/src/server/scripts/Commands/cs_rbac.cpp
+++ b/src/server/scripts/Commands/cs_rbac.cpp
@@ -1,383 +1,383 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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/>.
- */
-
-/* ScriptData
-Name: rbac_commandscript
-%Complete: 100
-Comment: All role based access control related commands (including account related)
-Category: commandscripts
-EndScriptData */
-
-#include "AccountMgr.h"
-#include "Config.h"
-#include "Chat.h"
-#include "Language.h"
-#include "Player.h"
-#include "ScriptMgr.h"
-
-struct RBACCommandData
-{
- RBACCommandData(): id(0), realmId(0), rbac(NULL), needDelete(false) { }
- ~RBACCommandData()
- {
- if (needDelete)
- delete rbac;
- }
-
- uint32 id;
- int32 realmId;
- rbac::RBACData* rbac;
- bool needDelete;
-};
-
-class rbac_commandscript : public CommandScript
-{
-public:
- rbac_commandscript() : CommandScript("rbac_commandscript") { }
-
- ChatCommand* GetCommands() const
- {
- static ChatCommand rbacAccountCommandTable[] =
- {
- { "list", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_LIST, true, &HandleRBACPermListCommand, "", NULL },
- { "grant", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT, true, &HandleRBACPermGrantCommand, "", NULL },
- { "deny", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY, true, &HandleRBACPermDenyCommand, "", NULL },
- { "revoke", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE, true, &HandleRBACPermRevokeCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
- };
-
- static ChatCommand rbacCommandTable[] =
- {
- { "account", rbac::RBAC_PERM_COMMAND_RBAC_ACC, true, NULL, "", rbacAccountCommandTable },
- { "list", rbac::RBAC_PERM_COMMAND_RBAC_LIST, true, &HandleRBACListPermissionsCommand, "", NULL },
- { NULL, 0, false, NULL, "", NULL }
- };
-
- static ChatCommand commandTable[] =
- {
- { "rbac", rbac::RBAC_PERM_COMMAND_RBAC, true, NULL, "", rbacCommandTable },
- { NULL, 0, false, NULL, "", NULL }
- };
-
- return commandTable;
- }
-
- static RBACCommandData* ReadParams(ChatHandler* handler, char const* args, bool checkParams = true)
- {
- if (!args)
- return NULL;
-
- char* param1 = strtok((char*)args, " ");
- char* param2 = strtok(NULL, " ");
- char* param3 = strtok(NULL, " ");
-
- int32 realmId = -1;
- uint32 accountId = 0;
- std::string accountName;
- uint32 id = 0;
- RBACCommandData* data = NULL;
- rbac::RBACData* rdata = NULL;
- bool useSelectedPlayer = false;
-
- if (checkParams)
- {
- if (!param3)
- {
- if (param2)
- realmId = atoi(param2);
-
- if (param1)
- id = atoi(param1);
-
- useSelectedPlayer = true;
- }
- else
- {
- id = atoi(param2);
- realmId = atoi(param3);
- }
-
- if (!id)
- {
- handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
- handler->SetSentErrorMessage(true);
- return NULL;
- }
-
- if (realmId < -1 || !realmId)
- {
- handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_REALM, realmId);
- handler->SetSentErrorMessage(true);
- return NULL;
- }
- }
- else if (!param1)
- useSelectedPlayer = true;
-
- if (useSelectedPlayer)
- {
- Player* player = handler->getSelectedPlayer();
- if (!player)
- return NULL;
-
- rdata = player->GetSession()->GetRBACData();
- accountId = rdata->GetId();
- AccountMgr::GetName(accountId, accountName);
- }
- else
- {
- accountName = param1;
-
- if (Utf8ToUpperOnlyLatin(accountName))
- accountId = AccountMgr::GetId(accountName);
-
- if (!accountId)
- {
- handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
- handler->SetSentErrorMessage(true);
- return NULL;
- }
- }
-
- if (checkParams && handler->HasLowerSecurityAccount(NULL, accountId, true))
- return NULL;
-
- data = new RBACCommandData();
-
- if (!rdata)
- {
- data->rbac = new rbac::RBACData(accountId, accountName, realmHandle.Index, AccountMgr::GetSecurity(accountId, realmHandle.Index));
- data->rbac->LoadFromDB();
- data->needDelete = true;
- }
- else
- data->rbac = rdata;
-
- data->id = id;
- data->realmId = realmId;
- return data;
- }
-
- static bool HandleRBACPermGrantCommand(ChatHandler* handler, char const* args)
- {
- RBACCommandData* command = ReadParams(handler, args);
-
- if (!command)
- {
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- rbac::RBACCommandResult result = command->rbac->GrantPermission(command->id, command->realmId);
- rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
-
- switch (result)
- {
- case rbac::RBAC_CANT_ADD_ALREADY_ADDED:
- handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_IN_DENIED_LIST:
- handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_OK:
- handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_ID_DOES_NOT_EXISTS:
- handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
- break;
- default:
- break;
- }
-
- delete command;
-
- return true;
- }
-
- static bool HandleRBACPermDenyCommand(ChatHandler* handler, char const* args)
- {
- RBACCommandData* command = ReadParams(handler, args);
-
- if (!command)
- {
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- rbac::RBACCommandResult result = command->rbac->DenyPermission(command->id, command->realmId);
- rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
-
- switch (result)
- {
- case rbac::RBAC_CANT_ADD_ALREADY_ADDED:
- handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_IN_GRANTED_LIST:
- handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_OK:
- handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_ID_DOES_NOT_EXISTS:
- handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
- break;
- default:
- break;
- }
-
- delete command;
-
- return true;
- }
-
- static bool HandleRBACPermRevokeCommand(ChatHandler* handler, char const* args)
- {
- RBACCommandData* command = ReadParams(handler, args);
-
- if (!command)
- {
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- rbac::RBACCommandResult result = command->rbac->RevokePermission(command->id, command->realmId);
- rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
-
- switch (result)
- {
- case rbac::RBAC_CANT_REVOKE_NOT_IN_LIST:
- handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_OK:
- handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, command->id, permission->GetName().c_str(),
- command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
- break;
- case rbac::RBAC_ID_DOES_NOT_EXISTS:
- handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
- break;
- default:
- break;
- }
-
- delete command;
-
- return true;
- }
-
- static bool HandleRBACPermListCommand(ChatHandler* handler, char const* args)
- {
- RBACCommandData* command = ReadParams(handler, args, false);
-
- if (!command)
- {
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_GRANTED, command->rbac->GetId(), command->rbac->GetName().c_str());
- rbac::RBACPermissionContainer const& granted = command->rbac->GetGrantedPermissions();
- if (granted.empty())
- handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
- else
- {
- for (rbac::RBACPermissionContainer::const_iterator itr = granted.begin(); itr != granted.end(); ++itr)
- {
- rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
- handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
- }
- }
-
- handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
- rbac::RBACPermissionContainer const& denied = command->rbac->GetDeniedPermissions();
- if (denied.empty())
- handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
- else
- {
- for (rbac::RBACPermissionContainer::const_iterator itr = denied.begin(); itr != denied.end(); ++itr)
- {
- rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
- handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
- }
- }
- handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_BY_SEC_LEVEL, command->rbac->GetId(), command->rbac->GetName().c_str(), command->rbac->GetSecurityLevel());
- rbac::RBACPermissionContainer const& defaultPermissions = sAccountMgr->GetRBACDefaultPermissions(command->rbac->GetSecurityLevel());
- if (defaultPermissions.empty())
- handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
- else
- {
- for (rbac::RBACPermissionContainer::const_iterator itr = defaultPermissions.begin(); itr != defaultPermissions.end(); ++itr)
- {
- rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
- handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
- }
- }
-
- delete command;
-
- return true;
- }
-
- static bool HandleRBACListPermissionsCommand(ChatHandler* handler, char const* args)
- {
- uint32 id = 0;
- if (char* param1 = strtok((char*)args, " "))
- id = atoi(param1);
-
- if (!id)
- {
- rbac::RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
- handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
- for (rbac::RBACPermissionsContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
- {
- rbac::RBACPermission const* permission = it->second;
- handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
- }
- }
- else
- {
- rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(id);
- if (!permission)
- {
- handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
- handler->SetSentErrorMessage(true);
- return false;
- }
-
- handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
- handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
- handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMS_LINKED_HEADER));
- rbac::RBACPermissionContainer const& permissions = permission->GetLinkedPermissions();
- for (rbac::RBACPermissionContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
- if (rbac::RBACPermission const* rbacPermission = sAccountMgr->GetRBACPermission(*it))
- handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, rbacPermission->GetId(), rbacPermission->GetName().c_str());
- }
-
- return true;
- }
-};
-
-void AddSC_rbac_commandscript()
-{
- new rbac_commandscript();
-}
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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/>.
+ */
+
+/* ScriptData
+Name: rbac_commandscript
+%Complete: 100
+Comment: All role based access control related commands (including account related)
+Category: commandscripts
+EndScriptData */
+
+#include "AccountMgr.h"
+#include "Config.h"
+#include "Chat.h"
+#include "Language.h"
+#include "Player.h"
+#include "ScriptMgr.h"
+
+struct RBACCommandData
+{
+ RBACCommandData(): id(0), realmId(0), rbac(NULL), needDelete(false) { }
+ ~RBACCommandData()
+ {
+ if (needDelete)
+ delete rbac;
+ }
+
+ uint32 id;
+ int32 realmId;
+ rbac::RBACData* rbac;
+ bool needDelete;
+};
+
+class rbac_commandscript : public CommandScript
+{
+public:
+ rbac_commandscript() : CommandScript("rbac_commandscript") { }
+
+ ChatCommand* GetCommands() const
+ {
+ static ChatCommand rbacAccountCommandTable[] =
+ {
+ { "list", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_LIST, true, &HandleRBACPermListCommand, "", NULL },
+ { "grant", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_GRANT, true, &HandleRBACPermGrantCommand, "", NULL },
+ { "deny", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_DENY, true, &HandleRBACPermDenyCommand, "", NULL },
+ { "revoke", rbac::RBAC_PERM_COMMAND_RBAC_ACC_PERM_REVOKE, true, &HandleRBACPermRevokeCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand rbacCommandTable[] =
+ {
+ { "account", rbac::RBAC_PERM_COMMAND_RBAC_ACC, true, NULL, "", rbacAccountCommandTable },
+ { "list", rbac::RBAC_PERM_COMMAND_RBAC_LIST, true, &HandleRBACListPermissionsCommand, "", NULL },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ static ChatCommand commandTable[] =
+ {
+ { "rbac", rbac::RBAC_PERM_COMMAND_RBAC, true, NULL, "", rbacCommandTable },
+ { NULL, 0, false, NULL, "", NULL }
+ };
+
+ return commandTable;
+ }
+
+ static RBACCommandData* ReadParams(ChatHandler* handler, char const* args, bool checkParams = true)
+ {
+ if (!args)
+ return NULL;
+
+ char* param1 = strtok((char*)args, " ");
+ char* param2 = strtok(NULL, " ");
+ char* param3 = strtok(NULL, " ");
+
+ int32 realmId = -1;
+ uint32 accountId = 0;
+ std::string accountName;
+ uint32 id = 0;
+ RBACCommandData* data = NULL;
+ rbac::RBACData* rdata = NULL;
+ bool useSelectedPlayer = false;
+
+ if (checkParams)
+ {
+ if (!param3)
+ {
+ if (param2)
+ realmId = atoi(param2);
+
+ if (param1)
+ id = atoi(param1);
+
+ useSelectedPlayer = true;
+ }
+ else
+ {
+ id = atoi(param2);
+ realmId = atoi(param3);
+ }
+
+ if (!id)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+
+ if (realmId < -1 || !realmId)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_REALM, realmId);
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+ }
+ else if (!param1)
+ useSelectedPlayer = true;
+
+ if (useSelectedPlayer)
+ {
+ Player* player = handler->getSelectedPlayer();
+ if (!player)
+ return NULL;
+
+ rdata = player->GetSession()->GetRBACData();
+ accountId = rdata->GetId();
+ AccountMgr::GetName(accountId, accountName);
+ }
+ else
+ {
+ accountName = param1;
+
+ if (Utf8ToUpperOnlyLatin(accountName))
+ accountId = AccountMgr::GetId(accountName);
+
+ if (!accountId)
+ {
+ handler->PSendSysMessage(LANG_ACCOUNT_NOT_EXIST, accountName.c_str());
+ handler->SetSentErrorMessage(true);
+ return NULL;
+ }
+ }
+
+ if (checkParams && handler->HasLowerSecurityAccount(NULL, accountId, true))
+ return NULL;
+
+ data = new RBACCommandData();
+
+ if (!rdata)
+ {
+ data->rbac = new rbac::RBACData(accountId, accountName, realmHandle.Index, AccountMgr::GetSecurity(accountId, realmHandle.Index));
+ data->rbac->LoadFromDB();
+ data->needDelete = true;
+ }
+ else
+ data->rbac = rdata;
+
+ data->id = id;
+ data->realmId = realmId;
+ return data;
+ }
+
+ static bool HandleRBACPermGrantCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ rbac::RBACCommandResult result = command->rbac->GrantPermission(command->id, command->realmId);
+ rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case rbac::RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_IN_DENIED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED_IN_DENIED_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_GRANTED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermDenyCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ rbac::RBACCommandResult result = command->rbac->DenyPermission(command->id, command->realmId);
+ rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case rbac::RBAC_CANT_ADD_ALREADY_ADDED:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_IN_GRANTED_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED_IN_GRANTED_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_DENIED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermRevokeCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ rbac::RBACCommandResult result = command->rbac->RevokePermission(command->id, command->realmId);
+ rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(command->id);
+
+ switch (result)
+ {
+ case rbac::RBAC_CANT_REVOKE_NOT_IN_LIST:
+ handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED_NOT_IN_LIST, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_OK:
+ handler->PSendSysMessage(LANG_RBAC_PERM_REVOKED, command->id, permission->GetName().c_str(),
+ command->realmId, command->rbac->GetId(), command->rbac->GetName().c_str());
+ break;
+ case rbac::RBAC_ID_DOES_NOT_EXISTS:
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, command->id);
+ break;
+ default:
+ break;
+ }
+
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACPermListCommand(ChatHandler* handler, char const* args)
+ {
+ RBACCommandData* command = ReadParams(handler, args, false);
+
+ if (!command)
+ {
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_GRANTED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ rbac::RBACPermissionContainer const& granted = command->rbac->GetGrantedPermissions();
+ if (granted.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (rbac::RBACPermissionContainer::const_iterator itr = granted.begin(); itr != granted.end(); ++itr)
+ {
+ rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_DENIED, command->rbac->GetId(), command->rbac->GetName().c_str());
+ rbac::RBACPermissionContainer const& denied = command->rbac->GetDeniedPermissions();
+ if (denied.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (rbac::RBACPermissionContainer::const_iterator itr = denied.begin(); itr != denied.end(); ++itr)
+ {
+ rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+ handler->PSendSysMessage(LANG_RBAC_LIST_HEADER_BY_SEC_LEVEL, command->rbac->GetId(), command->rbac->GetName().c_str(), command->rbac->GetSecurityLevel());
+ rbac::RBACPermissionContainer const& defaultPermissions = sAccountMgr->GetRBACDefaultPermissions(command->rbac->GetSecurityLevel());
+ if (defaultPermissions.empty())
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_EMPTY));
+ else
+ {
+ for (rbac::RBACPermissionContainer::const_iterator itr = defaultPermissions.begin(); itr != defaultPermissions.end(); ++itr)
+ {
+ rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(*itr);
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+
+ delete command;
+
+ return true;
+ }
+
+ static bool HandleRBACListPermissionsCommand(ChatHandler* handler, char const* args)
+ {
+ uint32 id = 0;
+ if (char* param1 = strtok((char*)args, " "))
+ id = atoi(param1);
+
+ if (!id)
+ {
+ rbac::RBACPermissionsContainer const& permissions = sAccountMgr->GetRBACPermissionList();
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ for (rbac::RBACPermissionsContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
+ {
+ rbac::RBACPermission const* permission = it->second;
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ }
+ }
+ else
+ {
+ rbac::RBACPermission const* permission = sAccountMgr->GetRBACPermission(id);
+ if (!permission)
+ {
+ handler->PSendSysMessage(LANG_RBAC_WRONG_PARAMETER_ID, id);
+ handler->SetSentErrorMessage(true);
+ return false;
+ }
+
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMISSIONS_HEADER));
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, permission->GetId(), permission->GetName().c_str());
+ handler->PSendSysMessage("%s", handler->GetTrinityString(LANG_RBAC_LIST_PERMS_LINKED_HEADER));
+ rbac::RBACPermissionContainer const& permissions = permission->GetLinkedPermissions();
+ for (rbac::RBACPermissionContainer::const_iterator it = permissions.begin(); it != permissions.end(); ++it)
+ if (rbac::RBACPermission const* rbacPermission = sAccountMgr->GetRBACPermission(*it))
+ handler->PSendSysMessage(LANG_RBAC_LIST_ELEMENT, rbacPermission->GetId(), rbacPermission->GetName().c_str());
+ }
+
+ return true;
+ }
+};
+
+void AddSC_rbac_commandscript()
+{
+ new rbac_commandscript();
+}
diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp
index d6614255ee3..98d1b2c7192 100644
--- a/src/server/scripts/Commands/cs_ticket.cpp
+++ b/src/server/scripts/Commands/cs_ticket.cpp
@@ -168,7 +168,7 @@ public:
// Inform player, who submitted this ticket, that it is closed
if (Player* submitter = ticket->GetPlayer())
{
- WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
+ WorldPacket data(SMSG_GM_TICKET_UPDATE, 4);
data << uint32(GMTICKET_RESPONSE_TICKET_DELETED);
submitter->GetSession()->SendPacket(&data);
}
@@ -276,7 +276,7 @@ public:
if (Player* player = ticket->GetPlayer())
{
// Force abandon ticket
- WorldPacket data(SMSG_GMTICKET_DELETETICKET, 4);
+ WorldPacket data(SMSG_GM_TICKET_UPDATE, 4);
data << uint32(GMTICKET_RESPONSE_TICKET_DELETED);
player->GetSession()->SendPacket(&data);
}
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
index 726a532258d..3f93723021f 100644
--- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
+++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp
@@ -247,14 +247,11 @@ public:
DoCastAOE(SPELL_DARKNESS);
}
else
- {
- DarkFiend = false;
me->SummonCreatureGroup(CREATURE_GROUP_DARKFIENDS);
- }
events.ScheduleEvent(EVENT_DARKNESS, DarkFiend ? 3000 : 42000, 0, PHASE_ONE);
break;
case EVENT_SUMMON_HUMANOIDS:
- me->SummonCreatureGroup(CREATURE_GROUP_DARKFIENDS);
+ me->SummonCreatureGroup(CREATURE_GROUP_HUMANOIDS);
events.ScheduleEvent(EVENT_SUMMON_HUMANOIDS, 60000, 0, PHASE_ONE);
break;
case EVENT_SUMMON_SENTINEL:
diff --git a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
index 3f44de57968..88b694f742c 100644
--- a/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
+++ b/src/server/scripts/EasternKingdoms/ZulGurub/boss_mandokir.cpp
@@ -107,7 +107,16 @@ class boss_mandokir : public CreatureScript
struct boss_mandokirAI : public BossAI
{
- boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR) { }
+ boss_mandokirAI(Creature* creature) : BossAI(creature, DATA_MANDOKIR)
+ {
+ Initialize();
+ }
+
+ void Initialize()
+ {
+ _ohganotSoFast = true;
+ _reanimateOhganCooldown = false;
+ }
void Reset() override
{
@@ -116,8 +125,7 @@ class boss_mandokir : public CreatureScript
_Reset();
me->SummonCreatureGroup(SUMMON_GROUP_CHAINED_SPIRIT);
- _ohganotSoFast = true;
- _reanimateOhganCooldown = false;
+ Initialize();
_reviveGUID.Clear();
}
diff --git a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
index 3da33de01f7..ecf44db800a 100644
--- a/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
+++ b/src/server/scripts/Kalimdor/HallsOfOrigination/boss_temple_guardian_anhuur.cpp
@@ -133,22 +133,25 @@ public:
DoCastAOE(SPELL_ACTIVATE_BEACONS);
- std::list<Creature*> stalkers;
GameObject* door = ObjectAccessor::GetGameObject(*me, instance->GetGuidData(DATA_ANHUUR_DOOR));
- GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
-
- stalkers.remove_if(Trinity::HeightDifferenceCheck(door, 0.0f, false)); // Target only the bottom ones
- for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
+ if (door)
{
- if ((*itr)->GetPositionX() > door->GetPositionX())
- {
- (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_LEFT, true);
- (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_LEFT, true);
- }
- else
+ std::list<Creature*> stalkers;
+ GetCreatureListWithEntryInGrid(stalkers, me, NPC_CAVE_IN_STALKER, 100.0f);
+
+ stalkers.remove_if(Trinity::HeightDifferenceCheck(door, 0.0f, false)); // Target only the bottom ones
+ for (std::list<Creature*>::iterator itr = stalkers.begin(); itr != stalkers.end(); ++itr)
{
- (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_RIGHT, true);
- (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_RIGHT, true);
+ if ((*itr)->GetPositionX() > door->GetPositionX())
+ {
+ (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_LEFT, true);
+ (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_LEFT, true);
+ }
+ else
+ {
+ (*itr)->CastSpell((*itr), SPELL_SHIELD_VISUAL_RIGHT, true);
+ (*itr)->CastSpell((*itr), SPELL_BEAM_OF_LIGHT_RIGHT, true);
+ }
}
}
diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
index f49ed8432fb..f5457522bc4 100644
--- a/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
+++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_icecrown_gunship_battle.cpp
@@ -1777,7 +1777,7 @@ class npc_gunship_mage : public CreatureScript
but it actually is a valid flag - needs more research to fix both freezes and keep the flag as is (see WorldSession::ReadMovementInfo)
Example packet:
-ClientToServer: CMSG_FORCE_MOVE_ROOT_ACK (0x00E9) Length: 67 ConnectionIndex: 0 Time: 03/04/2010 03:57:55.000 Number: 471326
+ClientToServer: CMSG_MOVE_FORCE_ROOT_ACK (0x00E9) Length: 67 ConnectionIndex: 0 Time: 03/04/2010 03:57:55.000 Number: 471326
Guid:
Movement Counter: 80
Movement Flags: OnTransport, Root (2560)
diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
index a0ef23dc10d..2d7b90f18dc 100644
--- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
+++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_xt002.cpp
@@ -699,7 +699,7 @@ class npc_boombot : public CreatureScript
{
_boomed = true; // Prevent recursive calls
- WorldPacket data(SMSG_SPELLINSTAKILLLOG, 8+8+4);
+ WorldPacket data(SMSG_SPELL_INSTAKILL_LOG, 8+8+4);
data << me->GetGUID();
data << me->GetGUID();
data << uint32(SPELL_BOOM);
diff --git a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
index 61b202fcfeb..0bc6a4f49a4 100644
--- a/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
+++ b/src/server/scripts/Outland/BlackTemple/boss_warlord_najentus.cpp
@@ -1,215 +1,215 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "ScriptMgr.h"
-#include "ScriptedCreature.h"
-#include "black_temple.h"
-#include "Player.h"
-#include "SpellInfo.h"
-
-enum Texts
-{
- SAY_AGGRO = 0,
- SAY_NEEDLE = 1,
- SAY_SLAY = 2,
- SAY_SPECIAL = 3,
- SAY_ENRAGE = 4,
- SAY_DEATH = 5
-};
-
-enum Spells
-{
- SPELL_NEEDLE_SPINE = 39992,
- SPELL_TIDAL_BURST = 39878,
- SPELL_TIDAL_SHIELD = 39872,
- SPELL_IMPALING_SPINE = 39837,
- SPELL_CREATE_NAJENTUS_SPINE = 39956,
- SPELL_HURL_SPINE = 39948,
- SPELL_BERSERK = 26662
-
-};
-
-enum Events
-{
- EVENT_BERSERK = 1,
- EVENT_YELL = 2,
- EVENT_NEEDLE = 3,
- EVENT_SPINE = 4,
- EVENT_SHIELD = 5
-};
-
-enum EventGroups
-{
- GCD_CAST = 1,
- GCD_YELL = 2
-};
-
-class boss_najentus : public CreatureScript
-{
-public:
- boss_najentus() : CreatureScript("boss_najentus") { }
-
- struct boss_najentusAI : public BossAI
- {
- boss_najentusAI(Creature* creature) : BossAI(creature, DATA_HIGH_WARLORD_NAJENTUS)
- {
- }
-
- void Reset() override
- {
- _Reset();
- SpineTargetGUID.Clear();
- }
-
- void KilledUnit(Unit* /*victim*/) override
- {
- Talk(SAY_SLAY);
- events.DelayEvents(5000, GCD_YELL);
- }
-
- void JustDied(Unit* /*killer*/) override
- {
- _JustDied();
- Talk(SAY_DEATH);
- }
-
- void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override
- {
- if (spell->Id == SPELL_HURL_SPINE && me->HasAura(SPELL_TIDAL_SHIELD))
- {
- me->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);
- DoCast(me, SPELL_TIDAL_BURST, true);
- ResetTimer();
- }
- }
-
- void EnterCombat(Unit* /*who*/) override
- {
- _EnterCombat();
- Talk(SAY_AGGRO);
- events.ScheduleEvent(EVENT_BERSERK, 480000, GCD_CAST);
- events.ScheduleEvent(EVENT_YELL, 45000 + (rand32() % 76) * 1000, GCD_YELL);
- ResetTimer();
- }
-
- bool RemoveImpalingSpine()
- {
- if (!SpineTargetGUID)
- return false;
-
- Unit* target = ObjectAccessor::GetUnit(*me, SpineTargetGUID);
- if (target && target->HasAura(SPELL_IMPALING_SPINE))
- target->RemoveAurasDueToSpell(SPELL_IMPALING_SPINE);
- SpineTargetGUID.Clear();
- return true;
- }
-
- void ResetTimer(uint32 inc = 0)
- {
- events.RescheduleEvent(EVENT_NEEDLE, 10000 + inc, GCD_CAST);
- events.RescheduleEvent(EVENT_SPINE, 20000 + inc, GCD_CAST);
- events.RescheduleEvent(EVENT_SHIELD, 60000 + inc);
- }
-
- void ExecuteEvent(uint32 eventId) override
- {
- switch (eventId)
- {
- case EVENT_SHIELD:
- DoCast(me, SPELL_TIDAL_SHIELD, true);
- ResetTimer(45000);
- break;
- case EVENT_BERSERK:
- Talk(SAY_ENRAGE);
- DoCast(me, SPELL_BERSERK, true);
- events.DelayEvents(15000, GCD_YELL);
- break;
- case EVENT_SPINE:
- {
- Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
-
- if (!target)
- target = me->GetVictim();
-
- if (target)
- {
- DoCast(target, SPELL_IMPALING_SPINE, true);
- SpineTargetGUID = target->GetGUID();
- //must let target summon, otherwise you cannot click the spine
- target->SummonGameObject(GO_NAJENTUS_SPINE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 30);
- Talk(SAY_NEEDLE);
- events.DelayEvents(1500, GCD_CAST);
- events.DelayEvents(15000, GCD_YELL);
- }
- events.ScheduleEvent(EVENT_SPINE, 21000, GCD_CAST);
- return;
- }
- case EVENT_NEEDLE:
- {
- //DoCast(me, SPELL_NEEDLE_SPINE, true);
- std::list<Unit*> targets;
- SelectTargetList(targets, 3, SELECT_TARGET_RANDOM, 80, true);
- for (std::list<Unit*>::const_iterator i = targets.begin(); i != targets.end(); ++i)
- DoCast(*i, 39835, true);
- events.ScheduleEvent(EVENT_NEEDLE, urand(15000, 25000), GCD_CAST);
- events.DelayEvents(1500, GCD_CAST);
- return;
- }
- case EVENT_YELL:
- Talk(SAY_SPECIAL);
- events.ScheduleEvent(EVENT_YELL, urand(25000, 100000), GCD_YELL);
- events.DelayEvents(15000, GCD_YELL);
- break;
- default:
- break;
- }
- }
-
- private:
- ObjectGuid SpineTargetGUID;
- };
-
- CreatureAI* GetAI(Creature* creature) const override
- {
- return GetBlackTempleAI<boss_najentusAI>(creature);
- }
-};
-
-class go_najentus_spine : public GameObjectScript
-{
-public:
- go_najentus_spine() : GameObjectScript("go_najentus_spine") { }
-
- bool OnGossipHello(Player* player, GameObject* go) override
- {
- if (InstanceScript* instance = go->GetInstanceScript())
- if (Creature* Najentus = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_HIGH_WARLORD_NAJENTUS)))
- if (ENSURE_AI(boss_najentus::boss_najentusAI, Najentus->AI())->RemoveImpalingSpine())
- {
- player->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
- go->Delete();
- }
- return true;
- }
-
-};
-
-void AddSC_boss_najentus()
-{
- new boss_najentus();
- new go_najentus_spine();
-}
+/*
+ * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
+ *
+ * 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 "ScriptMgr.h"
+#include "ScriptedCreature.h"
+#include "black_temple.h"
+#include "Player.h"
+#include "SpellInfo.h"
+
+enum Texts
+{
+ SAY_AGGRO = 0,
+ SAY_NEEDLE = 1,
+ SAY_SLAY = 2,
+ SAY_SPECIAL = 3,
+ SAY_ENRAGE = 4,
+ SAY_DEATH = 5
+};
+
+enum Spells
+{
+ SPELL_NEEDLE_SPINE = 39992,
+ SPELL_TIDAL_BURST = 39878,
+ SPELL_TIDAL_SHIELD = 39872,
+ SPELL_IMPALING_SPINE = 39837,
+ SPELL_CREATE_NAJENTUS_SPINE = 39956,
+ SPELL_HURL_SPINE = 39948,
+ SPELL_BERSERK = 26662
+
+};
+
+enum Events
+{
+ EVENT_BERSERK = 1,
+ EVENT_YELL = 2,
+ EVENT_NEEDLE = 3,
+ EVENT_SPINE = 4,
+ EVENT_SHIELD = 5
+};
+
+enum EventGroups
+{
+ GCD_CAST = 1,
+ GCD_YELL = 2
+};
+
+class boss_najentus : public CreatureScript
+{
+public:
+ boss_najentus() : CreatureScript("boss_najentus") { }
+
+ struct boss_najentusAI : public BossAI
+ {
+ boss_najentusAI(Creature* creature) : BossAI(creature, DATA_HIGH_WARLORD_NAJENTUS)
+ {
+ }
+
+ void Reset() override
+ {
+ _Reset();
+ SpineTargetGUID.Clear();
+ }
+
+ void KilledUnit(Unit* /*victim*/) override
+ {
+ Talk(SAY_SLAY);
+ events.DelayEvents(5000, GCD_YELL);
+ }
+
+ void JustDied(Unit* /*killer*/) override
+ {
+ _JustDied();
+ Talk(SAY_DEATH);
+ }
+
+ void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override
+ {
+ if (spell->Id == SPELL_HURL_SPINE && me->HasAura(SPELL_TIDAL_SHIELD))
+ {
+ me->RemoveAurasDueToSpell(SPELL_TIDAL_SHIELD);
+ DoCast(me, SPELL_TIDAL_BURST, true);
+ ResetTimer();
+ }
+ }
+
+ void EnterCombat(Unit* /*who*/) override
+ {
+ _EnterCombat();
+ Talk(SAY_AGGRO);
+ events.ScheduleEvent(EVENT_BERSERK, 480000, GCD_CAST);
+ events.ScheduleEvent(EVENT_YELL, 45000 + (rand32() % 76) * 1000, GCD_YELL);
+ ResetTimer();
+ }
+
+ bool RemoveImpalingSpine()
+ {
+ if (!SpineTargetGUID)
+ return false;
+
+ Unit* target = ObjectAccessor::GetUnit(*me, SpineTargetGUID);
+ if (target && target->HasAura(SPELL_IMPALING_SPINE))
+ target->RemoveAurasDueToSpell(SPELL_IMPALING_SPINE);
+ SpineTargetGUID.Clear();
+ return true;
+ }
+
+ void ResetTimer(uint32 inc = 0)
+ {
+ events.RescheduleEvent(EVENT_NEEDLE, 10000 + inc, GCD_CAST);
+ events.RescheduleEvent(EVENT_SPINE, 20000 + inc, GCD_CAST);
+ events.RescheduleEvent(EVENT_SHIELD, 60000 + inc);
+ }
+
+ void ExecuteEvent(uint32 eventId) override
+ {
+ switch (eventId)
+ {
+ case EVENT_SHIELD:
+ DoCast(me, SPELL_TIDAL_SHIELD, true);
+ ResetTimer(45000);
+ break;
+ case EVENT_BERSERK:
+ Talk(SAY_ENRAGE);
+ DoCast(me, SPELL_BERSERK, true);
+ events.DelayEvents(15000, GCD_YELL);
+ break;
+ case EVENT_SPINE:
+ {
+ Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 1);
+
+ if (!target)
+ target = me->GetVictim();
+
+ if (target)
+ {
+ DoCast(target, SPELL_IMPALING_SPINE, true);
+ SpineTargetGUID = target->GetGUID();
+ //must let target summon, otherwise you cannot click the spine
+ target->SummonGameObject(GO_NAJENTUS_SPINE, target->GetPositionX(), target->GetPositionY(), target->GetPositionZ(), me->GetOrientation(), 0, 0, 0, 0, 30);
+ Talk(SAY_NEEDLE);
+ events.DelayEvents(1500, GCD_CAST);
+ events.DelayEvents(15000, GCD_YELL);
+ }
+ events.ScheduleEvent(EVENT_SPINE, 21000, GCD_CAST);
+ return;
+ }
+ case EVENT_NEEDLE:
+ {
+ //DoCast(me, SPELL_NEEDLE_SPINE, true);
+ std::list<Unit*> targets;
+ SelectTargetList(targets, 3, SELECT_TARGET_RANDOM, 80, true);
+ for (std::list<Unit*>::const_iterator i = targets.begin(); i != targets.end(); ++i)
+ DoCast(*i, 39835, true);
+ events.ScheduleEvent(EVENT_NEEDLE, urand(15000, 25000), GCD_CAST);
+ events.DelayEvents(1500, GCD_CAST);
+ return;
+ }
+ case EVENT_YELL:
+ Talk(SAY_SPECIAL);
+ events.ScheduleEvent(EVENT_YELL, urand(25000, 100000), GCD_YELL);
+ events.DelayEvents(15000, GCD_YELL);
+ break;
+ default:
+ break;
+ }
+ }
+
+ private:
+ ObjectGuid SpineTargetGUID;
+ };
+
+ CreatureAI* GetAI(Creature* creature) const override
+ {
+ return GetBlackTempleAI<boss_najentusAI>(creature);
+ }
+};
+
+class go_najentus_spine : public GameObjectScript
+{
+public:
+ go_najentus_spine() : GameObjectScript("go_najentus_spine") { }
+
+ bool OnGossipHello(Player* player, GameObject* go) override
+ {
+ if (InstanceScript* instance = go->GetInstanceScript())
+ if (Creature* Najentus = ObjectAccessor::GetCreature(*go, instance->GetGuidData(DATA_HIGH_WARLORD_NAJENTUS)))
+ if (ENSURE_AI(boss_najentus::boss_najentusAI, Najentus->AI())->RemoveImpalingSpine())
+ {
+ player->CastSpell(player, SPELL_CREATE_NAJENTUS_SPINE, true);
+ go->Delete();
+ }
+ return true;
+ }
+
+};
+
+void AddSC_boss_najentus()
+{
+ new boss_najentus();
+ new go_najentus_spine();
+}
diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
index 2750476db76..096777163a6 100644
--- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
+++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_lurker_below.cpp
@@ -280,7 +280,7 @@ public:
Map::PlayerList const &PlayerList = map->GetPlayers();
for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i)
{
- if (i->GetSource() && i->GetSource()->IsAlive() && me->HasInArc(float(diff/20000*M_PI*2), i->GetSource()) && me->IsWithinDist(i->GetSource(), SPOUT_DIST) && !i->GetSource()->IsInWater())
+ if (i->GetSource() && i->GetSource()->IsAlive() && me->HasInArc(diff/20000.f*float(M_PI)*2.f, i->GetSource()) && me->IsWithinDist(i->GetSource(), SPOUT_DIST) && !i->GetSource()->IsInWater())
DoCast(i->GetSource(), SPELL_SPOUT, true); // only knock back players in arc, in 100yards, not in water
}
}
diff --git a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
index 3951b0eadf6..a6c00c05dce 100644
--- a/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
+++ b/src/server/scripts/Outland/HellfireCitadel/HellfireRamparts/boss_vazruden_the_herald.cpp
@@ -86,6 +86,7 @@ class boss_nazan : public CreatureScript
void Reset() override
{
Initialize();
+ _Reset();
}
void EnterCombat(Unit* /*who*/) override { }
diff --git a/src/server/scripts/Spells/spell_dk.cpp b/src/server/scripts/Spells/spell_dk.cpp
index 96ced5c7017..00071c4804e 100644
--- a/src/server/scripts/Spells/spell_dk.cpp
+++ b/src/server/scripts/Spells/spell_dk.cpp
@@ -87,7 +87,7 @@ class spell_dk_anti_magic_shell : public SpellScriptLoader
PrepareAuraScript(spell_dk_anti_magic_shell_AuraScript);
public:
- spell_dk_anti_magic_shell_AuraScript()
+ spell_dk_anti_magic_shell_AuraScript()
{
absorbPct = 0;
maxHealth = 0;
diff --git a/src/server/scripts/Spells/spell_warrior.cpp b/src/server/scripts/Spells/spell_warrior.cpp
index f696fffb2ea..b3caff679df 100644
--- a/src/server/scripts/Spells/spell_warrior.cpp
+++ b/src/server/scripts/Spells/spell_warrior.cpp
@@ -853,6 +853,13 @@ class spell_warr_vigilance : public SpellScriptLoader
{
PrepareAuraScript(spell_warr_vigilance_AuraScript);
+ public:
+ spell_warr_vigilance_AuraScript()
+ {
+ _procTarget = nullptr;
+ }
+
+ private:
bool Validate(SpellInfo const* /*spellInfo*/) override
{
if (!sSpellMgr->GetSpellInfo(SPELL_WARRIOR_VENGEANCE))
diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp
index 928ee5e8e91..75cb01d00cd 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.cpp
+++ b/src/server/shared/DataStores/DB2StorageLoader.cpp
@@ -25,8 +25,22 @@
DB2FileLoader::DB2FileLoader()
{
- data = NULL;
+ recordSize = 0;
+ recordCount = 0;
+ fieldCount = 0;
+ stringSize = 0;
fieldsOffset = NULL;
+ data = NULL;
+ stringTable = NULL;
+
+ tableHash = 0;
+ build = 0;
+
+ unk1 = 0;
+ minIndex = 0;
+ maxIndex = 0;
+ locale = 0;
+ unk5 = 0;
}
bool DB2FileLoader::Load(const char *filename, const char *fmt)
@@ -419,20 +433,17 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
if (!result)
return nullptr;
- // we store flat holders pool as single memory block
- size_t stringFields = DB2FileLoader::GetFormatStringFieldCount(format);
-
- size_t expectedFields = strlen(format) + 1 /*VerifiedBuild*/;
- if (stringFields)
- expectedFields += 1 /*ID*/ + stringFields * (TOTAL_LOCALES - 1) + 1 /*VerifiedBuild in locale table*/;
-
- if (expectedFields != result->GetFieldCount())
+ uint32 const fieldCount = strlen(format);
+ if (fieldCount + 1 /*VerifiedBuild*/ != result->GetFieldCount())
return nullptr;
- //get struct size and index pos
+ // get struct size and index pos
int32 indexField;
uint32 recordSize = DB2FileLoader::GetFormatRecordSize(format, &indexField);
+ // we store flat holders pool as single memory block
+ size_t stringFields = DB2FileLoader::GetFormatStringFieldCount(format);
+
// each string field at load have array of string for each locale
size_t stringHolderSize = sizeof(char*) * TOTAL_LOCALES;
size_t stringHoldersRecordPoolSize = stringFields * stringHolderSize;
@@ -445,65 +456,83 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
// DB2 strings expected to have at least empty string
for (size_t i = 0; i < stringHoldersPoolSize / sizeof(char*); ++i)
((char const**)stringHolders)[i] = nullStr;
-
}
else
stringHolders = nullptr;
- std::unordered_map<uint32, char*> tempIndexTable;
- tempIndexTable.reserve(result->GetRowCount());
- char* dataTable = new char[result->GetRowCount() * recordSize];
- uint32 offset = 0;
+ // Resize index table
+ // database query *MUST* contain ORDER BY `index_field` DESC clause
+ uint32 indexTableSize;
+ if (indexField >= 0)
+ {
+ indexTableSize = (*result)[indexField].GetUInt32() + 1;
+ if (indexTableSize < records)
+ indexTableSize = records;
+ }
+ else
+ indexTableSize = records + result->GetRowCount();
- uint32 const fieldCount = strlen(format);
- uint32 const localeFieldsOffset = fieldCount + 2 /*VerifiedBuild in main table, ID in locale table*/;
- uint32 oldIndexSize = records;
+ if (indexTableSize > records)
+ {
+ char** tmpIdxTable = new char*[indexTableSize];
+ memset(tmpIdxTable, 0, indexTableSize * sizeof(char*));
+ memcpy(tmpIdxTable, indexTable, records * sizeof(char*));
+ delete[] indexTable;
+ indexTable = tmpIdxTable;
+ }
+
+ char* tempDataTable = new char[result->GetRowCount() * recordSize];
+ uint32* newIndexes = new uint32[result->GetRowCount()];
uint32 rec = 0;
+ uint32 newRecords = 0;
+
do
{
Field* fields = result->Fetch();
+ uint32 offset = 0;
uint32 stringFieldNumInRecord = 0;
+ uint32 indexValue;
if (indexField >= 0)
+ indexValue = fields[indexField].GetUInt32();
+ else
+ indexValue = records + rec;
+
+ // Attempt to overwrite existing data
+ char* dataValue = indexTable[indexValue];
+ if (!dataValue)
{
- uint32 indexValue = fields[indexField].GetUInt32();
- tempIndexTable[indexValue] = &dataTable[offset];
- if (records <= indexValue)
- records = indexValue + 1;
+ newIndexes[newRecords] = indexValue;
+ dataValue = &tempDataTable[newRecords++ * recordSize];
}
- else
- tempIndexTable[records++] = &dataTable[offset];
for (uint32 f = 0; f < fieldCount; f++)
{
switch (format[f])
{
case FT_FLOAT:
- *((float*)(&dataTable[offset])) = fields[f].GetFloat();
+ *((float*)(&dataValue[offset])) = fields[f].GetFloat();
offset += 4;
break;
case FT_IND:
case FT_INT:
- *((int32*)(&dataTable[offset])) = fields[f].GetInt32();
+ *((int32*)(&dataValue[offset])) = fields[f].GetInt32();
offset += 4;
break;
case FT_BYTE:
- *((int8*)(&dataTable[offset])) = fields[f].GetInt8();
+ *((int8*)(&dataValue[offset])) = fields[f].GetInt8();
offset += 1;
break;
case FT_STRING:
{
- LocalizedString** slot = (LocalizedString**)(&dataTable[offset]);
+ LocalizedString** slot = (LocalizedString**)(&dataValue[offset]);
*slot = (LocalizedString*)(&stringHolders[stringHoldersRecordPoolSize * rec + stringHolderSize * stringFieldNumInRecord]);
+ ASSERT(*slot);
// Value in database in main table field must be for enUS locale
if (char* str = AddLocaleString(*slot, LOCALE_enUS, fields[f].GetString()))
stringPool.push_back(str);
- for (uint32 locale = LOCALE_koKR; locale < TOTAL_LOCALES; ++locale)
- if (char* str = AddLocaleString(*slot, locale, fields[localeFieldsOffset + (locale - 1) + stringFields * stringFieldNumInRecord].GetString()))
- stringPool.push_back(str);
-
++stringFieldNumInRecord;
offset += sizeof(char*);
break;
@@ -511,30 +540,104 @@ char* DB2DatabaseLoader::Load(const char* format, int32 preparedStatement, uint3
}
}
+ ASSERT(offset == recordSize);
++rec;
} while (result->NextRow());
- // Reallocate index if needed
- if (records > oldIndexSize)
+ if (!newRecords)
{
- char** tmpIdxTable = new char*[records];
- memset(tmpIdxTable, 0, records * sizeof(char*));
- memcpy(tmpIdxTable, indexTable, oldIndexSize * sizeof(char*));
- delete[] indexTable;
- indexTable = tmpIdxTable;
+ delete[] tempDataTable;
+ delete[] newIndexes;
+ return nullptr;
}
- // Merge new data into index
- for (auto itr = tempIndexTable.begin(); itr != tempIndexTable.end(); ++itr)
- indexTable[itr->first] = itr->second;
+ // Compact new data table to only contain new records not previously loaded from file
+ char* dataTable = new char[newRecords * recordSize];
+ memcpy(dataTable, tempDataTable, newRecords * recordSize);
+
+ // insert new records to index table
+ for (uint32 i = 0; i < newRecords; ++i)
+ indexTable[newIndexes[i]] = &dataTable[i * recordSize];
+
+ delete[] tempDataTable;
+ delete[] newIndexes;
+
+ records = indexTableSize;
return dataTable;
}
+void DB2DatabaseLoader::LoadStrings(const char* format, int32 preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool)
+{
+ PreparedQueryResult result = HotfixDatabase.Query(HotfixDatabase.GetPreparedStatement(preparedStatement));
+ if (!result)
+ return;
+
+ size_t stringFields = DB2FileLoader::GetFormatStringFieldCount(format);
+ if (result->GetFieldCount() != stringFields + 1 /*ID*/)
+ return;
+
+ uint32 const fieldCount = strlen(format);
+ int32 indexField;
+ uint32 recordSize = DB2FileLoader::GetFormatRecordSize(format, &indexField);
+ ASSERT(indexField >= 0, "DB2Storage must be indexed to load localized strings");
+
+ do
+ {
+ Field* fields = result->Fetch();
+ uint32 offset = 0;
+ uint32 stringFieldNumInRecord = 0;
+ uint32 indexValue = fields[0].GetUInt32();
+
+ // Attempt to overwrite existing data
+ char* dataValue = indexTable[indexValue];
+ for (uint32 x = 0; x < fieldCount; x++)
+ {
+ switch (format[x])
+ {
+ case FT_FLOAT:
+ case FT_IND:
+ case FT_INT:
+ offset += 4;
+ break;
+ case FT_BYTE:
+ offset += 1;
+ break;
+ case FT_STRING:
+ {
+ // fill only not filled entries
+ LocalizedString* db2str = *(LocalizedString**)(&dataValue[offset]);
+ if (db2str->Str[locale] == nullStr)
+ if (char* str = AddLocaleString(db2str, locale, fields[1 + stringFieldNumInRecord].GetString()))
+ stringPool.push_back(str);
+
+ ++stringFieldNumInRecord;
+ offset += sizeof(char*);
+ break;
+ }
+ }
+ }
+
+ ASSERT(offset == recordSize);
+ } while (result->NextRow());
+
+ return;
+}
+
char* DB2DatabaseLoader::AddLocaleString(LocalizedString* holder, uint32 locale, std::string const& value)
{
if (!value.empty())
{
+ std::size_t existingLength = strlen(holder->Str[locale]);
+ if (existingLength >= value.length())
+ {
+ // Reuse existing storage if there is enough space
+ char* str = const_cast<char*>(holder->Str[locale]);
+ memcpy(str, value.c_str(), value.length());
+ str[value.length()] = '\0';
+ return nullptr;
+ }
+
char* str = new char[value.length() + 1];
memcpy(str, value.c_str(), value.length());
str[value.length()] = '\0';
diff --git a/src/server/shared/DataStores/DB2StorageLoader.h b/src/server/shared/DataStores/DB2StorageLoader.h
index 0bd8c8a9403..1282dad3a9c 100644
--- a/src/server/shared/DataStores/DB2StorageLoader.h
+++ b/src/server/shared/DataStores/DB2StorageLoader.h
@@ -109,8 +109,8 @@ private:
class DB2DatabaseLoader
{
public:
-
char* Load(const char* format, int32 preparedStatement, uint32& records, char**& indexTable, char*& stringHolders, std::list<char*>& stringPool);
+ void LoadStrings(const char* format, int32 preparedStatement, uint32 locale, char**& indexTable, std::list<char*>& stringPool);
static char* AddLocaleString(LocalizedString* holder, uint32 locale, std::string const& value);
};
diff --git a/src/server/shared/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h
index 9204d68754b..c4ca929065b 100644
--- a/src/server/shared/DataStores/DB2Store.h
+++ b/src/server/shared/DataStores/DB2Store.h
@@ -142,7 +142,8 @@ public:
m_stringPoolList.push_back(stringHolders);
// load strings from db2 data
- m_stringPoolList.push_back(db2.AutoProduceStrings(fmt, (char*)m_dataTable, locale));
+ if (char* stringBlock = db2.AutoProduceStrings(fmt, (char*)m_dataTable, locale))
+ m_stringPoolList.push_back(stringBlock);
}
// error in db2 file at loading if NULL
@@ -162,24 +163,33 @@ public:
// load strings from another locale db2 data
if (DB2FileLoader::GetFormatStringFieldCount(fmt))
- m_stringPoolList.push_back(db2.AutoProduceStrings(fmt, (char*)m_dataTable, locale));
-
+ if (char* stringBlock = db2.AutoProduceStrings(fmt, (char*)m_dataTable, locale))
+ m_stringPoolList.push_back(stringBlock);
return true;
}
- void LoadSQLData()
+ void LoadFromDB()
{
if (_hotfixStatement == -1)
return;
- DB2DatabaseLoader db2;
char* extraStringHolders = nullptr;
- if (char* dataTable = db2.Load(fmt, _hotfixStatement, nCount, indexTable.asChar, extraStringHolders, m_stringPoolList))
- {
+ if (char* dataTable = DB2DatabaseLoader().Load(fmt, _hotfixStatement, nCount, indexTable.asChar, extraStringHolders, m_stringPoolList))
m_dataTableEx = reinterpret_cast<T*>(dataTable);
- if (extraStringHolders)
- m_stringPoolList.push_back(extraStringHolders);
- }
+
+ if (extraStringHolders)
+ m_stringPoolList.push_back(extraStringHolders);
+ }
+
+ void LoadStringsFromDB(uint32 locale)
+ {
+ if (_hotfixStatement == -1)
+ return;
+
+ if (!DB2FileLoader::GetFormatStringFieldCount(fmt))
+ return;
+
+ DB2DatabaseLoader().LoadStrings(fmt, _hotfixStatement + locale, locale, indexTable.asChar, m_stringPoolList);
}
void Clear()
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
index 5e914391bd9..9d7a09702eb 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp
@@ -79,8 +79,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH);
PrepareStatement(CHAR_SEL_CHARACTER_INSTANCE, "SELECT id, permanent, map, difficulty, resettime FROM character_instance LEFT JOIN instance ON instance = id WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_SEL_CHARACTER_AURAS, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, "
- "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_AURAS, "SELECT casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_AURA_EFFECTS, "SELECT casterGuid, itemGuid, spell, effectMask, effectIndex, amount, baseAmount FROM character_aura_effect WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_SPELL, "SELECT spell, active, disabled FROM character_spell WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS, "SELECT quest, status, timer FROM character_queststatus WHERE guid = ? AND status <> 0", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_QUESTSTATUS_OBJECTIVES, "SELECT quest, objective, data FROM character_queststatus_objectives WHERE guid = ?", CONNECTION_ASYNC);
@@ -260,8 +260,10 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_EQUIP_SET, "DELETE FROM character_equipmentsets WHERE setguid=?", CONNECTION_ASYNC);
// Auras
- PrepareStatement(CHAR_INS_AURA, "INSERT INTO character_aura (guid, caster_guid, item_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) "
- "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_AURA, "INSERT INTO character_aura (guid, casterGuid, itemGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_AURA_EFFECT, "INSERT INTO character_aura_effect (guid, casterGuid, itemGuid, spell, effectMask, effectIndex, amount, baseAmount) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
// Currency
PrepareStatement(CHAR_SEL_PLAYER_CURRENCY, "SELECT Currency, Quantity, WeeklyQuantity, TrackedQuantity, Flags FROM character_currency WHERE CharacterGuid = ?", CONNECTION_ASYNC);
@@ -434,7 +436,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_CHARACTER_SOCIAL, "DELETE FROM character_social WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHARACTER_SOCIAL_NOTE, "UPDATE character_social SET note = ? WHERE guid = ? AND friend = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_UPD_CHARACTER_POSITION, "UPDATE characters SET position_x = ?, position_y = ?, position_z = ?, orientation = ?, map = ?, zone = ?, trans_x = 0, trans_y = 0, trans_z = 0, transguid = 0, taxi_path = '' WHERE guid = ?", CONNECTION_ASYNC);
- PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remaintime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_CHARACTER_AURA_FROZEN, "SELECT characters.name, character_aura.remainTime FROM characters LEFT JOIN character_aura ON (characters.guid = character_aura.guid) WHERE character_aura.spell = 9454", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHARACTER_ONLINE, "SELECT name, account, map, zone FROM characters WHERE online > 0", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_GUID, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND guid = ?", CONNECTION_BOTH);
PrepareStatement(CHAR_SEL_CHAR_DEL_INFO_BY_NAME, "SELECT guid, deleteInfos_Name, deleteInfos_Account, deleteDate FROM characters WHERE deleteDate IS NOT NULL AND deleteInfos_Name LIKE CONCAT('%%', ?, '%%')", CONNECTION_SYNCH);
@@ -517,6 +519,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_CHARACTER, "DELETE FROM characters WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_ACTION, "DELETE FROM character_action WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_AURA, "DELETE FROM character_aura WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_DEL_CHAR_AURA_EFFECT, "DELETE FROM character_aura_effect WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_GIFT, "DELETE FROM character_gifts WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_INSTANCE, "DELETE FROM character_instance WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_INVENTORY, "DELETE FROM character_inventory WHERE guid = ?", CONNECTION_ASYNC);
@@ -608,18 +611,22 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME_BY_OWNER, "DELETE FROM character_pet_declinedname WHERE owner = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CHAR_PET_DECLINEDNAME, "DELETE FROM character_pet_declinedname WHERE id = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_CHAR_PET_DECLINEDNAME, "INSERT INTO character_pet_declinedname (id, owner, genitive, dative, accusative, instrumental, prepositional) VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
- PrepareStatement(CHAR_SEL_PET_AURA, "SELECT caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PET_AURA, "SELECT casterGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges FROM pet_aura WHERE guid = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_SEL_PET_AURA_EFFECT, "SELECT casterGuid, spell, effectMask, effectIndex, amount, baseAmount FROM pet_aura_effect WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_PET_SPELL, "SELECT spell, active FROM pet_spell WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_PET_SPELL_COOLDOWN, "SELECT spell, time FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_PET_DECLINED_NAME, "SELECT genitive, dative, accusative, instrumental, prepositional FROM character_pet_declinedname WHERE owner = ? AND id = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_DEL_PET_AURAS, "DELETE FROM pet_aura WHERE guid = ?", CONNECTION_BOTH);
+ PrepareStatement(CHAR_DEL_PET_AURA_EFFECTS, "DELETE FROM pet_aura_effect WHERE guid = ?", CONNECTION_BOTH);
PrepareStatement(CHAR_DEL_PET_SPELLS, "DELETE FROM pet_spell WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_PET_SPELL_COOLDOWNS, "DELETE FROM pet_spell_cooldown WHERE guid = ?", CONNECTION_BOTH);
PrepareStatement(CHAR_INS_PET_SPELL_COOLDOWN, "INSERT INTO pet_spell_cooldown (guid, spell, time) VALUES (?, ?, ?)", CONNECTION_BOTH);
PrepareStatement(CHAR_DEL_PET_SPELL_BY_SPELL, "DELETE FROM pet_spell WHERE guid = ? and spell = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_INS_PET_SPELL, "INSERT INTO pet_spell (guid, spell, active) VALUES (?, ?, ?)", CONNECTION_BOTH);
- PrepareStatement(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, caster_guid, spell, effect_mask, recalculate_mask, stackcount, amount0, amount1, amount2, "
- "base_amount0, base_amount1, base_amount2, maxduration, remaintime, remaincharges) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_BOTH);
+ PrepareStatement(CHAR_INS_PET_AURA, "INSERT INTO pet_aura (guid, casterGuid, spell, effectMask, recalculateMask, stackCount, maxDuration, remainTime, remainCharges) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_BOTH);
+ PrepareStatement(CHAR_INS_PET_AURA_EFFECT, "INSERT INTO pet_aura_effect (guid, casterGuid, spell, effectMask, effectIndex, amount, baseAmount) "
+ "VALUES (?, ?, ?, ?, ?, ?, ?)", CONNECTION_BOTH);
PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND id = ?", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_2, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND entry = ? AND (slot = ? OR slot > ?)", CONNECTION_SYNCH);
PrepareStatement(CHAR_SEL_CHAR_PET_BY_SLOT, "SELECT id, entry, owner, modelid, level, exp, Reactstate, slot, name, renamed, curhealth, curmana, abdata, savetime, CreatedBySpell, PetType FROM character_pet WHERE owner = ? AND (slot = ? OR slot > ?) ", CONNECTION_SYNCH);
diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h
index 81665743c8a..3dee607da48 100644
--- a/src/server/shared/Database/Implementation/CharacterDatabase.h
+++ b/src/server/shared/Database/Implementation/CharacterDatabase.h
@@ -79,6 +79,7 @@ enum CharacterDatabaseStatements
CHAR_SEL_GROUP_MEMBER,
CHAR_SEL_CHARACTER_INSTANCE,
CHAR_SEL_CHARACTER_AURAS,
+ CHAR_SEL_CHARACTER_AURA_EFFECTS,
CHAR_SEL_CHARACTER_SPELL,
CHAR_SEL_CHARACTER_QUESTSTATUS,
@@ -228,6 +229,7 @@ enum CharacterDatabaseStatements
CHAR_DEL_EQUIP_SET,
CHAR_INS_AURA,
+ CHAR_INS_AURA_EFFECT,
CHAR_SEL_PLAYER_CURRENCY,
CHAR_UPD_PLAYER_CURRENCY,
@@ -448,6 +450,7 @@ enum CharacterDatabaseStatements
CHAR_DEL_CHARACTER,
CHAR_DEL_CHAR_ACTION,
CHAR_DEL_CHAR_AURA,
+ CHAR_DEL_CHAR_AURA_EFFECT,
CHAR_DEL_CHAR_GIFT,
CHAR_DEL_CHAR_INSTANCE,
CHAR_DEL_CHAR_INVENTORY,
@@ -514,15 +517,18 @@ enum CharacterDatabaseStatements
CHAR_DEL_CALENDAR_INVITE,
CHAR_SEL_PET_AURA,
+ CHAR_SEL_PET_AURA_EFFECT,
CHAR_SEL_PET_SPELL,
CHAR_SEL_PET_SPELL_COOLDOWN,
CHAR_SEL_PET_DECLINED_NAME,
CHAR_DEL_PET_AURAS,
+ CHAR_DEL_PET_AURA_EFFECTS,
CHAR_DEL_PET_SPELL_COOLDOWNS,
CHAR_INS_PET_SPELL_COOLDOWN,
CHAR_DEL_PET_SPELL_BY_SPELL,
CHAR_INS_PET_SPELL,
CHAR_INS_PET_AURA,
+ CHAR_INS_PET_AURA_EFFECT,
CHAR_DEL_PET_SPELLS,
CHAR_DEL_CHAR_PET_BY_OWNER,
diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.cpp b/src/server/shared/Database/Implementation/HotfixDatabase.cpp
index a41c037e848..2003433ec40 100644
--- a/src/server/shared/Database/Implementation/HotfixDatabase.cpp
+++ b/src/server/shared/Database/Implementation/HotfixDatabase.cpp
@@ -16,12 +16,52 @@
*/
#include "HotfixDatabase.h"
+#include "Util.h"
+
+/*
+ Hotfix database statements are constructed in a special way
+ Each db2 storage that contains localized string data
+ must declare a prepared statement for each locale in the same order as
+ locales are defined (enforced during compilation)
+
+ '@' character is replaced with locale index for PrepareStatement call
+*/
+
+// Force locale statments to appear exactly in locale declaration order, right after normal data fetch statement
+#define PREPARE_LOCALE_STMT(stmtBase, loc, sql, con) \
+ static_assert(stmtBase + loc == stmtBase##_##loc, "Invalid prepared statement index for " STRINGIZE(stmtBase##_##loc)); \
+ PrepareLocaleStatement(stmtBase##_##loc, loc, sql, con);
+
+#define PREPARE_LOCALE_STMTS(stmtBase, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_koKR, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_frFR, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_deDE, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_zhCN, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_zhTW, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_esES, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_esMX, sql, con) \
+ PREPARE_LOCALE_STMT(stmtBase, LOCALE_ruRU, sql, con)
void HotfixDatabaseConnection::DoPrepareStatements()
{
if (!m_reconnecting)
m_stmts.resize(MAX_HOTFIXDATABASE_STATEMENTS);
- PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT * FROM broadcast_text b LEFT JOIN locales_broadcast_text lb ON b.ID = lb.ID", CONNECTION_SYNCH);
- PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT * FROM taxi_path_node", CONNECTION_SYNCH);
+ // BroadcastText.db2
+ PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT * FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH);
+ PREPARE_LOCALE_STMTS(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_loc@, FemaleText_loc@ FROM locales_broadcast_text", CONNECTION_SYNCH);
+
+ // TaxiPathNode.db2
+ PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT * FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH);
+}
+
+void HotfixDatabaseConnection::PrepareLocaleStatement(uint32 index, uint32 localeIndex, const char* sql, ConnectionFlags flags)
+{
+ Tokenizer tokens(sql, '@');
+ std::ostringstream stmt;
+ stmt << tokens[0];
+ for (std::size_t i = 1; i < tokens.size(); ++i)
+ stmt << localeIndex << tokens[i];
+
+ PrepareStatement(index, stmt.str().c_str(), flags);
}
diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.h b/src/server/shared/Database/Implementation/HotfixDatabase.h
index 4e434a1dad6..37234277838 100644
--- a/src/server/shared/Database/Implementation/HotfixDatabase.h
+++ b/src/server/shared/Database/Implementation/HotfixDatabase.h
@@ -30,6 +30,9 @@ class HotfixDatabaseConnection : public MySQLConnection
//- Loads database type specific prepared statements
void DoPrepareStatements() override;
+
+ private:
+ void PrepareLocaleStatement(uint32 index, uint32 localeIndex, const char* sql, ConnectionFlags flags);
};
typedef DatabaseWorkerPool<HotfixDatabaseConnection> HotfixDatabaseWorkerPool;
@@ -40,9 +43,20 @@ enum HotfixDatabaseStatements
{DB}_{SEL/INS/UPD/DEL/REP}_{Summary of data changed}
When updating more than one field, consider looking at the calling function
name for a suiting suffix.
+
+ DB2 locale loading statements must have the name of base statement with locale enum value name suffix
*/
HOTFIX_SEL_BROADCAST_TEXT,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_koKR,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_frFR,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_deDE,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_zhCN,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_zhTW,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_esES,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_esMX,
+ HOTFIX_SEL_BROADCAST_TEXT_LOCALE_ruRU,
+
HOTFIX_SEL_TAXI_PATH_NODE,
MAX_HOTFIXDATABASE_STATEMENTS
};
diff --git a/src/server/shared/Utilities/Util.cpp b/src/server/shared/Utilities/Util.cpp
index ff54237d10a..9a3d612a54b 100644
--- a/src/server/shared/Utilities/Util.cpp
+++ b/src/server/shared/Utilities/Util.cpp
@@ -24,6 +24,7 @@
#include "Errors.h" // for ASSERT
#include <stdarg.h>
#include <boost/thread/tss.hpp>
+#include <boost/algorithm/string/case_conv.hpp>
#if COMPILER == COMPILER_GNU
#include <sys/socket.h>
@@ -605,3 +606,9 @@ void HexStrToByteArray(std::string const& str, uint8* out, bool reverse /*= fals
out[j++] = strtoul(buffer, NULL, 16);
}
}
+
+bool StringToBool(std::string const& str)
+{
+ std::string lowerStr = boost::algorithm::to_lower_copy(str);
+ return lowerStr == "1" || lowerStr == "true" || lowerStr == "yes";
+}
diff --git a/src/server/shared/Utilities/Util.h b/src/server/shared/Utilities/Util.h
index 4e613ecd170..26e7ef76d04 100644
--- a/src/server/shared/Utilities/Util.h
+++ b/src/server/shared/Utilities/Util.h
@@ -370,6 +370,8 @@ uint32 CreatePIDFile(const std::string& filename);
std::string ByteArrayToHexStr(uint8 const* bytes, uint32 length, bool reverse = false);
void HexStrToByteArray(std::string const& str, uint8* out, bool reverse = false);
+bool StringToBool(std::string const& str);
+
// simple class for not-modifyable list
template <typename T>
class HookList
diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist
index 6c0820f99be..9cb25475ecf 100644
--- a/src/server/worldserver/worldserver.conf.dist
+++ b/src/server/worldserver/worldserver.conf.dist
@@ -2701,6 +2701,21 @@ Calculate.Creature.Zone.Area.Data = 0
Calculate.Gameoject.Zone.Area.Data = 0
#
+# NoGrayAggro
+# Description: Gray mobs will not aggro players above/below some levels
+# NoGrayAggro.Above: If player is at this level or above, gray mobs will not attack
+# NoGrayAggro.Below: If player is at this level or below, gray mobs will not attack
+# Example: You can for example make players free from gray until they reach level 30.
+# Then gray will start to attack them, until they reach max level (80 for example):
+# NoGrayAggro.Above = 80
+# NoGrayAggro.Below = 29
+# Default: 0 - (Blizzlike)
+#
+
+NoGrayAggro.Above = 0
+NoGrayAggro.Below = 0
+
+#
###################################################################################################
###################################################################################################
diff --git a/src/tools/CMakeLists.txt b/src/tools/CMakeLists.txt
index 812497ed179..71a2b277dd3 100644
--- a/src/tools/CMakeLists.txt
+++ b/src/tools/CMakeLists.txt
@@ -13,6 +13,3 @@ add_subdirectory(map_extractor)
add_subdirectory(vmap4_assembler)
add_subdirectory(vmap4_extractor)
add_subdirectory(mmaps_generator)
-if (WITH_MESHEXTRACTOR)
- add_subdirectory(mesh_extractor)
-endif()
diff --git a/src/tools/map_extractor/System.cpp b/src/tools/map_extractor/System.cpp
index 34362417da9..72af10067b4 100644
--- a/src/tools/map_extractor/System.cpp
+++ b/src/tools/map_extractor/System.cpp
@@ -97,8 +97,9 @@ typedef struct
map_id *map_ids;
uint16 *areas;
uint16 *LiqType;
-char output_path[128] = ".";
-char input_path[128] = ".";
+#define MAX_PATH_LENGTH 128
+char output_path[MAX_PATH_LENGTH] = ".";
+char input_path[MAX_PATH_LENGTH] = ".";
uint32 maxAreaId = 0;
// **************************************************
@@ -126,19 +127,19 @@ float CONF_flat_liquid_delta_limit = 0.001f; // If max - min less this value - l
uint32 CONF_Locale = 0;
-#define LOCALES_COUNT 18
+#define LOCALES_COUNT 17
char const* Locales[LOCALES_COUNT] =
{
- "none", "unknown1",
- "enUS", "koKR",
- "unknown2", "frFR",
- "deDE", "zhCN",
- "esES", "zhTW",
- "enGB", "enCN",
- "enTW", "esMX",
- "ruRU", "ptBR",
- "itIT", "ptPT",
+ "none", "enUS",
+ "koKR", "unknown",
+ "frFR", "deDE",
+ "zhCN", "esES",
+ "zhTW", "enGB",
+ "enCN", "enTW",
+ "esMX", "ruRU",
+ "ptBR", "itIT",
+ "ptPT"
};
void CreateDir(std::string const& path)
@@ -173,11 +174,11 @@ void Usage(char const* prg)
printf(
"Usage:\n"\
"%s -[var] [value]\n"\
- "-i set input path\n"\
- "-o set output path\n"\
+ "-i set input path (max %d characters)\n"\
+ "-o set output path (max %d characters)\n"\
"-e extract only MAP(1)/DBC(2) - standard: both(3)\n"\
"-f height stored as int (less map size but lost some accuracy) 1 by default\n"\
- "Example: %s -f 0 -i \"c:\\games\\game\"\n", prg, prg);
+ "Example: %s -f 0 -i \"c:\\games\\game\"\n", prg, MAX_PATH_LENGTH - 1, MAX_PATH_LENGTH - 1, prg);
exit(1);
}
@@ -197,14 +198,20 @@ void HandleArgs(int argc, char* arg[])
switch (arg[c][1])
{
case 'i':
- if (c + 1 < argc) // all ok
- strcpy(input_path, arg[c++ + 1]);
+ if (c + 1 < argc && strlen(arg[c + 1]) < MAX_PATH_LENGTH) // all ok
+ {
+ strncpy(input_path, arg[c++ + 1], MAX_PATH_LENGTH);
+ input_path[MAX_PATH_LENGTH - 1] = '\0';
+ }
else
Usage(arg[0]);
break;
case 'o':
- if (c + 1 < argc) // all ok
- strcpy(output_path, arg[c++ + 1]);
+ if (c + 1 < argc && strlen(arg[c + 1]) < MAX_PATH_LENGTH) // all ok
+ {
+ strncpy(output_path, arg[c++ + 1], MAX_PATH_LENGTH);
+ output_path[MAX_PATH_LENGTH - 1] = '\0';
+ }
else
Usage(arg[0]);
break;
@@ -266,7 +273,7 @@ uint32 ReadBuild(int locale)
exit(1);
}
- std::string text = buff;
+ std::string text = std::string(buff, readBytes);
CascCloseFile(dbcFile);
size_t pos = text.find("version=\"");
@@ -313,7 +320,17 @@ uint32 ReadMapDBC()
for(uint32 x = 0; x < map_count; ++x)
{
map_ids[x].id = dbc.getRecord(x).getUInt(0);
- strcpy(map_ids[x].name, dbc.getRecord(x).getString(1));
+
+ const char* map_name = dbc.getRecord(x).getString(1);
+ size_t max_map_name_length = sizeof(map_ids[x].name);
+ if (strlen(map_name) >= max_map_name_length)
+ {
+ printf("Fatal error: Map name too long!\n");
+ exit(1);
+ }
+
+ strncpy(map_ids[x].name, map_name, max_map_name_length);
+ map_ids[x].name[max_map_name_length - 1] = '\0';
}
CascCloseFile(dbcFile);
@@ -341,6 +358,7 @@ void ReadAreaTableDBC()
size_t area_count = dbc.getRecordCount();
maxAreaId = dbc.getMaxId();
areas = new uint16[maxAreaId + 1];
+ memset(areas, 0xFF, sizeof(uint16) * (maxAreaId + 1));
for (uint32 x = 0; x < area_count; ++x)
areas[dbc.getRecord(x).getUInt(0)] = dbc.getRecord(x).getUInt(3);
@@ -1144,9 +1162,10 @@ void ExtractDBFilesClient(int l)
HANDLE dbcFile;
while (fileName)
{
- if (CascOpenFile(CascStorage, fileName, 1 << l, 0, &dbcFile))
+ std::string filename = fileName;
+ if (CascOpenFile(CascStorage, (filename = (filename + ".db2")).c_str(), 1 << l, 0, &dbcFile) ||
+ CascOpenFile(CascStorage, (filename = (filename.substr(0, filename.length() - 4) + ".dbc")).c_str(), 1 << l, 0, &dbcFile))
{
- std::string filename = fileName;
filename = outputPath + filename.substr(filename.rfind('\\') + 1);
if (!FileExists(filename.c_str()))
diff --git a/src/tools/map_extractor/dbcfile.cpp b/src/tools/map_extractor/dbcfile.cpp
index 893756321dd..edbcd82994f 100644
--- a/src/tools/map_extractor/dbcfile.cpp
+++ b/src/tools/map_extractor/dbcfile.cpp
@@ -21,7 +21,8 @@
#include "dbcfile.h"
DBCFile::DBCFile(HANDLE file) :
- _file(file), _data(NULL), _stringTable(NULL)
+ _file(file), _recordSize(0), _recordCount(0), _fieldCount(0),
+ _stringSize(0), _data(NULL), _stringTable(NULL)
{
}
diff --git a/src/tools/map_extractor/loadlib.cpp b/src/tools/map_extractor/loadlib.cpp
index 975aef04773..b594b21a9c9 100644
--- a/src/tools/map_extractor/loadlib.cpp
+++ b/src/tools/map_extractor/loadlib.cpp
@@ -111,7 +111,8 @@ bool IsInterestingChunk(u_map_fcc const& fcc)
void ChunkedFile::parseChunks()
{
uint8* ptr = GetData();
- while (ptr < GetData() + GetDataSize())
+ // Make sure there's enough data to read u_map_fcc struct and the uint32 size after it
+ while (ptr <= GetData() + GetDataSize() - 8)
{
u_map_fcc header = *(u_map_fcc*)ptr;
if (IsInterestingChunk(header))
diff --git a/src/tools/map_extractor/loadlib/DBFilesClientList.h b/src/tools/map_extractor/loadlib/DBFilesClientList.h
index 2a04f2935f9..3782c5eb02d 100644
--- a/src/tools/map_extractor/loadlib/DBFilesClientList.h
+++ b/src/tools/map_extractor/loadlib/DBFilesClientList.h
@@ -20,512 +20,571 @@
char const* DBFilesClientList[] =
{
- "DBFilesClient\\CharSections.dbc",
- "DBFilesClient\\CharHairGeosets.dbc",
- "DBFilesClient\\TaxiPathNode.db2",
- "DBFilesClient\\KeyChain.db2",
- "DBFilesClient\\UiTextureAtlas.db2",
- "DBFilesClient\\UiTextureAtlasMember.db2",
- "DBFilesClient\\CharacterFaceBoneSet.db2",
- "DBFilesClient\\Startup_Strings.dbc",
- "DBFilesClient\\VideoHardware.dbc",
- "DBFilesClient\\AreaPOI.db2",
- "DBFilesClient\\AreaPOIState.db2",
- "DBFilesClient\\BattlePetAbility.db2",
- "DBFilesClient\\BattlePetAbilityEffect.db2",
- "DBFilesClient\\BattlePetAbilityState.db2",
- "DBFilesClient\\BattlePetAbilityTurn.db2",
- "DBFilesClient\\BattlePetBreedQuality.db2",
- "DBFilesClient\\BattlePetBreedState.db2",
- "DBFilesClient\\BattlePetEffectProperties.db2",
- "DBFilesClient\\BattlePetNPCTeamMember.db2",
- "DBFilesClient\\BattlePetSpecies.db2",
- "DBFilesClient\\BattlePetSpeciesState.db2",
- "DBFilesClient\\BattlePetSpeciesXAbility.db2",
- "DBFilesClient\\BattlePetState.db2",
- "DBFilesClient\\BattlePetVisual.db2",
- "DBFilesClient\\BroadcastText.db2",
- "DBFilesClient\\Cfg_Categories.db2",
- "DBFilesClient\\Cfg_Configs.db2",
- "DBFilesClient\\Cfg_Regions.db2",
- "DBFilesClient\\CharShipmentContainer.db2",
- "DBFilesClient\\CharShipment.db2",
- "DBFilesClient\\ChrUpgradeBucket.db2",
- "DBFilesClient\\ChrUpgradeBucketSpell.db2",
- "DBFilesClient\\ChrUpgradeTier.db2",
- "DBFilesClient\\Creature.db2",
- "DBFilesClient\\CreatureDifficulty.db2",
- "DBFilesClient\\Curve.db2",
- "DBFilesClient\\CurvePoint.db2",
- "DBFilesClient\\GameObjects.db2",
- "DBFilesClient\\GarrAbilityCategory.db2",
- "DBFilesClient\\GarrAbility.db2",
- "DBFilesClient\\GarrAbilityEffect.db2",
- "DBFilesClient\\GarrBuilding.db2",
- "DBFilesClient\\GarrBuildingDoodadSet.db2",
- "DBFilesClient\\GarrBuildingPlotInst.db2",
- "DBFilesClient\\GarrClassSpec.db2",
- "DBFilesClient\\GarrEncounter.db2",
- "DBFilesClient\\GarrEncounterXMechanic.db2",
- "DBFilesClient\\GarrFollItemSet.db2",
- "DBFilesClient\\GarrFollItemSetMember.db2",
- "DBFilesClient\\GarrFollower.db2",
- "DBFilesClient\\GarrFollowerLevelXP.db2",
- "DBFilesClient\\GarrFollowerQuality.db2",
- "DBFilesClient\\GarrFollowerXAbility.db2",
- "DBFilesClient\\GarrMechanic.db2",
- "DBFilesClient\\GarrMechanicType.db2",
- "DBFilesClient\\GarrMission.db2",
- "DBFilesClient\\GarrMissionReward.db2",
- "DBFilesClient\\GarrMissionType.db2",
- "DBFilesClient\\GarrMissionXEncounter.db2",
- "DBFilesClient\\GarrPlotBuilding.db2",
- "DBFilesClient\\GarrPlotInstance.db2",
- "DBFilesClient\\GarrPlot.db2",
- "DBFilesClient\\GarrPlotUICategory.db2",
- "DBFilesClient\\GarrSiteLevel.db2",
- "DBFilesClient\\GarrSiteLevelPlotInst.db2",
- "DBFilesClient\\GarrSpecialization.db2",
- "DBFilesClient\\GlyphExclusiveCategory.db2",
- "DBFilesClient\\GlyphRequiredSpec.db2",
- "DBFilesClient\\GroupFinderActivity.db2",
- "DBFilesClient\\GroupFinderActivityGrp.db2",
- "DBFilesClient\\GroupFinderCategory.db2",
- "DBFilesClient\\HighlightColor.db2",
- "DBFilesClient\\Holidays.db2",
- "DBFilesClient\\HolidayDescriptions.db2",
- "DBFilesClient\\HolidayNames.db2",
- "DBFilesClient\\Item-sparse.db2",
- "DBFilesClient\\Item.db2",
- "DBFilesClient\\ItemAppearance.db2",
- "DBFilesClient\\ItemBonus.db2",
- "DBFilesClient\\ItemBonusTreeNode.db2",
- "DBFilesClient\\ItemCurrencyCost.db2",
- "DBFilesClient\\ItemEffect.db2",
- "DBFilesClient\\ItemExtendedCost.db2",
- "DBFilesClient\\ItemModifiedAppearance.db2",
- "DBFilesClient\\ItemToBattlePetSpecies.db2",
- "DBFilesClient\\ItemToMountSpell.db2",
- "DBFilesClient\\ItemUpgrade.db2",
- "DBFilesClient\\ItemXBonusTree.db2",
- "DBFilesClient\\LanguageWords.db2",
- "DBFilesClient\\LfgRoleRequirement.db2",
- "DBFilesClient\\Locale.db2",
- "DBFilesClient\\Location.db2",
- "DBFilesClient\\MapChallengeMode.db2",
- "DBFilesClient\\MarketingPromotionsXLocale.db2",
- "DBFilesClient\\ModelManifest.db2",
- "DBFilesClient\\ModelNameToManifest.db2",
- "DBFilesClient\\Mount.db2",
- "DBFilesClient\\OverrideSpellData.db2",
- "DBFilesClient\\Path.db2",
- "DBFilesClient\\PathNode.db2",
- "DBFilesClient\\PathNodeProperty.db2",
- "DBFilesClient\\PathProperty.db2",
- "DBFilesClient\\PhaseXPhaseGroup.db2",
- "DBFilesClient\\PlayerCondition.db2",
- "DBFilesClient\\PvpItem.db2",
- "DBFilesClient\\QuestPackageItem.db2",
- "DBFilesClient\\QuestLine.db2",
- "DBFilesClient\\QuestLineXQuest.db2",
- "DBFilesClient\\QuestPOIPointCliTask.db2",
- "DBFilesClient\\QuestObjectiveCliTask.db2",
- "DBFilesClient\\RulesetItemUpgrade.db2",
- "DBFilesClient\\RulesetRaidLootUpgrade.db2",
- "DBFilesClient\\SceneScriptPackage.db2",
- "DBFilesClient\\SceneScriptPackageMember.db2",
- "DBFilesClient\\SceneScript.db2",
- "DBFilesClient\\SpellActionBarPref.db2",
- "DBFilesClient\\SpellAuraRestrictions.db2",
- "DBFilesClient\\SpellAuraRestrictionsDifficulty.db2",
- "DBFilesClient\\SpellCastingRequirements.db2",
- "DBFilesClient\\SpellClassOptions.db2",
- "DBFilesClient\\SpellEffectCameraShakes.db2",
- "DBFilesClient\\SpellEffectGroupSize.db2",
- "DBFilesClient\\SpellLearnSpell.db2",
- "DBFilesClient\\SpellMechanic.db2",
- "DBFilesClient\\SpellMisc.db2",
- "DBFilesClient\\SpellMiscDifficulty.db2",
- "DBFilesClient\\SpellMissileMotion.db2",
- "DBFilesClient\\SpellMissile.db2",
- "DBFilesClient\\SpellPower.db2",
- "DBFilesClient\\SpellPowerDifficulty.db2",
- "DBFilesClient\\SpellReagents.db2",
- "DBFilesClient\\SpellRuneCost.db2",
- "DBFilesClient\\SpellTotems.db2",
- "DBFilesClient\\SpellVisualEffectName.db2",
- "DBFilesClient\\SpellVisualKitAreaModel.db2",
- "DBFilesClient\\SpellVisualKitModelAttach.db2",
- "DBFilesClient\\SpellVisualMissile.db2",
- "DBFilesClient\\SpellVisualKit.db2",
- "DBFilesClient\\SpellVisual.db2",
- "DBFilesClient\\TaxiNodes.db2",
- "DBFilesClient\\TaxiPath.db2",
- "DBFilesClient\\TextureFileData.db2",
- "DBFilesClient\\Toy.db2",
- "DBFilesClient\\Trophy.db2",
- "DBFilesClient\\TrophyInstance.db2",
- "DBFilesClient\\TrophyType.db2",
- "DBFilesClient\\Vignette.db2",
- "DBFilesClient\\WbAccessControlList.db2",
- "DBFilesClient\\WbCertBlacklist.db2",
- "DBFilesClient\\WbCertWhitelist.db2",
- "DBFilesClient\\WbPermissions.db2",
- "DBFilesClient\\WeaponTrail.db2",
- "DBFilesClient\\WorldBossLockout.db2",
- "DBFilesClient\\QuestV2CliTask.db2",
- "DBFilesClient\\UiTextureKit.db2",
- "DBFilesClient\\StringLookups.dbc",
- "DBFilesClient\\SpellIcon.dbc",
- "DBFilesClient\\SpellEffect.dbc",
- "DBFilesClient\\ParticleColor.dbc",
- "DBFilesClient\\ObjectEffectPackageElem.dbc",
- "DBFilesClient\\ObjectEffectPackage.dbc",
- "DBFilesClient\\ObjectEffectModifier.dbc",
- "DBFilesClient\\ObjectEffectGroup.dbc",
- "DBFilesClient\\ObjectEffect.dbc",
- "DBFilesClient\\NameGen.dbc",
- "DBFilesClient\\LoadingScreens.dbc",
- "DBFilesClient\\ItemVisualEffects.dbc",
- "DBFilesClient\\ItemVisuals.dbc",
- "DBFilesClient\\ItemDisplayInfo.dbc",
- "DBFilesClient\\HelmetGeosetVisData.dbc",
- "DBFilesClient\\HelmetAnimScaling.dbc",
- "DBFilesClient\\GuildColorEmblem.dbc",
- "DBFilesClient\\GuildColorBorder.dbc",
- "DBFilesClient\\GuildColorBackground.dbc",
- "DBFilesClient\\GlueScreenEmote.dbc",
- "DBFilesClient\\GameTips.dbc",
- "DBFilesClient\\Faction.dbc",
- "DBFilesClient\\CreatureModelData.dbc",
- "DBFilesClient\\CreatureFamily.dbc",
- "DBFilesClient\\CreatureDisplayInfoExtra.dbc",
- "DBFilesClient\\CreatureDisplayInfo.dbc",
- "DBFilesClient\\ChrSpecialization.dbc",
- "DBFilesClient\\CharacterLoadoutItem.dbc",
- "DBFilesClient\\CharacterLoadout.dbc",
- "DBFilesClient\\CharStartOutfit.dbc",
- "DBFilesClient\\CharComponentTextureSections.dbc",
- "DBFilesClient\\CharComponentTextureLayouts.dbc",
- "DBFilesClient\\AnimReplacementSet.dbc",
- "DBFilesClient\\AnimReplacement.dbc",
- "DBFilesClient\\AnimKitSegment.dbc",
- "DBFilesClient\\AnimKitPriority.dbc",
- "DBFilesClient\\SoundProviderPreferences.dbc",
- "DBFilesClient\\SpamMessages.dbc",
- "DBFilesClient\\SoundFilterElem.dbc",
- "DBFilesClient\\SoundFilter.dbc",
- "DBFilesClient\\Resistances.dbc",
- "DBFilesClient\\NamesReservedLocale.dbc",
- "DBFilesClient\\NamesReserved.dbc",
- "DBFilesClient\\NamesProfanity.dbc",
- "DBFilesClient\\MovieVariation.dbc",
- "DBFilesClient\\MovieOverlays.dbc",
- "DBFilesClient\\MovieFileData.dbc",
- "DBFilesClient\\Movie.dbc",
- "DBFilesClient\\ItemSubClass.dbc",
- "DBFilesClient\\ItemClass.dbc",
- "DBFilesClient\\ManifestInterfaceTOCData.dbc",
- "DBFilesClient\\ManifestInterfaceData.dbc",
- "DBFilesClient\\FactionTemplate.dbc",
- "DBFilesClient\\FactionGroup.dbc",
- "DBFilesClient\\ChrRaces.dbc",
- "DBFilesClient\\ChrClasses.dbc",
- "DBFilesClient\\ChatProfanity.dbc",
- "DBFilesClient\\CharacterFacialHairStyles.dbc",
- "DBFilesClient\\CharBaseSection.dbc",
- "DBFilesClient\\CharBaseInfo.dbc",
- "DBFilesClient\\BannedAddOns.dbc",
- "DBFilesClient\\AnimKitConfigBoneSet.dbc",
- "DBFilesClient\\AnimKitConfig.dbc",
- "DBFilesClient\\AnimKit.dbc",
- "DBFilesClient\\AnimKitBoneSet.dbc",
- "DBFilesClient\\AnimKitBoneSetAlias.dbc",
- "DBFilesClient\\PhaseShiftZoneSounds.dbc",
- "DBFilesClient\\WorldChunkSounds.dbc",
- "DBFilesClient\\WorldStateExpression.dbc",
- "DBFilesClient\\WorldStateZoneSounds.dbc",
- "DBFilesClient\\ZoneMusic.dbc",
- "DBFilesClient\\ZoneIntroMusicTable.dbc",
- "DBFilesClient\\WorldSafeLocs.dbc",
- "DBFilesClient\\WorldStateUI.dbc",
- "DBFilesClient\\WorldState.dbc",
- "DBFilesClient\\WorldMapTransforms.dbc",
- "DBFilesClient\\WorldMapOverlay.dbc",
- "DBFilesClient\\WorldMapContinent.dbc",
- "DBFilesClient\\WorldMapArea.dbc",
- "DBFilesClient\\WorldElapsedTimer.dbc",
- "DBFilesClient\\WorldEffect.dbc",
- "DBFilesClient\\WeaponSwingSounds2.dbc",
- "DBFilesClient\\WeaponImpactSounds.dbc",
- "DBFilesClient\\World_PVP_Area.dbc",
- "DBFilesClient\\VocalUISounds.dbc",
- "DBFilesClient\\VehicleUIIndSeat.dbc",
- "DBFilesClient\\VehicleUIIndicator.dbc",
- "DBFilesClient\\VehicleSeat.dbc",
- "DBFilesClient\\Vehicle.dbc",
- "DBFilesClient\\UnitPowerBar.dbc",
- "DBFilesClient\\UnitCondition.dbc",
- "DBFilesClient\\UnitBlood.dbc",
- "DBFilesClient\\UnitBloodLevels.dbc",
- "DBFilesClient\\TransportRotation.dbc",
- "DBFilesClient\\TransportPhysics.dbc",
- "DBFilesClient\\TransportAnimation.dbc",
- "DBFilesClient\\TradeSkillCategory.dbc",
- "DBFilesClient\\TotemCategory.dbc",
- "DBFilesClient\\TerrainTypeSounds.dbc",
- "DBFilesClient\\Talent.dbc",
- "DBFilesClient\\SummonProperties.dbc",
- "DBFilesClient\\Stationery.dbc",
- "DBFilesClient\\SpellTargetRestrictions.dbc",
- "DBFilesClient\\SpellSpecialUnitEffect.dbc",
- "DBFilesClient\\SpellShapeshiftForm.dbc",
- "DBFilesClient\\SpellShapeshift.dbc",
- "DBFilesClient\\SpellScaling.dbc",
- "DBFilesClient\\SpellProcsPerMinuteMod.dbc",
- "DBFilesClient\\SpellProcsPerMinute.dbc",
- "DBFilesClient\\SpellRange.dbc",
- "DBFilesClient\\SpellRadius.dbc",
- "DBFilesClient\\SpellLevels.dbc",
- "DBFilesClient\\SpellKeyboundOverride.dbc",
- "DBFilesClient\\SpellItemEnchantmentCondition.dbc",
- "DBFilesClient\\SpellItemEnchantment.dbc",
- "DBFilesClient\\SpellInterrupts.dbc",
- "DBFilesClient\\SpellFocusObject.dbc",
- "DBFilesClient\\SpellFlyoutItem.dbc",
- "DBFilesClient\\SpellFlyout.dbc",
- "DBFilesClient\\SpellEquippedItems.dbc",
- "DBFilesClient\\SpellEffectScaling.dbc",
- "DBFilesClient\\SpellDuration.dbc",
- "DBFilesClient\\SpellDispelType.dbc",
- "DBFilesClient\\SpellDescriptionVariables.dbc",
- "DBFilesClient\\Spell.dbc",
- "DBFilesClient\\SpellCooldowns.dbc",
- "DBFilesClient\\SpellCategory.dbc",
- "DBFilesClient\\SpellCategories.dbc",
- "DBFilesClient\\SpellCastTimes.dbc",
- "DBFilesClient\\SpellAuraVisXChrSpec.dbc",
- "DBFilesClient\\SpellAuraVisibility.dbc",
- "DBFilesClient\\SpellAuraOptions.dbc",
- "DBFilesClient\\SpellActivationOverlay.dbc",
- "DBFilesClient\\SpecializationSpells.dbc",
- "DBFilesClient\\SoundOverride.dbc",
- "DBFilesClient\\SoundAmbienceFlavor.dbc",
- "DBFilesClient\\SoundAmbience.dbc",
- "DBFilesClient\\SkillTiers.dbc",
- "DBFilesClient\\SkillRaceClassInfo.dbc",
- "DBFilesClient\\SkillLine.dbc",
- "DBFilesClient\\SkillLineAbilitySortedSpell.dbc",
- "DBFilesClient\\SkillLineAbility.dbc",
- "DBFilesClient\\ServerMessages.dbc",
- "DBFilesClient\\ScreenLocation.dbc",
- "DBFilesClient\\ScreenEffect.dbc",
- "DBFilesClient\\ScenarioEventEntry.dbc",
- "DBFilesClient\\ScenarioStep.dbc",
- "DBFilesClient\\Scenario.dbc",
- "DBFilesClient\\ScalingStatDistribution.dbc",
- "DBFilesClient\\RulesetRaidOverride.dbc",
- "DBFilesClient\\RandPropPoints.dbc",
- "DBFilesClient\\ResearchSite.dbc",
- "DBFilesClient\\ResearchProject.dbc",
- "DBFilesClient\\ResearchField.dbc",
- "DBFilesClient\\ResearchBranch.dbc",
- "DBFilesClient\\RacialMounts.dbc",
- "DBFilesClient\\QuestFeedbackEffect.dbc",
- "DBFilesClient\\QuestV2.dbc",
- "DBFilesClient\\QuestXP.dbc",
- "DBFilesClient\\QuestSort.dbc",
- "DBFilesClient\\QuestPOIPoint.dbc",
- "DBFilesClient\\QuestPOIBlob.dbc",
- "DBFilesClient\\QuestMoneyReward.dbc",
- "DBFilesClient\\QuestInfo.dbc",
- "DBFilesClient\\QuestFactionReward.dbc",
- "DBFilesClient\\PvpDifficulty.dbc",
- "DBFilesClient\\PowerDisplay.dbc",
- "DBFilesClient\\Phase.dbc",
- "DBFilesClient\\PaperDollItemFrame.dbc",
- "DBFilesClient\\PageTextMaterial.dbc",
- "DBFilesClient\\Package.dbc",
- "DBFilesClient\\NPCSounds.dbc",
- "DBFilesClient\\MountType.dbc",
- "DBFilesClient\\MountCapability.dbc",
- "DBFilesClient\\ModifierTree.dbc",
- "DBFilesClient\\MinorTalent.dbc",
- "DBFilesClient\\Material.dbc",
- "DBFilesClient\\MapDifficulty.dbc",
- "DBFilesClient\\ManifestInterfaceItemIcon.dbc",
- "DBFilesClient\\ManifestInterfaceActionIcon.dbc",
- "DBFilesClient\\MailTemplate.dbc",
- "DBFilesClient\\LockType.dbc",
- "DBFilesClient\\Lock.dbc",
- "DBFilesClient\\LoadingScreenTaxiSplines.dbc",
- "DBFilesClient\\LfgDungeons.dbc",
- "DBFilesClient\\LfgDungeonsGroupingMap.dbc",
- "DBFilesClient\\LfgDungeonGroup.dbc",
- "DBFilesClient\\LfgDungeonExpansion.dbc",
- "DBFilesClient\\Languages.dbc",
- "DBFilesClient\\JournalTierXInstance.dbc",
- "DBFilesClient\\JournalTier.dbc",
- "DBFilesClient\\JournalSectionXDifficulty.dbc",
- "DBFilesClient\\JournalItemXDifficulty.dbc",
- "DBFilesClient\\JournalInstance.dbc",
- "DBFilesClient\\JournalEncounterXDifficulty.dbc",
- "DBFilesClient\\JournalEncounterSection.dbc",
- "DBFilesClient\\JournalEncounter.dbc",
- "DBFilesClient\\JournalEncounterItem.dbc",
- "DBFilesClient\\JournalEncounterCreature.dbc",
- "DBFilesClient\\ItemUpgradePath.dbc",
- "DBFilesClient\\ItemSubClassMask.dbc",
- "DBFilesClient\\ItemSpec.dbc",
- "DBFilesClient\\ItemSpecOverride.dbc",
- "DBFilesClient\\ItemSetSpell.dbc",
- "DBFilesClient\\ItemSet.dbc",
- "DBFilesClient\\ItemRandomSuffix.dbc",
- "DBFilesClient\\ItemRandomProperties.dbc",
- "DBFilesClient\\ItemPurchaseGroup.dbc",
- "DBFilesClient\\ItemPriceBase.dbc",
- "DBFilesClient\\ItemPetFood.dbc",
- "DBFilesClient\\ItemNameDescription.dbc",
- "DBFilesClient\\ItemLimitCategory.dbc",
- "DBFilesClient\\ItemGroupSounds.dbc",
- "DBFilesClient\\ItemDisenchantLoot.dbc",
- "DBFilesClient\\ItemDamageWand.dbc",
- "DBFilesClient\\ItemDamageTwoHandCaster.dbc",
- "DBFilesClient\\ItemDamageTwoHand.dbc",
- "DBFilesClient\\ItemDamageThrown.dbc",
- "DBFilesClient\\ItemDamageRanged.dbc",
- "DBFilesClient\\ItemDamageOneHandCaster.dbc",
- "DBFilesClient\\ItemDamageOneHand.dbc",
- "DBFilesClient\\ItemDamageAmmo.dbc",
- "DBFilesClient\\ItemBagFamily.dbc",
- "DBFilesClient\\ItemArmorShield.dbc",
- "DBFilesClient\\ItemArmorTotal.dbc",
- "DBFilesClient\\ItemArmorQuality.dbc",
- "DBFilesClient\\ImportPriceWeapon.dbc",
- "DBFilesClient\\ImportPriceShield.dbc",
- "DBFilesClient\\ImportPriceQuality.dbc",
- "DBFilesClient\\ImportPriceArmor.dbc",
- "DBFilesClient\\GuildPerkSpells.dbc",
- "DBFilesClient\\gtSpellScaling.dbc",
- "DBFilesClient\\gtResilienceDR.dbc",
- "DBFilesClient\\gtRegenMPPerSpt.dbc",
- "DBFilesClient\\gtOCTLevelExperience.dbc",
- "DBFilesClient\\gtOCTHpPerStamina.dbc",
- "DBFilesClient\\gtOCTClassCombatRatingScalar.dbc",
- "DBFilesClient\\gtOCTBaseMPByClass.dbc",
- "DBFilesClient\\gtOCTBaseHPByClass.dbc",
- "DBFilesClient\\gtNPCManaCostScaler.dbc",
- "DBFilesClient\\gtItemSocketCostPerLevel.dbc",
- "DBFilesClient\\gtChanceToSpellCritBase.dbc",
- "DBFilesClient\\gtChanceToSpellCrit.dbc",
- "DBFilesClient\\gtChanceToMeleeCritBase.dbc",
- "DBFilesClient\\gtChanceToMeleeCrit.dbc",
- "DBFilesClient\\gtCombatRatings.dbc",
- "DBFilesClient\\gtBattlePetXP.dbc",
- "DBFilesClient\\gtBattlePetTypeDamageMod.dbc",
- "DBFilesClient\\gtBarberShopCostBase.dbc",
- "DBFilesClient\\gtArmorMitigationByLvl.dbc",
- "DBFilesClient\\GMTicketCategory.dbc",
- "DBFilesClient\\GMSurveySurveys.dbc",
- "DBFilesClient\\GMSurveyQuestions.dbc",
- "DBFilesClient\\GMSurveyCurrentSurvey.dbc",
- "DBFilesClient\\GMSurveyAnswers.dbc",
- "DBFilesClient\\GlyphSlot.dbc",
- "DBFilesClient\\GlyphProperties.dbc",
- "DBFilesClient\\GemProperties.dbc",
- "DBFilesClient\\GarrUiAnimRaceInfo.dbc",
- "DBFilesClient\\GarrUiAnimClassInfo.dbc",
- "DBFilesClient\\GameTables.dbc",
- "DBFilesClient\\GameObjectDisplayInfo.dbc",
- "DBFilesClient\\GameObjectDiffAnimMap.dbc",
- "DBFilesClient\\GameObjectArtKit.dbc",
- "DBFilesClient\\FriendshipReputation.dbc",
- "DBFilesClient\\FriendshipRepReaction.dbc",
- "DBFilesClient\\FootstepTerrainLookup.dbc",
- "DBFilesClient\\CriteriaTree.dbc",
- "DBFilesClient\\Exhaustion.dbc",
- "DBFilesClient\\EnvironmentalDamage.dbc",
- "DBFilesClient\\EmotesText.dbc",
- "DBFilesClient\\EmotesTextSound.dbc",
- "DBFilesClient\\EmotesTextData.dbc",
- "DBFilesClient\\Emotes.dbc",
- "DBFilesClient\\DurabilityQuality.dbc",
- "DBFilesClient\\DurabilityCosts.dbc",
- "DBFilesClient\\DungeonMapChunk.dbc",
- "DBFilesClient\\DungeonMap.dbc",
- "DBFilesClient\\DungeonEncounter.dbc",
- "DBFilesClient\\Difficulty.dbc",
- "DBFilesClient\\DestructibleModelData.dbc",
- "DBFilesClient\\DeathThudLookups.dbc",
- "DBFilesClient\\CurrencyCategory.dbc",
- "DBFilesClient\\CurrencyTypes.dbc",
- "DBFilesClient\\CriteriaTreeXEffect.dbc",
- "DBFilesClient\\Criteria.dbc",
- "DBFilesClient\\CreatureType.dbc",
- "DBFilesClient\\CreatureSpellData.dbc",
- "DBFilesClient\\CreatureSoundData.dbc",
- "DBFilesClient\\CreatureMovementInfo.dbc",
- "DBFilesClient\\CreatureImmunities.dbc",
- "DBFilesClient\\CombatCondition.dbc",
- "DBFilesClient\\CinematicSequences.dbc",
- "DBFilesClient\\CinematicCamera.dbc",
- "DBFilesClient\\ChrClassesXPowerTypes.dbc",
- "DBFilesClient\\ChatChannels.dbc",
- "DBFilesClient\\CharTitles.dbc",
- "DBFilesClient\\CastableRaidBuffs.dbc",
- "DBFilesClient\\CameraShakes.dbc",
- "DBFilesClient\\CameraMode.dbc",
- "DBFilesClient\\BattlemasterList.dbc",
- "DBFilesClient\\BarberShopStyle.dbc",
- "DBFilesClient\\BankBagSlotPrices.dbc",
- "DBFilesClient\\AuctionHouse.dbc",
- "DBFilesClient\\ArmorLocation.dbc",
- "DBFilesClient\\AreaTriggerCylinder.dbc",
- "DBFilesClient\\AreaTriggerSphere.dbc",
- "DBFilesClient\\AreaTriggerBox.dbc",
- "DBFilesClient\\AreaTriggerActionSet.dbc",
- "DBFilesClient\\AreaTrigger.dbc",
- "DBFilesClient\\AreaAssignment.dbc",
- "DBFilesClient\\AreaGroup.dbc",
- "DBFilesClient\\Achievement_Category.dbc",
- "DBFilesClient\\Achievement.dbc",
- "DBFilesClient\\DeclinedWordCases.dbc",
- "DBFilesClient\\DeclinedWord.dbc",
- "DBFilesClient\\DeviceBlacklist.db2",
- "DBFilesClient\\DriverBlacklist.db2",
- "DBFilesClient\\DeviceDefaultSettings.db2",
- "DBFilesClient\\WindSettings.db2",
- "DBFilesClient\\ZoneLightPoint.dbc",
- "DBFilesClient\\ZoneLight.dbc",
- "DBFilesClient\\WMOAreaTable.dbc",
- "DBFilesClient\\Weather.dbc",
- "DBFilesClient\\TerrainType.dbc",
- "DBFilesClient\\TerrainMaterial.dbc",
- "DBFilesClient\\SpellChainEffects.dbc",
- "DBFilesClient\\SoundEntriesFallbacks.dbc",
- "DBFilesClient\\SoundEmitters.dbc",
- "DBFilesClient\\SoundEmitterPillPoints.dbc",
- "DBFilesClient\\SoundBusName.dbc",
- "DBFilesClient\\LiquidType.dbc",
- "DBFilesClient\\LiquidObject.dbc",
- "DBFilesClient\\LiquidMaterial.dbc",
- "DBFilesClient\\LightSkybox.dbc",
- "DBFilesClient\\Light.dbc",
- "DBFilesClient\\GroundEffectTexture.dbc",
- "DBFilesClient\\GroundEffectDoodad.dbc",
- "DBFilesClient\\FootprintTextures.dbc",
- "DBFilesClient\\FeedbackPath.dbc",
- "DBFilesClient\\Map.dbc",
- "DBFilesClient\\LightParams.dbc",
- "DBFilesClient\\LightData.dbc",
- "DBFilesClient\\AreaTable.dbc",
- "DBFilesClient\\AnimationData.dbc",
- "DBFilesClient\\SoundEntries.dbc",
- "DBFilesClient\\SoundEntriesAdvanced.dbc",
- "DBFilesClient\\SoundBus.dbc",
- "DBFilesClient\\ModelFileData.dbc",
- "DBFilesClient\\ManifestMP3.dbc",
- "DBFilesClient\\FileData.dbc",
+ "DBFilesClient\\Achievement",
+ "DBFilesClient\\Achievement_Category",
+ "DBFilesClient\\AnimKit",
+ "DBFilesClient\\AnimKitBoneSet",
+ "DBFilesClient\\AnimKitBoneSetAlias",
+ "DBFilesClient\\AnimKitConfig",
+ "DBFilesClient\\AnimKitConfigBoneSet",
+ "DBFilesClient\\AnimKitPriority",
+ "DBFilesClient\\AnimKitSegment",
+ "DBFilesClient\\AnimReplacement",
+ "DBFilesClient\\AnimReplacementSet",
+ "DBFilesClient\\AnimationData",
+ "DBFilesClient\\AreaAssignment",
+ "DBFilesClient\\AreaGroup",
+ "DBFilesClient\\AreaPOI",
+ "DBFilesClient\\AreaPOIState",
+ "DBFilesClient\\AreaTable",
+ "DBFilesClient\\AreaTrigger",
+ "DBFilesClient\\AreaTriggerActionSet",
+ "DBFilesClient\\AreaTriggerBox",
+ "DBFilesClient\\AreaTriggerCylinder",
+ "DBFilesClient\\AreaTriggerSphere",
+ "DBFilesClient\\ArmorLocation",
+ "DBFilesClient\\AuctionHouse",
+ "DBFilesClient\\BankBagSlotPrices",
+ "DBFilesClient\\BannedAddOns",
+ "DBFilesClient\\BarberShopStyle",
+ "DBFilesClient\\BattlePetAbility",
+ "DBFilesClient\\BattlePetAbilityEffect",
+ "DBFilesClient\\BattlePetAbilityState",
+ "DBFilesClient\\BattlePetAbilityTurn",
+ "DBFilesClient\\BattlePetBreedQuality",
+ "DBFilesClient\\BattlePetBreedState",
+ "DBFilesClient\\BattlePetEffectProperties",
+ "DBFilesClient\\BattlePetNPCTeamMember",
+ "DBFilesClient\\BattlePetSpecies",
+ "DBFilesClient\\BattlePetSpeciesState",
+ "DBFilesClient\\BattlePetSpeciesXAbility",
+ "DBFilesClient\\BattlePetState",
+ "DBFilesClient\\BattlePetVisual",
+ "DBFilesClient\\BattlemasterList",
+ "DBFilesClient\\BroadcastText",
+ "DBFilesClient\\CameraMode",
+ "DBFilesClient\\CameraShakes",
+ "DBFilesClient\\CastableRaidBuffs",
+ "DBFilesClient\\Cfg_Categories",
+ "DBFilesClient\\Cfg_Configs",
+ "DBFilesClient\\Cfg_Regions",
+ "DBFilesClient\\CharBaseInfo",
+ "DBFilesClient\\CharBaseSection",
+ "DBFilesClient\\CharComponentTextureLayouts",
+ "DBFilesClient\\CharComponentTextureSections",
+ "DBFilesClient\\CharHairGeosets",
+ "DBFilesClient\\CharSections",
+ "DBFilesClient\\CharShipment",
+ "DBFilesClient\\CharShipmentContainer",
+ "DBFilesClient\\CharStartOutfit",
+ "DBFilesClient\\CharTitles",
+ "DBFilesClient\\CharacterFaceBoneSet",
+ "DBFilesClient\\CharacterFacialHairStyles",
+ "DBFilesClient\\CharacterLoadout",
+ "DBFilesClient\\CharacterLoadoutItem",
+ "DBFilesClient\\ChatChannels",
+ "DBFilesClient\\ChatProfanity",
+ "DBFilesClient\\ChrClasses",
+ "DBFilesClient\\ChrClassesXPowerTypes",
+ "DBFilesClient\\ChrRaces",
+ "DBFilesClient\\ChrSpecialization",
+ "DBFilesClient\\ChrUpgradeBucket",
+ "DBFilesClient\\ChrUpgradeBucketSpell",
+ "DBFilesClient\\ChrUpgradeTier",
+ "DBFilesClient\\CinematicCamera",
+ "DBFilesClient\\CinematicSequences",
+ "DBFilesClient\\CombatCondition",
+ "DBFilesClient\\Creature",
+ "DBFilesClient\\CreatureDifficulty",
+ "DBFilesClient\\CreatureDisplayInfo",
+ "DBFilesClient\\CreatureDisplayInfoExtra",
+ "DBFilesClient\\CreatureFamily",
+ "DBFilesClient\\CreatureImmunities",
+ "DBFilesClient\\CreatureModelData",
+ "DBFilesClient\\CreatureMovementInfo",
+ "DBFilesClient\\CreatureSoundData",
+ "DBFilesClient\\CreatureSpellData",
+ "DBFilesClient\\CreatureType",
+ "DBFilesClient\\Criteria",
+ "DBFilesClient\\CriteriaTree",
+ "DBFilesClient\\CriteriaTreeXEffect",
+ "DBFilesClient\\CurrencyCategory",
+ "DBFilesClient\\CurrencyTypes",
+ "DBFilesClient\\Curve",
+ "DBFilesClient\\CurvePoint",
+ "DBFilesClient\\DeathThudLookups",
+ "DBFilesClient\\DeclinedWord",
+ "DBFilesClient\\DeclinedWordCases",
+ "DBFilesClient\\DestructibleModelData",
+ "DBFilesClient\\DeviceBlacklist",
+ "DBFilesClient\\DeviceDefaultSettings",
+ "DBFilesClient\\Difficulty",
+ "DBFilesClient\\DriverBlacklist",
+ "DBFilesClient\\DungeonEncounter",
+ "DBFilesClient\\DungeonMap",
+ "DBFilesClient\\DungeonMapChunk",
+ "DBFilesClient\\DurabilityCosts",
+ "DBFilesClient\\DurabilityQuality",
+ "DBFilesClient\\Emotes",
+ "DBFilesClient\\EmotesText",
+ "DBFilesClient\\EmotesTextData",
+ "DBFilesClient\\EmotesTextSound",
+ "DBFilesClient\\EnvironmentalDamage",
+ "DBFilesClient\\Exhaustion",
+ "DBFilesClient\\Faction",
+ "DBFilesClient\\FactionGroup",
+ "DBFilesClient\\FactionTemplate",
+ "DBFilesClient\\FeedbackPath",
+ "DBFilesClient\\FileData",
+ "DBFilesClient\\FootprintTextures",
+ "DBFilesClient\\FootstepTerrainLookup",
+ "DBFilesClient\\FriendshipRepReaction",
+ "DBFilesClient\\FriendshipReputation",
+ "DBFilesClient\\GMSurveyAnswers",
+ "DBFilesClient\\GMSurveyCurrentSurvey",
+ "DBFilesClient\\GMSurveyQuestions",
+ "DBFilesClient\\GMSurveySurveys",
+ "DBFilesClient\\GMTicketCategory",
+ "DBFilesClient\\GameObjectArtKit",
+ "DBFilesClient\\GameObjectDiffAnimMap",
+ "DBFilesClient\\GameObjectDisplayInfo",
+ "DBFilesClient\\GameObjects",
+ "DBFilesClient\\GameTables",
+ "DBFilesClient\\GameTips",
+ "DBFilesClient\\GarrAbility",
+ "DBFilesClient\\GarrAbilityCategory",
+ "DBFilesClient\\GarrAbilityEffect",
+ "DBFilesClient\\GarrBuilding",
+ "DBFilesClient\\GarrBuildingDoodadSet",
+ "DBFilesClient\\GarrBuildingPlotInst",
+ "DBFilesClient\\GarrClassSpec",
+ "DBFilesClient\\GarrEncounter",
+ "DBFilesClient\\GarrEncounterXMechanic",
+ "DBFilesClient\\GarrFollItemSet",
+ "DBFilesClient\\GarrFollItemSetMember",
+ "DBFilesClient\\GarrFollower",
+ "DBFilesClient\\GarrFollowerLevelXP",
+ "DBFilesClient\\GarrFollowerQuality",
+ "DBFilesClient\\GarrFollowerXAbility",
+ "DBFilesClient\\GarrMechanic",
+ "DBFilesClient\\GarrMechanicType",
+ "DBFilesClient\\GarrMission",
+ "DBFilesClient\\GarrMissionReward",
+ "DBFilesClient\\GarrMissionType",
+ "DBFilesClient\\GarrMissionXEncounter",
+ "DBFilesClient\\GarrPlot",
+ "DBFilesClient\\GarrPlotBuilding",
+ "DBFilesClient\\GarrPlotInstance",
+ "DBFilesClient\\GarrPlotUICategory",
+ "DBFilesClient\\GarrSiteLevel",
+ "DBFilesClient\\GarrSiteLevelPlotInst",
+ "DBFilesClient\\GarrSpecialization",
+ "DBFilesClient\\GarrUiAnimClassInfo",
+ "DBFilesClient\\GarrUiAnimRaceInfo",
+ "DBFilesClient\\GemProperties",
+ "DBFilesClient\\GlueScreenEmote",
+ "DBFilesClient\\GlyphExclusiveCategory",
+ "DBFilesClient\\GlyphProperties",
+ "DBFilesClient\\GlyphRequiredSpec",
+ "DBFilesClient\\GlyphSlot",
+ "DBFilesClient\\GroundEffectDoodad",
+ "DBFilesClient\\GroundEffectTexture",
+ "DBFilesClient\\GroupFinderActivity",
+ "DBFilesClient\\GroupFinderActivityGrp",
+ "DBFilesClient\\GroupFinderCategory",
+ "DBFilesClient\\GuildColorBackground",
+ "DBFilesClient\\GuildColorBorder",
+ "DBFilesClient\\GuildColorEmblem",
+ "DBFilesClient\\GuildPerkSpells",
+ "DBFilesClient\\HelmetAnimScaling",
+ "DBFilesClient\\HelmetGeosetVisData",
+ "DBFilesClient\\HighlightColor",
+ "DBFilesClient\\HolidayDescriptions",
+ "DBFilesClient\\HolidayNames",
+ "DBFilesClient\\Holidays",
+ "DBFilesClient\\ImportPriceArmor",
+ "DBFilesClient\\ImportPriceQuality",
+ "DBFilesClient\\ImportPriceShield",
+ "DBFilesClient\\ImportPriceWeapon",
+ "DBFilesClient\\Item",
+ "DBFilesClient\\Item-sparse",
+ "DBFilesClient\\ItemAppearance",
+ "DBFilesClient\\ItemArmorQuality",
+ "DBFilesClient\\ItemArmorShield",
+ "DBFilesClient\\ItemArmorTotal",
+ "DBFilesClient\\ItemBagFamily",
+ "DBFilesClient\\ItemBonus",
+ "DBFilesClient\\ItemBonusTreeNode",
+ "DBFilesClient\\ItemClass",
+ "DBFilesClient\\ItemCurrencyCost",
+ "DBFilesClient\\ItemDamageAmmo",
+ "DBFilesClient\\ItemDamageOneHand",
+ "DBFilesClient\\ItemDamageOneHandCaster",
+ "DBFilesClient\\ItemDamageRanged",
+ "DBFilesClient\\ItemDamageThrown",
+ "DBFilesClient\\ItemDamageTwoHand",
+ "DBFilesClient\\ItemDamageTwoHandCaster",
+ "DBFilesClient\\ItemDamageWand",
+ "DBFilesClient\\ItemDisenchantLoot",
+ "DBFilesClient\\ItemDisplayInfo",
+ "DBFilesClient\\ItemEffect",
+ "DBFilesClient\\ItemExtendedCost",
+ "DBFilesClient\\ItemGroupSounds",
+ "DBFilesClient\\ItemLimitCategory",
+ "DBFilesClient\\ItemModifiedAppearance",
+ "DBFilesClient\\ItemNameDescription",
+ "DBFilesClient\\ItemPetFood",
+ "DBFilesClient\\ItemPriceBase",
+ "DBFilesClient\\ItemPurchaseGroup",
+ "DBFilesClient\\ItemRandomProperties",
+ "DBFilesClient\\ItemRandomSuffix",
+ "DBFilesClient\\ItemSet",
+ "DBFilesClient\\ItemSetSpell",
+ "DBFilesClient\\ItemSpec",
+ "DBFilesClient\\ItemSpecOverride",
+ "DBFilesClient\\ItemSubClass",
+ "DBFilesClient\\ItemSubClassMask",
+ "DBFilesClient\\ItemToBattlePetSpecies",
+ "DBFilesClient\\ItemToMountSpell",
+ "DBFilesClient\\ItemUpgrade",
+ "DBFilesClient\\ItemUpgradePath",
+ "DBFilesClient\\ItemVisualEffects",
+ "DBFilesClient\\ItemVisuals",
+ "DBFilesClient\\ItemXBonusTree",
+ "DBFilesClient\\JournalEncounter",
+ "DBFilesClient\\JournalEncounterCreature",
+ "DBFilesClient\\JournalEncounterItem",
+ "DBFilesClient\\JournalEncounterSection",
+ "DBFilesClient\\JournalEncounterXDifficulty",
+ "DBFilesClient\\JournalInstance",
+ "DBFilesClient\\JournalItemXDifficulty",
+ "DBFilesClient\\JournalSectionXDifficulty",
+ "DBFilesClient\\JournalTier",
+ "DBFilesClient\\JournalTierXInstance",
+ "DBFilesClient\\KeyChain",
+ "DBFilesClient\\LanguageWords",
+ "DBFilesClient\\Languages",
+ "DBFilesClient\\LfgDungeonExpansion",
+ "DBFilesClient\\LfgDungeonGroup",
+ "DBFilesClient\\LfgDungeons",
+ "DBFilesClient\\LfgDungeonsGroupingMap",
+ "DBFilesClient\\LfgRoleRequirement",
+ "DBFilesClient\\Light",
+ "DBFilesClient\\LightData",
+ "DBFilesClient\\LightParams",
+ "DBFilesClient\\LightSkybox",
+ "DBFilesClient\\LiquidMaterial",
+ "DBFilesClient\\LiquidObject",
+ "DBFilesClient\\LiquidType",
+ "DBFilesClient\\LoadingScreenTaxiSplines",
+ "DBFilesClient\\LoadingScreens",
+ "DBFilesClient\\Locale",
+ "DBFilesClient\\Location",
+ "DBFilesClient\\Lock",
+ "DBFilesClient\\LockType",
+ "DBFilesClient\\MailTemplate",
+ "DBFilesClient\\ManifestInterfaceActionIcon",
+ "DBFilesClient\\ManifestInterfaceData",
+ "DBFilesClient\\ManifestInterfaceItemIcon",
+ "DBFilesClient\\ManifestInterfaceTOCData",
+ "DBFilesClient\\ManifestMP3",
+ "DBFilesClient\\Map",
+ "DBFilesClient\\MapChallengeMode",
+ "DBFilesClient\\MapDifficulty",
+ "DBFilesClient\\MarketingPromotionsXLocale",
+ "DBFilesClient\\Material",
+ "DBFilesClient\\MinorTalent",
+ "DBFilesClient\\ModelFileData",
+ "DBFilesClient\\ModelManifest",
+ "DBFilesClient\\ModelNameToManifest",
+ "DBFilesClient\\ModifierTree",
+ "DBFilesClient\\Mount",
+ "DBFilesClient\\MountCapability",
+ "DBFilesClient\\MountType",
+ "DBFilesClient\\Movie",
+ "DBFilesClient\\MovieFileData",
+ "DBFilesClient\\MovieOverlays",
+ "DBFilesClient\\MovieVariation",
+ "DBFilesClient\\NPCSounds",
+ "DBFilesClient\\NameGen",
+ "DBFilesClient\\NamesProfanity",
+ "DBFilesClient\\NamesReserved",
+ "DBFilesClient\\NamesReservedLocale",
+ "DBFilesClient\\ObjectEffect",
+ "DBFilesClient\\ObjectEffectGroup",
+ "DBFilesClient\\ObjectEffectModifier",
+ "DBFilesClient\\ObjectEffectPackage",
+ "DBFilesClient\\ObjectEffectPackageElem",
+ "DBFilesClient\\OverrideSpellData",
+ "DBFilesClient\\Package",
+ "DBFilesClient\\PageTextMaterial",
+ "DBFilesClient\\PaperDollItemFrame",
+ "DBFilesClient\\ParticleColor",
+ "DBFilesClient\\Path",
+ "DBFilesClient\\PathNode",
+ "DBFilesClient\\PathNodeProperty",
+ "DBFilesClient\\PathProperty",
+ "DBFilesClient\\Phase",
+ "DBFilesClient\\PhaseShiftZoneSounds",
+ "DBFilesClient\\PhaseXPhaseGroup",
+ "DBFilesClient\\PlayerCondition",
+ "DBFilesClient\\PowerDisplay",
+ "DBFilesClient\\PvpDifficulty",
+ "DBFilesClient\\PvpItem",
+ "DBFilesClient\\QuestFactionReward",
+ "DBFilesClient\\QuestFeedbackEffect",
+ "DBFilesClient\\QuestInfo",
+ "DBFilesClient\\QuestLine",
+ "DBFilesClient\\QuestLineXQuest",
+ "DBFilesClient\\QuestMoneyReward",
+ "DBFilesClient\\QuestObjectiveCliTask",
+ "DBFilesClient\\QuestPOIBlob",
+ "DBFilesClient\\QuestPOIPoint",
+ "DBFilesClient\\QuestPOIPointCliTask",
+ "DBFilesClient\\QuestPackageItem",
+ "DBFilesClient\\QuestSort",
+ "DBFilesClient\\QuestV2",
+ "DBFilesClient\\QuestV2CliTask",
+ "DBFilesClient\\QuestXP",
+ "DBFilesClient\\RacialMounts",
+ "DBFilesClient\\RandPropPoints",
+ "DBFilesClient\\ResearchBranch",
+ "DBFilesClient\\ResearchField",
+ "DBFilesClient\\ResearchProject",
+ "DBFilesClient\\ResearchSite",
+ "DBFilesClient\\Resistances",
+ "DBFilesClient\\RulesetItemUpgrade",
+ "DBFilesClient\\RulesetRaidLootUpgrade",
+ "DBFilesClient\\RulesetRaidOverride",
+ "DBFilesClient\\ScalingStatDistribution",
+ "DBFilesClient\\Scenario",
+ "DBFilesClient\\ScenarioEventEntry",
+ "DBFilesClient\\ScenarioStep",
+ "DBFilesClient\\SceneScript",
+ "DBFilesClient\\SceneScriptPackage",
+ "DBFilesClient\\SceneScriptPackageMember",
+ "DBFilesClient\\ScreenEffect",
+ "DBFilesClient\\ScreenLocation",
+ "DBFilesClient\\ServerMessages",
+ "DBFilesClient\\SkillLine",
+ "DBFilesClient\\SkillLineAbility",
+ "DBFilesClient\\SkillLineAbilitySortedSpell",
+ "DBFilesClient\\SkillRaceClassInfo",
+ "DBFilesClient\\SkillTiers",
+ "DBFilesClient\\SoundAmbience",
+ "DBFilesClient\\SoundAmbienceFlavor",
+ "DBFilesClient\\SoundBus",
+ "DBFilesClient\\SoundBusName",
+ "DBFilesClient\\SoundEmitterPillPoints",
+ "DBFilesClient\\SoundEmitters",
+ "DBFilesClient\\SoundEntries",
+ "DBFilesClient\\SoundEntriesAdvanced",
+ "DBFilesClient\\SoundEntriesFallbacks",
+ "DBFilesClient\\SoundFilter",
+ "DBFilesClient\\SoundFilterElem",
+ "DBFilesClient\\SoundOverride",
+ "DBFilesClient\\SoundProviderPreferences",
+ "DBFilesClient\\SpamMessages",
+ "DBFilesClient\\SpecializationSpells",
+ "DBFilesClient\\Spell",
+ "DBFilesClient\\SpellActionBarPref",
+ "DBFilesClient\\SpellActivationOverlay",
+ "DBFilesClient\\SpellAuraOptions",
+ "DBFilesClient\\SpellAuraRestrictions",
+ "DBFilesClient\\SpellAuraRestrictionsDifficulty",
+ "DBFilesClient\\SpellAuraVisXChrSpec",
+ "DBFilesClient\\SpellAuraVisibility",
+ "DBFilesClient\\SpellCastTimes",
+ "DBFilesClient\\SpellCastingRequirements",
+ "DBFilesClient\\SpellCategories",
+ "DBFilesClient\\SpellCategory",
+ "DBFilesClient\\SpellChainEffects",
+ "DBFilesClient\\SpellClassOptions",
+ "DBFilesClient\\SpellCooldowns",
+ "DBFilesClient\\SpellDescriptionVariables",
+ "DBFilesClient\\SpellDispelType",
+ "DBFilesClient\\SpellDuration",
+ "DBFilesClient\\SpellEffect",
+ "DBFilesClient\\SpellEffectCameraShakes",
+ "DBFilesClient\\SpellEffectGroupSize",
+ "DBFilesClient\\SpellEffectScaling",
+ "DBFilesClient\\SpellEquippedItems",
+ "DBFilesClient\\SpellFlyout",
+ "DBFilesClient\\SpellFlyoutItem",
+ "DBFilesClient\\SpellFocusObject",
+ "DBFilesClient\\SpellIcon",
+ "DBFilesClient\\SpellInterrupts",
+ "DBFilesClient\\SpellItemEnchantment",
+ "DBFilesClient\\SpellItemEnchantmentCondition",
+ "DBFilesClient\\SpellKeyboundOverride",
+ "DBFilesClient\\SpellLearnSpell",
+ "DBFilesClient\\SpellLevels",
+ "DBFilesClient\\SpellMechanic",
+ "DBFilesClient\\SpellMisc",
+ "DBFilesClient\\SpellMiscDifficulty",
+ "DBFilesClient\\SpellMissile",
+ "DBFilesClient\\SpellMissileMotion",
+ "DBFilesClient\\SpellPower",
+ "DBFilesClient\\SpellPowerDifficulty",
+ "DBFilesClient\\SpellProcsPerMinute",
+ "DBFilesClient\\SpellProcsPerMinuteMod",
+ "DBFilesClient\\SpellRadius",
+ "DBFilesClient\\SpellRange",
+ "DBFilesClient\\SpellReagents",
+ "DBFilesClient\\SpellRuneCost",
+ "DBFilesClient\\SpellScaling",
+ "DBFilesClient\\SpellShapeshift",
+ "DBFilesClient\\SpellShapeshiftForm",
+ "DBFilesClient\\SpellSpecialUnitEffect",
+ "DBFilesClient\\SpellTargetRestrictions",
+ "DBFilesClient\\SpellTotems",
+ "DBFilesClient\\SpellVisual",
+ "DBFilesClient\\SpellVisualEffectName",
+ "DBFilesClient\\SpellVisualKit",
+ "DBFilesClient\\SpellVisualKitAreaModel",
+ "DBFilesClient\\SpellVisualKitModelAttach",
+ "DBFilesClient\\SpellVisualMissile",
+ "DBFilesClient\\Startup_Strings",
+ "DBFilesClient\\Stationery",
+ "DBFilesClient\\StringLookups",
+ "DBFilesClient\\SummonProperties",
+ "DBFilesClient\\Talent",
+ "DBFilesClient\\TaxiNodes",
+ "DBFilesClient\\TaxiPath",
+ "DBFilesClient\\TaxiPathNode",
+ "DBFilesClient\\TerrainMaterial",
+ "DBFilesClient\\TerrainType",
+ "DBFilesClient\\TerrainTypeSounds",
+ "DBFilesClient\\TextureFileData",
+ "DBFilesClient\\TotemCategory",
+ "DBFilesClient\\Toy",
+ "DBFilesClient\\TradeSkillCategory",
+ "DBFilesClient\\TransportAnimation",
+ "DBFilesClient\\TransportPhysics",
+ "DBFilesClient\\TransportRotation",
+ "DBFilesClient\\Trophy",
+ "DBFilesClient\\TrophyInstance",
+ "DBFilesClient\\TrophyType",
+ "DBFilesClient\\UiTextureAtlas",
+ "DBFilesClient\\UiTextureAtlasMember",
+ "DBFilesClient\\UiTextureKit",
+ "DBFilesClient\\UnitBlood",
+ "DBFilesClient\\UnitBloodLevels",
+ "DBFilesClient\\UnitCondition",
+ "DBFilesClient\\UnitPowerBar",
+ "DBFilesClient\\Vehicle",
+ "DBFilesClient\\VehicleSeat",
+ "DBFilesClient\\VehicleUIIndSeat",
+ "DBFilesClient\\VehicleUIIndicator",
+ "DBFilesClient\\VideoHardware",
+ "DBFilesClient\\Vignette",
+ "DBFilesClient\\VocalUISounds",
+ "DBFilesClient\\WMOAreaTable",
+ "DBFilesClient\\WbAccessControlList",
+ "DBFilesClient\\WbCertBlacklist",
+ "DBFilesClient\\WbCertWhitelist",
+ "DBFilesClient\\WbPermissions",
+ "DBFilesClient\\WeaponImpactSounds",
+ "DBFilesClient\\WeaponSwingSounds2",
+ "DBFilesClient\\WeaponTrail",
+ "DBFilesClient\\Weather",
+ "DBFilesClient\\WindSettings",
+ "DBFilesClient\\WorldBossLockout",
+ "DBFilesClient\\WorldChunkSounds",
+ "DBFilesClient\\WorldEffect",
+ "DBFilesClient\\WorldElapsedTimer",
+ "DBFilesClient\\WorldMapArea",
+ "DBFilesClient\\WorldMapContinent",
+ "DBFilesClient\\WorldMapOverlay",
+ "DBFilesClient\\WorldMapTransforms",
+ "DBFilesClient\\WorldSafeLocs",
+ "DBFilesClient\\WorldState",
+ "DBFilesClient\\WorldStateExpression",
+ "DBFilesClient\\WorldStateUI",
+ "DBFilesClient\\WorldStateZoneSounds",
+ "DBFilesClient\\World_PVP_Area",
+ "DBFilesClient\\ZoneIntroMusicTable",
+ "DBFilesClient\\ZoneLight",
+ "DBFilesClient\\ZoneLightPoint",
+ "DBFilesClient\\ZoneMusic",
+ "DBFilesClient\\gtArmorMitigationByLvl",
+ "DBFilesClient\\gtAttackPower",
+ "DBFilesClient\\gtAttackPowerRanged",
+ "DBFilesClient\\gtAvoidanceDim",
+ "DBFilesClient\\gtBarberShopCostBase",
+ "DBFilesClient\\gtBattlePetTypeDamageMod",
+ "DBFilesClient\\gtBattlePetXP",
+ "DBFilesClient\\gtChanceToDodgeBase",
+ "DBFilesClient\\gtChanceToMeleeCrit",
+ "DBFilesClient\\gtChanceToMeleeCritBase",
+ "DBFilesClient\\gtChanceToParryBase",
+ "DBFilesClient\\gtChanceToSpellCrit",
+ "DBFilesClient\\gtChanceToSpellCritBase",
+ "DBFilesClient\\gtCombatRatings",
+ "DBFilesClient\\gtItemLevelByLevel",
+ "DBFilesClient\\gtItemSocketCostPerLevel",
+ "DBFilesClient\\gtNPCExpectedResistPhysExp1",
+ "DBFilesClient\\gtNPCExpectedResistPhysExp2",
+ "DBFilesClient\\gtNPCExpectedResistPhysExp3",
+ "DBFilesClient\\gtNPCExpectedResistPhysExp4",
+ "DBFilesClient\\gtNPCExpectedResistPhysExp5",
+ "DBFilesClient\\gtNPCManaCostScaler",
+ "DBFilesClient\\gtNpcDamageByClass",
+ "DBFilesClient\\gtNpcDamageByClassExp1",
+ "DBFilesClient\\gtNpcDamageByClassExp2",
+ "DBFilesClient\\gtNpcDamageByClassExp3",
+ "DBFilesClient\\gtNpcDamageByClassExp4",
+ "DBFilesClient\\gtNpcDamageByClassExp5",
+ "DBFilesClient\\gtNpcGuildExperience",
+ "DBFilesClient\\gtNpcTotalHp",
+ "DBFilesClient\\gtNpcTotalHpExp1",
+ "DBFilesClient\\gtNpcTotalHpExp2",
+ "DBFilesClient\\gtNpcTotalHpExp3",
+ "DBFilesClient\\gtNpcTotalHpExp4",
+ "DBFilesClient\\gtNpcTotalHpExp5",
+ "DBFilesClient\\gtNpcTotalMp",
+ "DBFilesClient\\gtOCTBaseHPByClass",
+ "DBFilesClient\\gtOCTBaseMPByClass",
+ "DBFilesClient\\gtOCTChanceToDodge",
+ "DBFilesClient\\gtOCTChanceToParry",
+ "DBFilesClient\\gtOCTClassCombatRatingScalar",
+ "DBFilesClient\\gtOCTClassStats",
+ "DBFilesClient\\gtOCTHPFromItems",
+ "DBFilesClient\\gtOCTHPPerStamina",
+ "DBFilesClient\\gtOCTLevelExperience",
+ "DBFilesClient\\gtOCTMPFromItems",
+ "DBFilesClient\\gtOCTMPPerIntellect",
+ "DBFilesClient\\gtOCTNPCDpsScaler",
+ "DBFilesClient\\gtOCTNPCExpectedAgility",
+ "DBFilesClient\\gtOCTNPCExpectedIntellect",
+ "DBFilesClient\\gtOCTNPCExpectedResistPhysical",
+ "DBFilesClient\\gtOCTNPCExpectedSpirit",
+ "DBFilesClient\\gtOCTNPCExpectedStamina",
+ "DBFilesClient\\gtOCTNPCExpectedStrength",
+ "DBFilesClient\\gtOCTNPCHPScaler",
+ "DBFilesClient\\gtOCTRaceStats",
+ "DBFilesClient\\gtPCBaseAgility",
+ "DBFilesClient\\gtPCBaseIntellect",
+ "DBFilesClient\\gtPCBaseSpirit",
+ "DBFilesClient\\gtPCBaseStamina",
+ "DBFilesClient\\gtPCBaseStrength",
+ "DBFilesClient\\gtPCExpectedAgility",
+ "DBFilesClient\\gtPCExpectedIntellect",
+ "DBFilesClient\\gtPCExpectedSpirit",
+ "DBFilesClient\\gtPCExpectedStamina",
+ "DBFilesClient\\gtPCExpectedStrength",
+ "DBFilesClient\\gtPVPRanks",
+ "DBFilesClient\\gtRageGenScaler",
+ "DBFilesClient\\gtRegenMPPerSpt",
+ "DBFilesClient\\gtResilienceDR",
+ "DBFilesClient\\gtResistanceInnateFire",
+ "DBFilesClient\\gtResistanceInnateFrost",
+ "DBFilesClient\\gtResistanceInnateHoly",
+ "DBFilesClient\\gtResistanceInnateNature",
+ "DBFilesClient\\gtResistanceInnateShadow",
+ "DBFilesClient\\gtShieldBlockRegular",
+ "DBFilesClient\\gtSpellScaling",
+ "DBFilesClient\\gtXPGroupBonus",
nullptr // terminator
};
diff --git a/src/tools/mesh_extractor/ADT.cpp b/src/tools/mesh_extractor/ADT.cpp
deleted file mode 100644
index 0165a9000f1..00000000000
--- a/src/tools/mesh_extractor/ADT.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "ADT.h"
-#include "DoodadHandler.h"
-#include "LiquidHandler.h"
-#include "WorldModelHandler.h"
-
-ADT::ADT( std::string file, int x, int y ) : ObjectData(NULL), Data(NULL), HasObjectData(false),
- _DoodadHandler(NULL), _WorldModelHandler(NULL), _LiquidHandler(NULL), X(x), Y(y)
-{
- Data = new ChunkedData(file);
- ObjectData = new ChunkedData(file);
- if (ObjectData->Stream)
- HasObjectData = true;
- else
- ObjectData = NULL;
-}
-
-ADT::~ADT()
-{
- delete ObjectData;
- delete Data;
-
- for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
- delete *itr;
-
- MapChunks.clear();
- delete _DoodadHandler;
- delete _WorldModelHandler;
- delete _LiquidHandler;
-}
-
-void ADT::Read()
-{
- Header.Read(Data->GetChunkByName("MHDR")->GetStream());
- MapChunks.reserve(16 * 16);
-
- for (std::vector<Chunk*>::iterator itr = Data->Chunks.begin(); itr != Data->Chunks.end(); ++itr)
- if ((*itr)->Name == "MCNK")
- MapChunks.push_back(new MapChunk(this, *itr));
-
- _LiquidHandler = new LiquidHandler(this);
-
- // do this separate from map chunk initialization to access liquid data
- for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
- (*itr)->GenerateTriangles();
-
- _DoodadHandler = new DoodadHandler(this);
- for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
- _DoodadHandler->ProcessMapChunk(*itr);
-
- _WorldModelHandler = new WorldModelHandler(this);
- for (std::vector<MapChunk*>::iterator itr = MapChunks.begin(); itr != MapChunks.end(); ++itr)
- _WorldModelHandler->ProcessMapChunk(*itr);
-}
diff --git a/src/tools/mesh_extractor/ADT.h b/src/tools/mesh_extractor/ADT.h
deleted file mode 100644
index 55bd8623351..00000000000
--- a/src/tools/mesh_extractor/ADT.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef ADT_H
-#define ADT_H
-#include "ChunkedData.h"
-#include "MapChunk.h"
-
-class DoodadHandler;
-class WorldModelHandler;
-class LiquidHandler;
-
-class ADT
-{
-public:
- ADT(std::string file, int x, int y);
- ~ADT();
-
- void Read();
-
- ChunkedData* ObjectData;
- ChunkedData* Data;
- std::vector<MapChunk*> MapChunks;
- MHDR Header;
- // Can we dispose of this?
- bool HasObjectData;
-
- DoodadHandler* _DoodadHandler;
- WorldModelHandler* _WorldModelHandler;
- LiquidHandler* _LiquidHandler;
-
- int X;
- int Y;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/CMakeLists.txt b/src/tools/mesh_extractor/CMakeLists.txt
deleted file mode 100644
index eb3c63504d4..00000000000
--- a/src/tools/mesh_extractor/CMakeLists.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-# Copyright (C) 2005-2009 MaNGOS project <http://getmangos.com/>
-# Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
-#
-# This file is free software; as a special exception the author gives
-# unlimited permission to copy and/or distribute it, with or without
-# modifications, as long as this notice is preserved.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
-# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
-
-file(GLOB_RECURSE meshExtract_Sources *.cpp *.h)
-
-set(include_Base
- ${CMAKE_BINARY_DIR}
- ${CMAKE_SOURCE_DIR}/src/server/shared
- ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Recast
- ${CMAKE_SOURCE_DIR}/dep/recastnavigation/Detour
- ${CMAKE_SOURCE_DIR}/dep/libmpq
- ${CMAKE_SOURCE_DIR}/dep/g3dlite/include
- ${ACE_INCLUDE_DIR}
- ${CMAKE_CURRENT_SOURCE_DIR}
-)
-
-if( WIN32 )
- set(include_Base
- ${include_Base}
- ${CMAKE_SOURCE_DIR}/dep/libmpq/win
- )
-endif()
-
-include_directories(${include_Base})
-
-add_executable(MeshExtractor ${meshExtract_Sources})
-
-target_link_libraries(MeshExtractor
- g3dlib
- mpq
- Recast
- Detour
- ${BZIP2_LIBRARIES}
- ${ZLIB_LIBRARIES}
- ${ACE_LIBRARY}
-)
-
-if( UNIX )
- install(TARGETS MeshExtractor DESTINATION bin)
-elseif( WIN32 )
- install(TARGETS MeshExtractor DESTINATION "${CMAKE_INSTALL_PREFIX}")
-endif()
diff --git a/src/tools/mesh_extractor/Cache.h b/src/tools/mesh_extractor/Cache.h
deleted file mode 100644
index 9cdec6bed2b..00000000000
--- a/src/tools/mesh_extractor/Cache.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef CACHE_H
-#define CACHE_H
-#include <string>
-#include <map>
-#include "Define.h"
-#include <ace/Guard_T.h>
-#include <ace/Synch.h>
-#include "WorldModelRoot.h"
-#include "Model.h"
-
-template<class K, class T>
-class GenericCache
-{
-public:
- GenericCache() {}
-
- static const uint32 FlushLimit = 300; // We can't get too close to filling up all the memory, and we have to be wary of the maximum number of open streams.
-
- void Insert(K key, T* val)
- {
- ACE_GUARD(ACE_Thread_Mutex, g, mutex);
-
- if (_items.size() > FlushLimit)
- Clear();
- _items[key] = val;
- }
-
- T* Get(K key)
- {
- ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
- typename std::map<K, T*>::iterator itr = _items.find(key);
- if (itr != _items.end())
- return itr->second;
- return NULL;
- }
-
- void Clear()
- {
- for (typename std::map<K, T*>::iterator itr = _items.begin(); itr != _items.end(); ++itr)
- delete itr->second;
- _items.clear();
- }
-private:
- std::map<K, T*> _items;
- ACE_Thread_Mutex mutex;
-};
-
-class CacheClass
-{
-public:
- CacheClass() {}
- GenericCache<std::string, Model> ModelCache;
- GenericCache<std::string, WorldModelRoot> WorldModelCache;
-
- void Clear()
- {
- ModelCache.Clear();
- WorldModelCache.Clear();
- }
-};
-
-extern CacheClass* Cache;
-#endif
diff --git a/src/tools/mesh_extractor/Chunk.cpp b/src/tools/mesh_extractor/Chunk.cpp
deleted file mode 100644
index 62dd885e167..00000000000
--- a/src/tools/mesh_extractor/Chunk.cpp
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "Chunk.h"
-#include "Utils.h"
-
-int32 Chunk::FindSubChunkOffset(std::string name)
-{
- // Reverse the name
- name = std::string(name.rbegin(), name.rend());
- if (name.size() != 4)
- return -1;
-
- FILE* stream = GetStream();
- uint32 matched = 0;
- while (uint32(ftell(stream)) < Utils::Size(stream))
- {
- char b = 0;
- if (fread(&b, sizeof(char), 1, stream) != 1 || b != name[matched])
- matched = 0;
- else
- ++matched;
-
- if (matched == 4)
- return ftell(stream) - 4;
- }
- return -1;
-}
-
-FILE* Chunk::GetStream()
-{
- fseek(Stream, Offset, SEEK_SET);
- return Stream;
-}
diff --git a/src/tools/mesh_extractor/Chunk.h b/src/tools/mesh_extractor/Chunk.h
deleted file mode 100644
index 8c8125ce24b..00000000000
--- a/src/tools/mesh_extractor/Chunk.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef CHUNK_H
-#define CHUNK_H
-#include "Define.h"
-#include <string>
-class ChunkedData;
-
-class Chunk
-{
-public:
- Chunk(const char* name, uint32 length, uint32 offset, FILE* stream) : Name(name), Length(length), Offset(offset), Stream(stream) {}
-
- int32 FindSubChunkOffset(std::string name);
- FILE* GetStream();
- std::string Name;
- uint32 Length;
- uint32 Offset;
- FILE* Stream;
-};
-
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ChunkedData.cpp b/src/tools/mesh_extractor/ChunkedData.cpp
deleted file mode 100644
index 32a6864e040..00000000000
--- a/src/tools/mesh_extractor/ChunkedData.cpp
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "ChunkedData.h"
-#include "MPQManager.h"
-#include "Utils.h"
-
-#include <string>
-
-ChunkedData::ChunkedData( FILE* stream, uint32 maxLength, uint32 chunksHint /*= 300*/ ) :
-Stream(stream)
-{
- if (!Stream)
- return;
- Load(maxLength, chunksHint);
-}
-
-ChunkedData::ChunkedData( const std::string& file, uint32 chunksHint /*= 300*/ )
-{
- Stream = MPQHandler->GetFile(file);
- if (!Stream)
- return;
- Load(0, chunksHint);
-}
-
-void ChunkedData::Load( uint32 maxLength, uint32 chunksHint )
-{
- if (!maxLength)
- maxLength = Utils::Size(Stream);
- Chunks.reserve(chunksHint);
- uint32 baseOffset = ftell(Stream);
- uint32 calcOffset = 0;
- while ((calcOffset + baseOffset) < Utils::Size(Stream) && (calcOffset < maxLength))
- {
- char nameBytes[5];
- uint32 read = fread(&nameBytes, sizeof(char), 4, Stream);
- nameBytes[read] = '\0';
- std::string name = std::string(nameBytes);
- // Utils::Reverse(nameBytes);
- name = std::string(name.rbegin(), name.rend());
- uint32 length;
- if (fread(&length, sizeof(uint32), 1, Stream) != 1)
- continue;
- calcOffset += 8;
- Chunks.push_back(new Chunk(name.c_str(), length, calcOffset + baseOffset, Stream));
- calcOffset += length;
- // save an extra seek at the end
- if ((calcOffset + baseOffset) < Utils::Size(Stream) && calcOffset < maxLength)
- fseek(Stream, length, SEEK_CUR);
- }
-}
-
-int ChunkedData::GetFirstIndex( const std::string& name )
-{
- for (uint32 i = 0; i < Chunks.size(); ++i)
- if (Chunks[i]->Name == name)
- return i;
- return -1;
-}
-
-Chunk* ChunkedData::GetChunkByName( const std::string& name )
-{
- for (uint32 i = 0; i < Chunks.size(); ++i)
- if (Chunks[i]->Name == name)
- return Chunks[i];
- return NULL;
-}
-
-ChunkedData::~ChunkedData()
-{
- for (std::vector<Chunk*>::iterator itr = Chunks.begin(); itr != Chunks.end(); ++itr)
- delete *itr;
-
- Chunks.clear();
- if (Stream)
- fclose(Stream);
-}
diff --git a/src/tools/mesh_extractor/ChunkedData.h b/src/tools/mesh_extractor/ChunkedData.h
deleted file mode 100644
index c674a2fa87e..00000000000
--- a/src/tools/mesh_extractor/ChunkedData.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef CHNK_H
-#define CHNK_H
-
-#include <vector>
-#include "Chunk.h"
-
-class ChunkedData
-{
-public:
- ChunkedData(FILE* stream, uint32 maxLength, uint32 chunksHint = 300);
- ChunkedData(const std::string &file, uint32 chunksHint = 300);
- ~ChunkedData();
-
- int GetFirstIndex(const std::string& name);
- Chunk* GetChunkByName(const std::string& name);
-
- void Load(uint32 maxLength, uint32 chunksHint);
- std::vector<Chunk*> Chunks;
- FILE* Stream;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/Constants.h b/src/tools/mesh_extractor/Constants.h
deleted file mode 100644
index daa8eef2a7a..00000000000
--- a/src/tools/mesh_extractor/Constants.h
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef CONSTANTS_H
-#define CONSTANTS_H
-
-class Constants
-{
-public:
- enum TriangleType
- {
- TRIANGLE_TYPE_UNKNOWN,
- TRIANGLE_TYPE_TERRAIN,
- TRIANGLE_TYPE_WATER,
- TRIANGLE_TYPE_DOODAD,
- TRIANGLE_TYPE_WMO
- };
-
- enum PolyArea
- {
- POLY_AREA_TERRAIN = 1,
- POLY_AREA_WATER = 2,
- POLY_AREA_ROAD = 3,
- POLY_AREA_DANGER = 4,
- };
-
- enum PolyFlag
- {
- POLY_FLAG_WALK = 1,
- POLY_FLAG_SWIM = 2,
- POLY_FLAG_FLIGHTMASTER = 4
- };
-
- enum ExtractFlags
- {
- EXTRACT_FLAG_DBC = 0x01,
- EXTRACT_FLAG_MAPS = 0x02,
- EXTRACT_FLAG_VMAPS = 0x04,
- EXTRACT_FLAG_GOB_MODELS = 0x08,
- EXTRACT_FLAG_MMAPS = 0x10,
- EXTRACT_FLAG_TEST = 0x20,
- EXTRACT_FLAG_ALLOWED = EXTRACT_FLAG_DBC | EXTRACT_FLAG_MAPS | EXTRACT_FLAG_VMAPS | EXTRACT_FLAG_GOB_MODELS | EXTRACT_FLAG_MMAPS | EXTRACT_FLAG_TEST
- };
-
- static const float TileSize;
- static const float MaxXY;
- static const float ChunkSize;
- static const float UnitSize;
- static const float Origin[];
- static const float PI;
- static const float MaxStandableHeight;
- static bool ToWoWCoords;
- static bool Debug;
- static const char* VMAPMagic;
- static const float BaseUnitDim;
- static const int VertexPerMap;
- static const int VertexPerTile;
- static const int TilesPerMap;
-};
-
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ContinentBuilder.cpp b/src/tools/mesh_extractor/ContinentBuilder.cpp
deleted file mode 100644
index a60a4b4ce3e..00000000000
--- a/src/tools/mesh_extractor/ContinentBuilder.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "ContinentBuilder.h"
-#include "TileBuilder.h"
-#include "WDT.h"
-#include "Utils.h"
-#include "DetourNavMesh.h"
-#include "Cache.h"
-#include "ace/Task.h"
-#include "Recast.h"
-#include "DetourCommon.h"
-
-class BuilderThread : public ACE_Task_Base
-{
-private:
- int X, Y, MapId;
- std::string Continent;
- dtNavMeshParams Params;
- ContinentBuilder* cBuilder;
-public:
- BuilderThread(ContinentBuilder* _cBuilder, dtNavMeshParams& params) : Params(params), cBuilder(_cBuilder), Free(true) {}
-
- void SetData(int x, int y, int map, const std::string& cont)
- {
- X = x;
- Y = y;
- MapId = map;
- Continent = cont;
- }
-
- int svc()
- {
- Free = false;
- printf("[%02i,%02i] Building tile\n", X, Y);
- TileBuilder builder(cBuilder, Continent, X, Y, MapId);
- char buff[100];
- sprintf(buff, "mmaps/%03u%02i%02i.mmtile", MapId, Y, X);
- FILE* f = fopen(buff, "r");
- if (f) // Check if file already exists.
- {
- printf("[%02i,%02i] Tile skipped, file already exists\n", X, Y);
- fclose(f);
- Free = true;
- return 0;
- }
- uint8* nav = builder.BuildTiled(Params);
- if (nav)
- {
- f = fopen(buff, "wb");
- if (!f)
- {
- printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff);
- return 0;
- }
- MmapTileHeader header;
- header.size = builder.DataSize;
- fwrite(&header, sizeof(MmapTileHeader), 1, f);
- fwrite(nav, sizeof(unsigned char), builder.DataSize, f);
- fclose(f);
- }
- dtFree(nav);
- printf("[%02i,%02i] Tile Built!\n", X, Y);
- Free = true;
- return 0;
- }
-
- bool Free;
-};
-
-void ContinentBuilder::getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax)
-{
- // this is for elevation
- if (verts && vertCount)
- rcCalcBounds(verts, vertCount, bmin, bmax);
- else
- {
- bmin[1] = FLT_MIN;
- bmax[1] = FLT_MAX;
- }
-
- // this is for width and depth
- bmax[0] = (32 - int(tileX)) * Constants::TileSize;
- bmax[2] = (32 - int(tileY)) * Constants::TileSize;
- bmin[0] = bmax[0] - Constants::TileSize;
- bmin[2] = bmax[2] - Constants::TileSize;
-}
-
-void ContinentBuilder::CalculateTileBounds()
-{
- for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
- {
- tileXMax = std::max(itr->X, tileXMax);
- tileXMin = std::min(itr->X, tileXMin);
-
- tileYMax = std::max(itr->Y, tileYMax);
- tileYMin = std::min(itr->Y, tileYMin);
- }
- getTileBounds(tileXMax, tileYMax, NULL, 0, bmin, bmax);
-}
-
-void ContinentBuilder::Build()
-{
- char buff[50];
- sprintf(buff, "mmaps/%03u.mmap", MapId);
- FILE* mmap = fopen(buff, "wb");
- if (!mmap)
- {
- printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff);
- return;
- }
-
- CalculateTileBounds();
-
- dtNavMeshParams params;
-
- std::vector<BuilderThread*> Threads;
-
- if (TileMap->IsGlobalModel)
- {
- printf("Map %s ( %u ) is a WMO. Building with 1 thread.\n", Continent.c_str(), MapId);
-
- TileBuilder* builder = new TileBuilder(this, Continent, 0, 0, MapId);
- builder->AddGeometry(TileMap->Model, TileMap->ModelDefinition);
- uint8* nav = builder->BuildInstance(params);
- if (nav)
- {
- // Set some params for the navmesh
- dtMeshHeader* header = (dtMeshHeader*)nav;
- dtVcopy(params.orig, header->bmin);
- params.tileWidth = header->bmax[0] - header->bmin[0];
- params.tileHeight = header->bmax[2] - header->bmin[2];
- params.maxTiles = 1;
- params.maxPolys = header->polyCount;
- fwrite(&params, sizeof(dtNavMeshParams), 1, mmap);
- fclose(mmap);
-
- char buff[100];
- sprintf(buff, "mmaps/%03u%02i%02i.mmtile", MapId, 0, 0);
- FILE* f = fopen(buff, "wb");
- if (!f)
- {
- printf("Could not create file %s. Check that you have write permissions to the destination folder and try again\n", buff);
- return;
- }
-
- MmapTileHeader mheader;
- mheader.size = builder->DataSize;
- fwrite(&mheader, sizeof(MmapTileHeader), 1, f);
- fwrite(nav, sizeof(unsigned char), builder->DataSize, f);
- fclose(f);
- }
-
- dtFree(nav);
- delete builder;
- }
- else
- {
- params.maxPolys = 32768;
- params.maxTiles = 4096;
- rcVcopy(params.orig, Constants::Origin);
- params.tileHeight = Constants::TileSize;
- params.tileWidth = Constants::TileSize;
- fwrite(&params, sizeof(dtNavMeshParams), 1, mmap);
- fclose(mmap);
-
- for (uint32 i = 0; i < NumberOfThreads; ++i)
- Threads.push_back(new BuilderThread(this, params));
- printf("Map %s ( %u ) has %u tiles. Building them with %u threads\n", Continent.c_str(), MapId, uint32(TileMap->TileTable.size()), NumberOfThreads);
- for (std::vector<TilePos>::iterator itr = TileMap->TileTable.begin(); itr != TileMap->TileTable.end(); ++itr)
- {
- bool next = false;
- while (!next)
- {
- for (std::vector<BuilderThread*>::iterator _th = Threads.begin(); _th != Threads.end(); ++_th)
- {
- if ((*_th)->Free)
- {
- (*_th)->SetData(itr->X, itr->Y, MapId, Continent);
- (*_th)->activate();
- next = true;
- break;
- }
- }
- // Wait for 20 seconds
- ACE_OS::sleep(ACE_Time_Value (0, 20000));
- }
- }
- }
-
- Cache->Clear();
-
- // Free memory
- for (std::vector<BuilderThread*>::iterator _th = Threads.begin(); _th != Threads.end(); ++_th)
- {
- (*_th)->wait();
- delete *_th;
- }
-}
diff --git a/src/tools/mesh_extractor/ContinentBuilder.h b/src/tools/mesh_extractor/ContinentBuilder.h
deleted file mode 100644
index b8a7dee0528..00000000000
--- a/src/tools/mesh_extractor/ContinentBuilder.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef CONT_BUILDER_H
-#define CONT_BUILDER_H
-#include <string>
-#include "WDT.h"
-#include "Define.h"
-
-class ContinentBuilder
-{
-public:
- ContinentBuilder(std::string continent, uint32 mapId, WDT* wdt, uint32 tn) :
- Continent(continent), TileMap(wdt), MapId(mapId),
- NumberOfThreads(tn), tileXMin(64), tileYMin(64), tileXMax(0), tileYMax(0)
- {}
-
- void Build();
- void getTileBounds(uint32 tileX, uint32 tileY, float* verts, int vertCount, float* bmin, float* bmax);
- void CalculateTileBounds();
- float bmin[3];
- float bmax[3];
-private:
- std::string Continent;
- WDT* TileMap;
- uint32 MapId;
- uint32 NumberOfThreads;
- int tileXMin;
- int tileYMin;
- int tileXMax;
- int tileYMax;
-};
-
-#endif
diff --git a/src/tools/mesh_extractor/DBC.cpp b/src/tools/mesh_extractor/DBC.cpp
deleted file mode 100644
index 7e03e165efe..00000000000
--- a/src/tools/mesh_extractor/DBC.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 <cstdio>
-#include "DBC.h"
-#include "Define.h"
-
-DBC::DBC( FILE* stream ) : StringBlock(NULL), StringBlockSize(0), IsFaulty(true)
-{
- char magic[5];
- uint32 count = 0;
- count += fread(&magic, sizeof(char), 4, stream);
- magic[4] = '\0';
- count += fread(&RecordCount, sizeof(uint32), 1, stream);
- Records.reserve(RecordCount);
- count += fread(&Fields, sizeof(uint32), 1, stream);
- count += fread(&RecordSize, sizeof(uint32), 1, stream);
- count += fread(&StringBlockSize, sizeof(uint32), 1, stream);
- if (count != 8)
- printf("DBC::DBC: Failed to read some data expected 8, read %u\n", count);
-
- for (int i = 0; i < RecordCount; i++)
- {
- Record* rec = new Record(this);
- Records.push_back(rec);
- int size = 0;
- for (int f = 0; f < Fields; f++)
- {
- if (size + 4 > RecordSize)
- {
- IsFaulty = true;
- break;
- }
- uint32 tmp;
- if (fread(&tmp, sizeof(uint32), 1, stream) != 1)
- printf("DBC::DBC: Failed to read some data expected 1, read 0\n");
- rec->Values.push_back(tmp);
- size += 4;
- }
- }
-
- StringBlock = new uint8[StringBlockSize];
- count = fread(StringBlock, sizeof(uint8), StringBlockSize, stream);
- if (count != StringBlockSize)
- printf("DBC::DBC: Failed to read some data expected %u, read %u\n", StringBlockSize, count);
-}
-
-std::string DBC::GetStringByOffset( int offset )
-{
- int len = 0;
- for (uint32 i = offset; i < StringBlockSize; i++)
- {
- if (!StringBlock[i])
- {
- len = (i - offset);
- break;
- }
- }
- char* d = new char[len+1];
- strcpy(d, (const char*)(StringBlock + offset));
- d[len] = '\0';
- std::string val = std::string(d);
- delete [] d;
- return val;
-}
-
-Record* DBC::GetRecordById( int id )
-{
- // we assume Id is index 0
- for (std::vector<Record*>::iterator itr = Records.begin(); itr != Records.end(); ++itr)
- if ((*itr)->Values[0] == id)
- return *itr;
- return NULL;
-}
diff --git a/src/tools/mesh_extractor/DBC.h b/src/tools/mesh_extractor/DBC.h
deleted file mode 100644
index df72800c54c..00000000000
--- a/src/tools/mesh_extractor/DBC.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef DBC_H
-#define DBC_H
-#include <vector>
-#include <string>
-#include "Define.h"
-
-class Record;
-
-class DBC
-{
-public:
- DBC(FILE* stream);
-
- std::string GetStringByOffset(int offset);
-
- Record* GetRecordById(int id);
-
- std::string Name;
- std::vector<Record*> Records;
- int RecordCount;
- int Fields;
- int RecordSize;
- uint8* StringBlock;
- uint32 StringBlockSize;
- bool IsFaulty;
-};
-
-class Record
-{
-public:
- Record(DBC* dbc) : Source(dbc) {}
-
- DBC* Source;
- std::vector<int> Values;
-
- int operator[](int index)
- {
- return Values[index];
- }
-
- template <typename T>
- T GetValue(int index)
- {
- return *(T*)(&Values[index]);
- }
-
- std::string GetString(int index)
- {
- return Source->GetStringByOffset(Values[index]);
- }
-};
-
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/DoodadHandler.cpp b/src/tools/mesh_extractor/DoodadHandler.cpp
deleted file mode 100644
index 72b5ce2fcc6..00000000000
--- a/src/tools/mesh_extractor/DoodadHandler.cpp
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "DoodadHandler.h"
-#include "Chunk.h"
-#include "Cache.h"
-#include "Model.h"
-#include "G3D/Matrix4.h"
-
-DoodadHandler::DoodadHandler( ADT* adt ) :
- ObjectDataHandler(adt), _definitions(NULL), _paths(NULL)
-{
- Chunk* mddf = adt->ObjectData->GetChunkByName("MDDF");
- if (mddf)
- ReadDoodadDefinitions(mddf);
-
- Chunk* mmid = adt->ObjectData->GetChunkByName("MMID");
- Chunk* mmdx = adt->ObjectData->GetChunkByName("MMDX");
- if (mmid && mmdx)
- ReadDoodadPaths(mmid, mmdx);
-}
-
-void DoodadHandler::ProcessInternal( MapChunk* mcnk )
-{
- if (!IsSane())
- return;
-
- uint32 refCount = mcnk->Header.DoodadRefs;
- FILE* stream = mcnk->Source->GetStream();
- fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
- for (uint32 i = 0; i < refCount; i++)
- {
- int32 index;
- int32 count;
- if ((count = fread(&index, sizeof(int32), 1, stream)) != 1)
- printf("DoodadHandler::ProcessInternal: Failed to read some data expected 1, read %d\n", count);
- if (index < 0 || uint32(index) >= _definitions->size())
- continue;
- DoodadDefinition doodad = (*_definitions)[index];
- if (_drawn.find(doodad.UniqueId) != _drawn.end())
- continue;
- _drawn.insert(doodad.UniqueId);
- if (doodad.MmidIndex >= _paths->size())
- continue;
-
- std::string path = (*_paths)[doodad.MmidIndex];
- Model* model = Cache->ModelCache.Get(path);
- if (!model)
- {
- model = new Model(path);
- Cache->ModelCache.Insert(path, model);
- }
- if (!model->IsCollidable)
- continue;
-
- Vertices.reserve(refCount * model->Vertices.size() * 0.2);
- Triangles.reserve(refCount * model->Triangles.size() * 0.2);
-
- InsertModelGeometry(doodad, model);
- }
- // Restore the stream position
- fseek(stream, mcnk->Source->Offset, SEEK_SET);
-}
-
-void DoodadHandler::ReadDoodadDefinitions( Chunk* chunk )
-{
- int32 count = chunk->Length / 36;
- _definitions = new std::vector<DoodadDefinition>;
- _definitions->reserve(count);
- FILE* stream = chunk->GetStream();
- for (int i = 0; i < count; i++)
- {
- DoodadDefinition def;
- def.Read(stream);
- _definitions->push_back(def);
- }
-}
-
-void DoodadHandler::ReadDoodadPaths( Chunk* id, Chunk* data )
-{
- int paths = id->Length / 4;
- _paths = new std::vector<std::string>();
- _paths->reserve(paths);
- for (int i = 0; i < paths; i++)
- {
- FILE* idStream = id->GetStream();
- fseek(idStream, i * 4, SEEK_CUR);
- uint32 offset;
- if (fread(&offset, sizeof(uint32), 1, idStream) != 1)
- printf("DoodadHandler::ReadDoodadPaths: Failed to read some data expected 1, read 0\n");
- FILE* dataStream = data->GetStream();
- fseek(dataStream, offset + data->Offset, SEEK_SET);
- _paths->push_back(Utils::ReadString(dataStream));
- }
-}
-
-void DoodadHandler::InsertModelGeometry(const DoodadDefinition& def, Model* model)
-{
- uint32 vertOffset = Vertices.size();
-
- for (std::vector<Vector3>::iterator itr = model->Vertices.begin(); itr != model->Vertices.end(); ++itr)
- Vertices.push_back(Utils::TransformDoodadVertex(def, *itr)); // Vertices have to be converted based on the information from the DoodadDefinition struct
-
- for (std::vector<Triangle<uint16> >::iterator itr = model->Triangles.begin(); itr != model->Triangles.end(); ++itr)
- Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_DOODAD, itr->V0 + vertOffset, itr->V1 + vertOffset, itr->V2 + vertOffset));
-}
-
-DoodadHandler::~DoodadHandler()
-{
- delete _definitions;
- delete _paths;
-}
diff --git a/src/tools/mesh_extractor/DoodadHandler.h b/src/tools/mesh_extractor/DoodadHandler.h
deleted file mode 100644
index f37d5d0f707..00000000000
--- a/src/tools/mesh_extractor/DoodadHandler.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef DOOADHNDL_H
-#define DOOADHNDL_H
-#include "ObjectDataHandler.h"
-#include "Utils.h"
-#include "Chunk.h"
-#include "Model.h"
-#include <set>
-#include <vector>
-
-class DoodadDefinition : public IDefinition
-{
-public:
- uint32 MmidIndex;
- uint32 UniqueId;
- uint16 DecimalScale;
- uint16 Flags;
-
- virtual float Scale() const { return DecimalScale / 1024.0f; }
-
- Vector3 FixCoords(Vector3& vec)
- {
- return Vector3(vec.z, vec.x, vec.y);
- }
-
- void Read(FILE* stream)
- {
- int count = 0;
-
- count += fread(&MmidIndex, sizeof(uint32), 1, stream);
- count += fread(&UniqueId, sizeof(uint32), 1, stream);
- Position = (Vector3::Read(stream));
- Rotation = Vector3::Read(stream);
- count += fread(&DecimalScale, sizeof(uint16), 1, stream);
- count += fread(&Flags, sizeof(uint16), 1, stream);
- if (count != 4)
- printf("DoodadDefinition::Read: Failed to read some data expected 4, read %d\n", count);
- }
-};
-
-class DoodadHandler : public ObjectDataHandler
-{
-public:
- DoodadHandler(ADT* adt);
- ~DoodadHandler();
-
- std::vector<Vector3> Vertices;
- std::vector<Triangle<uint32> > Triangles;
- bool IsSane() { return _definitions && _paths; }
-
-
-protected:
- void ProcessInternal(MapChunk* chunk);
-
-private:
- void ReadDoodadDefinitions(Chunk* chunk);
- void ReadDoodadPaths(Chunk* id, Chunk* data);
- void InsertModelGeometry(const DoodadDefinition& def, Model* model);
- std::set<uint32> _drawn;
- std::vector<DoodadDefinition>* _definitions;
- std::vector<std::string>* _paths;
-};
-#endif
diff --git a/src/tools/mesh_extractor/Geometry.cpp b/src/tools/mesh_extractor/Geometry.cpp
deleted file mode 100644
index b037c44e630..00000000000
--- a/src/tools/mesh_extractor/Geometry.cpp
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "Geometry.h"
-#include "Constants.h"
-#include "ADT.h"
-#include "WorldModelHandler.h"
-#include "DoodadHandler.h"
-#include <limits.h>
-
-Geometry::Geometry() : Transform(false)
-{
- Vertices.reserve(10000);
- Triangles.reserve(10000);
-}
-
-void Geometry::CalculateBoundingBox( float*& min, float*& max )
-{
- min = new float[3];
- max = new float[3];
- for (int i = 0; i < 3; ++i)
- {
- max[i] = std::numeric_limits<float>::lowest();
- min[i] = std::numeric_limits<float>::max();
- }
-
- for (std::vector<Vector3>::iterator itr = Vertices.begin(); itr != Vertices.end(); ++itr)
- {
- if (itr->x > max[0])
- max[0] = itr->x;
- if (itr->x < min[0])
- min[0] = itr->x;
-
- if (itr->y > max[1])
- max[1] = itr->y;
- if (itr->y < min[1])
- min[1] = itr->y;
-
- if (itr->z > max[2])
- max[2] = itr->z;
- if (itr->z < min[2])
- min[2] = itr->z;
- }
-}
-
-void Geometry::CalculateMinMaxHeight( float& min, float& max )
-{
- min = std::numeric_limits<float>::max();
- max = std::numeric_limits<float>::lowest();
-
- for (std::vector<Vector3>::iterator itr = Vertices.begin(); itr != Vertices.end(); ++itr)
- {
- if (Transform)
- {
- if (itr->y < min)
- min = itr->y;
- if (itr->y > max)
- max = itr->y;
- }
- else
- {
- if (itr->z < min)
- min = itr->z;
- if (itr->z > max)
- max = itr->z;
- }
- }
-}
-
-void Geometry::AddData( std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris )
-{
- uint32 vertOffset = Vertices.size();
- for (std::vector<Vector3>::iterator itr = verts.begin(); itr != verts.end(); ++itr)
- Vertices.push_back(Transform ? Utils::ToRecast(*itr) : *itr);
-
- for (std::vector<Triangle<uint32> >::iterator itr = tris.begin(); itr != tris.end(); ++itr)
- Triangles.push_back(Triangle<uint32>(itr->Type, itr->V0 + vertOffset, itr->V1 + vertOffset, itr->V2 + vertOffset));
-}
-
-void Geometry::GetRawData( float*& verts, int*& tris, uint8*& areas )
-{
- verts = new float[Vertices.size() * 3];
- for (uint32 i = 0; i < Vertices.size(); ++i)
- {
- Vector3& vert = Vertices[i];
- verts[(i * 3) + 0] = vert.x;
- verts[(i * 3) + 1] = vert.y;
- verts[(i * 3) + 2] = vert.z;
- }
-
- tris = new int[Triangles.size() * 3];
- for (uint32 i = 0; i < Triangles.size(); ++i)
- {
- Triangle<uint32>& tri = Triangles[i];
- tris[(i * 3) + 0] = (int)tri.V0;
- tris[(i * 3) + 1] = (int)tri.V1;
- tris[(i * 3) + 2] = (int)tri.V2;
- }
-
- areas = new uint8[Triangles.size()];
- for (uint32 i = 0; i < Triangles.size(); i++)
- {
- switch (Triangles[i].Type)
- {
- case Constants::TRIANGLE_TYPE_WATER:
- areas[i] = Constants::POLY_AREA_WATER;
- break;
- default:
- areas[i] = Constants::POLY_AREA_TERRAIN;
- break;
- }
- }
-}
-
-void Geometry::AddAdt( ADT* adt )
-{
- for (std::vector<MapChunk*>::iterator itr = adt->MapChunks.begin(); itr != adt->MapChunks.end(); ++itr)
- {
- std::vector<Triangle<uint32> > tmp;
- tmp.reserve((*itr)->Triangles.size());
- for (std::vector<Triangle<uint8> >::iterator itr2 = (*itr)->Triangles.begin(); itr2 != (*itr)->Triangles.end(); ++itr2)
- tmp.push_back(Triangle<uint32>(itr2->Type, itr2->V0, itr2->V1, itr2->V2));
- AddData((*itr)->Vertices, tmp);
- }
-
- if (!adt->_DoodadHandler->Triangles.empty())
- AddData(adt->_DoodadHandler->Vertices, adt->_DoodadHandler->Triangles);
-
- if (!adt->_WorldModelHandler->Triangles.empty())
- AddData(adt->_WorldModelHandler->Vertices, adt->_WorldModelHandler->Triangles);
-}
-
diff --git a/src/tools/mesh_extractor/Geometry.h b/src/tools/mesh_extractor/Geometry.h
deleted file mode 100644
index 0bef60e16fd..00000000000
--- a/src/tools/mesh_extractor/Geometry.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef GEOMETRY_H
-#define GEOMETRY_H
-#include <vector>
-
-#include "Utils.h"
-
-class ADT;
-class Geometry
-{
-public:
- Geometry();
-
- void CalculateBoundingBox(float*& min, float*& max);
- void CalculateMinMaxHeight(float& min, float& max);
- void AddData(std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris);
- void AddAdt(ADT* adt);
- void GetRawData(float*& verts, int*& tris, uint8*& areas);
-
- std::vector<Vector3> Vertices;
- std::vector<Triangle<uint32> > Triangles;
- bool Transform;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/LiquidHandler.cpp b/src/tools/mesh_extractor/LiquidHandler.cpp
deleted file mode 100644
index 1025c10da55..00000000000
--- a/src/tools/mesh_extractor/LiquidHandler.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "LiquidHandler.h"
-#include "Utils.h"
-
-LiquidHandler::LiquidHandler( ADT* adt ) : Source(adt)
-{
- HandleNewLiquid();
-}
-
-void LiquidHandler::HandleNewLiquid()
-{
- Chunk* chunk = Source->Data->GetChunkByName("MH2O");
- if (!chunk)
- return;
-
- Vertices.reserve(1000);
- Triangles.reserve(1000);
-
- FILE* stream = chunk->GetStream();
- H2OHeader header[256];
- MCNKData.reserve(256);
- for (int i = 0; i < 256; i++)
- header[i] = H2OHeader::Read(stream);
-
- for (int i = 0; i < 256; i++)
- {
- H2OHeader h = header[i];
- if (h.LayerCount == 0)
- {
- // Need to fill in missing data with dummies.
- MCNKData.push_back(MCNKLiquidData(NULL, H2ORenderMask()));
- continue;
- }
- fseek(stream, chunk->Offset + h.OffsetInformation, SEEK_SET);
- H2OInformation information = H2OInformation::Read(stream);
-
- float** heights = new float*[9];
- for (int j = 0; j < 9; ++j)
- {
- heights[j] = new float[9];
- memset(heights[j], 0, sizeof(float) * 9);
- }
-
- H2ORenderMask renderMask;
- if (information.LiquidType != 2)
- {
- fseek(stream, chunk->Offset + h.OffsetRender, SEEK_SET);
- renderMask = H2ORenderMask::Read(stream);
- if ((Utils::IsAllZero(renderMask.Mask, 8) || (information.Width == 8 && information.Height == 8)) && information.OffsetMask2)
- {
- fseek(stream, chunk->Offset + information.OffsetMask2, SEEK_SET);
- uint32 size = ceil(information.Width * information.Height / 8.0f);
- uint8* altMask = new uint8[size];
- if (fread(altMask, sizeof(uint8), size, stream) == size)
- for (uint32 mi = 0; mi < size; mi++)
- renderMask.Mask[mi + information.OffsetY] |= altMask[mi];
- delete[] altMask;
- }
- fseek(stream, chunk->Offset + information.OffsetHeightmap, SEEK_SET);
-
- for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++)
- for (int x = information.OffsetX; x < (information.OffsetX + information.Width); x++)
- if (fread(&heights[x][y], sizeof(float), 1, stream) != 1)
- return;
- }
- else
- {
- // Fill with ocean data
- for (uint32 i = 0; i < 8; ++i)
- renderMask.Mask[i] = 0xFF;
-
- for (uint32 y = 0; y < 9; ++y)
- for (uint32 x = 0; x < 9; ++x)
- heights[x][y] = information.HeightLevel1;
- }
-
- MCNKData.push_back(MCNKLiquidData(heights, renderMask));
-
- for (int y = information.OffsetY; y < (information.OffsetY + information.Height); y++)
- {
- for (int x = information.OffsetX; x < (information.OffsetX + information.Width); x++)
- {
- if (!renderMask.ShouldRender(x, y))
- continue;
-
- MapChunk* mapChunk = Source->MapChunks[i];
- Vector3 location = mapChunk->Header.Position;
- location.y = location.y - (x * Constants::UnitSize);
- location.x = location.x - (y * Constants::UnitSize);
- location.z = heights[x][y];
-
- uint32 vertOffset = Vertices.size();
- Vertices.push_back(location);
- Vertices.push_back(Vector3(location.x - Constants::UnitSize, location.y, location.z));
- Vertices.push_back(Vector3(location.x, location.y - Constants::UnitSize, location.z));
- Vertices.push_back(Vector3(location.x - Constants::UnitSize, location.y - Constants::UnitSize, location.z));
-
- Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset, vertOffset+2, vertOffset + 1));
- Triangles.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset + 2, vertOffset + 3, vertOffset + 1));
- }
- }
- }
-}
diff --git a/src/tools/mesh_extractor/LiquidHandler.h b/src/tools/mesh_extractor/LiquidHandler.h
deleted file mode 100644
index 61fdd213c6b..00000000000
--- a/src/tools/mesh_extractor/LiquidHandler.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef LIQUID_H
-#define LIQUID_H
-#include "ADT.h"
-#include "Utils.h"
-#include "Define.h"
-
-#include <vector>
-
-class LiquidHandler
-{
-public:
- LiquidHandler(ADT* adt);
-
- ADT* Source;
- std::vector<Vector3> Vertices;
- std::vector<Triangle<uint32> > Triangles;
- std::vector<MCNKLiquidData> MCNKData;
-private:
- void HandleNewLiquid();
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/MPQ.cpp b/src/tools/mesh_extractor/MPQ.cpp
deleted file mode 100644
index 7bb882ac703..00000000000
--- a/src/tools/mesh_extractor/MPQ.cpp
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "MPQ.h"
-#include "MPQManager.h"
-#include <deque>
-#include <cstdio>
-
-MPQArchive::MPQArchive(const char* filename)
-{
- int result = libmpq__archive_open(&mpq_a, filename, -1);
- printf("Opening %s\n", filename);
- if (result)
- {
- switch (result)
- {
- case LIBMPQ_ERROR_OPEN :
- printf("Error opening archive '%s': Does file really exist?\n", filename);
- break;
- case LIBMPQ_ERROR_FORMAT : /* bad file format */
- printf("Error opening archive '%s': Bad file format\n", filename);
- break;
- case LIBMPQ_ERROR_SEEK : /* seeking in file failed */
- printf("Error opening archive '%s': Seeking in file failed\n", filename);
- break;
- case LIBMPQ_ERROR_READ : /* Read error in archive */
- printf("Error opening archive '%s': Read error in archive\n", filename);
- break;
- case LIBMPQ_ERROR_MALLOC : /* maybe not enough memory? :) */
- printf("Error opening archive '%s': Maybe not enough memory\n", filename);
- break;
- default:
- printf("Error opening archive '%s': Unknown error\n", filename);
- break;
- }
- }
- GetFileListTo(Files);
-}
-
-void MPQArchive::close()
-{
- libmpq__archive_close(mpq_a);
-}
-
-MPQFile::MPQFile(const char* filename):
-eof(false), buffer(0), pointer(0), size(0)
-{
- for (std::deque<MPQArchive*>::iterator i = MPQHandler->Archives.begin(); i != MPQHandler->Archives.end();++i)
- {
- mpq_archive* mpq_a = (*i)->mpq_a;
-
- uint32_t filenum;
- if(libmpq__file_number(mpq_a, filename, &filenum))
- continue;
- libmpq__off_t transferred;
- libmpq__file_unpacked_size(mpq_a, filenum, &size);
-
- // HACK: in patch.mpq some files don't want to open and give 1 for filesize
- if (size<=1) {
- // printf("warning: file %s has size %d; cannot Read.\n", filename, size);
- eof = true;
- buffer = 0;
- return;
- }
- buffer = new char[size];
-
- //libmpq_file_getdata
- libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
- /*libmpq_file_getdata(&mpq_a, hash, fileno, (unsigned char*)buffer);*/
- return;
-
- }
- eof = true;
- buffer = 0;
-}
-
-size_t MPQFile::Read(void* dest, size_t bytes)
-{
- if (eof)
- return 0;
-
- size_t rpos = pointer + bytes;
- if (rpos > size_t(size)) {
- bytes = size - pointer;
- eof = true;
- }
-
- memcpy(dest, &(buffer[pointer]), bytes);
-
- pointer = rpos;
-
- return bytes;
-}
-
-void MPQFile::seek(int offset)
-{
- pointer = offset;
- eof = (pointer >= size);
-}
-
-void MPQFile::seekRelative(int offset)
-{
- pointer += offset;
- eof = (pointer >= size);
-}
-
-void MPQFile::close()
-{
- delete[] buffer;
- buffer = 0;
- eof = true;
-}
-
-FILE* MPQFile::GetFileStream()
-{
- FILE* file = tmpfile();
- if (!file)
- {
- printf("Could not create temporary file. Please run as Administrator or root\n");
- exit(1);
- }
- fwrite(buffer, sizeof(char), size, file);
- fseek(file, 0, SEEK_SET);
- return file;
-}
diff --git a/src/tools/mesh_extractor/MPQ.h b/src/tools/mesh_extractor/MPQ.h
deleted file mode 100644
index a5a9c7a77d8..00000000000
--- a/src/tools/mesh_extractor/MPQ.h
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef MPQ_H
-#define MPQ_H
-
-#include "libmpq/mpq.h"
-#include "Define.h"
-#include <string>
-#include <ctype.h>
-#include <vector>
-#include <iostream>
-#include <deque>
-
-class MPQArchive
-{
-
-public:
- mpq_archive_s *mpq_a;
-
- std::vector<std::string> Files;
-
- MPQArchive(const char* filename);
- void close();
-
- void GetFileListTo(std::vector<std::string>& filelist) {
- uint32_t filenum;
- if(libmpq__file_number(mpq_a, "(listfile)", &filenum)) return;
- libmpq__off_t size, transferred;
- libmpq__file_unpacked_size(mpq_a, filenum, &size);
-
- char* buffer = new char[size + 1];
- buffer[size] = '\0';
-
- libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
-
- char seps[] = "\n";
- char* token;
-
- token = strtok( buffer, seps );
- uint32 counter = 0;
- while ((token != NULL) && (counter < size)) {
- //cout << token << endl;
- token[strlen(token) - 1] = 0;
- std::string s = token;
- filelist.push_back(s);
- counter += strlen(token) + 2;
- token = strtok(NULL, seps);
- }
-
- delete[] buffer;
- }
-};
-
-class MPQFile
-{
- //MPQHANDLE handle;
- bool eof;
- char *buffer;
- libmpq__off_t pointer,size;
-
- // disable copying
- MPQFile(const MPQFile& /*f*/) {}
- void operator=(const MPQFile& /*f*/) {}
-
-public:
- MPQFile(const char* filename); // filenames are not case sensitive
- ~MPQFile() { close(); }
- size_t Read(void* dest, size_t bytes);
- FILE* GetFileStream();
- size_t getSize() { return size; }
- size_t getPos() { return pointer; }
- char* getBuffer() { return buffer; }
- char* getPointer() { return buffer + pointer; }
- bool isEof() { return eof; }
- void seek(int offset);
- void seekRelative(int offset);
- void close();
-};
-
-inline void flipcc(char *fcc)
-{
- char t;
- t=fcc[0];
- fcc[0]=fcc[3];
- fcc[3]=t;
- t=fcc[1];
- fcc[1]=fcc[2];
- fcc[2]=t;
-}
-
-#endif
diff --git a/src/tools/mesh_extractor/MPQManager.cpp b/src/tools/mesh_extractor/MPQManager.cpp
deleted file mode 100644
index cef6feb6427..00000000000
--- a/src/tools/mesh_extractor/MPQManager.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "MPQManager.h"
-#include "MPQ.h"
-#include "DBC.h"
-#include "Utils.h"
-#include <ace/Guard_T.h>
-
-char const* MPQManager::Files[] = {
- "common.MPQ",
- "common-2.MPQ",
- "expansion.MPQ",
- "lichking.MPQ",
- "patch.MPQ",
- "patch-2.MPQ",
- "patch-3.MPQ"
-};
-
-char const* MPQManager::Languages[] = { "enGB", "enUS", "deDE", "esES", "frFR", "koKR", "zhCN", "zhTW", "enCN", "enTW", "esMX", "ruRU" };
-
-void MPQManager::Initialize()
-{
- InitializeDBC();
- uint32 size = sizeof(Files) / sizeof(char*);
- for (uint32 i = 0; i < size; ++i)
- {
- MPQArchive* arc = new MPQArchive(std::string("Data/" + std::string(Files[i])).c_str());
- Archives.push_front(arc); // MPQ files have to be transversed in reverse order to properly account for patched files
- printf("Opened %s\n", Files[i]);
- }
-}
-
-void MPQManager::InitializeDBC()
-{
- BaseLocale = -1;
- std::string fileName;
- uint32 size = sizeof(Languages) / sizeof(char*);
- MPQArchive* _baseLocale = NULL;
- for (uint32 i = 0; i < size; ++i)
- {
- std::string _fileName = "Data/" + std::string(Languages[i]) + "/locale-" + std::string(Languages[i]) + ".MPQ";
- FILE* file = fopen(_fileName.c_str(), "rb");
- if (file)
- {
- if (BaseLocale == -1)
- {
- BaseLocale = i;
- _baseLocale = new MPQArchive(_fileName.c_str());
- fileName = _fileName;
- LocaleFiles[i] = _baseLocale;
- }
- else
- LocaleFiles[i] = new MPQArchive(_fileName.c_str());
-
- AvailableLocales.insert(i);
- printf("Detected locale: %s\n", Languages[i]);
- }
- }
- Archives.push_front(_baseLocale);
- if (BaseLocale == -1)
- {
- printf("No locale data detected. Please make sure that the executable is in the same folder as your WoW installation.\n");
- ASSERT(false);
- }
- else
- printf("Using default locale: %s\n", Languages[BaseLocale]);
-}
-
-FILE* MPQManager::GetFile(const std::string& path )
-{
- ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
- MPQFile file(path.c_str());
- if (file.isEof())
- return NULL;
- return file.GetFileStream();
-}
-
-DBC* MPQManager::GetDBC(const std::string& name )
-{
- std::string path = "DBFilesClient\\" + name + ".dbc";
- return new DBC(GetFile(path));
-}
-
-FILE* MPQManager::GetFileFrom(const std::string& path, MPQArchive* file )
-{
- ACE_GUARD_RETURN(ACE_Thread_Mutex, g, mutex, NULL);
- mpq_archive* mpq_a = file->mpq_a;
-
- uint32_t filenum;
- if(libmpq__file_number(mpq_a, path.c_str(), &filenum))
- return NULL;
-
- libmpq__off_t transferred;
- libmpq__off_t size = 0;
- libmpq__file_unpacked_size(mpq_a, filenum, &size);
-
- // HACK: in patch.mpq some files don't want to open and give 1 for filesize
- if (size <= 1)
- return NULL;
-
- uint8* buffer = new uint8[size];
-
- //libmpq_file_getdata
- libmpq__file_read(mpq_a, filenum, (unsigned char*)buffer, size, &transferred);
-
- // Pack the return into a FILE stream
- FILE* ret = tmpfile();
- if (!ret)
- {
- printf("Could not create temporary file. Please run as Administrator or root\n");
- exit(1);
- }
- fwrite(buffer, sizeof(uint8), size, ret);
- fseek(ret, 0, SEEK_SET);
- delete[] buffer;
- return ret;
-}
diff --git a/src/tools/mesh_extractor/MPQManager.h b/src/tools/mesh_extractor/MPQManager.h
deleted file mode 100644
index 43419269226..00000000000
--- a/src/tools/mesh_extractor/MPQManager.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef MPQ_MANAGER_H
-#define MPQ_MANAGER_H
-
-#include "MPQ.h"
-#include <ace/Synch.h>
-#include <set>
-#include <map>
-
-class DBC;
-class MPQManager
-{
-public:
- MPQManager() {}
- ~MPQManager() {}
-
- void Initialize();
- FILE* GetFile(const std::string& path);
- FILE* GetFileFrom(const std::string& path, MPQArchive* file);
- DBC* GetDBC(const std::string& name);
- std::vector<std::string> GetAllFiles(std::string extension);
-
- std::deque<MPQArchive*> Archives;
- int32 BaseLocale;
- std::set<uint32> AvailableLocales;
- std::map<uint32, MPQArchive*> LocaleFiles;
-
- static char const* Files[];
- static char const* Languages[];
-protected:
- void InitializeDBC();
-private:
- ACE_Thread_Mutex mutex;
-};
-
-extern MPQManager* MPQHandler;
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/MapChunk.cpp b/src/tools/mesh_extractor/MapChunk.cpp
deleted file mode 100644
index d21815ebd8a..00000000000
--- a/src/tools/mesh_extractor/MapChunk.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "MapChunk.h"
-#include "ADT.h"
-#include "LiquidHandler.h"
-
-MapChunk::MapChunk( ADT* _adt, Chunk* chunk ) : Adt(_adt), Source(chunk)
-{
- FILE* stream = chunk->GetStream();
- Header.Read(stream);
- fseek(stream, chunk->Offset, SEEK_SET);
- Index = Header.IndexX + Header.IndexY * 16;
- GenerateVertices(stream);
-}
-
-void MapChunk::GenerateTriangles()
-{
- Triangles.reserve(256);
- for (int y = 0; y < 8; y++)
- {
- for (int x = 0; x < 8; x++)
- {
- if (HasHole(Header.Holes, x / 2, y / 2))
- continue;
-
- uint32 topLeft = (17 * y) + x;
- uint32 topRight = (17 * y) + x + 1;
- uint32 bottomLeft = (17 * (y + 1)) + x;
- uint32 bottomRight = (17 * (y + 1)) + x + 1;
- uint32 center = (17 * y) + 9 + x;
-
- Constants::TriangleType triangleType = Constants::TRIANGLE_TYPE_TERRAIN;
- if (Adt->_LiquidHandler && !Adt->_LiquidHandler->MCNKData.empty())
- {
- MCNKLiquidData& data = Adt->_LiquidHandler->MCNKData[Index];
- float maxHeight = std::max(
- std::max(
- std::max(std::max(Vertices[topLeft].z, Vertices[topRight].z), Vertices[bottomLeft].z),
- Vertices[bottomRight].z), Vertices[center].z);
- if (data.IsWater(x, y, maxHeight))
- triangleType = Constants::TRIANGLE_TYPE_WATER;
- }
-
- Triangles.push_back(Triangle<uint8>(triangleType, topRight, topLeft, center));
- Triangles.push_back(Triangle<uint8>(triangleType, topLeft, bottomLeft, center));
- Triangles.push_back(Triangle<uint8>(triangleType, bottomLeft, bottomRight, center));
- Triangles.push_back(Triangle<uint8>(triangleType, bottomRight, topRight, center));
- }
- }
-}
-
-void MapChunk::GenerateVertices( FILE* stream )
-{
- fseek(stream, Header.OffsetMCVT, SEEK_CUR);
- Vertices.reserve(125);
-
- for (int j = 0; j < 17; j++)
- {
- int values = j % 2 ? 8 : 9;
- for (int i = 0; i < values; i++)
- {
- float tmp;
- if (fread(&tmp, sizeof(float), 1, stream) != 1)
- printf("MapChunk::GenerateVertices: Failed to read some data expected 1, read 0\n");
- Vector3 vert(Header.Position.x - (j * (Constants::UnitSize * 0.5f)), Header.Position.y - (i * Constants::UnitSize), Header.Position.z + tmp);
- if (values == 8)
- vert.y -= Constants::UnitSize * 0.5f;
- Vertices.push_back(vert);
- }
- }
- // Restore stream position.
- fseek(stream, Source->Offset, SEEK_SET);
-}
-
-bool MapChunk::HasHole( uint32 map, int x, int y )
-{
- return (map & 0x0000FFFF) & ((1 << x) << (y << 2));
-}
diff --git a/src/tools/mesh_extractor/MapChunk.h b/src/tools/mesh_extractor/MapChunk.h
deleted file mode 100644
index 47873178730..00000000000
--- a/src/tools/mesh_extractor/MapChunk.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef MAPCHUNK_H
-#define MAPCHUNK_H
-#include "Chunk.h"
-#include "Utils.h"
-#include "Constants.h"
-#include <vector>
-class ADT;
-
-class MapChunk
-{
-public:
- MapChunk(ADT* _adt, Chunk* chunk);
-
- void GenerateTriangles();
- void GenerateVertices(FILE* stream);
- static bool HasHole(uint32 map, int x, int y);
- ADT* Adt;
- Chunk* Source;
- MapChunkHeader Header;
- std::vector<Vector3> Vertices;
- std::vector<Triangle<uint8> > Triangles;
- int32 Index;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/MeshExtractor.cpp b/src/tools/mesh_extractor/MeshExtractor.cpp
deleted file mode 100644
index 08afb93194b..00000000000
--- a/src/tools/mesh_extractor/MeshExtractor.cpp
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "MPQManager.h"
-#include "WDT.h"
-#include "ContinentBuilder.h"
-#include "Cache.h"
-#include "DBC.h"
-#include "Constants.h"
-#include "Model.h"
-
-#include "Recast.h"
-#include "DetourNavMesh.h"
-#include "DetourNavMeshQuery.h"
-
-#include <stdio.h>
-
-#include <set>
-
-MPQManager* MPQHandler;
-CacheClass* Cache;
-
-void ExtractMMaps(std::set<uint32>& mapIds, uint32 threads)
-{
- DBC* dbc = MPQHandler->GetDBC("Map");
- printf("Map.dbc contains %u rows.\n", dbc->Records.size());
- for (std::vector<Record*>::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr)
- {
- uint32 mapId = (*itr)->Values[0];
-
- // Skip this map if a list of specific maps was provided and this one is not contained in it.
- if (!mapIds.empty() && mapIds.find(mapId) == mapIds.end())
- {
- if (Constants::Debug)
- printf("Map %u will not be built.\n", mapId);
- continue;
- }
-
- std::string name = (*itr)->GetString(1);
- WDT wdt("World\\maps\\" + name + "\\" + name + ".wdt");
- if (!wdt.IsValid)
- {
- printf("Could not find WDT data for map %u (%s)\n", mapId, name.c_str());
- continue;
- }
- printf("Building %s MapId %u\n", name.c_str(), mapId);
- ContinentBuilder builder(name, mapId, &wdt, threads);
- builder.Build();
- }
-}
-
-void ExtractDBCs()
-{
- printf("Extracting DBCs\n");
- // Create the file system structure
- std::string baseDBCPath = "dbc/";
- Utils::CreateDir(baseDBCPath);
-
- std::set<std::string> DBCFiles;
- const size_t extLen = strlen(".dbc");
- // Populate list of DBC files
- // We get the DBC names by going over the (guaranteed to exist) default locale files
- // Then we look in other locale files in case that they are available.
- for (std::vector<std::string>::iterator itr = MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.begin(); itr != MPQHandler->LocaleFiles[MPQHandler->BaseLocale]->Files.end(); ++itr)
- if (itr->rfind(".dbc") == itr->length() - extLen) // Check if the extension is ".dbc"
- DBCFiles.insert(*itr);
-
- const size_t folderLen = strlen("DBFilesClient\\");
- // Iterate over all available locales
- for (std::set<uint32>::iterator itr = MPQHandler->AvailableLocales.begin(); itr != MPQHandler->AvailableLocales.end(); ++itr)
- {
- printf("Extracting DBCs for locale %s\n", MPQManager::Languages[*itr]);
- std::string path = baseDBCPath;
- if (*itr != uint32(MPQHandler->BaseLocale))
- {
- path += std::string(MPQManager::Languages[*itr]) + "/";
- Utils::CreateDir(path);
- }
-
- std::string component = "component.wow-" + std::string(MPQManager::Languages[*itr]) + ".txt";
- // Extract the component file
- Utils::SaveToDisk(MPQHandler->GetFileFrom(component, MPQHandler->LocaleFiles[*itr]), path + component);
- // Extract the DBC files for the given locale
- for (std::set<std::string>::iterator itr2 = DBCFiles.begin(); itr2 != DBCFiles.end(); ++itr2)
- Utils::SaveToDisk(MPQHandler->GetFileFrom(*itr2, MPQHandler->LocaleFiles[*itr]), path + (itr2->c_str() + folderLen));
- }
- printf("DBC extraction finished!\n");
-}
-
-void ExtractGameobjectModels()
-{
- Constants::ToWoWCoords = true;
- printf("Extracting GameObject models\n");
-
- std::string baseBuildingsPath = "Buildings/";
- std::string baseVmapsPath = "vmaps/";
- Utils::CreateDir(baseVmapsPath);
- Utils::CreateDir(baseBuildingsPath);
-
- FILE* modelList = fopen((baseVmapsPath + "GameObjectModels.list").c_str(), "wb");
- if (!modelList)
- {
- printf("Could not create file vmaps/GameObjectModels.list, please make sure that you have the write permissions in the folder\n");
- return;
- }
-
- DBC* dbc = MPQHandler->GetDBC("GameObjectDisplayInfo");
- for (std::vector<Record*>::iterator itr = dbc->Records.begin(); itr != dbc->Records.end(); ++itr)
- {
- std::string path = (*itr)->GetString(1);
- std::string fileName = Utils::GetPlainName(path.c_str());
- std::string extension = Utils::GetExtension(fileName);
- // Convert the extension to lowercase
- std::transform(extension.begin(), extension.end(), extension.begin(), ::tolower);
- if (extension == "mdx" || extension == "m2")
- {
- fileName = Utils::FixModelPath(fileName);
- Model model(path);
-
- if (model.IsBad)
- continue;
-
- FILE* output = fopen((baseBuildingsPath + fileName).c_str(), "wb");
- if (!output)
- {
- printf("Could not create file %s, please check that you have write permissions\n", (baseBuildingsPath + fileName).c_str());
- continue;
- }
- // Placeholder for 0 values
- int Nop[12] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-
- fwrite(Constants::VMAPMagic, 8, 1, output);
- uint32 numVerts = model.Header.CountBoundingVertices;
- fwrite(&numVerts, sizeof(uint32), 1, output);
- uint32 numGroups = 1;
- fwrite(&numGroups, sizeof(uint32), 1, output);
- fwrite(Nop, 4 * 3 , 1, output); // rootwmoid, flags, groupid
- fwrite(Nop, sizeof(float), 3 * 2, output);//bbox, only needed for WMO currently
- fwrite(Nop, 4, 1, output);// liquidflags
- fwrite("GRP ", 4, 1, output);
-
- uint32 branches = 1;
- uint32 wsize = sizeof(branches) + sizeof(uint32) * branches;
- fwrite(&wsize, sizeof(uint32), 1, output);
- fwrite(&branches, sizeof(branches), 1, output);
- uint32 numTris = model.Header.CountBoundingTriangles;
- fwrite(&numTris, sizeof(uint32), 1, output);
- fwrite("INDX", 4, 1, output);
- wsize = sizeof(uint32) + sizeof(unsigned short) * numTris;
- fwrite(&wsize, sizeof(int), 1, output);
- fwrite(&numTris, sizeof(uint32), 1, output);
- uint16* indices = new uint16[numTris];
-
- if (numTris > 0)
- {
- uint32 i = 0;
- for (std::vector<Triangle<uint16> >::iterator itr2 = model.Triangles.begin(); itr2 != model.Triangles.end(); ++itr2, ++i)
- {
- indices[i * 3 + 0] = itr2->V0;
- indices[i * 3 + 1] = itr2->V1;
- indices[i * 3 + 2] = itr2->V2;
- }
- fwrite(indices, sizeof(uint16), numTris, output);
- }
-
-
- fwrite("VERT", 4, 1, output);
- wsize = sizeof(int) + sizeof(float) * 3 * numVerts;
- fwrite(&wsize, sizeof(int), 1, output);
- fwrite(&numVerts, sizeof(int), 1, output);
- float* vertices = new float[numVerts*3];
-
- if (numVerts > 0)
- {
- uint32 i = 0;
- for (std::vector<Vector3>::iterator itr2 = model.Vertices.begin(); itr2 != model.Vertices.end(); ++itr2, ++i)
- {
- vertices[i * 3 + 0] = itr2->x;
- vertices[i * 3 + 1] = itr2->y;
- vertices[i * 3 + 2] = itr2->z;
- }
-
- fwrite(vertices, sizeof(float), numVerts * 3, output);
- }
-
- fclose(output);
- delete[] indices;
- delete[] vertices;
-
- uint32 displayId = (*itr)->Values[0];
- uint32 pathLength = fileName.size();
- fwrite(&displayId, sizeof(uint32), 1, modelList);
- fwrite(&pathLength, sizeof(uint32), 1, modelList);
- fwrite(fileName.c_str(), sizeof(char), pathLength, modelList);
- }
- else if (extension == "wmo")
- {
- WorldModelRoot model(path);
-
- FILE* output = fopen((baseBuildingsPath + fileName).c_str(), "wb");
- if (!output)
- {
- printf("Could not create file %s, please check that you have write permissions\n", (baseBuildingsPath + fileName).c_str());
- continue;
- }
-
- fwrite(Constants::VMAPMagic, 1, 8, output);
- uint32 numVertices = 0;
- fwrite(&numVertices, sizeof(uint32), 1, output); // will be filled later
- fwrite(&model.Header.CountGroups, sizeof(uint32), 1, output);
- fwrite(&model.Header.WmoId, sizeof(uint32), 1, output);
-
- const char grp[] = { 'G' , 'R' , 'P', ' ' };
- for (std::vector<WorldModelGroup>::iterator itr2 = model.Groups.begin(); itr2 != model.Groups.end(); ++itr2)
- {
- const WMOGroupHeader& header = itr2->Header;
- fwrite(&header.Flags, sizeof(uint32), 1, output);
- fwrite(&header.WmoId, sizeof(uint32), 1, output);
- fwrite(&header.BoundingBox[0], sizeof(uint32), 1, output);
- fwrite(&header.BoundingBox[1], sizeof(uint32), 1, output);
- uint32 LiquidFlags = itr2->HasLiquidData ? 1 : 0;
- fwrite(&LiquidFlags, sizeof(uint32), 1, output);
-
- fwrite(grp, sizeof(char), sizeof(grp), output);
- uint32 k = 0;
- uint32 mobaBatch = itr2->MOBALength / 12;
- uint32* MobaEx = new uint32[mobaBatch*4];
-
- for(uint32 i = 8; i < itr2->MOBALength; i += 12)
- MobaEx[k++] = itr2->MOBA[i];
-
- int mobaSizeGrp = mobaBatch * 4 + 4;
- fwrite(&mobaSizeGrp, 4, 1, output);
- fwrite(&mobaBatch, 4, 1, output);
- fwrite(MobaEx, 4, k, output);
- delete[] MobaEx;
-
- //@TODO: Finish this.
- }
-
- fclose(output);
- }
- }
-
- fclose(modelList);
- printf("GameObject models extraction finished!");
- Constants::ToWoWCoords = false;
-}
-
-bool HandleArgs(int argc, char** argv, uint32& threads, std::set<uint32>& mapList, bool& debugOutput, uint32& extractFlags)
-{
- char* param = NULL;
- extractFlags = 0;
-
- for (int i = 1; i < argc; ++i)
- {
- if (strcmp(argv[i], "--threads") == 0)
- {
- param = argv[++i];
- if (!param)
- return false;
-
- threads = atoi(param);
- printf("Using %u threads\n", threads);
- }
- else if (strcmp(argv[i], "--maps") == 0)
- {
- param = argv[++i];
- if (!param)
- return false;
-
- char* copy = strdup(param);
- char* token = strtok(copy, ",");
- while (token)
- {
- mapList.insert(atoi(token));
- token = strtok(NULL, ",");
- }
-
- free(copy);
-
- printf("Extracting only provided list of maps (%u).\n", uint32(mapList.size()));
- }
- else if (strcmp(argv[i], "--debug") == 0)
- {
- param = argv[++i];
- if (!param)
- return false;
- debugOutput = atoi(param);
- if (debugOutput)
- printf("Output will contain debug information (.obj files)\n");
- }
- else if (strcmp(argv[i], "--extract") == 0)
- {
- param = argv[++i];
- if (!param)
- return false;
-
- extractFlags = atoi(param);
-
- if (!(extractFlags & Constants::EXTRACT_FLAG_ALLOWED)) // Tried to use an invalid flag
- return false;
-
- printf("Detected flags: \n");
- printf("* Extract DBCs: %s\n", (extractFlags & Constants::EXTRACT_FLAG_DBC) ? "Yes" : "No");
- printf("* Extract Maps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_MAPS) ? "Yes" : "No");
- printf("* Extract VMaps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_VMAPS) ? "Yes" : "No");
- printf("* Extract GameObject Models: %s\n", (extractFlags & Constants::EXTRACT_FLAG_GOB_MODELS) ? "Yes" : "No");
- printf("* Extract MMaps: %s\n", (extractFlags & Constants::EXTRACT_FLAG_MMAPS) ? "Yes" : "No");
- }
- }
- return true;
-}
-
-void PrintUsage()
-{
- printf("MeshExtractor help.\n");
- printf("* Use \"--threads <number>\" to specify <number> threads, default to 4 (Only available when extracting MMaps)\n");
- printf("* Use \"--maps a,b,c,d,e\" to extract only the maps specified (Do not use spaces)\n");
- printf("* Use \"--debug 1\" to generate debug information of the tiles (Only available when extracting MMaps)\n");
- printf("* Use \"--extract X\" to extract the data specified by the flag X (Note: You can combine the flags with the bitwise OR operator |). Available flags are: \n");
- {
- printf("- %u to extract DBCs\n", Constants::EXTRACT_FLAG_DBC);
- printf("- %u to extract Maps (Not yet implemented)\n", Constants::EXTRACT_FLAG_MAPS);
- printf("- %u to extract VMaps (Not yet implemented)\n", Constants::EXTRACT_FLAG_VMAPS);
- printf("- %u to extract GameObject models (Not yet finished, you need to run VMapAssembler on the extracted files)\n", Constants::EXTRACT_FLAG_GOB_MODELS);
- printf("- %u to extract MMaps (Not yet finished)\n", Constants::EXTRACT_FLAG_MMAPS);
- }
-}
-
-void LoadTile(dtNavMesh*& navMesh, const char* tile)
-{
- FILE* f = fopen(tile, "rb");
- if (!f)
- return;
- MmapTileHeader header;
-
- if (fread(&header, sizeof(MmapTileHeader), 1, f) != 1)
- return;
-
- uint8* nav = new uint8[header.size];
- if (fread(nav, header.size, 1, f) != 1)
- return;
-
- navMesh->addTile(nav, header.size, DT_TILE_FREE_DATA, 0, NULL);
-
- fclose(f);
-}
-
-int main(int argc, char* argv[])
-{
- _setmaxstdio(2048);
- uint32 threads = 4, extractFlags = 0;
- std::set<uint32> mapIds;
-
- if (!HandleArgs(argc, argv, threads, mapIds, Constants::Debug, extractFlags))
- {
- PrintUsage();
- return -1;
- }
-
- if (extractFlags == 0)
- {
- printf("You must provide valid extract flags.\n");
- PrintUsage();
- return -1;
- }
-
- Cache = new CacheClass();
- MPQHandler = new MPQManager();
- MPQHandler->Initialize();
-
- if (extractFlags & Constants::EXTRACT_FLAG_DBC)
- ExtractDBCs();
-
- if (extractFlags & Constants::EXTRACT_FLAG_MMAPS)
- ExtractMMaps(mapIds, threads);
-
- if (extractFlags & Constants::EXTRACT_FLAG_GOB_MODELS)
- ExtractGameobjectModels();
-
- if (extractFlags & Constants::EXTRACT_FLAG_TEST)
- {
- float start[] = { 16226.200195f, 16257.000000f, 13.202200f };
- float end[] = { 16245.725586f, 16382.465820f, 47.384956f };
-
- //
- float m_spos[3];
- m_spos[0] = -start[1];
- m_spos[1] = start[2];
- m_spos[2] = -start[0];
-
- //
- float m_epos[3];
- m_epos[0] = -end[1];
- m_epos[1] = end[2];
- m_epos[2] = -end[0];
-
- //
- dtQueryFilter m_filter;
- m_filter.setIncludeFlags(Constants::POLY_AREA_ROAD | Constants::POLY_AREA_TERRAIN);
- m_filter.setExcludeFlags(Constants::POLY_AREA_WATER);
-
- //
- float m_polyPickExt[3];
- m_polyPickExt[0] = 2.5f;
- m_polyPickExt[1] = 2.5f;
- m_polyPickExt[2] = 2.5f;
-
- //
- dtPolyRef m_startRef;
- dtPolyRef m_endRef;
-
- FILE* mmap = fopen("mmaps/001.mmap", "rb");
- dtNavMeshParams params;
- int count = fread(&params, sizeof(dtNavMeshParams), 1, mmap);
- fclose(mmap);
- if (count != 1)
- {
- printf("main: Error reading from .mmap\n");
- return 0;
- }
-
- dtNavMesh* navMesh = new dtNavMesh();
- dtNavMeshQuery* navMeshQuery = new dtNavMeshQuery();
-
- navMesh->init(&params);
- for (int i = 0; i <= 32; ++i)
- {
- for (int j = 0; j <= 32; ++j)
- {
- char buff[100];
- sprintf(buff, "mmaps/001%02i%02i.mmtile", i, j);
- LoadTile(navMesh, buff);
- }
- }
-
- navMeshQuery->init(navMesh, 2048);
-
- float nearestPt[3];
-
- navMeshQuery->findNearestPoly(m_spos, m_polyPickExt, &m_filter, &m_startRef, nearestPt);
- navMeshQuery->findNearestPoly(m_epos, m_polyPickExt, &m_filter, &m_endRef, nearestPt);
-
- if ( !m_startRef || !m_endRef )
- {
- std::cerr << "Could not find any nearby poly's (" << m_startRef << "," << m_endRef << ")" << std::endl;
- return 0;
- }
-
- int hops;
- dtPolyRef* hopBuffer = new dtPolyRef[8192];
- dtStatus status = navMeshQuery->findPath(m_startRef, m_endRef, m_spos, m_epos, &m_filter, hopBuffer, &hops, 8192);
-
- int resultHopCount;
- float* straightPath = new float[2048*3];
- unsigned char* pathFlags = new unsigned char[2048];
- dtPolyRef* pathRefs = new dtPolyRef[2048];
-
- status = navMeshQuery->findStraightPath(m_spos, m_epos, hopBuffer, hops, straightPath, pathFlags, pathRefs, &resultHopCount, 2048);
- std::vector<Vector3> FinalPath;
- FinalPath.reserve(resultHopCount);
- for (uint32 i = 0; i < resultHopCount; ++i)
- {
- Vector3 finalV = Utils::ToWoWCoords(Vector3(straightPath[i * 3 + 0], straightPath[i * 3 + 1], straightPath[i * 3 + 2]));
- FinalPath.push_back(finalV);
- printf("Point %f %f %f\n", finalV.x, finalV.y, finalV.z);
- }
- }
-
- return 0;
-}
diff --git a/src/tools/mesh_extractor/Model.cpp b/src/tools/mesh_extractor/Model.cpp
deleted file mode 100644
index ce9132bd4a3..00000000000
--- a/src/tools/mesh_extractor/Model.cpp
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "Model.h"
-#include "MPQManager.h"
-#include "Utils.h"
-
-Model::Model( std::string path ) : IsCollidable(false), IsBad(false)
-{
- Stream = MPQHandler->GetFile(Utils::FixModelPath(path));
- if (!Stream)
- {
- IsBad = true;
- return;
- }
- Header.Read(Stream);
- if (Header.OffsetBoundingNormals > 0 && Header.OffsetBoundingVertices > 0 &&
- Header.OffsetBoundingTriangles > 0 && Header.BoundingRadius > 0.0f)
- {
- IsCollidable = true;
- ReadVertices();
- ReadBoundingNormals();
- ReadBoundingTriangles();
- }
-}
-
-Model::~Model()
-{
- if (Stream)
- fclose(Stream);
-}
-
-void Model::ReadVertices()
-{
- fseek(Stream, Header.OffsetBoundingVertices, SEEK_SET);
- Vertices.reserve(Header.CountBoundingVertices);
- for (uint32 i = 0; i < Header.CountBoundingVertices; ++i)
- {
- Vertices.push_back(Vector3::Read(Stream));
- if (Constants::ToWoWCoords)
- Vertices[i] = Utils::ToWoWCoords(Vertices[i]);
- }
-}
-
-void Model::ReadBoundingTriangles()
-{
- fseek(Stream, Header.OffsetBoundingTriangles, SEEK_SET);
- Triangles.reserve(Header.CountBoundingTriangles / 3);
- for (uint32 i = 0; i < Header.CountBoundingTriangles / 3; i++)
- {
- Triangle<uint16> tri;
- tri.Type = Constants::TRIANGLE_TYPE_DOODAD;
- int count = 0;
- count += fread(&tri.V0, sizeof(uint16), 1, Stream);
- count += fread(&tri.V1, sizeof(uint16), 1, Stream);
- count += fread(&tri.V2, sizeof(uint16), 1, Stream);
- if (count != 3)
- printf("Model::ReadBoundingTriangles: Error reading data, expected 3, read %d\n", count);
- Triangles.push_back(tri);
- }
-}
-
-void Model::ReadBoundingNormals()
-{
- fseek(Stream, Header.OffsetBoundingNormals, SEEK_SET);
- Normals.reserve(Header.CountBoundingNormals);
- for (uint32 i = 0; i < Header.CountBoundingNormals; i++)
- Normals.push_back(Vector3::Read(Stream));
-}
-
diff --git a/src/tools/mesh_extractor/Model.h b/src/tools/mesh_extractor/Model.h
deleted file mode 100644
index 31899ff2191..00000000000
--- a/src/tools/mesh_extractor/Model.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef MODEL_H
-#define MODEL_H
-#include <vector>
-#include "Utils.h"
-
-class Model
-{
-public:
- Model(std::string path);
- ~Model();
-
- void ReadVertices();
- void ReadBoundingTriangles();
- void ReadBoundingNormals();
- ModelHeader Header;
- std::vector<Vector3> Vertices;
- std::vector<Vector3> Normals;
- std::vector<Triangle<uint16> > Triangles;
- bool IsCollidable;
- FILE* Stream;
- bool IsBad;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/ObjectDataHandler.cpp b/src/tools/mesh_extractor/ObjectDataHandler.cpp
deleted file mode 100644
index 1f7c15fd872..00000000000
--- a/src/tools/mesh_extractor/ObjectDataHandler.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "ObjectDataHandler.h"
-#include "Chunk.h"
-#include "ADT.h"
-#include "ChunkedData.h"
-
-void ObjectDataHandler::ProcessMapChunk( MapChunk* chunk )
-{
- ProcessInternal(chunk);
-}
diff --git a/src/tools/mesh_extractor/ObjectDataHandler.h b/src/tools/mesh_extractor/ObjectDataHandler.h
deleted file mode 100644
index 5f6674be488..00000000000
--- a/src/tools/mesh_extractor/ObjectDataHandler.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef ODATA_HNDL_H
-#define ODATA_HNDL_H
-#include "ADT.h"
-#include "MapChunk.h"
-
-class ObjectDataHandler
-{
-public:
- ObjectDataHandler(ADT* _adt) : Source(_adt) {}
-
- void ProcessMapChunk(MapChunk* chunk);
- virtual void ProcessInternal(MapChunk* data) = 0;
- ADT* Source;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/TileBuilder.cpp b/src/tools/mesh_extractor/TileBuilder.cpp
deleted file mode 100644
index d9807603d53..00000000000
--- a/src/tools/mesh_extractor/TileBuilder.cpp
+++ /dev/null
@@ -1,414 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "ContinentBuilder.h"
-#include "TileBuilder.h"
-#include "Geometry.h"
-#include "WorldModelRoot.h"
-#include "Constants.h"
-#include "Utils.h"
-#include "Cache.h"
-#include "ADT.h"
-#include "WDT.h"
-#include "Recast.h"
-#include "RecastAlloc.h"
-#include "DetourNavMeshBuilder.h"
-
-#include <ace/Synch.h>
-
-TileBuilder::TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, int y, uint32 mapId) :
- World(world), X(x), Y(y), MapId(mapId), _Geometry(NULL), DataSize(0), cBuilder(_cBuilder)
-{
- // Config for normal maps
- memset(&Config, 0, sizeof(rcConfig));
- Config.cs = Constants::TileSize / 1800.0f; // TileSize / voxelSize
- Config.ch = 0.3f;
- Config.minRegionArea = 36;
- Config.mergeRegionArea = 144;
- Config.walkableSlopeAngle = 50.0f;
- Config.detailSampleDist = 3.0f;
- Config.detailSampleMaxError = 1.25f;
- Config.walkableClimb = 1.0f / Config.ch;
- Config.walkableHeight = 2.1 / Config.ch;
- Config.walkableRadius = 0.6f / Config.cs;
- Config.maxEdgeLen = Config.walkableRadius * 8;
- Config.borderSize = Config.walkableRadius + 8;
- Config.tileSize = 1800;
- Config.maxSimplificationError = 1.3f;
- Config.maxVertsPerPoly = 6;
-
- // Config for instances
- memset(&InstanceConfig, 0, sizeof(rcConfig));
- InstanceConfig.cs = 0.2f;
- InstanceConfig.ch = 0.3f;
- InstanceConfig.minRegionArea = 25;
- InstanceConfig.mergeRegionArea = 100;
- InstanceConfig.walkableSlopeAngle = 50.0f;
- InstanceConfig.detailSampleDist = 3.0f;
- InstanceConfig.detailSampleMaxError = 1.5f;
- InstanceConfig.walkableClimb = 1.0f / InstanceConfig.ch;
- InstanceConfig.walkableHeight = 2.1f / InstanceConfig.ch;
- InstanceConfig.walkableRadius = 0.6f / InstanceConfig.cs;
- InstanceConfig.maxEdgeLen = 8 * InstanceConfig.walkableRadius;
- InstanceConfig.maxVertsPerPoly = 6;
- InstanceConfig.maxSimplificationError = 1.25f;
- InstanceConfig.borderSize = 0;
-
- Context = new rcContext;
-}
-
-void TileBuilder::CalculateTileBounds( float*& bmin, float*& bmax, dtNavMeshParams& /*navMeshParams*/ )
-{
- bmin = new float[3];
- bmax = new float[3];
- bmin[0] = Constants::Origin[0] /*navMeshParams.orig[0]*/ + (Constants::TileSize * X);
- bmin[2] = Constants::Origin[2] /*navMeshParams.orig[2]*/ + (Constants::TileSize * Y);
- bmax[0] = Constants::Origin[0] /*navMeshParams.orig[0]*/ + (Constants::TileSize * (X + 1));
- bmax[2] = Constants::Origin[2] /*navMeshParams.orig[2]*/ + (Constants::TileSize * (Y + 1));
-}
-
-void TileBuilder::AddGeometry(WorldModelRoot* root, const WorldModelDefinition& def)
-{
- _Geometry = new Geometry();
- _Geometry->Transform = true;
-
- WorldModelHandler::InsertModelGeometry(_Geometry->Vertices, _Geometry->Triangles, def, root, false);
-
- OutputDebugVertices();
-}
-
-uint8* TileBuilder::BuildInstance( dtNavMeshParams& navMeshParams )
-{
- float* bmin = NULL, *bmax = NULL;
-
- _Geometry->CalculateBoundingBox(bmin, bmax);
-
- rcVcopy(InstanceConfig.bmax, bmax);
- rcVcopy(InstanceConfig.bmin, bmin);
-
- uint32 numVerts = _Geometry->Vertices.size();
- uint32 numTris = _Geometry->Triangles.size();
- float* vertices;
- int* triangles;
- uint8* areas;
- _Geometry->GetRawData(vertices, triangles, areas);
-
- // this sets the dimensions of the heightfield
- rcCalcGridSize(InstanceConfig.bmin, InstanceConfig.bmax, InstanceConfig.cs, &InstanceConfig.width, &InstanceConfig.height);
-
- rcHeightfield* hf = rcAllocHeightfield();
- rcCreateHeightfield(Context, *hf, InstanceConfig.width, InstanceConfig.height, InstanceConfig.bmin, InstanceConfig.bmax, InstanceConfig.cs, InstanceConfig.ch);
-
- rcClearUnwalkableTriangles(Context, InstanceConfig.walkableSlopeAngle, vertices, numVerts, triangles, numTris, areas);
- rcRasterizeTriangles(Context, vertices, numVerts, triangles, areas, numTris, *hf, InstanceConfig.walkableClimb);
-
- rcFilterLowHangingWalkableObstacles(Context, InstanceConfig.walkableClimb, *hf);
- rcFilterLedgeSpans(Context, InstanceConfig.walkableHeight, InstanceConfig.walkableClimb, *hf);
- rcFilterWalkableLowHeightSpans(Context, InstanceConfig.walkableHeight, *hf);
-
- rcCompactHeightfield* chf = rcAllocCompactHeightfield();
- rcBuildCompactHeightfield(Context, InstanceConfig.walkableHeight, InstanceConfig.walkableClimb, *hf, *chf);
-
- rcErodeWalkableArea(Context, InstanceConfig.walkableRadius, *chf);
- rcBuildDistanceField(Context, *chf);
- rcBuildRegions(Context, *chf, InstanceConfig.borderSize, InstanceConfig.minRegionArea, InstanceConfig.minRegionArea);
-
- rcContourSet* contours = rcAllocContourSet();
- rcBuildContours(Context, *chf, InstanceConfig.maxSimplificationError, InstanceConfig.maxEdgeLen, *contours);
-
- rcPolyMesh* pmesh = rcAllocPolyMesh();
- rcBuildPolyMesh(Context, *contours, InstanceConfig.maxVertsPerPoly, *pmesh);
-
- rcPolyMeshDetail* dmesh = rcAllocPolyMeshDetail();
- rcBuildPolyMeshDetail(Context, *pmesh, *chf, InstanceConfig.detailSampleDist, InstanceConfig.detailSampleMaxError, *dmesh);
-
- // Set flags according to area types (e.g. Swim for Water)
- for (int i = 0; i < pmesh->npolys; i++)
- {
- if (pmesh->areas[i] == Constants::POLY_AREA_ROAD || pmesh->areas[i] == Constants::POLY_AREA_TERRAIN)
- pmesh->flags[i] = Constants::POLY_FLAG_WALK;
- else if (pmesh->areas[i] == Constants::POLY_AREA_WATER)
- pmesh->flags[i] = Constants::POLY_FLAG_SWIM;
- }
-
- dtNavMeshCreateParams params;
- memset(&params, 0, sizeof(params));
- // PolyMesh data
- params.verts = pmesh->verts;
- params.vertCount = pmesh->nverts;
- params.polys = pmesh->polys;
- params.polyAreas = pmesh->areas;
- params.polyFlags = pmesh->flags;
- params.polyCount = pmesh->npolys;
- params.nvp = pmesh->nvp;
- // PolyMeshDetail data
- params.detailMeshes = dmesh->meshes;
- params.detailVerts = dmesh->verts;
- params.detailVertsCount = dmesh->nverts;
- params.detailTris = dmesh->tris;
- params.detailTriCount = dmesh->ntris;
- rcVcopy(params.bmin, pmesh->bmin);
- rcVcopy(params.bmax, pmesh->bmax);
- // General settings
- params.ch = InstanceConfig.ch;
- params.cs = InstanceConfig.cs;
- params.walkableClimb = InstanceConfig.walkableClimb * InstanceConfig.ch;
- params.walkableHeight = InstanceConfig.walkableHeight * InstanceConfig.ch;
- params.walkableRadius = InstanceConfig.walkableRadius * InstanceConfig.cs;
- params.tileX = X;
- params.tileY = Y;
- params.tileLayer = 0;
- params.buildBvTree = true;
-
- rcVcopy(params.bmax, bmax);
- rcVcopy(params.bmin, bmin);
-
- // Offmesh-connection settings
- params.offMeshConCount = 0; // none for now
-
- rcFreeHeightField(hf);
- rcFreeCompactHeightfield(chf);
- rcFreeContourSet(contours);
- delete vertices;
- delete triangles;
- delete areas;
- delete bmin;
- delete bmax;
-
- if (!params.polyCount || !params.polys || Constants::TilesPerMap * Constants::TilesPerMap == params.polyCount)
- {
- // we have flat tiles with no actual geometry - don't build those, its useless
- // keep in mind that we do output those into debug info
- // drop tiles with only exact count - some tiles may have geometry while having less tiles
- printf("No polygons to build on tile, skipping.\n");
- rcFreePolyMesh(pmesh);
- rcFreePolyMeshDetail(dmesh);
- return NULL;
- }
-
- int navDataSize;
- uint8* navData;
- printf("Creating the navmesh with %i vertices, %i polys, %i triangles!\n", params.vertCount, params.polyCount, params.detailTriCount);
- bool result = dtCreateNavMeshData(&params, &navData, &navDataSize);
-
- rcFreePolyMesh(pmesh);
- rcFreePolyMeshDetail(dmesh);
-
- if (result)
- {
- printf("NavMesh created, size %i!\n", navDataSize);
- DataSize = navDataSize;
- return navData;
- }
-
- return NULL;
-}
-
-uint8* TileBuilder::BuildTiled(dtNavMeshParams& navMeshParams)
-{
- _Geometry = new Geometry();
- _Geometry->Transform = true;
- ADT* adt = new ADT(Utils::GetAdtPath(World, X, Y), X, Y);
- adt->Read();
- _Geometry->AddAdt(adt);
- delete adt;
-
- if (_Geometry->Vertices.empty() && _Geometry->Triangles.empty())
- return NULL;
-
- float* bmin = NULL, *bmax = NULL;
- CalculateTileBounds(bmin, bmax, navMeshParams);
- _Geometry->CalculateMinMaxHeight(bmin[1], bmax[1]);
-
- // again, we load everything - wasteful but who cares
- for (int ty = Y - 1; ty <= Y + 1; ty++)
- {
- for (int tx = X - 1; tx <= X + 1; tx++)
- {
- // don't load main tile again
- if (tx == X && ty == Y)
- continue;
-
- ADT* _adt = new ADT(Utils::GetAdtPath(World, tx, ty), tx, ty);
- // If this condition is met, it means that this WDT does not contain the ADT
- if (!_adt->Data->Stream)
- {
- delete _adt;
- continue;
- }
- _adt->Read();
- _Geometry->AddAdt(_adt);
- delete _adt;
- }
- }
-
- OutputDebugVertices();
-
- uint32 numVerts = _Geometry->Vertices.size();
- uint32 numTris = _Geometry->Triangles.size();
- float* vertices;
- int* triangles;
- uint8* areas;
- _Geometry->GetRawData(vertices, triangles, areas);
- _Geometry->Vertices.clear();
- _Geometry->Triangles.clear();
-
- // add border
- bmin[0] -= Config.borderSize * Config.cs;
- bmin[2] -= Config.borderSize * Config.cs;
- bmax[0] += Config.borderSize * Config.cs;
- bmax[2] += Config.borderSize * Config.cs;
-
- rcHeightfield* hf = rcAllocHeightfield();
- int width = Config.tileSize + (Config.borderSize * 2);
- rcCreateHeightfield(Context, *hf, width, width, bmin, bmax, Config.cs, Config.ch);
-
- rcClearUnwalkableTriangles(Context, Config.walkableSlopeAngle, vertices, numVerts, triangles, numTris, areas);
- rcRasterizeTriangles(Context, vertices, numVerts, triangles, areas, numTris, *hf, Config.walkableClimb);
-
- rcFilterLowHangingWalkableObstacles(Context, Config.walkableClimb, *hf);
- rcFilterLedgeSpans(Context, Config.walkableHeight, Config.walkableClimb, *hf);
- rcFilterWalkableLowHeightSpans(Context, Config.walkableHeight, *hf);
-
- rcCompactHeightfield* chf = rcAllocCompactHeightfield();
- rcBuildCompactHeightfield(Context, Config.walkableHeight, Config.walkableClimb, *hf, *chf);
-
- rcErodeWalkableArea(Context, Config.walkableRadius, *chf);
- rcBuildDistanceField(Context, *chf);
- rcBuildRegions(Context, *chf, Config.borderSize, Config.minRegionArea, Config.mergeRegionArea);
-
- rcContourSet* contours = rcAllocContourSet();
- rcBuildContours(Context, *chf, Config.maxSimplificationError, Config.maxEdgeLen, *contours);
-
- rcPolyMesh* pmesh = rcAllocPolyMesh();
- rcBuildPolyMesh(Context, *contours, Config.maxVertsPerPoly, *pmesh);
-
- rcPolyMeshDetail* dmesh = rcAllocPolyMeshDetail();
- rcBuildPolyMeshDetail(Context, *pmesh, *chf, Config.detailSampleDist, Config.detailSampleMaxError, *dmesh);
-
- // Set flags according to area types (e.g. Swim for Water)
- for (int i = 0; i < pmesh->npolys; i++)
- {
- if (pmesh->areas[i] == Constants::POLY_AREA_ROAD || pmesh->areas[i] == Constants::POLY_AREA_TERRAIN)
- pmesh->flags[i] = Constants::POLY_FLAG_WALK;
- else if (pmesh->areas[i] == Constants::POLY_AREA_WATER)
- pmesh->flags[i] = Constants::POLY_FLAG_SWIM;
- }
-
- dtNavMeshCreateParams params;
- memset(&params, 0, sizeof(params));
- // PolyMesh data
- params.verts = pmesh->verts;
- params.vertCount = pmesh->nverts;
- params.polys = pmesh->polys;
- params.polyAreas = pmesh->areas;
- params.polyFlags = pmesh->flags;
- params.polyCount = pmesh->npolys;
- params.nvp = pmesh->nvp;
- // PolyMeshDetail data
- params.detailMeshes = dmesh->meshes;
- params.detailVerts = dmesh->verts;
- params.detailVertsCount = dmesh->nverts;
- params.detailTris = dmesh->tris;
- params.detailTriCount = dmesh->ntris;
- // General settings
- params.ch = Config.ch;
- params.cs = Config.cs;
- params.walkableClimb = Config.walkableClimb * Config.ch;
- params.walkableHeight = Config.walkableHeight * Config.ch;
- params.walkableRadius = Config.walkableRadius * Config.cs;
- params.tileX = X;
- params.tileY = Y;
- params.tileLayer = 0;
- params.buildBvTree = true;
-
- // Recalculate the bounds with the added geometry
- float* bmin2 = NULL, *bmax2 = NULL;
- CalculateTileBounds(bmin2, bmax2, navMeshParams);
- bmin2[1] = bmin[1];
- bmax2[1] = bmax[1];
-
- rcVcopy(params.bmax, bmax2);
- rcVcopy(params.bmin, bmin2);
-
- // Offmesh-connection settings
- params.offMeshConCount = 0; // none for now
-
- rcFreeHeightField(hf);
- rcFreeCompactHeightfield(chf);
- rcFreeContourSet(contours);
- delete vertices;
- delete triangles;
- delete areas;
- delete bmin;
- delete bmax;
-
- if (!params.polyCount || !params.polys || Constants::TilesPerMap * Constants::TilesPerMap == params.polyCount)
- {
- // we have flat tiles with no actual geometry - don't build those, its useless
- // keep in mind that we do output those into debug info
- // drop tiles with only exact count - some tiles may have geometry while having less tiles
- printf("[%02i, %02i] No polygons to build on tile, skipping.\n", X, Y);
- rcFreePolyMesh(pmesh);
- rcFreePolyMeshDetail(dmesh);
- return NULL;
- }
-
- int navDataSize;
- uint8* navData;
- printf("[%02i, %02i] Creating the navmesh with %i vertices, %i polys, %i triangles!\n", X, Y, params.vertCount, params.polyCount, params.detailTriCount);
- bool result = dtCreateNavMeshData(&params, &navData, &navDataSize);
-
- rcFreePolyMesh(pmesh);
- rcFreePolyMeshDetail(dmesh);
-
- if (result)
- {
- printf("[%02i, %02i] NavMesh created, size %i!\n", X, Y, navDataSize);
- DataSize = navDataSize;
- return navData;
- }
-
- return NULL;
-}
-
-void TileBuilder::OutputDebugVertices()
-{
- if (Constants::Debug)
- {
- char buff[100];
- sprintf(buff, "mmaps/%s_%02u%02u.obj", World.c_str(), Y, X);
- FILE* debug = fopen(buff, "wb");
- for (uint32 i = 0; i < _Geometry->Vertices.size(); ++i)
- {
- const Vector3& vector = _Geometry->Vertices[i];
- fprintf(debug, "v %f %f %f\n", vector.x, vector.y, vector.z);
- }
- for (uint32 i = 0; i < _Geometry->Triangles.size(); ++i)
- {
- const Triangle<uint32>& triangle = _Geometry->Triangles[i];
- fprintf(debug, "f %u %u %u\n", triangle.V0 + 1, triangle.V1 + 1, triangle.V2 + 1);
- }
- fclose(debug);
- }
-}
-
-TileBuilder::~TileBuilder()
-{
- delete Context;
- delete _Geometry;
-}
diff --git a/src/tools/mesh_extractor/TileBuilder.h b/src/tools/mesh_extractor/TileBuilder.h
deleted file mode 100644
index 815f9597d46..00000000000
--- a/src/tools/mesh_extractor/TileBuilder.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef TILE_BUILD_H
-#define TILE_BUILD_H
-#include <string>
-#include "Recast.h"
-
-#include "Geometry.h"
-#include "WorldModelRoot.h"
-
-class ContinentBuilder;
-class WDT;
-
-class TileBuilder
-{
-public:
- TileBuilder(ContinentBuilder* _cBuilder, std::string world, int x, int y, uint32 mapId);
- ~TileBuilder();
-
- void CalculateTileBounds(float*& bmin, float*& bmax, dtNavMeshParams& navMeshParams);
- uint8* BuildTiled(dtNavMeshParams& navMeshParams);
- uint8* BuildInstance(dtNavMeshParams& navMeshParams);
- void AddGeometry(WorldModelRoot* root, const WorldModelDefinition& def);
- void OutputDebugVertices();
- std::string World;
- int X;
- int Y;
- int MapId;
- rcConfig Config;
- rcConfig InstanceConfig;
- rcContext* Context;
- Geometry* _Geometry;
- uint32 DataSize;
- ContinentBuilder* cBuilder;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/Utils.cpp b/src/tools/mesh_extractor/Utils.cpp
deleted file mode 100644
index 3dcdd6598e5..00000000000
--- a/src/tools/mesh_extractor/Utils.cpp
+++ /dev/null
@@ -1,564 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "Utils.h"
-#include "WorldModelHandler.h"
-#include "Constants.h"
-#include <cstring>
-#include "G3D/Matrix4.h"
-#include "G3D/Quat.h"
-
-#ifdef _WIN32
- #include "direct.h"
-#else
- #include <sys/stat.h>
- #include <unistd.h>
-#endif
-
-const float Constants::TileSize = 533.0f + (1/3.0f);
-const float Constants::MaxXY = 32.0f * Constants::TileSize;
-const float Constants::ChunkSize = Constants::TileSize / 16.0f;
-const float Constants::UnitSize = Constants::ChunkSize / 8.0f;
-const float Constants::Origin[] = { -Constants::MaxXY, 0.0f, -Constants::MaxXY };
-const float Constants::PI = 3.1415926f;
-const float Constants::MaxStandableHeight = 1.5f;
-const char* Constants::VMAPMagic = "VMAP041";
-bool Constants::ToWoWCoords = false;
-bool Constants::Debug = false;
-const float Constants::BaseUnitDim = 0.533333f;
-const int Constants::VertexPerMap = (Constants::TileSize / Constants::BaseUnitDim) + 0.5f;
-const int Constants::VertexPerTile = 40;
-const int Constants::TilesPerMap = Constants::VertexPerMap / Constants::VertexPerTile;
-
-void Utils::CreateDir( const std::string& Path )
-{
-#ifdef _WIN32
- _mkdir( Path.c_str());
-#else
- mkdir( Path.c_str(), 0777 );
-#endif
-}
-
-void Utils::Reverse(char word[])
-{
- int len = strlen(word);
- for (int i = 0;i < len / 2; i++)
- {
- word[i] ^= word[len-i-1];
- word[len-i-1] ^= word[i];
- word[i] ^= word[len-i-1];
- }
-}
-
-std::string Utils::ReadString( FILE* file )
-{
- std::string ret;
- while (true)
- {
- char b;
- if (fread(&b, sizeof(char), 1, file) != 1 || b == 0)
- break;
- ret.push_back(b);
- }
- return ret;
-}
-
-uint32 Utils::Size( FILE* file )
-{
- // store the old position
- uint32 offset = ftell(file);
- // Get file size
- fseek(file, 0, SEEK_END);
- uint32 size = ftell(file);
- // reset back to the old position
- fseek(file, offset, SEEK_SET);
- return size;
-}
-
-Vector3 Utils::ToRecast(const Vector3& val )
-{
- return Vector3(-val.y, val.z, -val.x);
-}
-
-std::string Utils::GetAdtPath(const std::string& world, int x, int y )
-{
- return "World\\Maps\\" + world + "\\" + world + "_" + Utils::ToString(x) + "_" + Utils::ToString(y) + ".adt";
-}
-
-std::string Utils::FixModelPath(const std::string& path )
-{
- return Utils::GetPathBase(path) + ".M2";
-}
-
-Vector3 Utils::TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool translate)
-{
- // Sources of information:
- /// http://www.pxr.dk/wowdev/wiki/index.php?title=ADT/v18&oldid=3715
-
- // This function applies to both external doodads and WMOs
-
- // Rotate our Doodad vertex
- G3D::Matrix4 rot = G3D::Matrix3::fromEulerAnglesXYZ(Utils::ToRadians(def.Rotation.z), Utils::ToRadians(-def.Rotation.x), Utils::ToRadians(def.Rotation.y + 180));
- Vector3 ret = Utils::VectorTransform(vec, rot);
-
- // And finally scale and translate it to our origin
- ret = ret * def.Scale();
- if (translate)
- ret = ret + Vector3(Constants::MaxXY - def.Position.z, Constants::MaxXY - def.Position.x, def.Position.y);
- return ret;
-}
-
-Vector3 Utils::TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate )
-{
- G3D::Quat quat = G3D::Quat(-inst.QuatY, inst.QuatZ, -inst.QuatX, inst.QuatW);
-
- Vector3 ret = Utils::VectorTransform(vec, G3D::Matrix4(quat.toRotationMatrix()));
- ret = ret * (inst.Scale / 1024.0f);
- if (translate)
- ret = ret + Vector3(Constants::MaxXY - inst.Position.z, Constants::MaxXY - inst.Position.x, inst.Position.y);
- return ret;
-}
-
-float Utils::ToRadians( float degrees )
-{
- return Constants::PI * degrees / 180.0f;
-}
-
-Vector3 Utils::VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal )
-{
- G3D::Vector3 ret(vec.x, vec.y, vec.z);
- ret = matrix.homoMul(ret, normal ? 0 : 1);
- return Vector3(ret.x, ret.y, ret.z);
-}
-
-std::string Utils::GetPathBase(const std::string& path )
-{
- size_t lastIndex = path.find_last_of(".");
- if (lastIndex != std::string::npos)
- return path.substr(0, lastIndex);
- return path;
-}
-
-Vector3 Vector3::Read( FILE* file )
-{
- Vector3 ret;
- if (fread(&ret, sizeof(Vector3), 1, file) != 1)
- printf("Vector3::Read: Failed to read some data expected 1, read 0\n");
- return ret;
-}
-
-Vector3 Utils::GetLiquidVert(const IDefinition& def, Vector3 basePosition, float height, int x, int y, bool translate)
-{
- if (Utils::Distance(height, 0.0f) > 0.5f)
- basePosition.z = 0.0f;
- return Utils::TransformDoodadVertex(def, basePosition + Vector3(x * Constants::UnitSize, y * Constants::UnitSize, height), translate);
-}
-
-float Utils::Distance( float x, float y )
-{
- return sqrt(x*x + y*y);
-}
-
-std::string Utils::Replace( std::string str, const std::string& oldStr, const std::string& newStr )
-{
- size_t pos = 0;
- while((pos = str.find(oldStr, pos)) != std::string::npos)
- {
- str.replace(pos, oldStr.length(), newStr);
- pos += newStr.length();
- }
- return str;
-}
-
-void Utils::SaveToDisk( FILE* stream, const std::string& path )
-{
- FILE* disk = fopen(path.c_str(), "wb");
- if (!disk)
- {
- printf("SaveToDisk: Could not save file %s to disk, please verify that you have write permissions on that directory\n", path.c_str());
- fclose(stream);
- return;
- }
-
- uint32 size = Utils::Size(stream);
- uint8* data = new uint8[size];
- // Read the data to an array
- size_t read = fread(data, size, 1, stream);
- if (read != 1)
- {
- printf("SaveToDisk: Error reading from Stream while trying to save file %s to disk.\n", path.c_str());
- fclose(disk);
- fclose(stream);
- return;
- }
-
- // And write it in the file
- size_t wrote = fwrite(data, size, 1, disk);
- if (wrote != 1)
- {
- printf("SaveToDisk: Error writing to the file while trying to save %s to disk.\n", path.c_str());
- fclose(stream);
- fclose(disk);
- return;
- }
-
- // Close the filestream
- fclose(disk);
- fclose(stream);
-
- // Free the used memory
- delete[] data;
-}
-
-Vector3 Utils::ToWoWCoords(const Vector3& vec )
-{
- return Vector3(-vec.z, -vec.x, vec.y);
-}
-
-std::string Utils::GetExtension( std::string path )
-{
- std::string::size_type idx = path.rfind('.');
- std::string extension = "";
-
- if(idx != std::string::npos)
- extension = path.substr(idx+1);
- return extension;
-}
-
-void MapChunkHeader::Read(FILE* stream)
-{
- int count = 0;
-
- count += fread(&Flags, sizeof(uint32), 1, stream);
- count += fread(&IndexX, sizeof(uint32), 1, stream);
- count += fread(&IndexY, sizeof(uint32), 1, stream);
- count += fread(&Layers, sizeof(uint32), 1, stream);
- count += fread(&DoodadRefs, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCVT, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCNR, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCLY, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCRF, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCAL, sizeof(uint32), 1, stream);
- count += fread(&SizeMCAL, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCSH, sizeof(uint32), 1, stream);
- count += fread(&SizeMCSH, sizeof(uint32), 1, stream);
- count += fread(&AreaId, sizeof(uint32), 1, stream);
- count += fread(&MapObjectRefs, sizeof(uint32), 1, stream);
- count += fread(&Holes, sizeof(uint32), 1, stream);
- LowQualityTextureMap = new uint32[4];
- count += fread(LowQualityTextureMap, sizeof(uint32), 4, stream);
- count += fread(&PredTex, sizeof(uint32), 1, stream);
- count += fread(&NumberEffectDoodad, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCSE, sizeof(uint32), 1, stream);
- count += fread(&SoundEmitters, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCLQ, sizeof(uint32), 1, stream);
- count += fread(&SizeMCLQ, sizeof(uint32), 1, stream);
- Position = Vector3::Read(stream);
- count += fread(&OffsetMCCV, sizeof(uint32), 1, stream);
-
- if (count != 27)
- printf("MapChunkHeader::Read: Failed to read some data expected 27, read %d\n", count);
-}
-
-void MHDR::Read(FILE* stream)
-{
- int count = 0;
-
- count += fread(&Flags, sizeof(uint32), 1, stream);
- count += fread(&OffsetMCIN, sizeof(uint32), 1, stream);
- count += fread(&OffsetMTEX, sizeof(uint32), 1, stream);
- count += fread(&OffsetMMDX, sizeof(uint32), 1, stream);
- count += fread(&OffsetMMID, sizeof(uint32), 1, stream);
- count += fread(&OffsetMWMO, sizeof(uint32), 1, stream);
- count += fread(&OffsetMWID, sizeof(uint32), 1, stream);
- count += fread(&OffsetMDDF, sizeof(uint32), 1, stream);
- count += fread(&OffsetMODF, sizeof(uint32), 1, stream);
- count += fread(&OffsetMFBO, sizeof(uint32), 1, stream);
- count += fread(&OffsetMH2O, sizeof(uint32), 1, stream);
- count += fread(&OffsetMTFX, sizeof(uint32), 1, stream);
-
- if (count != 12)
- printf("MHDR::Read: Failed to read some data expected 12, read %d\n", count);
-}
-
-void ModelHeader::Read(FILE* stream)
-{
- int count = 0;
-
- count += fread(&Magic, sizeof(char), 4, stream);
- Magic[4] = '\0'; // null-terminate it.
- count += fread(&Version, sizeof(uint32), 1, stream);
- count += fread(&LengthModelName, sizeof(uint32), 1, stream);
- count += fread(&OffsetName, sizeof(uint32), 1, stream);
- count += fread(&ModelFlags, sizeof(uint32), 1, stream);
- count += fread(&CountGlobalSequences, sizeof(uint32), 1, stream);
- count += fread(&OffsetGlobalSequences, sizeof(uint32), 1, stream);
- count += fread(&CountAnimations, sizeof(uint32), 1, stream);
- count += fread(&OffsetAnimations, sizeof(uint32), 1, stream);
- count += fread(&CountAnimationLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetAnimationLookup, sizeof(uint32), 1, stream);
- count += fread(&CountBones, sizeof(uint32), 1, stream);
- count += fread(&OffsetBones, sizeof(uint32), 1, stream);
- count += fread(&CountKeyBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetKeyBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&CountVertices, sizeof(uint32), 1, stream);
- count += fread(&OffsetVertices, sizeof(uint32), 1, stream);
- count += fread(&CountViews, sizeof(uint32), 1, stream);
- count += fread(&CountColors, sizeof(uint32), 1, stream);
- count += fread(&OffsetColors, sizeof(uint32), 1, stream);
- count += fread(&CountTextures, sizeof(uint32), 1, stream);
- count += fread(&OffsetTextures, sizeof(uint32), 1, stream);
- count += fread(&CountTransparency, sizeof(uint32), 1, stream);
- count += fread(&OffsetTransparency, sizeof(uint32), 1, stream);
- count += fread(&CountUvAnimation, sizeof(uint32), 1, stream);
- count += fread(&OffsetUvAnimation, sizeof(uint32), 1, stream);
- count += fread(&CountTexReplace, sizeof(uint32), 1, stream);
- count += fread(&OffsetTexReplace, sizeof(uint32), 1, stream);
- count += fread(&CountRenderFlags, sizeof(uint32), 1, stream);
- count += fread(&OffsetRenderFlags, sizeof(uint32), 1, stream);
- count += fread(&CountBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoneLookup, sizeof(uint32), 1, stream);
- count += fread(&CountTexLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetTexLookup, sizeof(uint32), 1, stream);
- count += fread(&CountTexUnits, sizeof(uint32), 1, stream);
- count += fread(&OffsetTexUnits, sizeof(uint32), 1, stream);
- count += fread(&CountTransLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetTransLookup, sizeof(uint32), 1, stream);
- count += fread(&CountUvAnimLookup, sizeof(uint32), 1, stream);
- count += fread(&OffsetUvAnimLookup, sizeof(uint32), 1, stream);
- VertexBox[0] = Vector3::Read(stream);
- VertexBox[1] = Vector3::Read(stream);
- count += fread(&VertexRadius, sizeof(float), 1, stream);
- BoundingBox[0] = Vector3::Read(stream);
- BoundingBox[1] = Vector3::Read(stream);
- count += fread(&BoundingRadius, sizeof(float), 1, stream);
- count += fread(&CountBoundingTriangles, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoundingTriangles, sizeof(uint32), 1, stream);
- count += fread(&CountBoundingVertices, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoundingVertices, sizeof(uint32), 1, stream);
- count += fread(&CountBoundingNormals, sizeof(uint32), 1, stream);
- count += fread(&OffsetBoundingNormals, sizeof(uint32), 1, stream);
-
- if (count != 51)
- printf("ModelHeader::Read: Failed to read some data expected 51, read %d\n", count);
-
-}
-
-WorldModelHeader WorldModelHeader::Read(FILE* stream)
-{
- WorldModelHeader ret;
- int count = 0;
-
- count += fread(&ret.CountMaterials, sizeof(uint32), 1, stream);
- count += fread(&ret.CountGroups, sizeof(uint32), 1, stream);
- count += fread(&ret.CountPortals, sizeof(uint32), 1, stream);
- count += fread(&ret.CountLights, sizeof(uint32), 1, stream);
- count += fread(&ret.CountModels, sizeof(uint32), 1, stream);
- count += fread(&ret.CountDoodads, sizeof(uint32), 1, stream);
- count += fread(&ret.CountSets, sizeof(uint32), 1, stream);
- count += fread(&ret.AmbientColorUnk, sizeof(uint32), 1, stream);
- count += fread(&ret.WmoId, sizeof(uint32), 1, stream);
- ret.BoundingBox[0] = Vector3::Read(stream);
- ret.BoundingBox[1] = Vector3::Read(stream);
- count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream);
-
- if (count != 10)
- printf("WorldModelHeader::Read: Failed to read some data expected 10, read %d\n", count);
-
- return ret;
-}
-
-DoodadInstance DoodadInstance::Read(FILE* stream)
-{
- DoodadInstance ret;
- int count = 0;
-
- count += fread(&ret.FileOffset, sizeof(uint32), 1, stream);
- ret.Position = Vector3::Read(stream);
- count += fread(&ret.QuatW, sizeof(float), 1, stream);
- count += fread(&ret.QuatX, sizeof(float), 1, stream);
- count += fread(&ret.QuatY, sizeof(float), 1, stream);
- count += fread(&ret.QuatZ, sizeof(float), 1, stream);
- count += fread(&ret.Scale, sizeof(float), 1, stream);
- count += fread(&ret.LightColor, sizeof(uint32), 1, stream);
-
- if (count != 7)
- printf("DoodadInstance::Read: Failed to read some data expected 7, read %d\n", count);
-
- return ret;
-}
-
-DoodadSet DoodadSet::Read(FILE* stream)
-{
- DoodadSet ret;
- char name[21];
- int count = 0;
-
- count += fread(&name, sizeof(char), 20, stream);
- name[20] = '\0';
- ret.Name = name;
- count += fread(&ret.FirstInstanceIndex, sizeof(uint32), 1, stream);
- count += fread(&ret.CountInstances, sizeof(uint32), 1, stream);
- count += fread(&ret.UnknownZero, sizeof(uint32), 1, stream);
-
- if (count != 23)
- printf("DoodadSet::Read: Failed to read some data expected 23, read %d\n", count);
-
- return ret;
-}
-
-LiquidHeader LiquidHeader::Read(FILE* stream)
-{
- LiquidHeader ret;
- int count = 0;
- count += fread(&ret.CountXVertices, sizeof(uint32), 1, stream);
- count += fread(&ret.CountYVertices, sizeof(uint32), 1, stream);
- count += fread(&ret.Width, sizeof(uint32), 1, stream);
- count += fread(&ret.Height, sizeof(uint32), 1, stream);
- ret.BaseLocation = Vector3::Read(stream);
- count += fread(&ret.MaterialId, sizeof(uint16), 1, stream);
-
- if (count != 5)
- printf("LiquidHeader::Read: Failed to read some data expected 5, read %d\n", count);
-
- return ret;
-}
-
-LiquidData LiquidData::Read(FILE* stream, LiquidHeader& header)
-{
- LiquidData ret;
- ret.HeightMap = new float*[header.CountXVertices];
- for (uint32 i = 0; i < header.CountXVertices; ++i)
- ret.HeightMap[i] = new float[header.CountYVertices];
-
- ret.RenderFlags = new uint8*[header.Width];
- for (uint32 i = 0; i < header.Width; ++i)
- ret.RenderFlags[i] = new uint8[header.Height];
-
- for (uint32 y = 0; y < header.CountYVertices; y++)
- {
- for (uint32 x = 0; x < header.CountXVertices; x++)
- {
- uint32 discard;
- float tmp;
- if (fread(&discard, sizeof(uint32), 1, stream) == 1 &&
- fread(&tmp, sizeof(float), 1, stream) == 1)
- {
- ret.HeightMap[x][y] = tmp;
- }
- }
- }
-
- for (uint32 y = 0; y < header.Height; y++)
- {
- for (uint32 x = 0; x < header.Width; x++)
- {
- uint8 tmp = 0;
- if (fread(&tmp, sizeof(uint8), 1, stream) == 1)
- ret.RenderFlags[x][y] = tmp;
- }
- }
-
- return ret;
-}
-
-H2ORenderMask H2ORenderMask::Read(FILE* stream)
-{
- H2ORenderMask ret;
- int32 count;
- if ((count = fread(&ret.Mask, sizeof(uint8), 8, stream)) != 8)
- printf("H2OHeader::Read: Failed to read some data expected 8, read %d\n", count);
- return ret;
-}
-
-bool MCNKLiquidData::IsWater(int x, int y, float height)
-{
- if (!Heights)
- return false;
- if (!Mask.ShouldRender(x, y))
- return false;
- float diff = Heights[x][y] - height;
- if (diff > Constants::MaxStandableHeight)
- return true;
- return false;
-}
-
-H2OHeader H2OHeader::Read(FILE* stream)
-{
- H2OHeader ret;
- int count = 0;
- count += fread(&ret.OffsetInformation, sizeof(uint32), 1, stream);
- count += fread(&ret.LayerCount, sizeof(uint32), 1, stream);
- count += fread(&ret.OffsetRender, sizeof(uint32), 1, stream);
-
- if (count != 3)
- printf("H2OHeader::Read: Failed to read some data expected 3, read %d\n", count);
-
- return ret;
-}
-
-H2OInformation H2OInformation::Read(FILE* stream)
-{
- H2OInformation ret;
- int count = 0;
- count += fread(&ret.LiquidType, sizeof(uint16), 1, stream);
- count += fread(&ret.Flags, sizeof(uint16), 1, stream);
- count += fread(&ret.HeightLevel1, sizeof(float), 1, stream);
- count += fread(&ret.HeightLevel2, sizeof(float), 1, stream);
- count += fread(&ret.OffsetX, sizeof(uint8), 1, stream);
- count += fread(&ret.OffsetY, sizeof(uint8), 1, stream);
- count += fread(&ret.Width, sizeof(uint8), 1, stream);
- count += fread(&ret.Height, sizeof(uint8), 1, stream);
- count += fread(&ret.OffsetMask2, sizeof(uint32), 1, stream);
- count += fread(&ret.OffsetHeightmap, sizeof(uint32), 1, stream);
-
- if (count != 10)
- printf("H2OInformation::Read: Failed to read some data expected 10, read %d\n", count);
-
- return ret;
-}
-
-char* Utils::GetPlainName(const char* FileName)
-{
- char* temp;
-
- if((temp = (char*)strrchr(FileName, '\\')) != NULL)
- FileName = temp + 1;
- return (char*)FileName;
-}
-
-WMOGroupHeader WMOGroupHeader::Read( FILE* stream )
-{
- WMOGroupHeader ret;
- int count = 0;
- count += fread(&ret.OffsetGroupName, sizeof(uint32), 1, stream);
- count += fread(&ret.OffsetDescriptiveName, sizeof(uint32), 1, stream);
- count += fread(&ret.Flags, sizeof(uint32), 1, stream);
- ret.BoundingBox[0] = Vector3::Read(stream);
- ret.BoundingBox[1] = Vector3::Read(stream);
- count += fread(&ret.OffsetPortals, sizeof(uint32), 1, stream);
- count += fread(&ret.CountPortals, sizeof(uint32), 1, stream);
- count += fread(&ret.CountBatches, sizeof(uint16), 4, stream);
- count += fread(&ret.Fogs, sizeof(uint8), 4, stream);
- count += fread(&ret.LiquidTypeRelated, sizeof(uint32), 1, stream);
- count += fread(&ret.WmoId, sizeof(uint32), 1, stream);
-
- if (count != 15)
- printf("WMOGroupHeader::Read: Failed to read some data expected 15, read %d\n", count);
-
- return ret;
-}
diff --git a/src/tools/mesh_extractor/Utils.h b/src/tools/mesh_extractor/Utils.h
deleted file mode 100644
index fcdffe0f8f3..00000000000
--- a/src/tools/mesh_extractor/Utils.h
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef UTILS_H
-#define UTILS_H
-#include <cstdio>
-#include <string>
-#include <sstream>
-
-#include "G3D/Matrix4.h"
-#include "DetourNavMesh.h"
-
-#include "Define.h"
-#include "Constants.h"
-
-#include <ace/Stack_Trace.h>
-
-struct WorldModelDefinition;
-class DoodadDefinition;
-class DoodadInstance;
-
-#define ASSERT(assertion) { if (!(assertion)) { ACE_Stack_Trace st; fprintf(stderr, "\n%s:%i in %s ASSERTION FAILED:\n %s\n%s\n", __FILE__, __LINE__, __FUNCTION__, #assertion, st.c_str()); *((volatile int*)NULL) = 0; } }
-
-struct Vector3
-{
- Vector3() {}
- Vector3(float X, float Y, float Z) : x(X), y(Y), z(Z) {}
- float x;
- float y;
- float z;
-
- Vector3 operator +(Vector3 const& other) const
- {
- return Vector3(x + other.x, y + other.y, z + other.z);
- }
-
- Vector3 operator -(Vector3 const& other) const
- {
- return Vector3(x - other.x, y - other.y, z - other.z);
- }
-
- template<typename T>
- Vector3 operator *(T s) const
- {
- return Vector3(x * s, y * s, z * s);
- }
-
- static Vector3 Read(FILE* file);
-};
-
-struct TilePos
-{
- TilePos(int x, int y) : X(x), Y(y) {}
- int X;
- int Y;
-};
-
-template<typename T>
-struct Triangle
-{
- Triangle() {}
- Triangle(Constants::TriangleType type, T v0, T v1, T v2) : V0(v0), V1(v1), V2(v2), Type(type) {}
- T V0;
- T V1;
- T V2;
- Constants::TriangleType Type;
-};
-
-class MapChunkHeader
-{
-public:
- MapChunkHeader() {}
- uint32 Flags;
- uint32 IndexX;
- uint32 IndexY;
- uint32 Layers;
- uint32 DoodadRefs;
- uint32 OffsetMCVT;
- uint32 OffsetMCNR;
- uint32 OffsetMCLY;
- uint32 OffsetMCRF;
- uint32 OffsetMCAL;
- uint32 SizeMCAL;
- uint32 OffsetMCSH;
- uint32 SizeMCSH;
- uint32 AreaId;
- uint32 MapObjectRefs;
- uint32 Holes;
- uint32* LowQualityTextureMap;
- uint32 PredTex;
- uint32 NumberEffectDoodad;
- uint32 OffsetMCSE;
- uint32 SoundEmitters;
- uint32 OffsetMCLQ;
- uint32 SizeMCLQ;
- Vector3 Position;
- uint32 OffsetMCCV;
-
- void Read(FILE* stream);
-};
-
-class MHDR
-{
-public:
- MHDR() {}
- uint32 Flags;
- uint32 OffsetMCIN;
- uint32 OffsetMTEX;
- uint32 OffsetMMDX;
- uint32 OffsetMMID;
- uint32 OffsetMWMO;
- uint32 OffsetMWID;
- uint32 OffsetMDDF;
- uint32 OffsetMODF;
- uint32 OffsetMFBO;
- uint32 OffsetMH2O;
- uint32 OffsetMTFX;
-
- void Read(FILE* stream);
-};
-
-class ModelHeader
-{
-public:
- char Magic[5];
- uint32 Version;
- uint32 LengthModelName;
- uint32 OffsetName;
- uint32 ModelFlags;
- uint32 CountGlobalSequences;
- uint32 OffsetGlobalSequences;
- uint32 CountAnimations;
- uint32 OffsetAnimations;
- uint32 CountAnimationLookup;
- uint32 OffsetAnimationLookup;
- uint32 CountBones;
- uint32 OffsetBones;
- uint32 CountKeyBoneLookup;
- uint32 OffsetKeyBoneLookup;
- uint32 CountVertices;
- uint32 OffsetVertices;
- uint32 CountViews;
- uint32 CountColors;
- uint32 OffsetColors;
- uint32 CountTextures;
- uint32 OffsetTextures;
- uint32 CountTransparency;
- uint32 OffsetTransparency;
- uint32 CountUvAnimation;
- uint32 OffsetUvAnimation;
- uint32 CountTexReplace;
- uint32 OffsetTexReplace;
- uint32 CountRenderFlags;
- uint32 OffsetRenderFlags;
- uint32 CountBoneLookup;
- uint32 OffsetBoneLookup;
- uint32 CountTexLookup;
- uint32 OffsetTexLookup;
- uint32 CountTexUnits;
- uint32 OffsetTexUnits;
- uint32 CountTransLookup;
- uint32 OffsetTransLookup;
- uint32 CountUvAnimLookup;
- uint32 OffsetUvAnimLookup;
- Vector3 VertexBox[2];
- float VertexRadius;
- Vector3 BoundingBox[2];
- float BoundingRadius;
- uint32 CountBoundingTriangles;
- uint32 OffsetBoundingTriangles;
- uint32 CountBoundingVertices;
- uint32 OffsetBoundingVertices;
- uint32 CountBoundingNormals;
- uint32 OffsetBoundingNormals;
-
- void Read(FILE* stream);
-};
-
-class WorldModelHeader
-{
-public:
- WorldModelHeader() {}
- uint32 CountMaterials;
- uint32 CountGroups;
- uint32 CountPortals;
- uint32 CountLights;
- uint32 CountModels;
- uint32 CountDoodads;
- uint32 CountSets;
- uint32 AmbientColorUnk;
- uint32 WmoId;
- Vector3 BoundingBox[2];
- uint32 LiquidTypeRelated;
-
- static WorldModelHeader Read(FILE* stream);
-};
-
-class DoodadInstance
-{
-public:
- DoodadInstance() {}
- uint32 FileOffset;
- std::string File;
- Vector3 Position;
- float QuatW;
- float QuatX;
- float QuatY;
- float QuatZ;
- float Scale;
- uint32 LightColor;
-
- static DoodadInstance Read(FILE* stream);
-};
-
-class DoodadSet
-{
-public:
- DoodadSet() {}
- std::string Name;
- uint32 FirstInstanceIndex;
- uint32 CountInstances;
- uint32 UnknownZero;
-
- static DoodadSet Read(FILE* stream);
-};
-
-class LiquidHeader
-{
-public:
- LiquidHeader() {}
- uint32 CountXVertices;
- uint32 CountYVertices;
- uint32 Width;
- uint32 Height;
- Vector3 BaseLocation;
- uint16 MaterialId;
-
- static LiquidHeader Read(FILE* stream);
-};
-
-class LiquidData
-{
-public:
- LiquidData() {}
- float** HeightMap;
- uint8** RenderFlags;
-
- bool ShouldRender(int x, int y)
- {
- return RenderFlags[x][y] != 0x0F;
- }
-
- static LiquidData Read(FILE* stream, LiquidHeader& header);
-};
-
-class H2ORenderMask
-{
-public:
- H2ORenderMask() {}
- uint8 Mask[8];
-
- bool ShouldRender(int x, int y)
- {
- return (Mask[y] >> x & 1) != 0;
- }
-
- static H2ORenderMask Read(FILE* stream);
-};
-
-class MCNKLiquidData
-{
-public:
- MCNKLiquidData() {}
- MCNKLiquidData(float** heights, H2ORenderMask mask) : Heights(heights), Mask(mask) {}
-
- float** Heights;
- H2ORenderMask Mask;
-
- bool IsWater(int x, int y, float height);
-};
-
-class H2OHeader
-{
-public:
- H2OHeader() {}
- uint32 OffsetInformation;
- uint32 LayerCount;
- uint32 OffsetRender;
-
- static H2OHeader Read(FILE* stream);
-};
-
-class H2OInformation
-{
-public:
- H2OInformation() {}
- uint16 LiquidType;
- uint16 Flags;
- float HeightLevel1;
- float HeightLevel2;
- uint8 OffsetX;
- uint8 OffsetY;
- uint8 Width;
- uint8 Height;
- uint32 OffsetMask2;
- uint32 OffsetHeightmap;
-
- static H2OInformation Read(FILE* stream);
-};
-
-class WMOGroupHeader
-{
-public:
- WMOGroupHeader() {}
-
- uint32 OffsetGroupName;
- uint32 OffsetDescriptiveName;
- uint32 Flags;
- Vector3 BoundingBox[2];
- uint32 OffsetPortals;
- uint32 CountPortals;
- uint16 CountBatches[4];
- uint8 Fogs[4];
- uint32 LiquidTypeRelated;
- uint32 WmoId;
-
- static WMOGroupHeader Read(FILE* stream);
-};
-
-// Dummy class to act as an interface.
-class IDefinition
-{
-public:
- Vector3 Position;
- Vector3 Rotation;
- virtual float Scale() const { return 1.0f; };
-};
-
-#define MMAP_MAGIC 0x4d4d4150 // 'MMAP'
-#define MMAP_VERSION 3
-
-struct MmapTileHeader
-{
- uint32 mmapMagic;
- uint32 dtVersion;
- uint32 mmapVersion;
- uint32 size;
- bool usesLiquids;
-
- MmapTileHeader() : mmapMagic(MMAP_MAGIC), dtVersion(DT_NAVMESH_VERSION),
- mmapVersion(MMAP_VERSION), size(0), usesLiquids(true) {}
-};
-
-class Utils
-{
-public:
- static void Reverse(char word[]);
- static std::string ReadString(FILE* file);
- static uint32 Size(FILE* file);
- static Vector3 ToRecast(const Vector3& val );
- static std::string GetAdtPath(const std::string& world, int x, int y);
- static std::string FixModelPath(const std::string& path);
- /// They say its better to declare template functions in the header files.
- template <typename T>
- static std::string ToString(T val)
- {
- std::stringstream ss;
- ss << val;
- return ss.str();
- }
- static float ToRadians(float degrees);
- static std::string GetPathBase(const std::string& path);
- static Vector3 GetLiquidVert(const IDefinition& def, Vector3 basePosition, float height, int /*x*/, int /*y*/, bool translate = true);
- static float Distance(float x, float y);
- template<typename T>
- static bool IsAllZero(T* arr, uint32 size)
- {
- for (uint32 i = 0; i < size; ++i)
- if (arr[i])
- return false;
- return true;
- }
- static std::string Replace( std::string str, const std::string& oldStr, const std::string& newStr );
- static void CreateDir( const std::string& Path );
- static void SaveToDisk(FILE* stream, const std::string& path);
- static Vector3 ToWoWCoords(const Vector3& vec );
- static std::string GetExtension( std::string path );
- static char* GetPlainName(const char* FileName);
- static Vector3 TransformDoodadVertex(const IDefinition& def, Vector3& vec, bool translate = true);
- static Vector3 VectorTransform(const Vector3& vec, const G3D::Matrix4& matrix, bool normal = false );
- static Vector3 TransformWmoDoodad(const DoodadInstance& inst, const WorldModelDefinition& root, Vector3& vec, bool translate = true );
-};
-#endif
diff --git a/src/tools/mesh_extractor/WDT.cpp b/src/tools/mesh_extractor/WDT.cpp
deleted file mode 100644
index 707a44611af..00000000000
--- a/src/tools/mesh_extractor/WDT.cpp
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "WDT.h"
-#include "Chunk.h"
-#include "ChunkedData.h"
-#include "Utils.h"
-#include "WorldModelHandler.h"
-
-WDT::WDT(std::string file) : IsGlobalModel(false), IsValid(false), Model(NULL)
-{
- Data = new ChunkedData(file, 2);
- ReadTileTable();
- ReadGlobalModel();
-}
-
-void WDT::ReadGlobalModel()
-{
- Chunk* fileChunk = Data->GetChunkByName("MWMO");
- Chunk* defChunk = Data->GetChunkByName("MODF");
- if (!fileChunk || !defChunk)
- return;
-
- IsGlobalModel = true;
- ModelDefinition = WorldModelDefinition::Read(defChunk->GetStream());
- ModelFile = Utils::ReadString(fileChunk->GetStream());
- Model = new WorldModelRoot(ModelFile);
-}
-
-void WDT::ReadTileTable()
-{
- Chunk* chunk = Data->GetChunkByName("MAIN");
- if (!chunk)
- return;
- IsValid = true;
- FILE* stream = chunk->GetStream();
- for (int y = 0; y < 64; ++y)
- {
- for (int x = 0; x < 64; ++x)
- {
- const uint32 hasTileFlag = 0x1;
- uint32 flags;
- uint32 discard;
- int count = 0;
- count += fread(&flags, sizeof(uint32), 1, stream);
- count += fread(&discard, sizeof(uint32), 1, stream);
-
- if (count != 2)
- printf("WDT::ReadTileTable: Failed to read some data expected 2, read %d\n", count);
-
- if (flags & hasTileFlag)
- TileTable.push_back(TilePos(x, y));
-
- }
- }
-}
-
-bool WDT::HasTile( int x, int y )
-{
- for (std::vector<TilePos>::iterator itr = TileTable.begin(); itr != TileTable.end(); ++itr)
- if (itr->X == x && itr->Y == y)
- return true;
- return false;
-}
diff --git a/src/tools/mesh_extractor/WDT.h b/src/tools/mesh_extractor/WDT.h
deleted file mode 100644
index b0961c03ed5..00000000000
--- a/src/tools/mesh_extractor/WDT.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef WDT_H
-#define WDT_H
-#include <string>
-#include <vector>
-
-#include "ChunkedData.h"
-#include "WorldModelHandler.h"
-#include "WorldModelRoot.h"
-#include "Utils.h"
-
-class WDT
-{
-public:
- WDT(std::string file);
-
- ChunkedData* Data;
- std::vector<TilePos> TileTable;
- bool IsGlobalModel;
- bool IsValid;
- std::string ModelFile;
- WorldModelDefinition ModelDefinition;
- WorldModelRoot* Model;
- bool HasTile(int x, int y);
-private:
- void ReadGlobalModel();
- void ReadTileTable();
-};
-
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelGroup.cpp b/src/tools/mesh_extractor/WorldModelGroup.cpp
deleted file mode 100644
index 71ca604a57f..00000000000
--- a/src/tools/mesh_extractor/WorldModelGroup.cpp
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "WorldModelGroup.h"
-#include "ChunkedData.h"
-#include "Chunk.h"
-#include "Utils.h"
-
-WorldModelGroup::WorldModelGroup( std::string path, int groupIndex ) : GroupIndex(groupIndex), MOBA(NULL), IsBad(false), HasLiquidData(false)
-{
- Data = new ChunkedData(path);
- if (!Data->Stream)
- {
- IsBad = true;
- return;
- }
- Chunk* mainChunk = Data->GetChunkByName("MOGP");
- int32 firstSub = mainChunk->FindSubChunkOffset("MOPY");
- if (firstSub == -1)
- return;
-
- Name = Utils::GetPlainName(path.c_str());
-
- FILE* stream = mainChunk->GetStream();
- fseek(stream, firstSub, SEEK_SET);
- SubData = new ChunkedData(stream, mainChunk->Length - firstSub);
-
- ReadHeader();
- ReadMaterials();
- ReadTriangles();
- ReadVertices();
- ReadNormals();
- ReadLiquid();
- ReadBatches();
-}
-
-void WorldModelGroup::ReadNormals()
-{
- Chunk* chunk = SubData->GetChunkByName("MONR");
- if (!chunk)
- return;
-
- uint32 normalCount = chunk->Length / 12;
- ASSERT(normalCount == Vertices.size() && "normalCount is different than the Vertices count");
- Normals.reserve(normalCount);
- FILE* stream = chunk->GetStream();
- for (uint32 i = 0; i < normalCount; i++)
- Normals.push_back(Vector3::Read(stream));
-}
-
-void WorldModelGroup::ReadLiquid()
-{
- Chunk* chunk = SubData->GetChunkByName("MLIQ");
- if (!chunk)
- return;
-
- HasLiquidData = true;
- FILE* stream = chunk->GetStream();
- LiquidDataHeader = LiquidHeader::Read(stream);
- LiquidDataGeometry = LiquidData::Read(stream, LiquidDataHeader);
-}
-
-void WorldModelGroup::ReadVertices()
-{
- Chunk* chunk = SubData->GetChunkByName("MOVT");
- if (!chunk)
- return;
-
- uint32 verticeCount = chunk->Length / 12;
- Vertices.reserve(verticeCount);
- FILE* stream = chunk->GetStream();
- for (uint32 i = 0; i < verticeCount; i++)
- Vertices.push_back(Vector3::Read(stream));
-}
-
-void WorldModelGroup::ReadTriangles()
-{
- Chunk* chunk = SubData->GetChunkByName("MOVI");
- if (!chunk)
- return;
-
- uint32 triangleCount = chunk->Length / 6;
- ASSERT(triangleCount == TriangleFlags.size() && "triangleCount != TriangleFlags.size()");
- FILE* stream = chunk->GetStream();
- Triangles.reserve(triangleCount);
- for (uint32 i = 0; i < triangleCount; i++)
- {
- uint16 v0;
- uint16 v1;
- uint16 v2;
- int count = 0;
- count += fread(&v0, sizeof(uint16), 1, stream);
- count += fread(&v1, sizeof(uint16), 1, stream);
- count += fread(&v2, sizeof(uint16), 1, stream);
- if (count != 3)
- printf("WorldModelGroup::ReadMaterials: Error reading data, expected 3, read %d\n", count);
-
- Triangles.push_back(Triangle<uint16>(Constants::TRIANGLE_TYPE_WMO, v0, v1, v2));
- }
-}
-
-void WorldModelGroup::ReadMaterials()
-{
- Chunk* chunk = SubData->GetChunkByName("MOPY");
- if (!chunk)
- return;
-
- FILE* stream = chunk->GetStream();
- uint32 triangleCount = chunk->Length / 2;
- TriangleFlags.reserve(triangleCount);
- TriangleMaterials.reserve(triangleCount);
- for (uint32 i = 0; i < triangleCount; i++)
- {
- uint8 tmp;
- if (fread(&tmp, sizeof(uint8), 1, stream) != 1)
- printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n");
- TriangleFlags.push_back(tmp);
- // Read again for material.
- if (fread(&tmp, sizeof(uint8), 1, stream) != 1)
- printf("WorldModelGroup::ReadMaterials: Error reading data, expected 1, read 0\n");
- TriangleMaterials.push_back(tmp);
- }
-}
-
-void WorldModelGroup::ReadHeader()
-{
- Chunk* chunk = Data->GetChunkByName("MOGP");
- if (!chunk)
- return;
-
- FILE* stream = chunk->GetStream();
- Header = WMOGroupHeader::Read(stream);
-}
-
-void WorldModelGroup::ReadBatches()
-{
- Chunk* chunk = Data->GetChunkByName("MOBA");
- if (!chunk)
- return;
-
- MOBALength = chunk->Length / 2;
- MOBA = new uint16[MOBALength];
- uint32 count = (uint32)fread(MOBA, sizeof(uint16), MOBALength, chunk->GetStream());
- if (count != MOBALength)
- printf("WorldModelGroup::ReadBatches: Error reading data, expected %u, read %u\n", MOBALength, count);
-}
diff --git a/src/tools/mesh_extractor/WorldModelGroup.h b/src/tools/mesh_extractor/WorldModelGroup.h
deleted file mode 100644
index 9ce5a11e07c..00000000000
--- a/src/tools/mesh_extractor/WorldModelGroup.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef WMOGROUP_H
-#define WMOGROUP_H
-#include "ChunkedData.h"
-#include "Utils.h"
-
-class WorldModelGroup
-{
-public:
- WorldModelGroup(std::string path, int groupIndex);
- ChunkedData* Data;
- ChunkedData* SubData;
- int GroupIndex;
- std::string Name;
- WMOGroupHeader Header;
-
- std::vector<uint8> TriangleFlags;
- std::vector<uint8> TriangleMaterials;
- std::vector<Triangle<uint16> > Triangles;
- std::vector<Vector3> Vertices;
- std::vector<Vector3> Normals;
- // @ToDo: Research.
- uint16* MOBA;
- uint32 MOBALength;
-
- bool HasLiquidData;
- bool IsBad;
- LiquidHeader LiquidDataHeader;
- LiquidData LiquidDataGeometry;
-private:
- void ReadNormals();
- void ReadLiquid();
- void ReadVertices();
- void ReadTriangles();
- void ReadMaterials();
- void ReadHeader();
- void ReadBatches();
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelHandler.cpp b/src/tools/mesh_extractor/WorldModelHandler.cpp
deleted file mode 100644
index b62f7f3435b..00000000000
--- a/src/tools/mesh_extractor/WorldModelHandler.cpp
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "WorldModelHandler.h"
-#include "WorldModelRoot.h"
-#include "Chunk.h"
-#include "Cache.h"
-#include "Model.h"
-#include "Define.h"
-#include "G3D/Matrix4.h"
-#include "G3D/Quat.h"
-#include <cstdio>
-
-WorldModelDefinition WorldModelDefinition::Read( FILE* file )
-{
- WorldModelDefinition ret;
- int count = 0;
- count += fread(&ret.MwidIndex, sizeof(uint32), 1, file);
- count += fread(&ret.UniqueId, sizeof(uint32), 1, file);
- ret.Position = Vector3::Read(file);
- ret.Rotation = Vector3::Read(file);
- ret.UpperExtents = Vector3::Read(file);
- ret.LowerExtents = Vector3::Read(file);
- count += fread(&ret.Flags, sizeof(uint16), 1, file);
- count += fread(&ret.DoodadSet, sizeof(uint16), 1, file);
- uint32 discard;
- count += fread(&discard, sizeof(uint32), 1, file);
-
- if (count != 5)
- printf("WorldModelDefinition::Read: Error reading data, expected 5, read %d\n", count);
- return ret;
-}
-
-
-WorldModelHandler::WorldModelHandler( ADT* adt ) : ObjectDataHandler(adt), _definitions(NULL), _paths(NULL)
-{
- ReadModelPaths();
- ReadDefinitions();
-}
-
-void WorldModelHandler::ProcessInternal( MapChunk* mcnk )
-{
- if (!IsSane())
- return;
-
- uint32 refCount = mcnk->Header.MapObjectRefs;
- FILE* stream = mcnk->Source->GetStream();
- fseek(stream, mcnk->Source->Offset + mcnk->Header.OffsetMCRF, SEEK_SET);
- // Start looping at the last Doodad Ref index
- for (uint32 i = mcnk->Header.DoodadRefs; i < refCount; i++)
- {
- int32 index;
- if (fread(&index, sizeof(int32), 1, stream) != 1)
- printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n");
-
- if (index < 0 || uint32(index) >= _definitions->size())
- continue;
-
- WorldModelDefinition wmo = (*_definitions)[index];
-
- if (_drawn.find(wmo.UniqueId) != _drawn.end())
- continue;
- _drawn.insert(wmo.UniqueId);
-
- if (wmo.MwidIndex >= _paths->size())
- continue;
-
- std::string path = (*_paths)[wmo.MwidIndex];
- WorldModelRoot* model = Cache->WorldModelCache.Get(path);
- if (!model)
- {
- model = new WorldModelRoot(path);
- Cache->WorldModelCache.Insert(path, model);
- }
-
- Vertices.reserve(1000);
- Triangles.reserve(1000);
-
- InsertModelGeometry(Vertices, Triangles, wmo, model);
- }
- // Restore the stream position
- fseek(stream, mcnk->Source->Offset, SEEK_SET);
-}
-
-void WorldModelHandler::InsertModelGeometry( std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, const WorldModelDefinition& def, WorldModelRoot* root, bool translate )
-{
- for (std::vector<WorldModelGroup>::iterator group = root->Groups.begin(); group != root->Groups.end(); ++group)
- {
- uint32 vertOffset = verts.size();
- for (std::vector<Vector3>::iterator itr2 = group->Vertices.begin(); itr2 != group->Vertices.end(); ++itr2)
- {
- Vector3 v = Utils::TransformDoodadVertex(def, *itr2, translate);
- // If translate is false, then we were called directly from the TileBuilder to add data to it's _Geometry member, hence, we have to manually convert the vertices to Recast format.
- verts.push_back(translate ? v : Utils::ToRecast(v)); // Transform the vertex to world space
- }
-
- for (uint32 i = 0; i < group->Triangles.size(); ++i)
- {
- // only include colliding tris
- if ((group->TriangleFlags[i] & 0x04) != 0 && group->TriangleMaterials[i] != 0xFF)
- continue;
- Triangle<uint16> tri = group->Triangles[i];
- tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WMO, tri.V0 + vertOffset, tri.V1 + vertOffset, tri.V2 + vertOffset));
- }
- }
-
- if (def.DoodadSet < root->DoodadSets.size())
- {
- DoodadSet set = root->DoodadSets[def.DoodadSet];
- std::vector<DoodadInstance> instances;
- instances.reserve(set.CountInstances);
- for (uint32 i = set.FirstInstanceIndex; i < (set.CountInstances + set.FirstInstanceIndex); i++)
- {
- if (i >= root->DoodadInstances.size())
- break;
- instances.push_back(root->DoodadInstances[i]);
- }
-
- for (std::vector<DoodadInstance>::iterator instance = instances.begin(); instance != instances.end(); ++instance)
- {
- Model* model = Cache->ModelCache.Get(instance->File);
- if (!model)
- {
- model = new Model(instance->File);
- Cache->ModelCache.Insert(instance->File, model);
- }
-
- if (!model->IsCollidable)
- continue;
- int vertOffset = verts.size();
- for (std::vector<Vector3>::iterator itr2 = model->Vertices.begin(); itr2 != model->Vertices.end(); ++itr2)
- {
- Vector3 v = Utils::TransformDoodadVertex(def, Utils::TransformWmoDoodad(*instance, def, *itr2, false), translate);
- verts.push_back(translate ? v : Utils::ToRecast(v));
- }
- for (std::vector<Triangle<uint16> >::iterator itr2 = model->Triangles.begin(); itr2 != model->Triangles.end(); ++itr2)
- tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WMO, itr2->V0 + vertOffset, itr2->V1 + vertOffset, itr2->V2 + vertOffset));
- }
-
- for (std::vector<WorldModelGroup>::iterator group = root->Groups.begin(); group != root->Groups.end(); ++group)
- {
- if (!group->HasLiquidData)
- continue;
-
- const LiquidHeader& liquidHeader = group->LiquidDataHeader;
- LiquidData& liquidDataGeometry = group->LiquidDataGeometry;
-
- for (uint32 y = 0; y < liquidHeader.Height; y++)
- {
- for (uint32 x = 0; x < liquidHeader.Width; x++)
- {
-
- if (!liquidDataGeometry.ShouldRender(x, y))
- continue;
-
- uint32 vertOffset = verts.size();
-
- Vector3 v1 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
- liquidDataGeometry.HeightMap[x][y], x, y, translate);
- Vector3 v2 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
- liquidDataGeometry.HeightMap[x + 1][y], x + 1, y, translate);
- Vector3 v3 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
- liquidDataGeometry.HeightMap[x][y + 1], x, y + 1, translate);
- Vector3 v4 = Utils::GetLiquidVert(def, liquidHeader.BaseLocation,
- liquidDataGeometry.HeightMap[x + 1][y + 1], x + 1, y + 1, translate);
-
- verts.push_back(translate ? v1 : Utils::ToRecast(v1));
- verts.push_back(translate ? v2 : Utils::ToRecast(v2));
- verts.push_back(translate ? v3 : Utils::ToRecast(v3));
- verts.push_back(translate ? v4 : Utils::ToRecast(v4));
-
- tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset, vertOffset + 2, vertOffset + 1));
- tris.push_back(Triangle<uint32>(Constants::TRIANGLE_TYPE_WATER, vertOffset + 2, vertOffset + 3, vertOffset + 1));
-
- }
- }
- }
- }
-}
-
-void WorldModelHandler::ReadDefinitions()
-{
- Chunk* chunk = Source->ObjectData->GetChunkByName("MODF");
- if (!chunk)
- return;
-
- const int32 definitionSize = 64;
- uint32 definitionCount = chunk->Length / definitionSize;
- _definitions = new std::vector<WorldModelDefinition>;
- _definitions->reserve(definitionCount);
- FILE* stream = chunk->GetStream();
- for (uint32 i = 0; i < definitionCount; i++)
- _definitions->push_back(WorldModelDefinition::Read(stream));
-}
-
-void WorldModelHandler::ReadModelPaths()
-{
- Chunk* mwid = Source->ObjectData->GetChunkByName("MWID");
- Chunk* mwmo = Source->ObjectData->GetChunkByName("MWMO");
- if (!mwid || !mwmo)
- return;
-
- uint32 paths = mwid->Length / 4;
- _paths = new std::vector<std::string>;
- _paths->reserve(paths);
- for (uint32 i = 0; i < paths; i++)
- {
- FILE* stream = mwid->GetStream();
- fseek(stream, i * 4, SEEK_CUR);
- uint32 offset;
- if (fread(&offset, sizeof(uint32), 1, stream) != 1)
- printf("WorldModelDefinition::Read: Error reading data, expected 1, read 0\n");
- FILE* dataStream = mwmo->GetStream();
- fseek(dataStream, offset + mwmo->Offset, SEEK_SET);
- _paths->push_back(Utils::ReadString(dataStream));
- }
-}
-
-WorldModelHandler::~WorldModelHandler()
-{
- delete _definitions;
- delete _paths;
-}
diff --git a/src/tools/mesh_extractor/WorldModelHandler.h b/src/tools/mesh_extractor/WorldModelHandler.h
deleted file mode 100644
index fdb31a35c48..00000000000
--- a/src/tools/mesh_extractor/WorldModelHandler.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef WMODEL_HNDL_H
-#define WMODEL_HNDL_H
-#include "Define.h"
-#include "Utils.h"
-#include "WorldModelRoot.h"
-#include "ObjectDataHandler.h"
-
-#include <set>
-#include <vector>
-
-class ADT;
-
-struct WorldModelDefinition : public IDefinition
-{
-public:
- WorldModelDefinition() {}
-
- uint32 MwidIndex;
- uint32 UniqueId;
- Vector3 UpperExtents;
- Vector3 LowerExtents;
- uint16 Flags;
- uint16 DoodadSet;
-
- static WorldModelDefinition Read(FILE* file);
-};
-
-class WorldModelHandler : public ObjectDataHandler
-{
-public:
- WorldModelHandler(ADT* adt);
- ~WorldModelHandler();
-
- std::vector<Vector3> Vertices;
- std::vector<Triangle<uint32> > Triangles;
- bool IsSane() { return _definitions && _paths; }
- static void InsertModelGeometry(std::vector<Vector3>& verts, std::vector<Triangle<uint32> >& tris, const WorldModelDefinition& def, WorldModelRoot* root, bool translate = true);
-protected:
- void ProcessInternal(MapChunk* data);
-private:
- void ReadDefinitions();
- void ReadModelPaths();
- std::set<uint32> _drawn;
- std::vector<WorldModelDefinition>* _definitions;
- std::vector<std::string>* _paths;
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/WorldModelRoot.cpp b/src/tools/mesh_extractor/WorldModelRoot.cpp
deleted file mode 100644
index f75b2eead3e..00000000000
--- a/src/tools/mesh_extractor/WorldModelRoot.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * 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 "WorldModelRoot.h"
-#include "ChunkedData.h"
-#include "Utils.h"
-
-WorldModelRoot::WorldModelRoot( std::string path )
-{
- Data = new ChunkedData(path);
- Path = path;
- ReadHeader();
- ReadGroups();
- ReadDoodadInstances();
- ReadDoodadSets();
-}
-
-WorldModelRoot::~WorldModelRoot()
-{
- delete Data;
-}
-
-void WorldModelRoot::ReadGroups()
-{
- std::string pathBase = Utils::GetPathBase(Path);
- Groups.reserve(Header.CountGroups);
- for (uint32 i = 0; i < Header.CountGroups; i++)
- {
- char name[200];
- sprintf(name, "%s_%03u.wmo", pathBase.c_str(), i);
- WorldModelGroup group(name, i);
- if (!group.IsBad)
- Groups.push_back(group);
- }
-}
-
-void WorldModelRoot::ReadDoodadSets()
-{
- Chunk* chunk = Data->GetChunkByName("MODS");
- if (!chunk)
- return;
-
- FILE* stream = chunk->GetStream();
- ASSERT(chunk->Length / 32 == Header.CountSets && "chunk.Length / 32 == Header.CountSets");
- DoodadSets.reserve(Header.CountSets);
- for (uint32 i = 0; i < Header.CountSets; i++)
- DoodadSets.push_back(DoodadSet::Read(stream));
-}
-
-void WorldModelRoot::ReadDoodadInstances()
-{
- Chunk* chunk = Data->GetChunkByName("MODD");
- Chunk* nameChunk = Data->GetChunkByName("MODN");
- if (!chunk || !nameChunk)
- return;
-
- const uint32 instanceSize = 40;
- uint32 countInstances = chunk->Length / instanceSize;
- DoodadInstances.reserve(countInstances);
- for (uint32 i = 0; i < countInstances; i++)
- {
- FILE* stream = chunk->GetStream();
- fseek(stream, instanceSize * i, SEEK_CUR);
- DoodadInstance instance = DoodadInstance::Read(stream);
- FILE* nameStream = nameChunk->GetStream();
- if (instance.FileOffset >= nameChunk->Length)
- continue;
- fseek(nameStream, instance.FileOffset, SEEK_CUR);
- instance.File = Utils::ReadString(nameStream);
- DoodadInstances.push_back(instance);
- }
-}
-
-void WorldModelRoot::ReadHeader()
-{
- Chunk* chunk = Data->GetChunkByName("MOHD");
- if (!chunk)
- return;
-
- FILE* stream = chunk->GetStream();
- Header = WorldModelHeader::Read(stream);
-}
diff --git a/src/tools/mesh_extractor/WorldModelRoot.h b/src/tools/mesh_extractor/WorldModelRoot.h
deleted file mode 100644
index 1be2086b466..00000000000
--- a/src/tools/mesh_extractor/WorldModelRoot.h
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program. If not, see <http://www.gnu.org/licenses/>.
- */
-
-#ifndef WMOROOT_H
-#define WMOROOT_H
-#include <string>
-#include <vector>
-
-#include "ChunkedData.h"
-#include "Utils.h"
-#include "WorldModelGroup.h"
-
-class WorldModelRoot
-{
-public:
- WorldModelRoot(std::string path);
- ~WorldModelRoot();
- std::string Path;
- ChunkedData* Data;
- WorldModelHeader Header;
- std::vector<DoodadInstance> DoodadInstances;
- std::vector<DoodadSet> DoodadSets;
- std::vector<WorldModelGroup> Groups;
-private:
- void ReadGroups();
- void ReadDoodadSets();
- void ReadDoodadInstances();
- void ReadHeader();
-};
-#endif \ No newline at end of file
diff --git a/src/tools/mesh_extractor/readme b/src/tools/mesh_extractor/readme
deleted file mode 100644
index 85cd7cfc975..00000000000
--- a/src/tools/mesh_extractor/readme
+++ /dev/null
@@ -1,6 +0,0 @@
-Experimental mesh extractor.
-Original work in C# by stschake
-Thanks to:
-Subv
-~
-For helping in the porting to C++ \ No newline at end of file
diff --git a/src/tools/vmap4_extractor/adtfile.cpp b/src/tools/vmap4_extractor/adtfile.cpp
index e0c2f701f54..7f5b80a6cef 100644
--- a/src/tools/vmap4_extractor/adtfile.cpp
+++ b/src/tools/vmap4_extractor/adtfile.cpp
@@ -79,7 +79,7 @@ char* GetExtension(char* FileName)
extern HANDLE CascStorage;
-ADTFile::ADTFile(char* filename) : ADT(CascStorage, filename, false)
+ADTFile::ADTFile(char* filename) : ADT(CascStorage, filename, false), nWMO(0), nMDX(0)
{
Adtfilename.append(filename);
}
diff --git a/src/tools/vmap4_extractor/dbcfile.cpp b/src/tools/vmap4_extractor/dbcfile.cpp
index dca549c398f..6ae165da508 100644
--- a/src/tools/vmap4_extractor/dbcfile.cpp
+++ b/src/tools/vmap4_extractor/dbcfile.cpp
@@ -21,7 +21,8 @@
#include "dbcfile.h"
DBCFile::DBCFile(HANDLE mpq, const char* filename) :
- _mpq(mpq), _filename(filename), _file(NULL), _data(NULL), _stringTable(NULL)
+ _mpq(mpq), _filename(filename), _file(NULL), _recordSize(0), _recordCount(0),
+ _fieldCount(0), _stringSize(0), _data(NULL), _stringTable(NULL)
{
}
diff --git a/src/tools/vmap4_extractor/vmapexport.cpp b/src/tools/vmap4_extractor/vmapexport.cpp
index acdb9cb42e7..fb2cc0a20d0 100644
--- a/src/tools/vmap4_extractor/vmapexport.cpp
+++ b/src/tools/vmap4_extractor/vmapexport.cpp
@@ -213,7 +213,7 @@ bool ExtractSingleWmo(std::string& fname)
for (uint32 i = 0; i < froot.nGroups; ++i)
{
char temp[1024];
- strcpy(temp, fname.c_str());
+ strncpy(temp, fname.c_str(), 1024);
temp[fname.length()-4] = 0;
char groupFileName[1024];
sprintf(groupFileName, "%s_%03u.wmo", temp, i);
@@ -300,7 +300,9 @@ bool processArgv(int argc, char ** argv, const char *versionString)
if((i+1)<argc)
{
hasInputPathParam = true;
- strcpy(input_path, argv[i+1]);
+ strncpy(input_path, argv[i + 1], sizeof(input_path));
+ input_path[sizeof(input_path) - 1] = '\0';
+
if (input_path[strlen(input_path) - 1] != '\\' && input_path[strlen(input_path) - 1] != '/')
strcat(input_path, "/");
++i;
@@ -417,7 +419,19 @@ int main(int argc, char ** argv)
for (unsigned int x = 0; x < map_count; ++x)
{
map_ids[x].id = dbc->getRecord(x).getUInt(0);
- strcpy(map_ids[x].name, dbc->getRecord(x).getString(1));
+
+ const char* map_name = dbc->getRecord(x).getString(1);
+ size_t max_map_name_length = sizeof(map_ids[x].name);
+ if (strlen(map_name) >= max_map_name_length)
+ {
+ delete dbc;
+ delete[] map_ids;
+ printf("FATAL ERROR: Map name too long.\n");
+ return 1;
+ }
+
+ strncpy(map_ids[x].name, map_name, max_map_name_length);
+ map_ids[x].name[max_map_name_length - 1] = '\0';
printf("Map - %s\n", map_ids[x].name);
}
diff --git a/src/tools/vmap4_extractor/wdtfile.cpp b/src/tools/vmap4_extractor/wdtfile.cpp
index bfc7bd7e689..34befef4b7a 100644
--- a/src/tools/vmap4_extractor/wdtfile.cpp
+++ b/src/tools/vmap4_extractor/wdtfile.cpp
@@ -32,7 +32,7 @@ char * wdtGetPlainName(char * FileName)
extern HANDLE CascStorage;
-WDTFile::WDTFile(char* file_name, char* file_name1):WDT(CascStorage, file_name)
+WDTFile::WDTFile(char* file_name, char* file_name1):WDT(CascStorage, file_name), gnWMO(0)
{
filename.append(file_name1,strlen(file_name1));
}