diff options
Diffstat (limited to 'src')
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(¶ms, 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(¶ms, 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(¶ms, 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(¶ms); - 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(¶ms, 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(¶ms, &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(¶ms, 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(¶ms, &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)); } |
