diff options
Diffstat (limited to 'src')
231 files changed, 9332 insertions, 7815 deletions
diff --git a/src/server/bnetserver/Main.cpp b/src/server/bnetserver/Main.cpp index e1c0b187c46..68e647d8b15 100644 --- a/src/server/bnetserver/Main.cpp +++ b/src/server/bnetserver/Main.cpp @@ -51,25 +51,52 @@ using namespace boost::program_options; # define _TRINITY_BNET_CONFIG "bnetserver.conf" #endif +#if PLATFORM == PLATFORM_WINDOWS +#include "ServiceWin32.h" +char serviceName[] = "bnetserver"; +char serviceLongName[] = "TrinityCore bnet service"; +char serviceDescription[] = "TrinityCore Battle.net emulator authentication service"; +/* +* -1 - not in service mode +* 0 - stopped +* 1 - running +* 2 - paused +*/ +int m_ServiceStatus = -1; + +static boost::asio::deadline_timer* _serviceStatusWatchTimer; +void ServiceStatusWatcher(boost::system::error_code const& error); +#endif + bool StartDB(); void StopDB(); void SignalHandler(const boost::system::error_code& error, int signalNumber); void KeepDatabaseAliveHandler(const boost::system::error_code& error); -variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile); +variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile, std::string& configService); -static std::unique_ptr<boost::asio::io_service> _ioService; -static std::unique_ptr<boost::asio::deadline_timer> _dbPingTimer; +static boost::asio::io_service* _ioService; +static boost::asio::deadline_timer* _dbPingTimer; static uint32 _dbPingInterval; LoginDatabaseWorkerPool LoginDatabase; int main(int argc, char** argv) { std::string configFile = _TRINITY_BNET_CONFIG; - auto vm = GetConsoleArguments(argc, argv, configFile); - // exit if help is enabled - if (vm.count("help")) + std::string configService; + auto vm = GetConsoleArguments(argc, argv, configFile, configService); + // exit if help or version is enabled + if (vm.count("help") || vm.count("version")) return 0; +#if PLATFORM == PLATFORM_WINDOWS + if (configService.compare("install") == 0) + return WinServiceInstall() ? 0 : 1; + else if (configService.compare("uninstall") == 0) + return WinServiceUninstall() ? 0 : 1; + else if (configService.compare("run") == 0) + return WinServiceRun() ? 0 : 1; +#endif + std::string configError; if (!sConfigMgr->LoadInitial(configFile, configError)) { @@ -109,7 +136,7 @@ int main(int argc, char** argv) sIpcContext->Initialize(); - _ioService.reset(new boost::asio::io_service()); + _ioService = new boost::asio::io_service(); // Get the list of realms for the server sRealmList->Initialize(*_ioService, sConfigMgr->GetIntDefault("RealmsStateUpdateDelay", 10), worldListenPort); @@ -120,6 +147,7 @@ int main(int argc, char** argv) { TC_LOG_ERROR("server.bnetserver", "Specified battle.net port (%d) out of allowed range (1-65535)", bnport); StopDB(); + delete _ioService; return 1; } @@ -139,13 +167,22 @@ int main(int argc, char** argv) // Enabled a timed callback for handling the database keep alive ping _dbPingInterval = sConfigMgr->GetIntDefault("MaxPingTime", 30); - _dbPingTimer.reset(new boost::asio::deadline_timer(*_ioService)); + _dbPingTimer = new boost::asio::deadline_timer(*_ioService); _dbPingTimer->expires_from_now(boost::posix_time::minutes(_dbPingInterval)); _dbPingTimer->async_wait(KeepDatabaseAliveHandler); sComponentMgr->Load(); sModuleMgr->Load(); +#if PLATFORM == PLATFORM_WINDOWS + if (m_ServiceStatus != -1) + { + _serviceStatusWatchTimer = new boost::asio::deadline_timer(*_ioService); + _serviceStatusWatchTimer->expires_from_now(boost::posix_time::seconds(1)); + _serviceStatusWatchTimer->async_wait(ServiceStatusWatcher); + } +#endif + // Start the io service worker loop _ioService->run(); @@ -162,9 +199,10 @@ int main(int argc, char** argv) TC_LOG_INFO("server.bnetserver", "Halting process..."); - signals.clear(); + signals.cancel(); - _ioService.reset(); + delete _dbPingTimer; + delete _ioService; return 0; } @@ -211,26 +249,62 @@ void KeepDatabaseAliveHandler(const boost::system::error_code& error) } } -variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile) +#if PLATFORM == PLATFORM_WINDOWS +void ServiceStatusWatcher(boost::system::error_code const& error) +{ + if (!error) + { + if (m_ServiceStatus == 0) + { + _ioService->stop(); + delete _serviceStatusWatchTimer; + } + else + { + _serviceStatusWatchTimer->expires_from_now(boost::posix_time::seconds(1)); + _serviceStatusWatchTimer->async_wait(ServiceStatusWatcher); + } + } +} +#endif + +variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile, std::string& configService) { + (void)configService; + options_description all("Allowed options"); all.add_options() ("help,h", "print usage message") + ("version,v", "print version build info") ("config,c", value<std::string>(&configFile)->default_value(_TRINITY_BNET_CONFIG), "use <arg> as configuration file") ; +#if PLATFORM == PLATFORM_WINDOWS + options_description win("Windows platform specific options"); + win.add_options() + ("service,s", value<std::string>(&configService)->default_value(""), "Windows service options: [install | uninstall]") + ; + + all.add(win); +#endif variables_map variablesMap; try { store(command_line_parser(argc, argv).options(all).allow_unregistered().run(), variablesMap); notify(variablesMap); } - catch (std::exception& e) { + catch (std::exception& e) + { std::cerr << e.what() << "\n"; } - if (variablesMap.count("help")) { + if (variablesMap.count("help")) + { std::cout << all << "\n"; } + else if (variablesMap.count("version")) + { + std::cout << _FULLVERSION << "\n"; + } return variablesMap; } diff --git a/src/server/bnetserver/Server/Session.cpp b/src/server/bnetserver/Server/Session.cpp index 89818873335..d5ea76c2974 100644 --- a/src/server/bnetserver/Server/Session.cpp +++ b/src/server/bnetserver/Server/Session.cpp @@ -521,9 +521,7 @@ void Battlenet::Session::HandleJoinRequestV2(WoWRealm::JoinRequestV2 const& join LoginDatabase.DirectPExecute("UPDATE account SET sessionkey = '%s', last_ip = '%s', last_login = NOW(), locale = %u, failed_logins = 0, os = '%s' WHERE id = %u", ByteArrayToHexStr(sessionKey, 40, true).c_str(), GetRemoteIpAddress().to_string().c_str(), GetLocaleByName(_locale), _os.c_str(), _gameAccountInfo->Id); - joinResponse->IPv4.emplace_back(realm->ExternalAddress, realm->Port); - if (realm->ExternalAddress != realm->LocalAddress) - joinResponse->IPv4.emplace_back(realm->LocalAddress, realm->Port); + joinResponse->IPv4.push_back(realm->GetAddressForClient(GetRemoteIpAddress())); AsyncWrite(joinResponse); } @@ -677,8 +675,8 @@ bool Battlenet::Session::Update() if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready) { - _queryCallback(_queryFuture.get()); - _queryCallback = nullptr; + auto callback = std::move(_queryCallback); + callback(_queryFuture.get()); } return true; diff --git a/src/server/collision/Management/MMapManager.cpp b/src/server/collision/Management/MMapManager.cpp index 25a9a86bc1b..e0b1ed3b161 100644 --- a/src/server/collision/Management/MMapManager.cpp +++ b/src/server/collision/Management/MMapManager.cpp @@ -177,7 +177,8 @@ namespace MMAP { TC_LOG_ERROR("phase", "MMAP:LoadTile: Bad header in mmap %04u%02i%02i.mmtile", mapId, x, y); fclose(file); - return NULL; + delete pTile; + return nullptr; } if (pTile->fileHeader.mmapVersion != MMAP_VERSION) @@ -185,7 +186,8 @@ namespace MMAP TC_LOG_ERROR("phase", "MMAP:LoadTile: %04u%02i%02i.mmtile was built with generator v%i, expected v%i", mapId, x, y, pTile->fileHeader.mmapVersion, MMAP_VERSION); fclose(file); - return NULL; + delete pTile; + return nullptr; } pTile->data = (unsigned char*)dtAlloc(pTile->fileHeader.size, DT_ALLOC_PERM); @@ -196,7 +198,8 @@ namespace MMAP { TC_LOG_ERROR("phase", "MMAP:LoadTile: Bad header or data in mmap %04u%02i%02i.mmtile", mapId, x, y); fclose(file); - return NULL; + delete pTile; + return nullptr; } fclose(file); @@ -475,7 +478,10 @@ namespace MMAP PhasedTile* pt = new PhasedTile(); // remove old tile if (dtStatusFailed(navMesh->removeTile(loadedTileRefs[packedXY], &pt->data, &pt->dataSize))) + { TC_LOG_ERROR("phase", "MMapData::AddSwap: Could not unload %04u%02i%02i.mmtile from navmesh", _mapId, x, y); + delete pt; + } else { TC_LOG_DEBUG("phase", "MMapData::AddSwap: Unloaded %04u%02i%02i.mmtile from navmesh", _mapId, x, y); diff --git a/src/server/collision/Models/GameObjectModel.cpp b/src/server/collision/Models/GameObjectModel.cpp index 6140c266b18..607460a2784 100644 --- a/src/server/collision/Models/GameObjectModel.cpp +++ b/src/server/collision/Models/GameObjectModel.cpp @@ -188,12 +188,12 @@ bool GameObjectModel::intersectRay(const G3D::Ray& ray, float& MaxDist, bool Sto return hit; } -bool GameObjectModel::Relocate(const GameObject& go) +bool GameObjectModel::UpdatePosition() { if (!iModel) return false; - ModelList::const_iterator it = model_list.find(go.GetDisplayId()); + ModelList::const_iterator it = model_list.find(owner->GetDisplayId()); if (it == model_list.end()) return false; @@ -205,9 +205,9 @@ bool GameObjectModel::Relocate(const GameObject& go) return false; } - iPos = Vector3(go.GetPositionX(), go.GetPositionY(), go.GetPositionZ()); + iPos = Vector3(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ()); - G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(go.GetOrientation(), 0, 0); + G3D::Matrix3 iRotation = G3D::Matrix3::fromEulerAnglesZYX(owner->GetOrientation(), 0, 0); iInvRot = iRotation.inverse(); // transform bounding box: mdl_box = AABox(mdl_box.low() * iScale, mdl_box.high() * iScale); @@ -221,7 +221,7 @@ bool GameObjectModel::Relocate(const GameObject& go) for (int i = 0; i < 8; ++i) { Vector3 pos(iBound.corner(i)); - go.SummonCreature(1, pos.x, pos.y, pos.z, 0, TEMPSUMMON_MANUAL_DESPAWN); + owner->SummonCreature(1, pos.x, pos.y, pos.z, 0, TEMPSUMMON_MANUAL_DESPAWN); } #endif diff --git a/src/server/collision/Models/GameObjectModel.h b/src/server/collision/Models/GameObjectModel.h index 232ebbee5e9..43d299d6d8f 100644 --- a/src/server/collision/Models/GameObjectModel.h +++ b/src/server/collision/Models/GameObjectModel.h @@ -68,7 +68,7 @@ public: static GameObjectModel* Create(const GameObject& go); - bool Relocate(GameObject const& go); + bool UpdatePosition(); }; #endif // _GAMEOBJECT_MODEL_H diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index c53b532658d..f1a3afcb8fe 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -373,13 +373,13 @@ void ScriptedAI::SetEquipmentSlots(bool loadDefault, int32 mainHand /*= EQUIP_NO } if (mainHand >= 0) - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(mainHand)); + me->SetVirtualItem(0, uint32(mainHand)); if (offHand >= 0) - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, uint32(offHand)); + me->SetVirtualItem(1, uint32(offHand)); if (ranged >= 0) - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, uint32(ranged)); + me->SetVirtualItem(2, uint32(ranged)); } void ScriptedAI::SetCombatMovement(bool allowMovement) diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 74d9e5b4a9c..c66762e64a1 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -585,7 +585,11 @@ void SmartAI::JustDied(Unit* killer) { GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, killer); if (HasEscortState(SMART_ESCORT_ESCORTING)) + { EndPath(true); + me->StopMoving();//force stop + me->GetMotionMaster()->MoveIdle(); + } } void SmartAI::KilledUnit(Unit* victim) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index f50bf1fe0e1..be0781240d9 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -1563,11 +1563,11 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u slot[2] = e.action.equip.slot3; } if (!e.action.equip.mask || (e.action.equip.mask & 1)) - npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, slot[0]); + npc->SetVirtualItem(0, slot[0]); if (!e.action.equip.mask || (e.action.equip.mask & 2)) - npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, slot[1]); + npc->SetVirtualItem(1, slot[1]); if (!e.action.equip.mask || (e.action.equip.mask & 4)) - npc->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, slot[2]); + npc->SetVirtualItem(2, slot[2]); } } diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 0233d1aa7d0..6f584821988 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -177,33 +177,25 @@ class SmartScript GameObject* FindGameObjectNear(WorldObject* searchObject, ObjectGuid::LowType guid) const { - GameObject* gameObject = NULL; + auto bounds = searchObject->GetMap()->GetGameObjectBySpawnIdStore().equal_range(guid); + if (bounds.first == bounds.second) + return nullptr; - CellCoord p(Trinity::ComputeCellCoord(searchObject->GetPositionX(), searchObject->GetPositionY())); - Cell cell(p); - - Trinity::GameObjectWithDbGUIDCheck goCheck(*searchObject, guid); - Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(searchObject, gameObject, goCheck); - - TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > objectChecker(checker); - cell.Visit(p, objectChecker, *searchObject->GetMap(), *searchObject, searchObject->GetGridActivationRange()); - - return gameObject; + return bounds.first->second; } Creature* FindCreatureNear(WorldObject* searchObject, ObjectGuid::LowType guid) const { - Creature* creature = NULL; - CellCoord p(Trinity::ComputeCellCoord(searchObject->GetPositionX(), searchObject->GetPositionY())); - Cell cell(p); + auto bounds = searchObject->GetMap()->GetCreatureBySpawnIdStore().equal_range(guid); + if (bounds.first == bounds.second) + return nullptr; - Trinity::CreatureWithDbGUIDCheck target_check(searchObject, guid); - Trinity::CreatureSearcher<Trinity::CreatureWithDbGUIDCheck> checker(searchObject, creature, target_check); - - TypeContainerVisitor<Trinity::CreatureSearcher <Trinity::CreatureWithDbGUIDCheck>, GridTypeMapContainer > unit_checker(checker); - cell.Visit(p, unit_checker, *searchObject->GetMap(), *searchObject, searchObject->GetGridActivationRange()); + auto creatureItr = std::find_if(bounds.first, bounds.second, [](Map::CreatureBySpawnIdContainer::value_type const& pair) + { + return pair.second->IsAlive(); + }); - return creature; + return creatureItr != bounds.second ? creatureItr->second : bounds.first->second; } ObjectListMap* mTargetStorage; @@ -254,7 +246,14 @@ class SmartScript DecPhase(abs(p)); } - void DecPhase(int32 p = 1) { mEventPhase -= (mEventPhase < (uint32)p ? (uint32)p - mEventPhase : (uint32)p); } + void DecPhase(int32 p = 1) + { + if(mEventPhase > (uint32)p) + mEventPhase -= (uint32)p; + else + mEventPhase = 0; + } + bool IsInPhase(uint32 p) const { return ((1 << (mEventPhase - 1)) & p) != 0; } void SetPhase(uint32 p = 0) { mEventPhase = p; } diff --git a/src/server/game/Accounts/RBAC.cpp b/src/server/game/Accounts/RBAC.cpp index 74ff060636e..c520564f0fa 100644 --- a/src/server/game/Accounts/RBAC.cpp +++ b/src/server/game/Accounts/RBAC.cpp @@ -17,7 +17,6 @@ #include "RBAC.h" #include "AccountMgr.h" -#include "DatabaseEnv.h" #include "Log.h" namespace rbac @@ -180,7 +179,24 @@ void RBACData::LoadFromDB() stmt->setUInt32(0, GetId()); stmt->setInt32(1, GetRealmId()); - PreparedQueryResult result = LoginDatabase.Query(stmt); + LoadFromDBCallback(LoginDatabase.Query(stmt)); +} + +PreparedQueryResultFuture RBACData::LoadFromDBAsync() +{ + 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()); + + return LoginDatabase.AsyncQuery(stmt); +} + +void RBACData::LoadFromDBCallback(PreparedQueryResult result) +{ if (result) { do @@ -190,8 +206,7 @@ void RBACData::LoadFromDB() GrantPermission(fields[0].GetUInt32()); else DenyPermission(fields[0].GetUInt32()); - } - while (result->NextRow()); + } while (result->NextRow()); } // Add default permissions diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index 6d56774e447..fb5927e9e91 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -40,7 +40,7 @@ #ifndef _RBAC_H #define _RBAC_H -#include "Define.h" +#include "DatabaseEnv.h" #include <string> #include <set> #include <map> @@ -287,7 +287,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_GO_GRID = 380, RBAC_PERM_COMMAND_GO_OBJECT = 381, RBAC_PERM_COMMAND_GO_TAXINODE = 382, - RBAC_PERM_COMMAND_GO_TICKET = 383, + // 383 reuse RBAC_PERM_COMMAND_GO_TRIGGER = 384, RBAC_PERM_COMMAND_GO_XYZ = 385, RBAC_PERM_COMMAND_GO_ZONEXY = 386, @@ -647,24 +647,11 @@ enum RBACPermissions RBAC_PERM_COMMAND_TELE_NAME = 740, RBAC_PERM_COMMAND_TELE_GROUP = 741, RBAC_PERM_COMMAND_TICKET = 742, - RBAC_PERM_COMMAND_TICKET_ASSIGN = 743, - RBAC_PERM_COMMAND_TICKET_CLOSE = 744, - RBAC_PERM_COMMAND_TICKET_CLOSEDLIST = 745, - RBAC_PERM_COMMAND_TICKET_COMMENT = 746, - RBAC_PERM_COMMAND_TICKET_COMPLETE = 747, - RBAC_PERM_COMMAND_TICKET_DELETE = 748, - RBAC_PERM_COMMAND_TICKET_ESCALATE = 749, - RBAC_PERM_COMMAND_TICKET_ESCALATEDLIST = 750, - RBAC_PERM_COMMAND_TICKET_LIST = 751, - RBAC_PERM_COMMAND_TICKET_ONLINELIST = 752, + // 743 - 752 reuse RBAC_PERM_COMMAND_TICKET_RESET = 753, - RBAC_PERM_COMMAND_TICKET_RESPONSE = 754, - RBAC_PERM_COMMAND_TICKET_RESPONSE_APPEND = 755, - RBAC_PERM_COMMAND_TICKET_RESPONSE_APPENDLN = 756, + // 754 - 756 reuse RBAC_PERM_COMMAND_TICKET_TOGGLESYSTEM = 757, - RBAC_PERM_COMMAND_TICKET_UNASSIGN = 758, - RBAC_PERM_COMMAND_TICKET_VIEWID = 759, - RBAC_PERM_COMMAND_TICKET_VIEWNAME = 760, + // 758 - 760 reuse RBAC_PERM_COMMAND_TITLES = 761, RBAC_PERM_COMMAND_TITLES_ADD = 762, RBAC_PERM_COMMAND_TITLES_CURRENT = 763, @@ -734,7 +721,7 @@ enum RBACPermissions RBAC_PERM_COMMAND_TICKET_SUGGESTION_UNASSIGN = 827, RBAC_PERM_COMMAND_TICKET_SUGGESTION_VIEW = 828, RBAC_PERM_COMMAND_TICKET_RESET_ALL = 829, - RBAC_PERM_COMMAND_TICKET_RESET_GM = 830, + // 830 reuse RBAC_PERM_COMMAND_TICKET_RESET_BUG = 831, RBAC_PERM_COMMAND_TICKET_RESET_COMPLAINT = 832, RBAC_PERM_COMMAND_TICKET_RESET_SUGGESTION = 833, @@ -907,6 +894,8 @@ class RBACData /// Loads all permissions assigned to current account void LoadFromDB(); + PreparedQueryResultFuture LoadFromDBAsync(); + void LoadFromDBCallback(PreparedQueryResult result); /// Sets security level void SetSecurityLevel(uint8 id) diff --git a/src/server/game/Achievements/AchievementMgr.cpp b/src/server/game/Achievements/AchievementMgr.cpp index 9c347879768..68d76272e22 100644 --- a/src/server/game/Achievements/AchievementMgr.cpp +++ b/src/server/game/Achievements/AchievementMgr.cpp @@ -1056,6 +1056,7 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_HONORABLE_KILL_AT_AREA: case ACHIEVEMENT_CRITERIA_TYPE_WIN_ARENA: // This also behaves like ACHIEVEMENT_CRITERIA_TYPE_WIN_RATED_ARENA case ACHIEVEMENT_CRITERIA_TYPE_ON_LOGIN: + case ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING: SetCriteriaProgress(achievementCriteria, 1, referencePlayer, PROGRESS_ACCUMULATE); break; // std case: increment at miscValue1 @@ -1289,7 +1290,6 @@ void AchievementMgr<T>::UpdateAchievementCriteria(AchievementCriteriaTypes type, case ACHIEVEMENT_CRITERIA_TYPE_ENTER_AREA: case ACHIEVEMENT_CRITERIA_TYPE_LEAVE_AREA: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_DUNGEON_ENCOUNTER: - case ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING: case ACHIEVEMENT_CRITERIA_TYPE_UPGRADE_GARRISON_BUILDING: case ACHIEVEMENT_CRITERIA_TYPE_CONSTRUCT_GARRISON_BUILDING: case ACHIEVEMENT_CRITERIA_TYPE_UPGRADE_GARRISON: @@ -1443,6 +1443,7 @@ bool AchievementMgr<T>::IsCompletedCriteria(AchievementCriteria const* achieveme case ACHIEVEMENT_CRITERIA_TYPE_USE_LFD_TO_GROUP_WITH_PLAYERS: case ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS: case ACHIEVEMENT_CRITERIA_TYPE_CURRENCY: + case ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING: return progress->counter >= requiredAmount; case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_ACHIEVEMENT: case ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST: @@ -2381,6 +2382,10 @@ bool AchievementMgr<T>::RequirementsSatisfied(AchievementCriteria const* achieve break; case ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_TEAM_RATING: return false; + case ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING: + if (miscValue1 != achievementCriteria->Entry->Asset.GarrBuildingID) + return false; + break; default: break; } @@ -2955,7 +2960,7 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() CriteriaTreeEntry const* cur = tree; while (achievementItr == achievementCriteriaTreeIds.end()) { - if (!tree->Parent) + if (!cur->Parent) break; cur = sCriteriaTreeStore.LookupEntry(cur->Parent); @@ -2974,8 +2979,6 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() achievementCriteriaTree->Entry = tree; _achievementCriteriaTrees[achievementCriteriaTree->Entry->ID] = achievementCriteriaTree; - if (sCriteriaStore.LookupEntry(tree->CriteriaID)) - _achievementCriteriaTreeByCriteria[tree->CriteriaID].push_back(achievementCriteriaTree); } // Build tree @@ -2986,7 +2989,21 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() auto parent = _achievementCriteriaTrees.find(itr->second->Entry->Parent); if (parent != _achievementCriteriaTrees.end()) + { parent->second->Children.push_back(itr->second); + while (parent != _achievementCriteriaTrees.end()) + { + auto cur = parent; + parent = _achievementCriteriaTrees.find(parent->second->Entry->Parent); + if (parent == _achievementCriteriaTrees.end()) + { + if (sCriteriaStore.LookupEntry(itr->second->Entry->CriteriaID)) + _achievementCriteriaTreeByCriteria[itr->second->Entry->CriteriaID].push_back(cur->second); + } + } + } + else if (sCriteriaStore.LookupEntry(itr->second->Entry->CriteriaID)) + _achievementCriteriaTreeByCriteria[itr->second->Entry->CriteriaID].push_back(itr->second); } // Load criteria @@ -3013,8 +3030,6 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() for (AchievementCriteriaTree const* tree : treeItr->second) { - const_cast<AchievementCriteriaTree*>(tree)->Criteria = achievementCriteria; - if (tree->Achievement->Flags & ACHIEVEMENT_FLAG_GUILD) achievementCriteria->FlagsCu |= ACHIEVEMENT_CRITERIA_FLAG_CU_GUILD; else if (tree->Achievement->Flags & ACHIEVEMENT_FLAG_ACCOUNT) @@ -3039,6 +3054,9 @@ void AchievementGlobalMgr::LoadAchievementCriteriaList() _achievementCriteriasByTimedType[criteria->StartEvent].push_back(achievementCriteria); } + for (auto& p : _achievementCriteriaTrees) + const_cast<AchievementCriteriaTree*>(p.second)->Criteria = GetAchievementCriteria(p.second->Entry->CriteriaID); + TC_LOG_INFO("server.loading", ">> Loaded %u achievement criteria and %u guild achievement crieteria in %u ms", criterias, guildCriterias, GetMSTimeDiffToNow(oldMSTime)); } diff --git a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp index 06fa47cd09d..1a614ab8df5 100644 --- a/src/server/game/AuctionHouse/AuctionHouseMgr.cpp +++ b/src/server/game/AuctionHouse/AuctionHouseMgr.cpp @@ -583,13 +583,13 @@ void AuctionHouseObject::BuildListAuctionItems(WorldPackets::AuctionHouse::Aucti { const ItemRandomSuffixEntry* itemRandSuffix = sItemRandomSuffixStore.LookupEntry(-propRefID); if (itemRandSuffix) - suffix = itemRandSuffix->Name_lang; + suffix = itemRandSuffix->Name->Str[player->GetSession()->GetSessionDbcLocale()]; } else { const ItemRandomPropertiesEntry* itemRandProp = sItemRandomPropertiesStore.LookupEntry(propRefID); if (itemRandProp) - suffix = itemRandProp->Name_lang; + suffix = itemRandProp->Name->Str[player->GetSession()->GetSessionDbcLocale()]; } // dbc local name diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index f37526ae71b..2b5c335bce0 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -48,7 +48,7 @@ namespace Trinity BattlegroundChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, va_list* args = NULL) : _msgtype(msgtype), _textId(textId), _source(source), _args(args) { } - void operator()(WorldPacket& data, LocaleConstant loc_idx) + WorldPackets::Packet* operator()(LocaleConstant loc_idx) { char const* text = sObjectMgr->GetTrinityString(_textId, loc_idx); if (_args) @@ -61,19 +61,18 @@ namespace Trinity vsnprintf(str, 2048, text, ap); va_end(ap); - do_helper(data, &str[0]); + return do_helper(&str[0]); } - else - do_helper(data, text); + + return do_helper(text); } private: - void do_helper(WorldPacket& data, char const* text) + WorldPackets::Packet* do_helper(char const* text) { - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, text); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + packet->Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, text); + return packet; } ChatMsg _msgtype; @@ -88,7 +87,7 @@ namespace Trinity Battleground2ChatBuilder(ChatMsg msgtype, uint32 textId, Player const* source, uint32 arg1, uint32 arg2) : _msgtype(msgtype), _textId(textId), _source(source), _arg1(arg1), _arg2(arg2) { } - void operator()(WorldPacket& data, LocaleConstant loc_idx) + WorldPackets::Packet* operator()(LocaleConstant loc_idx) { char const* text = sObjectMgr->GetTrinityString(_textId, loc_idx); char const* arg1str = _arg1 ? sObjectMgr->GetTrinityString(_arg1, loc_idx) : ""; @@ -97,10 +96,9 @@ namespace Trinity char str[2048]; snprintf(str, 2048, text, arg1str, arg2str); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, str); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + packet->Initialize(_msgtype, LANG_UNIVERSAL, _source, _source, str); + return packet; } private: diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp index 06dd5ff6996..d888485887e 100644 --- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp +++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp @@ -890,7 +890,8 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp // (after what time the ratings aren't taken into account when making teams) then // the discard time is current_time - time_to_discard, teams that joined after that, will have their ratings taken into account // else leave the discard time on 0, this way all ratings will be discarded - uint32 discardTime = getMSTime() - sBattlegroundMgr->GetRatingDiscardTimer(); + // this has to be signed value - when the server starts, this value would be negative and thus overflow + int32 discardTime = getMSTime() - sBattlegroundMgr->GetRatingDiscardTimer(); // we need to find 2 teams which will play next game GroupsQueueType::iterator itr_teams[BG_TEAMS_COUNT]; @@ -906,7 +907,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp // if group match conditions, then add it to pool if (!(*itr2)->IsInvitedToBGInstanceGUID && (((*itr2)->ArenaMatchmakerRating >= arenaMinRating && (*itr2)->ArenaMatchmakerRating <= arenaMaxRating) - || (*itr2)->JoinTime < discardTime)) + || (int32)(*itr2)->JoinTime < discardTime)) { itr_teams[found++] = itr2; team = i; @@ -924,7 +925,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundTyp { if (!(*itr3)->IsInvitedToBGInstanceGUID && (((*itr3)->ArenaMatchmakerRating >= arenaMinRating && (*itr3)->ArenaMatchmakerRating <= arenaMaxRating) - || (*itr3)->JoinTime < discardTime) + || (int32)(*itr3)->JoinTime < discardTime) && (*itr_teams[0])->ArenaTeamId != (*itr3)->ArenaTeamId) { itr_teams[found++] = itr3; diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp index 59452eab637..ca52807afee 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp @@ -100,7 +100,7 @@ bool BattlegroundSA::ResetObjs() for (uint8 i = BG_SA_MAXNPC; i < BG_SA_MAXNPC + BG_SA_MAX_GY; i++) DelCreature(i); - for (uint8 i = 0; i < 6; i++) + for (uint8 i = 0; i < MAX_GATES; ++i) GateStatus[i] = BG_SA_GATE_OK; if (!AddCreature(BG_SA_NpcEntries[BG_SA_NPC_KANRETHAD], BG_SA_NPC_KANRETHAD, BG_SA_NpcSpawnlocs[BG_SA_NPC_KANRETHAD])) @@ -180,9 +180,6 @@ bool BattlegroundSA::ResetObjs() GetBGObject(BG_SA_TITAN_RELIC)->SetFaction(atF); GetBGObject(BG_SA_TITAN_RELIC)->Refresh(); - for (uint8 i = 0; i <= 5; i++) - GateStatus[i] = BG_SA_GATE_OK; - TotalTime = 0; ShipsStarted = false; @@ -222,6 +219,8 @@ bool BattlegroundSA::ResetObjs() GetBGObject(i)->SetFaction(atF); } + UpdateObjectInteractionFlags(); + for (uint8 i = BG_SA_BOMB; i < BG_SA_MAXOBJ; i++) { if (!AddObject(i, BG_SA_ObjEntries[BG_SA_BOMB], BG_SA_ObjSpawnlocs[i], 0, 0, 0, 0, RESPAWN_ONE_DAY)) @@ -482,28 +481,7 @@ void BattlegroundSA::AddPlayer(Player* player) SendTransportInit(player); - if (!ShipsStarted) - { - if (player->GetTeamId() == Attackers) - { - //player->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); - - if (urand(0, 1)) - player->TeleportTo(607, 2682.936f, -830.368f, 15.0f, 2.895f, 0); - else - player->TeleportTo(607, 2577.003f, 980.261f, 15.0f, 0.807f, 0); - - } - else - player->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); - } - else - { - if (player->GetTeamId() == Attackers) - player->TeleportTo(607, 1600.381f, -106.263f, 8.8745f, 3.78f, 0); - else - player->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); - } + TeleportToEntrancePosition(player); } void BattlegroundSA::RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/) { } @@ -534,23 +512,31 @@ void BattlegroundSA::TeleportPlayers() player->ResetAllPowers(); player->CombatStopWithPets(true); - for (BattlegroundPlayerMap::const_iterator itr = GetPlayers().begin(); itr != GetPlayers().end(); ++itr) - if (Player* p = ObjectAccessor::FindPlayer(itr->first)) - p->CastSpell(p, SPELL_PREPARATION, true); + player->CastSpell(player, SPELL_PREPARATION, true); - if (player->GetTeamId() == Attackers) - { - //player->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); + TeleportToEntrancePosition(player); + } + } +} - if (urand(0, 1)) - player->TeleportTo(607, 2682.936f, -830.368f, 15.0f, 2.895f, 0); - else - player->TeleportTo(607, 2577.003f, 980.261f, 15.0f, 0.807f, 0); - } +void BattlegroundSA::TeleportToEntrancePosition(Player* player) +{ + if (player->GetTeamId() == Attackers) + { + if (!ShipsStarted) + { + // player->AddUnitMovementFlag(MOVEMENTFLAG_ONTRANSPORT); + + if (urand(0, 1)) + player->TeleportTo(607, 2682.936f, -830.368f, 15.0f, 2.895f, 0); else - player->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); + player->TeleportTo(607, 2577.003f, 980.261f, 15.0f, 0.807f, 0); } + else + player->TeleportTo(607, 1600.381f, -106.263f, 8.8745f, 3.78f, 0); } + else + player->TeleportTo(607, 1209.7f, -65.16f, 70.1f, 0.0f, 0); } void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* invoker /*= NULL*/) @@ -629,6 +615,8 @@ void BattlegroundSA::ProcessEvent(WorldObject* obj, uint32 eventId, WorldObject* } } } + + UpdateObjectInteractionFlags(); } else break; @@ -712,7 +700,7 @@ WorldSafeLocsEntry const* BattlegroundSA::GetClosestGraveYard(Player* player) safeloc = BG_SA_GYEntries[BG_SA_DEFENDER_LAST_GY]; closest = sWorldSafeLocsStore.LookupEntry(safeloc); - nearest = std::sqrt((closest->Loc.X - x)*(closest->Loc.X - x) + (closest->Loc.Y - y)*(closest->Loc.Y - y) + (closest->Loc.Z - z)*(closest->Loc.Z - z)); + nearest = player->GetExactDistSq(closest->Loc.X, closest->Loc.Y, closest->Loc.Z); for (uint8 i = BG_SA_RIGHT_CAPTURABLE_GY; i < BG_SA_MAX_GY; i++) { @@ -720,7 +708,7 @@ WorldSafeLocsEntry const* BattlegroundSA::GetClosestGraveYard(Player* player) continue; ret = sWorldSafeLocsStore.LookupEntry(BG_SA_GYEntries[i]); - dist = std::sqrt((ret->Loc.X - x)*(ret->Loc.X - x) + (ret->Loc.Y - y)*(ret->Loc.Y - y) + (ret->Loc.Z - z)*(ret->Loc.Z - z)); + dist = player->GetExactDistSq(ret->Loc.X, ret->Loc.Y, ret->Loc.Z); if (dist < nearest) { closest = ret; @@ -739,23 +727,66 @@ void BattlegroundSA::SendTime() UpdateWorldState(BG_SA_TIMER_SEC_DECS, ((end_of_round%60000)%10000)/1000); } +bool BattlegroundSA::CanInteractWithObject(uint32 objectId) +{ + switch (objectId) + { + case BG_SA_TITAN_RELIC: + if (GateStatus[BG_SA_ANCIENT_GATE] != BG_SA_GATE_DESTROYED || GateStatus[BG_SA_YELLOW_GATE] != BG_SA_GATE_DESTROYED) + return false; + // no break + case BG_SA_CENTRAL_FLAG: + if (GateStatus[BG_SA_RED_GATE] != BG_SA_GATE_DESTROYED && GateStatus[BG_SA_PURPLE_GATE] != BG_SA_GATE_DESTROYED) + return false; + // no break + case BG_SA_LEFT_FLAG: + case BG_SA_RIGHT_FLAG: + if (GateStatus[BG_SA_GREEN_GATE] != BG_SA_GATE_DESTROYED && GateStatus[BG_SA_BLUE_GATE] != BG_SA_GATE_DESTROYED) + return false; + break; + default: + ASSERT(false); + break; + } + + return true; +} + +void BattlegroundSA::UpdateObjectInteractionFlags(uint32 objectId) +{ + if (GameObject* go = GetBGObject(objectId)) + { + if (CanInteractWithObject(objectId)) + go->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + else + go->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); + } +} + +void BattlegroundSA::UpdateObjectInteractionFlags() +{ + for (uint8 i = BG_SA_CENTRAL_FLAG; i <= BG_SA_LEFT_FLAG; ++i) + UpdateObjectInteractionFlags(i); + UpdateObjectInteractionFlags(BG_SA_TITAN_RELIC); +} + void BattlegroundSA::EventPlayerClickedOnFlag(Player* source, GameObject* go) { switch (go->GetEntry()) { case 191307: case 191308: - if (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED) + if (CanInteractWithObject(BG_SA_LEFT_FLAG)) CaptureGraveyard(BG_SA_LEFT_CAPTURABLE_GY, source); break; case 191305: case 191306: - if (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED) + if (CanInteractWithObject(BG_SA_RIGHT_FLAG)) CaptureGraveyard(BG_SA_RIGHT_CAPTURABLE_GY, source); break; case 191310: case 191309: - if ((GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED) && (GateStatus[BG_SA_RED_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_PURPLE_GATE] == BG_SA_GATE_DESTROYED)) + if (CanInteractWithObject(BG_SA_CENTRAL_FLAG)) CaptureGraveyard(BG_SA_CENTRAL_CAPTURABLE_GY, source); break; default: @@ -857,10 +888,7 @@ void BattlegroundSA::TitanRelicActivated(Player* clicker) if (!clicker) return; - if (GateStatus[BG_SA_ANCIENT_GATE] == BG_SA_GATE_DESTROYED && - GateStatus[BG_SA_YELLOW_GATE] == BG_SA_GATE_DESTROYED && - (GateStatus[BG_SA_PURPLE_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_RED_GATE] == BG_SA_GATE_DESTROYED) && - (GateStatus[BG_SA_GREEN_GATE] == BG_SA_GATE_DESTROYED || GateStatus[BG_SA_BLUE_GATE] == BG_SA_GATE_DESTROYED)) + if (CanInteractWithObject(BG_SA_TITAN_RELIC)) { if (clicker->GetTeamId() == Attackers) { diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h index 183392ac40b..5c77b61e71f 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h +++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h @@ -619,6 +619,7 @@ class BattlegroundSA : public Battleground * -Teleport all players to good location */ void TeleportPlayers(); + void TeleportToEntrancePosition(Player* player); /** * \brief Called on start and between the two round * -Update faction of all vehicle @@ -626,6 +627,11 @@ class BattlegroundSA : public Battleground void OverrideGunFaction(); /// Set selectable or not demolisher, called on battle start, when boats arrive to dock void DemolisherStartState(bool start); + /// Checks if a player can interact with the given object + bool CanInteractWithObject(uint32 objectId); + /// Updates interaction flags of specific objects + void UpdateObjectInteractionFlags(uint32 objectId); + void UpdateObjectInteractionFlags(); /** * \brief Called when a gate is destroy * -Give honor to player witch destroy it diff --git a/src/server/game/Calendar/CalendarMgr.h b/src/server/game/Calendar/CalendarMgr.h index 6785b36569f..8122f41c0f5 100644 --- a/src/server/game/Calendar/CalendarMgr.h +++ b/src/server/game/Calendar/CalendarMgr.h @@ -167,7 +167,7 @@ struct CalendarInvite void SetStatusTime(time_t statusTime) { _statusTime = statusTime; } time_t GetStatusTime() const { return _statusTime; } - void SetText(const std::string& text) { _text = text; } + void SetText(std::string const& text) { _text = text; } std::string GetText() const { return _text; } void SetStatus(CalendarInviteStatus status) { _status = status; } @@ -224,10 +224,10 @@ struct CalendarEvent void SetGuildId(ObjectGuid::LowType guildId) { _guildId = guildId; } ObjectGuid::LowType GetGuildId() const { return _guildId; } - void SetTitle(const std::string& title) { _title = title; } + void SetTitle(std::string const& title) { _title = title; } std::string GetTitle() const { return _title; } - void SetDescription(const std::string& description) { _description = description; } + void SetDescription(std::string const& description) { _description = description; } std::string GetDescription() const { return _description; } void SetType(CalendarEventType type) { _type = type; } diff --git a/src/server/game/Chat/Channels/Channel.cpp b/src/server/game/Chat/Channels/Channel.cpp index 90c44aa501b..97fa489d388 100644 --- a/src/server/game/Chat/Channels/Channel.cpp +++ b/src/server/game/Chat/Channels/Channel.cpp @@ -995,7 +995,7 @@ void Channel::JoinNotify(Player const* player) { WorldPackets::Channel::UserlistAdd userlistAdd; userlistAdd.AddedUserGUID = guid; - userlistAdd.ChannelFlags = GetFlags(); + userlistAdd._ChannelFlags = GetFlags(); userlistAdd.UserFlags = GetPlayerFlags(guid); userlistAdd.ChannelID = GetChannelId(); userlistAdd.ChannelName = GetName(); @@ -1005,7 +1005,7 @@ void Channel::JoinNotify(Player const* player) { WorldPackets::Channel::UserlistUpdate userlistUpdate; userlistUpdate.UpdatedUserGUID = guid; - userlistUpdate.ChannelFlags = GetFlags(); + userlistUpdate._ChannelFlags = GetFlags(); userlistUpdate.UserFlags = GetPlayerFlags(guid); userlistUpdate.ChannelID = GetChannelId(); userlistUpdate.ChannelName = GetName(); @@ -1018,7 +1018,7 @@ void Channel::LeaveNotify(Player const* player) ObjectGuid const& guid = player->GetGUID(); WorldPackets::Channel::UserlistRemove userlistRemove; userlistRemove.RemovedUserGUID = guid; - userlistRemove.ChannelFlags = GetFlags(); + userlistRemove._ChannelFlags = GetFlags(); userlistRemove.ChannelID = GetChannelId(); userlistRemove.ChannelName = GetName(); diff --git a/src/server/game/Chat/Chat.cpp b/src/server/game/Chat/Chat.cpp index ed6aa52da5a..0c4c621bff2 100644 --- a/src/server/game/Chat/Chat.cpp +++ b/src/server/game/Chat/Chat.cpp @@ -81,6 +81,7 @@ ChatCommand* ChatHandler::getCommandTable() // cache top-level commands size_t added = 0; + free(commandTableCache); commandTableCache = (ChatCommand*)malloc(sizeof(ChatCommand) * total); ASSERT(commandTableCache); memset(commandTableCache, 0, sizeof(ChatCommand) * total); @@ -796,15 +797,11 @@ GameObject* ChatHandler::GetObjectGlobalyWithGuidOrNearWithDbGuid(ObjectGuid::Lo if (!obj && sObjectMgr->GetGOData(lowguid)) // guid is DB guid of object { - // search near player then - CellCoord p(Trinity::ComputeCellCoord(pl->GetPositionX(), pl->GetPositionY())); - Cell cell(p); + auto bounds = pl->GetMap()->GetGameObjectBySpawnIdStore().equal_range(lowguid); + if (bounds.first == bounds.second) + return nullptr; - Trinity::GameObjectWithDbGUIDCheck go_check(*pl, lowguid); - Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(pl, obj, go_check); - - TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > object_checker(checker); - cell.Visit(p, object_checker, *pl->GetMap(), *pl, pl->GetGridActivationRange()); + return bounds.first->second; } return obj; diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 89a7d64c432..9d5d518234a 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -167,13 +167,13 @@ bool ItemChatLink::Initialize(std::istringstream& iss) return true; } -inline std::string ItemChatLink::FormatName(uint8 index, char* suffixStrings) const +std::string ItemChatLink::FormatName(uint8 index, LocalizedString* suffixStrings) const { std::stringstream ss; ss << _item->GetName(LocaleConstant(index)); if (suffixStrings) - ss << ' ' << suffixStrings[index]; + ss << ' ' << suffixStrings->Str[index]; return ss.str(); } @@ -181,7 +181,7 @@ bool ItemChatLink::ValidateName(char* buffer, const char* context) { ChatLink::ValidateName(buffer, context); - char* suffixStrings = _suffix ? _suffix->Name_lang : (_property ? _property->Name_lang : NULL); + LocalizedString* suffixStrings = _suffix ? _suffix->Name : (_property ? _property->Name : NULL); bool res = (FormatName(LOCALE_enUS, suffixStrings) == buffer); if (!res) diff --git a/src/server/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h index 7288403280b..83a8d2425bb 100644 --- a/src/server/game/Chat/ChatLink.h +++ b/src/server/game/Chat/ChatLink.h @@ -22,6 +22,7 @@ #include <sstream> #include <list> #include <cstring> +#include "Common.h" struct ItemLocale; struct ItemTemplate; @@ -65,7 +66,7 @@ public: virtual bool ValidateName(char* buffer, const char* context) override; protected: - std::string FormatName(uint8 index, char* suffixStrings) const; + std::string FormatName(uint8 index, LocalizedString* suffixStrings) const; ItemTemplate const* _item; int32 _data[8]; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index babbbbce153..c8ccc15019d 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -1565,6 +1565,9 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) if (!effect) continue; + if (effect->ChainTargets > 0) + continue; + switch (effect->TargetA.GetSelectionCategory()) { case TARGET_SELECT_CATEGORY_NEARBY: @@ -1585,7 +1588,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) break; } - TC_LOG_ERROR("sql.sql", "SourceEntry %u SourceGroup %u in `condition` table - spell %u does not have implicit targets of types: _AREA_, _CONE_, _NEARBY_ for effect %u, SourceGroup needs correction, ignoring.", cond->SourceEntry, origGroup, cond->SourceEntry, uint32(i)); + TC_LOG_ERROR("sql.sql", "SourceEntry %u SourceGroup %u in `condition` table - spell %u does not have implicit targets of types: _AREA_, _CONE_, _NEARBY_, __CHAIN__ for effect %u, SourceGroup needs correction, ignoring.", cond->SourceEntry, origGroup, cond->SourceEntry, uint32(i)); cond->SourceGroup &= ~(1 << i); } // all effects were removed, no need to add the condition at all diff --git a/src/server/game/Conditions/DisableMgr.cpp b/src/server/game/Conditions/DisableMgr.cpp index c2527b1d28f..369d538147c 100644 --- a/src/server/game/Conditions/DisableMgr.cpp +++ b/src/server/game/Conditions/DisableMgr.cpp @@ -345,6 +345,8 @@ bool IsDisabledFor(DisableType type, uint32 entry, Unit const* unit, uint8 flags return (disabledModes & RAID_STATUSFLAG_10MAN_HEROIC) != 0; case DIFFICULTY_25_HC: return (disabledModes & RAID_STATUSFLAG_25MAN_HEROIC) != 0; + default: + return false; } } else if (mapEntry->InstanceType == MAP_COMMON) diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index 01c65315d35..2bf33785137 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -16,68 +16,115 @@ */ #include "DB2Stores.h" +#include "Common.h" +#include "Containers.h" #include "DBCStores.h" #include "DB2fmt.h" -#include "Common.h" #include "Log.h" +#include "TransportMgr.h" #include "World.h" #include <functional> -DB2Storage<AreaGroupEntry> sAreaGroupStore("AreaGroup.db2", AreaGroupFormat, HOTFIX_SEL_AREA_GROUP); -DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); -DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); -DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES); -DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT); -DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); -DB2Storage<GarrAbilityEntry> sGarrAbilityStore("GarrAbility.db2", GarrAbilityFormat, HOTFIX_SEL_GARR_ABILITY); -DB2Storage<GarrBuildingEntry> sGarrBuildingStore("GarrBuilding.db2", GarrBuildingFormat, HOTFIX_SEL_GARR_BUILDING); -DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstFormat, HOTFIX_SEL_GARR_BUILDING_PLOT_INST); -DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecFormat, HOTFIX_SEL_GARR_CLASS_SPEC); -DB2Storage<GarrFollowerEntry> sGarrFollowerStore("GarrFollower.db2", GarrFollowerFormat, HOTFIX_SEL_GARR_FOLLOWER); -DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityFormat, HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); -DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingFormat, HOTFIX_SEL_GARR_PLOT_BUILDING); -DB2Storage<GarrPlotEntry> sGarrPlotStore("GarrPlot.db2", GarrPlotFormat, HOTFIX_SEL_GARR_PLOT); -DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceFormat, HOTFIX_SEL_GARR_PLOT_INSTANCE); -DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelFormat, HOTFIX_SEL_GARR_SITE_LEVEL); -DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstFormat, HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); -DB2Storage<HolidaysEntry> sHolidaysStore("Holidays.db2", HolidaysEntryFormat, HOTFIX_SEL_HOLIDAYS); -DB2Storage<ItemAppearanceEntry> sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceFormat, HOTFIX_SEL_ITEM_APPEARANCE); -DB2Storage<ItemBonusEntry> sItemBonusStore("ItemBonus.db2", ItemBonusFormat, HOTFIX_SEL_ITEM_BONUS); -DB2Storage<ItemBonusTreeNodeEntry> sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeFormat, HOTFIX_SEL_ITEM_BONUS_TREE_NODE); -DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostFormat, HOTFIX_SEL_ITEM_CURRENCY_COST); -DB2Storage<ItemEffectEntry> sItemEffectStore("ItemEffect.db2", ItemEffectFormat, HOTFIX_SEL_ITEM_EFFECT); -DB2Storage<ItemEntry> sItemStore("Item.db2", ItemFormat, HOTFIX_SEL_ITEM); -DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostFormat, HOTFIX_SEL_ITEM_EXTENDED_COST); -DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceFormat, HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); -DB2Storage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); -DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeFormat, HOTFIX_SEL_ITEM_X_BONUS_TREE); -DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN); -DB2Storage<MountEntry> sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT); -DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA); -DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_GROUP); -DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemfmt, HOTFIX_SEL_QUEST_PACKAGE_ITEM); -DB2Storage<SoundEntriesEntry> sSoundEntriesStore("SoundEntries.db2", SoundEntriesFormat, HOTFIX_SEL_SOUND_ENTRIES); -DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsFormat, HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); -DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsFormat, HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); -DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsFormat, HOTFIX_SEL_SPELL_CLASS_OPTIONS); -DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL); -DB2Storage<SpellMiscEntry> sSpellMiscStore("SpellMisc.db2", SpellMiscFormat, HOTFIX_SEL_SPELL_MISC); -DB2Storage<SpellPowerDifficultyEntry> sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyFormat, HOTFIX_SEL_SPELL_POWER_DIFFICULTY); -DB2Storage<SpellPowerEntry> sSpellPowerStore("SpellPower.db2", SpellPowerFormat, HOTFIX_SEL_SPELL_POWER); -DB2Storage<SpellReagentsEntry> sSpellReagentsStore("SpellReagents.db2", SpellReagentsFormat, HOTFIX_SEL_SPELL_REAGENTS); -DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore("SpellRuneCost.db2", SpellRuneCostFormat, HOTFIX_SEL_SPELL_RUNE_COST); -DB2Storage<SpellTotemsEntry> sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS); -DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES); -DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH); -DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE); - -TaxiMask sTaxiNodesMask; -TaxiMask sOldContinentsNodesMask; -TaxiMask sHordeTaxiNodesMask; -TaxiMask sAllianceTaxiNodesMask; -TaxiMask sDeathKnightTaxiNodesMask; -TaxiPathSetBySource sTaxiPathSetBySource; -TaxiPathNodesByPath sTaxiPathNodesByPath; +DB2Storage<AreaGroupEntry> sAreaGroupStore("AreaGroup.db2", AreaGroupFormat, HOTFIX_SEL_AREA_GROUP); +DB2Storage<AreaGroupMemberEntry> sAreaGroupMemberStore("AreaGroupMember.db2", AreaGroupMemberFormat, HOTFIX_SEL_AREA_GROUP_MEMBER); +DB2Storage<AuctionHouseEntry> sAuctionHouseStore("AuctionHouse.db2", AuctionHouseFormat, HOTFIX_SEL_AUCTION_HOUSE); +DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore("BarberShopStyle.db2", BarberShopStyleFormat, HOTFIX_SEL_BARBER_SHOP_STYLE); +DB2Storage<BroadcastTextEntry> sBroadcastTextStore("BroadcastText.db2", BroadcastTextFormat, HOTFIX_SEL_BROADCAST_TEXT); +DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore("CharStartOutfit.db2", CharStartOutfitFormat, HOTFIX_SEL_CHAR_START_OUTFIT); +DB2Storage<ChrClassesXPowerTypesEntry> sChrClassesXPowerTypesStore("ChrClassesXPowerTypes.db2", ChrClassesXPowerTypesFormat, HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES); +DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", CinematicSequencesFormat, HOTFIX_SEL_CINEMATIC_SEQUENCES); +DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore("CreatureDisplayInfo.db2", CreatureDisplayInfoFormat, HOTFIX_SEL_CREATURE_DISPLAY_INFO); +DB2Storage<CreatureTypeEntry> sCreatureTypeStore("CreatureType.db2", CreatureTypeFormat, HOTFIX_SEL_CREATURE_TYPE); +DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore("CurrencyTypes.db2", CurrencyTypesFormat, HOTFIX_SEL_CURRENCY_TYPES); +DB2Storage<CurvePointEntry> sCurvePointStore("CurvePoint.db2", CurvePointFormat, HOTFIX_SEL_CURVE_POINT); +DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore("DestructibleModelData.db2", DestructibleModelDataFormat, HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA); +DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore("DurabilityQuality.db2", DurabilityQualityFormat, HOTFIX_SEL_DURABILITY_QUALITY); +DB2Storage<GameObjectsEntry> sGameObjectsStore("GameObjects.db2", GameObjectsFormat, HOTFIX_SEL_GAMEOBJECTS); +DB2Storage<GameTablesEntry> sGameTablesStore("GameTables.db2", GameTablesFormat, HOTFIX_SEL_GAME_TABLES); +DB2Storage<GarrAbilityEntry> sGarrAbilityStore("GarrAbility.db2", GarrAbilityFormat, HOTFIX_SEL_GARR_ABILITY); +DB2Storage<GarrBuildingEntry> sGarrBuildingStore("GarrBuilding.db2", GarrBuildingFormat, HOTFIX_SEL_GARR_BUILDING); +DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore("GarrBuildingPlotInst.db2", GarrBuildingPlotInstFormat, HOTFIX_SEL_GARR_BUILDING_PLOT_INST); +DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore("GarrClassSpec.db2", GarrClassSpecFormat, HOTFIX_SEL_GARR_CLASS_SPEC); +DB2Storage<GarrFollowerEntry> sGarrFollowerStore("GarrFollower.db2", GarrFollowerFormat, HOTFIX_SEL_GARR_FOLLOWER); +DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore("GarrFollowerXAbility.db2", GarrFollowerXAbilityFormat, HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY); +DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore("GarrPlotBuilding.db2", GarrPlotBuildingFormat, HOTFIX_SEL_GARR_PLOT_BUILDING); +DB2Storage<GarrPlotEntry> sGarrPlotStore("GarrPlot.db2", GarrPlotFormat, HOTFIX_SEL_GARR_PLOT); +DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore("GarrPlotInstance.db2", GarrPlotInstanceFormat, HOTFIX_SEL_GARR_PLOT_INSTANCE); +DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore("GarrSiteLevel.db2", GarrSiteLevelFormat, HOTFIX_SEL_GARR_SITE_LEVEL); +DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore("GarrSiteLevelPlotInst.db2", GarrSiteLevelPlotInstFormat, HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST); +DB2Storage<GlyphSlotEntry> sGlyphSlotStore("GlyphSlot.db2", GlyphSlotFormat, HOTFIX_SEL_GLYPH_SLOT); +DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore("GuildPerkSpells.db2", GuildPerkSpellsFormat, HOTFIX_SEL_GUILD_PERK_SPELLS); +DB2Storage<HolidaysEntry> sHolidaysStore("Holidays.db2", HolidaysEntryFormat, HOTFIX_SEL_HOLIDAYS); +DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore("ImportPriceArmor.db2", ImportPriceArmorFormat, HOTFIX_SEL_IMPORT_PRICE_ARMOR); +DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore("ImportPriceQuality.db2", ImportPriceQualityFormat, HOTFIX_SEL_IMPORT_PRICE_QUALITY); +DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore("ImportPriceShield.db2", ImportPriceShieldFormat, HOTFIX_SEL_IMPORT_PRICE_SHIELD); +DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore("ImportPriceWeapon.db2", ImportPriceWeaponFormat, HOTFIX_SEL_IMPORT_PRICE_WEAPON); +DB2Storage<ItemAppearanceEntry> sItemAppearanceStore("ItemAppearance.db2", ItemAppearanceFormat, HOTFIX_SEL_ITEM_APPEARANCE); +DB2Storage<ItemBonusEntry> sItemBonusStore("ItemBonus.db2", ItemBonusFormat, HOTFIX_SEL_ITEM_BONUS); +DB2Storage<ItemBonusTreeNodeEntry> sItemBonusTreeNodeStore("ItemBonusTreeNode.db2", ItemBonusTreeNodeFormat, HOTFIX_SEL_ITEM_BONUS_TREE_NODE); +DB2Storage<ItemClassEntry> sItemClassStore("ItemClass.db2", ItemClassFormat, HOTFIX_SEL_ITEM_CLASS); +DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore("ItemCurrencyCost.db2", ItemCurrencyCostFormat, HOTFIX_SEL_ITEM_CURRENCY_COST); +DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore("ItemDisenchantLoot.db2", ItemDisenchantLootFormat, HOTFIX_SEL_ITEM_DISENCHANT_LOOT); +DB2Storage<ItemEffectEntry> sItemEffectStore("ItemEffect.db2", ItemEffectFormat, HOTFIX_SEL_ITEM_EFFECT); +DB2Storage<ItemEntry> sItemStore("Item.db2", ItemFormat, HOTFIX_SEL_ITEM); +DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore("ItemExtendedCost.db2", ItemExtendedCostFormat, HOTFIX_SEL_ITEM_EXTENDED_COST); +DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore("ItemLimitCategory.db2", ItemLimitCategoryFormat, HOTFIX_SEL_ITEM_LIMIT_CATEGORY); +DB2Storage<ItemModifiedAppearanceEntry> sItemModifiedAppearanceStore("ItemModifiedAppearance.db2", ItemModifiedAppearanceFormat, HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE); +DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore("ItemPriceBase.db2", ItemPriceBaseFormat, HOTFIX_SEL_ITEM_PRICE_BASE); +DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore("ItemRandomProperties.db2", ItemRandomPropertiesFormat, HOTFIX_SEL_ITEM_RANDOM_PROPERTIES); +DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore("ItemRandomSuffix.db2", ItemRandomSuffixFormat, HOTFIX_SEL_ITEM_RANDOM_SUFFIX); +DB2Storage<ItemSparseEntry> sItemSparseStore("Item-sparse.db2", ItemSparseFormat, HOTFIX_SEL_ITEM_SPARSE); +DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", ItemSpecFormat, HOTFIX_SEL_ITEM_SPEC); +DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", ItemSpecOverrideFormat, HOTFIX_SEL_ITEM_SPEC_OVERRIDE); +DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", ItemXBonusTreeFormat, HOTFIX_SEL_ITEM_X_BONUS_TREE); +DB2Storage<KeyChainEntry> sKeyChainStore("KeyChain.db2", KeyChainFormat, HOTFIX_SEL_KEY_CHAIN); +DB2Storage<MailTemplateEntry> sMailTemplateStore("MailTemplate.db2", MailTemplateFormat, HOTFIX_SEL_MAIL_TEMPLATE); +DB2Storage<MountCapabilityEntry> sMountCapabilityStore("MountCapability.db2", MountCapabilityFormat, HOTFIX_SEL_MOUNT_CAPABILITY); +DB2Storage<MountEntry> sMountStore("Mount.db2", MountFormat, HOTFIX_SEL_MOUNT); +DB2Storage<MountTypeXCapabilityEntry> sMountTypeXCapabilityStore("MountTypeXCapability.db2", MountTypeXCapabilityFormat, HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY); +DB2Storage<NameGenEntry> sNameGenStore("NameGen.db2", NameGenFormat, HOTFIX_SEL_NAME_GEN); +DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore("OverrideSpellData.db2", OverrideSpellDataFormat, HOTFIX_SEL_OVERRIDE_SPELL_DATA); +DB2Storage<PhaseXPhaseGroupEntry> sPhaseXPhaseGroupStore("PhaseXPhaseGroup.db2", PhaseXPhaseGroupFormat, HOTFIX_SEL_PHASE_X_PHASE_GROUP); +DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore("QuestMoneyReward.db2", QuestMoneyRewardFormat, HOTFIX_SEL_QUEST_MONEY_REWARD); +DB2Storage<QuestPackageItemEntry> sQuestPackageItemStore("QuestPackageItem.db2", QuestPackageItemfmt, HOTFIX_SEL_QUEST_PACKAGE_ITEM); +DB2Storage<QuestSortEntry> sQuestSortStore("QuestSort.db2", QuestSortFormat, HOTFIX_SEL_QUEST_SORT); +DB2Storage<QuestV2Entry> sQuestV2Store("QuestV2.db2", QuestV2Format, HOTFIX_SEL_QUEST_V2); +DB2Storage<QuestXPEntry> sQuestXPStore("QuestXP.db2", QuestXPFormat, HOTFIX_SEL_QUEST_XP); +DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore("ScalingStatDistribution.db2", ScalingStatDistributionFormat, HOTFIX_SEL_SCALING_STAT_DISTRIBUTION); +DB2Storage<SoundEntriesEntry> sSoundEntriesStore("SoundEntries.db2", SoundEntriesFormat, HOTFIX_SEL_SOUND_ENTRIES); +DB2Storage<SpecializationSpellsEntry> sSpecializationSpellsStore("SpecializationSpells.db2", SpecializationSpellsFormat, HOTFIX_SEL_SPECIALIZATION_SPELLS); +DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", SpellAuraRestrictionsFormat, HOTFIX_SEL_SPELL_AURA_RESTRICTIONS); +DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore("SpellCastTimes.db2", SpellCastTimesFormat, HOTFIX_SEL_SPELL_CAST_TIMES); +DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore("SpellCastingRequirements.db2", SpellCastingRequirementsFormat, HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS); +DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore("SpellClassOptions.db2", SpellClassOptionsFormat, HOTFIX_SEL_SPELL_CLASS_OPTIONS); +DB2Storage<SpellDurationEntry> sSpellDurationStore("SpellDuration.db2", SpellDurationFormat, HOTFIX_SEL_SPELL_DURATION); +DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore("SpellItemEnchantmentCondition.db2", SpellItemEnchantmentConditionFormat, HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION); +DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore("SpellLearnSpell.db2", SpellLearnSpellFormat, HOTFIX_SEL_SPELL_LEARN_SPELL); +DB2Storage<SpellMiscEntry> sSpellMiscStore("SpellMisc.db2", SpellMiscFormat, HOTFIX_SEL_SPELL_MISC); +DB2Storage<SpellPowerDifficultyEntry> sSpellPowerDifficultyStore("SpellPowerDifficulty.db2", SpellPowerDifficultyFormat, HOTFIX_SEL_SPELL_POWER_DIFFICULTY); +DB2Storage<SpellPowerEntry> sSpellPowerStore("SpellPower.db2", SpellPowerFormat, HOTFIX_SEL_SPELL_POWER); +DB2Storage<SpellRadiusEntry> sSpellRadiusStore("SpellRadius.db2", SpellRadiusFormat, HOTFIX_SEL_SPELL_RADIUS); +DB2Storage<SpellRangeEntry> sSpellRangeStore("SpellRange.db2", SpellRangeFormat, HOTFIX_SEL_SPELL_RANGE); +DB2Storage<SpellReagentsEntry> sSpellReagentsStore("SpellReagents.db2", SpellReagentsFormat, HOTFIX_SEL_SPELL_REAGENTS); +DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore("SpellRuneCost.db2", SpellRuneCostFormat, HOTFIX_SEL_SPELL_RUNE_COST); +DB2Storage<SpellTotemsEntry> sSpellTotemsStore("SpellTotems.db2", SpellTotemsFormat, HOTFIX_SEL_SPELL_TOTEMS); +DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore("SpellXSpellVisual.db2", SpellXSpellVisualFormat, HOTFIX_SEL_SPELL_X_SPELL_VISUAL); +DB2Storage<TaxiNodesEntry> sTaxiNodesStore("TaxiNodes.db2", TaxiNodesFormat, HOTFIX_SEL_TAXI_NODES); +DB2Storage<TaxiPathEntry> sTaxiPathStore("TaxiPath.db2", TaxiPathFormat, HOTFIX_SEL_TAXI_PATH); +DB2Storage<TaxiPathNodeEntry> sTaxiPathNodeStore("TaxiPathNode.db2", TaxiPathNodeFormat, HOTFIX_SEL_TAXI_PATH_NODE); +DB2Storage<TotemCategoryEntry> sTotemCategoryStore("TotemCategory.db2", TotemCategoryFormat, HOTFIX_SEL_TOTEM_CATEGORY); +DB2Storage<TransportAnimationEntry> sTransportAnimationStore("TransportAnimation.db2", TransportAnimationFormat, HOTFIX_SEL_TRANSPORT_ANIMATION); +DB2Storage<TransportRotationEntry> sTransportRotationStore("TransportRotation.db2", TransportRotationFormat, HOTFIX_SEL_TRANSPORT_ROTATION); +DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore("UnitPowerBar.db2", UnitPowerBarFormat, HOTFIX_SEL_UNIT_POWER_BAR); +DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore("WorldMapOverlay.db2", WorldMapOverlayFormat, HOTFIX_SEL_WORLD_MAP_OVERLAY); + +TaxiMask sTaxiNodesMask; +TaxiMask sOldContinentsNodesMask; +TaxiMask sHordeTaxiNodesMask; +TaxiMask sAllianceTaxiNodesMask; +TaxiMask sDeathKnightTaxiNodesMask; +TaxiPathSetBySource sTaxiPathSetBySource; +TaxiPathNodesByPath sTaxiPathNodesByPath; typedef std::list<std::string> DB2StoreProblemList; @@ -141,13 +188,23 @@ void DB2Manager::LoadStores(std::string const& dataPath) LOAD_DB2(sAreaGroupMemberStore); LOAD_DB2(sAreaGroupStore); + LOAD_DB2(sAuctionHouseStore); + LOAD_DB2(sBarberShopStyleStore); LOAD_DB2(sBroadcastTextStore); + LOAD_DB2(sCharStartOutfitStore); + LOAD_DB2(sChrClassesXPowerTypesStore); + LOAD_DB2(sCinematicSequencesStore); + LOAD_DB2(sCreatureDisplayInfoStore); + LOAD_DB2(sCreatureTypeStore); LOAD_DB2(sCurrencyTypesStore); LOAD_DB2(sCurvePointStore); + LOAD_DB2(sDestructibleModelDataStore); + LOAD_DB2(sDurabilityQualityStore); LOAD_DB2(sGameObjectsStore); + LOAD_DB2(sGameTablesStore); LOAD_DB2(sGarrAbilityStore); - LOAD_DB2(sGarrBuildingStore); LOAD_DB2(sGarrBuildingPlotInstStore); + LOAD_DB2(sGarrBuildingStore); LOAD_DB2(sGarrClassSpecStore); LOAD_DB2(sGarrFollowerStore); LOAD_DB2(sGarrFollowerXAbilityStore); @@ -156,42 +213,97 @@ void DB2Manager::LoadStores(std::string const& dataPath) LOAD_DB2(sGarrPlotStore); LOAD_DB2(sGarrSiteLevelPlotInstStore); LOAD_DB2(sGarrSiteLevelStore); + LOAD_DB2(sGlyphSlotStore); + LOAD_DB2(sGuildPerkSpellsStore); LOAD_DB2(sHolidaysStore); + LOAD_DB2(sImportPriceArmorStore); + LOAD_DB2(sImportPriceQualityStore); + LOAD_DB2(sImportPriceShieldStore); + LOAD_DB2(sImportPriceWeaponStore); LOAD_DB2(sItemAppearanceStore); LOAD_DB2(sItemBonusStore); LOAD_DB2(sItemBonusTreeNodeStore); + LOAD_DB2(sItemClassStore); LOAD_DB2(sItemCurrencyCostStore); + LOAD_DB2(sItemDisenchantLootStore); LOAD_DB2(sItemEffectStore); LOAD_DB2(sItemExtendedCostStore); + LOAD_DB2(sItemLimitCategoryStore); LOAD_DB2(sItemModifiedAppearanceStore); + LOAD_DB2(sItemPriceBaseStore); + LOAD_DB2(sItemRandomPropertiesStore); + LOAD_DB2(sItemRandomSuffixStore); LOAD_DB2(sItemSparseStore); + LOAD_DB2(sItemSpecOverrideStore); + LOAD_DB2(sItemSpecStore); LOAD_DB2(sItemStore); LOAD_DB2(sItemXBonusTreeStore); LOAD_DB2(sKeyChainStore); + LOAD_DB2(sMailTemplateStore); + LOAD_DB2(sMountCapabilityStore); LOAD_DB2(sMountStore); + LOAD_DB2(sMountTypeXCapabilityStore); + LOAD_DB2(sNameGenStore); LOAD_DB2(sOverrideSpellDataStore); LOAD_DB2(sPhaseXPhaseGroupStore); + LOAD_DB2(sQuestMoneyRewardStore); LOAD_DB2(sQuestPackageItemStore); + LOAD_DB2(sQuestSortStore); + LOAD_DB2(sQuestV2Store); + LOAD_DB2(sQuestXPStore); + LOAD_DB2(sScalingStatDistributionStore); LOAD_DB2(sSoundEntriesStore); + LOAD_DB2(sSpecializationSpellsStore); LOAD_DB2(sSpellAuraRestrictionsStore); + LOAD_DB2(sSpellCastTimesStore); LOAD_DB2(sSpellCastingRequirementsStore); LOAD_DB2(sSpellClassOptionsStore); + LOAD_DB2(sSpellDurationStore); + LOAD_DB2(sSpellItemEnchantmentConditionStore); LOAD_DB2(sSpellLearnSpellStore); LOAD_DB2(sSpellMiscStore); LOAD_DB2(sSpellPowerDifficultyStore); LOAD_DB2(sSpellPowerStore); + LOAD_DB2(sSpellRadiusStore); + LOAD_DB2(sSpellRangeStore); LOAD_DB2(sSpellReagentsStore); LOAD_DB2(sSpellRuneCostStore); LOAD_DB2(sSpellTotemsStore); + LOAD_DB2(sSpellXSpellVisualStore); LOAD_DB2(sTaxiNodesStore); LOAD_DB2(sTaxiPathNodeStore); LOAD_DB2(sTaxiPathStore); + LOAD_DB2(sTotemCategoryStore); + LOAD_DB2(sTransportAnimationStore); + LOAD_DB2(sTransportRotationStore); + LOAD_DB2(sUnitPowerBarStore); + LOAD_DB2(sWorldMapOverlayStore); #undef LOAD_DB2 for (AreaGroupMemberEntry const* areaGroupMember : sAreaGroupMemberStore) _areaGroupMembers[areaGroupMember->AreaGroupID].push_back(areaGroupMember->AreaID); + for (CharStartOutfitEntry const* outfit : sCharStartOutfitStore) + _charStartOutfits[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit; + + for (uint32 i = 0; i < MAX_CLASSES; ++i) + for (uint32 j = 0; j < MAX_POWERS; ++j) + _powersByClass[i][j] = MAX_POWERS; + + for (uint32 i = 0; i < sChrClassesXPowerTypesStore.GetNumRows(); ++i) + { + if (ChrClassesXPowerTypesEntry const* power = sChrClassesXPowerTypesStore.LookupEntry(i)) + { + uint32 index = 0; + for (uint32 j = 0; j < MAX_POWERS; ++j) + if (_powersByClass[power->ClassID][j] != MAX_POWERS) + ++index; + + _powersByClass[power->ClassID][power->PowerType] = index; + } + } + for (ItemBonusEntry const* bonus : sItemBonusStore) _itemBonusLists[bonus->BonusListID].push_back(bonus); @@ -209,6 +321,9 @@ void DB2Manager::LoadStores(std::string const& dataPath) if (ItemAppearanceEntry const* appearance = sItemAppearanceStore.LookupEntry(appearanceMod->AppearanceID)) _itemDisplayIDs[appearanceMod->ItemID | (appearanceMod->AppearanceModID << 24)] = appearance->DisplayID; + for (ItemSpecOverrideEntry const* entry : sItemSpecOverrideStore) + _itemSpecOverrides[entry->ItemID].push_back(entry); + for (ItemXBonusTreeEntry const* itemBonusTreeAssignment : sItemXBonusTreeStore) _itemToBonusTree.insert({ itemBonusTreeAssignment->ItemID, itemBonusTreeAssignment->BonusTreeID }); @@ -225,6 +340,12 @@ void DB2Manager::LoadStores(std::string const& dataPath) for (MountEntry const* mount : sMountStore) _mountsBySpellId[mount->SpellId] = mount; + for (MountTypeXCapabilityEntry const* mount : sMountTypeXCapabilityStore) + _mountCapabilitiesByType[mount->MountTypeID].insert(mount); + + for (NameGenEntry const* entry : sNameGenStore) + _nameGenData[entry->Race][entry->Sex].push_back(entry); + for (PhaseXPhaseGroupEntry const* group : sPhaseXPhaseGroupStore) if (PhaseEntry const* phase = sPhaseStore.LookupEntry(group->PhaseID)) _phasesByGroup[group->PhaseGroupID].insert(phase->ID); @@ -232,6 +353,9 @@ void DB2Manager::LoadStores(std::string const& dataPath) for (QuestPackageItemEntry const* questPackageItem : sQuestPackageItemStore) _questPackages[questPackageItem->QuestPackageID].push_back(questPackageItem); + for (SpecializationSpellsEntry const* specSpells : sSpecializationSpellsStore) + _specializationSpellsBySpec[specSpells->SpecID].push_back(specSpells); + for (SpellPowerEntry const* power : sSpellPowerStore) { if (SpellPowerDifficultyEntry const* powerDifficulty = sSpellPowerDifficultyStore.LookupEntry(power->ID)) @@ -335,6 +459,12 @@ void DB2Manager::LoadStores(std::string const& dataPath) } } + for (TransportAnimationEntry const* anim : sTransportAnimationStore) + sTransportMgr->AddPathNodeToTransport(anim->TransportID, anim->TimeIndex, anim); + + for (TransportRotationEntry const* rot : sTransportRotationStore) + sTransportMgr->AddPathRotationToTransport(rot->TransportID, rot->TimeIndex, rot); + // error checks if (bad_db2_files.size() >= DB2FilesCount) { @@ -352,8 +482,8 @@ void DB2Manager::LoadStores(std::string const& dataPath) } // Check loaded DB2 files proper version - if (!sItemStore.LookupEntry(120406) || // last item added in 6.0.3 (19342) - !sItemExtendedCostStore.LookupEntry(5491) ) // last item extended cost added in 6.0.3 (19342) + if (!sItemStore.LookupEntry(128706) || // last item added in 6.2.0 (20216) + !sItemExtendedCostStore.LookupEntry(5923) ) // last item extended cost added in 6.2.0 (20216) { TC_LOG_ERROR("misc", "You have _outdated_ DB2 files. Please extract correct versions from current using client."); exit(1); @@ -446,6 +576,20 @@ char const* DB2Manager::GetBroadcastTextValue(BroadcastTextEntry const* broadcas return broadcastText->MaleText->Str[DEFAULT_LOCALE]; } +CharStartOutfitEntry const* DB2Manager::GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const +{ + auto itr = _charStartOutfits.find(race | (class_ << 8) | (gender << 16)); + if (itr == _charStartOutfits.end()) + return nullptr; + + return itr->second; +} + +uint32 DB2Manager::GetPowerIndexByClass(uint32 powerType, uint32 classId) const +{ + return _powersByClass[classId][powerType]; +} + uint32 DB2Manager::GetHeirloomItemLevel(uint32 curveId, uint32 level) const { // Assuming linear item level scaling for heirlooms @@ -512,6 +656,32 @@ uint32 DB2Manager::GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const return 0; } +std::vector<ItemSpecOverrideEntry const*> const* DB2Manager::GetItemSpecOverrides(uint32 itemId) const +{ + auto itr = _itemSpecOverrides.find(itemId); + if (itr != _itemSpecOverrides.end()) + return &itr->second; + + return nullptr; +} + +std::string DB2Manager::GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const +{ + ASSERT(gender < GENDER_NONE); + auto ritr = _nameGenData.find(race); + if (ritr == _nameGenData.end()) + return ""; + + if (ritr->second[gender].empty()) + return ""; + + LocalizedString* data = Trinity::Containers::SelectRandomContainerElement(ritr->second[gender])->Name; + if (*data->Str[locale] != '\0') + return data->Str[locale]; + + return data->Str[sWorld->GetDefaultDbcLocale()]; +} + MountEntry const* DB2Manager::GetMount(uint32 spellId) const { auto itr = _mountsBySpellId.find(spellId); @@ -526,6 +696,15 @@ MountEntry const* DB2Manager::GetMountById(uint32 id) const return sMountStore.LookupEntry(id); } +DB2Manager::MountTypeXCapabilitySet const* DB2Manager::GetMountCapabilities(uint32 mountType) const +{ + auto itr = _mountCapabilitiesByType.find(mountType); + if (itr != _mountCapabilitiesByType.end()) + return &itr->second; + + return nullptr; +} + std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItems(uint32 questPackageID) const { auto itr = _questPackages.find(questPackageID); @@ -535,6 +714,15 @@ std::vector<QuestPackageItemEntry const*> const* DB2Manager::GetQuestPackageItem return nullptr; } +uint32 DB2Manager::GetQuestUniqueBitFlag(uint32 questId) +{ + QuestV2Entry const* v2 = sQuestV2Store.LookupEntry(questId); + if (!v2) + return 0; + + return v2->UniqueBitFlag; +} + std::set<uint32> DB2Manager::GetPhasesForGroup(uint32 group) const { auto itr = _phasesByGroup.find(group); @@ -544,6 +732,15 @@ std::set<uint32> DB2Manager::GetPhasesForGroup(uint32 group) const return std::set<uint32>(); } +std::vector<SpecializationSpellsEntry const*> const* DB2Manager::GetSpecializationSpells(uint32 specId) const +{ + auto itr = _specializationSpellsBySpec.find(specId); + if (itr != _specializationSpellsBySpec.end()) + return &itr->second; + + return nullptr; +} + std::vector<SpellPowerEntry const*> DB2Manager::GetSpellPowers(uint32 spellId, Difficulty difficulty /*= DIFFICULTY_NONE*/, bool* hasDifficultyPowers /*= nullptr*/) const { std::vector<SpellPowerEntry const*> powers; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index a79b3d1c1fa..50583d487f1 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -21,48 +21,87 @@ #include "DB2Store.h" #include "DB2Structure.h" #include "SharedDefines.h" +#include <array> -extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore; -extern DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore; -extern DB2Storage<GameObjectsEntry> sGameObjectsStore; -extern DB2Storage<GarrAbilityEntry> sGarrAbilityStore; -extern DB2Storage<GarrBuildingEntry> sGarrBuildingStore; -extern DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore; -extern DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore; -extern DB2Storage<GarrFollowerEntry> sGarrFollowerStore; -extern DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore; -extern DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore; -extern DB2Storage<GarrPlotEntry> sGarrPlotStore; -extern DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore; -extern DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore; -extern DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore; -extern DB2Storage<HolidaysEntry> sHolidaysStore; -extern DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore; -extern DB2Storage<ItemEffectEntry> sItemEffectStore; -extern DB2Storage<ItemEntry> sItemStore; -extern DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore; -extern DB2Storage<ItemSparseEntry> sItemSparseStore; -extern DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore; -extern DB2Storage<SoundEntriesEntry> sSoundEntriesStore; -extern DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore; -extern DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore; -extern DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore; -extern DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore; -extern DB2Storage<SpellMiscEntry> sSpellMiscStore; -extern DB2Storage<SpellPowerEntry> sSpellPowerStore; -extern DB2Storage<SpellReagentsEntry> sSpellReagentsStore; -extern DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore; -extern DB2Storage<SpellTotemsEntry> sSpellTotemsStore; -extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore; -extern DB2Storage<TaxiPathEntry> sTaxiPathStore; - -extern TaxiMask sTaxiNodesMask; -extern TaxiMask sOldContinentsNodesMask; -extern TaxiMask sHordeTaxiNodesMask; -extern TaxiMask sAllianceTaxiNodesMask; -extern TaxiMask sDeathKnightTaxiNodesMask; -extern TaxiPathSetBySource sTaxiPathSetBySource; -extern TaxiPathNodesByPath sTaxiPathNodesByPath; +extern DB2Storage<AuctionHouseEntry> sAuctionHouseStore; +extern DB2Storage<BarberShopStyleEntry> sBarberShopStyleStore; +extern DB2Storage<BroadcastTextEntry> sBroadcastTextStore; +extern DB2Storage<CharStartOutfitEntry> sCharStartOutfitStore; +extern DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore; +extern DB2Storage<CreatureDisplayInfoEntry> sCreatureDisplayInfoStore; +extern DB2Storage<CreatureTypeEntry> sCreatureTypeStore; +extern DB2Storage<CurrencyTypesEntry> sCurrencyTypesStore; +extern DB2Storage<DestructibleModelDataEntry> sDestructibleModelDataStore; +extern DB2Storage<DurabilityQualityEntry> sDurabilityQualityStore; +extern DB2Storage<GameObjectsEntry> sGameObjectsStore; +extern DB2Storage<GameTablesEntry> sGameTablesStore; +extern DB2Storage<GarrAbilityEntry> sGarrAbilityStore; +extern DB2Storage<GarrBuildingEntry> sGarrBuildingStore; +extern DB2Storage<GarrBuildingPlotInstEntry> sGarrBuildingPlotInstStore; +extern DB2Storage<GarrClassSpecEntry> sGarrClassSpecStore; +extern DB2Storage<GarrFollowerEntry> sGarrFollowerStore; +extern DB2Storage<GarrFollowerXAbilityEntry> sGarrFollowerXAbilityStore; +extern DB2Storage<GarrPlotBuildingEntry> sGarrPlotBuildingStore; +extern DB2Storage<GarrPlotEntry> sGarrPlotStore; +extern DB2Storage<GarrPlotInstanceEntry> sGarrPlotInstanceStore; +extern DB2Storage<GarrSiteLevelEntry> sGarrSiteLevelStore; +extern DB2Storage<GarrSiteLevelPlotInstEntry> sGarrSiteLevelPlotInstStore; +extern DB2Storage<GlyphSlotEntry> sGlyphSlotStore; +extern DB2Storage<GuildPerkSpellsEntry> sGuildPerkSpellsStore; +extern DB2Storage<HolidaysEntry> sHolidaysStore; +extern DB2Storage<ImportPriceArmorEntry> sImportPriceArmorStore; +extern DB2Storage<ImportPriceQualityEntry> sImportPriceQualityStore; +extern DB2Storage<ImportPriceShieldEntry> sImportPriceShieldStore; +extern DB2Storage<ImportPriceWeaponEntry> sImportPriceWeaponStore; +extern DB2Storage<ItemClassEntry> sItemClassStore; +extern DB2Storage<ItemCurrencyCostEntry> sItemCurrencyCostStore; +extern DB2Storage<ItemDisenchantLootEntry> sItemDisenchantLootStore; +extern DB2Storage<ItemEffectEntry> sItemEffectStore; +extern DB2Storage<ItemEntry> sItemStore; +extern DB2Storage<ItemExtendedCostEntry> sItemExtendedCostStore; +extern DB2Storage<ItemLimitCategoryEntry> sItemLimitCategoryStore; +extern DB2Storage<ItemPriceBaseEntry> sItemPriceBaseStore; +extern DB2Storage<ItemRandomPropertiesEntry> sItemRandomPropertiesStore; +extern DB2Storage<ItemRandomSuffixEntry> sItemRandomSuffixStore; +extern DB2Storage<ItemSparseEntry> sItemSparseStore; +extern DB2Storage<ItemSpecEntry> sItemSpecStore; +extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore; +extern DB2Storage<MailTemplateEntry> sMailTemplateStore; +extern DB2Storage<MountCapabilityEntry> sMountCapabilityStore; +extern DB2Storage<OverrideSpellDataEntry> sOverrideSpellDataStore; +extern DB2Storage<QuestMoneyRewardEntry> sQuestMoneyRewardStore; +extern DB2Storage<QuestSortEntry> sQuestSortStore; +extern DB2Storage<QuestXPEntry> sQuestXPStore; +extern DB2Storage<ScalingStatDistributionEntry> sScalingStatDistributionStore; +extern DB2Storage<SoundEntriesEntry> sSoundEntriesStore; +extern DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore; +extern DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore; +extern DB2Storage<SpellCastingRequirementsEntry> sSpellCastingRequirementsStore; +extern DB2Storage<SpellClassOptionsEntry> sSpellClassOptionsStore; +extern DB2Storage<SpellDurationEntry> sSpellDurationStore; +extern DB2Storage<SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore; +extern DB2Storage<SpellLearnSpellEntry> sSpellLearnSpellStore; +extern DB2Storage<SpellMiscEntry> sSpellMiscStore; +extern DB2Storage<SpellPowerEntry> sSpellPowerStore; +extern DB2Storage<SpellRadiusEntry> sSpellRadiusStore; +extern DB2Storage<SpellRangeEntry> sSpellRangeStore; +extern DB2Storage<SpellReagentsEntry> sSpellReagentsStore; +extern DB2Storage<SpellRuneCostEntry> sSpellRuneCostStore; +extern DB2Storage<SpellTotemsEntry> sSpellTotemsStore; +extern DB2Storage<SpellXSpellVisualEntry> sSpellXSpellVisualStore; +extern DB2Storage<TaxiNodesEntry> sTaxiNodesStore; +extern DB2Storage<TaxiPathEntry> sTaxiPathStore; +extern DB2Storage<TotemCategoryEntry> sTotemCategoryStore; +extern DB2Storage<UnitPowerBarEntry> sUnitPowerBarStore; +extern DB2Storage<WorldMapOverlayEntry> sWorldMapOverlayStore; + +extern TaxiMask sTaxiNodesMask; +extern TaxiMask sOldContinentsNodesMask; +extern TaxiMask sHordeTaxiNodesMask; +extern TaxiMask sAllianceTaxiNodesMask; +extern TaxiMask sDeathKnightTaxiNodesMask; +extern TaxiPathSetBySource sTaxiPathSetBySource; +extern TaxiPathNodesByPath sTaxiPathNodesByPath; struct HotfixNotify { @@ -76,17 +115,33 @@ typedef std::vector<HotfixNotify> HotfixData; class DB2Manager { public: + struct MountTypeXCapabilityComparator : public std::binary_function<MountTypeXCapabilityEntry const*, MountTypeXCapabilityEntry const*, bool> + { + bool operator()(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right) const + { + if (left->MountTypeID == right->MountTypeID) + return left->OrderIndex > right->OrderIndex; + return left->ID < right->ID; + } + }; + typedef std::map<uint32 /*hash*/, DB2StorageBase*> StorageMap; typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer; + typedef std::unordered_map<uint32, CharStartOutfitEntry const*> CharStartOutfitContainer; typedef std::map<uint32 /*curveID*/, std::map<uint32/*index*/, CurvePointEntry const*, std::greater<uint32>>> HeirloomCurvesContainer; 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 /*itemId | appearanceMod << 24*/, uint32> ItemDisplayIdContainer; typedef std::unordered_map<uint32, std::set<ItemBonusTreeNodeEntry const*>> ItemBonusTreeContainer; + typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer; typedef std::unordered_map<uint32, MountEntry const*> MountContainer; + typedef std::set<MountTypeXCapabilityEntry const*, MountTypeXCapabilityComparator> MountTypeXCapabilitySet; + typedef std::unordered_map<uint32, MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer; + typedef std::unordered_map<uint32, std::array<std::vector<NameGenEntry const*>, 2>> NameGenContainer; typedef std::unordered_map<uint32, std::set<uint32>> PhaseGroupContainer; typedef std::unordered_map<uint32, std::vector<QuestPackageItemEntry const*>> QuestPackageItemContainer; + typedef std::unordered_map<uint32, std::vector<SpecializationSpellsEntry const*>> SpecializationSpellsContainer; typedef std::unordered_map<uint32, std::vector<SpellPowerEntry const*>> SpellPowerContainer; typedef std::unordered_map<uint32, std::unordered_map<uint32, std::vector<SpellPowerEntry const*>>> SpellPowerDifficultyContainer; @@ -105,14 +160,21 @@ public: std::vector<uint32> GetAreasForGroup(uint32 areaGroupId) const; static char const* GetBroadcastTextValue(BroadcastTextEntry const* broadcastText, LocaleConstant locale = DEFAULT_LOCALE, uint8 gender = GENDER_MALE, bool forceGender = false); + CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) const; + uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) const; uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; ItemBonusList GetItemBonusList(uint32 bonusListId) const; std::set<uint32> GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const; uint32 GetItemDisplayId(uint32 itemId, uint32 appearanceModId) const; + std::vector<ItemSpecOverrideEntry const*> const* GetItemSpecOverrides(uint32 itemId) const; + std::string GetNameGenEntry(uint8 race, uint8 gender, LocaleConstant locale) const; MountEntry const* GetMount(uint32 spellId) const; MountEntry const* GetMountById(uint32 id) const; + MountTypeXCapabilitySet const* GetMountCapabilities(uint32 mountType) const; std::vector<QuestPackageItemEntry const*> const* GetQuestPackageItems(uint32 questPackageID) const; + uint32 GetQuestUniqueBitFlag(uint32 questId); std::set<uint32> GetPhasesForGroup(uint32 group) const; + std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) const; std::vector<SpellPowerEntry const*> GetSpellPowers(uint32 spellId, Difficulty difficulty = DIFFICULTY_NONE, bool* hasDifficultyPowers = nullptr) const; private: @@ -120,14 +182,20 @@ private: HotfixData _hotfixData; AreaGroupMemberContainer _areaGroupMembers; + CharStartOutfitContainer _charStartOutfits; + uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; HeirloomCurvesContainer _heirloomCurvePoints; ItemBonusListContainer _itemBonusLists; ItemBonusTreeContainer _itemBonusTrees; ItemDisplayIdContainer _itemDisplayIDs; ItemToBonusTreeContainer _itemToBonusTree; + ItemSpecOverridesContainer _itemSpecOverrides; MountContainer _mountsBySpellId; + MountCapabilitiesByTypeContainer _mountCapabilitiesByType; + NameGenContainer _nameGenData; PhaseGroupContainer _phasesByGroup; QuestPackageItemContainer _questPackages; + SpecializationSpellsContainer _specializationSpellsBySpec; SpellPowerContainer _spellPowers; SpellPowerDifficultyContainer _spellPowerDifficulties; }; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index 80c79a94b96..c84996a524e 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -24,26 +24,41 @@ #pragma pack(push, 1) -#define MAX_BROADCAST_TEXT_EMOTES 3 -#define MAX_HOLIDAY_DURATIONS 10 -#define MAX_HOLIDAY_DATES 16 -#define MAX_HOLIDAY_FLAGS 10 -#define MAX_ITEM_PROTO_FLAGS 3 -#define MAX_ITEM_PROTO_SOCKETS 3 -#define MAX_ITEM_PROTO_STATS 10 - struct AreaGroupEntry { - uint32 ID; // 0 + uint32 ID; // 0 }; struct AreaGroupMemberEntry { - uint32 ID; // 0 - uint32 AreaGroupID; // 1 - uint32 AreaID; // 2 + uint32 ID; // 0 + uint32 AreaGroupID; // 1 + uint32 AreaID; // 2 +}; + +struct AuctionHouseEntry +{ + uint32 ID; // 0 + uint32 FactionID; // 1 id of faction.dbc for player factions associated with city + uint32 DepositRate; // 2 1/3 from real + uint32 ConsignmentRate; // 3 + LocalizedString* Name; // 4 +}; + +struct BarberShopStyleEntry +{ + uint32 ID; // 0 + uint32 Type; // 1 value 0 -> hair, value 2 -> facialhair + LocalizedString* DisplayName; // 2 + LocalizedString* Description; // 3 + float CostModifier; // 4 + uint32 Race; // 5 + uint32 Sex; // 6 + uint32 Data; // 7 (real ID to hair/facial hair) }; +#define MAX_BROADCAST_TEXT_EMOTES 3 + struct BroadcastTextEntry { uint32 ID; @@ -57,19 +72,78 @@ struct BroadcastTextEntry uint32 Type; }; +#define MAX_OUTFIT_ITEMS 24 + +struct CharStartOutfitEntry +{ + uint32 ID; // 0 + uint8 RaceID; // 1 + uint8 ClassID; // 2 + uint8 GenderID; // 3 + uint8 OutfitID; // 4 + int32 ItemID[MAX_OUTFIT_ITEMS]; // 5-28 + uint32 PetDisplayID; // 29 Pet Model ID for starting pet + uint32 PetFamilyID; // 30 Pet Family Entry for starting pet +}; + +struct ChrClassesXPowerTypesEntry +{ + uint32 ID; // 0 + uint32 ClassID; // 1 + uint32 PowerType; // 2 +}; + +struct CinematicSequencesEntry +{ + uint32 ID; // 0 + uint32 SoundID; // 1 + uint32 Camera[8]; // 2-9 +}; + +struct CreatureDisplayInfoEntry +{ + uint32 ID; // 0 + uint32 ModelID; // 1 + uint32 SoundID; // 2 + uint32 ExtendedDisplayInfoID; // 3 + float CreatureModelScale; // 4 + float Unknown620; // 5 + uint32 CreatureModelAlpha; // 6 + LocalizedString* TextureVariation[3]; // 7-9 + LocalizedString* PortraitTextureName; // 10 + uint32 PortraitCreatureDisplayInfoID; // 11 + uint32 SizeClass; // 12 + uint32 BloodID; // 13 + uint32 NPCSoundID; // 14 + uint32 ParticleColorID; // 15 + uint32 CreatureGeosetData; // 16 + uint32 ObjectEffectPackageID; // 17 + uint32 AnimReplacementSetID; // 18 + uint32 Flags; // 19 + int32 Gender; // 20 + uint32 StateSpellVisualKitID; // 21 +}; + +struct CreatureTypeEntry +{ + uint32 ID; // 0 + LocalizedString* Name; // 1 + uint32 Flags; // 2 no exp? critters, non-combat pets, gas cloud. +}; + struct CurrencyTypesEntry { - uint32 ID; // 0 - uint32 CategoryID; // 1 - LocalizedString* Name_lang; // 2 + uint32 ID; // 0 + uint32 CategoryID; // 1 + LocalizedString* Name; // 2 LocalizedString* InventoryIcon[2]; // 3-4 - uint32 SpellWeight; // 5 - uint32 SpellCategory; // 6 - uint32 MaxQty; // 7 - uint32 MaxEarnablePerWeek; // 8 - uint32 Flags; // 9 - uint32 Quality; // 10 - LocalizedString* Description_lang; // 11 + uint32 SpellWeight; // 5 + uint32 SpellCategory; // 6 + uint32 MaxQty; // 7 + uint32 MaxEarnablePerWeek; // 8 + uint32 Flags; // 9 + uint32 Quality; // 10 + LocalizedString* Description; // 11 }; struct CurvePointEntry @@ -81,6 +155,52 @@ struct CurvePointEntry float Y; // 4 }; +struct DestructibleModelDataEntry +{ + uint32 ID; // 0 + struct + { + uint32 DisplayID; // 1 + uint32 ImpactEffectDoodadSet; // 2 + uint32 AmbientDoodadSet; // 3 + uint32 NameSet; // 4 + } StateDamaged; + struct + { + uint32 DisplayID; // 5 + uint32 DestructionDoodadSet; // 6 + uint32 ImpactEffectDoodadSet; // 7 + uint32 AmbientDoodadSet; // 8 + uint32 NameSet; // 9 + } StateDestroyed; + struct + { + uint32 DisplayID; // 10 + uint32 DestructionDoodadSet; // 11 + uint32 ImpactEffectDoodadSet; // 12 + uint32 AmbientDoodadSet; // 13 + uint32 NameSet; // 14 + } StateRebuilding; + struct + { + uint32 DisplayID; // 15 + uint32 InitDoodadSet; // 16 + uint32 AmbientDoodadSet; // 17 + uint32 NameSet; // 18 + } StateSmoke; + uint32 EjectDirection; // 19 + uint32 RepairGroundFx; // 20 + uint32 DoNotHighlight; // 21 + uint32 HealEffect; // 22 + uint32 HealEffectSpeed; // 23 +}; + +struct DurabilityQualityEntry +{ + uint32 ID; // 0 + float QualityMod; // 1 +}; + struct GameObjectsEntry { uint32 ID; // 0 @@ -100,6 +220,14 @@ struct GameObjectsEntry LocalizedString* Name; // 23 }; +struct GameTablesEntry +{ + uint32 ID; // 0 + LocalizedString* Name; // 1 + uint32 NumRows; // 2 + uint32 NumColumns; // 3 +}; + struct GarrAbilityEntry { uint32 ID; // 0 @@ -109,6 +237,7 @@ struct GarrAbilityEntry uint32 IconFileDataID; // 4 uint32 OtherFactionGarrAbilityID; // 5 uint32 GarrAbilityCategoryID; // 6 + uint32 FollowerTypeID; // 7 }; struct GarrBuildingEntry @@ -161,26 +290,29 @@ struct GarrClassSpecEntry struct GarrFollowerEntry { uint32 ID; // 0 - uint32 HordeCreatureID; // 1 - uint32 AllianceCreatureID; // 2 - uint32 HordeUiAnimRaceInfoID; // 3 - uint32 AllianceUiAnimRaceInfoID; // 4 - uint32 Quality; // 5 - uint32 HordeGarrClassSpecID; // 6 - uint32 AllianceGarrClassSpecID; // 7 - uint32 HordeGarrFollItemSetID; // 8 - uint32 AllianceGarrFollItemSetID; // 9 - uint32 Level; // 10 - uint32 ItemLevelWeapon; // 11 - uint32 ItemLevelArmor; // 12 - uint32 Unknown1; // 13 - uint32 Flags; // 14 - LocalizedString* HordeSourceText; // 15 - LocalizedString* AllianceSourceText; // 16 - int32 Unknown2; // 17 - int32 Unknown3; // 18 - uint32 HordePortraitIconID; // 19 - uint32 AlliancePortraitIconID; // 20 + uint32 FollowerTypeID; // 1 + uint32 HordeCreatureID; // 2 + uint32 AllianceCreatureID; // 3 + uint32 HordeUiAnimRaceInfoID; // 4 + uint32 AllianceUiAnimRaceInfoID; // 5 + uint32 Quality; // 6 + uint32 HordeGarrClassSpecID; // 7 + uint32 AllianceGarrClassSpecID; // 8 + uint32 HordeGarrFollItemSetID; // 9 + uint32 AllianceGarrFollItemSetID; // 10 + uint32 Level; // 11 + uint32 ItemLevelWeapon; // 12 + uint32 ItemLevelArmor; // 13 + uint32 Unknown1; // 14 + uint32 Flags; // 15 + LocalizedString* HordeSourceText; // 16 + LocalizedString* AllianceSourceText; // 17 + int32 Unknown2; // 18 + int32 Unknown3; // 19 + uint32 HordePortraitIconID; // 20 + uint32 AlliancePortraitIconID; // 21 + uint32 HordeListPortraitTextureKitID; // 22 + uint32 AllianceListPortraitTextureKitID; // 23 }; struct GarrFollowerXAbilityEntry @@ -241,77 +373,142 @@ struct GarrSiteLevelPlotInstEntry uint32 Unknown; // 5 }; +struct GlyphSlotEntry +{ + uint32 ID; // 0 + uint32 Type; // 1 + uint32 Tooltip; // 2 +}; + +struct GuildPerkSpellsEntry +{ + uint32 ID; // 0 + uint32 GuildLevel; // 1 + uint32 SpellID; // 2 +}; + +#define MAX_HOLIDAY_DURATIONS 10 +#define MAX_HOLIDAY_DATES 16 +#define MAX_HOLIDAY_FLAGS 10 + struct HolidaysEntry { - uint32 ID; // 0 - uint32 Duration[MAX_HOLIDAY_DURATIONS]; // 1-10 - uint32 Date[MAX_HOLIDAY_DATES]; // 11-26 (dates in unix time starting at January, 1, 2000) - uint32 Region; // 27 - uint32 Looping; // 28 - uint32 CalendarFlags[MAX_HOLIDAY_FLAGS]; // 29-38 - uint32 HolidayNameID; // 39 HolidayNames.dbc - uint32 HolidayDescriptionID; // 40 HolidayDescriptions.dbc + uint32 ID; // 0 + uint32 Duration[MAX_HOLIDAY_DURATIONS]; // 1-10 + uint32 Date[MAX_HOLIDAY_DATES]; // 11-26 (dates in unix time starting at January, 1, 2000) + uint32 Region; // 27 + uint32 Looping; // 28 + uint32 CalendarFlags[MAX_HOLIDAY_FLAGS]; // 29-38 + uint32 HolidayNameID; // 39 HolidayNames.dbc + uint32 HolidayDescriptionID; // 40 HolidayDescriptions.dbc LocalizedString* TextureFilename; // 41 - uint32 Priority; // 42 - uint32 CalendarFilterType; // 43 (-1 = Fishing Contest, 0 = Unk, 1 = Darkmoon Festival, 2 = Yearly holiday) - uint32 Flags; // 44 (0 = Darkmoon Faire, Fishing Contest and Wotlk Launch, rest is 1) + uint32 Priority; // 42 + uint32 CalendarFilterType; // 43 (-1 = Fishing Contest, 0 = Unk, 1 = Darkmoon Festival, 2 = Yearly holiday) + uint32 Flags; // 44 (0 = Darkmoon Faire, Fishing Contest and Wotlk Launch, rest is 1) +}; + +struct ImportPriceArmorEntry +{ + uint32 ID; // 0 + float ClothFactor; // 1 + float LeatherFactor; // 2 + float MailFactor; // 3 + float PlateFactor; // 4 +}; + +struct ImportPriceQualityEntry +{ + uint32 ID; // 0 + float Factor; // 1 +}; + +struct ImportPriceShieldEntry +{ + uint32 ID; // 0 + float Factor; // 1 +}; + +struct ImportPriceWeaponEntry +{ + uint32 ID; // 0 + float Factor; // 1 }; struct ItemAppearanceEntry { - uint32 ID; // 0 (reference to ItemModifiedAppearance.db2?) - uint32 DisplayID; // 1 - uint32 IconFileDataID; // 2 + uint32 ID; // 0 + uint32 DisplayID; // 1 + uint32 IconFileDataID; // 2 }; struct ItemBonusEntry { - uint32 ID; // 0 - uint32 BonusListID; // 1 - uint32 Type; // 2 - int32 Value[2]; // 3-4 - uint32 Index; // 5 + uint32 ID; // 0 + uint32 BonusListID; // 1 + uint32 Type; // 2 + int32 Value[2]; // 3-4 + uint32 Index; // 5 }; struct ItemBonusTreeNodeEntry { - uint32 ID; // 0 - uint32 BonusTreeID; // 1 - uint32 BonusTreeModID; // 2 - uint32 SubTreeID; // 3 - uint32 BonusListID; // 4 + uint32 ID; // 0 + uint32 BonusTreeID; // 1 + uint32 BonusTreeModID; // 2 + uint32 SubTreeID; // 3 + uint32 BonusListID; // 4 +}; + +struct ItemClassEntry +{ + uint32 ID; // 0 + uint32 Flags; // 1 + float PriceMod; // 2 + LocalizedString* Name; // 3 }; struct ItemCurrencyCostEntry { - uint32 ID; // 0 - uint32 ItemId; // 1 + uint32 ID; // 0 + uint32 ItemId; // 1 +}; + +struct ItemDisenchantLootEntry +{ + uint32 ID; // 0 + uint32 ItemClass; // 1 + int32 ItemSubClass; // 2 + uint32 ItemQuality; // 3 + uint32 MinItemLevel; // 4 + uint32 MaxItemLevel; // 5 + uint32 RequiredDisenchantSkill; // 6 }; struct ItemEffectEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 OrderIndex; // 2 - uint32 SpellID; // 3 - uint32 Trigger; // 4 - int32 Charges; // 5 - int32 Cooldown; // 6 - uint32 Category; // 7 - int32 CategoryCooldown; // 8 + uint32 ID; // 0 + uint32 ItemID; // 1 + uint32 OrderIndex; // 2 + uint32 SpellID; // 3 + uint32 Trigger; // 4 + int32 Charges; // 5 + int32 Cooldown; // 6 + uint32 Category; // 7 + int32 CategoryCooldown; // 8 + uint32 ChrSpecializationID; // 9 }; struct ItemEntry { - uint32 ID; // 0 - uint32 Class; // 1 - uint32 SubClass; // 2 - int32 SoundOverrideSubclass; // 3 - int32 Material; // 4 - uint32 InventoryType; // 5 - uint32 Sheath; // 6 - uint32 FileDataID; // 7 - uint32 GroupSoundsID; // 8 + uint32 ID; // 0 + uint32 Class; // 1 + uint32 SubClass; // 2 + int32 SoundOverrideSubclass; // 3 + int32 Material; // 4 + uint32 InventoryType; // 5 + uint32 Sheath; // 6 + uint32 FileDataID; // 7 + uint32 GroupSoundsID; // 8 }; #define MAX_ITEM_EXT_COST_ITEMS 5 @@ -319,110 +516,173 @@ struct ItemEntry struct ItemExtendedCostEntry { - uint32 ID; // 0 extended-cost entry id - uint32 RequiredArenaSlot; // 3 arena slot restrictions (min slot value) - uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // 3-6 required item id - uint32 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // 7-11 required count of 1st item - uint32 RequiredPersonalArenaRating; // 12 required personal arena rating - uint32 ItemPurchaseGroup; // 13 - uint32 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES]; // 14-18 required curency id - uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES];// 19-23 required curency count - uint32 RequiredFactionId; // 24 - uint32 RequiredFactionStanding; // 25 - uint32 RequirementFlags; // 26 - uint32 RequiredAchievement; // 27 - uint32 RequiredMoney; // 28 + uint32 ID; // 0 extended-cost entry id + uint32 RequiredArenaSlot; // 3 arena slot restrictions (min slot value) + uint32 RequiredItem[MAX_ITEM_EXT_COST_ITEMS]; // 3-6 required item id + uint32 RequiredItemCount[MAX_ITEM_EXT_COST_ITEMS]; // 7-11 required count of 1st item + uint32 RequiredPersonalArenaRating; // 12 required personal arena rating + uint32 ItemPurchaseGroup; // 13 + uint32 RequiredCurrency[MAX_ITEM_EXT_COST_CURRENCIES]; // 14-18 required curency id + uint32 RequiredCurrencyCount[MAX_ITEM_EXT_COST_CURRENCIES]; // 19-23 required curency count + uint32 RequiredFactionId; // 24 + uint32 RequiredFactionStanding; // 25 + uint32 RequirementFlags; // 26 + uint32 RequiredAchievement; // 27 + uint32 RequiredMoney; // 28 +}; + +struct ItemLimitCategoryEntry +{ + uint32 ID; // 0 + LocalizedString* Name; // 1 + uint32 Quantity; // 2 + uint32 Flags; // 3 }; struct ItemModifiedAppearanceEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 AppearanceModID; // 2 - uint32 AppearanceID; // 3 - uint32 IconFileDataID; // 4 - uint32 Index; // 5 + uint32 ID; // 0 + uint32 ItemID; // 1 + uint32 AppearanceModID; // 2 + uint32 AppearanceID; // 3 + uint32 IconFileDataID; // 4 + uint32 Index; // 5 +}; + +struct ItemPriceBaseEntry +{ + uint32 ID; // 0 + uint32 ItemLevel; // 1 Item level (1 - 1000) + float ArmorFactor; // 2 Price factor for armor + float WeaponFactor; // 3 Price factor for weapons }; +#define MAX_ITEM_RANDOM_PROPERTIES 5 + +struct ItemRandomPropertiesEntry +{ + uint32 ID; // 0 + LocalizedString* InternalName; // 1 + uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 2-6 + LocalizedString* Name; // 7 +}; + +struct ItemRandomSuffixEntry +{ + uint32 ID; // 0 + LocalizedString* Name; // 1 + LocalizedString* InternalName; // 2 + uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 3-7 + uint32 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES]; // 8-12 +}; + +#define MAX_ITEM_PROTO_FLAGS 3 +#define MAX_ITEM_PROTO_SOCKETS 3 +#define MAX_ITEM_PROTO_STATS 10 + struct ItemSparseEntry { - uint32 ID; // 0 - uint32 Quality; // 1 - uint32 Flags[MAX_ITEM_PROTO_FLAGS]; // 2-4 - float Unk1; // 5 - float Unk2; // 6 - uint32 BuyCount; // 7 - uint32 BuyPrice; // 8 - uint32 SellPrice; // 9 - uint32 InventoryType; // 10 - int32 AllowableClass; // 11 - int32 AllowableRace; // 12 - uint32 ItemLevel; // 13 - int32 RequiredLevel; // 14 - uint32 RequiredSkill; // 15 - uint32 RequiredSkillRank; // 16 - uint32 RequiredSpell; // 17 - uint32 RequiredHonorRank; // 18 - uint32 RequiredCityRank; // 19 - uint32 RequiredReputationFaction; // 20 - uint32 RequiredReputationRank; // 21 - uint32 MaxCount; // 22 - uint32 Stackable; // 23 - uint32 ContainerSlots; // 24 - int32 ItemStatType[MAX_ITEM_PROTO_STATS]; // 25 - 34 - int32 ItemStatValue[MAX_ITEM_PROTO_STATS]; // 35 - 44 - int32 ItemStatAllocation[MAX_ITEM_PROTO_STATS]; // 45 - 54 - float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]; // 55 - 64 - uint32 ScalingStatDistribution; // 65 - uint32 DamageType; // 66 - uint32 Delay; // 67 - float RangedModRange; // 68 - uint32 Bonding; // 69 + uint32 ID; // 0 + uint32 Quality; // 1 + uint32 Flags[MAX_ITEM_PROTO_FLAGS]; // 2-4 + float Unk1; // 5 + float Unk2; // 6 + uint32 BuyCount; // 7 + uint32 BuyPrice; // 8 + uint32 SellPrice; // 9 + uint32 InventoryType; // 10 + int32 AllowableClass; // 11 + int32 AllowableRace; // 12 + uint32 ItemLevel; // 13 + int32 RequiredLevel; // 14 + uint32 RequiredSkill; // 15 + uint32 RequiredSkillRank; // 16 + uint32 RequiredSpell; // 17 + uint32 RequiredHonorRank; // 18 + uint32 RequiredCityRank; // 19 + uint32 RequiredReputationFaction; // 20 + uint32 RequiredReputationRank; // 21 + uint32 MaxCount; // 22 + uint32 Stackable; // 23 + uint32 ContainerSlots; // 24 + int32 ItemStatType[MAX_ITEM_PROTO_STATS]; // 25 - 34 + int32 ItemStatValue[MAX_ITEM_PROTO_STATS]; // 35 - 44 + int32 ItemStatAllocation[MAX_ITEM_PROTO_STATS]; // 45 - 54 + float ItemStatSocketCostMultiplier[MAX_ITEM_PROTO_STATS]; // 55 - 64 + uint32 ScalingStatDistribution; // 65 + uint32 DamageType; // 66 + uint32 Delay; // 67 + float RangedModRange; // 68 + uint32 Bonding; // 69 LocalizedString* Name; // 70 LocalizedString* Name2; // 71 LocalizedString* Name3; // 72 LocalizedString* Name4; // 73 LocalizedString* Description; // 74 - uint32 PageText; // 75 - uint32 LanguageID; // 76 - uint32 PageMaterial; // 77 - uint32 StartQuest; // 78 - uint32 LockID; // 79 - int32 Material; // 80 - uint32 Sheath; // 81 - uint32 RandomProperty; // 82 - uint32 RandomSuffix; // 83 - uint32 ItemSet; // 84 - uint32 Area; // 85 - uint32 Map; // 86 - uint32 BagFamily; // 87 - uint32 TotemCategory; // 88 - uint32 SocketColor[MAX_ITEM_PROTO_SOCKETS]; // 89-91 - uint32 SocketBonus; // 92 - uint32 GemProperties; // 93 - float ArmorDamageModifier; // 94 - uint32 Duration; // 95 - uint32 ItemLimitCategory; // 96 - uint32 HolidayID; // 97 - float StatScalingFactor; // 98 - uint32 CurrencySubstitutionID; // 99 - uint32 CurrencySubstitutionCount; // 100 - uint32 ItemNameDescriptionID; // 101 + uint32 PageText; // 75 + uint32 LanguageID; // 76 + uint32 PageMaterial; // 77 + uint32 StartQuest; // 78 + uint32 LockID; // 79 + int32 Material; // 80 + uint32 Sheath; // 81 + uint32 RandomProperty; // 82 + uint32 RandomSuffix; // 83 + uint32 ItemSet; // 84 + uint32 Area; // 85 + uint32 Map; // 86 + uint32 BagFamily; // 87 + uint32 TotemCategory; // 88 + uint32 SocketColor[MAX_ITEM_PROTO_SOCKETS]; // 89-91 + uint32 SocketBonus; // 92 + uint32 GemProperties; // 93 + float ArmorDamageModifier; // 94 + uint32 Duration; // 95 + uint32 ItemLimitCategory; // 96 + uint32 HolidayID; // 97 + float StatScalingFactor; // 98 + uint32 CurrencySubstitutionID; // 99 + uint32 CurrencySubstitutionCount; // 100 + uint32 ItemNameDescriptionID; // 101 +}; + +struct ItemSpecEntry +{ + uint32 ID; // 0 + uint32 MinLevel; // 1 + uint32 MaxLevel; // 2 + uint32 ItemType; // 3 + uint32 PrimaryStat; // 4 + uint32 SecondaryStat; // 5 + uint32 SpecID; // 6 +}; + +struct ItemSpecOverrideEntry +{ + uint32 ID; // 0 + uint32 ItemID; // 1 + uint32 SpecID; // 2 }; struct ItemXBonusTreeEntry { - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 BonusTreeID; // 2 + uint32 ID; // 0 + uint32 ItemID; // 1 + uint32 BonusTreeID; // 2 }; #define KEYCHAIN_SIZE 32 struct KeyChainEntry { - uint32 Id; - uint8 Key[KEYCHAIN_SIZE]; + uint32 Id; + uint8 Key[KEYCHAIN_SIZE]; +}; + +struct MailTemplateEntry +{ + uint32 ID; // 0 + LocalizedString* Body; // 1 }; struct MountEntry @@ -439,164 +699,277 @@ struct MountEntry uint32 PlayerConditionId; }; +struct MountCapabilityEntry +{ + uint32 ID; // 0 + uint32 Flags; // 1 + uint32 RequiredRidingSkill; // 2 + uint32 RequiredArea; // 3 + uint32 RequiredAura; // 4 + uint32 RequiredSpell; // 5 + uint32 SpeedModSpell; // 6 + int32 RequiredMap; // 7 +}; + +struct MountTypeXCapabilityEntry +{ + uint32 ID; // 0 + uint32 MountTypeID; // 1 + uint32 OrderIndex; // 2 + uint32 MountCapabilityID; // 3 +}; + +struct NameGenEntry +{ + uint32 ID; // 0 + LocalizedString* Name; // 1 + uint32 Race; // 2 + uint32 Sex; // 3 +}; + #define MAX_OVERRIDE_SPELL 10 struct OverrideSpellDataEntry { - uint32 ID; // 0 - uint32 SpellID[MAX_OVERRIDE_SPELL]; // 1-10 - uint32 Flags; // 11 - uint32 PlayerActionbarFileDataID; // 12 + uint32 ID; // 0 + uint32 SpellID[MAX_OVERRIDE_SPELL]; // 1-10 + uint32 Flags; // 11 + uint32 PlayerActionbarFileDataID; // 12 }; struct PhaseXPhaseGroupEntry { - uint32 ID; - uint32 PhaseID; - uint32 PhaseGroupID; + uint32 ID; + uint32 PhaseID; + uint32 PhaseGroupID; +}; + +struct QuestMoneyRewardEntry +{ + uint32 Level; // 0 + uint32 Money[10]; // 1 }; struct QuestPackageItemEntry { - uint32 ID; // 0 - uint32 QuestPackageID; // 1 - uint32 ItemID; // 2 - uint32 ItemCount; // 3 - uint32 FilterType; // 4 + uint32 ID; // 0 + uint32 QuestPackageID; // 1 + uint32 ItemID; // 2 + uint32 ItemCount; // 3 + uint32 FilterType; // 4 +}; + +struct QuestSortEntry +{ + uint32 ID; // 0 + LocalizedString* SortName; // 1 +}; + +struct QuestV2Entry +{ + uint32 ID; // 0 + uint32 UniqueBitFlag; // 1 +}; + +struct QuestXPEntry +{ + uint32 ID; // 0 + uint32 Exp[10]; // 1 +}; + +struct ScalingStatDistributionEntry +{ + uint32 ID; // 0 + uint32 MinLevel; // 1 + uint32 MaxLevel; // 2 + uint32 ItemLevelCurveID; // 3 }; struct SoundEntriesEntry { - uint32 ID; // 0 - uint32 SoundType; // 1 + uint32 ID; // 0 + uint32 SoundType; // 1 LocalizedString* Name; // 2 - uint32 FileDataID[20]; // 3-22 - uint32 Freq[20]; // 23-42 - float VolumeFloat; // 43 - uint32 Flags; // 44 - float MinDistance; // 45 - float DistanceCutoff; // 46 - uint32 EAXDef; // 47 - uint32 SoundEntriesAdvancedID; // 48 - float VolumeVariationPlus; // 49 - float VolumeVariationMinus; // 50 - float PitchVariationPlus; // 51 - float PitchVariationMinus; // 52 - float PitchAdjust; // 53 - uint32 DialogType; // 54 - uint32 BusOverwriteID; // 55 + uint32 FileDataID[20]; // 3-22 + uint32 Freq[20]; // 23-42 + float VolumeFloat; // 43 + uint32 Flags; // 44 + float MinDistance; // 45 + float DistanceCutoff; // 46 + uint32 EAXDef; // 47 + uint32 SoundEntriesAdvancedID; // 48 + float VolumeVariationPlus; // 49 + float VolumeVariationMinus; // 50 + float PitchVariationPlus; // 51 + float PitchVariationMinus; // 52 + float PitchAdjust; // 53 + uint32 DialogType; // 54 + uint32 BusOverwriteID; // 55 +}; + +struct SpecializationSpellsEntry +{ + uint32 ID; // 0 + uint32 SpecID; // 1 + uint32 OrderIndex; // 2 + uint32 SpellID; // 3 + uint32 OverridesSpellID; // 4 + LocalizedString* Description; // 5 }; struct SpellAuraRestrictionsEntry { - uint32 ID; // 0 - uint32 CasterAuraState; // 1 - uint32 TargetAuraState; // 2 - uint32 ExcludeCasterAuraState; // 3 - uint32 ExcludeTargetAuraState; // 4 - uint32 CasterAuraSpell; // 5 - uint32 TargetAuraSpell; // 6 - uint32 ExcludeCasterAuraSpell; // 7 - uint32 ExcludeTargetAuraSpell; // 8 + uint32 ID; // 0 + uint32 CasterAuraState; // 1 + uint32 TargetAuraState; // 2 + uint32 ExcludeCasterAuraState; // 3 + uint32 ExcludeTargetAuraState; // 4 + uint32 CasterAuraSpell; // 5 + uint32 TargetAuraSpell; // 6 + uint32 ExcludeCasterAuraSpell; // 7 + uint32 ExcludeTargetAuraSpell; // 8 }; struct SpellCastingRequirementsEntry { - uint32 ID; // 0 - uint32 FacingCasterFlags; // 1 - uint32 MinFactionID; // 1 - uint32 MinReputation; // 3 - uint32 RequiredAreasID; // 4 - uint32 RequiredAuraVision; // 5 - uint32 RequiresSpellFocus; // 6 + uint32 ID; // 0 + uint32 FacingCasterFlags; // 1 + uint32 MinFactionID; // 1 + uint32 MinReputation; // 3 + uint32 RequiredAreasID; // 4 + uint32 RequiredAuraVision; // 5 + uint32 RequiresSpellFocus; // 6 +}; + +struct SpellCastTimesEntry +{ + uint32 ID; // 0 + int32 CastTime; // 1 + int32 CastTimePerLevel; // 2 + int32 MinCastTime; // 3 }; struct SpellClassOptionsEntry { - uint32 ID; // 0 - uint32 ModalNextSpell; // 1 - flag128 SpellClassMask; // 2 - uint32 SpellClassSet; // 3 + uint32 ID; // 0 + uint32 ModalNextSpell; // 1 + flag128 SpellClassMask; // 2-5 + uint32 SpellClassSet; // 6 +}; + +struct SpellDurationEntry +{ + uint32 ID; // 0 + int32 Duration[3]; // 1-3 +}; + +struct SpellItemEnchantmentConditionEntry +{ + uint32 ID; // 0 + uint8 LTOperandType[5]; // 1-2 + uint32 LTOperand[5]; // 2-6 + uint8 Operator[5]; // 7-8 + uint8 RTOperandType[5]; // 8-9 + uint32 RTOperand[5]; // 10-14 + uint8 Logic[5]; // 15-16 }; struct SpellLearnSpellEntry { - uint32 ID; // 0 - uint32 LearnSpellID; // 1 - uint32 SpellID; // 2 - uint32 OverridesSpellID; // 3 + uint32 ID; // 0 + uint32 LearnSpellID; // 1 + uint32 SpellID; // 2 + uint32 OverridesSpellID; // 3 }; struct SpellMiscEntry { - uint32 ID; // 0 - uint32 Attributes; // 1 - uint32 AttributesEx; // 2 - uint32 AttributesExB; // 3 - uint32 AttributesExC; // 4 - uint32 AttributesExD; // 5 - uint32 AttributesExE; // 6 - uint32 AttributesExF; // 7 - uint32 AttributesExG; // 8 - uint32 AttributesExH; // 9 - uint32 AttributesExI; // 10 - uint32 AttributesExJ; // 11 - uint32 AttributesExK; // 12 - uint32 AttributesExL; // 13 - uint32 AttributesExM; // 14 - uint32 CastingTimeIndex; // 15 - uint32 DurationIndex; // 16 - uint32 RangeIndex; // 17 - float Speed; // 18 - uint32 SpellVisualID[2]; // 19-20 - uint32 SpellIconID; // 21 - uint32 ActiveIconID; // 22 - uint32 SchoolMask; // 23 - float MultistrikeSpeedMod; // 24 + uint32 ID; // 0 + uint32 Attributes; // 1 + uint32 AttributesEx; // 2 + uint32 AttributesExB; // 3 + uint32 AttributesExC; // 4 + uint32 AttributesExD; // 5 + uint32 AttributesExE; // 6 + uint32 AttributesExF; // 7 + uint32 AttributesExG; // 8 + uint32 AttributesExH; // 9 + uint32 AttributesExI; // 10 + uint32 AttributesExJ; // 11 + uint32 AttributesExK; // 12 + uint32 AttributesExL; // 13 + uint32 AttributesExM; // 14 + uint32 CastingTimeIndex; // 15 + uint32 DurationIndex; // 16 + uint32 RangeIndex; // 17 + float Speed; // 18 + uint32 SpellIconID; // 21 + uint32 ActiveIconID; // 22 + uint32 SchoolMask; // 23 + float MultistrikeSpeedMod; // 24 }; struct SpellPowerEntry { - uint32 ID; // 0 - uint32 SpellID; // 1 - uint32 PowerIndex; // 2 - uint32 PowerType; // 3 - uint32 ManaCost; // 4 - uint32 ManaCostPerLevel; // 5 - uint32 ManaCostPerSecond; // 6 - uint32 ManaCostAdditional; // 7 Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource + uint32 ID; // 0 + uint32 SpellID; // 1 + uint32 PowerIndex; // 2 + uint32 PowerType; // 3 + uint32 ManaCost; // 4 + uint32 ManaCostPerLevel; // 5 + uint32 ManaCostPerSecond; // 6 + uint32 ManaCostAdditional; // 7 Spell uses [ManaCost, ManaCost+ManaCostAdditional] power - affects tooltip parsing as multiplier on SpellEffectEntry::EffectPointsPerResource // only SPELL_EFFECT_WEAPON_DAMAGE_NOSCHOOL, SPELL_EFFECT_WEAPON_PERCENT_DAMAGE, SPELL_EFFECT_WEAPON_DAMAGE, SPELL_EFFECT_NORMALIZED_WEAPON_DMG - uint32 PowerDisplayID; // 8 - uint32 UnitPowerBarID; // 9 - float ManaCostPercentage; // 10 - float ManaCostPercentagePerSecond; // 11 - uint32 RequiredAura; // 12 - float HealthCostPercentage; // 13 + uint32 PowerDisplayID; // 8 + uint32 UnitPowerBarID; // 9 + float ManaCostPercentage; // 10 + float ManaCostPercentagePerSecond; // 11 + uint32 RequiredAura; // 12 + float HealthCostPercentage; // 13 }; struct SpellPowerDifficultyEntry { - uint32 SpellPowerID; // 0 - uint32 DifficultyID; // 1 - uint32 PowerIndex; // 2 + uint32 SpellPowerID; // 0 + uint32 DifficultyID; // 1 + uint32 PowerIndex; // 2 +}; + +struct SpellRadiusEntry +{ + uint32 ID; // 0 + float Radius; // 1 + float RadiusPerLevel; // 2 + float RadiusMin; // 3 + float RadiusMax; // 4 +}; + +struct SpellRangeEntry +{ + uint32 ID; // 0 + float MinRangeHostile; // 1 + float MinRangeFriend; // 2 + float MaxRangeHostile; // 3 + float MaxRangeFriend; // 4 + uint32 Flags; // 5 + LocalizedString* DisplayName; // 6 + LocalizedString* DisplayNameShort; // 7 }; #define MAX_SPELL_REAGENTS 8 struct SpellReagentsEntry { - uint32 ID; // 0 - int32 Reagent[MAX_SPELL_REAGENTS]; // 1-8 - uint32 ReagentCount[MAX_SPELL_REAGENTS]; // 9-16 - uint32 CurrencyID; // 17 - uint32 CurrencyCount; // 18 + uint32 ID; // 0 + int32 Reagent[MAX_SPELL_REAGENTS]; // 1-8 + uint32 ReagentCount[MAX_SPELL_REAGENTS]; // 9-16 }; struct SpellRuneCostEntry { - uint32 ID; // 0 - uint32 RuneCost[4]; // 1-4 (0=blood, 1=unholy, 2=frost, 3=death) - uint32 RunicPower; // 5 + uint32 ID; // 0 + uint32 RuneCost[4]; // 1-4 (0=blood, 1=unholy, 2=frost, 3=death) + uint32 RunicPower; // 5 bool NoRuneCost() const { return RuneCost[0] == 0 && RuneCost[1] == 0 && RuneCost[2] == 0 && RuneCost[3] == 0; } bool NoRunicPowerGain() const { return RunicPower == 0; } @@ -606,43 +979,122 @@ struct SpellRuneCostEntry struct SpellTotemsEntry { - uint32 ID; // 0 - uint32 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; // 1 - uint32 Totem[MAX_SPELL_TOTEMS]; // 2 + uint32 ID; // 0 + uint32 RequiredTotemCategoryID[MAX_SPELL_TOTEMS]; // 1 + uint32 Totem[MAX_SPELL_TOTEMS]; // 2 +}; + +struct SpellXSpellVisualEntry +{ + uint32 ID; // 0 + uint32 SpellID; // 1 + uint32 DifficultyID; // 2 + uint32 SpellVisualID[2]; // 3-4 + float Unk620; // 5 + uint32 PlayerConditionID; // 6 + uint32 Flags; // 7 }; struct TaxiNodesEntry { - uint32 ID; // 0 - uint32 MapID; // 1 - DBCPosition3D Pos; // 2-4 - LocalizedString* Name_lang; // 5 - uint32 MountCreatureID[2]; // 6-7 - uint32 ConditionID; // 8 - uint32 LearnableIndex; // 9 - some kind of index only for learnable nodes - uint32 Flags; // 10 - DBCPosition2D MapOffset; // 11-12 + uint32 ID; // 0 + uint32 MapID; // 1 + DBCPosition3D Pos; // 2-4 + LocalizedString* Name; // 5 + uint32 MountCreatureID[2]; // 6-7 + uint32 ConditionID; // 8 + uint32 LearnableIndex; // 9 - some kind of index only for learnable nodes + uint32 Flags; // 10 + DBCPosition2D MapOffset; // 11-12 }; struct TaxiPathEntry { - uint32 ID; // 0 - uint32 From; // 1 - uint32 To; // 2 - uint32 Cost; // 3 + uint32 ID; // 0 + uint32 From; // 1 + uint32 To; // 2 + uint32 Cost; // 3 }; struct TaxiPathNodeEntry { - uint32 ID; // 0 - uint32 PathID; // 1 - uint32 NodeIndex; // 2 - uint32 MapID; // 3 - DBCPosition3D Loc; // 4-6 - uint32 Flags; // 7 - uint32 Delay; // 8 - uint32 ArrivalEventID; // 9 - uint32 DepartureEventID; // 10 + uint32 ID; // 0 + uint32 PathID; // 1 + uint32 NodeIndex; // 2 + uint32 MapID; // 3 + DBCPosition3D Loc; // 4-6 + uint32 Flags; // 7 + uint32 Delay; // 8 + uint32 ArrivalEventID; // 9 + uint32 DepartureEventID; // 10 +}; + +struct TotemCategoryEntry +{ + uint32 ID; // 0 + LocalizedString* Name; // 1 + uint32 CategoryType; // 2 + uint32 CategoryMask; // 3 +}; + +struct TransportAnimationEntry +{ + uint32 ID; // 0 + uint32 TransportID; // 1 + uint32 TimeIndex; // 2 + DBCPosition3D Pos; // 3-5 + uint32 SequenceID; // 6 +}; + +struct TransportRotationEntry +{ + uint32 ID; // 0 + uint32 TransportID; // 1 + uint32 TimeIndex; // 2 + float X; // 3 + float Y; // 4 + float Z; // 5 + float W; // 6 +}; + +struct UnitPowerBarEntry +{ + uint32 ID; // 0 + uint32 MinPower; // 1 + uint32 MaxPower; // 2 + uint32 StartPower; // 3 + uint32 CenterPower; // 4 + float RegenerationPeace; // 5 + float RegenerationCombat; // 6 + uint32 BarType; // 7 + uint32 FileDataID[6]; // 8-13 + uint32 Color[6]; // 14-19 + uint32 Flags; // 20 + LocalizedString* Name; // 21 + LocalizedString* Cost; // 22 + LocalizedString* OutOfError; // 23 + LocalizedString* ToolTip; // 24 + float StartInset; // 25 + float EndInset; // 26 +}; + +#define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 + +struct WorldMapOverlayEntry +{ + uint32 ID; // 0 + uint32 MapAreaID; // 1 idx in WorldMapArea.dbc + uint32 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; // 2-5 + LocalizedString* TextureName; // 6 + uint32 TextureWidth; // 7 + uint32 TextureHeight; // 8 + uint32 OffsetX; // 9 + uint32 OffsetY; // 10 + uint32 HitRectTop; // 11 + uint32 HitRectLeft; // 12 + uint32 HitRectBottom; // 13 + uint32 HitRectRight; // 14 + uint32 PlayerConditionID; // 15 }; #pragma pack(pop) @@ -652,9 +1104,10 @@ struct TaxiPathBySourceAndDestination TaxiPathBySourceAndDestination() : ID(0), price(0) { } TaxiPathBySourceAndDestination(uint32 _id, uint32 _price) : ID(_id), price(_price) { } - uint32 ID; - uint32 price; + uint32 ID; + uint32 price; }; + typedef std::map<uint32, TaxiPathBySourceAndDestination> TaxiPathSetForSource; typedef std::map<uint32, TaxiPathSetForSource> TaxiPathSetBySource; @@ -669,7 +1122,7 @@ struct TaxiPathNodePtr typedef Path<TaxiPathNodePtr, TaxiPathNodeEntry const> TaxiPathNodeList; typedef std::vector<TaxiPathNodeList> TaxiPathNodesByPath; -#define TaxiMaskSize 201 +#define TaxiMaskSize 215 typedef uint8 TaxiMask[TaxiMaskSize]; #endif diff --git a/src/server/game/DataStores/DB2fmt.h b/src/server/game/DataStores/DB2fmt.h index 7c915b37326..a7b1e3e7952 100644 --- a/src/server/game/DataStores/DB2fmt.h +++ b/src/server/game/DataStores/DB2fmt.h @@ -20,50 +20,95 @@ char const AreaGroupFormat[] = "n"; char const AreaGroupMemberFormat[] = "nii"; +char const AuctionHouseFormat[] = "niiis"; +char const BarberShopStyleFormat[] = "nissfiii"; char const BroadcastTextFormat[] = "nissiiiiiiiii"; +char const CharStartOutfitFormat[] = "nbbbbiiiiiiiiiiiiiiiiiiiiiiiiii"; +char const ChrClassesXPowerTypesFormat[] = "nii"; +char const CinematicSequencesFormat[] = "niiiiiiiii"; +char const CreatureDisplayInfoFormat[] = "niiiffissssiiiiiiiiiii"; +char const CreatureTypeFormat[] = "nsi"; char const CurrencyTypesFormat[] = "nisssiiiiiis"; char const CurvePointFormat[] = "niiff"; +char const DestructibleModelDataFormat[] = "niiiiiiiiiiiiiiiiiiiiiii"; +char const DurabilityQualityFormat[] = "nf"; char const GameObjectsFormat[] = "niiffffffffiiiiiiiiiiiis"; -char const GarrAbilityFormat[] = "nissiii"; +char const GameTablesFormat[] = "nsii"; +char const GarrAbilityFormat[] = "nissiiii"; char const GarrBuildingFormat[] = "niiiiissssiiiiiiiiiiiiii"; char const GarrBuildingPlotInstFormat[] = "niiiff"; char const GarrClassSpecFormat[] = "nsssii"; -char const GarrFollowerFormat[] = "niiiiiiiiiiiiiissiiii"; +char const GarrFollowerFormat[] = "niiiiiiiiiiiiiiissiiiiii"; char const GarrFollowerXAbilityFormat[] = "niii"; char const GarrPlotBuildingFormat[] = "nii"; char const GarrPlotFormat[] = "niiisiiii"; char const GarrPlotInstanceFormat[] = "nis"; char const GarrSiteLevelFormat[] = "niiiiffiiii"; char const GarrSiteLevelPlotInstFormat[] = "niiffi"; +char const GlyphSlotFormat[] = "nii"; +char const GuildPerkSpellsFormat[] = "nii"; char const HolidaysEntryFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiisiii"; -char const ItemFormat[] = "niiiiiiii"; +char const ImportPriceArmorFormat[] = "nffff"; +char const ImportPriceQualityFormat[] = "nf"; +char const ImportPriceShieldFormat[] = "nf"; +char const ImportPriceWeaponFormat[] = "nf"; char const ItemAppearanceFormat[] = "nii"; char const ItemBonusFormat[] = "niiiii"; char const ItemBonusTreeNodeFormat[] = "niiii"; +char const ItemClassFormat[] = "nifs"; char const ItemCurrencyCostFormat[] = "in"; +char const ItemDisenchantLootFormat[] = "niiiiii"; +char const ItemEffectFormat[] = "niiiiiiiii"; char const ItemExtendedCostFormat[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiii"; -char const ItemEffectFormat[] = "niiiiiiii"; +char const ItemFormat[] = "niiiiiiii"; +char const ItemLimitCategoryFormat[] = "nsii"; char const ItemModifiedAppearanceFormat[] = "niiiii"; +char const ItemPriceBaseFormat[] = "niff"; +char const ItemRandomPropertiesFormat[] = "nsiiiiis"; +char const ItemRandomSuffixFormat[] = "nssiiiiiiiiii"; char const ItemSparseFormat[] = "niiiiffiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiffffffffffiiifisssssiiiiiiiiiiiiiiiiiiifiiifiii"; +char const ItemSpecFormat[] = "niiiiii"; +char const ItemSpecOverrideFormat[] = "nii"; char const ItemXBonusTreeFormat[] = "nii"; char const KeyChainFormat[] = "nbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"; +char const MailTemplateFormat[] = "ns"; +char const MountCapabilityFormat[] = "niiiiiii"; char const MountFormat[] = "niiisssiii"; +char const MountTypeXCapabilityFormat[] = "niii"; +char const NameGenFormat[] = "nsii"; char const OverrideSpellDataFormat[] = "niiiiiiiiiiii"; char const PhaseXPhaseGroupFormat[] = "nii"; +char const QuestMoneyRewardFormat[] = "niiiiiiiiii"; char const QuestPackageItemfmt[] = "niiii"; +char const QuestSortFormat[] = "ns"; +char const QuestV2Format[] = "ni"; +char const QuestXPFormat[] = "niiiiiiiiii"; +char const ScalingStatDistributionFormat[] = "niii"; char const SoundEntriesFormat[] = "nisiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiififfiifffffii"; +char const SpecializationSpellsFormat[] = "niiiis"; char const SpellAuraRestrictionsFormat[] = "niiiiiiii"; +char const SpellCastTimesFormat[] = "niii"; char const SpellCastingRequirementsFormat[] = "niiiiii"; char const SpellClassOptionsFormat[] = "niiiiii"; +char const SpellDurationFormat[] = "niii"; +char const SpellItemEnchantmentConditionFormat[] = "nbbbbbiiiiibbbbbbbbbbiiiiibbbbb"; char const SpellLearnSpellFormat[] = "niii"; -char const SpellMiscFormat[] = "niiiiiiiiiiiiiiiiifiiiiif"; -char const SpellPowerFormat[] = "niiiiiiiiiffif"; +char const SpellMiscFormat[] = "niiiiiiiiiiiiiiiiifiiif"; char const SpellPowerDifficultyFormat[] = "nii"; -char const SpellReagentsFormat[] = "niiiiiiiiiiiiiiiiii"; +char const SpellPowerFormat[] = "niiiiiiiiiffif"; +char const SpellRadiusFormat[] = "nffff"; +char const SpellRangeFormat[] = "nffffiss"; +char const SpellReagentsFormat[] = "niiiiiiiiiiiiiiii"; char const SpellRuneCostFormat[] = "niiiii"; char const SpellTotemsFormat[] = "niiii"; +char const SpellXSpellVisualFormat[] = "niiiifii"; char const TaxiNodesFormat[] = "nifffsiiiiiff"; char const TaxiPathFormat[] = "niii"; char const TaxiPathNodeFormat[] = "niiifffiiii"; +char const TotemCategoryFormat[] = "nsii"; +char const TransportAnimationFormat[] = "niifffi"; +char const TransportRotationFormat[] = "niiffff"; +char const UnitPowerBarFormat[] = "niiiiffiiiiiiiiiiiiiissssff"; +char const WorldMapOverlayFormat[] = "niiiiisiiiiiiiii"; #endif diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index 9789574c23d..64cd5ed3c0e 100644 --- a/src/server/game/DataStores/DBCStores.cpp +++ b/src/server/game/DataStores/DBCStores.cpp @@ -22,11 +22,11 @@ #include "SharedDefines.h" #include "SpellInfo.h" #include "SpellMgr.h" -#include "TransportMgr.h" #include "DBCfmt.h" #include "ItemTemplate.h" #include "Timer.h" #include "ObjectDefines.h" +#include "DB2Stores.h" #include <map> @@ -63,37 +63,25 @@ DBCStorage <AchievementEntry> sAchievementStore(Achievementfmt); DBCStorage <AnimKitEntry> sAnimKitStore(AnimKitfmt); DBCStorage <AreaTriggerEntry> sAreaTriggerStore(AreaTriggerEntryfmt); DBCStorage <ArmorLocationEntry> sArmorLocationStore(ArmorLocationfmt); -DBCStorage <AuctionHouseEntry> sAuctionHouseStore(AuctionHouseEntryfmt); DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore(BankBagSlotPricesEntryfmt); DBCStorage <BannedAddOnsEntry> sBannedAddOnsStore(BannedAddOnsfmt); DBCStorage <BattlemasterListEntry> sBattlemasterListStore(BattlemasterListEntryfmt); -DBCStorage <BarberShopStyleEntry> sBarberShopStyleStore(BarberShopStyleEntryfmt); -DBCStorage <CharStartOutfitEntry> sCharStartOutfitStore(CharStartOutfitEntryfmt); -std::map<uint32, CharStartOutfitEntry const*> sCharStartOutfitMap; DBCStorage <CharSectionsEntry> sCharSectionsStore(CharSectionsEntryfmt); CharSectionsMap sCharSectionMap; DBCStorage <CharTitlesEntry> sCharTitlesStore(CharTitlesEntryfmt); DBCStorage <ChatChannelsEntry> sChatChannelsStore(ChatChannelsEntryfmt); DBCStorage <ChrClassesEntry> sChrClassesStore(ChrClassesEntryfmt); DBCStorage <ChrRacesEntry> sChrRacesStore(ChrRacesEntryfmt); -DBCStorage <ChrPowerTypesEntry> sChrPowerTypesStore(ChrClassesXPowerTypesfmt); DBCStorage <ChrSpecializationEntry> sChrSpecializationStore(ChrSpecializationEntryfmt); ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -DBCStorage <CinematicSequencesEntry> sCinematicSequencesStore(CinematicSequencesEntryfmt); -DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore(CreatureDisplayInfofmt); DBCStorage <CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt); DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore(CreatureFamilyfmt); DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore(CreatureModelDatafmt); -DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore(CreatureSpellDatafmt); -DBCStorage <CreatureTypeEntry> sCreatureTypeStore(CreatureTypefmt); DBCStorage <CriteriaEntry> sCriteriaStore(Criteriafmt); DBCStorage <CriteriaTreeEntry> sCriteriaTreeStore(CriteriaTreefmt); -uint32 PowersByClass[MAX_CLASSES][MAX_POWERS]; -DBCStorage <DestructibleModelDataEntry> sDestructibleModelDataStore(DestructibleModelDatafmt); DBCStorage <DifficultyEntry> sDifficultyStore(DifficultyFmt); DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore(DungeonEncounterfmt); -DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore(DurabilityQualityfmt); DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore(DurabilityCostsfmt); DBCStorage <EmotesEntry> sEmotesStore(EmotesEntryfmt); @@ -105,10 +93,8 @@ DBCStorage <FactionEntry> sFactionStore(FactionEntryfmt); DBCStorage <FactionTemplateEntry> sFactionTemplateStore(FactionTemplateEntryfmt); DBCStorage <GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore(GameObjectDisplayInfofmt); -DBCStorage <GameTablesEntry> sGameTablesStore(GameTablesFmt); DBCStorage <GemPropertiesEntry> sGemPropertiesStore(GemPropertiesEntryfmt); DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore(GlyphPropertiesfmt); -DBCStorage <GlyphSlotEntry> sGlyphSlotStore(GlyphSlotfmt); GameTable <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore(GtBarberShopCostBasefmt); GameTable <GtCombatRatingsEntry> sGtCombatRatingsStore(GtCombatRatingsfmt); @@ -131,17 +117,13 @@ GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore(GtRegenMPPerSptfm GameTable <GtSpellScalingEntry> sGtSpellScalingStore(GtSpellScalingfmt); GameTable <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore(GtOCTBaseHPByClassfmt); GameTable <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore(GtOCTBaseMPByClassfmt); -DBCStorage <GuildPerkSpellsEntry> sGuildPerkSpellsStore(GuildPerkSpellsfmt); +DBCStorage <GuildColorBackgroundEntry> sGuildColorBackgroundStore(GuildColorBackgroundfmt); +DBCStorage <GuildColorBorderEntry> sGuildColorBorderStore(GuildColorBorderfmt); +DBCStorage <GuildColorEmblemEntry> sGuildColorEmblemStore(GuildColorEmblemfmt); -DBCStorage <ImportPriceArmorEntry> sImportPriceArmorStore(ImportPriceArmorfmt); -DBCStorage <ImportPriceQualityEntry> sImportPriceQualityStore(ImportPriceQualityfmt); -DBCStorage <ImportPriceShieldEntry> sImportPriceShieldStore(ImportPriceShieldfmt); -DBCStorage <ImportPriceWeaponEntry> sImportPriceWeaponStore(ImportPriceWeaponfmt); -DBCStorage <ItemPriceBaseEntry> sItemPriceBaseStore(ItemPriceBasefmt); DBCStorage <ItemArmorQualityEntry> sItemArmorQualityStore(ItemArmorQualityfmt); DBCStorage <ItemArmorShieldEntry> sItemArmorShieldStore(ItemArmorShieldfmt); DBCStorage <ItemArmorTotalEntry> sItemArmorTotalStore(ItemArmorTotalfmt); -DBCStorage <ItemClassEntry> sItemClassStore(ItemClassfmt); DBCStorage <ItemBagFamilyEntry> sItemBagFamilyStore(ItemBagFamilyfmt); DBCStorage <ItemDamageEntry> sItemDamageAmmoStore(ItemDamagefmt); DBCStorage <ItemDamageEntry> sItemDamageOneHandStore(ItemDamagefmt); @@ -151,24 +133,15 @@ DBCStorage <ItemDamageEntry> sItemDamageThrownStore(ItemDamagefmt); DBCStorage <ItemDamageEntry> sItemDamageTwoHandStore(ItemDamagefmt); DBCStorage <ItemDamageEntry> sItemDamageTwoHandCasterStore(ItemDamagefmt); DBCStorage <ItemDamageEntry> sItemDamageWandStore(ItemDamagefmt); -DBCStorage <ItemDisenchantLootEntry> sItemDisenchantLootStore(ItemDisenchantLootfmt); -//DBCStorage <ItemDisplayInfoEntry> sItemDisplayInfoStore(ItemDisplayTemplateEntryfmt); -- not used currently -DBCStorage <ItemLimitCategoryEntry> sItemLimitCategoryStore(ItemLimitCategoryEntryfmt); -DBCStorage <ItemRandomPropertiesEntry> sItemRandomPropertiesStore(ItemRandomPropertiesfmt); -DBCStorage <ItemRandomSuffixEntry> sItemRandomSuffixStore(ItemRandomSuffixfmt); DBCStorage <ItemSetEntry> sItemSetStore(ItemSetEntryfmt); DBCStorage <ItemSetSpellEntry> sItemSetSpellStore(ItemSetSpellEntryfmt); ItemSetSpellsStore sItemSetSpellsStore; -DBCStorage <ItemSpecOverrideEntry> sItemSpecOverrideStore(ItemSpecOverrideEntryfmt); -std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> sItemSpecOverridesStore; -DBCStorage <ItemSpecEntry> sItemSpecStore(ItemSpecEntryfmt); DBCStorage <LFGDungeonEntry> sLFGDungeonStore(LFGDungeonEntryfmt); DBCStorage <LightEntry> sLightStore(LightEntryfmt); DBCStorage <LiquidTypeEntry> sLiquidTypeStore(LiquidTypefmt); DBCStorage <LockEntry> sLockStore(LockEntryfmt); -DBCStorage <MailTemplateEntry> sMailTemplateStore(MailTemplateEntryfmt); DBCStorage <MapEntry> sMapStore(MapEntryfmt); // DBC used only for initialization sMapDifficultyMap at startup. @@ -177,32 +150,19 @@ MapDifficultyMap sMapDifficultyMap; DBCStorage <ModifierTreeEntry> sModifierTreeStore(ModifierTreefmt); DBCStorage <MovieEntry> sMovieStore(MovieEntryfmt); -DBCStorage <MountCapabilityEntry> sMountCapabilityStore(MountCapabilityfmt); -DBCStorage <MountTypeEntry> sMountTypeStore(MountTypefmt); - -DBCStorage <NameGenEntry> sNameGenStore(NameGenfmt); -NameGenContainer sGenerateNamesMap; DBCStorage <PowerDisplayEntry> sPowerDisplayStore(PowerDisplayfmt); DBCStorage <PvPDifficultyEntry> sPvPDifficultyStore(PvPDifficultyfmt); -DBCStorage <QuestSortEntry> sQuestSortStore(QuestSortEntryfmt); -DBCStorage <QuestV2Entry> sQuestV2Store(QuestV2fmt); -DBCStorage <QuestXPEntry> sQuestXPStore(QuestXPfmt); DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore(QuestFactionRewardfmt); DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore(RandomPropertiesPointsfmt); -DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore(ScalingStatDistributionfmt); DBCStorage <SkillLineEntry> sSkillLineStore(SkillLinefmt); DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore(SkillLineAbilityfmt); DBCStorage <SkillRaceClassInfoEntry> sSkillRaceClassInfoStore(SkillRaceClassInfofmt); SkillRaceClassInfoMap SkillRaceClassInfoBySkill; -DBCStorage <SkillTiersEntry> sSkillTiersStore(SkillTiersfmt); -DBCStorage <SpecializationSpellsEntry> sSpecializationSpellsStore(SpecializationSpellsEntryfmt); -std::unordered_map<uint32, std::vector<SpecializationSpellsEntry const*>> sSpecializationSpellsBySpecStore; DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore(SpellItemEnchantmentfmt); -DBCStorage <SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore(SpellItemEnchantmentConditionfmt); DBCStorage <SpellEntry> sSpellStore(SpellEntryfmt); DBCStorage <SpellEffectScalingEntry> sSpellEffectScalingStore(SpellEffectScalingfmt); @@ -218,14 +178,10 @@ DBCStorage <SpellInterruptsEntry> sSpellInterruptsStore(SpellInterruptsEntryfmt) DBCStorage <SpellEquippedItemsEntry> sSpellEquippedItemsStore(SpellEquippedItemsEntryfmt); DBCStorage <SpellCooldownsEntry> sSpellCooldownsStore(SpellCooldownsEntryfmt); DBCStorage <SpellAuraOptionsEntry> sSpellAuraOptionsStore(SpellAuraOptionsEntryfmt); -DBCStorage <SpellCastTimesEntry> sSpellCastTimesStore(SpellCastTimefmt); DBCStorage <SpellCategoriesEntry> sSpellCategoriesStore(SpellCategoriesEntryfmt); DBCStorage <SpellCategoryEntry> sSpellCategoryStore(SpellCategoryfmt); DBCStorage <SpellEffectEntry> sSpellEffectStore(SpellEffectEntryfmt); -DBCStorage <SpellDurationEntry> sSpellDurationStore(SpellDurationfmt); DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore(SpellFocusObjectfmt); -DBCStorage <SpellRadiusEntry> sSpellRadiusStore(SpellRadiusfmt); -DBCStorage <SpellRangeEntry> sSpellRangeStore(SpellRangefmt); DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore(SpellShapeshiftEntryfmt); DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore(SpellShapeshiftFormfmt); DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore(StableSlotPricesfmt); @@ -233,21 +189,17 @@ DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore(SummonPropertiesfmt); DBCStorage <TalentEntry> sTalentStore(TalentEntryfmt); TalentsByPosition sTalentByPos; -DBCStorage <TotemCategoryEntry> sTotemCategoryStore(TotemCategoryEntryfmt); -DBCStorage <TransportAnimationEntry> sTransportAnimationStore(TransportAnimationfmt); -DBCStorage <TransportRotationEntry> sTransportRotationStore(TransportRotationfmt); -DBCStorage <UnitPowerBarEntry> sUnitPowerBarStore(UnitPowerBarfmt); DBCStorage <VehicleEntry> sVehicleStore(VehicleEntryfmt); DBCStorage <VehicleSeatEntry> sVehicleSeatStore(VehicleSeatEntryfmt); DBCStorage <WMOAreaTableEntry> sWMOAreaTableStore(WMOAreaTableEntryfmt); DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore(WorldMapAreaEntryfmt); -DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore(WorldMapOverlayEntryfmt); DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore(WorldSafeLocsEntryfmt); DBCStorage <PhaseEntry> sPhaseStore(PhaseEntryfmt); typedef std::list<std::string> StoreProblemList; uint32 DBCFileCount = 0; +uint32 GameTableCount = 0; template<class T> inline void LoadDBC(uint32& availableDbcLocales, StoreProblemList& errors, DBCStorage<T>& storage, std::string const& dbcPath, std::string const& filename, std::string const* customFormat = NULL, std::string const* customIndexName = NULL) @@ -305,28 +257,34 @@ inline void LoadGameTable(StoreProblemList& errors, std::string const& tableName "Size of '%s' set by format string (%u) not equal size of C++ structure (%u).", filename.c_str(), DBCFileLoader::GetFormatRecordSize(storage.GetFormat()), uint32(sizeof(T))); - ++DBCFileCount; + ++GameTableCount; std::string dbcFilename = dbcPath + filename; if (storage.Load(dbcFilename.c_str())) { bool found = false; - // Find table definition in GameTables.dbc + // Find table definition in GameTables.db2 for (uint32 i = 0; i < sGameTablesStore.GetNumRows(); ++i) { GameTablesEntry const* gt = sGameTablesStore.LookupEntry(i); if (!gt) continue; - if (tableName == gt->Name) + for (uint32 i = 0; i < TOTAL_LOCALES; ++i) { - found = true; - storage.SetGameTableEntry(gt); - break; + if (tableName == gt->Name->Str[i]) + { + found = true; + storage.SetGameTableEntry(gt); + break; + } } + + if (found) + break; } - ASSERT(found, "Game table %s definition not found in GameTables.dbc", tableName.c_str()); + ASSERT(found, "Game table %s definition not found in GameTables.db2", tableName.c_str()); } else { @@ -353,7 +311,95 @@ void LoadDBCStores(const std::string& dataPath) StoreProblemList bad_dbc_files; uint32 availableDbcLocales = 0xFFFFFFFF; - LoadDBC(availableDbcLocales, bad_dbc_files, sAreaStore, dbcPath, "AreaTable.dbc"); +#define LOAD_DBC(store, file) LoadDBC(availableDbcLocales, bad_dbc_files, store, dbcPath, file) + + LOAD_DBC(sAchievementStore, "Achievement.dbc"/*, &CustomAchievementfmt, &CustomAchievementIndex*/);//20201 + LOAD_DBC(sAnimKitStore, "AnimKit.dbc");//20201 + LOAD_DBC(sAreaStore, "AreaTable.dbc");//20201 + LOAD_DBC(sAreaTriggerStore, "AreaTrigger.dbc");//20201 + LOAD_DBC(sArmorLocationStore, "ArmorLocation.dbc");//20201 + LOAD_DBC(sBankBagSlotPricesStore, "BankBagSlotPrices.dbc");//20201 + LOAD_DBC(sBannedAddOnsStore, "BannedAddOns.dbc");//20201 + LOAD_DBC(sBattlemasterListStore, "BattlemasterList.dbc");//20201 + LOAD_DBC(sCharSectionsStore, "CharSections.dbc");//20201 + LOAD_DBC(sCharTitlesStore, "CharTitles.dbc");//20201 + LOAD_DBC(sChatChannelsStore, "ChatChannels.dbc");//20201 + LOAD_DBC(sChrClassesStore, "ChrClasses.dbc");//20201 + LOAD_DBC(sChrRacesStore, "ChrRaces.dbc");//20201 + LOAD_DBC(sChrSpecializationStore, "ChrSpecialization.dbc");//20201 + LOAD_DBC(sCreatureDisplayInfoExtraStore, "CreatureDisplayInfoExtra.dbc");//20201 + LOAD_DBC(sCreatureFamilyStore, "CreatureFamily.dbc");//20201 + LOAD_DBC(sCreatureModelDataStore, "CreatureModelData.dbc");//20201 + LOAD_DBC(sCriteriaStore, "Criteria.dbc");//20201 + LOAD_DBC(sCriteriaTreeStore, "CriteriaTree.dbc");//20201 + LOAD_DBC(sDifficultyStore, "Difficulty.dbc");//20201 + LOAD_DBC(sDungeonEncounterStore, "DungeonEncounter.dbc");//20201 + LOAD_DBC(sDurabilityCostsStore, "DurabilityCosts.dbc");//20201 + LOAD_DBC(sEmotesStore, "Emotes.dbc");//20201 + LOAD_DBC(sEmotesTextStore, "EmotesText.dbc");//20201 + LOAD_DBC(sFactionStore, "Faction.dbc");//20201 + LOAD_DBC(sFactionTemplateStore, "FactionTemplate.dbc");//20201 + LOAD_DBC(sGameObjectDisplayInfoStore, "GameObjectDisplayInfo.dbc");//20201 + LOAD_DBC(sGemPropertiesStore, "GemProperties.dbc");//20201 + LOAD_DBC(sGlyphPropertiesStore, "GlyphProperties.dbc");//20201 + LOAD_DBC(sGuildColorBackgroundStore, "GuildColorBackground.dbc");//20201 + LOAD_DBC(sGuildColorBorderStore, "GuildColorBorder.dbc"); //20201 + LOAD_DBC(sGuildColorEmblemStore, "GuildColorEmblem.dbc");//20201 + LOAD_DBC(sItemArmorQualityStore, "ItemArmorQuality.dbc");//20201 + LOAD_DBC(sItemArmorShieldStore, "ItemArmorShield.dbc");//20201 + LOAD_DBC(sItemArmorTotalStore, "ItemArmorTotal.dbc");//20201 + LOAD_DBC(sItemBagFamilyStore, "ItemBagFamily.dbc");//20201 + LOAD_DBC(sItemDamageAmmoStore, "ItemDamageAmmo.dbc");//20201 + LOAD_DBC(sItemDamageOneHandCasterStore, "ItemDamageOneHandCaster.dbc");//20201 + LOAD_DBC(sItemDamageOneHandStore, "ItemDamageOneHand.dbc");//20201 + LOAD_DBC(sItemDamageRangedStore, "ItemDamageRanged.dbc");//20201 + LOAD_DBC(sItemDamageThrownStore, "ItemDamageThrown.dbc");//20201 + LOAD_DBC(sItemDamageTwoHandCasterStore, "ItemDamageTwoHandCaster.dbc");//20201 + LOAD_DBC(sItemDamageTwoHandStore, "ItemDamageTwoHand.dbc");//20201 + LOAD_DBC(sItemDamageWandStore, "ItemDamageWand.dbc");//20201 + LOAD_DBC(sItemSetSpellStore, "ItemSetSpell.dbc");//20201 + LOAD_DBC(sItemSetStore, "ItemSet.dbc");//20201 + LOAD_DBC(sLFGDungeonStore, "LfgDungeons.dbc");//20201 + LOAD_DBC(sLightStore, "Light.dbc"); //20201 + LOAD_DBC(sLiquidTypeStore, "LiquidType.dbc");//20201 + LOAD_DBC(sLockStore, "Lock.dbc");//20201 + LOAD_DBC(sMapDifficultyStore, "MapDifficulty.dbc");//20201 + LOAD_DBC(sMapStore, "Map.dbc");//20201 + LOAD_DBC(sModifierTreeStore, "ModifierTree.dbc");//20201 + LOAD_DBC(sMovieStore, "Movie.dbc");//20201 + LOAD_DBC(sPhaseStore, "Phase.dbc"); // 20201 + LOAD_DBC(sPowerDisplayStore, "PowerDisplay.dbc");//20201 + LOAD_DBC(sPvPDifficultyStore, "PvpDifficulty.dbc");//20201 + LOAD_DBC(sQuestFactionRewardStore, "QuestFactionReward.dbc");//20201 + LOAD_DBC(sRandomPropertiesPointsStore, "RandPropPoints.dbc");//20201 + LOAD_DBC(sSkillLineAbilityStore, "SkillLineAbility.dbc");//20201 + LOAD_DBC(sSkillLineStore, "SkillLine.dbc");//20201 + LOAD_DBC(sSkillRaceClassInfoStore, "SkillRaceClassInfo.dbc");//20201 + LOAD_DBC(sSpellAuraOptionsStore, "SpellAuraOptions.dbc");//20201 + LOAD_DBC(sSpellCategoriesStore, "SpellCategories.dbc");//20201 + LOAD_DBC(sSpellCategoryStore, "SpellCategory.dbc");//20201 + LOAD_DBC(sSpellCooldownsStore, "SpellCooldowns.dbc");//20201 + LOAD_DBC(sSpellEffectScalingStore, "SpellEffectScaling.dbc");//20201 + LOAD_DBC(sSpellEffectStore, "SpellEffect.dbc"/*, &CustomSpellEffectEntryfmt, &CustomSpellEffectEntryIndex*/);//20201 + LOAD_DBC(sSpellEquippedItemsStore, "SpellEquippedItems.dbc");//20201 + LOAD_DBC(sSpellFocusObjectStore, "SpellFocusObject.dbc");//20201 + LOAD_DBC(sSpellInterruptsStore, "SpellInterrupts.dbc");//20201 + LOAD_DBC(sSpellItemEnchantmentStore, "SpellItemEnchantment.dbc");//20201 + LOAD_DBC(sSpellLevelsStore, "SpellLevels.dbc");//20201 + LOAD_DBC(sSpellScalingStore, "SpellScaling.dbc");//20201 + LOAD_DBC(sSpellShapeshiftFormStore, "SpellShapeshiftForm.dbc");//20201 + LOAD_DBC(sSpellShapeshiftStore, "SpellShapeshift.dbc");//20201 + LOAD_DBC(sSpellStore, "Spell.dbc"/*, &CustomSpellEntryfmt, &CustomSpellEntryIndex*/);//20201 + LOAD_DBC(sSpellTargetRestrictionsStore, "SpellTargetRestrictions.dbc");//20201 + LOAD_DBC(sSummonPropertiesStore, "SummonProperties.dbc");//20201 + LOAD_DBC(sTalentStore, "Talent.dbc");//20201 + LOAD_DBC(sVehicleSeatStore, "VehicleSeat.dbc");//20201 + LOAD_DBC(sVehicleStore, "Vehicle.dbc");//20201 + LOAD_DBC(sWMOAreaTableStore, "WMOAreaTable.dbc");//20201 + LOAD_DBC(sWorldMapAreaStore, "WorldMapArea.dbc");//20201 + LOAD_DBC(sWorldSafeLocsStore, "WorldSafeLocs.dbc"); // 20201 + +#undef LOAD_DBC // must be after sAreaStore loading for (uint32 i = 0; i < sAreaStore.GetNumRows(); ++i) // areaflag numbered from 0 @@ -369,71 +415,16 @@ void LoadDBCStores(const std::string& dataPath) } } - LoadDBC(availableDbcLocales, bad_dbc_files, sAchievementStore, dbcPath, "Achievement.dbc"/*, &CustomAchievementfmt, &CustomAchievementIndex*/);//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sAnimKitStore, dbcPath, "AnimKit.dbc");//19865 - LoadDBC(availableDbcLocales, bad_dbc_files, sAreaTriggerStore, dbcPath, "AreaTrigger.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sAuctionHouseStore, dbcPath, "AuctionHouse.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sArmorLocationStore, dbcPath, "ArmorLocation.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sBankBagSlotPricesStore, dbcPath, "BankBagSlotPrices.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sBannedAddOnsStore, dbcPath, "BannedAddOns.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sBattlemasterListStore, dbcPath, "BattlemasterList.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sBarberShopStyleStore, dbcPath, "BarberShopStyle.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCharStartOutfitStore, dbcPath, "CharStartOutfit.dbc");//19116 - for (uint32 i = 0; i < sCharStartOutfitStore.GetNumRows(); ++i) - if (CharStartOutfitEntry const* outfit = sCharStartOutfitStore.LookupEntry(i)) - sCharStartOutfitMap[outfit->RaceID | (outfit->ClassID << 8) | (outfit->GenderID << 16)] = outfit; - - LoadDBC(availableDbcLocales, bad_dbc_files, sCharSectionsStore, dbcPath, "CharSections.dbc"); for (uint32 i = 0; i < sCharSectionsStore.GetNumRows(); ++i) if (CharSectionsEntry const* entry = sCharSectionsStore.LookupEntry(i)) if (entry->Race && ((1 << (entry->Race - 1)) & RACEMASK_ALL_PLAYABLE) != 0) //ignore Nonplayable races sCharSectionMap.insert({ entry->GenType | (entry->Gender << 8) | (entry->Race << 16), entry }); - LoadDBC(availableDbcLocales, bad_dbc_files, sCharTitlesStore, dbcPath, "CharTitles.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sChatChannelsStore, dbcPath, "ChatChannels.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sChrClassesStore, dbcPath, "ChrClasses.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sChrRacesStore, dbcPath, "ChrRaces.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sChrPowerTypesStore, dbcPath, "ChrClassesXPowerTypes.dbc");//19116 - for (uint32 i = 0; i < MAX_CLASSES; ++i) - for (uint32 j = 0; j < MAX_POWERS; ++j) - PowersByClass[i][j] = MAX_POWERS; - - for (uint32 i = 0; i < sChrPowerTypesStore.GetNumRows(); ++i) - { - if (ChrPowerTypesEntry const* power = sChrPowerTypesStore.LookupEntry(i)) - { - uint32 index = 0; - for (uint32 j = 0; j < MAX_POWERS; ++j) - if (PowersByClass[power->ClassID][j] != MAX_POWERS) - ++index; - - PowersByClass[power->ClassID][power->PowerType] = index; - } - } - - LoadDBC(availableDbcLocales, bad_dbc_files, sChrSpecializationStore, dbcPath, "ChrSpecialization.dbc"); memset(sChrSpecializationByIndexStore, 0, sizeof(sChrSpecializationByIndexStore)); for (uint32 i = 0; i < sChrSpecializationStore.GetNumRows(); ++i) if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(i)) sChrSpecializationByIndexStore[chrSpec->ClassID][chrSpec->OrderIndex] = chrSpec; - LoadDBC(availableDbcLocales, bad_dbc_files, sCinematicSequencesStore, dbcPath, "CinematicSequences.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureDisplayInfoStore, dbcPath, "CreatureDisplayInfo.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureDisplayInfoExtraStore, dbcPath, "CreatureDisplayInfoExtra.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureFamilyStore, dbcPath, "CreatureFamily.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureModelDataStore, dbcPath, "CreatureModelData.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureSpellDataStore, dbcPath, "CreatureSpellData.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCreatureTypeStore, dbcPath, "CreatureType.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sCriteriaStore, dbcPath, "Criteria.dbc");//19342 - LoadDBC(availableDbcLocales, bad_dbc_files, sCriteriaTreeStore, dbcPath, "CriteriaTree.dbc");//19342 - LoadDBC(availableDbcLocales, bad_dbc_files, sDestructibleModelDataStore, dbcPath, "DestructibleModelData.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sDifficultyStore, dbcPath, "Difficulty.dbc");//19342 - LoadDBC(availableDbcLocales, bad_dbc_files, sDungeonEncounterStore, dbcPath, "DungeonEncounter.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sDurabilityCostsStore, dbcPath, "DurabilityCosts.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sDurabilityQualityStore, dbcPath, "DurabilityQuality.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sEmotesStore, dbcPath, "Emotes.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sEmotesTextStore, dbcPath, "EmotesText.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sFactionStore, dbcPath, "Faction.dbc");//19116 for (uint32 i = 0; i < sFactionStore.GetNumRows(); ++i) { FactionEntry const* faction = sFactionStore.LookupEntry(i); @@ -444,8 +435,6 @@ void LoadDBCStores(const std::string& dataPath) } } - LoadDBC(availableDbcLocales, bad_dbc_files, sFactionTemplateStore, dbcPath, "FactionTemplate.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sGameObjectDisplayInfoStore, dbcPath, "GameObjectDisplayInfo.dbc");//19116 for (uint32 i = 0; i < sGameObjectDisplayInfoStore.GetNumRows(); ++i) { if (GameObjectDisplayInfoEntry const* info = sGameObjectDisplayInfoStore.LookupEntry(i)) @@ -459,113 +448,25 @@ void LoadDBCStores(const std::string& dataPath) } } - LoadDBC(availableDbcLocales, bad_dbc_files, sGameTablesStore, dbcPath, "GameTables.dbc");//19243 - LoadDBC(availableDbcLocales, bad_dbc_files, sGemPropertiesStore, dbcPath, "GemProperties.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sGlyphPropertiesStore, dbcPath, "GlyphProperties.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sGlyphSlotStore, dbcPath, "GlyphSlot.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sGuildPerkSpellsStore, dbcPath, "GuildPerkSpells.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sImportPriceArmorStore, dbcPath, "ImportPriceArmor.dbc"); // 19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sImportPriceQualityStore, dbcPath, "ImportPriceQuality.dbc"); // 19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sImportPriceShieldStore, dbcPath, "ImportPriceShield.dbc"); // 19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sImportPriceWeaponStore, dbcPath, "ImportPriceWeapon.dbc"); // 19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemPriceBaseStore, dbcPath, "ItemPriceBase.dbc"); // 15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemBagFamilyStore, dbcPath, "ItemBagFamily.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemClassStore, dbcPath, "ItemClass.dbc"); // 19116 - //LoadDBC(dbcCount, availableDbcLocales, bad_dbc_files, sItemDisplayInfoStore, dbcPath, "ItemDisplayInfo.dbc"); -- not used currently - LoadDBC(availableDbcLocales, bad_dbc_files, sItemLimitCategoryStore, dbcPath, "ItemLimitCategory.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemRandomPropertiesStore, dbcPath, "ItemRandomProperties.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemRandomSuffixStore, dbcPath, "ItemRandomSuffix.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemSetStore, dbcPath, "ItemSet.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemSetSpellStore, dbcPath, "ItemSetSpell.dbc");//19116 for (ItemSetSpellEntry const* entry : sItemSetSpellStore) sItemSetSpellsStore[entry->ItemSetID].push_back(entry); - LoadDBC(availableDbcLocales, bad_dbc_files, sItemSpecStore, dbcPath, "ItemSpec.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemSpecOverrideStore, dbcPath, "ItemSpecOverride.dbc");//19116 - for (ItemSpecOverrideEntry const* entry : sItemSpecOverrideStore) - sItemSpecOverridesStore[entry->ItemID].push_back(entry); - - LoadDBC(availableDbcLocales, bad_dbc_files, sItemArmorQualityStore, dbcPath, "ItemArmorQuality.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemArmorShieldStore, dbcPath, "ItemArmorShield.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemArmorTotalStore, dbcPath, "ItemArmorTotal.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageAmmoStore, dbcPath, "ItemDamageAmmo.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageOneHandStore, dbcPath, "ItemDamageOneHand.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageOneHandCasterStore, dbcPath, "ItemDamageOneHandCaster.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageRangedStore, dbcPath, "ItemDamageRanged.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageThrownStore, dbcPath, "ItemDamageThrown.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageTwoHandStore, dbcPath, "ItemDamageTwoHand.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageTwoHandCasterStore, dbcPath, "ItemDamageTwoHandCaster.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDamageWandStore, dbcPath, "ItemDamageWand.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sItemDisenchantLootStore, dbcPath, "ItemDisenchantLoot.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sLFGDungeonStore, dbcPath, "LfgDungeons.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sLightStore, dbcPath, "Light.dbc"); //19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sLiquidTypeStore, dbcPath, "LiquidType.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sLockStore, dbcPath, "Lock.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sMailTemplateStore, dbcPath, "MailTemplate.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sMapStore, dbcPath, "Map.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sMapDifficultyStore, dbcPath, "MapDifficulty.dbc");//19116 // fill data for (uint32 i = 0; i < sMapDifficultyStore.GetNumRows(); ++i) if (MapDifficultyEntry const* entry = sMapDifficultyStore.LookupEntry(i)) 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 - LoadDBC(availableDbcLocales, bad_dbc_files, sMountTypeStore, dbcPath, "MountType.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sNameGenStore, dbcPath, "NameGen.dbc"); // 19116 - for (uint32 i = 0; i < sNameGenStore.GetNumRows(); ++i) - if (NameGenEntry const* entry = sNameGenStore.LookupEntry(i)) - sGenerateNamesMap[entry->Race].Contents[entry->Sex].emplace_back(entry->Name); - sNameGenStore.Clear(); - - LoadDBC(availableDbcLocales, bad_dbc_files, sMovieStore, dbcPath, "Movie.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sPhaseStore, dbcPath, "Phase.dbc"); // 19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sPowerDisplayStore, dbcPath, "PowerDisplay.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sPvPDifficultyStore, dbcPath, "PvpDifficulty.dbc");//19116 - for (uint32 i = 0; i < sPvPDifficultyStore.GetNumRows(); ++i) if (PvPDifficultyEntry const* entry = sPvPDifficultyStore.LookupEntry(i)) if (entry->BracketID > MAX_BATTLEGROUND_BRACKETS) ASSERT(false && "Need update MAX_BATTLEGROUND_BRACKETS by DBC data"); - LoadDBC(availableDbcLocales, bad_dbc_files, sQuestV2Store, dbcPath, "QuestV2.dbc");//19342 - LoadDBC(availableDbcLocales, bad_dbc_files, sQuestXPStore, dbcPath, "QuestXP.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sQuestFactionRewardStore, dbcPath, "QuestFactionReward.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sQuestSortStore, dbcPath, "QuestSort.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sRandomPropertiesPointsStore, dbcPath, "RandPropPoints.dbc");//19116 - - LoadDBC(availableDbcLocales, bad_dbc_files, sScalingStatDistributionStore, dbcPath, "ScalingStatDistribution.dbc"); - LoadDBC(availableDbcLocales, bad_dbc_files, sSkillLineStore, dbcPath, "SkillLine.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSkillLineAbilityStore, dbcPath, "SkillLineAbility.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSkillRaceClassInfoStore, dbcPath, "SkillRaceClassInfo.dbc");//19116 for (uint32 i = 0; i < sSkillRaceClassInfoStore.GetNumRows(); ++i) if (SkillRaceClassInfoEntry const* entry = sSkillRaceClassInfoStore.LookupEntry(i)) if (sSkillLineStore.LookupEntry(entry->SkillID)) SkillRaceClassInfoBySkill.emplace(entry->SkillID, entry); - LoadDBC(availableDbcLocales, bad_dbc_files, sSkillTiersStore, dbcPath, "SkillTiers.dbc"); - LoadDBC(availableDbcLocales, bad_dbc_files, sSpecializationSpellsStore, dbcPath, "SpecializationSpells.dbc"); - for (uint32 i = 0; i < sSpecializationSpellsStore.GetNumRows(); ++i) - { - SpecializationSpellsEntry const* specSpells = sSpecializationSpellsStore.LookupEntry(i); - if (!specSpells) - continue; - - sSpecializationSpellsBySpecStore[specSpells->SpecID].push_back(specSpells); - } - - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellStore, dbcPath, "Spell.dbc"/*, &CustomSpellEntryfmt, &CustomSpellEntryIndex*/); - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCategoriesStore, dbcPath, "SpellCategories.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCategoryStore, dbcPath, "SpellCategory.dbc"); for (uint32 i = 1; i < sSpellStore.GetNumRows(); ++i) { SpellEntry const* spell = sSpellStore.LookupEntry(i); @@ -576,27 +477,6 @@ void LoadDBCStores(const std::string& dataPath) sSpellsByCategoryStore[category->Category].insert(i); } - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellScalingStore, dbcPath,"SpellScaling.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellTargetRestrictionsStore, dbcPath,"SpellTargetRestrictions.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellLevelsStore, dbcPath,"SpellLevels.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellInterruptsStore, dbcPath,"SpellInterrupts.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellEquippedItemsStore, dbcPath,"SpellEquippedItems.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCooldownsStore, dbcPath,"SpellCooldowns.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellAuraOptionsStore, dbcPath,"SpellAuraOptions.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellEffectStore, dbcPath,"SpellEffect.dbc"/*, &CustomSpellEffectEntryfmt, &CustomSpellEffectEntryIndex*/);//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellCastTimesStore, dbcPath, "SpellCastTimes.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellDurationStore, dbcPath, "SpellDuration.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellFocusObjectStore, dbcPath, "SpellFocusObject.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellEffectScalingStore, dbcPath, "SpellEffectScaling.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellItemEnchantmentStore, dbcPath, "SpellItemEnchantment.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellItemEnchantmentConditionStore, dbcPath, "SpellItemEnchantmentCondition.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellRadiusStore, dbcPath, "SpellRadius.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellRangeStore, dbcPath, "SpellRange.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellShapeshiftStore, dbcPath, "SpellShapeshift.dbc");//19116 - LoadDBC(availableDbcLocales, bad_dbc_files, sSpellShapeshiftFormStore, dbcPath, "SpellShapeshiftForm.dbc");//19116 - //LoadDBC(availableDbcLocales, bad_dbc_files, sStableSlotPricesStore, dbcPath, "StableSlotPrices.dbc"); - LoadDBC(availableDbcLocales, bad_dbc_files, sSummonPropertiesStore, dbcPath, "SummonProperties.dbc");//15595 - for (uint32 j = 0; j < sSpellEffectScalingStore.GetNumRows(); j++) { SpellEffectScalingEntry const* spellEffectScaling = sSpellEffectScalingStore.LookupEntry(j); @@ -606,7 +486,6 @@ void LoadDBCStores(const std::string& dataPath) sSpellEffectScallingByEffectId.insert(std::make_pair(spellEffectScaling->SpellEffectID, j)); } - LoadDBC(availableDbcLocales, bad_dbc_files, sTalentStore, dbcPath, "Talent.dbc");//19342 for (uint32 i = 0; i < sTalentStore.GetNumRows(); ++i) { if (TalentEntry const* talentInfo = sTalentStore.LookupEntry(i)) @@ -619,61 +498,9 @@ void LoadDBCStores(const std::string& dataPath) } } - //LoadDBC(availableDbcLocales, bad_dbc_files, sTeamContributionPointsStore, dbcPath, "TeamContributionPoints.dbc"); - LoadDBC(availableDbcLocales, bad_dbc_files, sTotemCategoryStore, dbcPath, "TotemCategory.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sTransportAnimationStore, dbcPath, "TransportAnimation.dbc"); - for (uint32 i = 0; i < sTransportAnimationStore.GetNumRows(); ++i) - { - TransportAnimationEntry const* anim = sTransportAnimationStore.LookupEntry(i); - if (!anim) - continue; - - sTransportMgr->AddPathNodeToTransport(anim->TransportID, anim->TimeIndex, anim); - } - - LoadDBC(availableDbcLocales, bad_dbc_files, sTransportRotationStore, dbcPath, "TransportRotation.dbc"); - for (uint32 i = 0; i < sTransportRotationStore.GetNumRows(); ++i) - { - TransportRotationEntry const* rot = sTransportRotationStore.LookupEntry(i); - if (!rot) - continue; - - sTransportMgr->AddPathRotationToTransport(rot->TransportID, rot->TimeIndex, rot); - } - - LoadDBC(availableDbcLocales, bad_dbc_files, sUnitPowerBarStore, dbcPath, "UnitPowerBar.dbc");//15595 - - LoadDBC(availableDbcLocales, bad_dbc_files, sVehicleStore, dbcPath, "Vehicle.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sVehicleSeatStore, dbcPath, "VehicleSeat.dbc");//15595 - - LoadDBC(availableDbcLocales, bad_dbc_files, sWMOAreaTableStore, dbcPath, "WMOAreaTable.dbc");//15595 for (uint32 i = 0; i < sWMOAreaTableStore.GetNumRows(); ++i) if (WMOAreaTableEntry const* entry = sWMOAreaTableStore.LookupEntry(i)) sWMOAreaInfoByTripple.insert(WMOAreaInfoByTripple::value_type(WMOAreaTableTripple(entry->WMOID, entry->NameSet, entry->WMOGroupID), entry)); - LoadDBC(availableDbcLocales, bad_dbc_files, sWorldMapAreaStore, dbcPath, "WorldMapArea.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sWorldMapOverlayStore, dbcPath, "WorldMapOverlay.dbc");//15595 - LoadDBC(availableDbcLocales, bad_dbc_files, sWorldSafeLocsStore, dbcPath, "WorldSafeLocs.dbc"); // 19116 - - LoadGameTable(bad_dbc_files, "BarberShopCostBase", sGtBarberShopCostBaseStore, dbcPath, "gtBarberShopCostBase.dbc");//19342 - LoadGameTable(bad_dbc_files, "CombatRatings", sGtCombatRatingsStore, dbcPath, "gtCombatRatings.dbc");//19342 - LoadGameTable(bad_dbc_files, "ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, dbcPath, "gtChanceToMeleeCritBase.dbc");//19342 - LoadGameTable(bad_dbc_files, "ChanceToMeleeCrit", sGtChanceToMeleeCritStore, dbcPath, "gtChanceToMeleeCrit.dbc");//19342 - LoadGameTable(bad_dbc_files, "ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, dbcPath, "gtChanceToSpellCritBase.dbc");//19342 - LoadGameTable(bad_dbc_files, "ChanceToSpellCrit", sGtChanceToSpellCritStore, dbcPath, "gtChanceToSpellCrit.dbc");//19342 - LoadGameTable(bad_dbc_files, "ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, dbcPath, "gtItemSocketCostPerLevel.dbc");//19342 - LoadGameTable(bad_dbc_files, "NPCManaCostScaler", sGtNPCManaCostScalerStore, dbcPath, "gtNPCManaCostScaler.dbc");//19342 - LoadGameTable(bad_dbc_files, "NpcTotalHp", sGtNpcTotalHpStore, dbcPath, "gtNpcTotalHp.dbc"); // 19445 - LoadGameTable(bad_dbc_files, "NpcTotalHpExp1", sGtNpcTotalHpExp1Store, dbcPath, "gtNpcTotalHpExp1.dbc"); // 19445 - LoadGameTable(bad_dbc_files, "NpcTotalHpExp2", sGtNpcTotalHpExp2Store, dbcPath, "gtNpcTotalHpExp2.dbc"); // 19445 - LoadGameTable(bad_dbc_files, "NpcTotalHpExp3", sGtNpcTotalHpExp3Store, dbcPath, "gtNpcTotalHpExp3.dbc"); // 19445 - LoadGameTable(bad_dbc_files, "NpcTotalHpExp4", sGtNpcTotalHpExp4Store, dbcPath, "gtNpcTotalHpExp4.dbc"); // 19445 - LoadGameTable(bad_dbc_files, "NpcTotalHpExp5", sGtNpcTotalHpExp5Store, dbcPath, "gtNpcTotalHpExp5.dbc"); // 19445 - 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 - LoadGameTable(bad_dbc_files, "OCTBaseMPByClass", sGtOCTBaseMPByClassStore, dbcPath, "gtOCTBaseMPByClass.dbc");//19342 // error checks if (bad_dbc_files.size() >= DBCFileCount) @@ -692,11 +519,11 @@ void LoadDBCStores(const std::string& dataPath) } // Check loaded DBC files proper version - if (!sAreaStore.LookupEntry(6133) || // last area (areaflag) added in 6.0.3 (19342) - !sCharTitlesStore.LookupEntry(444) || // last char title added in 6.0.3 (19342) - !sGemPropertiesStore.LookupEntry(2534) || // last gem property added in 6.0.3 (19342) - !sMapStore.LookupEntry(1447) || // last map added in 6.0.3 (19342) - !sSpellStore.LookupEntry(178987) ) // last spell added in 6.0.3 (19342) + if (!sAreaStore.LookupEntry(6420) || // last area (areaflag) added in 6.2.0 (20216) + !sCharTitlesStore.LookupEntry(457) || // last char title added in 6.2.0 (20216) + !sGemPropertiesStore.LookupEntry(2544) || // last gem property added in 6.2.0 (20216) + !sMapStore.LookupEntry(1497) || // last map added in 6.2.0 (20216) + !sSpellStore.LookupEntry(191981) ) // last spell added in 6.2.0 (20216) { TC_LOG_ERROR("misc", "You have _outdated_ DBC files. Please extract correct versions from current using client."); exit(1); @@ -705,10 +532,56 @@ void LoadDBCStores(const std::string& dataPath) TC_LOG_INFO("server.loading", ">> Initialized %d DBC data stores in %u ms", DBCFileCount, GetMSTimeDiffToNow(oldMSTime)); } -std::string const& GetRandomCharacterName(uint8 race, uint8 gender) +void LoadGameTables(const std::string& dataPath) { - ASSERT(gender < GENDER_NONE); - return Trinity::Containers::SelectRandomContainerElement(sGenerateNamesMap[race].Contents[gender]); + uint32 oldMSTime = getMSTime(); + + std::string dbcPath = dataPath + "dbc/"; + + StoreProblemList bad_dbc_files; + +#define LOAD_GT(tableName, store, file) LoadGameTable(bad_dbc_files, tableName, store, dbcPath, file) + + LOAD_GT("BarberShopCostBase", sGtBarberShopCostBaseStore, "gtBarberShopCostBase.dbc"); // 19342 + LOAD_GT("CombatRatings", sGtCombatRatingsStore, "gtCombatRatings.dbc"); // 19342 + LOAD_GT("ChanceToMeleeCritBase", sGtChanceToMeleeCritBaseStore, "gtChanceToMeleeCritBase.dbc"); // 19342 + LOAD_GT("ChanceToMeleeCrit", sGtChanceToMeleeCritStore, "gtChanceToMeleeCrit.dbc"); // 19342 + LOAD_GT("ChanceToSpellCritBase", sGtChanceToSpellCritBaseStore, "gtChanceToSpellCritBase.dbc"); // 19342 + LOAD_GT("ChanceToSpellCrit", sGtChanceToSpellCritStore, "gtChanceToSpellCrit.dbc"); // 19342 + LOAD_GT("ItemSocketCostPerLevel", sGtItemSocketCostPerLevelStore, "gtItemSocketCostPerLevel.dbc"); // 19342 + LOAD_GT("NPCManaCostScaler", sGtNPCManaCostScalerStore, "gtNPCManaCostScaler.dbc"); // 19342 + LOAD_GT("NpcTotalHp", sGtNpcTotalHpStore, "gtNpcTotalHp.dbc"); // 19445 + LOAD_GT("NpcTotalHpExp1", sGtNpcTotalHpExp1Store, "gtNpcTotalHpExp1.dbc"); // 19445 + LOAD_GT("NpcTotalHpExp2", sGtNpcTotalHpExp2Store, "gtNpcTotalHpExp2.dbc"); // 19445 + LOAD_GT("NpcTotalHpExp3", sGtNpcTotalHpExp3Store, "gtNpcTotalHpExp3.dbc"); // 19445 + LOAD_GT("NpcTotalHpExp4", sGtNpcTotalHpExp4Store, "gtNpcTotalHpExp4.dbc"); // 19445 + LOAD_GT("NpcTotalHpExp5", sGtNpcTotalHpExp5Store, "gtNpcTotalHpExp5.dbc"); // 19445 + LOAD_GT("OCTHPPerStamina", sGtOCTHpPerStaminaStore, "gtOCTHpPerStamina.dbc"); // 19342 + LOAD_GT("OCTLevelExperience", sGtOCTLevelExperienceStore, "gtOCTLevelExperience.dbc"); // 19342 + LOAD_GT("RegenMPPerSpt", sGtRegenMPPerSptStore, "gtRegenMPPerSpt.dbc"); // 19342 + LOAD_GT("SpellScaling", sGtSpellScalingStore, "gtSpellScaling.dbc"); // 19342 + LOAD_GT("OCTBaseHPByClass", sGtOCTBaseHPByClassStore, "gtOCTBaseHPByClass.dbc"); // 19342 + LOAD_GT("OCTBaseMPByClass", sGtOCTBaseMPByClassStore, "gtOCTBaseMPByClass.dbc"); // 19342 + +#undef LOAD_GT + + // error checks + if (bad_dbc_files.size() >= GameTableCount) + { + TC_LOG_ERROR("misc", "Incorrect DataDir value in worldserver.conf or ALL required *.dbc GameTable files (%d) not found by path: %sdbc", DBCFileCount, dataPath.c_str()); + exit(1); + } + else if (!bad_dbc_files.empty()) + { + std::string str; + for (StoreProblemList::iterator i = bad_dbc_files.begin(); i != bad_dbc_files.end(); ++i) + str += *i + "\n"; + + TC_LOG_ERROR("misc", "Some required *.dbc GameTable files (%u from %d) not found or not compatible:\n%s", (uint32)bad_dbc_files.size(), GameTableCount, str.c_str()); + exit(1); + } + + TC_LOG_INFO("server.loading", ">> Initialized %d DBC GameTables data stores in %u ms", GameTableCount, GetMSTimeDiffToNow(oldMSTime)); } SimpleFactionsList const* GetFactionTeamList(uint32 faction) @@ -883,9 +756,9 @@ void Map2ZoneCoordinates(float& x, float& y, uint32 zone) std::swap(x, y); // client have map coords swapped } -MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapID) +MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty /*= nullptr*/) { - auto itr = sMapDifficultyMap.find(mapID); + auto itr = sMapDifficultyMap.find(mapId); if (itr == sMapDifficultyMap.end()) return nullptr; @@ -894,14 +767,22 @@ MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapID) for (auto& p : itr->second) { - DifficultyEntry const* difficulty = sDifficultyStore.LookupEntry(p.first); - if (!difficulty) + DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(p.first); + if (!difficultyEntry) continue; - if (difficulty->Flags & DIFFICULTY_FLAG_DEFAULT) + if (difficultyEntry->Flags & DIFFICULTY_FLAG_DEFAULT) + { + if (difficulty) + *difficulty = Difficulty(p.first); + return p.second; + } } + if (difficulty) + *difficulty = Difficulty(itr->second.begin()->first); + return itr->second.begin()->second; } @@ -922,7 +803,7 @@ MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficult { DifficultyEntry const* diffEntry = sDifficultyStore.LookupEntry(difficulty); if (!diffEntry) - return GetDefaultMapDifficulty(mapId); + return GetDefaultMapDifficulty(mapId, &difficulty); uint32 tmpDiff = difficulty; MapDifficultyEntry const* mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); @@ -931,7 +812,7 @@ MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficult tmpDiff = diffEntry->FallbackDifficultyID; diffEntry = sDifficultyStore.LookupEntry(tmpDiff); if (!diffEntry) - return GetDefaultMapDifficulty(mapId); + return GetDefaultMapDifficulty(mapId, &difficulty); // pull new data mapDiff = GetMapDifficultyData(mapId, Difficulty(tmpDiff)); // we are 10 normal or 25 normal @@ -983,20 +864,6 @@ uint32 GetLiquidFlags(uint32 liquidType) return 0; } -CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender) -{ - std::map<uint32, CharStartOutfitEntry const*>::const_iterator itr = sCharStartOutfitMap.find(race | (class_ << 8) | (gender << 16)); - if (itr == sCharStartOutfitMap.end()) - return NULL; - - return itr->second; -} - -uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId) -{ - return PowersByClass[classId][powerType]; -} - CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color) { std::pair<CharSectionsMap::const_iterator, CharSectionsMap::const_iterator> eqr = sCharSectionMap.equal_range(uint32(genType) | uint32(gender << 8) | uint32(race << 16)); @@ -1055,30 +922,3 @@ SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, u return NULL; } - -uint32 GetQuestUniqueBitFlag(uint32 questId) -{ - QuestV2Entry const* v2 = sQuestV2Store.LookupEntry(questId); - if (!v2) - return 0; - - return v2->UniqueBitFlag; -} - -std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId) -{ - auto itr = sSpecializationSpellsBySpecStore.find(specId); - if (itr != sSpecializationSpellsBySpecStore.end()) - return &itr->second; - - return nullptr; -} - -std::vector<ItemSpecOverrideEntry const*> const* GetItemSpecOverrides(uint32 itemId) -{ - auto itr = sItemSpecOverridesStore.find(itemId); - if (itr != sItemSpecOverridesStore.end()) - return &itr->second; - - return nullptr; -} diff --git a/src/server/game/DataStores/DBCStores.h b/src/server/game/DataStores/DBCStores.h index 286c4d5e6c3..0ec7df693ee 100644 --- a/src/server/game/DataStores/DBCStores.h +++ b/src/server/game/DataStores/DBCStores.h @@ -21,6 +21,7 @@ #include "DBCStore.h" #include "DBCStructure.h" +#include "DB2Structure.h" #include "SharedDefines.h" typedef std::list<uint32> SimpleFactionsList; @@ -40,10 +41,6 @@ WMOAreaTableEntry const* GetWMOAreaTableEntryByTripple(int32 rootid, int32 adtid uint32 GetVirtualMapForMapAndZone(uint32 mapid, uint32 zoneId); -std::string const& GetRandomCharacterName(uint8 race, uint8 gender); - -std::vector<ItemSpecOverrideEntry const*> const* GetItemSpecOverrides(uint32 itemId); - enum ContentLevels { CONTENT_1_60 = 0, @@ -66,7 +63,7 @@ void Zone2MapCoordinates(float &x, float &y, uint32 zone); void Map2ZoneCoordinates(float &x, float &y, uint32 zone); typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyMap; -MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapID); +MapDifficultyEntry const* GetDefaultMapDifficulty(uint32 mapId, Difficulty* difficulty = nullptr); MapDifficultyEntry const* GetMapDifficultyData(uint32 mapId, Difficulty difficulty); MapDifficultyEntry const* GetDownscaledMapDifficultyData(uint32 mapId, Difficulty &difficulty); @@ -75,22 +72,17 @@ uint32 GetLiquidFlags(uint32 liquidType); PvPDifficultyEntry const* GetBattlegroundBracketByLevel(uint32 mapid, uint32 level); PvPDifficultyEntry const* GetBattlegroundBracketById(uint32 mapid, BattlegroundBracketId id); -CharStartOutfitEntry const* GetCharStartOutfitEntry(uint8 race, uint8 class_, uint8 gender); CharSectionsEntry const* GetCharSectionEntry(uint8 race, CharSectionType genType, uint8 gender, uint8 type, uint8 color); -uint32 GetPowerIndexByClass(uint32 powerType, uint32 classId); LFGDungeonEntry const* GetLFGDungeon(uint32 mapId, Difficulty difficulty); uint32 GetDefaultMapLight(uint32 mapId); -uint32 GetQuestUniqueBitFlag(uint32 questId); - typedef std::unordered_multimap<uint32, SkillRaceClassInfoEntry const*> SkillRaceClassInfoMap; typedef std::pair<SkillRaceClassInfoMap::iterator, SkillRaceClassInfoMap::iterator> SkillRaceClassInfoBounds; SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_); typedef ChrSpecializationEntry const* ChrSpecializationByIndexArray[MAX_CLASSES][MAX_SPECIALIZATIONS]; -std::vector<SpecializationSpellsEntry const*> const* GetSpecializationSpells(uint32 specId); typedef std::vector<TalentEntry const*> TalentsByPosition[MAX_CLASSES][MAX_TALENT_TIERS][MAX_TALENT_COLUMNS]; extern TalentsByPosition sTalentByPos; @@ -127,34 +119,24 @@ extern DBCStorage <AnimKitEntry> sAnimKitStore; extern DBCStorage <AreaTableEntry> sAreaStore;// recommend access using functions extern DBCStorage <AreaTriggerEntry> sAreaTriggerStore; extern DBCStorage <ArmorLocationEntry> sArmorLocationStore; -extern DBCStorage <AuctionHouseEntry> sAuctionHouseStore; extern DBCStorage <BankBagSlotPricesEntry> sBankBagSlotPricesStore; extern DBCStorage <BannedAddOnsEntry> sBannedAddOnsStore; -extern DBCStorage <BarberShopStyleEntry> sBarberShopStyleStore; extern DBCStorage <BattlemasterListEntry> sBattlemasterListStore; extern DBCStorage <ChatChannelsEntry> sChatChannelsStore; -extern DBCStorage <CharStartOutfitEntry> sCharStartOutfitStore; extern DBCStorage <CharSectionsEntry> sCharSectionsStore; extern DBCStorage <CharTitlesEntry> sCharTitlesStore; extern DBCStorage <ChrClassesEntry> sChrClassesStore; extern DBCStorage <ChrRacesEntry> sChrRacesStore; -extern DBCStorage <ChrPowerTypesEntry> sChrPowerTypesStore; extern DBCStorage <ChrSpecializationEntry> sChrSpecializationStore; extern ChrSpecializationByIndexArray sChrSpecializationByIndexStore; -extern DBCStorage <CinematicSequencesEntry> sCinematicSequencesStore; -extern DBCStorage <CreatureDisplayInfoEntry> sCreatureDisplayInfoStore; extern DBCStorage <CreatureDisplayInfoExtraEntry> sCreatureDisplayInfoExtraStore; extern DBCStorage <CreatureFamilyEntry> sCreatureFamilyStore; extern DBCStorage <CreatureModelDataEntry> sCreatureModelDataStore; -extern DBCStorage <CreatureSpellDataEntry> sCreatureSpellDataStore; -extern DBCStorage <CreatureTypeEntry> sCreatureTypeStore; extern DBCStorage <CriteriaEntry> sCriteriaStore; extern DBCStorage <CriteriaTreeEntry> sCriteriaTreeStore; -extern DBCStorage <DestructibleModelDataEntry> sDestructibleModelDataStore; extern DBCStorage <DifficultyEntry> sDifficultyStore; extern DBCStorage <DungeonEncounterEntry> sDungeonEncounterStore; extern DBCStorage <DurabilityCostsEntry> sDurabilityCostsStore; -extern DBCStorage <DurabilityQualityEntry> sDurabilityQualityStore; extern DBCStorage <EmotesEntry> sEmotesStore; extern DBCStorage <EmotesTextEntry> sEmotesTextStore; extern DBCStorage <FactionEntry> sFactionStore; @@ -162,7 +144,6 @@ extern DBCStorage <FactionTemplateEntry> sFactionTemplateStore; extern DBCStorage <GameObjectDisplayInfoEntry> sGameObjectDisplayInfoStore; extern DBCStorage <GemPropertiesEntry> sGemPropertiesStore; extern DBCStorage <GlyphPropertiesEntry> sGlyphPropertiesStore; -extern DBCStorage <GlyphSlotEntry> sGlyphSlotStore; extern GameTable <GtBarberShopCostBaseEntry> sGtBarberShopCostBaseStore; extern GameTable <GtCombatRatingsEntry> sGtCombatRatingsStore; @@ -184,16 +165,12 @@ extern GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; extern GameTable <GtSpellScalingEntry> sGtSpellScalingStore; extern GameTable <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; extern GameTable <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; -extern DBCStorage <GuildPerkSpellsEntry> sGuildPerkSpellsStore; -extern DBCStorage <ImportPriceArmorEntry> sImportPriceArmorStore; -extern DBCStorage <ImportPriceQualityEntry> sImportPriceQualityStore; -extern DBCStorage <ImportPriceShieldEntry> sImportPriceShieldStore; -extern DBCStorage <ImportPriceWeaponEntry> sImportPriceWeaponStore; -extern DBCStorage <ItemPriceBaseEntry> sItemPriceBaseStore; +extern DBCStorage <GuildColorBackgroundEntry> sGuildColorBackgroundStore; +extern DBCStorage <GuildColorBorderEntry> sGuildColorBorderStore; +extern DBCStorage <GuildColorEmblemEntry> sGuildColorEmblemStore; extern DBCStorage <ItemArmorQualityEntry> sItemArmorQualityStore; extern DBCStorage <ItemArmorShieldEntry> sItemArmorShieldStore; extern DBCStorage <ItemArmorTotalEntry> sItemArmorTotalStore; -extern DBCStorage <ItemClassEntry> sItemClassStore; extern DBCStorage <ItemBagFamilyEntry> sItemBagFamilyStore; extern DBCStorage <ItemDamageEntry> sItemDamageAmmoStore; extern DBCStorage <ItemDamageEntry> sItemDamageOneHandStore; @@ -203,51 +180,30 @@ extern DBCStorage <ItemDamageEntry> sItemDamageThrownStore; extern DBCStorage <ItemDamageEntry> sItemDamageTwoHandStore; extern DBCStorage <ItemDamageEntry> sItemDamageTwoHandCasterStore; extern DBCStorage <ItemDamageEntry> sItemDamageWandStore; -//extern DBCStorage <ItemDisplayInfoEntry> sItemDisplayInfoStore; -- not used currently -extern DBCStorage <ItemDisenchantLootEntry> sItemDisenchantLootStore; -extern DBCStorage <ItemLimitCategoryEntry> sItemLimitCategoryStore; -extern DBCStorage <ItemRandomPropertiesEntry> sItemRandomPropertiesStore; -extern DBCStorage <ItemRandomSuffixEntry> sItemRandomSuffixStore; extern DBCStorage <ItemSetEntry> sItemSetStore; extern DBCStorage <ItemSetSpellEntry> sItemSetSpellStore; extern ItemSetSpellsStore sItemSetSpellsStore; -extern DBCStorage <ItemSpecOverrideEntry> sItemSpecOverrideStore; -extern DBCStorage <ItemSpecEntry> sItemSpecStore; extern DBCStorage <LFGDungeonEntry> sLFGDungeonStore; extern DBCStorage <LiquidTypeEntry> sLiquidTypeStore; extern DBCStorage <LockEntry> sLockStore; -extern DBCStorage <MailTemplateEntry> sMailTemplateStore; extern DBCStorage <MapEntry> sMapStore; extern DBCStorage <MinorTalentEntry> sMinorTalentStore; extern DBCStorage <ModifierTreeEntry> sModifierTreeStore; -extern DBCStorage <MountCapabilityEntry> sMountCapabilityStore; -extern DBCStorage <MountTypeEntry> sMountTypeStore; -extern DBCStorage <NameGenEntry> sNameGenStore; extern DBCStorage <PhaseEntry> sPhaseStore; -//extern DBCStorage <MapDifficultyEntry> sMapDifficultyStore; -- use GetMapDifficultyData insteed extern MapDifficultyMap sMapDifficultyMap; extern DBCStorage <MovieEntry> sMovieStore; extern DBCStorage <PowerDisplayEntry> sPowerDisplayStore; -extern DBCStorage <QuestSortEntry> sQuestSortStore; -extern DBCStorage <QuestXPEntry> sQuestXPStore; extern DBCStorage <QuestFactionRewEntry> sQuestFactionRewardStore; extern DBCStorage <RandomPropertiesPointsEntry> sRandomPropertiesPointsStore; -extern DBCStorage <ScalingStatDistributionEntry> sScalingStatDistributionStore; extern DBCStorage <SkillLineEntry> sSkillLineStore; extern DBCStorage <SkillLineAbilityEntry> sSkillLineAbilityStore; extern DBCStorage <SkillRaceClassInfoEntry> sSkillRaceClassInfoStore; -extern DBCStorage <SkillTiersEntry> sSkillTiersStore; extern SpellEffectScallingByEffectId sSpellEffectScallingByEffectId; -extern DBCStorage <SpellCastTimesEntry> sSpellCastTimesStore; extern DBCStorage <SpellCategoryEntry> sSpellCategoryStore; -extern DBCStorage <SpellDurationEntry> sSpellDurationStore; extern DBCStorage <SpellFocusObjectEntry> sSpellFocusObjectStore; extern DBCStorage <SpellItemEnchantmentEntry> sSpellItemEnchantmentStore; -extern DBCStorage <SpellItemEnchantmentConditionEntry> sSpellItemEnchantmentConditionStore; extern SpellCategoryStore sSpellsByCategoryStore; extern PetFamilySpellsStore sPetFamilySpellsStore; -extern DBCStorage <SpellRadiusEntry> sSpellRadiusStore; -extern DBCStorage <SpellRangeEntry> sSpellRangeStore; extern DBCStorage <SpellShapeshiftEntry> sSpellShapeshiftStore; extern DBCStorage <SpellShapeshiftFormEntry> sSpellShapeshiftFormStore; extern DBCStorage <SpellEntry> sSpellStore; @@ -264,15 +220,13 @@ extern DBCStorage <SpellTargetRestrictionsEntry> sSpellTargetRestrictionsStore; //extern DBCStorage <StableSlotPricesEntry> sStableSlotPricesStore; extern DBCStorage <SummonPropertiesEntry> sSummonPropertiesStore; extern DBCStorage <TalentEntry> sTalentStore; -extern DBCStorage <TotemCategoryEntry> sTotemCategoryStore; -extern DBCStorage <UnitPowerBarEntry> sUnitPowerBarStore; extern DBCStorage <VehicleEntry> sVehicleStore; extern DBCStorage <VehicleSeatEntry> sVehicleSeatStore; extern DBCStorage <WMOAreaTableEntry> sWMOAreaTableStore; //extern DBCStorage <WorldMapAreaEntry> sWorldMapAreaStore; -- use Zone2MapCoordinates and Map2ZoneCoordinates -extern DBCStorage <WorldMapOverlayEntry> sWorldMapOverlayStore; extern DBCStorage <WorldSafeLocsEntry> sWorldSafeLocsStore; void LoadDBCStores(const std::string& dataPath); +void LoadGameTables(const std::string& dataPath); #endif diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index f8f140ff02b..774e20bb16d 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -123,15 +123,6 @@ struct ArmorLocationEntry float Modifier[5]; // 1-5 multiplier for armor types (cloth...plate, no armor?) }; -struct AuctionHouseEntry -{ - uint32 ID; // 0 - uint32 FactionID; // 1 id of faction.dbc for player factions associated with city - uint32 DepositRate; // 2 1/3 from real - uint32 ConsignmentRate; // 3 - //char* Name_lang; // 4 -}; - struct BankBagSlotPricesEntry { uint32 ID; // 0 @@ -147,18 +138,6 @@ struct BannedAddOnsEntry //uint32 Flags; // 4 }; -struct BarberShopStyleEntry -{ - uint32 ID; // 0 - uint32 Type; // 1 value 0 -> hair, value 2 -> facialhair - //char* DisplayName_lang; // 2 - //char* Description_lang // 3 - float CostModifier; // 4 - uint32 Race; // 5 - uint32 Sex; // 6 - uint32 Data; // 7 (real ID to hair/facial hair) -}; - struct BattlemasterListEntry { uint32 ID; // 0 @@ -179,20 +158,6 @@ struct BattlemasterListEntry //uint32 Unk1; // 30 }; -#define MAX_OUTFIT_ITEMS 24 - -struct CharStartOutfitEntry -{ - //uint32 ID; // 0 - uint8 RaceID; // 1 - uint8 ClassID; // 2 - uint8 GenderID; // 3 - //uint8 OutfitID; // 4 - int32 ItemID[MAX_OUTFIT_ITEMS]; // 5-28 - uint32 PetDisplayID; // 29 Pet Model ID for starting pet - uint32 PetFamilyID; // 30 Pet Family Entry for starting pet -}; - enum CharSectionFlags { SECTION_FLAG_PLAYER = 0x01, @@ -302,13 +267,6 @@ struct ChrRacesEntry //uint32 Unk; // 39 }; -struct ChrPowerTypesEntry -{ - uint32 ID; // 0 - uint32 ClassID; // 1 - uint32 PowerType; // 2 -}; - #define MAX_MASTERY_SPELLS 2 struct ChrSpecializationEntry @@ -329,36 +287,6 @@ struct ChrSpecializationEntry uint32 PrimaryStatOrder[2]; // 13-14 }; -struct CinematicSequencesEntry -{ - uint32 ID; // 0 - //uint32 SoundID; // 1 - //uint32 Camera[8]; // 2-9 -}; - -struct CreatureDisplayInfoEntry -{ - uint32 ID; // 0 - uint32 ModelID; // 1 - //uint32 SoundID; // 2 - uint32 ExtendedDisplayInfoID; // 3 - float CreatureModelScale; // 4 - //uint32 CreatureModelAlpha; // 5 - //char* TextureVariation[3]; // 6-8 - //char* PortraitTextureName; // 9 - //uint32 PortraitCreatureDisplayInfoID; // 10 - //uint32 SizeClass; // 11 - //uint32 BloodID; // 12 - //uint32 NPCSoundID; // 13 - //uint32 ParticleColorID; // 14 - //uint32 CreatureGeosetData; // 15 - //uint32 ObjectEffectPackageID; // 16 - //uint32 AnimReplacementSetID; // 17 - //uint32 Flags; // 18 - int32 Gender; // 19 - //uint32 StateSpellVisualKitID; // 20 -}; - struct CreatureDisplayInfoExtraEntry { //uint32 ID; // 0 @@ -424,22 +352,6 @@ struct CreatureModelDataEntry //float HoverHeight; // 33 }; -#define MAX_CREATURE_SPELL_DATA_SLOT 4 - -struct CreatureSpellDataEntry -{ - uint32 ID; // 0 - uint32 Spells[MAX_CREATURE_SPELL_DATA_SLOT]; // 1-4 - //uint32 Availability[MAX_CREATURE_SPELL_DATA_SLOT]; // 4-7 -}; - -struct CreatureTypeEntry -{ - uint32 ID; // 0 - //char* Name_lang; // 1 - //uint32 Flags; // 2 no exp? critters, non-combat pets, gas cloud. -}; - struct CriteriaEntry { uint32 ID; // 0 @@ -596,46 +508,6 @@ struct CurrencyCategoryEntry }; */ -struct DestructibleModelDataEntry -{ - uint32 ID; // 0 - struct - { - uint32 DisplayID; // 1 - //uint32 ImpactEffectDoodadSet; // 2 - //uint32 AmbientDoodadSet; // 3 - //uint32 NameSet; // 4 - } StateDamaged; - struct - { - uint32 DisplayID; // 5 - //uint32 DestructionDoodadSet; // 6 - //uint32 ImpactEffectDoodadSet; // 7 - //uint32 AmbientDoodadSet; // 8 - //uint32 NameSet; // 9 - } StateDestroyed; - struct - { - uint32 DisplayID; // 10 - //uint32 DestructionDoodadSet; // 11 - //uint32 ImpactEffectDoodadSet; // 12 - //uint32 AmbientDoodadSet; // 13 - //uint32 NameSet; // 14 - } StateRebuilding; - struct - { - uint32 DisplayID; // 15 - //uint32 InitDoodadSet; // 16 - //uint32 AmbientDoodadSet; // 17 - //uint32 NameSet; // 18 - } StateSmoke; - //uint32 EjectDirection; // 19 - //uint32 RepairGroundFx; // 20 - //uint32 DoNotHighlight; // 21 - //uint32 HealEffect; // 22 - //uint32 HealEffectSpeed; // 23 -}; - struct DifficultyEntry { uint32 ID; // 0 @@ -651,6 +523,7 @@ struct DifficultyEntry //uint32 GroupSizeSpellPointsCurveID; // 10 //char const* NameLang; // 11 uint32 ItemBonusTreeModID; // 12 + //uint32 OrderIndex; // 13 }; struct DungeonEncounterEntry @@ -673,12 +546,6 @@ struct DurabilityCostsEntry uint32 ArmorSubClassCost[8]; // 23-30 }; -struct DurabilityQualityEntry -{ - uint32 ID; // 0 - float QualityMod; // 1 -}; - struct EmotesEntry { uint32 ID; // 0 @@ -793,14 +660,6 @@ struct GameObjectDisplayInfoEntry //float OverrideNameScale; // 20 }; -struct GameTablesEntry -{ - //uint32 Index; // 0 - not a real field, not counted for columns - char const* Name; // 1 - uint32 NumRows; // 2 - uint32 NumColumns; // 3 -}; - struct GemPropertiesEntry { uint32 ID; // 0 @@ -820,13 +679,6 @@ struct GlyphPropertiesEntry //uint32 GlyphExclusiveCategoryID; // 4 }; -struct GlyphSlotEntry -{ - uint32 ID; // 0 - uint32 Type; // 1 - //uint32 Tooltip; // 2 -}; - struct GtBarberShopCostBaseEntry { //uint32 level; @@ -946,50 +798,31 @@ struct GtOCTBaseMPByClassEntry float ratio; }; -struct GuildPerkSpellsEntry +// GuildColorBackground.dbc +struct GuildColorBackgroundEntry { - //uint32 ID; // 0 - uint32 GuildLevel; // 1 - uint32 SpellID; // 2 -}; - -// ImportPriceArmor.dbc -struct ImportPriceArmorEntry -{ - uint32 ID; // 1 Id/InventoryType - float ClothFactor; // 2 Price factor cloth - float LeatherFactor; // 3 Price factor leather - float MailFactor; // 4 Price factor mail - float PlateFactor; // 5 Price factor plate -}; - -// ImportPriceQuality.dbc -struct ImportPriceQualityEntry -{ - uint32 ID; // 1 Quality Id (+1?) - float Factor; // 2 Price factor -}; - -// ImportPriceShield.dbc -struct ImportPriceShieldEntry -{ - uint32 ID; // 1 Unk id (only 1 and 2) - float Factor; // 2 Price factor + uint32 ID; + //uint8 Red; + //uint8 Green; + //uint8 Blue; }; -// ImportPriceWeapon.dbc -struct ImportPriceWeaponEntry +// GuildColorBorder.dbc +struct GuildColorBorderEntry { - uint32 ID; // 1 Unk id (mainhand - 0, offhand - 1, weapon - 2, 2hweapon - 3, ranged/rangedright/relic - 4) - float Factor; // 2 Price factor + uint32 ID; + //uint8 Red; + //uint8 Green; + //uint8 Blue; }; -// ItemPriceBase.dbc -struct ItemPriceBaseEntry +// GuildColorEmblem.dbc +struct GuildColorEmblemEntry { - uint32 ItemLevel; // 2 Item level (1 - 1000) - float ArmorFactor; // 3 Price factor for armor - float WeaponFactor; // 4 Price factor for weapons + uint32 ID; + //uint8 Red; + //uint8 Green; + //uint8 Blue; }; // common struct for: @@ -1029,15 +862,6 @@ struct ItemArmorTotalEntry float Value[4]; // 2-5 multiplier for armor types (cloth...plate) }; -// ItemClass.dbc -struct ItemClassEntry -{ - uint32 ID; // 0 item class id - //uint32 Flags; // 1 Weapon - 1, others - 0 - float PriceMod; // 2 used to calculate certain prices - //char* Name_lang; // 3 class name -}; - struct ItemBagFamilyEntry { uint32 ID; // 0 @@ -1058,44 +882,6 @@ struct ItemDisplayInfoEntry //uint32 ParticleColorID; // 22 }; -struct ItemDisenchantLootEntry -{ - uint32 ID; // 0 - uint32 ItemClass; // 1 - int32 ItemSubClass; // 2 - uint32 ItemQuality; // 3 - uint32 MinItemLevel; // 4 - uint32 MaxItemLevel; // 5 - uint32 RequiredDisenchantSkill; // 6 -}; - -struct ItemLimitCategoryEntry -{ - uint32 ID; // 0 Id - //char* Name_lang; // 1 m_name_lang - uint32 Quantity; // 2, m_quantity max allowed equipped as item or in gem slot - uint32 Flags; // 3, m_flags 0 = have, 1 = equip (enum ItemLimitCategoryMode) -}; - -#define MAX_ITEM_RANDOM_PROPERTIES 5 - -struct ItemRandomPropertiesEntry -{ - uint32 ID; // 0 - //char* Name; // 1 - uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 2-6 - char* Name_lang; // 7 -}; - -struct ItemRandomSuffixEntry -{ - uint32 ID; // 0 - char* Name_lang; // 1 - //char* InternalName; // 2 - uint32 Enchantment[MAX_ITEM_RANDOM_PROPERTIES]; // 3-7 - uint32 AllocationPct[MAX_ITEM_RANDOM_PROPERTIES];// 8-12 -}; - #define MAX_ITEM_SET_ITEMS 17 #define MAX_ITEM_SET_SPELLS 8 @@ -1120,24 +906,6 @@ struct ItemSetSpellEntry typedef std::vector<ItemSetSpellEntry const*> ItemSetSpells; typedef std::unordered_map<uint32, ItemSetSpells> ItemSetSpellsStore; -struct ItemSpecEntry -{ - uint32 ID; // 0 - uint32 MinLevel; // 1 - uint32 MaxLevel; // 2 - uint32 ItemType; // 3 - uint32 PrimaryStat; // 4 - uint32 SecondaryStat; // 5 - uint32 SpecID; // 6 -}; - -struct ItemSpecOverrideEntry -{ - uint32 ID; // 0 - uint32 ItemID; // 1 - uint32 SpecID; // 2 -}; - struct LFGDungeonEntry { uint32 ID; // 0 @@ -1161,14 +929,15 @@ struct LFGDungeonEntry //uint32 CountTank; // 18 //uint32 CountHealer; // 19 //uint32 CountDamage; // 20 - //uint32 ScenarioID; // 21 - //uint32 SubType; // 22 - //uint32 BonusReputationAmount; // 23 - //uint32 MentorCharLevel; // 24 - //uint32 MentorItemLevel; // 25 - //uint32 Unk1; // 26 (300 for random dungeons, others 0) - //uint32 Unk2; // 27 - //uint32 Unk3; // 28 + //uint32 MinCountTank; // 21 + //uint32 MinCountHealer; // 22 + //uint32 MinCountDamage; // 23 + //uint32 ScenarioID; // 24 + //uint32 SubType; // 25 + //uint32 LastBossJournalEncounterID; // 26 + //uint32 BonusReputationAmount; // 27 + //uint32 MentorCharLevel; // 28 + //uint32 MentorItemLevel; // 29 // Helpers uint32 Entry() const { return ID + (Type << 24); } @@ -1203,8 +972,8 @@ struct LiquidTypeEntry //uint32 MaterialID; // 14 //char* Texture[6]; // 15-20 //uint32 Color[2]; // 21-23 - //float Unk1[18]; // 24-41 - //uint32 Unk2[4]; // 42-45 + //float Float[18]; // 24-41 + //uint32 Int[4]; // 42-45 //uint32 Unk3[5]; // 46-50 }; @@ -1225,13 +994,6 @@ struct PhaseEntry uint32 Flags; // 1 }; -struct MailTemplateEntry -{ - uint32 ID; // 0 - //char* Subject_lang; // 1 - char* Body_lang; // 2 -}; - struct MapEntry { uint32 ID; // 0 @@ -1319,26 +1081,6 @@ struct ModifierTreeEntry uint32 Parent; // 6 }; -struct MountCapabilityEntry -{ - uint32 ID; // 0 - uint32 Flags; // 1 - uint32 RequiredRidingSkill; // 2 - uint32 RequiredArea; // 3 - uint32 RequiredAura; // 4 - uint32 RequiredSpell; // 5 - uint32 SpeedModSpell; // 6 - int32 RequiredMap; // 7 -}; - -#define MAX_MOUNT_CAPABILITIES 24 - -struct MountTypeEntry -{ - uint32 ID; // 0 - uint32 MountCapability[MAX_MOUNT_CAPABILITIES]; // 1-24 -}; - struct MovieEntry { uint32 ID; // 0 index @@ -1348,14 +1090,6 @@ struct MovieEntry //uint32 SubtitleFileDataID; // 4 }; -struct NameGenEntry -{ - //uint32 ID; // 0 - char* Name; // 1 - uint32 Race; // 2 - uint32 Sex; // 3 -}; - struct PowerDisplayEntry { uint32 ID; // 0 @@ -1378,24 +1112,6 @@ struct PvPDifficultyEntry BattlegroundBracketId GetBracketId() const { return BattlegroundBracketId(BracketID); } }; -struct QuestSortEntry -{ - uint32 ID; // 0 - //char* SortName_lang; // 1 -}; - -struct QuestV2Entry -{ - uint32 ID; // 0 - uint32 UniqueBitFlag; // 1 -}; - -struct QuestXPEntry -{ - uint32 ID; // 0 - uint32 Exp[10]; // 1 -}; - struct QuestFactionRewEntry { uint32 ID; // 0 @@ -1410,21 +1126,6 @@ struct RandomPropertiesPointsEntry uint32 UncommonPropertiesPoints[5]; // 11-15 }; -struct ScalingStatDistributionEntry -{ - uint32 ID; // 0 - uint32 MinLevel; // 1 - uint32 MaxLevel; // 2 m_maxlevel - uint32 ItemLevelCurveID; // 3 -}; - -//struct SkillLineCategoryEntry{ -// uint32 id; // 0 m_ID -// char* name[16]; // 1-17 m_name_lang -// // 18 string flag -// uint32 displayOrder; // 19 m_sortIndex -//}; - struct SkillLineEntry { uint32 ID; // 0 m_ID @@ -1467,24 +1168,6 @@ struct SkillRaceClassInfoEntry uint32 SkillTierID; // 7 }; -#define MAX_SKILL_STEP 16 - -struct SkillTiersEntry -{ - uint32 ID; // 0 - uint32 Value[MAX_SKILL_STEP]; // 1-16 -}; - -// SpecializationSpells.dbc -struct SpecializationSpellsEntry -{ - uint32 ID; // 0 - uint32 SpecID; // 1 - uint32 SpellID; // 2 - uint32 OverridesSpellID; // 3 - //char* Description_lang; // 4 -}; - // SpellEffect.dbc struct SpellEffectEntry { @@ -1594,14 +1277,6 @@ typedef std::set<uint32> PetFamilySpellsSet; typedef std::map<uint32, PetFamilySpellsSet > PetFamilySpellsStore; typedef std::unordered_map<uint32, uint32> SpellEffectScallingByEffectId; -struct SpellCastTimesEntry -{ - uint32 ID; // 0 - int32 CastTime; // 1 - //float CastTimePerLevel; // 2 unsure / per skill? - //int32 MinCastTime; // 3 unsure -}; - struct SpellCategoryEntry { uint32 ID; // 0 @@ -1619,27 +1294,6 @@ struct SpellFocusObjectEntry //char* Name_lang; // 1 }; -struct SpellRadiusEntry -{ - uint32 ID; // 0 - //float Radius; // 1 - float RadiusPerLevel; // 2 - float RadiusMin; // 3 - float RadiusMax; // 4 -}; - -struct SpellRangeEntry -{ - uint32 ID; // 0 - float MinRangeHostile; // 1 - float MinRangeFriend; // 2 - float MaxRangeHostile; // 3 - float MaxRangeFriend; // 4 friend means unattackable unit here - uint32 Flags; // 5 - //char* DisplayName_lang; // 6 - //char* DisplayNameShort_lang; // 7 -}; - // SpellEquippedItems.dbc struct SpellEquippedItemsEntry { @@ -1738,12 +1392,6 @@ struct SpellScalingEntry uint32 ScalesFromItemLevel; // 8 }; -struct SpellDurationEntry -{ - uint32 ID; - int32 Duration[3]; -}; - #define MAX_ITEM_ENCHANTMENT_EFFECTS 3 struct SpellItemEnchantmentEntry @@ -1768,17 +1416,6 @@ struct SpellItemEnchantmentEntry float EffectScalingPoints[MAX_ITEM_ENCHANTMENT_EFFECTS];//23-25 }; -struct SpellItemEnchantmentConditionEntry -{ - uint32 ID; // 0 - uint8 LTOperandType[5]; // 1-2 - uint32 LTOperand[5]; // 2-6 - uint8 Operator[5]; // 7-8 - uint8 RTOperandType[5]; // 8-9 - uint32 RTOperand[5]; // 10-14 - uint8 Logic[5]; // 15-16 -}; - struct StableSlotPricesEntry { uint32 Slot; @@ -1812,55 +1449,6 @@ struct TalentEntry //char* Description_lang }; -struct TotemCategoryEntry -{ - uint32 ID; // 0 - //char* Name_lang; // 1 m_name_lang - uint32 CategoryType; // 2 m_totemCategoryType (one for specialization) - uint32 CategoryMask; // 3 m_totemCategoryMask (compatibility mask for same type: different for totems, compatible from high to low for rods) -}; - -struct UnitPowerBarEntry -{ - uint32 ID; // 0 - uint32 MinPower; // 1 - uint32 MaxPower; // 2 - //uint32 StartPower; // 3 - //uint32 CenterPower; // 4 - //float RegenerationPeace; // 5 - //float RegenerationCombat; // 6 - //uint32 BarType; // 7 - //uint32 FileDataID[6]; // 8-13 - //uint32 Color[6]; // 14-19 - //uint32 Flags; // 20 - //char* Name_lang; // 21 - //char* Cost_lang; // 22 - //char* OutOfError_lang; // 23 - //char* ToolTip_lang; // 24 - //float StartInset; // 25 - //float EndInset; // 26 -}; - -struct TransportAnimationEntry -{ - //uint32 ID; // 0 - uint32 TransportID; // 1 - uint32 TimeIndex; // 2 - DBCPosition3D Pos; // 3-5 - //uint32 SequenceID; // 6 -}; - -struct TransportRotationEntry -{ - //uint32 ID; // 0 - uint32 TransportID; // 1 - uint32 TimeIndex; // 2 - float X; // 3 - float Y; // 4 - float Z; // 5 - float W; // 6 -}; - #define MAX_VEHICLE_SEATS 8 struct VehicleEntry @@ -2007,25 +1595,6 @@ struct WorldMapAreaEntry //uint32 LevelRangeMax; // 13 Maximum recommended level displayed on world map }; -#define MAX_WORLD_MAP_OVERLAY_AREA_IDX 4 - -struct WorldMapOverlayEntry -{ - uint32 ID; // 0 - //uint32 MapAreaID; // 1 idx in WorldMapArea.dbc - uint32 AreaID[MAX_WORLD_MAP_OVERLAY_AREA_IDX]; // 2-5 - //char* TextureName; // 6 - //uint32 TextureWidth; // 7 - //uint32 TextureHeight; // 8 - //uint32 OffsetX; // 9 - //uint32 OffsetY; // 10 - //uint32 HitRectTop; // 11 - //uint32 HitRectLeft; // 12 - //uint32 HitRectBottom; // 13 - //uint32 HitRectRight; // 14 - //uint32 PlayerConditionID; // 15 -}; - struct WorldSafeLocsEntry { uint32 ID; // 0 @@ -2073,12 +1642,5 @@ struct WorldStateUI #pragma pack(pop) -struct VectorArray -{ - std::vector<std::string> Contents[2]; -}; - -typedef std::map<uint32, VectorArray> NameGenContainer; - typedef std::map<uint32, uint32> TalentSpellPosMap; #endif diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index a67ec26ed7c..7ba4c3c293b 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -29,42 +29,30 @@ char const AnimKitfmt[] = "nxxx"; char const AreaTableEntryfmt[] = "iiiniixxxxxxisiiiiixxxxxxxxxx"; char const AreaTriggerEntryfmt[] = "nifffxxxfffffxxxx"; char const ArmorLocationfmt[] = "nfffff"; -char const AuctionHouseEntryfmt[] = "niiix"; char const BankBagSlotPricesEntryfmt[] = "ni"; char const BannedAddOnsfmt[] = "nxxxxxxxxxx"; -char const BarberShopStyleEntryfmt[] = "nixxfiii"; char const BattlemasterListEntryfmt[] = "niiiiiiiiiiiiiiiiixsiiiixxxxxxx"; -char const CharStartOutfitEntryfmt[] = "dbbbXiiiiiiiiiiiiiiiiiiiiiiiiii"; char const CharSectionsEntryfmt[] = "diiixxxiii"; char const CharTitlesEntryfmt[] = "nxssix"; char const ChatChannelsEntryfmt[] = "nixsx"; char const ChrClassesEntryfmt[] = "nixsxxxixiiiiixxxxx"; char const ChrRacesEntryfmt[] = "niixiixxxxxxiisxxxxxxxxxxxxxxxxxxxxxxxxx"; -char const ChrClassesXPowerTypesfmt[] = "nii"; char const ChrSpecializationEntryfmt[] = "nxiiiiiiiiixxxii"; -char const CinematicSequencesEntryfmt[] = "nxxxxxxxxx"; -char const CreatureDisplayInfofmt[] = "nixifxxxxxxxxxxxxxxix"; char const CreatureDisplayInfoExtrafmt[] = "dixxxxxxxxxxxxxxxxxxxx"; char const CreatureFamilyfmt[] = "nfifiiiiixsx"; char const CreatureModelDatafmt[] = "nixxxxxxxxxxxxxffxxxxxxxxxxxxxxxxx"; -char const CreatureSpellDatafmt[] = "niiiixxxx"; -char const CreatureTypefmt[] = "nxx"; char const Criteriafmt[] = "niiiiiiiixii"; char const CriteriaTreefmt[] = "niliixxx"; -char const DestructibleModelDatafmt[] = "nixxxixxxxixxxxixxxxxxxx"; -char const DifficultyFmt[] = "niiiixiixxxxi"; +char const DifficultyFmt[] = "niiiixiixxxxix"; char const DungeonEncounterfmt[] = "niiixsxxx"; char const DurabilityCostsfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiiiiiii"; -char const DurabilityQualityfmt[] = "nf"; char const EmotesEntryfmt[] = "nxxiiixx"; char const EmotesTextEntryfmt[] = "nxixxxxxxxxxxxxxxxx"; char const FactionEntryfmt[] = "niiiiiiiiiiiiiiiiiiffixsxixx"; char const FactionTemplateEntryfmt[] = "niiiiiiiiiiiii"; char const GameObjectDisplayInfofmt[] = "nixxxxxxxxxxffffffxxx"; -char const GameTablesFmt[] = "dsii"; char const GemPropertiesEntryfmt[] = "nixxii"; char const GlyphPropertiesfmt[] = "niiix"; -char const GlyphSlotfmt[] = "nix"; char const GtBarberShopCostBasefmt[] = "xf"; char const GtCombatRatingsfmt[] = "xf"; char const GtOCTHpPerStaminafmt[] = "df"; @@ -87,59 +75,36 @@ char const GtRegenMPPerSptfmt[] = "xf"; char const GtSpellScalingfmt[] = "df"; char const GtOCTBaseHPByClassfmt[] = "df"; char const GtOCTBaseMPByClassfmt[] = "df"; -char const GuildPerkSpellsfmt[] = "dii"; -char const ImportPriceArmorfmt[] = "nffff"; -char const ImportPriceQualityfmt[] = "nf"; -char const ImportPriceShieldfmt[] = "nf"; -char const ImportPriceWeaponfmt[] = "nf"; -char const ItemPriceBasefmt[] = "diff"; +char const GuildColorBackgroundfmt[] = "nXXX"; +char const GuildColorBorderfmt[] = "nXXX"; +char const GuildColorEmblemfmt[] = "nXXX"; char const ItemBagFamilyfmt[] = "nx"; char const ItemArmorQualityfmt[] = "nfffffffi"; char const ItemArmorShieldfmt[] = "nifffffff"; char const ItemArmorTotalfmt[] = "niffff"; -char const ItemClassfmt[] = "nxfx"; char const ItemDamagefmt[] = "nfffffffi"; -char const ItemDisenchantLootfmt[] = "niiiiii"; -//char const ItemDisplayTemplateEntryfmt[] = "nxxxxxxxxxxixxxxxxxxxxx"; -char const ItemLimitCategoryEntryfmt[] = "nxii"; -char const ItemRandomPropertiesfmt[] = "nxiiiiis"; -char const ItemRandomSuffixfmt[] = "nsxiiiiiiiiii"; char const ItemSetEntryfmt[] = "nsiiiiiiiiiiiiiiiiiii"; char const ItemSetSpellEntryfmt[] = "niiii"; -char const ItemSpecEntryfmt[] = "niiiiii"; -char const ItemSpecOverrideEntryfmt[] = "nii"; -char const LFGDungeonEntryfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxx"; +char const LFGDungeonEntryfmt[] = "nsiiixxiiiixxixixxxxxxxxxxxxxx"; char const LightEntryfmt[] = "nifffxxxxxxxxxx"; char const LiquidTypefmt[] = "nxxixixxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; char const LockEntryfmt[] = "niiiiiiiiiiiiiiiiiiiiiiiixxxxxxxx"; -char const PhaseEntryfmt[] = "ni"; -char const MailTemplateEntryfmt[] = "nxs"; char const MapEntryfmt[] = "nxiixxsixxixiffxiiiiix"; char const MapDifficultyEntryfmt[] = "diisiiii"; char const MinorTalentEntryfmt[] = "niii"; char const MovieEntryfmt[] = "nxxxx"; char const ModifierTreefmt[] = "niiiiii"; -char const MountCapabilityfmt[] = "niiiiiii"; -char const MountTypefmt[] = "niiiiiiiiiiiiiiiiiiiiiiii"; -char const NameGenfmt[] = "dsii"; char const NumTalentsAtLevelfmt[] = "df"; +char const PhaseEntryfmt[] = "ni"; char const QuestFactionRewardfmt[] = "niiiiiiiiii"; -char const QuestSortEntryfmt[] = "nx"; -char const QuestV2fmt[] = "ni"; -char const QuestXPfmt[] = "niiiiiiiiii"; char const PowerDisplayfmt[] = "nixXXX"; char const PvPDifficultyfmt[] = "diiii"; char const RandomPropertiesPointsfmt[] = "niiiiiiiiiiiiiii"; -char const ScalingStatDistributionfmt[] = "niii"; char const SkillLinefmt[] = "nisxixixx"; char const SkillLineAbilityfmt[] = "niiiiiiiiiiii"; char const SkillRaceClassInfofmt[] = "diiiiiii"; -char const SkillTiersfmt[] = "niiiiiiiiiiiiiiii"; -char const SpecializationSpellsEntryfmt[] = "niiix"; -char const SpellCastTimefmt[] = "nixx"; char const SpellCategoriesEntryfmt[] = "diiiiiiiii"; char const SpellCategoryfmt[] = "nixxii"; -char const SpellDurationfmt[] = "niii"; char const SpellEffectEntryfmt[] = "iiifiiiffiiiiiifiifiiiiifiiiiif"; const std::string CustomSpellEffectEntryfmt = "ppppppppppppppappppppppppp"; const std::string CustomSpellEffectEntryIndex = "Id"; @@ -149,9 +114,6 @@ const std::string CustomSpellEntryIndex = "Id"; char const SpellEffectScalingfmt[] = "nfffi"; char const SpellFocusObjectfmt[] = "nx"; char const SpellItemEnchantmentfmt[] = "niiiiiiiiiixiiiiiiiiiiifff"; -char const SpellItemEnchantmentConditionfmt[] = "nbbbbbiiiiibbbbbbbbbbiiiiibbbbb"; -char const SpellRadiusfmt[] = "nxfff"; -char const SpellRangefmt[] = "nffffixx"; char const SpellScalingEntryfmt[] = "niiiifiii"; char const SpellTargetRestrictionsEntryfmt[] = "niiffiiii"; char const SpellInterruptsEntryfmt[] = "diiiiiii"; @@ -164,15 +126,10 @@ char const SpellShapeshiftFormfmt[] = "nxxiixiiiiiiiiiiiiixx"; char const StableSlotPricesfmt[] = "ni"; char const SummonPropertiesfmt[] = "niiiii"; char const TalentEntryfmt[] = "niiiiiiiiix"; -char const TotemCategoryEntryfmt[] = "nxii"; -char const UnitPowerBarfmt[] = "niixxxxxxxxxxxxxxxxxxxxxxxx"; -char const TransportAnimationfmt[] = "diifffx"; -char const TransportRotationfmt[] = "diiffff"; char const VehicleEntryfmt[] = "niiffffiiiiiiiifffffffffffffffxxxxfifiiii"; char const VehicleSeatEntryfmt[] = "niiffffffffffiiiiiifffffffiiifffiiiiiiiffiiiiffffffffffffiiiiiiiii"; char const WMOAreaTableEntryfmt[] = "niiixxxxxiixxxx"; char const WorldMapAreaEntryfmt[] = "xinxffffixxxxx"; -char const WorldMapOverlayEntryfmt[] = "nxiiiixxxxxxxxxx"; char const WorldSafeLocsEntryfmt[] = "niffffx"; #endif diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index e786c3b9c7c..ba21168086e 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -410,6 +410,8 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const joinData.result = LFG_JOIN_RANDOM_COOLDOWN; else if (dungeons.empty()) joinData.result = LFG_JOIN_NOT_MEET_REQS; + else if (player->HasAura(9454)) // check Freeze debuff + joinData.result = LFG_JOIN_NOT_MEET_REQS; else if (grp) { if (grp->GetMembersCount() > MAX_GROUP_SIZE) @@ -429,6 +431,8 @@ void LFGMgr::JoinLfg(Player* player, uint8 roles, LfgDungeonSet& dungeons, const joinData.result = LFG_JOIN_PARTY_RANDOM_COOLDOWN; else if (plrg->InBattleground() || plrg->InArena() || plrg->InBattlegroundQueue()) joinData.result = LFG_JOIN_USING_BG_SYSTEM; + else if (plrg->HasAura(9454)) // check Freeze debuff + joinData.result = LFG_JOIN_PARTY_NOT_MEET_REQS; ++memberCount; players.insert(plrg->GetGUID()); } @@ -1293,6 +1297,8 @@ void LFGMgr::TeleportPlayer(Player* player, bool out, bool fromOpcode /*= false* error = LFG_TELEPORTERROR_IN_VEHICLE; else if (!player->GetCharmGUID().IsEmpty()) error = LFG_TELEPORTERROR_CHARMING; + else if (player->HasAura(9454)) // check Freeze debuff + error = LFG_TELEPORTERROR_INVALID_LOCATION; else if (player->GetMapId() != uint32(dungeon->map)) // Do not teleport players in dungeon to the entrance { uint32 mapid = dungeon->map; diff --git a/src/server/game/DungeonFinding/LFGMgr.h b/src/server/game/DungeonFinding/LFGMgr.h index 5fd0decadaf..34996410fbe 100644 --- a/src/server/game/DungeonFinding/LFGMgr.h +++ b/src/server/game/DungeonFinding/LFGMgr.h @@ -98,7 +98,7 @@ enum LfgJoinResult LFG_JOIN_GROUPFULL = 0x1C, // Your group is full LFG_JOIN_INTERNAL_ERROR = 0x1E, // Internal LFG Error LFG_JOIN_NOT_MEET_REQS = 0x1F, // You do not meet the requirements for the chosen dungeons - //LFG_JOIN_PARTY_NOT_MEET_REQS = 6, // One or more party members do not meet the requirements for the chosen dungeons + LFG_JOIN_PARTY_NOT_MEET_REQS = 6, // One or more party members do not meet the requirements for the chosen dungeons (FIXME) LFG_JOIN_MIXED_RAID_DUNGEON = 0x20, // You cannot mix dungeons, raids, and random when picking dungeons LFG_JOIN_MULTI_REALM = 0x21, // The dungeon you chose does not support players from multiple realms LFG_JOIN_DISCONNECTED = 0x22, // One or more party members are pending invites or disconnected diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index b1ce1f0cdbb..b559c6dd2ba 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -75,7 +75,7 @@ bool AreaTrigger::CreateAreaTrigger(ObjectGuid::LowType guidlow, uint32 triggerE SetGuidValue(AREATRIGGER_CASTER, caster->GetGUID()); SetUInt32Value(AREATRIGGER_SPELLID, spell->Id); - SetUInt32Value(AREATRIGGER_SPELLVISUALID, spell->SpellVisual[0]); + SetUInt32Value(AREATRIGGER_SPELLVISUALID, spell->GetSpellVisual(GetMap()->GetDifficultyID())); SetUInt32Value(AREATRIGGER_DURATION, spell->GetDuration()); CopyPhaseFrom(caster); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 70a2ab2307a..81b29cdd400 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -1314,7 +1314,7 @@ void Creature::LoadEquipment(int8 id, bool force /*= true*/) if (force) { for (uint8 i = 0; i < MAX_EQUIPMENT_ITEMS; ++i) - SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, 0); + SetVirtualItem(i, 0); m_equipmentId = 0; } return; @@ -1325,8 +1325,8 @@ void Creature::LoadEquipment(int8 id, bool force /*= true*/) return; m_equipmentId = id; - for (uint8 i = 0; i < 3; ++i) - SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + i, einfo->ItemEntry[i]); + for (uint8 i = 0; i < MAX_EQUIPMENT_ITEMS; ++i) + SetVirtualItem(i, einfo->ItemEntry[i]); } bool Creature::hasQuest(uint32 quest_id) const @@ -1407,7 +1407,10 @@ bool Creature::CanStartAttack(Unit const* who, bool force) const if (IsCivilian()) return false; - if (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC)) + // This set of checks is should be done only for creatures + if ((HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC) && who->GetTypeId() != TYPEID_PLAYER) // flag is valid only for non player characters + || (HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC) && who->GetTypeId() == TYPEID_PLAYER) // immune to PC and target is a player, return false + || (who->GetOwner() && who->GetOwner()->GetTypeId() == TYPEID_PLAYER && HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC))) // player pets are immune to pc as well return false; // Do not attack non-combat pets @@ -1547,9 +1550,9 @@ void Creature::setDeathState(DeathState s) SetUInt64Value(UNIT_NPC_FLAGS, cinfo->npcflag); ClearUnitState(uint32(UNIT_STATE_ALL_STATE & ~UNIT_STATE_IGNORE_PATHFINDING)); SetMeleeDamageSchool(SpellSchools(cinfo->dmgschool)); - LoadCreaturesAddon(true); Motion_Initialize(); Unit::setDeathState(ALIVE); + LoadCreaturesAddon(true); } } @@ -2573,3 +2576,29 @@ void Creature::StartPickPocketRefillTimer() _pickpocketLootRestore = time(NULL) + sWorld->getIntConfig(CONFIG_CREATURE_PICKPOCKET_REFILL); } +void Creature::SetTextRepeatId(uint8 textGroup, uint8 id) +{ + CreatureTextRepeatIds& repeats = m_textRepeat[textGroup]; + if (std::find(repeats.begin(), repeats.end(), id) == repeats.end()) + repeats.push_back(id); + else + TC_LOG_ERROR("sql.sql", "CreatureTextMgr: TextGroup %u for Creature (%s) %s, id %u already added", uint32(textGroup), GetName().c_str(), GetGUID().ToString().c_str(), uint32(id)); +} + +CreatureTextRepeatIds Creature::GetTextRepeatGroup(uint8 textGroup) +{ + CreatureTextRepeatIds ids; + + CreatureTextRepeatGroup::const_iterator groupItr = m_textRepeat.find(textGroup); + if (groupItr != m_textRepeat.end()) + ids = groupItr->second; + + return ids; +} + +void Creature::ClearTextRepeatGroup(uint8 textGroup) +{ + CreatureTextRepeatGroup::iterator groupItr = m_textRepeat.find(textGroup); + if (groupItr != m_textRepeat.end()) + groupItr->second.clear(); +} diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index 0e985ff3648..17cef733e6c 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -119,7 +119,6 @@ struct CreatureTemplate uint32 SkinLootId; int32 resistance[MAX_SPELL_SCHOOL]; uint32 spells[CREATURE_MAX_SPELLS]; - uint32 PetSpellDataId; uint32 VehicleId; uint32 mingold; uint32 maxgold; @@ -270,8 +269,6 @@ struct PointOfInterestLocale StringVector Name; }; -#define MAX_EQUIPMENT_ITEMS 3 - struct EquipmentInfo { uint32 ItemEntry[MAX_EQUIPMENT_ITEMS]; @@ -457,6 +454,10 @@ typedef std::map<uint32, time_t> CreatureSpellCooldowns; #define MAX_VENDOR_ITEMS 150 // Limitation in 4.x.x item count in SMSG_LIST_INVENTORY +//used for handling non-repeatable random texts +typedef std::vector<uint8> CreatureTextRepeatIds; +typedef std::unordered_map<uint8, CreatureTextRepeatIds> CreatureTextRepeatGroup; + class Creature : public Unit, public GridObject<Creature>, public MapObject { public: @@ -694,6 +695,10 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject void FocusTarget(Spell const* focusSpell, WorldObject const* target); void ReleaseFocus(Spell const* focusSpell); + CreatureTextRepeatIds GetTextRepeatGroup(uint8 textGroup); + void SetTextRepeatId(uint8 textGroup, uint8 id); + void ClearTextRepeatGroup(uint8 textGroup); + protected: bool CreateFromProto(ObjectGuid::LowType guidlow, uint32 entry, CreatureData const* data = nullptr, uint32 vehId = 0); bool InitEntry(uint32 entry, CreatureData const* data = nullptr); @@ -758,6 +763,8 @@ class Creature : public Unit, public GridObject<Creature>, public MapObject bool TriggerJustRespawned; Spell const* _focusSpell; ///> Locks the target during spell cast for proper facing + + CreatureTextRepeatGroup m_textRepeat; }; class AssistDelayEvent : public BasicEvent diff --git a/src/server/game/Entities/Creature/GossipDef.cpp b/src/server/game/Entities/Creature/GossipDef.cpp index faa458d45dc..0fd001de69f 100644 --- a/src/server/game/Entities/Creature/GossipDef.cpp +++ b/src/server/game/Entities/Creature/GossipDef.cpp @@ -506,12 +506,12 @@ void PlayerMenu::SendQuestQueryResponse(Quest const* quest) const packet.Info.RewardNextQuest = quest->GetNextQuestInChain(); packet.Info.RewardXPDifficulty = quest->GetXPDifficulty(); packet.Info.RewardXPMultiplier = quest->GetXPMultiplier(); - packet.Info.Float13 = quest->Float13; // Unk - if (quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS)) - packet.Info.RewardMoney = quest->RewardMoney; + if (!quest->HasFlag(QUEST_FLAGS_HIDDEN_REWARDS)) + packet.Info.RewardMoney = quest->RewardMoney < 0 ? quest->RewardMoney : _session->GetPlayer()->GetQuestMoneyReward(quest); packet.Info.RewardMoneyDifficulty = quest->GetRewMoneyDifficulty(); + packet.Info.RewardMoneyMultiplier = quest->GetMoneyMultiplier(); packet.Info.RewardBonusMoney = quest->GetRewMoneyMaxLevel(); packet.Info.RewardDisplaySpell = quest->GetRewDisplaySpell(); packet.Info.RewardSpell = quest->GetRewSpell(); diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 5f2bd4915de..a90d2832de9 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -97,7 +97,7 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste SetEntry(spell->Id); SetObjectScale(1.0f); SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID()); - SetUInt32Value(DYNAMICOBJECT_BYTES, spell->SpellVisual[0] | (type << 28)); + SetUInt32Value(DYNAMICOBJECT_BYTES, spell->GetSpellVisual(GetMap()->GetDifficultyID()) | (type << 28)); SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id); SetFloatValue(DYNAMICOBJECT_RADIUS, radius); SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime()); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index da2257641d5..7d044d24567 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1815,6 +1815,9 @@ void GameObject::Use(Unit* user) return; } + if (Player* player = user->ToPlayer()) + sOutdoorPvPMgr->HandleCustomSpell(player, spellId, this); + if (spellCaster) spellCaster->CastSpell(user, spellInfo, triggered); else @@ -2420,7 +2423,7 @@ void GameObject::UpdateModelPosition() if (GetMap()->ContainsGameObjectModel(*m_model)) { GetMap()->RemoveGameObjectModel(*m_model); - m_model->Relocate(*this); + m_model->UpdatePosition(); GetMap()->InsertGameObjectModel(*m_model); } } diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index ee429c95475..c00cbe1d350 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -400,7 +400,7 @@ struct GameObjectTemplate // 27 GAMEOBJECT_TYPE_MINI_GAME struct { - } DONOTUSE3; + } miniGame; // 28 GAMEOBJECT_TYPE_DO_NOT_USE_2 struct { @@ -584,7 +584,7 @@ struct GameObjectTemplate struct { int32 mapID; // 0 mapID, References: Map, NoValue = -1 - int32 namedset; // 1 named set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 + int32 namedset; // 1 named set (Area Names), int, Min value: -2147483648, Max value: 2147483647, Default value: 0 uint32 Primarydoodadset; // 2 Primary doodad set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 uint32 Secondarydoodadset; // 3 Secondary doodad set, int, Min value: -2147483648, Max value: 2147483647, Default value: 0 } phaseableMO; @@ -598,12 +598,23 @@ struct GameObjectTemplate struct { uint32 ShipmentContainer; // 0 Shipment Container, References: CharShipmentContainer, NoValue = 0 + uint32 GiganticAOI; // 1 Gigantic AOI, enum { false, true, }; Default: false + uint32 LargeAOI; // 2 Large AOI, enum { false, true, }; Default: false } garrisonShipment; // 46 GAMEOBJECT_TYPE_GARRISON_MONUMENT_PLAQUE struct { uint32 TrophyInstanceID; // 0 Trophy Instance ID, References: TrophyInstance, NoValue = 0 } garrisonMonumentPlaque; + // 47 GAMEOBJECT_TYPE_DO_NOT_USE_3 + struct + { + } DONOTUSE3; + // 48 GAMEOBJECT_TYPE_UI_LINK + struct + { + uint32 UILinkType; // 0 UI Link Type, Type id: 10 + } UILink; struct { uint32 data[MAX_GAMEOBJECT_DATA]; @@ -1065,6 +1076,7 @@ class GameObject : public WorldObject, public GridObject<GameObject>, public Map float GetStationaryY() const override { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return m_stationaryPosition.GetPositionY(); return GetPositionY(); } float GetStationaryZ() const override { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return m_stationaryPosition.GetPositionZ(); return GetPositionZ(); } float GetStationaryO() const override { if (GetGOInfo()->type != GAMEOBJECT_TYPE_MAP_OBJ_TRANSPORT) return m_stationaryPosition.GetOrientation(); return GetOrientation(); } + void RelocateStationaryPosition(float x, float y, float z, float o) { m_stationaryPosition.Relocate(x, y, z, o); } float GetInteractionDistance() const; diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 655af613220..efe4303c961 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -411,7 +411,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const // *data << ObjectGuid(RemoveForcesIDs); data->WriteBits(unit->GetUnitMovementFlags(), 30); - data->WriteBits(unit->GetExtraUnitMovementFlags(), 15); + data->WriteBits(unit->GetExtraUnitMovementFlags(), 16); data->WriteBit(!unit->m_movementInfo.transport.guid.IsEmpty()); // HasTransport data->WriteBit(HasFall); // HasFall data->WriteBit(HasSpline); // HasSpline - marks that the unit uses spline movement @@ -451,6 +451,7 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint32 flags) const //{ // *data << ObjectGuid(ID); // *data << Vector3(Direction); + // *data << Vector3(force.TransportPosition); // *data << int32(TransportID); // *data << float(Magnitude); // *data << uint8(Type); @@ -953,6 +954,9 @@ uint32 Object::GetDynamicUpdateFieldData(Player const* target, uint32*& flags) c visibleFlag |= UF_FLAG_PARTY_MEMBER; break; } + case TYPEID_GAMEOBJECT: + flags = GameObjectDynamicUpdateFieldFlags; + break; case TYPEID_CONVERSATION: flags = ConversationDynamicUpdateFieldFlags; break; @@ -3112,10 +3116,10 @@ void WorldObject::SetAIAnimKitId(uint16 animKitId) m_aiAnimKitId = animKitId; - WorldPacket data(SMSG_SET_AI_ANIM_KIT, 8 + 2); - data << GetPackGUID(); - data << uint16(animKitId); - SendMessageToSet(&data, true); + WorldPackets::Misc::SetAIAnimKit data; + data.Unit = GetGUID(); + data.AnimKitID = animKitId; + SendMessageToSet(data.Write(), true); } void WorldObject::SetMovementAnimKitId(uint16 animKitId) diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp index dbd83bb5d9c..57b75f43237 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.cpp @@ -311,6 +311,7 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC | UF_FLAG_URGENT, // UNIT_FIELD_CHANNEL_OBJECT+2 UF_FLAG_PUBLIC | UF_FLAG_URGENT, // UNIT_FIELD_CHANNEL_OBJECT+3 UF_FLAG_PUBLIC | UF_FLAG_URGENT, // UNIT_CHANNEL_SPELL + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // UNIT_CHANNEL_SPELL_X_SPELL_VISUAL UF_FLAG_PUBLIC, // UNIT_FIELD_SUMMONED_BY_HOME_REALM UF_FLAG_PUBLIC, // UNIT_FIELD_BYTES_0 UF_FLAG_PUBLIC, // UNIT_FIELD_DISPLAY_POWER @@ -347,6 +348,9 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+1 UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+2 + UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+3 + UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+4 + UF_FLAG_PUBLIC, // UNIT_VIRTUAL_ITEM_SLOT_ID+5 UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS_2 UF_FLAG_PUBLIC, // UNIT_FIELD_FLAGS_3 @@ -1274,32 +1278,15 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+35 UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+36 UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+37 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+38 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+39 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+40 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+41 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+42 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+43 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+44 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+45 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+46 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+47 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+48 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+49 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+50 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+51 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+52 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+53 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+54 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+55 - UF_FLAG_PUBLIC, // PLAYER_VISIBLE_ITEM+56 UF_FLAG_PUBLIC, // PLAYER_CHOSEN_TITLE UF_FLAG_PUBLIC, // PLAYER_FAKE_INEBRIATION UF_FLAG_PUBLIC, // PLAYER_FIELD_VIRTUAL_PLAYER_REALM UF_FLAG_PUBLIC, // PLAYER_FIELD_CURRENT_SPEC_ID UF_FLAG_PUBLIC, // PLAYER_FIELD_TAXI_MOUNT_ANIM_KIT_ID - UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL_TOTAL - UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL_EQUIPPED + UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL + UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL+1 + UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL+2 + UF_FLAG_PUBLIC, // PLAYER_FIELD_AVG_ITEM_LEVEL+3 UF_FLAG_PUBLIC, // PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD UF_FLAG_PRIVATE, // PLAYER_FIELD_INV_SLOT_HEAD+1 @@ -2740,6 +2727,62 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+197 UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+198 UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+199 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+200 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+201 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+202 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+203 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+204 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+205 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+206 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+207 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+208 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+209 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+210 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+211 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+212 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+213 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+214 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+215 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+216 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+217 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+218 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+219 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+220 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+221 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+222 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+223 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+224 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+225 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+226 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+227 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+228 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+229 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+230 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+231 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+232 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+233 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+234 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+235 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+236 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+237 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+238 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+239 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+240 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+241 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+242 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+243 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+244 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+245 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+246 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+247 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+248 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+249 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+250 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+251 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+252 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+253 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+254 + UF_FLAG_PRIVATE, // PLAYER_EXPLORED_ZONES_1+255 UF_FLAG_PRIVATE, // PLAYER_REST_STATE_EXPERIENCE UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS UF_FLAG_PRIVATE, // PLAYER_FIELD_MOD_DAMAGE_DONE_POS+1 @@ -3562,6 +3605,256 @@ uint32 UnitUpdateFieldFlags[PLAYER_END] = UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+622 UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+623 UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+624 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+625 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+626 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+627 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+628 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+629 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+630 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+631 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+632 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+633 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+634 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+635 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+636 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+637 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+638 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+639 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+640 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+641 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+642 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+643 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+644 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+645 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+646 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+647 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+648 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+649 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+650 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+651 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+652 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+653 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+654 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+655 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+656 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+657 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+658 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+659 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+660 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+661 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+662 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+663 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+664 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+665 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+666 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+667 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+668 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+669 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+670 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+671 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+672 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+673 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+674 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+675 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+676 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+677 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+678 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+679 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+680 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+681 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+682 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+683 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+684 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+685 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+686 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+687 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+688 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+689 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+690 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+691 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+692 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+693 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+694 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+695 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+696 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+697 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+698 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+699 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+700 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+701 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+702 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+703 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+704 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+705 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+706 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+707 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+708 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+709 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+710 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+711 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+712 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+713 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+714 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+715 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+716 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+717 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+718 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+719 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+720 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+721 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+722 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+723 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+724 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+725 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+726 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+727 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+728 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+729 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+730 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+731 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+732 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+733 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+734 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+735 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+736 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+737 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+738 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+739 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+740 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+741 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+742 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+743 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+744 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+745 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+746 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+747 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+748 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+749 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+750 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+751 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+752 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+753 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+754 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+755 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+756 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+757 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+758 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+759 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+760 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+761 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+762 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+763 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+764 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+765 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+766 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+767 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+768 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+769 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+770 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+771 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+772 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+773 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+774 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+775 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+776 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+777 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+778 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+779 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+780 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+781 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+782 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+783 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+784 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+785 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+786 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+787 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+788 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+789 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+790 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+791 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+792 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+793 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+794 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+795 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+796 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+797 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+798 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+799 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+800 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+801 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+802 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+803 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+804 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+805 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+806 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+807 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+808 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+809 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+810 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+811 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+812 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+813 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+814 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+815 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+816 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+817 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+818 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+819 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+820 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+821 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+822 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+823 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+824 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+825 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+826 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+827 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+828 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+829 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+830 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+831 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+832 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+833 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+834 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+835 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+836 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+837 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+838 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+839 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+840 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+841 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+842 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+843 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+844 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+845 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+846 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+847 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+848 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+849 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+850 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+851 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+852 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+853 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+854 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+855 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+856 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+857 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+858 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+859 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+860 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+861 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+862 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+863 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+864 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+865 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+866 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+867 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+868 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+869 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+870 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+871 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+872 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+873 + UF_FLAG_PRIVATE, // PLAYER_FIELD_QUEST_COMPLETED+874 }; uint32 UnitDynamicUpdateFieldFlags[PLAYER_DYNAMIC_END] = @@ -3604,7 +3897,7 @@ uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END] = UF_FLAG_PUBLIC, // GAMEOBJECT_FACTION UF_FLAG_PUBLIC, // GAMEOBJECT_LEVEL UF_FLAG_PUBLIC | UF_FLAG_URGENT, // GAMEOBJECT_BYTES_1 - UF_FLAG_PUBLIC | UF_FLAG_URGENT, // GAMEOBJECT_SPELL_VISUAL_ID + UF_FLAG_PUBLIC | UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // GAMEOBJECT_SPELL_VISUAL_ID UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // GAMEOBJECT_STATE_SPELL_VISUAL_ID UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // GAMEOBJECT_STATE_ANIM_ID UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // GAMEOBJECT_STATE_ANIM_KIT_ID @@ -3614,6 +3907,11 @@ uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END] = UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // GAMEOBJECT_STATE_WORLD_EFFECT_ID+3 }; +uint32 GameObjectDynamicUpdateFieldFlags[GAMEOBJECT_DYNAMIC_END] = +{ + UF_FLAG_PUBLIC, // GAMEOBJECT_DYNAMIC_ENABLE_DOODAD_SETS +}; + uint32 DynamicObjectUpdateFieldFlags[DYNAMICOBJECT_END] = { UF_FLAG_PUBLIC, // OBJECT_FIELD_GUID @@ -3701,13 +3999,22 @@ uint32 AreaTriggerUpdateFieldFlags[AREATRIGGER_END] = UF_FLAG_DYNAMIC, // OBJECT_FIELD_ENTRY UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // OBJECT_DYNAMIC_FLAGS UF_FLAG_PUBLIC, // OBJECT_FIELD_SCALE_X + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+1 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+2 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+3 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+4 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+5 + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_OVERRIDE_SCALE_CURVE+6 UF_FLAG_PUBLIC, // AREATRIGGER_CASTER UF_FLAG_PUBLIC, // AREATRIGGER_CASTER+1 UF_FLAG_PUBLIC, // AREATRIGGER_CASTER+2 UF_FLAG_PUBLIC, // AREATRIGGER_CASTER+3 UF_FLAG_PUBLIC, // AREATRIGGER_DURATION + UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_TIME_TO_TARGET_SCALE UF_FLAG_PUBLIC, // AREATRIGGER_SPELLID UF_FLAG_DYNAMIC, // AREATRIGGER_SPELLVISUALID + UF_FLAG_DYNAMIC | UF_FLAG_URGENT, // AREATRIGGER_BOUNDS_RADIUS_2D UF_FLAG_PUBLIC | UF_FLAG_URGENT, // AREATRIGGER_EXPLICIT_SCALE }; diff --git a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h index f8a8b5234c4..05d80608d68 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h +++ b/src/server/game/Entities/Object/Updates/UpdateFieldFlags.h @@ -42,6 +42,7 @@ extern uint32 ItemDynamicUpdateFieldFlags[CONTAINER_DYNAMIC_END]; extern uint32 UnitUpdateFieldFlags[PLAYER_END]; extern uint32 UnitDynamicUpdateFieldFlags[PLAYER_DYNAMIC_END]; extern uint32 GameObjectUpdateFieldFlags[GAMEOBJECT_END]; +extern uint32 GameObjectDynamicUpdateFieldFlags[GAMEOBJECT_DYNAMIC_END]; extern uint32 DynamicObjectUpdateFieldFlags[DYNAMICOBJECT_END]; extern uint32 CorpseUpdateFieldFlags[CORPSE_END]; extern uint32 AreaTriggerUpdateFieldFlags[AREATRIGGER_END]; diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h index 48d3bd4a02c..af37984bd98 100644 --- a/src/server/game/Entities/Object/Updates/UpdateFields.h +++ b/src/server/game/Entities/Object/Updates/UpdateFields.h @@ -19,7 +19,7 @@ #ifndef _UPDATEFIELDS_H #define _UPDATEFIELDS_H -// Auto generated for version 6, 1, 2, 19802 +// Auto generated for version 6, 2, 0, 20182 enum ObjectFields { @@ -91,88 +91,89 @@ enum UnitFields UNIT_FIELD_BATTLE_PET_DB_ID = OBJECT_END + 0x024, // Size: 2, Flags: PUBLIC UNIT_FIELD_CHANNEL_OBJECT = OBJECT_END + 0x026, // Size: 4, Flags: PUBLIC, URGENT UNIT_CHANNEL_SPELL = OBJECT_END + 0x02A, // Size: 1, Flags: PUBLIC, URGENT - UNIT_FIELD_SUMMONED_BY_HOME_REALM = OBJECT_END + 0x02B, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BYTES_0 = OBJECT_END + 0x02C, // Size: 1, Flags: PUBLIC - UNIT_FIELD_DISPLAY_POWER = OBJECT_END + 0x02D, // Size: 1, Flags: PUBLIC - UNIT_FIELD_OVERRIDE_DISPLAY_POWER_ID = OBJECT_END + 0x02E, // Size: 1, Flags: PUBLIC - UNIT_FIELD_HEALTH = OBJECT_END + 0x02F, // Size: 1, Flags: PUBLIC - UNIT_FIELD_POWER = OBJECT_END + 0x030, // Size: 6, Flags: PUBLIC, URGENT_SELF_ONLY - UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x036, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MAXPOWER = OBJECT_END + 0x037, // Size: 6, Flags: PUBLIC - UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x03D, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL - UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x043, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL - UNIT_FIELD_LEVEL = OBJECT_END + 0x049, // Size: 1, Flags: PUBLIC - UNIT_FIELD_EFFECTIVE_LEVEL = OBJECT_END + 0x04A, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x04B, // Size: 1, Flags: PUBLIC - UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x04C, // Size: 3, Flags: PUBLIC - UNIT_FIELD_FLAGS = OBJECT_END + 0x04F, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x050, // Size: 1, Flags: PUBLIC - UNIT_FIELD_FLAGS_3 = OBJECT_END + 0x051, // Size: 1, Flags: PUBLIC - UNIT_FIELD_AURASTATE = OBJECT_END + 0x052, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x053, // Size: 2, Flags: PUBLIC - UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x055, // Size: 1, Flags: PRIVATE - UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x056, // Size: 1, Flags: PUBLIC - UNIT_FIELD_COMBATREACH = OBJECT_END + 0x057, // Size: 1, Flags: PUBLIC - UNIT_FIELD_DISPLAYID = OBJECT_END + 0x058, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x059, // Size: 1, Flags: PUBLIC, URGENT - UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x05A, // Size: 1, Flags: PUBLIC, URGENT - UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x05B, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x05C, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x05D, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x05E, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_BYTES_1 = OBJECT_END + 0x05F, // Size: 1, Flags: PUBLIC - UNIT_FIELD_PETNUMBER = OBJECT_END + 0x060, // Size: 1, Flags: PUBLIC - UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x061, // Size: 1, Flags: PUBLIC - UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x062, // Size: 1, Flags: OWNER - UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x063, // Size: 1, Flags: OWNER - UNIT_MOD_CAST_SPEED = OBJECT_END + 0x064, // Size: 1, Flags: PUBLIC - UNIT_MOD_CAST_HASTE = OBJECT_END + 0x065, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MOD_HASTE = OBJECT_END + 0x066, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MOD_RANGED_HASTE = OBJECT_END + 0x067, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MOD_HASTE_REGEN = OBJECT_END + 0x068, // Size: 1, Flags: PUBLIC - UNIT_CREATED_BY_SPELL = OBJECT_END + 0x069, // Size: 1, Flags: PUBLIC - UNIT_NPC_FLAGS = OBJECT_END + 0x06A, // Size: 2, Flags: PUBLIC, DYNAMIC - UNIT_NPC_EMOTESTATE = OBJECT_END + 0x06C, // Size: 1, Flags: PUBLIC - UNIT_FIELD_STAT = OBJECT_END + 0x06D, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_POSSTAT = OBJECT_END + 0x072, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_NEGSTAT = OBJECT_END + 0x077, // Size: 5, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCES = OBJECT_END + 0x07C, // Size: 7, Flags: PRIVATE, OWNER, SPECIAL_INFO - UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x083, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x08A, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_MOD_BONUS_ARMOR = OBJECT_END + 0x091, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_BASE_MANA = OBJECT_END + 0x092, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x093, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_BYTES_2 = OBJECT_END + 0x094, // Size: 1, Flags: PUBLIC - UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x095, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MOD_POS = OBJECT_END + 0x096, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x097, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x098, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x099, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09A, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09B, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x09C, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x09D, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x09E, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x09F, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0A6, // Size: 7, Flags: PRIVATE, OWNER - UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x0AD, // Size: 1, Flags: PRIVATE, OWNER - UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x0AE, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MIN_ITEM_LEVEL_CUTOFF = OBJECT_END + 0x0AF, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MIN_ITEM_LEVEL = OBJECT_END + 0x0B0, // Size: 1, Flags: PUBLIC - UNIT_FIELD_MAXITEMLEVEL = OBJECT_END + 0x0B1, // Size: 1, Flags: PUBLIC - UNIT_FIELD_WILD_BATTLEPET_LEVEL = OBJECT_END + 0x0B2, // Size: 1, Flags: PUBLIC - UNIT_FIELD_BATTLEPET_COMPANION_NAME_TIMESTAMP = OBJECT_END + 0x0B3, // Size: 1, Flags: PUBLIC - UNIT_FIELD_INTERACT_SPELLID = OBJECT_END + 0x0B4, // Size: 1, Flags: PUBLIC - UNIT_FIELD_STATE_SPELL_VISUAL_ID = OBJECT_END + 0x0B5, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_ANIM_ID = OBJECT_END + 0x0B6, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_ANIM_KIT_ID = OBJECT_END + 0x0B7, // Size: 1, Flags: DYNAMIC, URGENT - UNIT_FIELD_STATE_WORLD_EFFECT_ID = OBJECT_END + 0x0B8, // Size: 4, Flags: DYNAMIC, URGENT - UNIT_FIELD_SCALE_DURATION = OBJECT_END + 0x0BC, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOKS_LIKE_MOUNT_ID = OBJECT_END + 0x0BD, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOKS_LIKE_CREATURE_ID = OBJECT_END + 0x0BE, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOK_AT_CONTROLLER_ID = OBJECT_END + 0x0BF, // Size: 1, Flags: PUBLIC - UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET = OBJECT_END + 0x0C0, // Size: 4, Flags: PUBLIC - UNIT_END = OBJECT_END + 0x0C4, + UNIT_CHANNEL_SPELL_X_SPELL_VISUAL = OBJECT_END + 0x02B, // Size: 1, Flags: PUBLIC, URGENT + UNIT_FIELD_SUMMONED_BY_HOME_REALM = OBJECT_END + 0x02C, // Size: 1, Flags: PUBLIC + UNIT_FIELD_BYTES_0 = OBJECT_END + 0x02D, // Size: 1, Flags: PUBLIC + UNIT_FIELD_DISPLAY_POWER = OBJECT_END + 0x02E, // Size: 1, Flags: PUBLIC + UNIT_FIELD_OVERRIDE_DISPLAY_POWER_ID = OBJECT_END + 0x02F, // Size: 1, Flags: PUBLIC + UNIT_FIELD_HEALTH = OBJECT_END + 0x030, // Size: 1, Flags: PUBLIC + UNIT_FIELD_POWER = OBJECT_END + 0x031, // Size: 6, Flags: PUBLIC, URGENT_SELF_ONLY + UNIT_FIELD_MAXHEALTH = OBJECT_END + 0x037, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MAXPOWER = OBJECT_END + 0x038, // Size: 6, Flags: PUBLIC + UNIT_FIELD_POWER_REGEN_FLAT_MODIFIER = OBJECT_END + 0x03E, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL + UNIT_FIELD_POWER_REGEN_INTERRUPTED_FLAT_MODIFIER = OBJECT_END + 0x044, // Size: 6, Flags: PRIVATE, OWNER, UNIT_ALL + UNIT_FIELD_LEVEL = OBJECT_END + 0x04A, // Size: 1, Flags: PUBLIC + UNIT_FIELD_EFFECTIVE_LEVEL = OBJECT_END + 0x04B, // Size: 1, Flags: PUBLIC + UNIT_FIELD_FACTIONTEMPLATE = OBJECT_END + 0x04C, // Size: 1, Flags: PUBLIC + UNIT_VIRTUAL_ITEM_SLOT_ID = OBJECT_END + 0x04D, // Size: 6, Flags: PUBLIC + UNIT_FIELD_FLAGS = OBJECT_END + 0x053, // Size: 1, Flags: PUBLIC + UNIT_FIELD_FLAGS_2 = OBJECT_END + 0x054, // Size: 1, Flags: PUBLIC + UNIT_FIELD_FLAGS_3 = OBJECT_END + 0x055, // Size: 1, Flags: PUBLIC + UNIT_FIELD_AURASTATE = OBJECT_END + 0x056, // Size: 1, Flags: PUBLIC + UNIT_FIELD_BASEATTACKTIME = OBJECT_END + 0x057, // Size: 2, Flags: PUBLIC + UNIT_FIELD_RANGEDATTACKTIME = OBJECT_END + 0x059, // Size: 1, Flags: PRIVATE + UNIT_FIELD_BOUNDINGRADIUS = OBJECT_END + 0x05A, // Size: 1, Flags: PUBLIC + UNIT_FIELD_COMBATREACH = OBJECT_END + 0x05B, // Size: 1, Flags: PUBLIC + UNIT_FIELD_DISPLAYID = OBJECT_END + 0x05C, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_NATIVEDISPLAYID = OBJECT_END + 0x05D, // Size: 1, Flags: PUBLIC, URGENT + UNIT_FIELD_MOUNTDISPLAYID = OBJECT_END + 0x05E, // Size: 1, Flags: PUBLIC, URGENT + UNIT_FIELD_MINDAMAGE = OBJECT_END + 0x05F, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_MAXDAMAGE = OBJECT_END + 0x060, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_MINOFFHANDDAMAGE = OBJECT_END + 0x061, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_MAXOFFHANDDAMAGE = OBJECT_END + 0x062, // Size: 1, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_BYTES_1 = OBJECT_END + 0x063, // Size: 1, Flags: PUBLIC + UNIT_FIELD_PETNUMBER = OBJECT_END + 0x064, // Size: 1, Flags: PUBLIC + UNIT_FIELD_PET_NAME_TIMESTAMP = OBJECT_END + 0x065, // Size: 1, Flags: PUBLIC + UNIT_FIELD_PETEXPERIENCE = OBJECT_END + 0x066, // Size: 1, Flags: OWNER + UNIT_FIELD_PETNEXTLEVELEXP = OBJECT_END + 0x067, // Size: 1, Flags: OWNER + UNIT_MOD_CAST_SPEED = OBJECT_END + 0x068, // Size: 1, Flags: PUBLIC + UNIT_MOD_CAST_HASTE = OBJECT_END + 0x069, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MOD_HASTE = OBJECT_END + 0x06A, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MOD_RANGED_HASTE = OBJECT_END + 0x06B, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MOD_HASTE_REGEN = OBJECT_END + 0x06C, // Size: 1, Flags: PUBLIC + UNIT_CREATED_BY_SPELL = OBJECT_END + 0x06D, // Size: 1, Flags: PUBLIC + UNIT_NPC_FLAGS = OBJECT_END + 0x06E, // Size: 2, Flags: PUBLIC, DYNAMIC + UNIT_NPC_EMOTESTATE = OBJECT_END + 0x070, // Size: 1, Flags: PUBLIC + UNIT_FIELD_STAT = OBJECT_END + 0x071, // Size: 5, Flags: PRIVATE, OWNER + UNIT_FIELD_POSSTAT = OBJECT_END + 0x076, // Size: 5, Flags: PRIVATE, OWNER + UNIT_FIELD_NEGSTAT = OBJECT_END + 0x07B, // Size: 5, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCES = OBJECT_END + 0x080, // Size: 7, Flags: PRIVATE, OWNER, SPECIAL_INFO + UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE = OBJECT_END + 0x087, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE = OBJECT_END + 0x08E, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_MOD_BONUS_ARMOR = OBJECT_END + 0x095, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_BASE_MANA = OBJECT_END + 0x096, // Size: 1, Flags: PUBLIC + UNIT_FIELD_BASE_HEALTH = OBJECT_END + 0x097, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_BYTES_2 = OBJECT_END + 0x098, // Size: 1, Flags: PUBLIC + UNIT_FIELD_ATTACK_POWER = OBJECT_END + 0x099, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09A, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09B, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x09C, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER = OBJECT_END + 0x09D, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS = OBJECT_END + 0x09E, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MOD_NEG = OBJECT_END + 0x09F, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER = OBJECT_END + 0x0A0, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_MINRANGEDDAMAGE = OBJECT_END + 0x0A1, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXRANGEDDAMAGE = OBJECT_END + 0x0A2, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MODIFIER = OBJECT_END + 0x0A3, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_POWER_COST_MULTIPLIER = OBJECT_END + 0x0AA, // Size: 7, Flags: PRIVATE, OWNER + UNIT_FIELD_MAXHEALTHMODIFIER = OBJECT_END + 0x0B1, // Size: 1, Flags: PRIVATE, OWNER + UNIT_FIELD_HOVERHEIGHT = OBJECT_END + 0x0B2, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MIN_ITEM_LEVEL_CUTOFF = OBJECT_END + 0x0B3, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MIN_ITEM_LEVEL = OBJECT_END + 0x0B4, // Size: 1, Flags: PUBLIC + UNIT_FIELD_MAXITEMLEVEL = OBJECT_END + 0x0B5, // Size: 1, Flags: PUBLIC + UNIT_FIELD_WILD_BATTLEPET_LEVEL = OBJECT_END + 0x0B6, // Size: 1, Flags: PUBLIC + UNIT_FIELD_BATTLEPET_COMPANION_NAME_TIMESTAMP = OBJECT_END + 0x0B7, // Size: 1, Flags: PUBLIC + UNIT_FIELD_INTERACT_SPELLID = OBJECT_END + 0x0B8, // Size: 1, Flags: PUBLIC + UNIT_FIELD_STATE_SPELL_VISUAL_ID = OBJECT_END + 0x0B9, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_STATE_ANIM_ID = OBJECT_END + 0x0BA, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_STATE_ANIM_KIT_ID = OBJECT_END + 0x0BB, // Size: 1, Flags: DYNAMIC, URGENT + UNIT_FIELD_STATE_WORLD_EFFECT_ID = OBJECT_END + 0x0BC, // Size: 4, Flags: DYNAMIC, URGENT + UNIT_FIELD_SCALE_DURATION = OBJECT_END + 0x0C0, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOKS_LIKE_MOUNT_ID = OBJECT_END + 0x0C1, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOKS_LIKE_CREATURE_ID = OBJECT_END + 0x0C2, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOK_AT_CONTROLLER_ID = OBJECT_END + 0x0C3, // Size: 1, Flags: PUBLIC + UNIT_FIELD_LOOK_AT_CONTROLLER_TARGET = OBJECT_END + 0x0C4, // Size: 4, Flags: PUBLIC + UNIT_END = OBJECT_END + 0x0C8, }; enum UnitDynamicFields @@ -198,106 +199,105 @@ enum PlayerFields PLAYER_DUEL_TEAM = UNIT_END + 0x014, // Size: 1, Flags: PUBLIC PLAYER_GUILD_TIMESTAMP = UNIT_END + 0x015, // Size: 1, Flags: PUBLIC PLAYER_QUEST_LOG = UNIT_END + 0x016, // Size: 750, Flags: PARTY_MEMBER - PLAYER_VISIBLE_ITEM = UNIT_END + 0x304, // Size: 57, Flags: PUBLIC - PLAYER_CHOSEN_TITLE = UNIT_END + 0x33D, // Size: 1, Flags: PUBLIC - PLAYER_FAKE_INEBRIATION = UNIT_END + 0x33E, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_VIRTUAL_PLAYER_REALM = UNIT_END + 0x33F, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_CURRENT_SPEC_ID = UNIT_END + 0x340, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_TAXI_MOUNT_ANIM_KIT_ID = UNIT_END + 0x341, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_AVG_ITEM_LEVEL_TOTAL = UNIT_END + 0x342, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_AVG_ITEM_LEVEL_EQUIPPED = UNIT_END + 0x343, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY = UNIT_END + 0x344, // Size: 1, Flags: PUBLIC - PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x345, // Size: 736, Flags: PRIVATE - PLAYER_FIELD_END_NOT_SELF = UNIT_END + 0x345, - PLAYER_FARSIGHT = UNIT_END + 0x625, // Size: 4, Flags: PRIVATE - PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x629, // Size: 10, Flags: PRIVATE - PLAYER_FIELD_COINAGE = UNIT_END + 0x633, // Size: 2, Flags: PRIVATE - PLAYER_XP = UNIT_END + 0x635, // Size: 1, Flags: PRIVATE - PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x636, // Size: 1, Flags: PRIVATE - PLAYER_SKILL_LINEID = UNIT_END + 0x637, // Size: 448, Flags: PRIVATE - PLAYER_CHARACTER_POINTS = UNIT_END + 0x7F7, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MAX_TALENT_TIERS = UNIT_END + 0x7F8, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_CREATURES = UNIT_END + 0x7F9, // Size: 1, Flags: PRIVATE - PLAYER_TRACK_RESOURCES = UNIT_END + 0x7FA, // Size: 1, Flags: PRIVATE - PLAYER_EXPERTISE = UNIT_END + 0x7FB, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x7FC, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RANGED_EXPERTISE = UNIT_END + 0x7FD, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_EXPERTISE = UNIT_END + 0x7FE, // Size: 1, Flags: PRIVATE - PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x7FF, // Size: 1, Flags: PRIVATE - PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x800, // Size: 1, Flags: PRIVATE - PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x801, // Size: 1, Flags: PRIVATE - PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x802, // Size: 1, Flags: PRIVATE - PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x803, // Size: 1, Flags: PRIVATE - PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x804, // Size: 1, Flags: PRIVATE - PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x805, // Size: 7, Flags: PRIVATE - PLAYER_SHIELD_BLOCK = UNIT_END + 0x80C, // Size: 1, Flags: PRIVATE - PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x80D, // Size: 1, Flags: PRIVATE - PLAYER_MASTERY = UNIT_END + 0x80E, // Size: 1, Flags: PRIVATE - PLAYER_AMPLIFY = UNIT_END + 0x80F, // Size: 1, Flags: PRIVATE - PLAYER_MULTISTRIKE = UNIT_END + 0x810, // Size: 1, Flags: PRIVATE - PLAYER_MULTISTRIKE_EFFECT = UNIT_END + 0x811, // Size: 1, Flags: PRIVATE - PLAYER_READINESS = UNIT_END + 0x812, // Size: 1, Flags: PRIVATE - PLAYER_SPEED = UNIT_END + 0x813, // Size: 1, Flags: PRIVATE - PLAYER_LIFESTEAL = UNIT_END + 0x814, // Size: 1, Flags: PRIVATE - PLAYER_AVOIDANCE = UNIT_END + 0x815, // Size: 1, Flags: PRIVATE - PLAYER_STURDINESS = UNIT_END + 0x816, // Size: 1, Flags: PRIVATE - PLAYER_CLEAVE = UNIT_END + 0x817, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY = UNIT_END + 0x818, // Size: 1, Flags: PRIVATE - PLAYER_VERSATILITY_BONUS = UNIT_END + 0x819, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_DAMAGE = UNIT_END + 0x81A, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_POWER_HEALING = UNIT_END + 0x81B, // Size: 1, Flags: PRIVATE - PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x81C, // Size: 200, Flags: PRIVATE - PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x8E4, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x8E5, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x8EC, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x8F3, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x8FA, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x8FB, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x8FC, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT = UNIT_END + 0x8FD, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS = UNIT_END + 0x8FE, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS = UNIT_END + 0x901, // Size: 3, Flags: PRIVATE - PLAYER_FIELD_MOD_SPELL_POWER_PCT = UNIT_END + 0x904, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_RESILIENCE_PERCENT = UNIT_END + 0x905, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT = UNIT_END + 0x906, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT = UNIT_END + 0x907, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x908, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x909, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOCAL_FLAGS = UNIT_END + 0x90A, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BYTES = UNIT_END + 0x90B, // Size: 1, Flags: PRIVATE - PLAYER_SELF_RES_SPELL = UNIT_END + 0x90C, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x90D, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x90E, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x91A, // Size: 12, Flags: PRIVATE - PLAYER_FIELD_KILLS = UNIT_END + 0x926, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x927, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x928, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x929, // Size: 32, Flags: PRIVATE - PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x949, // Size: 36, Flags: PRIVATE - PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x96D, // Size: 1, Flags: PRIVATE - PLAYER_RUNE_REGEN_1 = UNIT_END + 0x96E, // Size: 4, Flags: PRIVATE - PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x972, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x976, // Size: 6, Flags: PRIVATE - PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x97C, // Size: 6, Flags: PRIVATE - PLAYER_GLYPHS_ENABLED = UNIT_END + 0x982, // Size: 1, Flags: PRIVATE - PLAYER_PET_SPELL_POWER = UNIT_END + 0x983, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_RESEARCHING_1 = UNIT_END + 0x984, // Size: 10, Flags: PRIVATE - PLAYER_PROFESSION_SKILL_LINE_1 = UNIT_END + 0x98E, // Size: 2, Flags: PRIVATE - PLAYER_FIELD_UI_HIT_MODIFIER = UNIT_END + 0x990, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_UI_SPELL_HIT_MODIFIER = UNIT_END + 0x991, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_HOME_REALM_TIME_OFFSET = UNIT_END + 0x992, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_MOD_PET_HASTE = UNIT_END + 0x993, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_SUMMONED_BATTLE_PET_ID = UNIT_END + 0x994, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BYTES2 = UNIT_END + 0x998, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_LFG_BONUS_FACTION_ID = UNIT_END + 0x999, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_LOOT_SPEC_ID = UNIT_END + 0x99A, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE = UNIT_END + 0x99B, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY - PLAYER_FIELD_ITEM_LEVEL_DELTA = UNIT_END + 0x99C, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_BAG_SLOT_FLAGS = UNIT_END + 0x99D, // Size: 4, Flags: PRIVATE - PLAYER_FIELD_BANK_BAG_SLOT_FLAGS = UNIT_END + 0x9A1, // Size: 7, Flags: PRIVATE - PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT = UNIT_END + 0x9A8, // Size: 1, Flags: PRIVATE - PLAYER_FIELD_QUEST_COMPLETED = UNIT_END + 0x9A9, // Size: 625, Flags: PRIVATE - PLAYER_END = UNIT_END + 0xC1A, + PLAYER_VISIBLE_ITEM = UNIT_END + 0x304, // Size: 38, Flags: PUBLIC + PLAYER_CHOSEN_TITLE = UNIT_END + 0x32A, // Size: 1, Flags: PUBLIC + PLAYER_FAKE_INEBRIATION = UNIT_END + 0x32B, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_VIRTUAL_PLAYER_REALM = UNIT_END + 0x32C, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_CURRENT_SPEC_ID = UNIT_END + 0x32D, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_TAXI_MOUNT_ANIM_KIT_ID = UNIT_END + 0x32E, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_AVG_ITEM_LEVEL = UNIT_END + 0x32F, // Size: 4, Flags: PUBLIC + PLAYER_FIELD_CURRENT_BATTLE_PET_BREED_QUALITY = UNIT_END + 0x333, // Size: 1, Flags: PUBLIC + PLAYER_FIELD_INV_SLOT_HEAD = UNIT_END + 0x334, // Size: 736, Flags: PRIVATE + PLAYER_FIELD_END_NOT_SELF = UNIT_END + 0x334, + PLAYER_FARSIGHT = UNIT_END + 0x614, // Size: 4, Flags: PRIVATE + PLAYER__FIELD_KNOWN_TITLES = UNIT_END + 0x618, // Size: 10, Flags: PRIVATE + PLAYER_FIELD_COINAGE = UNIT_END + 0x622, // Size: 2, Flags: PRIVATE + PLAYER_XP = UNIT_END + 0x624, // Size: 1, Flags: PRIVATE + PLAYER_NEXT_LEVEL_XP = UNIT_END + 0x625, // Size: 1, Flags: PRIVATE + PLAYER_SKILL_LINEID = UNIT_END + 0x626, // Size: 448, Flags: PRIVATE + PLAYER_CHARACTER_POINTS = UNIT_END + 0x7E6, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MAX_TALENT_TIERS = UNIT_END + 0x7E7, // Size: 1, Flags: PRIVATE + PLAYER_TRACK_CREATURES = UNIT_END + 0x7E8, // Size: 1, Flags: PRIVATE + PLAYER_TRACK_RESOURCES = UNIT_END + 0x7E9, // Size: 1, Flags: PRIVATE + PLAYER_EXPERTISE = UNIT_END + 0x7EA, // Size: 1, Flags: PRIVATE + PLAYER_OFFHAND_EXPERTISE = UNIT_END + 0x7EB, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_RANGED_EXPERTISE = UNIT_END + 0x7EC, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_EXPERTISE = UNIT_END + 0x7ED, // Size: 1, Flags: PRIVATE + PLAYER_BLOCK_PERCENTAGE = UNIT_END + 0x7EE, // Size: 1, Flags: PRIVATE + PLAYER_DODGE_PERCENTAGE = UNIT_END + 0x7EF, // Size: 1, Flags: PRIVATE + PLAYER_PARRY_PERCENTAGE = UNIT_END + 0x7F0, // Size: 1, Flags: PRIVATE + PLAYER_CRIT_PERCENTAGE = UNIT_END + 0x7F1, // Size: 1, Flags: PRIVATE + PLAYER_RANGED_CRIT_PERCENTAGE = UNIT_END + 0x7F2, // Size: 1, Flags: PRIVATE + PLAYER_OFFHAND_CRIT_PERCENTAGE = UNIT_END + 0x7F3, // Size: 1, Flags: PRIVATE + PLAYER_SPELL_CRIT_PERCENTAGE1 = UNIT_END + 0x7F4, // Size: 7, Flags: PRIVATE + PLAYER_SHIELD_BLOCK = UNIT_END + 0x7FB, // Size: 1, Flags: PRIVATE + PLAYER_SHIELD_BLOCK_CRIT_PERCENTAGE = UNIT_END + 0x7FC, // Size: 1, Flags: PRIVATE + PLAYER_MASTERY = UNIT_END + 0x7FD, // Size: 1, Flags: PRIVATE + PLAYER_AMPLIFY = UNIT_END + 0x7FE, // Size: 1, Flags: PRIVATE + PLAYER_MULTISTRIKE = UNIT_END + 0x7FF, // Size: 1, Flags: PRIVATE + PLAYER_MULTISTRIKE_EFFECT = UNIT_END + 0x800, // Size: 1, Flags: PRIVATE + PLAYER_READINESS = UNIT_END + 0x801, // Size: 1, Flags: PRIVATE + PLAYER_SPEED = UNIT_END + 0x802, // Size: 1, Flags: PRIVATE + PLAYER_LIFESTEAL = UNIT_END + 0x803, // Size: 1, Flags: PRIVATE + PLAYER_AVOIDANCE = UNIT_END + 0x804, // Size: 1, Flags: PRIVATE + PLAYER_STURDINESS = UNIT_END + 0x805, // Size: 1, Flags: PRIVATE + PLAYER_CLEAVE = UNIT_END + 0x806, // Size: 1, Flags: PRIVATE + PLAYER_VERSATILITY = UNIT_END + 0x807, // Size: 1, Flags: PRIVATE + PLAYER_VERSATILITY_BONUS = UNIT_END + 0x808, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_POWER_DAMAGE = UNIT_END + 0x809, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_POWER_HEALING = UNIT_END + 0x80A, // Size: 1, Flags: PRIVATE + PLAYER_EXPLORED_ZONES_1 = UNIT_END + 0x80B, // Size: 256, Flags: PRIVATE + PLAYER_REST_STATE_EXPERIENCE = UNIT_END + 0x90B, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_POS = UNIT_END + 0x90C, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_NEG = UNIT_END + 0x913, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_DAMAGE_DONE_PCT = UNIT_END + 0x91A, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_POS = UNIT_END + 0x921, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_PCT = UNIT_END + 0x922, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_HEALING_DONE_PCT = UNIT_END + 0x923, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT = UNIT_END + 0x924, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS = UNIT_END + 0x925, // Size: 3, Flags: PRIVATE + PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS = UNIT_END + 0x928, // Size: 3, Flags: PRIVATE + PLAYER_FIELD_MOD_SPELL_POWER_PCT = UNIT_END + 0x92B, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_RESILIENCE_PERCENT = UNIT_END + 0x92C, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT = UNIT_END + 0x92D, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT = UNIT_END + 0x92E, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_RESISTANCE = UNIT_END + 0x92F, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_TARGET_PHYSICAL_RESISTANCE = UNIT_END + 0x930, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LOCAL_FLAGS = UNIT_END + 0x931, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BYTES = UNIT_END + 0x932, // Size: 1, Flags: PRIVATE + PLAYER_SELF_RES_SPELL = UNIT_END + 0x933, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_PVP_MEDALS = UNIT_END + 0x934, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_PRICE_1 = UNIT_END + 0x935, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_BUYBACK_TIMESTAMP_1 = UNIT_END + 0x941, // Size: 12, Flags: PRIVATE + PLAYER_FIELD_KILLS = UNIT_END + 0x94D, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LIFETIME_HONORABLE_KILLS = UNIT_END + 0x94E, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_WATCHED_FACTION_INDEX = UNIT_END + 0x94F, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_COMBAT_RATING_1 = UNIT_END + 0x950, // Size: 32, Flags: PRIVATE + PLAYER_FIELD_ARENA_TEAM_INFO_1_1 = UNIT_END + 0x970, // Size: 36, Flags: PRIVATE + PLAYER_FIELD_MAX_LEVEL = UNIT_END + 0x994, // Size: 1, Flags: PRIVATE + PLAYER_RUNE_REGEN_1 = UNIT_END + 0x995, // Size: 4, Flags: PRIVATE + PLAYER_NO_REAGENT_COST_1 = UNIT_END + 0x999, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_GLYPH_SLOTS_1 = UNIT_END + 0x99D, // Size: 6, Flags: PRIVATE + PLAYER_FIELD_GLYPHS_1 = UNIT_END + 0x9A3, // Size: 6, Flags: PRIVATE + PLAYER_GLYPHS_ENABLED = UNIT_END + 0x9A9, // Size: 1, Flags: PRIVATE + PLAYER_PET_SPELL_POWER = UNIT_END + 0x9AA, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_RESEARCHING_1 = UNIT_END + 0x9AB, // Size: 10, Flags: PRIVATE + PLAYER_PROFESSION_SKILL_LINE_1 = UNIT_END + 0x9B5, // Size: 2, Flags: PRIVATE + PLAYER_FIELD_UI_HIT_MODIFIER = UNIT_END + 0x9B7, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_UI_SPELL_HIT_MODIFIER = UNIT_END + 0x9B8, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_HOME_REALM_TIME_OFFSET = UNIT_END + 0x9B9, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_MOD_PET_HASTE = UNIT_END + 0x9BA, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_SUMMONED_BATTLE_PET_ID = UNIT_END + 0x9BB, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_BYTES2 = UNIT_END + 0x9BF, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY + PLAYER_FIELD_LFG_BONUS_FACTION_ID = UNIT_END + 0x9C0, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_LOOT_SPEC_ID = UNIT_END + 0x9C1, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_OVERRIDE_ZONE_PVP_TYPE = UNIT_END + 0x9C2, // Size: 1, Flags: PRIVATE, URGENT_SELF_ONLY + PLAYER_FIELD_ITEM_LEVEL_DELTA = UNIT_END + 0x9C3, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_BAG_SLOT_FLAGS = UNIT_END + 0x9C4, // Size: 4, Flags: PRIVATE + PLAYER_FIELD_BANK_BAG_SLOT_FLAGS = UNIT_END + 0x9C8, // Size: 7, Flags: PRIVATE + PLAYER_FIELD_INSERT_ITEMS_LEFT_TO_RIGHT = UNIT_END + 0x9CF, // Size: 1, Flags: PRIVATE + PLAYER_FIELD_QUEST_COMPLETED = UNIT_END + 0x9D0, // Size: 875, Flags: PRIVATE + PLAYER_END = UNIT_END + 0xD3B, }; enum PlayerDynamicFields @@ -321,7 +321,7 @@ enum GameObjectFields GAMEOBJECT_FACTION = OBJECT_END + 0x00A, // Size: 1, Flags: PUBLIC GAMEOBJECT_LEVEL = OBJECT_END + 0x00B, // Size: 1, Flags: PUBLIC GAMEOBJECT_BYTES_1 = OBJECT_END + 0x00C, // Size: 1, Flags: PUBLIC, URGENT - GAMEOBJECT_SPELL_VISUAL_ID = OBJECT_END + 0x00D, // Size: 1, Flags: PUBLIC, URGENT + GAMEOBJECT_SPELL_VISUAL_ID = OBJECT_END + 0x00D, // Size: 1, Flags: PUBLIC, DYNAMIC, URGENT GAMEOBJECT_STATE_SPELL_VISUAL_ID = OBJECT_END + 0x00E, // Size: 1, Flags: DYNAMIC, URGENT GAMEOBJECT_STATE_ANIM_ID = OBJECT_END + 0x00F, // Size: 1, Flags: DYNAMIC, URGENT GAMEOBJECT_STATE_ANIM_KIT_ID = OBJECT_END + 0x010, // Size: 1, Flags: DYNAMIC, URGENT @@ -331,7 +331,8 @@ enum GameObjectFields enum GameObjectDynamicFields { - GAMEOBJECT_DYNAMIC_END = OBJECT_DYNAMIC_END + 0x000, + GAMEOBJECT_DYNAMIC_ENABLE_DOODAD_SETS = OBJECT_DYNAMIC_END + 0x000, // Flags: PUBLIC + GAMEOBJECT_DYNAMIC_END = OBJECT_DYNAMIC_END + 0x001, }; enum DynamicObjectFields @@ -370,12 +371,15 @@ enum CorpseDynamicFields enum AreaTriggerFields { - AREATRIGGER_CASTER = OBJECT_END + 0x000, // Size: 4, Flags: PUBLIC - AREATRIGGER_DURATION = OBJECT_END + 0x004, // Size: 1, Flags: PUBLIC - AREATRIGGER_SPELLID = OBJECT_END + 0x005, // Size: 1, Flags: PUBLIC - AREATRIGGER_SPELLVISUALID = OBJECT_END + 0x006, // Size: 1, Flags: DYNAMIC - AREATRIGGER_EXPLICIT_SCALE = OBJECT_END + 0x007, // Size: 1, Flags: PUBLIC, URGENT - AREATRIGGER_END = OBJECT_END + 0x008, + AREATRIGGER_OVERRIDE_SCALE_CURVE = OBJECT_END + 0x000, // Size: 7, Flags: PUBLIC, URGENT + AREATRIGGER_CASTER = OBJECT_END + 0x007, // Size: 4, Flags: PUBLIC + AREATRIGGER_DURATION = OBJECT_END + 0x00B, // Size: 1, Flags: PUBLIC + AREATRIGGER_TIME_TO_TARGET_SCALE = OBJECT_END + 0x00C, // Size: 1, Flags: PUBLIC, URGENT + AREATRIGGER_SPELLID = OBJECT_END + 0x00D, // Size: 1, Flags: PUBLIC + AREATRIGGER_SPELLVISUALID = OBJECT_END + 0x00E, // Size: 1, Flags: DYNAMIC + AREATRIGGER_BOUNDS_RADIUS_2D = OBJECT_END + 0x00F, // Size: 1, Flags: DYNAMIC, URGENT + AREATRIGGER_EXPLICIT_SCALE = OBJECT_END + 0x010, // Size: 1, Flags: PUBLIC, URGENT + AREATRIGGER_END = OBJECT_END + 0x011, }; enum AreaTriggerDynamicFields diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index c8152e3ac36..3f83915c141 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -39,8 +39,8 @@ Pet::Pet(Player* owner, PetType type) : Guardian(NULL, owner, true), m_usedTalentCount(0), m_removed(false), - m_petType(type), m_duration(0), m_loading(false), m_declinedname(NULL), - m_groupUpdateMask(0) + m_petType(type), m_duration(0), m_loading(false), m_groupUpdateMask(0), + m_declinedname(NULL) { ASSERT(GetOwner()); @@ -1455,10 +1455,8 @@ void Pet::InitLevelupSpellsForLevel() } } - int32 petSpellsId = GetCreatureTemplate()->PetSpellDataId ? -(int32)GetCreatureTemplate()->PetSpellDataId : GetEntry(); - // default spells (can be not learned if pet level (as owner level decrease result for example) less first possible in normal game) - if (PetDefaultSpellsEntry const* defSpells = sSpellMgr->GetPetDefaultSpellsEntry(petSpellsId)) + if (PetDefaultSpellsEntry const* defSpells = sSpellMgr->GetPetDefaultSpellsEntry(int32(GetEntry()))) { for (uint8 i = 0; i < MAX_CREATURE_SPELL_DATA_SLOT; ++i) { diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index a24283d75d6..e1a71f5fbdf 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -802,7 +802,7 @@ Player::Player(WorldSession* session): Unit(true) m_dungeonDifficulty = DIFFICULTY_NORMAL; m_raidDifficulty = DIFFICULTY_NORMAL_RAID; m_legacyRaidDifficulty = DIFFICULTY_10_N; - m_raidMapDifficulty = DIFFICULTY_NORMAL_RAID; + m_prevMapDifficulty = DIFFICULTY_NORMAL_RAID; m_lastPotionId = 0; _talentMgr = new PlayerTalentInfo(); @@ -1147,7 +1147,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac } // original items - if (CharStartOutfitEntry const* oEntry = GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Sex)) + if (CharStartOutfitEntry const* oEntry = sDB2Manager.GetCharStartOutfitEntry(createInfo->Race, createInfo->Class, createInfo->Sex)) { for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j) { @@ -4478,10 +4478,6 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_GM_TICKETS); - stmt->setUInt64(0, guid); - trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ITEM_INSTANCE_BY_OWNER); stmt->setUInt64(0, guid); trans->Append(stmt); @@ -4575,21 +4571,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe stmt->setUInt64(0, guid); trans->Append(stmt); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BLUEPRINTS); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BUILDINGS); - stmt->setUInt64(0, guid); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_FOLLOWERS); - stmt->setUInt64(0, guid); - trans->Append(stmt); + Garrison::DeleteFromDB(guid, trans); CharacterDatabase.CommitTransaction(trans); @@ -6782,12 +6764,12 @@ bool Player::RewardHonor(Unit* victim, uint32 groupsize, int32 honor, bool pvpto // victim_rank [1..4] HK: <dishonored rank> // victim_rank [5..19] HK: <alliance\horde rank> // victim_rank [0, 20+] HK: <> - WorldPacket data(SMSG_PVP_CREDIT, 4+8+4); - data << uint32(honor); - data << victim_guid; - data << uint32(victim_rank); + WorldPackets::Combat::PvPCredit data; + data.Honor = honor; + data.Target = victim_guid; + data.Rank = victim_rank; - GetSession()->SendPacket(&data); + GetSession()->SendPacket(data.Write()); // add honor points ModifyCurrency(CURRENCY_TYPE_HONOR_POINTS, int32(honor)); @@ -9520,13 +9502,9 @@ void Player::SendBattlefieldWorldStates() { if (Battlefield* wg = sBattlefieldMgr->GetBattlefieldByBattleId(BATTLEFIELD_BATTLEID_WG)) { - if (wg->IsWarTime()) - SendUpdateWorldState(ClockWorldState[1], uint32(time(NULL))); - else // Time to next battle - { - uint32 timer = wg->GetTimer() / 1000; - SendUpdateWorldState(ClockWorldState[1], time(NULL) + timer); - } + SendUpdateWorldState(BATTLEFIELD_WG_WORLD_STATE_ACTIVE, wg->IsWarTime() ? 0 : 1); + uint32 timer = wg->IsWarTime() ? 0 : (wg->GetTimer() / 1000); // 0 - Time to next battle + SendUpdateWorldState(ClockWorldState[1], uint32(time(NULL) + timer)); } } } @@ -11906,14 +11884,14 @@ void Player::SetVisibleItemSlot(uint8 slot, Item* pItem) { if (pItem) { - SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (slot * 3), pItem->GetVisibleEntry()); - SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 3), 0, pItem->GetVisibleAppearanceModId()); - SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 3), 1, pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); + SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (slot * 2), pItem->GetVisibleEntry()); + SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 2), 0, pItem->GetVisibleAppearanceModId()); + SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 2), 1, pItem->GetEnchantmentId(PERM_ENCHANTMENT_SLOT)); } else { - SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (slot * 3), 0); - SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 3), 0); + SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (slot * 2), 0); + SetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (slot * 2), 0); } } @@ -13607,10 +13585,10 @@ void Player::ApplyEnchantment(Item* item, EnchantmentSlot slot, bool apply, bool // visualize enchantment at player and equipped items if (slot == PERM_ENCHANTMENT_SLOT) - SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (item->GetSlot() * 3), 0, apply ? item->GetEnchantmentId(slot) : 0); + SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (item->GetSlot() * 2), 0, apply ? item->GetEnchantmentId(slot) : 0); if (slot == TEMP_ENCHANTMENT_SLOT) - SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (item->GetSlot() * 3), 1, apply ? item->GetEnchantmentId(slot) : 0); + SetUInt16Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENCHANTMENT_OFFSET + (item->GetSlot() * 2), 1, apply ? item->GetEnchantmentId(slot) : 0); if (apply_dur) { @@ -14670,6 +14648,11 @@ void Player::IncompleteQuest(uint32 quest_id) } } +uint32 Player::GetQuestMoneyReward(Quest const* quest) +{ + return quest->MoneyValue(getLevel()) * sWorld->getRate(RATE_MONEY_QUEST); +} + uint32 Player::GetQuestXPReward(Quest const* quest) { bool rewarded = (m_RewardedQuests.find(quest->GetQuestId()) != m_RewardedQuests.end()); @@ -14805,7 +14788,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, else moneyRew = int32(quest->GetRewMoneyMaxLevel() * sWorld->getRate(RATE_DROP_MONEY)); - moneyRew += quest->GetRewMoney(); + moneyRew += GetQuestMoneyReward(quest); if (moneyRew) { @@ -14892,7 +14875,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST_COUNT); UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_COMPLETE_QUEST, quest->GetQuestId()); - if (uint32 questBit = GetQuestUniqueBitFlag(quest_id)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id)) SetQuestCompletedBit(questBit, true); if (quest->HasFlag(QUEST_FLAGS_FLAGS_PVP)) @@ -15524,7 +15507,7 @@ void Player::RemoveRewardedQuest(uint32 questId, bool update /*= true*/) m_RewardedQuestsSave[questId] = QUEST_FORCE_DELETE_SAVE_TYPE; } - if (uint32 questBit = GetQuestUniqueBitFlag(questId)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(questId)) SetQuestCompletedBit(questBit, false); if (update) @@ -16354,12 +16337,12 @@ void Player::SendQuestReward(Quest const* quest, uint32 XP) if (getLevel() < sWorld->getIntConfig(CONFIG_MAX_PLAYER_LEVEL)) { xp = XP; - moneyReward = quest->GetRewMoney(); + moneyReward = GetQuestMoneyReward(quest); } else // At max level, increase gold reward { xp = 0; - moneyReward = uint32(quest->GetRewMoney() + int32(quest->GetRewMoneyMaxLevel() * sWorld->getRate(RATE_DROP_MONEY))); + moneyReward = uint32(GetQuestMoneyReward(quest) + int32(quest->GetRewMoneyMaxLevel() * sWorld->getRate(RATE_DROP_MONEY))); } WorldPackets::Quest::QuestGiverQuestComplete packet; @@ -18211,7 +18194,7 @@ void Player::_LoadQuestStatusRewarded(PreparedQueryResult result) // Skip loading special quests - they are also added to rewarded quests but only once and remain there forever // instead add them separately from load daily/weekly/monthly/seasonal if (!quest->IsDailyOrWeekly() && !quest->IsMonthly() && !quest->IsSeasonal()) - if (uint32 questBit = GetQuestUniqueBitFlag(quest_id)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id)) SetQuestCompletedBit(questBit, true); } @@ -18251,7 +18234,7 @@ void Player::_LoadDailyQuestStatus(PreparedQueryResult result) continue; AddDynamicValue(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS, quest_id); - if (uint32 questBit = GetQuestUniqueBitFlag(quest_id)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id)) SetQuestCompletedBit(questBit, true); TC_LOG_DEBUG("entities.player.loading", "Daily quest (%u) cooldown for player (%s)", quest_id, GetGUID().ToString().c_str()); @@ -18277,7 +18260,7 @@ void Player::_LoadWeeklyQuestStatus(PreparedQueryResult result) continue; m_weeklyquests.insert(quest_id); - if (uint32 questBit = GetQuestUniqueBitFlag(quest_id)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id)) SetQuestCompletedBit(questBit, true); TC_LOG_DEBUG("entities.player.loading", "Weekly quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str()); @@ -18304,7 +18287,7 @@ void Player::_LoadSeasonalQuestStatus(PreparedQueryResult result) continue; m_seasonalquests[event_id].insert(quest_id); - if (uint32 questBit = GetQuestUniqueBitFlag(quest_id)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id)) SetQuestCompletedBit(questBit, true); TC_LOG_DEBUG("entities.player.loading", "Seasonal quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str()); @@ -18330,7 +18313,7 @@ void Player::_LoadMonthlyQuestStatus(PreparedQueryResult result) continue; m_monthlyquests.insert(quest_id); - if (uint32 questBit = GetQuestUniqueBitFlag(quest_id)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(quest_id)) SetQuestCompletedBit(questBit, true); TC_LOG_DEBUG("entities.player.loading", "Monthly quest {%u} cooldown for player (%s)", quest_id, GetGUID().ToString().c_str()); @@ -19990,10 +19973,10 @@ void Player::SendExplorationExperience(uint32 Area, uint32 Experience) GetSession()->SendPacket(WorldPackets::Misc::ExplorationExperience(Experience, Area).Write()); } -void Player::SendDungeonDifficulty() +void Player::SendDungeonDifficulty(int32 forcedDifficulty /*= -1*/) { WorldPackets::Misc::DungeonDifficultySet dungeonDifficultySet; - dungeonDifficultySet.DifficultyID = GetDungeonDifficultyID(); + dungeonDifficultySet.DifficultyID = forcedDifficulty == -1 ? GetDungeonDifficultyID() : forcedDifficulty; GetSession()->SendPacket(dungeonDifficultySet.Write()); } @@ -20007,8 +19990,8 @@ void Player::SendRaidDifficulty(bool legacy, int32 forcedDifficulty /*= -1*/) void Player::SendResetFailedNotify(uint32 /*mapid*/) { - WorldPacket data(SMSG_RESET_FAILED_NOTIFY, 4); - GetSession()->SendPacket(&data); + WorldPackets::Instance::ResetFailedNotify data; + GetSession()->SendPacket(data.Write()); } /// Reset all solo instances and optionally send a message on success for each @@ -20069,9 +20052,9 @@ void Player::ResetInstances(uint8 method, bool isRaid, bool isLegacy) void Player::SendResetInstanceSuccess(uint32 MapId) { - WorldPacket data(SMSG_INSTANCE_RESET, 4); - data << uint32(MapId); - GetSession()->SendPacket(&data); + WorldPackets::Instance::InstanceReset data; + data.MapID = MapId; + GetSession()->SendPacket(data.Write()); } void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) @@ -20081,10 +20064,11 @@ void Player::SendResetInstanceFailed(uint32 reason, uint32 MapId) // 1: There are players offline in your party. // 2>: There are players in your party attempting to zone into an instance. */ - WorldPacket data(SMSG_INSTANCE_RESET_FAILED, 8); - data << uint32(reason); - data << uint32(MapId); - GetSession()->SendPacket(&data); + + WorldPackets::Instance::InstanceResetFailed data; + data.MapID = MapId; + data.ResetFailedReason = reason; + GetSession()->SendPacket(data.Write()); } /*********************************************************/ @@ -22585,6 +22569,7 @@ void Player::SendInitialPacketsBeforeAddToMap() // worldServerInfo.RestrictedAccountMaxLevel; /// @todo // worldServerInfo.RestrictedAccountMaxMoney; /// @todo worldServerInfo.DifficultyID = GetMap()->GetDifficultyID(); + // worldServerInfo.XRealmPvpAlert; /// @todo SendDirectMessage(worldServerInfo.Write()); // SMSG_ACCOUNT_MOUNT_UPDATE @@ -22642,11 +22627,20 @@ void Player::SendInitialPacketsAfterAddToMap() if (GetMap()->IsRaid()) { - DifficultyEntry const* difficulty = sDifficultyStore.AssertEntry(GetMap()->GetDifficultyID()); - SendRaidDifficulty((difficulty->Flags & DIFFICULTY_FLAG_LEGACY) != 0, GetMap()->GetDifficultyID()); + m_prevMapDifficulty = GetMap()->GetDifficultyID(); + DifficultyEntry const* difficulty = sDifficultyStore.AssertEntry(m_prevMapDifficulty); + SendRaidDifficulty((difficulty->Flags & DIFFICULTY_FLAG_LEGACY) != 0, m_prevMapDifficulty); } else if (GetMap()->IsNonRaidDungeon()) - SendDungeonDifficulty(); + { + m_prevMapDifficulty = GetMap()->GetDifficultyID(); + SendDungeonDifficulty(m_prevMapDifficulty); + } + else if (!GetMap()->Instanceable()) + { + DifficultyEntry const* difficulty = sDifficultyStore.AssertEntry(m_prevMapDifficulty); + SendRaidDifficulty((difficulty->Flags & DIFFICULTY_FLAG_LEGACY) != 0); + } if (_garrison) _garrison->SendRemoteInfo(); @@ -22846,7 +22840,7 @@ void Player::LearnDefaultSkill(SkillRaceClassInfoEntry const* rcInfo) if (getClass() == CLASS_DEATH_KNIGHT && skillId == SKILL_FIRST_AID) rank = 4; - SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcInfo->SkillTierID); + SkillTiersEntry const* tier = sObjectMgr->GetSkillTier(rcInfo->SkillTierID); uint16 maxValue = tier->Value[std::max<int32>(rank - 1, 0)]; uint16 skillValue = 1; if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) @@ -23094,7 +23088,7 @@ void Player::SetMonthlyQuestStatus(uint32 quest_id) void Player::DailyReset() { for (uint32 questId : GetDynamicValues(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS)) - if (uint32 questBit = GetQuestUniqueBitFlag(questId)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(questId)) SetQuestCompletedBit(questBit, false); ClearDynamicValue(PLAYER_DYNAMIC_FIELD_DAILY_QUESTS); @@ -23115,7 +23109,7 @@ void Player::ResetWeeklyQuestStatus() return; for (uint32 questId : m_weeklyquests) - if (uint32 questBit = GetQuestUniqueBitFlag(questId)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(questId)) SetQuestCompletedBit(questBit, false); m_weeklyquests.clear(); @@ -23133,7 +23127,7 @@ void Player::ResetSeasonalQuestStatus(uint16 event_id) return; for (uint32 questId : eventItr->second) - if (uint32 questBit = GetQuestUniqueBitFlag(questId)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(questId)) SetQuestCompletedBit(questBit, false); m_seasonalquests.erase(eventItr); @@ -23147,7 +23141,7 @@ void Player::ResetMonthlyQuestStatus() return; for (uint32 questId : m_monthlyquests) - if (uint32 questBit = GetQuestUniqueBitFlag(questId)) + if (uint32 questBit = sDB2Manager.GetQuestUniqueBitFlag(questId)) SetQuestCompletedBit(questBit, false); m_monthlyquests.clear(); @@ -23620,22 +23614,9 @@ uint32 Player::GetResurrectionSpellId() for (AuraEffectList::const_iterator itr = dummyAuras.begin(); itr != dummyAuras.end(); ++itr) { // Soulstone Resurrection // prio: 3 (max, non death persistent) - if (prio < 2 && (*itr)->GetSpellInfo()->SpellVisual[0] == 99 && (*itr)->GetSpellInfo()->SpellIconID == 92) + if (prio < 2 && (*itr)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_WARLOCK && (*itr)->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000000) { - switch ((*itr)->GetId()) - { - case 20707: spell_id = 3026; break; // rank 1 - case 20762: spell_id = 20758; break; // rank 2 - case 20763: spell_id = 20759; break; // rank 3 - case 20764: spell_id = 20760; break; // rank 4 - case 20765: spell_id = 20761; break; // rank 5 - case 27239: spell_id = 27240; break; // rank 6 - case 47883: spell_id = 47882; break; // rank 7 - default: - TC_LOG_ERROR("entities.player", "Unhandled spell %u: S.Resurrection", (*itr)->GetId()); - continue; - } - + spell_id = 3026; prio = 3; } // Twisting Nether // prio: 2 (max) @@ -23646,8 +23627,8 @@ uint32 Player::GetResurrectionSpellId() } } - // Reincarnation (passive spell) // prio: 1 // Glyph of Renewed Life - if (prio < 1 && HasSpell(20608) && !GetSpellHistory()->HasCooldown(21169) && (HasAura(58059) || HasItemCount(17030))) + // Reincarnation (passive spell) // prio: 1 + if (prio < 1 && HasSpell(20608) && !GetSpellHistory()->HasCooldown(21169)) spell_id = 21169; return spell_id; @@ -23758,6 +23739,9 @@ bool Player::IsAtGroupRewardDistance(WorldObject const* pRewardSource) const if (player->GetMapId() != pRewardSource->GetMapId() || player->GetInstanceId() != pRewardSource->GetInstanceId()) return false; + if (player->GetMap()->IsDungeon()) + return true; + return pRewardSource->GetDistance(player) <= sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE); } @@ -26195,6 +26179,15 @@ void Player::CreateGarrison(uint32 garrSiteId) _garrison = std::move(garrison); } +void Player::DeleteGarrison() +{ + if (_garrison) + { + _garrison->Delete(); + _garrison.reset(); + } +} + void Player::SendMovementSetCanTransitionBetweenSwimAndFly(bool apply) { WorldPackets::Movement::MoveSetFlag packet(apply ? SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY : SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY); @@ -26610,7 +26603,7 @@ void Player::RemoveOverrideSpell(uint32 overridenSpellId, uint32 newSpellId) void Player::LearnSpecializationSpells() { - if (std::vector<SpecializationSpellsEntry const*> const* specSpells = GetSpecializationSpells(GetSpecId(GetActiveTalentGroup()))) + if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(GetSpecId(GetActiveTalentGroup()))) { for (size_t j = 0; j < specSpells->size(); ++j) { @@ -26632,7 +26625,7 @@ void Player::RemoveSpecializationSpells() { if (ChrSpecializationEntry const* specialization = sChrSpecializationByIndexStore[getClass()][i]) { - if (std::vector<SpecializationSpellsEntry const*> const* specSpells = GetSpecializationSpells(specialization->ID)) + if (std::vector<SpecializationSpellsEntry const*> const* specSpells = sDB2Manager.GetSpecializationSpells(specialization->ID)) { for (size_t j = 0; j < specSpells->size(); ++j) { diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index f8518f3dacc..2e4a50251a7 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -664,7 +664,7 @@ enum QuestSaveType typedef std::map<uint32, QuestSaveType> QuestStatusSaveMap; // Size of client completed quests bit map -#define QUESTS_COMPLETED_BITS_SIZE 625 +#define QUESTS_COMPLETED_BITS_SIZE 875 enum QuestSlotOffsets { @@ -1647,6 +1647,7 @@ class Player : public Unit, public GridObject<Player> void AddQuest(Quest const* quest, Object* questGiver); void CompleteQuest(uint32 quest_id); void IncompleteQuest(uint32 quest_id); + uint32 GetQuestMoneyReward(Quest const* quest); uint32 GetQuestXPReward(Quest const* quest); void RewardQuest(Quest const* quest, uint32 reward, Object* questGiver, bool announce = true); void FailQuest(uint32 quest_id); @@ -1966,7 +1967,7 @@ class Player : public Unit, public GridObject<Player> if (!IsResurrectRequested()) return false; - return _resurrectionData->GUID == guid; + return !_resurrectionData->GUID.IsEmpty() && _resurrectionData->GUID == guid; } bool IsResurrectRequested() const { return _resurrectionData != NULL; } @@ -2132,7 +2133,7 @@ class Player : public Unit, public GridObject<Player> void SendAutoRepeatCancel(Unit* target); void SendExplorationExperience(uint32 Area, uint32 Experience); - void SendDungeonDifficulty(); + void SendDungeonDifficulty(int32 forcedDifficulty = -1); void SendRaidDifficulty(bool legacy, int32 forcedDifficulty = -1); void ResetInstances(uint8 method, bool isRaid, bool isLegacy); void SendResetInstanceSuccess(uint32 MapId); @@ -2629,6 +2630,7 @@ class Player : public Unit, public GridObject<Player> void OnCombatExit(); void CreateGarrison(uint32 garrSiteId); + void DeleteGarrison(); Garrison* GetGarrison() { return _garrison.get(); } protected: @@ -2760,7 +2762,7 @@ class Player : public Unit, public GridObject<Player> Difficulty m_dungeonDifficulty; Difficulty m_raidDifficulty; Difficulty m_legacyRaidDifficulty; - Difficulty m_raidMapDifficulty; + Difficulty m_prevMapDifficulty; uint32 m_atLoginFlags; diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index f449cec1eef..1e6ee06e661 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -363,6 +363,7 @@ GameObject* Transport::CreateGOPassenger(ObjectGuid::LowType guid, GameObjectDat go->m_movementInfo.transport.pos.Relocate(x, y, z, o); CalculatePassengerPosition(x, y, z, &o); go->Relocate(x, y, z, o); + go->RelocateStationaryPosition(x, y, z, o); if (!go->IsPositionValid()) { @@ -719,6 +720,7 @@ void Transport::UpdatePassengerPositions(PassengerSet& passengers) break; case TYPEID_GAMEOBJECT: GetMap()->GameObjectRelocation(passenger->ToGameObject(), x, y, z, o, false); + passenger->ToGameObject()->RelocateStationaryPosition(x, y, z, o); break; case TYPEID_DYNAMICOBJECT: GetMap()->DynamicObjectRelocation(passenger->ToDynObject(), x, y, z, o); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index 640b224896f..7cc25c5a5a1 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -154,12 +154,18 @@ bool Player::UpdateStats(Stats stat) void Player::ApplySpellPowerBonus(int32 amount, bool apply) { + if (HasAuraType(SPELL_AURA_OVERRIDE_SPELL_POWER_BY_AP_PCT)) + return; + apply = _ModifyUInt32(apply, m_baseSpellPower, amount); // For speed just update for client ApplyModUInt32Value(PLAYER_FIELD_MOD_HEALING_DONE_POS, amount, apply); for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) ApplyModUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i, amount, apply); + + if (HasAuraType(SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT)) + UpdateAttackPowerAndDamage(); } void Player::UpdateSpellDamageAndHealingBonus() @@ -171,6 +177,9 @@ void Player::UpdateSpellDamageAndHealingBonus() // Get damage bonus for all schools for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) SetStatInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS+i, SpellBaseDamageBonusDone(SpellSchoolMask(1 << i))); + + if (HasAuraType(SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT)) + UpdateAttackPowerAndDamage(); } bool Player::UpdateAllStats() @@ -298,13 +307,17 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) UnitMods unitMod = ranged ? UNIT_MOD_ATTACK_POWER_RANGED : UNIT_MOD_ATTACK_POWER; uint16 index = UNIT_FIELD_ATTACK_POWER; + uint16 index_mod = UNIT_FIELD_ATTACK_POWER_MOD_POS; + uint16 index_mult = UNIT_FIELD_ATTACK_POWER_MULTIPLIER; if (ranged) { index = UNIT_FIELD_RANGED_ATTACK_POWER; + index_mod = UNIT_FIELD_RANGED_ATTACK_POWER_MOD_POS; + index_mult = UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER; val2 = (level + std::max(GetStat(STAT_AGILITY), 0.0f)) * entry->RangedAttackPowerPerAgility; } - else + else if (!HasAuraType(SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT)) { float strengthValue = std::max(GetStat(STAT_STRENGTH) * entry->AttackPowerPerStrength, 0.0f); float agilityValue = std::max(GetStat(STAT_AGILITY) * entry->AttackPowerPerAgility, 0.0f); @@ -316,11 +329,20 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) val2 = strengthValue + agilityValue; } + else + { + int32 minSpellPower = GetInt32Value(PLAYER_FIELD_MOD_HEALING_DONE_POS); + for (int i = SPELL_SCHOOL_HOLY; i < MAX_SPELL_SCHOOL; ++i) + minSpellPower = std::min(minSpellPower, GetInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_POS + i)); + + val2 = CalculatePct(float(minSpellPower), GetFloatValue(PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT)); + } SetModifierValue(unitMod, BASE_VALUE, val2); float base_attPower = GetModifierValue(unitMod, BASE_VALUE) * GetModifierValue(unitMod, BASE_PCT); float attPowerMod = GetModifierValue(unitMod, TOTAL_VALUE); + float attPowerMultiplier = GetModifierValue(unitMod, TOTAL_PCT) - 1.0f; //add dynamic flat mods if (!ranged) @@ -332,6 +354,8 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) } SetInt32Value(index, (uint32)base_attPower); //UNIT_FIELD_(RANGED)_ATTACK_POWER field + SetInt32Value(index_mod, (uint32)attPowerMod); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MOD_POS field + SetFloatValue(index_mult, attPowerMultiplier); //UNIT_FIELD_(RANGED)_ATTACK_POWER_MULTIPLIER field Pet* pet = GetPet(); //update pet's AP Guardian* guardian = GetGuardianPet(); @@ -347,7 +371,9 @@ void Player::UpdateAttackPowerAndDamage(bool ranged) UpdateDamagePhysical(BASE_ATTACK); if (CanDualWield() && haveOffhandWeapon()) //allow update offhand damage only if player knows DualWield Spec and has equipped offhand weapon UpdateDamagePhysical(OFF_ATTACK); - if (getClass() == CLASS_SHAMAN || getClass() == CLASS_PALADIN) // mental quickness + if (HasAuraType(SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER) || + HasAuraType(SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER) || + HasAuraType(SPELL_AURA_OVERRIDE_SPELL_POWER_BY_AP_PCT)) UpdateSpellDamageAndHealingBonus(); if (pet && pet->IsPetGhoul()) // At melee attack power change for DK pet @@ -732,10 +758,6 @@ void Player::UpdateManaRegen() // Apply PCT bonus from SPELL_AURA_MOD_POWER_REGEN_PERCENT aura on spirit base regen spirit_regen *= GetTotalAuraMultiplierByMiscValue(SPELL_AURA_MOD_POWER_REGEN_PERCENT, POWER_MANA); - // SpiritRegen(SPI, INT, LEVEL) = (0.001 + (SPI x sqrt(INT) x BASE_REGEN[LEVEL])) x 5 - if (GetStat(STAT_INTELLECT) > 0.0f) - spirit_regen *= std::sqrt(GetStat(STAT_INTELLECT)); - // CombatRegen = 5% of Base Mana float base_regen = GetCreateMana() * 0.01f + GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_POWER_REGEN, POWER_MANA) / 5.0f; diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 5b0a8557832..f02885a0ea6 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -1741,6 +1741,14 @@ void Unit::CalcAbsorbResist(Unit* victim, SpellSchoolMask schoolMask, DamageEffe splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage())); dmgInfo.AbsorbDamage(splitDamage); + + // check if caster is immune to damage + if (caster->IsImmunedToDamage(schoolMask)) + { + victim->SendSpellMiss(caster, (*itr)->GetSpellInfo()->Id, SPELL_MISS_IMMUNE); + continue; + } + uint32 split_absorb = 0; DealDamageMods(caster, splitDamage, &split_absorb); @@ -5617,7 +5625,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere case 70664: { // Proc only from normal Rejuvenation - if (procSpell->SpellVisual[0] != 32) + if (procSpell->Id != 774) return false; Player* caster = ToPlayer(); @@ -5699,7 +5707,7 @@ bool Unit::HandleDummyAuraProc(Unit* victim, uint32 damage, AuraEffect* triggere // At melee attack or Hammer of the Righteous spell damage considered as melee attack bool stacker = !procSpell || procSpell->Id == 53595; // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements - bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39)); + bool damager = procSpell && (procSpell->EquippedItemClass != -1 || procSpell->Id == 71433 || procSpell->Id == 71434); if (!stacker && !damager) return false; @@ -8129,13 +8137,14 @@ int32 Unit::HealBySpell(Unit* victim, SpellInfo const* spellInfo, uint32 addHeal void Unit::SendEnergizeSpellLog(Unit* victim, uint32 spellId, int32 damage, Powers powerType) { - WorldPacket data(SMSG_SPELL_ENERGIZE_LOG, (8+8+4+4+4+1)); - data << victim->GetPackGUID(); - data << GetPackGUID(); - data << uint32(spellId); - data << uint32(powerType); - data << int32(damage); - SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellEnergizeLog data; + data.CasterGUID = GetGUID(); + data.TargetGUID = victim->GetGUID(); + data.SpellID = spellId; + data.Type = powerType; + data.Amount = damage; + + SendMessageToSet(data.Write(), true); } void Unit::EnergizeBySpell(Unit* victim, uint32 spellId, int32 damage, Powers powerType) @@ -8519,6 +8528,13 @@ uint32 Unit::SpellDamageBonusTaken(Unit* caster, SpellInfo const* spellProto, ui int32 Unit::SpellBaseDamageBonusDone(SpellSchoolMask schoolMask) const { + if (GetTypeId() == TYPEID_PLAYER) + { + float overrideSP = GetFloatValue(PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT); + if (overrideSP > 0.0f) + return int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), overrideSP) + 0.5f); + } + int32 DoneAdvertisedBenefit = 0; AuraEffectList const& mDamageDone = GetAuraEffectsByType(SPELL_AURA_MOD_DAMAGE_DONE); @@ -9089,6 +9105,13 @@ uint32 Unit::SpellHealingBonusTaken(Unit* caster, SpellInfo const* spellProto, u int32 Unit::SpellBaseHealingBonusDone(SpellSchoolMask schoolMask) const { + if (GetTypeId() == TYPEID_PLAYER) + { + float overrideSP = GetFloatValue(PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT); + if (overrideSP > 0.0f) + return int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), overrideSP) + 0.5f); + } + int32 advertisedBenefit = 0; AuraEffectList const& mHealingDone = GetAuraEffectsByType(SPELL_AURA_MOD_HEALING_DONE); @@ -9678,11 +9701,11 @@ void Unit::Dismount() MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const { if (!mountType) - return NULL; + return nullptr; - MountTypeEntry const* mountTypeEntry = sMountTypeStore.LookupEntry(mountType); - if (!mountTypeEntry) - return NULL; + DB2Manager::MountTypeXCapabilitySet const* capabilities = sDB2Manager.GetMountCapabilities(mountType); + if (!capabilities) + return nullptr; uint32 zoneId, areaId; GetZoneAndAreaId(zoneId, areaId); @@ -9690,9 +9713,9 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const if (GetTypeId() == TYPEID_PLAYER) ridingSkill = ToPlayer()->GetSkillValue(SKILL_RIDING); - for (uint32 i = MAX_MOUNT_CAPABILITIES; i > 0; --i) + for (MountTypeXCapabilityEntry const* mountTypeXCapability : *capabilities) { - MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(mountTypeEntry->MountCapability[i - 1]); + MountCapabilityEntry const* mountCapability = sMountCapabilityStore.LookupEntry(mountTypeXCapability->MountCapabilityID); if (!mountCapability) continue; @@ -9730,7 +9753,7 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const return mountCapability; } - return NULL; + return nullptr; } bool Unit::IsServiceProvider() const @@ -10388,6 +10411,13 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) /// @todo possible affect only on MOVE_RUN if (int32 normalization = GetMaxPositiveAuraModifier(SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED)) { + if (Creature* creature = ToCreature()) + { + uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask; + if (immuneMask & (1 << MECHANIC_SNARE) || immuneMask & (1 << MECHANIC_DAZE)) + break; + } + // Use speed from aura float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]); if (speed > max_speed) @@ -10409,15 +10439,15 @@ void Unit::UpdateSpeed(UnitMoveType mtype, bool forced) // Apply strongest slow aura mod to speed int32 slow = GetMaxNegativeAuraModifier(SPELL_AURA_MOD_DECREASE_SPEED); if (slow) - { AddPct(speed, slow); - if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED)) - { - float min_speed = minSpeedMod / 100.0f; - if (speed < min_speed) - speed = min_speed; - } + + if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED)) + { + float min_speed = minSpeedMod / 100.0f; + if (speed < min_speed) + speed = min_speed; } + SetSpeed(mtype, speed, forced); } @@ -10969,7 +10999,7 @@ void Unit::ModSpellCastTime(SpellInfo const* spellInfo, int32 & castTime, Spell* castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED)); else if (spellInfo->HasAttribute(SPELL_ATTR0_REQ_AMMO) && !spellInfo->HasAttribute(SPELL_ATTR2_AUTOREPEAT_FLAG)) castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]); - else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat. + else if (IsPartOfSkillLine(SKILL_COOKING, spellInfo->Id) && HasAura(67556)) // cooking with Chef Hat. castTime = 500; } @@ -11559,7 +11589,7 @@ uint32 Unit::GetPowerIndex(uint32 powerType) const if (ToPet() && ToPet()->getPetType() == HUNTER_PET) classId = CLASS_HUNTER; - return GetPowerIndexByClass(powerType, classId); + return sDB2Manager.GetPowerIndexByClass(powerType, classId); } int32 Unit::GetCreatePowers(Powers power) const @@ -13665,18 +13695,11 @@ void Unit::SetControlled(bool apply, UnitState state) { case UNIT_STATE_STUNNED: SetStunned(true); - // i need to stop fear on stun and root or i will get teleport to destination issue as MVMGEN for fear keeps going on - if (HasUnitState(UNIT_STATE_FLEEING)) - SetFeared(false); CastStop(); break; case UNIT_STATE_ROOT: if (!HasUnitState(UNIT_STATE_STUNNED)) - { SetRooted(true); - if (HasUnitState(UNIT_STATE_FLEEING)) - SetFeared(false); - } break; case UNIT_STATE_CONFUSED: if (!HasUnitState(UNIT_STATE_STUNNED)) @@ -13760,10 +13783,9 @@ void Unit::SetStunned(bool apply) SetTarget(ObjectGuid::Empty); SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); - // Creature specific - if (GetTypeId() != TYPEID_PLAYER) - StopMoving(); - else + StopMoving(); + + if (GetTypeId() == TYPEID_PLAYER) SetStandState(UNIT_STAND_STATE_STAND); SetRooted(true); @@ -13796,6 +13818,7 @@ void Unit::SetRooted(bool apply, bool packetOnly /*= false*/) // setting MOVEMENTFLAG_ROOT RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING); AddUnitMovementFlag(MOVEMENTFLAG_ROOT); + StopMoving(); } else RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); @@ -15989,28 +16012,11 @@ void Unit::SendSetVehicleRecId(uint32 vehicleId) void Unit::SendSetPlayHoverAnim(bool enable) { - ObjectGuid guid = GetGUID(); - WorldPacket data(SMSG_SET_PLAY_HOVER_ANIM, 10); - data.WriteBit(guid[4]); - data.WriteBit(guid[0]); - data.WriteBit(guid[1]); - data.WriteBit(enable); - data.WriteBit(guid[3]); - data.WriteBit(guid[7]); - data.WriteBit(guid[5]); - data.WriteBit(guid[2]); - data.WriteBit(guid[6]); + WorldPackets::Misc::SetPlayHoverAnim data; + data.UnitGUID = GetGUID(); + data.PlayHoverAnim = enable; - data.WriteByteSeq(guid[3]); - data.WriteByteSeq(guid[2]); - data.WriteByteSeq(guid[1]); - data.WriteByteSeq(guid[7]); - data.WriteByteSeq(guid[0]); - data.WriteByteSeq(guid[5]); - data.WriteByteSeq(guid[4]); - data.WriteByteSeq(guid[6]); - - SendMessageToSet(&data, true); + SendMessageToSet(data.Write(), true); } bool Unit::IsSplineEnabled() const @@ -16314,6 +16320,23 @@ void Unit::Whisper(std::string const& text, Language language, Player* target, b target->SendDirectMessage(packet.Write()); } +uint32 Unit::GetVirtualItemId(uint32 slot) const +{ + if (slot >= MAX_EQUIPMENT_ITEMS) + return 0; + + return GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot * 2); +} + +void Unit::SetVirtualItem(uint32 slot, uint32 itemId, uint16 appearanceModId /*= 0*/) +{ + if (slot >= MAX_EQUIPMENT_ITEMS) + return; + + SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot * 2, itemId); + SetUInt16Value(UNIT_VIRTUAL_ITEM_SLOT_ID + slot * 2 + 1, 0, appearanceModId); +} + void Unit::Talk(uint32 textId, ChatMsg msgType, float textRange, WorldObject const* target) { if (!sBroadcastTextStore.LookupEntry(textId)) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 538bcea9eba..ebf05876e10 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -380,6 +380,7 @@ enum InventorySlot }; struct FactionTemplateEntry; +struct MountCapabilityEntry; struct SpellValue; class AuraApplication; @@ -1276,6 +1277,8 @@ enum PlayerTotemType SUMMON_TYPE_TOTEM_AIR = 83 }; +#define MAX_EQUIPMENT_ITEMS 3 + // delay time next attack to prevent client attack animation problems #define ATTACK_DISPLAY_DELAY 200 #define MAX_PLAYER_STEALTH_DETECT_RANGE 30.0f // max distance for detection targets by player @@ -2202,6 +2205,9 @@ class Unit : public WorldObject void TextEmote(uint32 textId, WorldObject const* target = nullptr, bool isBossEmote = false); void Whisper(uint32 textId, Player* target, bool isBossWhisper = false); + uint32 GetVirtualItemId(uint32 slot) const; + void SetVirtualItem(uint32 slot, uint32 itemId, uint16 appearanceModId = 0); + protected: explicit Unit (bool isWorldObject); diff --git a/src/server/game/Entities/Vehicle/VehicleDefines.h b/src/server/game/Entities/Vehicle/VehicleDefines.h index 5569fcbf353..d0221e3e812 100644 --- a/src/server/game/Entities/Vehicle/VehicleDefines.h +++ b/src/server/game/Entities/Vehicle/VehicleDefines.h @@ -129,7 +129,6 @@ public: /// This method transforms supplied global coordinates into local offsets virtual void CalculatePassengerOffset(float& x, float& y, float& z, float* o = NULL) const = 0; -protected: static void CalculatePassengerPosition(float& x, float& y, float& z, float* o, float transX, float transY, float transZ, float transO) { float inx = x, iny = y, inz = z; diff --git a/src/server/game/Garrison/Garrison.cpp b/src/server/game/Garrison/Garrison.cpp index c6475183c39..7040ae65b19 100644 --- a/src/server/game/Garrison/Garrison.cpp +++ b/src/server/game/Garrison/Garrison.cpp @@ -16,10 +16,12 @@ */ #include "Garrison.h" +#include "Creature.h" #include "GameObject.h" #include "GarrisonMgr.h" #include "MapManager.h" #include "ObjectMgr.h" +#include "VehicleDefines.h" Garrison::Garrison(Player* owner) : _owner(owner), _siteLevel(nullptr), _followerActivationsRemainingToday(1) { @@ -133,25 +135,11 @@ bool Garrison::LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blue return true; } -void Garrison::SaveToDB(SQLTransaction& trans) +void Garrison::SaveToDB(SQLTransaction trans) { - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BLUEPRINTS); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BUILDINGS); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); - - stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_FOLLOWERS); - stmt->setUInt64(0, _owner->GetGUID().GetCounter()); - trans->Append(stmt); + DeleteFromDB(_owner->GetGUID().GetCounter(), trans); - stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CHARACTER_GARRISON); stmt->setUInt64(0, _owner->GetGUID().GetCounter()); stmt->setUInt32(1, _siteLevel->ID); stmt->setUInt32(2, _followerActivationsRemainingToday); @@ -210,6 +198,25 @@ void Garrison::SaveToDB(SQLTransaction& trans) } } +void Garrison::DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans) +{ + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BLUEPRINTS); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_BUILDINGS); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CHARACTER_GARRISON_FOLLOWERS); + stmt->setUInt64(0, ownerGuid); + trans->Append(stmt); +} + bool Garrison::Create(uint32 garrSiteId) { _siteLevel = sGarrisonMgr.GetGarrSiteLevelEntry(garrSiteId, 1); @@ -226,6 +233,18 @@ bool Garrison::Create(uint32 garrSiteId) return true; } +void Garrison::Delete() +{ + SQLTransaction trans = CharacterDatabase.BeginTransaction(); + DeleteFromDB(_owner->GetGUID().GetCounter(), trans); + CharacterDatabase.CommitTransaction(trans); + + WorldPackets::Garrison::GarrisonDeleteResult garrisonDelete; + garrisonDelete.Result = GARRISON_SUCCESS; + garrisonDelete.GarrSiteID = _siteLevel->SiteID; + _owner->SendDirectMessage(garrisonDelete.Write()); +} + void Garrison::InitializePlots() { if (std::vector<GarrSiteLevelPlotInstEntry const*> const* plots = sGarrisonMgr.GetGarrPlotInstForSiteLevel(_siteLevel->ID)) @@ -378,6 +397,8 @@ void Garrison::PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId) buildingRemoved.GarrBuildingID = oldBuildingId; _owner->SendDirectMessage(buildingRemoved.Write()); } + + _owner->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_PLACE_GARRISON_BUILDING, garrBuildingId); } _owner->SendDirectMessage(placeBuildingResult.Write()); @@ -431,6 +452,27 @@ void Garrison::CancelBuildingConstruction(uint32 garrPlotInstanceId) _owner->SendDirectMessage(buildingRemoved.Write()); } +void Garrison::ActivateBuilding(uint32 garrPlotInstanceId) +{ + if (Plot* plot = GetPlot(garrPlotInstanceId)) + { + if (plot->BuildingInfo.CanActivate() && plot->BuildingInfo.PacketInfo && !plot->BuildingInfo.PacketInfo->Active) + { + plot->BuildingInfo.PacketInfo->Active = true; + if (Map* map = FindMap()) + { + plot->DeleteGameObject(map); + if (GameObject* go = plot->CreateGameObject(map, GetFaction())) + map->AddToMap(go); + } + + WorldPackets::Garrison::GarrisonBuildingActivated buildingActivated; + buildingActivated.GarrPlotInstanceID = garrPlotInstanceId; + _owner->SendDirectMessage(buildingActivated.Write()); + } + } +} + void Garrison::AddFollower(uint32 garrFollowerId) { WorldPackets::Garrison::GarrisonAddFollowerResult addFollowerResult; @@ -581,7 +623,7 @@ GarrisonError Garrison::CheckBuildingPlacement(uint32 garrPlotInstanceId, uint32 if (!_owner->HasCurrency(building->CostCurrencyID, building->CostCurrencyAmount)) return GARRISON_ERROR_NOT_ENOUGH_CURRENCY; - if (!_owner->HasEnoughMoney(uint64(building->CostMoney * GOLD))) + if (!_owner->HasEnoughMoney(uint64(building->CostMoney) * GOLD)) return GARRISON_ERROR_NOT_ENOUGH_GOLD; // New building cannot replace another building currently under construction @@ -607,6 +649,40 @@ GarrisonError Garrison::CheckBuildingRemoval(uint32 garrPlotInstanceId) const return GARRISON_SUCCESS; } +template<class T, void(T::*SecondaryRelocate)(float,float,float,float)> +T* BuildingSpawnHelper(GameObject* building, ObjectGuid::LowType spawnId, Map* map) +{ + T* spawn = new T(); + if (!spawn->LoadFromDB(spawnId, map)) + { + delete spawn; + return nullptr; + } + + float x = spawn->GetPositionX(); + float y = spawn->GetPositionY(); + float z = spawn->GetPositionZ(); + float o = spawn->GetOrientation(); + TransportBase::CalculatePassengerPosition(x, y, z, &o, building->GetPositionX(), building->GetPositionY(), building->GetPositionZ(), building->GetOrientation()); + + spawn->Relocate(x, y, z, o); + (spawn->*SecondaryRelocate)(x, y, z, o); + + if (!spawn->IsPositionValid()) + { + delete spawn; + return nullptr; + } + + if (!map->AddToMap(spawn)) + { + delete spawn; + return nullptr; + } + + return spawn; +} + GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex faction) { uint32 entry = EmptyGameObjectId; @@ -615,10 +691,9 @@ GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex fact GarrPlotInstanceEntry const* plotInstance = sGarrPlotInstanceStore.AssertEntry(PacketInfo.GarrPlotInstanceID); GarrPlotEntry const* plot = sGarrPlotStore.AssertEntry(plotInstance->GarrPlotID); GarrBuildingEntry const* building = sGarrBuildingStore.AssertEntry(BuildingInfo.PacketInfo->GarrBuildingID); - if (BuildingInfo.PacketInfo->Active) + entry = faction == GARRISON_FACTION_INDEX_HORDE ? plot->HordeConstructionGameObjectID : plot->AllianceConstructionGameObjectID; + if (BuildingInfo.PacketInfo->Active || !entry) entry = faction == GARRISON_FACTION_INDEX_HORDE ? building->HordeGameObjectID : building->AllianceGameObjectID; - else - entry = faction == GARRISON_FACTION_INDEX_HORDE ? plot->HordeConstructionGameObjectID : plot->AllianceConstructionGameObjectID; } if (!sObjectMgr->GetGameObjectTemplate(entry)) @@ -628,16 +703,53 @@ GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex fact } Position const& pos = PacketInfo.PlotPos; - GameObject* go = new GameObject(); - if (!go->Create(map->GenerateLowGuid<HighGuid::GameObject>(), entry, map, 0, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), - 0.0f, 0.0f, 0.0f, 0.0f, 0, GO_STATE_ACTIVE)) + GameObject* building = new GameObject(); + if (!building->Create(map->GenerateLowGuid<HighGuid::GameObject>(), entry, map, 0, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), + 0.0f, 0.0f, 0.0f, 0.0f, 255, GO_STATE_READY)) { - delete go; + delete building; return nullptr; } - BuildingInfo.Guid = go->GetGUID(); - return go; + if (BuildingInfo.CanActivate() && BuildingInfo.PacketInfo && !BuildingInfo.PacketInfo->Active) + { + if (FinalizeGarrisonPlotGOInfo const* finalizeInfo = sGarrisonMgr.GetPlotFinalizeGOInfo(PacketInfo.GarrPlotInstanceID)) + { + Position const& pos2 = finalizeInfo->FactionInfo[faction].Pos; + GameObject* finalizer = new GameObject(); + if (finalizer->Create(map->GenerateLowGuid<HighGuid::GameObject>(), finalizeInfo->FactionInfo[faction].GameObjectId, map, 0, pos2.GetPositionX(), pos2.GetPositionY(), + pos2.GetPositionZ(), pos2.GetOrientation(), 0.0f, 0.0f, 0.0f, 0.0f, 255, GO_STATE_READY)) + { + // set some spell id to make the object delete itself after use + finalizer->SetSpellId(finalizer->GetGOInfo()->goober.spell); + finalizer->SetRespawnTime(0); + + if (uint16 animKit = finalizeInfo->FactionInfo[faction].AnimKitId) + finalizer->SetAIAnimKitId(animKit); + + map->AddToMap(finalizer); + } + else + delete finalizer; + } + } + + if (building->GetGoType() == GAMEOBJECT_TYPE_GARRISON_BUILDING && building->GetGOInfo()->garrisonBuilding.mapID) + { + for (CellObjectGuidsMap::value_type const& cellGuids : sObjectMgr->GetMapObjectGuids(building->GetGOInfo()->garrisonBuilding.mapID, map->GetSpawnMode())) + { + for (ObjectGuid::LowType spawnId : cellGuids.second.creatures) + if (Creature* spawn = BuildingSpawnHelper<Creature, &Creature::SetHomePosition>(building, spawnId, map)) + BuildingInfo.Spawns.insert(spawn->GetGUID()); + + for (ObjectGuid::LowType spawnId : cellGuids.second.gameobjects) + if (GameObject* spawn = BuildingSpawnHelper<GameObject, &GameObject::RelocateStationaryPosition>(building, spawnId, map)) + BuildingInfo.Spawns.insert(spawn->GetGUID()); + } + } + + BuildingInfo.Guid = building->GetGUID(); + return building; } void Garrison::Plot::DeleteGameObject(Map* map) @@ -645,6 +757,27 @@ void Garrison::Plot::DeleteGameObject(Map* map) if (BuildingInfo.Guid.IsEmpty()) return; + for (ObjectGuid const& guid : BuildingInfo.Spawns) + { + WorldObject* object = nullptr; + switch (guid.GetHigh()) + { + case HighGuid::Creature: + object = map->GetCreature(guid); + break; + case HighGuid::GameObject: + object = map->GetGameObject(guid); + break; + default: + continue; + } + + if (object) + object->AddObjectToRemoveList(); + } + + BuildingInfo.Spawns.clear(); + if (GameObject* oldBuilding = map->GetGameObject(BuildingInfo.Guid)) oldBuilding->Delete(); diff --git a/src/server/game/Garrison/Garrison.h b/src/server/game/Garrison/Garrison.h index 71d67a1b6b5..11311ef7fc3 100644 --- a/src/server/game/Garrison/Garrison.h +++ b/src/server/game/Garrison/Garrison.h @@ -37,6 +37,12 @@ enum GarrisonFollowerFlags GARRISON_FOLLOWER_FLAG_UNIQUE = 0x1 }; +enum GarrisonFollowerType +{ + FOLLOWER_TYPE_GARRISON = 1, + FOLLOWER_TYPE_SHIPYARD = 2 +}; + enum GarrisonAbilityFlags { GARRISON_ABILITY_FLAG_TRAIT = 0x01, @@ -82,6 +88,7 @@ public: bool CanActivate() const; ObjectGuid Guid; + std::unordered_set<ObjectGuid> Spawns; Optional<WorldPackets::Garrison::GarrisonBuildingInfo> PacketInfo; }; @@ -109,9 +116,11 @@ public: bool LoadFromDB(PreparedQueryResult garrison, PreparedQueryResult blueprints, PreparedQueryResult buildings, PreparedQueryResult followers, PreparedQueryResult abilities); - void SaveToDB(SQLTransaction& trans); + void SaveToDB(SQLTransaction trans); + static void DeleteFromDB(ObjectGuid::LowType ownerGuid, SQLTransaction trans); bool Create(uint32 garrSiteId); + void Delete(); void Upgrade(); void Enter() const; @@ -129,6 +138,7 @@ public: void UnlearnBlueprint(uint32 garrBuildingId); void PlaceBuilding(uint32 garrPlotInstanceId, uint32 garrBuildingId); void CancelBuildingConstruction(uint32 garrPlotInstanceId); + void ActivateBuilding(uint32 garrPlotInstanceId); // Followers void AddFollower(uint32 garrFollowerId); diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp index f95acef952c..86392a26d36 100644 --- a/src/server/game/Garrison/GarrisonMgr.cpp +++ b/src/server/game/Garrison/GarrisonMgr.cpp @@ -21,6 +21,8 @@ #include "Garrison.h" #include "ObjectDefines.h" #include "World.h" +#include "GameObject.h" +#include "ObjectMgr.h" void GarrisonMgr::Initialize() { @@ -44,6 +46,9 @@ void GarrisonMgr::Initialize() { if (GarrAbilityEntry const* ability = sGarrAbilityStore.LookupEntry(followerAbility->GarrAbilityID)) { + if (ability->FollowerTypeID != FOLLOWER_TYPE_GARRISON) + continue; + if (!(ability->Flags & GARRISON_ABILITY_CANNOT_ROLL) && ability->Flags & GARRISON_ABILITY_FLAG_TRAIT) _garrisonFollowerRandomTraits.insert(ability); @@ -58,6 +63,7 @@ void GarrisonMgr::Initialize() } InitializeDbIdSequences(); + LoadPlotFinalizeGOInfo(); LoadFollowerClassSpecAbilities(); } @@ -121,6 +127,15 @@ GarrBuildingEntry const* GarrisonMgr::GetPreviousLevelBuilding(uint32 buildingTy return nullptr; } +FinalizeGarrisonPlotGOInfo const* GarrisonMgr::GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const +{ + auto itr = _finalizePlotGOInfo.find(garrPlotInstanceID); + if (itr != _finalizePlotGOInfo.end()) + return &itr->second; + + return nullptr; +} + uint64 GarrisonMgr::GenerateFollowerDbId() { if (_followerDbIdGenerator >= std::numeric_limits<uint64>::max()) @@ -149,7 +164,7 @@ std::list<GarrAbilityEntry const*> GarrisonMgr::RollFollowerAbilities(GarrFollow bool hasForcedExclusiveTrait = false; std::list<GarrAbilityEntry const*> result; - int32 slots[2] = { AbilitiesForQuality[quality][0], AbilitiesForQuality[quality][1] }; + uint32 slots[2] = { AbilitiesForQuality[quality][0], AbilitiesForQuality[quality][1] }; GarrAbilities const* abilities = nullptr; auto itr = _garrisonFollowerAbilities[faction].find(follower->ID); @@ -258,7 +273,7 @@ std::list<GarrAbilityEntry const*> GarrisonMgr::RollFollowerAbilities(GarrFollow if ((*itr)->Flags & GARRISON_ABILITY_FLAG_EXCLUSIVE) break; - while (traitList.size() < std::max<int32>(0, slots[1] - forcedTraits.size()) && total) + while (traitList.size() < size_t(std::max<int32>(0, slots[1] - forcedTraits.size())) && total) { auto itr = genericTraits.begin(); std::advance(itr, urand(0, total-- - 1)); @@ -312,6 +327,92 @@ void GarrisonMgr::InitializeDbIdSequences() _followerDbIdGenerator = (*result)[0].GetUInt64() + 1; } +void GarrisonMgr::LoadPlotFinalizeGOInfo() +{ + // 0 1 2 3 4 5 6 + QueryResult result = WorldDatabase.Query("SELECT garrPlotInstanceId, hordeGameObjectId, hordeX, hordeY, hordeZ, hordeO, hordeAnimKitId, " + // 7 8 9 10 11 12 + "allianceGameObjectId, allianceX, allianceY, allianceZ, allianceO, allianceAnimKitId FROM garrison_plot_finalize_info"); + if (!result) + { + TC_LOG_INFO("server.loading", ">> Loaded 0 garrison follower class spec abilities. DB table `garrison_plot_finalize_info` is empty."); + return; + } + + uint32 msTime = getMSTime(); + do + { + Field* fields = result->Fetch(); + uint32 garrPlotInstanceId = fields[0].GetUInt32(); + uint32 hordeGameObjectId = fields[1].GetUInt32(); + uint32 allianceGameObjectId = fields[7].GetUInt32(); + uint16 hordeAnimKitId = fields[6].GetUInt16(); + uint16 allianceAnimKitId = fields[12].GetUInt16(); + + if (!sGarrPlotInstanceStore.LookupEntry(garrPlotInstanceId)) + { + TC_LOG_ERROR("sql.sql", "Non-existing GarrPlotInstance.db2 entry %u was referenced in `garrison_plot_finalize_info`.", garrPlotInstanceId); + continue; + } + + GameObjectTemplate const* goTemplate = sObjectMgr->GetGameObjectTemplate(hordeGameObjectId); + if (!goTemplate) + { + TC_LOG_ERROR("sql.sql", "Non-existing gameobject_template entry %u was referenced in `garrison_plot_finalize_info`.`hordeGameObjectId` for garrPlotInstanceId %u.", + hordeGameObjectId, garrPlotInstanceId); + continue; + } + + if (goTemplate->type != GAMEOBJECT_TYPE_GOOBER) + { + TC_LOG_ERROR("sql.sql", "Invalid gameobject type %u (entry %u) was referenced in `garrison_plot_finalize_info`.`hordeGameObjectId` for garrPlotInstanceId %u.", + goTemplate->type, hordeGameObjectId, garrPlotInstanceId); + continue; + } + + goTemplate = sObjectMgr->GetGameObjectTemplate(allianceGameObjectId); + if (!goTemplate) + { + TC_LOG_ERROR("sql.sql", "Non-existing gameobject_template entry %u was referenced in `garrison_plot_finalize_info`.`allianceGameObjectId` for garrPlotInstanceId %u.", + allianceGameObjectId, garrPlotInstanceId); + continue; + } + + if (goTemplate->type != GAMEOBJECT_TYPE_GOOBER) + { + TC_LOG_ERROR("sql.sql", "Invalid gameobject type %u (entry %u) was referenced in `garrison_plot_finalize_info`.`allianceGameObjectId` for garrPlotInstanceId %u.", + goTemplate->type, allianceGameObjectId, garrPlotInstanceId); + continue; + } + + if (hordeAnimKitId && !sAnimKitStore.LookupEntry(hordeAnimKitId)) + { + TC_LOG_ERROR("sql.sql", "Non-existing AnimKit.dbc entry %u was referenced in `garrison_plot_finalize_info`.`hordeAnimKitId` for garrPlotInstanceId %u.", + hordeAnimKitId, garrPlotInstanceId); + continue; + } + + if (allianceAnimKitId && !sAnimKitStore.LookupEntry(allianceAnimKitId)) + { + TC_LOG_ERROR("sql.sql", "Non-existing AnimKit.dbc entry %u was referenced in `garrison_plot_finalize_info`.`allianceAnimKitId` for garrPlotInstanceId %u.", + allianceAnimKitId, garrPlotInstanceId); + continue; + } + + FinalizeGarrisonPlotGOInfo& info = _finalizePlotGOInfo[garrPlotInstanceId]; + info.FactionInfo[GARRISON_FACTION_INDEX_HORDE].GameObjectId = hordeGameObjectId; + info.FactionInfo[GARRISON_FACTION_INDEX_HORDE].Pos.Relocate(fields[2].GetFloat(), fields[3].GetFloat(), fields[4].GetFloat(), fields[5].GetFloat()); + info.FactionInfo[GARRISON_FACTION_INDEX_HORDE].AnimKitId = hordeAnimKitId; + + info.FactionInfo[GARRISON_FACTION_INDEX_ALLIANCE].GameObjectId = allianceGameObjectId; + info.FactionInfo[GARRISON_FACTION_INDEX_ALLIANCE].Pos.Relocate(fields[8].GetFloat(), fields[9].GetFloat(), fields[10].GetFloat(), fields[11].GetFloat()); + info.FactionInfo[GARRISON_FACTION_INDEX_ALLIANCE].AnimKitId = allianceAnimKitId; + + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u garrison plot finalize entries in %u.", uint32(_finalizePlotGOInfo.size()), GetMSTimeDiffToNow(msTime)); +} + void GarrisonMgr::LoadFollowerClassSpecAbilities() { QueryResult result = WorldDatabase.Query("SELECT classSpecId, abilityId FROM garrison_follower_class_spec_abilities"); @@ -321,6 +422,7 @@ void GarrisonMgr::LoadFollowerClassSpecAbilities() return; } + uint32 msTime = getMSTime(); uint32 count = 0; do { @@ -349,5 +451,5 @@ void GarrisonMgr::LoadFollowerClassSpecAbilities() for (auto& pair : _garrisonFollowerClassSpecAbilities) pair.second.sort(); - TC_LOG_INFO("server.loading", ">> Loaded %u garrison follower class spec abilities.", count); + TC_LOG_INFO("server.loading", ">> Loaded %u garrison follower class spec abilities in %u.", count, GetMSTimeDiffToNow(msTime)); } diff --git a/src/server/game/Garrison/GarrisonMgr.h b/src/server/game/Garrison/GarrisonMgr.h index 63810e3c3ab..3ef90cc7e66 100644 --- a/src/server/game/Garrison/GarrisonMgr.h +++ b/src/server/game/Garrison/GarrisonMgr.h @@ -20,6 +20,17 @@ #include "DB2Stores.h" #include <unordered_set> +#include "Position.h" + +struct FinalizeGarrisonPlotGOInfo +{ + struct + { + uint32 GameObjectId; + Position Pos; + uint16 AnimKitId; + } FactionInfo[2]; +}; struct GarrAbilities { @@ -44,12 +55,14 @@ public: bool IsPlotMatchingBuilding(uint32 garrPlotId, uint32 garrBuildingId) const; uint32 GetGarrBuildingPlotInst(uint32 garrBuildingId, uint32 garrSiteLevelPlotInstId) const; GarrBuildingEntry const* GetPreviousLevelBuilding(uint32 buildingType, uint32 currentLevel) const; + FinalizeGarrisonPlotGOInfo const* GetPlotFinalizeGOInfo(uint32 garrPlotInstanceID) const; uint64 GenerateFollowerDbId(); std::list<GarrAbilityEntry const*> RollFollowerAbilities(GarrFollowerEntry const* follower, uint32 quality, uint32 faction, bool initial) const; std::list<GarrAbilityEntry const*> GetClassSpecAbilities(GarrFollowerEntry const* follower, uint32 faction) const; private: void InitializeDbIdSequences(); + void LoadPlotFinalizeGOInfo(); void LoadFollowerClassSpecAbilities(); std::unordered_map<uint32 /*garrSiteId*/, std::vector<GarrSiteLevelPlotInstEntry const*>> _garrisonPlotInstBySiteLevel; @@ -57,6 +70,7 @@ private: std::unordered_map<uint32 /*garrPlotId*/, std::unordered_set<uint32/*garrBuildingId*/>> _garrisonBuildingsByPlot; std::unordered_map<uint64 /*garrBuildingId | garrSiteLevelPlotInstId << 32*/, uint32 /*garrBuildingPlotInstId*/> _garrisonBuildingPlotInstances; std::unordered_map<uint32 /*buildingType*/, std::vector<GarrBuildingEntry const*>> _garrisonBuildingsByType; + std::unordered_map<uint32 /*garrPlotInstanceId*/, FinalizeGarrisonPlotGOInfo> _finalizePlotGOInfo; std::unordered_map<uint32 /*garrFollowerId*/, GarrAbilities> _garrisonFollowerAbilities[2]; std::unordered_map<uint32 /*classSpecId*/, std::list<GarrAbilityEntry const*>> _garrisonFollowerClassSpecAbilities; std::set<GarrAbilityEntry const*> _garrisonFollowerRandomTraits; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index cdd550a98f2..bcce1ab5798 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -284,6 +284,10 @@ ObjectMgr::~ObjectMgr() for (AccessRequirementContainer::iterator itr = _accessRequirementStore.begin(); itr != _accessRequirementStore.end(); ++itr) delete itr->second; + + for (QuestGreetingContainer::iterator itr = _questGreetingStore.begin(); itr != _questGreetingStore.end(); ++itr) + for (std::unordered_map<uint32, QuestGreeting const*>::iterator itr2 = itr->second.begin(); itr2 != itr->second.end(); ++itr2) + delete itr2->second; } void ObjectMgr::AddLocaleString(std::string const& value, LocaleConstant localeConstant, StringVector& data) @@ -416,11 +420,11 @@ void ObjectMgr::LoadCreatureTemplates() "dynamicflags, family, trainer_type, trainer_class, trainer_race, type, " // 39 40 41 42 43 44 45 46 47 48 49 "type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, " - // 50 51 52 53 54 55 56 57 58 59 60 61 62 63 - "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, " - // 64 65 66 67 68 69 70 71 72 + // 50 51 52 53 54 55 56 57 58 59 60 61 62 + "spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, " + // 63 64 65 66 67 68 69 70 71 "InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, " - // 73 74 75 76 77 78 + // 72 73 74 75 76 77 "RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template"); if (!result) @@ -505,28 +509,27 @@ void ObjectMgr::LoadCreatureTemplate(Field* fields) for (uint8 i = 0; i < CREATURE_MAX_SPELLS; ++i) creatureTemplate.spells[i] = fields[50 + i].GetUInt32(); - creatureTemplate.PetSpellDataId = fields[58].GetUInt32(); - creatureTemplate.VehicleId = fields[59].GetUInt32(); - creatureTemplate.mingold = fields[60].GetUInt32(); - creatureTemplate.maxgold = fields[61].GetUInt32(); - creatureTemplate.AIName = fields[62].GetString(); - creatureTemplate.MovementType = uint32(fields[63].GetUInt8()); - creatureTemplate.InhabitType = uint32(fields[64].GetUInt8()); - creatureTemplate.HoverHeight = fields[65].GetFloat(); - creatureTemplate.ModHealth = fields[66].GetFloat(); - creatureTemplate.ModHealthExtra = fields[67].GetFloat(); - creatureTemplate.ModMana = fields[68].GetFloat(); - creatureTemplate.ModManaExtra = fields[69].GetFloat(); - creatureTemplate.ModArmor = fields[70].GetFloat(); - creatureTemplate.ModDamage = fields[71].GetFloat(); - creatureTemplate.ModExperience = fields[72].GetFloat(); - creatureTemplate.RacialLeader = fields[73].GetBool(); - - creatureTemplate.movementId = fields[74].GetUInt32(); - creatureTemplate.RegenHealth = fields[75].GetBool(); - creatureTemplate.MechanicImmuneMask = fields[76].GetUInt32(); - creatureTemplate.flags_extra = fields[77].GetUInt32(); - creatureTemplate.ScriptID = GetScriptId(fields[78].GetCString()); + creatureTemplate.VehicleId = fields[58].GetUInt32(); + creatureTemplate.mingold = fields[59].GetUInt32(); + creatureTemplate.maxgold = fields[60].GetUInt32(); + creatureTemplate.AIName = fields[61].GetString(); + creatureTemplate.MovementType = uint32(fields[62].GetUInt8()); + creatureTemplate.InhabitType = uint32(fields[63].GetUInt8()); + creatureTemplate.HoverHeight = fields[64].GetFloat(); + creatureTemplate.ModHealth = fields[65].GetFloat(); + creatureTemplate.ModHealthExtra = fields[66].GetFloat(); + creatureTemplate.ModMana = fields[67].GetFloat(); + creatureTemplate.ModManaExtra = fields[68].GetFloat(); + creatureTemplate.ModArmor = fields[69].GetFloat(); + creatureTemplate.ModDamage = fields[70].GetFloat(); + creatureTemplate.ModExperience = fields[71].GetFloat(); + creatureTemplate.RacialLeader = fields[72].GetBool(); + + creatureTemplate.movementId = fields[73].GetUInt32(); + creatureTemplate.RegenHealth = fields[74].GetBool(); + creatureTemplate.MechanicImmuneMask = fields[75].GetUInt32(); + creatureTemplate.flags_extra = fields[76].GetUInt32(); + creatureTemplate.ScriptID = GetScriptId(fields[77].GetCString()); } void ObjectMgr::LoadCreatureTemplateAddons() @@ -907,13 +910,6 @@ void ObjectMgr::CheckCreatureTemplate(CreatureTemplate const* cInfo) } } - if (cInfo->PetSpellDataId) - { - CreatureSpellDataEntry const* spellDataId = sCreatureSpellDataStore.LookupEntry(cInfo->PetSpellDataId); - if (!spellDataId) - TC_LOG_ERROR("sql.sql", "Creature (Entry: %u) has non-existing PetSpellDataId (%u).", cInfo->Entry, cInfo->PetSpellDataId); - } - for (uint8 j = 0; j < CREATURE_MAX_SPELLS; ++j) { if (cInfo->spells[j] && !sSpellMgr->GetSpellInfo(cInfo->spells[j])) @@ -2624,7 +2620,7 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.FlagsCu = 0; itemTemplate.SpellPPMRate = 0.0f; - if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = GetItemSpecOverrides(sparse->ID)) + if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) { for (ItemSpecOverrideEntry const* itemSpecOverride : *itemSpecOverrides) itemTemplate.Specializations[0].insert(itemSpecOverride->SpecID); @@ -2677,12 +2673,8 @@ void ObjectMgr::LoadItemTemplates() // Check if item templates for DBC referenced character start outfit are present std::set<uint32> notFoundOutfit; - for (uint32 i = 1; i < sCharStartOutfitStore.GetNumRows(); ++i) + for (CharStartOutfitEntry const* entry : sCharStartOutfitStore) { - CharStartOutfitEntry const* entry = sCharStartOutfitStore.LookupEntry(i); - if (!entry) - continue; - for (int j = 0; j < MAX_OUTFIT_ITEMS; ++j) { if (entry->ItemID[j] <= 0) @@ -2986,7 +2978,7 @@ void ObjectMgr::PlayerCreateInfoAddItemHelper(uint32 race_, uint32 class_, uint3 for (uint32 gender = 0; gender < GENDER_NONE; ++gender) { - if (CharStartOutfitEntry const* entry = GetCharStartOutfitEntry(race_, class_, gender)) + if (CharStartOutfitEntry const* entry = sDB2Manager.GetCharStartOutfitEntry(race_, class_, gender)) { bool found = false; for (uint8 x = 0; x < MAX_OUTFIT_ITEMS; ++x) @@ -3641,8 +3633,8 @@ void ObjectMgr::LoadQuests() QueryResult result = WorldDatabase.Query("SELECT " //0 1 2 3 4 5 6 7 8 9 10 "ID, QuestType, QuestLevel, QuestPackageID, MinLevel, QuestSortID, QuestInfoID, SuggestedGroupNum, RewardNextQuest, RewardXPDifficulty, RewardXPMultiplier, " - //11 12 13 14 15 16 17 18 19 20 21 - "RewardMoney, RewardMoneyDifficulty, Float13, RewardBonusMoney, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, StartItem, Flags, FlagsEx, " + //11 12 13 14 15 16 17 18 19 20 21 + "RewardMoney, RewardMoneyDifficulty, RewardMoneyMultiplier, RewardBonusMoney, RewardDisplaySpell, RewardSpell, RewardHonor, RewardKillHonor, StartItem, Flags, FlagsEx, " //22 23 24 25 26 27 28 29 "RewardItem1, RewardAmount1, ItemDrop1, ItemDropQuantity1, RewardItem2, RewardAmount2, ItemDrop2, ItemDropQuantity2, " //30 31 32 33 34 35 36 37 @@ -5293,14 +5285,8 @@ void ObjectMgr::LoadNPCText() uint32 oldMSTime = getMSTime(); QueryResult result = WorldDatabase.Query("SELECT ID, " - "BroadcastTextID0, Probability0, " - "BroadcastTextID1, Probability1, " - "BroadcastTextID2, Probability2, " - "BroadcastTextID3, Probability3, " - "BroadcastTextID4, Probability4, " - "BroadcastTextID5, Probability5, " - "BroadcastTextID6, Probability6, " - "BroadcastTextID7, Probability7" + "Probability0, Probability1, Probability2, Probability3, Probability4, Probability5, Probability6, Probability7, " + "BroadcastTextID0, BroadcastTextID1, BroadcastTextID2, BroadcastTextID3, BroadcastTextID4, BroadcastTextID5, BroadcastTextID6, BroadcastTextID7" " FROM npc_text"); if (!result) { @@ -5325,27 +5311,30 @@ void ObjectMgr::LoadNPCText() for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; ++i) { - npcText.Data[i].BroadcastTextID = fields[1 + i].GetUInt32(); - npcText.Data[i].Probability = fields[1 + i * 2].GetFloat(); + npcText.Data[i].Probability = fields[1 + i].GetFloat(); + npcText.Data[i].BroadcastTextID = fields[9 + i].GetUInt32(); } - bool isValid = false; for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; i++) { if (npcText.Data[i].BroadcastTextID) { if (!sBroadcastTextStore.LookupEntry(npcText.Data[i].BroadcastTextID)) { - TC_LOG_ERROR("sql.sql", "NpcText (Id: %u) in table `npc_text` has non-existing or incompatible Index: %u BroadcastTextID %u.", textID, i, npcText.Data[i].BroadcastTextID); + TC_LOG_ERROR("sql.sql", "NPCText (ID: %u) has a non-existing or incompatible BroadcastText (ID: %u, Index: %u)", textID, npcText.Data[i].BroadcastTextID, i); npcText.Data[i].BroadcastTextID = 0; } - else - isValid = true; } } - if (!isValid) - TC_LOG_ERROR("sql.sql", "NpcText (Id: %u) in table `npc_text` is invalid", textID); + for (uint8 i = 0; i < MAX_NPC_TEXT_OPTIONS; i++) + { + if (npcText.Data[i].Probability > 0 && npcText.Data[i].BroadcastTextID == 0) + { + TC_LOG_ERROR("sql.sql", "NPCText (ID: %u) has a probability (Index: %u) set, but no BroadcastTextID to go with it", textID, i); + npcText.Data[i].Probability = 0; + } + } } while (result->NextRow()); @@ -6147,11 +6136,21 @@ void ObjectMgr::LoadAccessRequirements() { Field* fields = result->Fetch(); - ++count; - uint32 mapid = fields[0].GetUInt32(); - uint8 difficulty = fields[1].GetUInt8(); - uint32 requirement_ID = MAKE_PAIR64(mapid, difficulty); + if (!sMapStore.LookupEntry(mapid)) + { + TC_LOG_ERROR("sql.sql", "Map %u referenced in `access_requirement` does not exist, skipped.", mapid); + continue; + } + + uint32 difficulty = fields[1].GetUInt8(); + if (!GetMapDifficultyData(mapid, Difficulty(difficulty))) + { + TC_LOG_ERROR("sql.sql", "Map %u referenced in `access_requirement` does not have difficulty %u, skipped", mapid, difficulty); + continue; + } + + uint64 requirement_ID = MAKE_PAIR64(mapid, difficulty); AccessRequirement* ar = new AccessRequirement(); ar->levelMin = fields[2].GetUInt8(); @@ -6168,7 +6167,7 @@ void ObjectMgr::LoadAccessRequirements() ItemTemplate const* pProto = GetItemTemplate(ar->item); if (!pProto) { - TC_LOG_ERROR("misc", "Key item %u does not exist for map %u difficulty %u, removing key requirement.", ar->item, mapid, difficulty); + TC_LOG_ERROR("sql.sql", "Key item %u does not exist for map %u difficulty %u, removing key requirement.", ar->item, mapid, difficulty); ar->item = 0; } } @@ -6178,7 +6177,7 @@ void ObjectMgr::LoadAccessRequirements() ItemTemplate const* pProto = GetItemTemplate(ar->item2); if (!pProto) { - TC_LOG_ERROR("misc", "Second item %u does not exist for map %u difficulty %u, removing key requirement.", ar->item2, mapid, difficulty); + TC_LOG_ERROR("sql.sql", "Second item %u does not exist for map %u difficulty %u, removing key requirement.", ar->item2, mapid, difficulty); ar->item2 = 0; } } @@ -6211,6 +6210,8 @@ void ObjectMgr::LoadAccessRequirements() } _accessRequirementStore[requirement_ID] = ar; + ++count; + } while (result->NextRow()); TC_LOG_INFO("server.loading", ">> Loaded %u access requirement definitions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); @@ -6669,6 +6670,10 @@ void ObjectMgr::LoadGameObjectTemplate() case GAMEOBJECT_TYPE_BARBER_CHAIR: //32 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0); break; + case GAMEOBJECT_TYPE_GARRISON_BUILDING: + if (uint32 transportMap = got.garrisonBuilding.mapID) + _transportMaps.insert(transportMap); + break; } ++count; @@ -7700,6 +7705,32 @@ void ObjectMgr::LoadFishingBaseSkillLevel() TC_LOG_INFO("server.loading", ">> Loaded %u areas for fishing base skill level in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } +void ObjectMgr::LoadSkillTiers() +{ + uint32 oldMSTime = getMSTime(); + + QueryResult result = WorldDatabase.Query("SELECT ID, Value1, Value2, Value3, Value4, Value5, Value6, Value7, Value8, Value9, Value10, " + " Value11, Value12, Value13, Value14, Value15, Value16 FROM skill_tiers"); + + if (!result) + { + TC_LOG_ERROR("server.loading", ">> Loaded 0 skill max values. DB table `skill_tiers` is empty."); + return; + } + + do + { + Field* fields = result->Fetch(); + uint32 id = fields[0].GetUInt32(); + SkillTiersEntry& tier = _skillTiers[id]; + for (uint32 i = 0; i < MAX_SKILL_STEP; ++i) + tier.Value[i] = fields[1 + i].GetUInt32(); + + } while (result->NextRow()); + + TC_LOG_INFO("server.loading", ">> Loaded %u skill max values in %u ms", uint32(_skillTiers.size()), GetMSTimeDiffToNow(oldMSTime)); +} + bool ObjectMgr::CheckDeclinedNames(const std::wstring& w_ownname, DeclinedName const& names) { // get main part of the name @@ -7764,7 +7795,7 @@ SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry) if (!skill) return SKILL_RANGE_NONE; - if (sSkillTiersStore.LookupEntry(rcEntry->SkillTierID)) + if (sObjectMgr->GetSkillTier(rcEntry->SkillTierID)) return SKILL_RANGE_RANK; if (rcEntry->SkillID == SKILL_RUNEFORGING) diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 4277ab74048..901aa56b431 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -39,6 +39,7 @@ #include "ConditionMgr.h" #include "DB2Stores.h" #include <string> +#include <tuple> #include <map> #include <limits> #include <functional> @@ -67,8 +68,8 @@ struct TempSummonGroupKey bool operator<(TempSummonGroupKey const& rhs) const { - // memcmp is only reliable if struct doesn't have any padding (packed) - return memcmp(this, &rhs, sizeof(TempSummonGroupKey)) < 0; + return std::tie(_summonerEntry, _summonerType, _summonGroup) < + std::tie(rhs._summonerEntry, rhs._summonerType, rhs._summonGroup); } private: @@ -626,6 +627,14 @@ enum SkillRangeType SKILL_RANGE_NONE // 0..0 always }; +#define MAX_SKILL_STEP 16 + +struct SkillTiersEntry +{ + uint32 ID; // 0 + uint32 Value[MAX_SKILL_STEP]; // 1-16 +}; + SkillRangeType GetSkillRangeType(SkillRaceClassInfoEntry const* rcEntry); #define MAX_PLAYER_NAME 12 // max allowed by client name length @@ -748,18 +757,18 @@ class ObjectMgr static ObjectGuid GetPlayerGUIDByName(std::string const& name); - GameObjectQuestItemList* GetGameObjectQuestItemList(uint32 id) + GameObjectQuestItemList const* GetGameObjectQuestItemList(uint32 id) const { - GameObjectQuestItemMap::iterator itr = _gameObjectQuestItemStore.find(id); + GameObjectQuestItemMap::const_iterator itr = _gameObjectQuestItemStore.find(id); if (itr != _gameObjectQuestItemStore.end()) return &itr->second; return NULL; } GameObjectQuestItemMap const* GetGameObjectQuestItemMap() const { return &_gameObjectQuestItemStore; } - CreatureQuestItemList* GetCreatureQuestItemList(uint32 id) + CreatureQuestItemList const* GetCreatureQuestItemList(uint32 id) const { - CreatureQuestItemMap::iterator itr = _creatureQuestItemStore.find(id); + CreatureQuestItemMap::const_iterator itr = _creatureQuestItemStore.find(id); if (itr != _creatureQuestItemStore.end()) return &itr->second; return NULL; @@ -1018,6 +1027,7 @@ class ObjectMgr void LoadPetNames(); void LoadPetNumber(); void LoadFishingBaseSkillLevel(); + void LoadSkillTiers(); void LoadReputationRewardRate(); void LoadReputationOnKill(); @@ -1052,6 +1062,12 @@ class ObjectMgr return itr != _fishingBaseForAreaStore.end() ? itr->second : 0; } + SkillTiersEntry const* GetSkillTier(uint32 skillTierId) const + { + auto itr = _skillTiers.find(skillTierId); + return itr != _skillTiers.end() ? &itr->second : nullptr; + } + void ReturnOrDeleteOldMails(bool serverUp); CreatureBaseStats const* GetCreatureBaseStats(uint8 level, uint8 unitClass); @@ -1456,6 +1472,7 @@ class ObjectMgr typedef std::map<uint32, int32> FishingBaseSkillContainer; // [areaId][base skill level] FishingBaseSkillContainer _fishingBaseForAreaStore; + std::unordered_map<uint32, SkillTiersEntry> _skillTiers; typedef std::map<uint32, StringVector> HalfNameContainer; HalfNameContainer _petHalfName0; diff --git a/src/server/game/Grids/Cells/Cell.h b/src/server/game/Grids/Cells/Cell.h index eb889e328cb..87220e56d0f 100644 --- a/src/server/game/Grids/Cells/Cell.h +++ b/src/server/game/Grids/Cells/Cell.h @@ -117,4 +117,3 @@ private: }; #endif - diff --git a/src/server/game/Grids/Cells/CellImpl.h b/src/server/game/Grids/Cells/CellImpl.h index ea5143375c1..61113d6b36e 100644 --- a/src/server/game/Grids/Cells/CellImpl.h +++ b/src/server/game/Grids/Cells/CellImpl.h @@ -178,4 +178,3 @@ inline void Cell::VisitCircle(TypeContainerVisitor<T, CONTAINER>& visitor, Map& } } #endif - diff --git a/src/server/game/Grids/Grid.h b/src/server/game/Grids/Grid.h index 7d3dc799a7c..d048dc05768 100644 --- a/src/server/game/Grids/Grid.h +++ b/src/server/game/Grids/Grid.h @@ -141,4 +141,3 @@ class Grid //ActiveGridObjects m_activeGridObjects; }; #endif - diff --git a/src/server/game/Grids/GridLoader.h b/src/server/game/Grids/GridLoader.h index 153a45c8ccb..650aa8bb381 100644 --- a/src/server/game/Grids/GridLoader.h +++ b/src/server/game/Grids/GridLoader.h @@ -75,4 +75,3 @@ class GridLoader }; */ #endif - diff --git a/src/server/game/Grids/GridRefManager.h b/src/server/game/Grids/GridRefManager.h index b52f1052fad..7ba6b32642e 100644 --- a/src/server/game/Grids/GridRefManager.h +++ b/src/server/game/Grids/GridRefManager.h @@ -39,4 +39,3 @@ class GridRefManager : public RefManager<GridRefManager<OBJECT>, OBJECT> iterator rend() { return iterator(NULL); } }; #endif - diff --git a/src/server/game/Grids/GridReference.h b/src/server/game/Grids/GridReference.h index 946e2f89278..7b5f2536c24 100644 --- a/src/server/game/Grids/GridReference.h +++ b/src/server/game/Grids/GridReference.h @@ -50,4 +50,3 @@ class GridReference : public Reference<GridRefManager<OBJECT>, OBJECT> GridReference* next() { return (GridReference*)Reference<GridRefManager<OBJECT>, OBJECT>::next(); } }; #endif - diff --git a/src/server/game/Grids/GridStates.cpp b/src/server/game/Grids/GridStates.cpp index 7f12c7b2793..50bd082b83a 100644 --- a/src/server/game/Grids/GridStates.cpp +++ b/src/server/game/Grids/GridStates.cpp @@ -61,4 +61,3 @@ void RemovalState::Update(Map& map, NGridType& grid, GridInfo& info, uint32 diff } } } - diff --git a/src/server/game/Grids/NGrid.h b/src/server/game/Grids/NGrid.h index b6189d22fe3..f218f5fa5e9 100644 --- a/src/server/game/Grids/NGrid.h +++ b/src/server/game/Grids/NGrid.h @@ -191,4 +191,3 @@ class NGrid bool i_GridObjectDataLoaded; }; #endif - diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 8a5386684bb..e6a574efe74 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -33,7 +33,7 @@ #include "CreatureAI.h" #include "Spell.h" #include "WorldSession.h" -#include "Packets/ChatPackets.h" +#include "Packet.h" class Player; //class Map; @@ -736,18 +736,6 @@ namespace Trinity NearestGameObjectTypeInObjectRangeCheck(NearestGameObjectTypeInObjectRangeCheck const&); }; - class GameObjectWithDbGUIDCheck - { - public: - GameObjectWithDbGUIDCheck(WorldObject const& /*obj*/, ObjectGuid::LowType db_guid) : i_db_guid(db_guid) { } - bool operator()(GameObject const* go) const - { - return go->GetSpawnId() == i_db_guid; - } - private: - ObjectGuid::LowType i_db_guid; - }; - // Unit checks class MostHPMissingInRange @@ -849,18 +837,6 @@ namespace Trinity float i_range; }; - class CreatureWithDbGUIDCheck - { - public: - CreatureWithDbGUIDCheck(WorldObject const* /*obj*/, ObjectGuid::LowType lowguid) : i_lowguid(lowguid) { } - bool operator()(Creature* u) - { - return u->GetSpawnId() == i_lowguid; - } - private: - ObjectGuid::LowType i_lowguid; - }; - class AnyFriendlyUnitInObjectRangeCheck { public: @@ -1435,7 +1411,7 @@ namespace Trinity private: Builder& i_builder; - std::vector<WorldPacket*> i_data_cache; // 0 = default, i => i-1 locale index + std::vector<WorldPackets::Packet*> i_data_cache; // 0 = default, i => i-1 locale index }; // Prepare using Builder localized packets with caching and send to player @@ -1443,7 +1419,7 @@ namespace Trinity class LocalizedPacketListDo { public: - typedef std::vector<WorldPacket*> WorldPacketList; + typedef std::vector<WorldPackets::Packet*> WorldPacketList; explicit LocalizedPacketListDo(Builder& builder) : i_builder(builder) { } ~LocalizedPacketListDo() diff --git a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h index 30c5e523f21..3e00cb4741a 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiersImpl.h +++ b/src/server/game/Grids/Notifiers/GridNotifiersImpl.h @@ -563,7 +563,7 @@ void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p) { LocaleConstant loc_idx = p->GetSession()->GetSessionDbLocaleIndex(); uint32 cache_idx = loc_idx+1; - WorldPacket* data; + WorldPackets::Packet* data; // create if not cached yet if (i_data_cache.size() < cache_idx + 1 || !i_data_cache[cache_idx]) @@ -571,18 +571,18 @@ void Trinity::LocalizedPacketDo<Builder>::operator()(Player* p) if (i_data_cache.size() < cache_idx + 1) i_data_cache.resize(cache_idx + 1); - data = new WorldPacket(); + data = i_builder(loc_idx); - i_builder(*data, loc_idx); + ASSERT(data->GetSize() == 0); - ASSERT(data->GetOpcode() != NULL_OPCODE); + data->Write(); i_data_cache[cache_idx] = data; } else data = i_data_cache[cache_idx]; - p->SendDirectMessage(data); + p->SendDirectMessage(data->GetRawPacket()); } template<class Builder> @@ -606,7 +606,7 @@ void Trinity::LocalizedPacketListDo<Builder>::operator()(Player* p) data_list = &i_data_cache[cache_idx]; for (size_t i = 0; i < data_list->size(); ++i) - p->SendDirectMessage((*data_list)[i]); + p->SendDirectMessage((*data_list)[i]->GetRawPacket()); } #endif // TRINITY_GRIDNOTIFIERSIMPL_H diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp index fadf7e1970e..1f19811e291 100644 --- a/src/server/game/Groups/Group.cpp +++ b/src/server/game/Groups/Group.cpp @@ -979,7 +979,7 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) continue; if (i->AllowedForPlayer(member)) { - if (member->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (member->IsAtGroupRewardDistance(pLootedObject)) { r->totalPlayersRolling++; @@ -1064,7 +1064,7 @@ void Group::GroupLoot(Loot* loot, WorldObject* pLootedObject) if (i->AllowedForPlayer(member)) { - if (member->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (member->IsAtGroupRewardDistance(pLootedObject)) { r->totalPlayersRolling++; r->playerVote[member->GetGUID()] = NOT_EMITED_YET; @@ -1123,7 +1123,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) continue; bool allowedForPlayer = i->AllowedForPlayer(playerToRoll); - if (allowedForPlayer && playerToRoll->IsWithinDistInMap(lootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (allowedForPlayer && playerToRoll->IsAtGroupRewardDistance(lootedObject)) { r->totalPlayersRolling++; if (playerToRoll->GetPassOnGroupLoot()) @@ -1198,7 +1198,7 @@ void Group::NeedBeforeGreed(Loot* loot, WorldObject* lootedObject) continue; bool allowedForPlayer = i->AllowedForPlayer(playerToRoll); - if (allowedForPlayer && playerToRoll->IsWithinDistInMap(lootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (allowedForPlayer && playerToRoll->IsAtGroupRewardDistance(lootedObject)) { r->totalPlayersRolling++; r->playerVote[playerToRoll->GetGUID()] = NOT_EMITED_YET; @@ -1274,7 +1274,7 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) if (!looter->IsInWorld()) continue; - if (looter->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (looter->IsAtGroupRewardDistance(pLootedObject)) { data << looter->GetGUID(); ++real_count; @@ -1286,7 +1286,7 @@ void Group::MasterLoot(Loot* loot, WorldObject* pLootedObject) for (GroupReference* itr = GetFirstMember(); itr != NULL; itr = itr->next()) { Player* looter = itr->GetSource(); - if (looter->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (looter->IsAtGroupRewardDistance(pLootedObject)) looter->GetSession()->SendPacket(&data); } } @@ -1562,7 +1562,7 @@ void Group::SendUpdateToPlayer(ObjectGuid playerGUID, MemberSlot* slot) partyUpdate.PartyType = m_groupType; partyUpdate.PartyIndex = 0; partyUpdate.PartyFlags = uint8(IsCreated()); - + partyUpdate.PartyGUID = m_guid; partyUpdate.LeaderGUID = m_leaderGuid; @@ -1835,7 +1835,7 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) { // not update if only update if need and ok Player* looter = ObjectAccessor::FindPlayer(guid_itr->guid); - if (looter && looter->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (looter && looter->IsAtGroupRewardDistance(pLootedObject)) return; } ++guid_itr; @@ -1846,7 +1846,7 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) for (member_citerator itr = guid_itr; itr != m_memberSlots.end(); ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->guid)) - if (player->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (player->IsAtGroupRewardDistance(pLootedObject)) { pNewLooter = player; break; @@ -1859,7 +1859,7 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed) for (member_citerator itr = m_memberSlots.begin(); itr != guid_itr; ++itr) { if (Player* player = ObjectAccessor::FindPlayer(itr->guid)) - if (player->IsWithinDistInMap(pLootedObject, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (player->IsAtGroupRewardDistance(pLootedObject)) { pNewLooter = player; break; @@ -1952,6 +1952,9 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* // check if someone in party is using dungeon system if (member->isUsingLfg()) return ERR_LFG_CANT_USE_BATTLEGROUND; + // check Freeze debuff + if (member->HasAura(9454)) + return ERR_BATTLEGROUND_JOIN_FAILED; } // only check for MinPlayerCount since MinPlayerCount == MaxPlayerCount for arenas... diff --git a/src/server/game/Guilds/Guild.cpp b/src/server/game/Guilds/Guild.cpp index d4c6a0a680d..4083a07523c 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -678,13 +678,23 @@ void EmblemInfo::ReadPacket(WorldPackets::Guild::SaveGuildEmblem& packet) m_backgroundColor = packet.Bg; } -void EmblemInfo::LoadFromDB(Field* fields) +bool EmblemInfo::ValidateEmblemColors() +{ + return sGuildColorBackgroundStore.LookupEntry(m_backgroundColor) && + sGuildColorBorderStore.LookupEntry(m_borderColor) && + sGuildColorEmblemStore.LookupEntry(m_color); + +} + +bool EmblemInfo::LoadFromDB(Field* fields) { m_style = fields[3].GetUInt8(); m_color = fields[4].GetUInt8(); m_borderStyle = fields[5].GetUInt8(); m_borderColor = fields[6].GetUInt8(); m_backgroundColor = fields[7].GetUInt8(); + + return ValidateEmblemColors(); } void EmblemInfo::SaveToDB(ObjectGuid::LowType guildId) const @@ -2147,10 +2157,9 @@ void Guild::SendLoginInfo(WorldSession* session) player->GetSession()->SendPacket(renameFlag.Write()); } - for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i) - if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i)) - if (entry->GuildLevel <= GetLevel()) - player->LearnSpell(entry->SpellID, true); + for (GuildPerkSpellsEntry const* entry : sGuildPerkSpellsStore) + if (entry->GuildLevel <= GetLevel()) + player->LearnSpell(entry->SpellID, true); m_achievementMgr.SendAllAchievementData(player); @@ -2244,7 +2253,14 @@ bool Guild::LoadFromDB(Field* fields) m_id = fields[0].GetUInt64(); m_name = fields[1].GetString(); m_leaderGuid = ObjectGuid::Create<HighGuid::Player>(fields[2].GetUInt64()); - m_emblemInfo.LoadFromDB(fields); + + if (!m_emblemInfo.LoadFromDB(fields)) + { + TC_LOG_ERROR("guild", "Guild " UI64FMTD " has invalid emblem colors (Background: %u, Border: %u, Emblem: %u), skipped.", + m_id, m_emblemInfo.GetBackgroundColor(), m_emblemInfo.GetBorderColor(), m_emblemInfo.GetColor()); + return false; + } + m_info = fields[8].GetString(); m_motd = fields[9].GetString(); m_createdDate = time_t(fields[10].GetUInt32()); @@ -2687,10 +2703,9 @@ void Guild::DeleteMember(ObjectGuid guid, bool isDisbanding, bool isKicked, bool player->SetRank(0); player->SetGuildLevel(0); - for (uint32 i = 0; i < sGuildPerkSpellsStore.GetNumRows(); ++i) - if (GuildPerkSpellsEntry const* entry = sGuildPerkSpellsStore.LookupEntry(i)) - if (entry->GuildLevel <= GetLevel()) - player->RemoveSpell(entry->SpellID, false, false); + for (GuildPerkSpellsEntry const* entry : sGuildPerkSpellsStore) + if (entry->GuildLevel <= GetLevel()) + player->RemoveSpell(entry->SpellID, false, false); } _DeleteMemberFromDB(guid.GetCounter()); diff --git a/src/server/game/Guilds/Guild.h b/src/server/game/Guilds/Guild.h index 42951320885..777147f2595 100644 --- a/src/server/game/Guilds/Guild.h +++ b/src/server/game/Guilds/Guild.h @@ -266,9 +266,10 @@ class EmblemInfo public: EmblemInfo() : m_style(0), m_color(0), m_borderStyle(0), m_borderColor(0), m_backgroundColor(0) { } - void LoadFromDB(Field* fields); + bool LoadFromDB(Field* fields); void SaveToDB(ObjectGuid::LowType guildId) const; void ReadPacket(WorldPackets::Guild::SaveGuildEmblem& packet); + bool ValidateEmblemColors(); uint32 GetStyle() const { return m_style; } uint32 GetColor() const { return m_color; } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index ced3265a31c..c064c0cd555 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -153,6 +153,10 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt return; } + // check Freeze debuff + if (_player->HasAura(9454)) + return; + BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId); GroupQueueInfo* ginfo = bgQueue.AddGroup(_player, NULL, bgTypeId, bracketEntry, 0, false, isPremade, 0, 0); @@ -338,6 +342,10 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::Battl if (battlefieldPort.AcceptedInvite) { + // check Freeze debuff + if (_player->HasAura(9454)) + return; + if (!_player->IsInvitedForBattlegroundQueueType(bgQueueTypeId)) return; // cheating? diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 65f05e4dbbb..c823bb57e9e 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -1162,7 +1162,7 @@ void WorldSession::SendFeatureSystemStatus() features.EuropaTicketSystemStatus->ThrottleState.LastResetTimeBeforeNow = 111111; features.ComplaintStatus = 0; features.TutorialsEnabled = true; - features.UnkBit90 = true; + features.NPETutorialsEnabled = true; /// END OF DUMMY VALUES features.EuropaTicketSystemStatus->TicketsEnabled = sWorld->getBoolConfig(CONFIG_SUPPORT_TICKETS_ENABLED); @@ -2335,7 +2335,7 @@ void WorldSession::HandleRandomizeCharNameOpcode(WorldPackets::Character::Genera WorldPackets::Character::GenerateRandomCharacterNameResult result; result.Success = true; - result.Name = GetRandomCharacterName(packet.Race, packet.Sex); + result.Name = sDB2Manager.GetNameGenEntry(packet.Race, packet.Sex, GetSessionDbcLocale()); SendPacket(result.Write()); } @@ -2574,25 +2574,18 @@ void WorldSession::SendCharRename(ResponseCodes result, WorldPackets::Character: void WorldSession::SendCharCustomize(ResponseCodes result, WorldPackets::Character::CharCustomizeInfo const* customizeInfo) { - /// @todo: fix 6.x implementation - (void)result; - (void)customizeInfo; - /* - WorldPacket data(SMSG_CHAR_CUSTOMIZE, 1 + 8 + customizeInfo.NewName.size() + 1 + 6); - data << uint8(result); if (result == RESPONSE_SUCCESS) { - data << customizeInfo.Guid; - data << customizeInfo.NewName; - data << uint8(customizeInfo.Gender); - data << uint8(customizeInfo.Skin); - data << uint8(customizeInfo.Face); - data << uint8(customizeInfo.HairStyle); - data << uint8(customizeInfo.HairColor); - data << uint8(customizeInfo.FacialHair); + WorldPackets::Character::CharCustomizeResponse response(customizeInfo); + SendPacket(response.Write()); + } + else + { + WorldPackets::Character::CharCustomizeFailed failed; + failed.Result = uint8(result); + failed.CharGUID = customizeInfo->CharGUID; + SendPacket(failed.Write()); } - SendPacket(&data); - */ } void WorldSession::SendCharFactionChange(ResponseCodes result, WorldPackets::Character::CharRaceOrFactionChangeInfo const* factionChangeInfo) diff --git a/src/server/game/Handlers/GroupHandler.cpp b/src/server/game/Handlers/GroupHandler.cpp index eefe89fef74..9df20126790 100644 --- a/src/server/game/Handlers/GroupHandler.cpp +++ b/src/server/game/Handlers/GroupHandler.cpp @@ -433,7 +433,7 @@ void WorldSession::HandleUpdateRaidTargetOpcode(WorldPackets::Party::UpdateRaidT if (!group) return; - if (packet.Symbol == 0xFF) // target icon request + if (packet.Symbol == -1) // target icon request group->SendTargetIconList(this, packet.PartyIndex); else // target icon update { diff --git a/src/server/game/Handlers/GuildHandler.cpp b/src/server/game/Handlers/GuildHandler.cpp index ad3de84beb5..fbd1d5a7183 100644 --- a/src/server/game/Handlers/GuildHandler.cpp +++ b/src/server/game/Handlers/GuildHandler.cpp @@ -191,6 +191,12 @@ void WorldSession::HandleSaveGuildEmblem(WorldPackets::Guild::SaveGuildEmblem& p if (GetPlayer()->HasUnitState(UNIT_STATE_DIED)) GetPlayer()->RemoveAurasByType(SPELL_AURA_FEIGN_DEATH); + if (!emblemInfo.ValidateEmblemColors()) + { + Guild::SendSaveEmblemResult(this, ERR_GUILDEMBLEM_INVALID_TABARD_COLORS); + return; + } + if (Guild* guild = GetPlayer()->GetGuild()) guild->HandleSetEmblem(this, emblemInfo); else diff --git a/src/server/game/Handlers/LFGHandler.cpp b/src/server/game/Handlers/LFGHandler.cpp index 4a3866cbb1b..3a2b0cf01ed 100644 --- a/src/server/game/Handlers/LFGHandler.cpp +++ b/src/server/game/Handlers/LFGHandler.cpp @@ -52,7 +52,7 @@ void BuildQuestReward(WorldPacket& data, Quest const* quest, Player* player) { uint8 rewCount = quest->GetRewItemsCount() + quest->GetRewCurrencyCount(); - data << uint32(quest->GetRewMoney()); + data << uint32(player->GetQuestMoneyReward(quest)); data << uint32(player->GetQuestXPReward(quest)); data << uint8(rewCount); if (rewCount) diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index ddd084cbd9d..d53c20329b3 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -178,7 +178,7 @@ void WorldSession::HandleLootMoneyOpcode(WorldPackets::Loot::LootMoney& /*packet if (!member) continue; - if (player->IsWithinDistInMap(member, sWorld->getFloatConfig(CONFIG_GROUP_XP_DISTANCE), false)) + if (player->IsAtGroupRewardDistance(member)) playersNear.push_back(member); } diff --git a/src/server/game/Handlers/MailHandler.cpp b/src/server/game/Handlers/MailHandler.cpp index dd55c6f2f06..60690f6c79b 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -628,7 +628,7 @@ void WorldSession::HandleMailCreateTextItem(WorldPackets::Mail::MailCreateTextIt return; } - bodyItem->SetText(mailTemplateEntry->Body_lang); + bodyItem->SetText(mailTemplateEntry->Body->Str[GetSessionDbcLocale()]); } else bodyItem->SetText(m->body); diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index c87bff8511e..0aa941de4e2 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -904,7 +904,7 @@ void WorldSession::HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse& _player->m_timeSyncQueue.pop(); } -void WorldSession::HandleResetInstancesOpcode(WorldPacket& /*recvData*/) +void WorldSession::HandleResetInstancesOpcode(WorldPackets::Instance::ResetInstances& /*packet*/) { if (Group* group = _player->GetGroup()) { diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 429d3565052..8664a1195c9 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -433,7 +433,7 @@ void WorldSession::SendQueryPetNameResponse(ObjectGuid guid) if (Pet* pet = unit->ToPet()) { - if (DeclinedName const* names = pet->GetDeclinedNames()) + if (DeclinedName const* names = pet->GetDeclinedNames()) { response.HasDeclined = true; response.DeclinedNames = *names; diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index eec80888559..5d40165df04 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -90,7 +90,7 @@ void WorldSession::HandleCreatureQuery(WorldPackets::Query::QueryCreature& packe stats.EnergyMulti = creatureInfo->ModMana; stats.Leader = creatureInfo->RacialLeader; - CreatureQuestItemList* items = sObjectMgr->GetCreatureQuestItemList(packet.CreatureID); + CreatureQuestItemList const* items = sObjectMgr->GetCreatureQuestItemList(packet.CreatureID); if (items) for (uint32 item : *items) stats.QuestItems.push_back(item); @@ -131,7 +131,7 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj stats.IconName = gameObjectInfo->IconName; stats.Name[0] = gameObjectInfo->name; - GameObjectQuestItemList* items = sObjectMgr->GetGameObjectQuestItemList(packet.GameObjectID); + GameObjectQuestItemList const* items = sObjectMgr->GetGameObjectQuestItemList(packet.GameObjectID); if (items) for (uint32 item : *items) stats.QuestItems.push_back(item); @@ -397,17 +397,17 @@ void WorldSession::HandleDBQueryBulk(WorldPackets::Query::DBQueryBulk& packet) { WorldPackets::Query::DBReply response; response.TableHash = packet.TableHash; + response.RecordID = rec.RecordID; if (store->HasRecord(rec.RecordID)) { - response.RecordID = rec.RecordID; + response.Allow = true; response.Timestamp = sDB2Manager.GetHotfixDate(rec.RecordID, packet.TableHash); store->WriteRecord(rec.RecordID, GetSessionDbcLocale(), response.Data); } else { TC_LOG_TRACE("network", "CMSG_DB_QUERY_BULK: %s requested non-existing entry %u in datastore: %u", GetPlayerInfo().c_str(), rec.RecordID, packet.TableHash); - response.RecordID = -int32(rec.RecordID); response.Timestamp = time(NULL); } diff --git a/src/server/game/Handlers/SceneHandler.cpp b/src/server/game/Handlers/SceneHandler.cpp index 90965b29929..96bbf759986 100644 --- a/src/server/game/Handlers/SceneHandler.cpp +++ b/src/server/game/Handlers/SceneHandler.cpp @@ -26,7 +26,7 @@ void WorldSession::HandleSceneTriggerEvent(WorldPackets::Scenes::SceneTriggerEve void WorldSession::HandleScenePlaybackComplete(WorldPackets::Scenes::ScenePlaybackComplete& scenePlaybackComplete) { - + TC_LOG_DEBUG("scenes", "HandleScenePlaybackComplete: SceneInstanceID: %u", scenePlaybackComplete.SceneInstanceID); } diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 2d3090825da..6d3f35d407d 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -501,11 +501,9 @@ void WorldSession::HandleSpellClick(WorldPacket& recvData) unit->HandleSpellClick(_player); } -void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData) +void WorldSession::HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& packet) { - ObjectGuid guid; - recvData >> guid; - recvData.read_skip<uint32>(); // DisplayId ? + ObjectGuid guid = packet.UnitGUID; // Get unit for which data is needed by client Unit* unit = ObjectAccessor::GetUnit(*_player, guid); @@ -520,27 +518,25 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData) if (!creator) return; - WorldPacket data(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, 68); - data << guid; - data << uint32(creator->GetDisplayId()); - data << uint8(creator->getRace()); - data << uint8(creator->getGender()); - data << uint8(creator->getClass()); - - if (creator->GetTypeId() == TYPEID_PLAYER) + if (Player* player = creator->ToPlayer()) { - Player* player = creator->ToPlayer(); - Guild* guild = NULL; + WorldPackets::Spells::MirrorImageComponentedData packet; + packet.UnitGUID = guid; + packet.DisplayID = creator->GetDisplayId(); + packet.RaceID = creator->getRace(); + packet.Gender = creator->getGender(); + packet.ClassID = creator->getClass(); + + Guild* guild = player->GetGuild(); - if (ObjectGuid::LowType guildId = player->GetGuildId()) - guild = sGuildMgr->GetGuildById(guildId); + packet.SkinColor = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID); + packet.FaceVariation = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID); + packet.HairVariation = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID); + packet.HairColor = player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID); + packet.BeardVariation = player->GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE); + packet.GuildGUID = (guild ? guild->GetGUID() : ObjectGuid::Empty); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_SKIN_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_FACE_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_STYLE_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES, PLAYER_BYTES_OFFSET_HAIR_COLOR_ID)); - data << uint8(player->GetByteValue(PLAYER_BYTES_2, PLAYER_BYTES_2_OFFSET_FACIAL_STYLE)); - data << (guild ? guild->GetGUID() : ObjectGuid::Empty); + packet.ItemDisplayID.reserve(11); static EquipmentSlots const itemSlots[] = { @@ -553,44 +549,34 @@ void WorldSession::HandleMirrorImageDataRequest(WorldPacket& recvData) EQUIPMENT_SLOT_FEET, EQUIPMENT_SLOT_WRISTS, EQUIPMENT_SLOT_HANDS, - EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_TABARD, + EQUIPMENT_SLOT_BACK, EQUIPMENT_SLOT_END }; // Display items in visible slots - for (EquipmentSlots const* itr = &itemSlots[0]; *itr != EQUIPMENT_SLOT_END; ++itr) + for (auto const& slot : itemSlots) { - if (*itr == EQUIPMENT_SLOT_HEAD && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) - data << uint32(0); - else if (*itr == EQUIPMENT_SLOT_BACK && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK)) - data << uint32(0); - else if (Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, *itr)) - data << uint32(item->GetDisplayId()); + uint32 itemDisplayId; + if ((slot == EQUIPMENT_SLOT_HEAD && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) || + (slot == EQUIPMENT_SLOT_BACK && player->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK))) + itemDisplayId = 0; + else if (Item const* item = player->GetItemByPos(INVENTORY_SLOT_BAG_0, slot)) + itemDisplayId = item->GetDisplayId(); else - data << uint32(0); + itemDisplayId = 0; + + packet.ItemDisplayID.push_back(itemDisplayId); } + SendPacket(packet.Write()); } else { - // Skip player data for creatures - data << uint8(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); + WorldPackets::Spells::MirrorImageCreatureData packet; + packet.UnitGUID = guid; + packet.DisplayID = creator->GetDisplayId(); + SendPacket(packet.Write()); } - - SendPacket(&data); } void WorldSession::HandleUpdateProjectilePosition(WorldPacket& recvPacket) diff --git a/src/server/game/Handlers/TicketHandler.cpp b/src/server/game/Handlers/TicketHandler.cpp index 1ff239035a4..f9c1f1c6989 100644 --- a/src/server/game/Handlers/TicketHandler.cpp +++ b/src/server/game/Handlers/TicketHandler.cpp @@ -29,93 +29,6 @@ #include "WorldPacket.h" #include "WorldSession.h" -void WorldSession::HandleGMTicketCreateOpcode(WorldPackets::Ticket::GMTicketCreate& packet) -{ - // Don't accept tickets if the ticket queue is disabled. (Ticket UI is greyed out but not fully dependable) - if (sSupportMgr->GetSupportSystemStatus() == GMTICKET_QUEUE_STATUS_DISABLED) - return; - - if (GetPlayer()->getLevel() < sWorld->getIntConfig(CONFIG_TICKET_LEVEL_REQ)) - { - SendNotification(GetTrinityString(LANG_TICKET_REQ), sWorld->getIntConfig(CONFIG_TICKET_LEVEL_REQ)); - return; - } - - GMTicketResponse response = GMTICKET_RESPONSE_CREATE_ERROR; - GmTicket* ticket = sSupportMgr->GetGmTicketByPlayerGuid(GetPlayer()->GetGUID()); - - if (ticket && ticket->IsCompleted()) - sSupportMgr->CloseTicket<GmTicket>(ticket->GetId(), GetPlayer()->GetGUID()); - - // Player must not have ticket - if (!ticket || ticket->IsClosed()) - { - std::string chatLog; - - if (packet.DataLength > 0 && packet.ChatHistoryData.DecompressedSize < 0xFFFF) - { - ByteBuffer dest; - dest.resize(size_t(packet.ChatHistoryData.DecompressedSize)); - - uLongf realSize = packet.ChatHistoryData.DecompressedSize; - - if (uncompress(dest.contents(), &realSize, packet.ChatHistoryData.Data.contents(), packet.ChatHistoryData.Data.size()) == Z_OK) - dest >> chatLog; - else - { - TC_LOG_ERROR("network", "CMSG_GM_TICKET_CREATE possibly corrupt. Uncompression failed."); - return; - } - } - - ticket = new GmTicket(GetPlayer()); - ticket->SetPosition(packet.Map, packet.Pos); - ticket->SetDescription(packet.Description); - ticket->SetGmAction(packet.NeedResponse, packet.NeedMoreHelp); - - //TODO: more reasearch needed - //if (!chatLog.empty()) - //ticket->SetChatLog(times, chatLog); - - sSupportMgr->AddTicket(ticket); - sSupportMgr->UpdateLastChange(); - - sWorld->SendGMText(LANG_COMMAND_TICKETNEW, GetPlayer()->GetName().c_str(), ticket->GetId()); - - response = GMTICKET_RESPONSE_CREATE_SUCCESS; - } - sSupportMgr->SendGmTicketUpdate(this, response); -} - -void WorldSession::HandleGMTicketUpdateTextOpcode(WorldPackets::Ticket::GMTicketUpdateText& packet) -{ - GMTicketResponse response = GMTICKET_RESPONSE_UPDATE_ERROR; - if (GmTicket* ticket = sSupportMgr->GetGmTicketByPlayerGuid(GetPlayer()->GetGUID())) - { - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetDescription(packet.Description); - ticket->SaveToDB(trans); - - sWorld->SendGMText(LANG_COMMAND_TICKETUPDATED, GetPlayer()->GetName().c_str(), ticket->GetId()); - - response = GMTICKET_RESPONSE_UPDATE_SUCCESS; - } - sSupportMgr->SendGmTicketUpdate(this, response); -} - -void WorldSession::HandleGMTicketDeleteOpcode(WorldPackets::Ticket::GMTicketDelete& /*packet*/) -{ - if (GmTicket* ticket = sSupportMgr->GetGmTicketByPlayerGuid(GetPlayer()->GetGUID())) - { - sSupportMgr->SendGmTicketUpdate(this, GMTICKET_RESPONSE_TICKET_DELETED); - - sWorld->SendGMText(LANG_COMMAND_TICKETPLAYERABANDON, GetPlayer()->GetName().c_str(), ticket->GetId()); - - sSupportMgr->CloseTicket<GmTicket>(ticket->GetId(), GetPlayer()->GetGUID()); - sSupportMgr->SendGmTicket(this, NULL); - } -} - void WorldSession::HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTicketGetCaseStatus& /*packet*/) { // TODO: Implement GmCase and handle this packet properly @@ -124,21 +37,6 @@ void WorldSession::HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTic SendPacket(status.Write()); } -void WorldSession::HandleGMTicketGetTicketOpcode(WorldPackets::Ticket::GMTicketGetTicket& /*packet*/) -{ - SendQueryTimeResponse(); - - if (GmTicket* ticket = sSupportMgr->GetGmTicketByPlayerGuid(GetPlayer()->GetGUID())) - { - if (ticket->IsCompleted()) - ticket->SendResponse(this); - else - sSupportMgr->SendGmTicket(this, ticket); - } - else - sSupportMgr->SendGmTicket(this, NULL); -} - void WorldSession::HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTicketGetSystemStatus& /*packet*/) { // Note: This only disables the ticket UI at client side and is not fully reliable @@ -148,59 +46,6 @@ void WorldSession::HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTick SendPacket(response.Write()); } -void WorldSession::HandleGMSurveySubmit(WorldPackets::Ticket::GMSurveySubmit& /*packet*/) -{ - /*uint32 nextSurveyID = sSupportMgr->GetNextSurveyID(); - - std::unordered_set<uint32> surveyIds; - SQLTransaction trans = CharacterDatabase.BeginTransaction(); - - for (auto const& q : packet.SurveyQuestion) - { - if (!q.QuestionID) - break; - - // make sure the same sub survey is not added to DB twice - if (!surveyIds.insert(q.QuestionID).second) - continue; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GM_SUBSURVEY); - stmt->setUInt32(0, nextSurveyID); - stmt->setUInt32(1, q.QuestionID); // ref to i'th GMSurveySurveys.dbc field (all fields in that dbc point to fields in GMSurveyQuestions.dbc) - stmt->setUInt32(2, q.Answer); // probably some sort of ref to GMSurveyAnswers.dbc - stmt->setString(3, q.AnswerComment); // comment ("Usage: GMSurveyAnswerSubmit(question, rank, comment)") - trans->Append(stmt); - } - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_GM_SURVEY); - stmt->setUInt64(0, GetPlayer()->GetGUID().GetCounter()); - stmt->setUInt32(1, nextSurveyID); - stmt->setUInt32(2, packet.SurveyID); // GMSurveyCurrentSurvey.dbc, column 1 (all 9) ref to GMSurveySurveys.dbc - stmt->setString(3, packet.Comment); - trans->Append(stmt); - - CharacterDatabase.CommitTransaction(trans);*/ -} - -void WorldSession::HandleGMResponseResolve(WorldPackets::Ticket::GMTicketResponseResolve& /*packet*/) -{ - if (GmTicket* ticket = sSupportMgr->GetGmTicketByPlayerGuid(GetPlayer()->GetGUID())) - { - bool showSurvey = false; - if (float(rand_chance()) < sWorld->getFloatConfig(CONFIG_CHANCE_OF_GM_SURVEY)) - showSurvey = true; - - WorldPackets::Ticket::GMTicketResolveResponse response; - response.ShowSurvey = showSurvey; - SendPacket(response.Write()); - - sSupportMgr->SendGmTicketUpdate(this, GMTICKET_RESPONSE_TICKET_DELETED); - - sSupportMgr->CloseTicket<GmTicket>(ticket->GetId(), GetPlayer()->GetGUID()); - sSupportMgr->SendGmTicket(this, NULL); - } -} - void WorldSession::HandleSupportTicketSubmitBug(WorldPackets::Ticket::SupportTicketSubmitBug& packet) { if (!sSupportMgr->GetBugSystemStatus()) diff --git a/src/server/game/Handlers/TokenHandler.cpp b/src/server/game/Handlers/TokenHandler.cpp index a71d9b6e3a7..ed724a0b3e8 100644 --- a/src/server/game/Handlers/TokenHandler.cpp +++ b/src/server/game/Handlers/TokenHandler.cpp @@ -32,7 +32,7 @@ void WorldSession::HandleUpdateListedAuctionableTokens(WorldPackets::Token::Upda void WorldSession::HandleRequestWowTokenMarketPrice(WorldPackets::Token::RequestWowTokenMarketPrice& requestWowTokenMarketPrice) { - WorldPackets::Token::RequestWowTokenMarketPriceResponse response; + WorldPackets::Token::WowTokenMarketPriceResponse response; /// @todo: 6.x fix implementation response.CurrentMarketPrice = 300000000; diff --git a/src/server/game/Instances/InstanceScript.cpp b/src/server/game/Instances/InstanceScript.cpp index c151183da8a..80024879a43 100644 --- a/src/server/game/Instances/InstanceScript.cpp +++ b/src/server/game/Instances/InstanceScript.cpp @@ -426,7 +426,26 @@ void InstanceScript::DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime / TC_LOG_ERROR("scripts", "InstanceScript: DoUseDoorOrButton can't use gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType()); } else - TC_LOG_DEBUG("scripts", "InstanceScript: HandleGameObject failed"); + TC_LOG_DEBUG("scripts", "InstanceScript: DoUseDoorOrButton failed"); +} + +void InstanceScript::DoCloseDoorOrButton(ObjectGuid guid) +{ + if (!guid) + return; + + if (GameObject* go = instance->GetGameObject(guid)) + { + if (go->GetGoType() == GAMEOBJECT_TYPE_DOOR || go->GetGoType() == GAMEOBJECT_TYPE_BUTTON) + { + if (go->getLootState() == GO_ACTIVATED) + go->ResetDoorOrButton(); + } + else + TC_LOG_ERROR("scripts", "InstanceScript: DoCloseDoorOrButton can't use gameobject entry %u, because type is %u.", go->GetEntry(), go->GetGoType()); + } + else + TC_LOG_DEBUG("scripts", "InstanceScript: DoCloseDoorOrButton failed"); } void InstanceScript::DoRespawnGameObject(ObjectGuid guid, uint32 timeToDespawn /*= MINUTE*/) diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h index be1956efc79..d932c24abf3 100644 --- a/src/server/game/Instances/InstanceScript.h +++ b/src/server/game/Instances/InstanceScript.h @@ -195,6 +195,7 @@ class InstanceScript : public ZoneScript // Change active state of doors or buttons void DoUseDoorOrButton(ObjectGuid guid, uint32 withRestoreTime = 0, bool useAlternativeState = false); + void DoCloseDoorOrButton(ObjectGuid guid); // Respawns a GO having negative spawntimesecs in gameobject-table void DoRespawnGameObject(ObjectGuid guid, uint32 timeToDespawn = MINUTE); diff --git a/src/server/game/Loot/LootMgr.cpp b/src/server/game/Loot/LootMgr.cpp index a63ed66446e..189b620b805 100644 --- a/src/server/game/Loot/LootMgr.cpp +++ b/src/server/game/Loot/LootMgr.cpp @@ -155,12 +155,6 @@ uint32 LootStore::LoadLootTable() uint8 mincount = fields[7].GetUInt8(); uint8 maxcount = fields[8].GetUInt8(); - if (maxcount > std::numeric_limits<uint8>::max()) - { - TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: MaxCount value (%u) to large. must be less %u - skipped", GetName(), entry, item, maxcount, std::numeric_limits<uint8>::max()); - continue; // error already printed to log/console. - } - if (groupid >= 1 << 7) // it stored in 7 bit field { TC_LOG_ERROR("sql.sql", "Table '%s' Entry %d Item %d: GroupId (%u) must be less %u - skipped", GetName(), entry, item, groupid, 1 << 7); diff --git a/src/server/game/Maps/MapInstanced.cpp b/src/server/game/Maps/MapInstanced.cpp index 473e3163216..bd69844ae7c 100644 --- a/src/server/game/Maps/MapInstanced.cpp +++ b/src/server/game/Maps/MapInstanced.cpp @@ -214,7 +214,7 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save, // some instances only have one difficulty GetDownscaledMapDifficultyData(GetId(), difficulty); - TC_LOG_DEBUG("maps", "MapInstanced::CreateInstance: %s map instance %d for %d created with difficulty %s", save?"":"new ", InstanceId, GetId(), difficulty?"heroic":"normal"); + TC_LOG_DEBUG("maps", "MapInstanced::CreateInstance: %s map instance %d for %d created with difficulty %s", save ? "" : "new ", InstanceId, GetId(), difficulty ? "heroic" : "normal"); InstanceMap* map = new InstanceMap(GetId(), GetGridExpiry(), InstanceId, difficulty, this); ASSERT(map->IsDungeon()); diff --git a/src/server/game/Maps/TransportMgr.h b/src/server/game/Maps/TransportMgr.h index 74e8d00e0f7..2df1c9fb0ef 100644 --- a/src/server/game/Maps/TransportMgr.h +++ b/src/server/game/Maps/TransportMgr.h @@ -21,8 +21,8 @@ #include <G3D/Quat.h> #include "Spline.h" #include "DBCStores.h" +#include "DB2Stores.h" #include "ObjectGuid.h" -#include "DB2Structure.h" struct KeyFrame; struct GameObjectTemplate; @@ -99,7 +99,7 @@ typedef std::map<uint32, TransportAnimation> TransportAnimationContainer; class TransportMgr { - friend void LoadDBCStores(std::string const&); + friend void DB2Manager::LoadStores(std::string const&); public: static TransportMgr* instance() diff --git a/src/server/game/Miscellaneous/Language.h b/src/server/game/Miscellaneous/Language.h index c5d425e4130..625ad8cda49 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -988,16 +988,15 @@ enum TrinityStrings LANG_ACCOUNT_BNET_UNLINKED = 1188, LANG_ACCOUNT_BNET_NOT_LINKED = 1189, LANG_DISALLOW_TICKETS_CONFIG = 1190, - // Room for more level 3 1191-1199 not used + // Room for more level 3 1191-1198 not used // Debug commands + LANG_DEBUG_AREATRIGGER_LEFT = 1999, LANG_CINEMATIC_NOT_EXIST = 1200, LANG_MOVIE_NOT_EXIST = 1201, LANG_DEBUG_AREATRIGGER_ON = 1202, LANG_DEBUG_AREATRIGGER_OFF = 1203, LANG_DEBUG_AREATRIGGER_ENTERED = 1204, - LANG_DEBUG_AREATRIGGER_LEFT = 1205, - // Room for more debug 1206-1299 not used // Isle of Conquest LANG_BG_IC_START_TWO_MINUTES = 1205, @@ -1033,20 +1032,15 @@ enum TrinityStrings LANG_BG_AV_H_NEAR_LOSE = 1330, // 1331-1332 LANG_BG_AV_START_TWO_MINUTES = 1333, - // FREE IDS 1334-1999 + // FREE IDS 1334-2002 - // Ticket Strings 2000-2030 - LANG_COMMAND_TICKETNEW = 2000, - LANG_COMMAND_TICKETUPDATED = 2001, - LANG_COMMAND_TICKETPLAYERABANDON = 2002, + // Ticket Strings 2003-2028 LANG_COMMAND_TICKETCLOSED = 2003, LANG_COMMAND_TICKETDELETED = 2004, LANG_COMMAND_TICKETNOTEXIST = 2005, LANG_COMMAND_TICKETCLOSEFIRST = 2006, LANG_COMMAND_TICKETALREADYASSIGNED = 2007, - LANG_COMMAND_TICKETRELOAD = 2008, LANG_COMMAND_TICKETSHOWLIST = 2009, - LANG_COMMAND_TICKETSHOWONLINELIST = 2010, LANG_COMMAND_TICKETSHOWCLOSEDLIST = 2011, LANG_COMMAND_TICKETASSIGNERROR_A = 2012, LANG_COMMAND_TICKETASSIGNERROR_B = 2013, @@ -1055,18 +1049,14 @@ enum TrinityStrings LANG_COMMAND_TICKETCANNOTCLOSE = 2016, LANG_COMMAND_TICKETLISTGUID = 2017, LANG_COMMAND_TICKETLISTNAME = 2018, - LANG_COMMAND_TICKETLISTAGE = 2019, LANG_COMMAND_TICKETLISTASSIGNEDTO = 2020, LANG_COMMAND_TICKETLISTUNASSIGNED = 2021, LANG_COMMAND_TICKETLISTMESSAGE = 2022, LANG_COMMAND_TICKETLISTCOMMENT = 2023, LANG_COMMAND_TICKETLISTADDCOMMENT = 2024, LANG_COMMAND_TICKETLISTAGECREATE = 2025, - LANG_COMMAND_TICKETSHOWESCALATEDLIST = 2026, LANG_COMMAND_TICKETPENDING = 2027, LANG_COMMAND_TICKETRESET = 2028, - LANG_COMMAND_TICKETLISTRESPONSE = 2029, - LANG_COMMAND_TICKETCOMPLETED = 2030, // Trinity strings 5000-9999 LANG_COMMAND_FREEZE = 5000, diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 86e1c80bbd1..347c97a92d7 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -742,7 +742,7 @@ enum SpellAttr10 SPELL_ATTR10_UNK26 = 0x04000000, // 26 SPELL_ATTR10_UNK27 = 0x08000000, // 27 SPELL_ATTR10_UNK28 = 0x10000000, // 28 - SPELL_ATTR10_UNK29 = 0x20000000, // 29 + SPELL_ATTR10_MOUNT_IS_NOT_ACCOUNT_WIDE = 0x20000000, // 29 This mount is stored per-character SPELL_ATTR10_UNK30 = 0x40000000, // 30 SPELL_ATTR10_UNK31 = 0x80000000 // 31 }; @@ -765,7 +765,7 @@ enum SpellAttr11 SPELL_ATTR11_UNK13 = 0x00002000, // 13 SPELL_ATTR11_UNK14 = 0x00004000, // 14 SPELL_ATTR11_UNK15 = 0x00008000, // 15 - SPELL_ATTR11_UNK16 = 0x00010000, // 16 + SPELL_ATTR11_NOT_USABLE_IN_CHALLENGE_MODE = 0x00010000, // 16 SPELL_ATTR11_UNK17 = 0x00020000, // 17 SPELL_ATTR11_UNK18 = 0x00040000, // 18 SPELL_ATTR11_UNK19 = 0x00080000, // 19 @@ -1261,278 +1261,278 @@ enum SpellEffectName TOTAL_SPELL_EFFECTS = 251, }; -enum SpellCastResult // 19702 +enum SpellCastResult // 20201 { - SPELL_FAILED_SUCCESS = 0, - SPELL_FAILED_AFFECTING_COMBAT = 1, - SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 2, - SPELL_FAILED_ALREADY_AT_FULL_MANA = 3, - SPELL_FAILED_ALREADY_AT_FULL_POWER = 4, - SPELL_FAILED_ALREADY_BEING_TAMED = 5, - SPELL_FAILED_ALREADY_HAVE_CHARM = 6, - SPELL_FAILED_ALREADY_HAVE_SUMMON = 7, - SPELL_FAILED_ALREADY_HAVE_PET = 8, - SPELL_FAILED_ALREADY_OPEN = 9, - SPELL_FAILED_AURA_BOUNCED = 10, - SPELL_FAILED_AUTOTRACK_INTERRUPTED = 11, - SPELL_FAILED_BAD_IMPLICIT_TARGETS = 12, - SPELL_FAILED_BAD_TARGETS = 13, - SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED = 14, - SPELL_FAILED_CANT_BE_CHARMED = 15, - SPELL_FAILED_CANT_BE_DISENCHANTED = 16, - SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 17, - SPELL_FAILED_CANT_BE_MILLED = 18, - SPELL_FAILED_CANT_BE_PROSPECTED = 19, - SPELL_FAILED_CANT_CAST_ON_TAPPED = 20, - SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 21, - SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 22, - SPELL_FAILED_CANT_STEALTH = 23, - SPELL_FAILED_CANT_UNTALENT = 24, - SPELL_FAILED_CASTER_AURASTATE = 25, - SPELL_FAILED_CASTER_DEAD = 26, - SPELL_FAILED_CHARMED = 27, - SPELL_FAILED_CHEST_IN_USE = 28, - SPELL_FAILED_CONFUSED = 29, - SPELL_FAILED_DONT_REPORT = 30, - SPELL_FAILED_EQUIPPED_ITEM = 31, - SPELL_FAILED_EQUIPPED_ITEM_CLASS = 32, - SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 33, - SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 34, - SPELL_FAILED_ERROR = 35, - SPELL_FAILED_FALLING = 36, - SPELL_FAILED_FIZZLE = 37, - SPELL_FAILED_FLEEING = 38, - SPELL_FAILED_FOOD_LOWLEVEL = 39, - SPELL_FAILED_GARRISON_NOT_OWNED = 40, - SPELL_FAILED_GARRISON_OWNED = 41, - SPELL_FAILED_GARRISON_MAX_LEVEL = 42, - SPELL_FAILED_GARRISON_NOT_UPGRADEABLE = 43, - SPELL_FAILED_GARRISON_FOLLOWER_ON_MISSION = 44, - SPELL_FAILED_GARRISON_FOLLOWER_IN_BUILDING = 45, - SPELL_FAILED_GARRISON_FOLLOWER_MAX_LEVEL = 46, - SPELL_FAILED_GARRISON_FOLLOWER_MAX_ITEM_LEVEL = 47, - SPELL_FAILED_GARRISON_FOLLOWER_MAX_QUALITY = 48, - SPELL_FAILED_GARRISON_FOLLOWER_NOT_MAX_LEVEL = 49, - SPELL_FAILED_GARRISON_FOLLOWER_HAS_ABILITY = 50, - SPELL_FAILED_GARRISON_FOLLOWER_NO_OVERRIDEABLE_ABILITY = 51, - SPELL_FAILED_GARRISON_MISSION_NOT_IN_PROGRESS = 52, - SPELL_FAILED_GARRISON_MISSION_COMPLETE = 53, - SPELL_FAILED_GARRISON_NO_MISSIONS_AVAILABLE = 54, - SPELL_FAILED_HIGHLEVEL = 55, - SPELL_FAILED_HUNGER_SATIATED = 56, - SPELL_FAILED_IMMUNE = 57, - SPELL_FAILED_INCORRECT_AREA = 58, - SPELL_FAILED_INTERRUPTED = 59, - SPELL_FAILED_INTERRUPTED_COMBAT = 60, - SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 61, - SPELL_FAILED_ITEM_GONE = 62, - SPELL_FAILED_ITEM_NOT_FOUND = 63, - SPELL_FAILED_ITEM_NOT_READY = 64, - SPELL_FAILED_LEVEL_REQUIREMENT = 65, - SPELL_FAILED_LINE_OF_SIGHT = 66, - SPELL_FAILED_LOWLEVEL = 67, - SPELL_FAILED_LOW_CASTLEVEL = 68, - SPELL_FAILED_MAINHAND_EMPTY = 69, - SPELL_FAILED_MOVING = 70, - SPELL_FAILED_NEED_AMMO = 71, - SPELL_FAILED_NEED_AMMO_POUCH = 72, - SPELL_FAILED_NEED_EXOTIC_AMMO = 73, - SPELL_FAILED_NEED_MORE_ITEMS = 74, - SPELL_FAILED_NOPATH = 75, - SPELL_FAILED_NOT_BEHIND = 76, - SPELL_FAILED_NOT_FISHABLE = 77, - SPELL_FAILED_NOT_FLYING = 78, - SPELL_FAILED_NOT_HERE = 79, - SPELL_FAILED_NOT_INFRONT = 80, - SPELL_FAILED_NOT_IN_CONTROL = 81, - SPELL_FAILED_NOT_KNOWN = 82, - SPELL_FAILED_NOT_MOUNTED = 83, - SPELL_FAILED_NOT_ON_TAXI = 84, - SPELL_FAILED_NOT_ON_TRANSPORT = 85, - SPELL_FAILED_NOT_READY = 86, - SPELL_FAILED_NOT_SHAPESHIFT = 87, - SPELL_FAILED_NOT_STANDING = 88, - SPELL_FAILED_NOT_TRADEABLE = 89, - SPELL_FAILED_NOT_TRADING = 90, - SPELL_FAILED_NOT_UNSHEATHED = 91, - SPELL_FAILED_NOT_WHILE_GHOST = 92, - SPELL_FAILED_NOT_WHILE_LOOTING = 93, - SPELL_FAILED_NO_AMMO = 94, - SPELL_FAILED_NO_CHARGES_REMAIN = 95, - SPELL_FAILED_NO_CHAMPION = 96, - SPELL_FAILED_NO_COMBO_POINTS = 97, - SPELL_FAILED_NO_DUELING = 98, - SPELL_FAILED_NO_ENDURANCE = 99, - SPELL_FAILED_NO_FISH = 100, - SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 101, - SPELL_FAILED_NO_MOUNTS_ALLOWED = 102, - SPELL_FAILED_NO_PET = 103, - SPELL_FAILED_NO_POWER = 104, - SPELL_FAILED_NOTHING_TO_DISPEL = 105, - SPELL_FAILED_NOTHING_TO_STEAL = 106, - SPELL_FAILED_ONLY_ABOVEWATER = 107, - SPELL_FAILED_ONLY_DAYTIME = 108, - SPELL_FAILED_ONLY_INDOORS = 109, - SPELL_FAILED_ONLY_MOUNTED = 110, - SPELL_FAILED_ONLY_NIGHTTIME = 111, - SPELL_FAILED_ONLY_OUTDOORS = 112, - SPELL_FAILED_ONLY_SHAPESHIFT = 113, - SPELL_FAILED_ONLY_STEALTHED = 114, - SPELL_FAILED_ONLY_UNDERWATER = 115, - SPELL_FAILED_OUT_OF_RANGE = 116, - SPELL_FAILED_PACIFIED = 117, - SPELL_FAILED_POSSESSED = 118, - SPELL_FAILED_REAGENTS = 119, - SPELL_FAILED_REQUIRES_AREA = 120, - SPELL_FAILED_REQUIRES_SPELL_FOCUS = 121, - SPELL_FAILED_ROOTED = 122, - SPELL_FAILED_SILENCED = 123, - SPELL_FAILED_SPELL_IN_PROGRESS = 124, - SPELL_FAILED_SPELL_LEARNED = 125, - SPELL_FAILED_SPELL_UNAVAILABLE = 126, - SPELL_FAILED_STUNNED = 127, - SPELL_FAILED_TARGETS_DEAD = 128, - SPELL_FAILED_TARGET_AFFECTING_COMBAT = 129, - SPELL_FAILED_TARGET_AURASTATE = 130, - SPELL_FAILED_TARGET_DUELING = 131, - SPELL_FAILED_TARGET_ENEMY = 132, - SPELL_FAILED_TARGET_ENRAGED = 133, - SPELL_FAILED_TARGET_FRIENDLY = 134, - SPELL_FAILED_TARGET_IN_COMBAT = 135, - SPELL_FAILED_TARGET_IN_PET_BATTLE = 136, - SPELL_FAILED_TARGET_IS_PLAYER = 137, - SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 138, - SPELL_FAILED_TARGET_NOT_DEAD = 139, - SPELL_FAILED_TARGET_NOT_IN_PARTY = 140, - SPELL_FAILED_TARGET_NOT_LOOTED = 141, - SPELL_FAILED_TARGET_NOT_PLAYER = 142, - SPELL_FAILED_TARGET_NO_POCKETS = 143, - SPELL_FAILED_TARGET_NO_WEAPONS = 144, - SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 145, - SPELL_FAILED_TARGET_UNSKINNABLE = 146, - SPELL_FAILED_THIRST_SATIATED = 147, - SPELL_FAILED_TOO_CLOSE = 148, - SPELL_FAILED_TOO_MANY_OF_ITEM = 149, - SPELL_FAILED_TOTEM_CATEGORY = 150, - SPELL_FAILED_TOTEMS = 151, - SPELL_FAILED_TRY_AGAIN = 152, - SPELL_FAILED_UNIT_NOT_BEHIND = 153, - SPELL_FAILED_UNIT_NOT_INFRONT = 154, - SPELL_FAILED_VISION_OBSCURED = 155, - SPELL_FAILED_WRONG_PET_FOOD = 156, - SPELL_FAILED_NOT_WHILE_FATIGUED = 157, - SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 158, - SPELL_FAILED_NOT_WHILE_TRADING = 159, - SPELL_FAILED_TARGET_NOT_IN_RAID = 160, - SPELL_FAILED_TARGET_FREEFORALL = 161, - SPELL_FAILED_NO_EDIBLE_CORPSES = 162, - SPELL_FAILED_ONLY_BATTLEGROUNDS = 163, - SPELL_FAILED_TARGET_NOT_GHOST = 164, - SPELL_FAILED_TRANSFORM_UNUSABLE = 165, - SPELL_FAILED_WRONG_WEATHER = 166, - SPELL_FAILED_DAMAGE_IMMUNE = 167, - SPELL_FAILED_PREVENTED_BY_MECHANIC = 168, - SPELL_FAILED_PLAY_TIME = 169, - SPELL_FAILED_REPUTATION = 170, - SPELL_FAILED_MIN_SKILL = 171, - SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND = 172, - SPELL_FAILED_NOT_ON_SHAPESHIFT = 173, - SPELL_FAILED_NOT_ON_STEALTHED = 174, - SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 175, - SPELL_FAILED_NOT_ON_MOUNTED = 176, - SPELL_FAILED_TOO_SHALLOW = 177, - SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 178, - SPELL_FAILED_TARGET_IS_TRIVIAL = 179, - SPELL_FAILED_BM_OR_INVISGOD = 180, - SPELL_FAILED_GROUND_MOUNT_NOT_ALLOWED = 181, - SPELL_FAILED_FLOATING_MOUNT_NOT_ALLOWED = 182, - SPELL_FAILED_UNDERWATER_MOUNT_NOT_ALLOWED = 183, - SPELL_FAILED_FLYING_MOUNT_NOT_ALLOWED = 184, - SPELL_FAILED_APPRENTICE_RIDING_REQUIREMENT = 185, - SPELL_FAILED_JOURNEYMAN_RIDING_REQUIREMENT = 186, - SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 187, - SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 188, - SPELL_FAILED_MASTER_RIDING_REQUIREMENT = 189, - SPELL_FAILED_COLD_RIDING_REQUIREMENT = 190, - SPELL_FAILED_FLIGHT_MASTER_RIDING_REQUIREMENT = 191, - SPELL_FAILED_CS_RIDING_REQUIREMENT = 192, - SPELL_FAILED_PANDA_RIDING_REQUIREMENT = 193, - SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 194, - SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 195, - SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 196, - SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 197, - SPELL_FAILED_NOT_IDLE = 198, - SPELL_FAILED_NOT_INACTIVE = 199, - SPELL_FAILED_PARTIAL_PLAYTIME = 200, - SPELL_FAILED_NO_PLAYTIME = 201, - SPELL_FAILED_NOT_IN_BATTLEGROUND = 202, - SPELL_FAILED_NOT_IN_RAID_INSTANCE = 203, - SPELL_FAILED_ONLY_IN_ARENA = 204, - SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 205, - SPELL_FAILED_ON_USE_ENCHANT = 206, - SPELL_FAILED_NOT_ON_GROUND = 207, - SPELL_FAILED_CUSTOM_ERROR = 208, - SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 209, - SPELL_FAILED_TOO_MANY_SOCKETS = 210, - SPELL_FAILED_INVALID_GLYPH = 211, - SPELL_FAILED_UNIQUE_GLYPH = 212, - SPELL_FAILED_GLYPH_SOCKET_LOCKED = 213, - SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 214, - SPELL_FAILED_GLYPH_INVALID_SPEC = 215, - SPELL_FAILED_GLYPH_NO_SPEC = 216, - SPELL_FAILED_NO_VALID_TARGETS = 217, - SPELL_FAILED_ITEM_AT_MAX_CHARGES = 218, - SPELL_FAILED_NOT_IN_BARBERSHOP = 219, - SPELL_FAILED_FISHING_TOO_LOW = 220, - SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 221, - SPELL_FAILED_SUMMON_PENDING = 222, - SPELL_FAILED_MAX_SOCKETS = 223, - SPELL_FAILED_PET_CAN_RENAME = 224, - SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 225, - SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 226, - SPELL_FAILED_NO_ACTIONS = 227, - SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 228, - SPELL_FAILED_WEIGHT_NOT_ENOUGH = 229, - SPELL_FAILED_WEIGHT_TOO_MUCH = 230, - SPELL_FAILED_NO_VACANT_SEAT = 231, - SPELL_FAILED_NO_LIQUID = 232, - SPELL_FAILED_ONLY_NOT_SWIMMING = 233, - SPELL_FAILED_BY_NOT_MOVING = 234, - SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 235, - SPELL_FAILED_NOT_IN_ARENA = 236, - SPELL_FAILED_TARGET_NOT_GROUNDED = 237, - SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 238, - SPELL_FAILED_NOT_IN_LFG_DUNGEON = 239, - SPELL_FAILED_BAD_TARGET_FILTER = 240, - SPELL_FAILED_NOT_ENOUGH_TARGETS = 241, - SPELL_FAILED_NO_SPEC = 242, - SPELL_FAILED_CANT_ADD_BATTLE_PET = 243, - SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 244, - SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 245, - SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 246, - SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 247, - SPELL_FAILED_MAX_LEVEL_TOO_LOW = 248, - SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 249, - GRANT_PET_LEVEL_FAIL = 250, - SPELL_FAILED_SKILL_LINE_NOT_KNOWN = 251, - SPELL_FAILED_BLUEPRINT_KNOWN = 252, - SPELL_FAILED_FOLLOWER_KNOWN = 253, - SPELL_FAILED_CANT_OVERRIDE_ENCHANT_VISUAL = 254, - SPELL_FAILED_ITEM_NOT_A_WEAPON = 255, - SPELL_FAILED_SAME_ENCHANT_VISUAL = 256, - SPELL_FAILED_TOY_USE_LIMIT_REACHED = 257, - SPELL_FAILED_TOY_ALREADY_KNOWN = 258, - SPELL_FAILED_SHIPMENTS_FULL = 259, - SPELL_FAILED_NO_SHIPMENTS_FOR_CONTAINER = 260, - SPELL_FAILED_NO_BUILDING_FOR_SHIPMENT = 261, - SPELL_FAILED_NOT_ENOUGH_SHIPMENTS_FOR_CONTAINER = 262, - SPELL_FAILED_HAS_MISSION = 263, - SPELL_FAILED_BUILDING_ACTIVATE_NOT_READY = 264, - SPELL_FAILED_NOT_SOULBOUND = 265, - SPELL_FAILED_RIDING_VEHICLE = 266, - SPELL_FAILED_VETERAN_TRIAL_ABOVE_SKILL_RANK_MAX = 267, - SPELL_FAILED_UNKNOWN = 268, - SPELL_CAST_OK = 0xFFFF // custom value, must not be sent to client + SPELL_FAILED_SUCCESS = 0, + SPELL_FAILED_AFFECTING_COMBAT = 1, + SPELL_FAILED_ALREADY_AT_FULL_HEALTH = 2, + SPELL_FAILED_ALREADY_AT_FULL_MANA = 3, + SPELL_FAILED_ALREADY_AT_FULL_POWER = 4, + SPELL_FAILED_ALREADY_BEING_TAMED = 5, + SPELL_FAILED_ALREADY_HAVE_CHARM = 6, + SPELL_FAILED_ALREADY_HAVE_SUMMON = 7, + SPELL_FAILED_ALREADY_HAVE_PET = 8, + SPELL_FAILED_ALREADY_OPEN = 9, + SPELL_FAILED_AURA_BOUNCED = 10, + SPELL_FAILED_AUTOTRACK_INTERRUPTED = 11, + SPELL_FAILED_BAD_IMPLICIT_TARGETS = 12, + SPELL_FAILED_BAD_TARGETS = 13, + SPELL_FAILED_PVP_TARGET_WHILE_UNFLAGGED = 14, + SPELL_FAILED_CANT_BE_CHARMED = 15, + SPELL_FAILED_CANT_BE_DISENCHANTED = 16, + SPELL_FAILED_CANT_BE_DISENCHANTED_SKILL = 17, + SPELL_FAILED_CANT_BE_MILLED = 18, + SPELL_FAILED_CANT_BE_PROSPECTED = 19, + SPELL_FAILED_CANT_CAST_ON_TAPPED = 20, + SPELL_FAILED_CANT_DUEL_WHILE_INVISIBLE = 21, + SPELL_FAILED_CANT_DUEL_WHILE_STEALTHED = 22, + SPELL_FAILED_CANT_STEALTH = 23, + SPELL_FAILED_CANT_UNTALENT = 24, + SPELL_FAILED_CASTER_AURASTATE = 25, + SPELL_FAILED_CASTER_DEAD = 26, + SPELL_FAILED_CHARMED = 27, + SPELL_FAILED_CHEST_IN_USE = 28, + SPELL_FAILED_CONFUSED = 29, + SPELL_FAILED_DONT_REPORT = 30, + SPELL_FAILED_EQUIPPED_ITEM = 31, + SPELL_FAILED_EQUIPPED_ITEM_CLASS = 32, + SPELL_FAILED_EQUIPPED_ITEM_CLASS_MAINHAND = 33, + SPELL_FAILED_EQUIPPED_ITEM_CLASS_OFFHAND = 34, + SPELL_FAILED_ERROR = 35, + SPELL_FAILED_FALLING = 36, + SPELL_FAILED_FIZZLE = 37, + SPELL_FAILED_FLEEING = 38, + SPELL_FAILED_FOOD_LOWLEVEL = 39, + SPELL_FAILED_GARRISON_NOT_OWNED = 40, + SPELL_FAILED_GARRISON_OWNED = 41, + SPELL_FAILED_GARRISON_MAX_LEVEL = 42, + SPELL_FAILED_GARRISON_NOT_UPGRADEABLE = 43, + SPELL_FAILED_GARRISON_FOLLOWER_ON_MISSION = 44, + SPELL_FAILED_GARRISON_FOLLOWER_IN_BUILDING = 45, + SPELL_FAILED_GARRISON_FOLLOWER_MAX_LEVEL = 46, + SPELL_FAILED_GARRISON_FOLLOWER_MAX_ITEM_LEVEL = 47, + SPELL_FAILED_GARRISON_FOLLOWER_MAX_QUALITY = 48, + SPELL_FAILED_GARRISON_FOLLOWER_NOT_MAX_LEVEL = 49, + SPELL_FAILED_GARRISON_FOLLOWER_HAS_ABILITY = 50, + SPELL_FAILED_GARRISON_FOLLOWER_HAS_SINGLE_MISSION_ABILITY = 51, + SPELL_FAILED_GARRISON_MISSION_NOT_IN_PROGRESS = 52, + SPELL_FAILED_GARRISON_MISSION_COMPLETE = 53, + SPELL_FAILED_GARRISON_NO_MISSIONS_AVAILABLE = 54, + SPELL_FAILED_HIGHLEVEL = 55, + SPELL_FAILED_HUNGER_SATIATED = 56, + SPELL_FAILED_IMMUNE = 57, + SPELL_FAILED_INCORRECT_AREA = 58, + SPELL_FAILED_INTERRUPTED = 59, + SPELL_FAILED_INTERRUPTED_COMBAT = 60, + SPELL_FAILED_ITEM_ALREADY_ENCHANTED = 61, + SPELL_FAILED_ITEM_GONE = 62, + SPELL_FAILED_ITEM_NOT_FOUND = 63, + SPELL_FAILED_ITEM_NOT_READY = 64, + SPELL_FAILED_LEVEL_REQUIREMENT = 65, + SPELL_FAILED_LINE_OF_SIGHT = 66, + SPELL_FAILED_LOWLEVEL = 67, + SPELL_FAILED_LOW_CASTLEVEL = 68, + SPELL_FAILED_MAINHAND_EMPTY = 69, + SPELL_FAILED_MOVING = 70, + SPELL_FAILED_NEED_AMMO = 71, + SPELL_FAILED_NEED_AMMO_POUCH = 72, + SPELL_FAILED_NEED_EXOTIC_AMMO = 73, + SPELL_FAILED_NEED_MORE_ITEMS = 74, + SPELL_FAILED_NOPATH = 75, + SPELL_FAILED_NOT_BEHIND = 76, + SPELL_FAILED_NOT_FISHABLE = 77, + SPELL_FAILED_NOT_FLYING = 78, + SPELL_FAILED_NOT_HERE = 79, + SPELL_FAILED_NOT_INFRONT = 80, + SPELL_FAILED_NOT_IN_CONTROL = 81, + SPELL_FAILED_NOT_KNOWN = 82, + SPELL_FAILED_NOT_MOUNTED = 83, + SPELL_FAILED_NOT_ON_TAXI = 84, + SPELL_FAILED_NOT_ON_TRANSPORT = 85, + SPELL_FAILED_NOT_READY = 86, + SPELL_FAILED_NOT_SHAPESHIFT = 87, + SPELL_FAILED_NOT_STANDING = 88, + SPELL_FAILED_NOT_TRADEABLE = 89, + SPELL_FAILED_NOT_TRADING = 90, + SPELL_FAILED_NOT_UNSHEATHED = 91, + SPELL_FAILED_NOT_WHILE_GHOST = 92, + SPELL_FAILED_NOT_WHILE_LOOTING = 93, + SPELL_FAILED_NO_AMMO = 94, + SPELL_FAILED_NO_CHARGES_REMAIN = 95, + SPELL_FAILED_NO_CHAMPION = 96, + SPELL_FAILED_NO_COMBO_POINTS = 97, + SPELL_FAILED_NO_DUELING = 98, + SPELL_FAILED_NO_ENDURANCE = 99, + SPELL_FAILED_NO_FISH = 100, + SPELL_FAILED_NO_ITEMS_WHILE_SHAPESHIFTED = 101, + SPELL_FAILED_NO_MOUNTS_ALLOWED = 102, + SPELL_FAILED_NO_PET = 103, + SPELL_FAILED_NO_POWER = 104, + SPELL_FAILED_NOTHING_TO_DISPEL = 105, + SPELL_FAILED_NOTHING_TO_STEAL = 106, + SPELL_FAILED_ONLY_ABOVEWATER = 107, + SPELL_FAILED_ONLY_DAYTIME = 108, + SPELL_FAILED_ONLY_INDOORS = 109, + SPELL_FAILED_ONLY_MOUNTED = 110, + SPELL_FAILED_ONLY_NIGHTTIME = 111, + SPELL_FAILED_ONLY_OUTDOORS = 112, + SPELL_FAILED_ONLY_SHAPESHIFT = 113, + SPELL_FAILED_ONLY_STEALTHED = 114, + SPELL_FAILED_ONLY_UNDERWATER = 115, + SPELL_FAILED_OUT_OF_RANGE = 116, + SPELL_FAILED_PACIFIED = 117, + SPELL_FAILED_POSSESSED = 118, + SPELL_FAILED_REAGENTS = 119, + SPELL_FAILED_REQUIRES_AREA = 120, + SPELL_FAILED_REQUIRES_SPELL_FOCUS = 121, + SPELL_FAILED_ROOTED = 122, + SPELL_FAILED_SILENCED = 123, + SPELL_FAILED_SPELL_IN_PROGRESS = 124, + SPELL_FAILED_SPELL_LEARNED = 125, + SPELL_FAILED_SPELL_UNAVAILABLE = 126, + SPELL_FAILED_STUNNED = 127, + SPELL_FAILED_TARGETS_DEAD = 128, + SPELL_FAILED_TARGET_AFFECTING_COMBAT = 129, + SPELL_FAILED_TARGET_AURASTATE = 130, + SPELL_FAILED_TARGET_DUELING = 131, + SPELL_FAILED_TARGET_ENEMY = 132, + SPELL_FAILED_TARGET_ENRAGED = 133, + SPELL_FAILED_TARGET_FRIENDLY = 134, + SPELL_FAILED_TARGET_IN_COMBAT = 135, + SPELL_FAILED_TARGET_IN_PET_BATTLE = 136, + SPELL_FAILED_TARGET_IS_PLAYER = 137, + SPELL_FAILED_TARGET_IS_PLAYER_CONTROLLED = 138, + SPELL_FAILED_TARGET_NOT_DEAD = 139, + SPELL_FAILED_TARGET_NOT_IN_PARTY = 140, + SPELL_FAILED_TARGET_NOT_LOOTED = 141, + SPELL_FAILED_TARGET_NOT_PLAYER = 142, + SPELL_FAILED_TARGET_NO_POCKETS = 143, + SPELL_FAILED_TARGET_NO_WEAPONS = 144, + SPELL_FAILED_TARGET_NO_RANGED_WEAPONS = 145, + SPELL_FAILED_TARGET_UNSKINNABLE = 146, + SPELL_FAILED_THIRST_SATIATED = 147, + SPELL_FAILED_TOO_CLOSE = 148, + SPELL_FAILED_TOO_MANY_OF_ITEM = 149, + SPELL_FAILED_TOTEM_CATEGORY = 150, + SPELL_FAILED_TOTEMS = 151, + SPELL_FAILED_TRY_AGAIN = 152, + SPELL_FAILED_UNIT_NOT_BEHIND = 153, + SPELL_FAILED_UNIT_NOT_INFRONT = 154, + SPELL_FAILED_VISION_OBSCURED = 155, + SPELL_FAILED_WRONG_PET_FOOD = 156, + SPELL_FAILED_NOT_WHILE_FATIGUED = 157, + SPELL_FAILED_TARGET_NOT_IN_INSTANCE = 158, + SPELL_FAILED_NOT_WHILE_TRADING = 159, + SPELL_FAILED_TARGET_NOT_IN_RAID = 160, + SPELL_FAILED_TARGET_FREEFORALL = 161, + SPELL_FAILED_NO_EDIBLE_CORPSES = 162, + SPELL_FAILED_ONLY_BATTLEGROUNDS = 163, + SPELL_FAILED_TARGET_NOT_GHOST = 164, + SPELL_FAILED_TRANSFORM_UNUSABLE = 165, + SPELL_FAILED_WRONG_WEATHER = 166, + SPELL_FAILED_DAMAGE_IMMUNE = 167, + SPELL_FAILED_PREVENTED_BY_MECHANIC = 168, + SPELL_FAILED_PLAY_TIME = 169, + SPELL_FAILED_REPUTATION = 170, + SPELL_FAILED_MIN_SKILL = 171, + SPELL_FAILED_NOT_IN_RATED_BATTLEGROUND = 172, + SPELL_FAILED_NOT_ON_SHAPESHIFT = 173, + SPELL_FAILED_NOT_ON_STEALTHED = 174, + SPELL_FAILED_NOT_ON_DAMAGE_IMMUNE = 175, + SPELL_FAILED_NOT_ON_MOUNTED = 176, + SPELL_FAILED_TOO_SHALLOW = 177, + SPELL_FAILED_TARGET_NOT_IN_SANCTUARY = 178, + SPELL_FAILED_TARGET_IS_TRIVIAL = 179, + SPELL_FAILED_BM_OR_INVISGOD = 180, + SPELL_FAILED_GROUND_MOUNT_NOT_ALLOWED = 181, + SPELL_FAILED_FLOATING_MOUNT_NOT_ALLOWED = 182, + SPELL_FAILED_UNDERWATER_MOUNT_NOT_ALLOWED = 183, + SPELL_FAILED_FLYING_MOUNT_NOT_ALLOWED = 184, + SPELL_FAILED_APPRENTICE_RIDING_REQUIREMENT = 185, + SPELL_FAILED_JOURNEYMAN_RIDING_REQUIREMENT = 186, + SPELL_FAILED_EXPERT_RIDING_REQUIREMENT = 187, + SPELL_FAILED_ARTISAN_RIDING_REQUIREMENT = 188, + SPELL_FAILED_MASTER_RIDING_REQUIREMENT = 189, + SPELL_FAILED_COLD_RIDING_REQUIREMENT = 190, + SPELL_FAILED_FLIGHT_MASTER_RIDING_REQUIREMENT = 191, + SPELL_FAILED_CS_RIDING_REQUIREMENT = 192, + SPELL_FAILED_PANDA_RIDING_REQUIREMENT = 193, + SPELL_FAILED_MOUNT_NO_FLOAT_HERE = 194, + SPELL_FAILED_MOUNT_NO_UNDERWATER_HERE = 195, + SPELL_FAILED_MOUNT_ABOVE_WATER_HERE = 196, + SPELL_FAILED_MOUNT_COLLECTED_ON_OTHER_CHAR = 197, + SPELL_FAILED_NOT_IDLE = 198, + SPELL_FAILED_NOT_INACTIVE = 199, + SPELL_FAILED_PARTIAL_PLAYTIME = 200, + SPELL_FAILED_NO_PLAYTIME = 201, + SPELL_FAILED_NOT_IN_BATTLEGROUND = 202, + SPELL_FAILED_NOT_IN_RAID_INSTANCE = 203, + SPELL_FAILED_ONLY_IN_ARENA = 204, + SPELL_FAILED_TARGET_LOCKED_TO_RAID_INSTANCE = 205, + SPELL_FAILED_ON_USE_ENCHANT = 206, + SPELL_FAILED_NOT_ON_GROUND = 207, + SPELL_FAILED_CUSTOM_ERROR = 208, + SPELL_FAILED_CANT_DO_THAT_RIGHT_NOW = 209, + SPELL_FAILED_TOO_MANY_SOCKETS = 210, + SPELL_FAILED_INVALID_GLYPH = 211, + SPELL_FAILED_UNIQUE_GLYPH = 212, + SPELL_FAILED_GLYPH_SOCKET_LOCKED = 213, + SPELL_FAILED_GLYPH_EXCLUSIVE_CATEGORY = 214, + SPELL_FAILED_GLYPH_INVALID_SPEC = 215, + SPELL_FAILED_GLYPH_NO_SPEC = 216, + SPELL_FAILED_NO_VALID_TARGETS = 217, + SPELL_FAILED_ITEM_AT_MAX_CHARGES = 218, + SPELL_FAILED_NOT_IN_BARBERSHOP = 219, + SPELL_FAILED_FISHING_TOO_LOW = 220, + SPELL_FAILED_ITEM_ENCHANT_TRADE_WINDOW = 221, + SPELL_FAILED_SUMMON_PENDING = 222, + SPELL_FAILED_MAX_SOCKETS = 223, + SPELL_FAILED_PET_CAN_RENAME = 224, + SPELL_FAILED_TARGET_CANNOT_BE_RESURRECTED = 225, + SPELL_FAILED_TARGET_HAS_RESURRECT_PENDING = 226, + SPELL_FAILED_NO_ACTIONS = 227, + SPELL_FAILED_CURRENCY_WEIGHT_MISMATCH = 228, + SPELL_FAILED_WEIGHT_NOT_ENOUGH = 229, + SPELL_FAILED_WEIGHT_TOO_MUCH = 230, + SPELL_FAILED_NO_VACANT_SEAT = 231, + SPELL_FAILED_NO_LIQUID = 232, + SPELL_FAILED_ONLY_NOT_SWIMMING = 233, + SPELL_FAILED_BY_NOT_MOVING = 234, + SPELL_FAILED_IN_COMBAT_RES_LIMIT_REACHED = 235, + SPELL_FAILED_NOT_IN_ARENA = 236, + SPELL_FAILED_TARGET_NOT_GROUNDED = 237, + SPELL_FAILED_EXCEEDED_WEEKLY_USAGE = 238, + SPELL_FAILED_NOT_IN_LFG_DUNGEON = 239, + SPELL_FAILED_BAD_TARGET_FILTER = 240, + SPELL_FAILED_NOT_ENOUGH_TARGETS = 241, + SPELL_FAILED_NO_SPEC = 242, + SPELL_FAILED_CANT_ADD_BATTLE_PET = 243, + SPELL_FAILED_CANT_UPGRADE_BATTLE_PET = 244, + SPELL_FAILED_WRONG_BATTLE_PET_TYPE = 245, + SPELL_FAILED_NO_DUNGEON_ENCOUNTER = 246, + SPELL_FAILED_NO_TELEPORT_FROM_DUNGEON = 247, + SPELL_FAILED_MAX_LEVEL_TOO_LOW = 248, + SPELL_FAILED_CANT_REPLACE_ITEM_BONUS = 249, + GRANT_PET_LEVEL_FAIL = 250, + SPELL_FAILED_SKILL_LINE_NOT_KNOWN = 251, + SPELL_FAILED_BLUEPRINT_KNOWN = 252, + SPELL_FAILED_FOLLOWER_KNOWN = 253, + SPELL_FAILED_CANT_OVERRIDE_ENCHANT_VISUAL = 254, + SPELL_FAILED_ITEM_NOT_A_WEAPON = 255, + SPELL_FAILED_SAME_ENCHANT_VISUAL = 256, + SPELL_FAILED_TOY_USE_LIMIT_REACHED = 257, + SPELL_FAILED_TOY_ALREADY_KNOWN = 258, + SPELL_FAILED_SHIPMENTS_FULL = 259, + SPELL_FAILED_NO_SHIPMENTS_FOR_CONTAINER = 260, + SPELL_FAILED_NO_BUILDING_FOR_SHIPMENT = 261, + SPELL_FAILED_NOT_ENOUGH_SHIPMENTS_FOR_CONTAINER = 262, + SPELL_FAILED_HAS_MISSION = 263, + SPELL_FAILED_BUILDING_ACTIVATE_NOT_READY = 264, + SPELL_FAILED_NOT_SOULBOUND = 265, + SPELL_FAILED_RIDING_VEHICLE = 266, + SPELL_FAILED_VETERAN_TRIAL_ABOVE_SKILL_RANK_MAX = 267, + SPELL_FAILED_UNKNOWN = 268, + SPELL_CAST_OK = 0xFFFF // custom value, must not be sent to client }; enum SpellCustomErrors @@ -2103,10 +2103,12 @@ enum GameobjectTypes : uint8 // (6.0.3.19103) GAMEOBJECT_TYPE_PHASEABLE_MO = 43, GAMEOBJECT_TYPE_GARRISON_MONUMENT = 44, GAMEOBJECT_TYPE_GARRISON_SHIPMENT = 45, - GAMEOBJECT_TYPE_GARRISON_MONUMENT_PLAQUE = 46 + GAMEOBJECT_TYPE_GARRISON_MONUMENT_PLAQUE = 46, + GAMEOBJECT_TYPE_DO_NOT_USE_3 = 47, + GAMEOBJECT_TYPE_UI_LINK = 48 }; -#define MAX_GAMEOBJECT_TYPE 47 // sending to client this or greater value can crash client. +#define MAX_GAMEOBJECT_TYPE 49 // sending to client this or greater value can crash client. #define MAX_GAMEOBJECT_DATA 33 // Max number of uint32 vars in gameobject_template data field enum GameObjectFlags @@ -4491,17 +4493,17 @@ enum ResponseCodes CHAR_CREATE_CHARACTER_GOLD_LIMIT = 68, CHAR_CREATE_FORCE_LOGIN = 69, CHAR_CREATE_TRIAL = 70, - CHAR_CREATE_VETERAN = 71, - - CHAR_DELETE_IN_PROGRESS = 72, - CHAR_DELETE_SUCCESS = 73, - CHAR_DELETE_FAILED = 74, - CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 75, - CHAR_DELETE_FAILED_GUILD_LEADER = 76, - CHAR_DELETE_FAILED_ARENA_CAPTAIN = 77, - CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 78, - CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 79, - CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 80, + + CHAR_DELETE_IN_PROGRESS = 71, + CHAR_DELETE_SUCCESS = 72, + CHAR_DELETE_FAILED = 73, + CHAR_DELETE_FAILED_LOCKED_FOR_TRANSFER = 74, + CHAR_DELETE_FAILED_GUILD_LEADER = 75, + CHAR_DELETE_FAILED_ARENA_CAPTAIN = 76, + CHAR_DELETE_FAILED_HAS_HEIRLOOM_OR_MAIL = 77, + CHAR_DELETE_FAILED_UPGRADE_IN_PROGRESS = 78, + CHAR_DELETE_FAILED_HAS_WOW_TOKEN = 79, + CHAR_DELETE_FAILED_VAS_TRANSACTION_IN_PROGRESS = 80, CHAR_LOGIN_IN_PROGRESS = 81, CHAR_LOGIN_SUCCESS = 82, @@ -4517,24 +4519,25 @@ enum ResponseCodes CHAR_LOGIN_TEMPORARY_GM_LOCK = 92, CHAR_LOGIN_LOCKED_BY_CHARACTER_UPGRADE = 93, CHAR_LOGIN_LOCKED_BY_REVOKED_CHARACTER_UPGRADE = 94, - - CHAR_NAME_SUCCESS = 95, - CHAR_NAME_FAILURE = 96, - CHAR_NAME_NO_NAME = 97, - CHAR_NAME_TOO_SHORT = 98, - CHAR_NAME_TOO_LONG = 99, - CHAR_NAME_INVALID_CHARACTER = 100, - CHAR_NAME_MIXED_LANGUAGES = 101, - CHAR_NAME_PROFANE = 102, - CHAR_NAME_RESERVED = 103, - CHAR_NAME_INVALID_APOSTROPHE = 104, - CHAR_NAME_MULTIPLE_APOSTROPHES = 105, - CHAR_NAME_THREE_CONSECUTIVE = 106, - CHAR_NAME_INVALID_SPACE = 107, - CHAR_NAME_CONSECUTIVE_SPACES = 108, - CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 109, - CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 110, - CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 111 + CHAR_LOGIN_LOCKED_BY_REVOKED_VAS_TRANSACTION = 95, + + CHAR_NAME_SUCCESS = 96, + CHAR_NAME_FAILURE = 97, + CHAR_NAME_NO_NAME = 98, + CHAR_NAME_TOO_SHORT = 99, + CHAR_NAME_TOO_LONG = 100, + CHAR_NAME_INVALID_CHARACTER = 101, + CHAR_NAME_MIXED_LANGUAGES = 102, + CHAR_NAME_PROFANE = 103, + CHAR_NAME_RESERVED = 104, + CHAR_NAME_INVALID_APOSTROPHE = 105, + CHAR_NAME_MULTIPLE_APOSTROPHES = 106, + CHAR_NAME_THREE_CONSECUTIVE = 107, + CHAR_NAME_INVALID_SPACE = 108, + CHAR_NAME_CONSECUTIVE_SPACES = 109, + CHAR_NAME_RUSSIAN_CONSECUTIVE_SILENT_CHARACTERS = 110, + CHAR_NAME_RUSSIAN_SILENT_CHARACTER_AT_BEGINNING_OR_END = 111, + CHAR_NAME_DECLENSION_DOESNT_MATCH_BASE_NAME = 112 }; enum CharacterUndeleteResult diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index 0e436715622..66034e75fc3 100644 --- a/src/server/game/Movement/PathGenerator.cpp +++ b/src/server/game/Movement/PathGenerator.cpp @@ -117,7 +117,7 @@ dtPolyRef PathGenerator::GetPathPolyByPosition(dtPolyRef const* polyPath, uint32 } if (distance) - *distance = dtSqrt(minDist3d); + *distance = dtMathSqrtf(minDist3d); return (minDist2d < 3.0f) ? nearestPoly : INVALID_POLYREF; } @@ -800,7 +800,7 @@ dtStatus PathGenerator::FindSmoothPath(float const* startPos, float const* endPo // Find movement delta. float delta[VERTEX_SIZE]; dtVsub(delta, steerPos, iterPos); - float len = dtSqrt(dtVdot(delta, delta)); + float len = dtMathSqrtf(dtVdot(delta, delta)); // If the steer target is end of path or off-mesh link, do not move past the location. if ((endOfPath || offMeshConnection) && len < SMOOTH_PATH_STEP_SIZE) len = 1.0f; diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index 117891140da..d91dc2bc469 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -26,6 +26,7 @@ #include "GridNotifiers.h" #include "GridNotifiersImpl.h" #include "CellImpl.h" +#include "Packets/ChatPackets.h" class DefenseMessageBuilder { @@ -33,14 +34,14 @@ class DefenseMessageBuilder DefenseMessageBuilder(uint32 zoneId, uint32 id) : _zoneId(zoneId), _id(id) { } - void operator()(WorldPacket& data, LocaleConstant locale) const + WorldPackets::Chat::DefenseMessage* operator()(LocaleConstant locale) const { std::string text = sOutdoorPvPMgr->GetDefenseMessage(_zoneId, _id, locale); - data.Initialize(SMSG_DEFENSE_MESSAGE, 4 + 4 + text.length()); - data.append<uint32>(_zoneId); - data.append<uint32>(text.length()); - data << text; + WorldPackets::Chat::DefenseMessage* defenseMessage = new WorldPackets::Chat::DefenseMessage(); + defenseMessage->ZoneID = _zoneId; + defenseMessage->MessageText = text; + return defenseMessage; } private: diff --git a/src/server/game/Quests/QuestDef.cpp b/src/server/game/Quests/QuestDef.cpp index 148cdeab68e..c1098b4cf52 100644 --- a/src/server/game/Quests/QuestDef.cpp +++ b/src/server/game/Quests/QuestDef.cpp @@ -37,7 +37,7 @@ Quest::Quest(Field* questRecord) RewardXPMultiplier = questRecord[10].GetFloat(); RewardMoney = questRecord[11].GetUInt32(); RewardMoneyDifficulty = questRecord[12].GetUInt32(); - Float13 = questRecord[13].GetFloat(); + RewardMoneyMultiplier = questRecord[13].GetFloat(); RewardBonusMoney = questRecord[14].GetUInt32(); RewardDisplaySpell = questRecord[15].GetUInt32(); RewardSpell = questRecord[16].GetUInt32(); @@ -241,10 +241,12 @@ uint32 Quest::XPValue(uint32 playerLevel) const return 0; } -uint32 Quest::GetRewMoney() const +uint32 Quest::MoneyValue(uint8 playerLevel) const { - if (RewardMoney > 0) - return RewardMoney * sWorld->getRate(RATE_MONEY_QUEST); + uint8 level = Level == -1 ? playerLevel : Level; + + if (QuestMoneyRewardEntry const* money = sQuestMoneyRewardStore.LookupEntry(level)) + return money->Money[GetRewMoneyDifficulty()] * GetMoneyMultiplier(); else return 0; } @@ -253,7 +255,7 @@ void Quest::BuildQuestRewards(WorldPackets::Quest::QuestRewards& rewards, Player { rewards.ChoiceItemCount = GetRewChoiceItemsCount(); rewards.ItemCount = GetRewItemsCount(); - rewards.Money = GetRewMoney(); + rewards.Money = player->GetQuestMoneyReward(this); rewards.XP = player->GetQuestXPReward(this); rewards.Title = GetRewTitle(); rewards.Talents = GetBonusTalents(); diff --git a/src/server/game/Quests/QuestDef.h b/src/server/game/Quests/QuestDef.h index e11794dc64c..a2a61cc5da0 100644 --- a/src/server/game/Quests/QuestDef.h +++ b/src/server/game/Quests/QuestDef.h @@ -286,6 +286,7 @@ class Quest void LoadQuestObjectiveVisualEffect(Field* fields); uint32 XPValue(uint32 playerLevel) const; + uint32 MoneyValue(uint8 playerLevel) const; bool HasFlag(uint32 flag) const { return (Flags & flag) != 0; } void SetFlag(uint32 flag) { Flags |= flag; } @@ -320,6 +321,7 @@ class Quest int32 GetRewArenaPoints() const {return RewardArenaPoints; } uint32 GetXPDifficulty() const { return RewardXPDifficulty; } float GetXPMultiplier() const { return RewardXPMultiplier; } + float GetMoneyMultiplier() const { return RewardMoneyMultiplier; } uint32 GetSrcItemId() const { return SourceItemId; } uint32 GetSrcItemCount() const { return SourceItemIdCount; } uint32 GetSrcSpell() const { return SourceSpellID; } @@ -335,7 +337,6 @@ class Quest std::string const& GetPortraitTurnInText() const { return PortraitTurnInText; } std::string const& GetPortraitTurnInName() const { return PortraitTurnInName; } QuestObjectives const& GetObjectives() const { return Objectives; } - uint32 GetRewMoney() const; uint32 GetRewMoneyDifficulty() const { return RewardMoneyDifficulty; } uint32 GetRewHonor() const { return RewardHonor; } uint32 GetRewKillHonor() const { return RewardKillHonor; } @@ -406,7 +407,7 @@ class Quest float RewardXPMultiplier; int32 RewardMoney; uint32 RewardMoneyDifficulty; - float Float13; + float RewardMoneyMultiplier; uint32 RewardBonusMoney; uint32 RewardDisplaySpell; uint32 RewardSpell; diff --git a/src/server/game/Scripting/MapScripts.cpp b/src/server/game/Scripting/MapScripts.cpp index deae263e5f8..225ab7386c6 100644 --- a/src/server/game/Scripting/MapScripts.cpp +++ b/src/server/game/Scripting/MapScripts.cpp @@ -283,18 +283,11 @@ inline void Map::_ScriptProcessDoor(Object* source, Object* target, const Script inline GameObject* Map::_FindGameObject(WorldObject* searchObject, ObjectGuid::LowType guid) const { - GameObject* gameobject = NULL; + auto bounds = searchObject->GetMap()->GetGameObjectBySpawnIdStore().equal_range(guid); + if (bounds.first == bounds.second) + return nullptr; - CellCoord p(Trinity::ComputeCellCoord(searchObject->GetPositionX(), searchObject->GetPositionY())); - Cell cell(p); - - Trinity::GameObjectWithDbGUIDCheck goCheck(*searchObject, guid); - Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck> checker(searchObject, gameobject, goCheck); - - TypeContainerVisitor<Trinity::GameObjectSearcher<Trinity::GameObjectWithDbGUIDCheck>, GridTypeMapContainer > objectChecker(checker); - cell.Visit(p, objectChecker, *searchObject->GetMap(), *searchObject, searchObject->GetGridActivationRange()); - - return gameobject; + return bounds.first->second; } /// Process queued scripts @@ -806,26 +799,16 @@ void Map::ScriptsProcess() } Creature* cTarget = NULL; - WorldObject* wSource = dynamic_cast <WorldObject*> (source); - if (wSource) //using grid searcher + auto creatureBounds = _creatureBySpawnIdStore.equal_range(step.script->CallScript.CreatureEntry); + if (creatureBounds.first != creatureBounds.second) { - CellCoord p(Trinity::ComputeCellCoord(wSource->GetPositionX(), wSource->GetPositionY())); - Cell cell(p); - - Trinity::CreatureWithDbGUIDCheck target_check(wSource, uint64(step.script->CallScript.CreatureEntry)); - Trinity::CreatureSearcher<Trinity::CreatureWithDbGUIDCheck> checker(wSource, cTarget, target_check); - - TypeContainerVisitor<Trinity::CreatureSearcher <Trinity::CreatureWithDbGUIDCheck>, GridTypeMapContainer > unit_checker(checker); - cell.Visit(p, unit_checker, *wSource->GetMap(), *wSource, wSource->GetGridActivationRange()); - } - else //check hashmap holders - { - if (sObjectMgr->GetCreatureData(step.script->CallScript.CreatureEntry)) + // Prefer alive (last respawned) creature + auto creatureItr = std::find_if(creatureBounds.first, creatureBounds.second, [](Map::CreatureBySpawnIdContainer::value_type const& pair) { - auto creatureBounds = _creatureBySpawnIdStore.equal_range(step.script->CallScript.CreatureEntry); - if (creatureBounds.first != creatureBounds.second) - cTarget = creatureBounds.first->second; - } + return pair.second->IsAlive(); + }); + + cTarget = creatureItr != creatureBounds.second ? creatureItr->second : creatureBounds.first->second; } if (!cTarget) diff --git a/src/server/game/Scripting/ScriptLoader.cpp b/src/server/game/Scripting/ScriptLoader.cpp index 553c752ccce..aa8be4946e4 100644 --- a/src/server/game/Scripting/ScriptLoader.cpp +++ b/src/server/game/Scripting/ScriptLoader.cpp @@ -634,6 +634,7 @@ void AddSC_instance_magtheridons_lair(); void AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls void AddSC_boss_warbringer_omrogg(); void AddSC_boss_warchief_kargath_bladefist(); +void AddSC_shattered_halls(); void AddSC_instance_shattered_halls(); void AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts void AddSC_boss_omor_the_unscarred(); @@ -1188,6 +1189,7 @@ void AddOutlandScripts() AddSC_boss_grand_warlock_nethekurse(); //HC Shattered Halls AddSC_boss_warbringer_omrogg(); AddSC_boss_warchief_kargath_bladefist(); + AddSC_shattered_halls(); AddSC_instance_shattered_halls(); AddSC_boss_watchkeeper_gargolmar(); //HC Ramparts AddSC_boss_omor_the_unscarred(); diff --git a/src/server/game/Server/Packet.h b/src/server/game/Server/Packet.h index 85d65e967be..89435db31e3 100644 --- a/src/server/game/Server/Packet.h +++ b/src/server/game/Server/Packet.h @@ -35,6 +35,7 @@ namespace WorldPackets virtual WorldPacket const* Write() = 0; virtual void Read() = 0; + WorldPacket const* GetRawPacket() const { return &_worldPacket; } size_t GetSize() const { return _worldPacket.size(); } ConnectionType GetConnection() const { return _worldPacket.GetConnection(); } diff --git a/src/server/game/Server/Packets/AuthenticationPackets.cpp b/src/server/game/Server/Packets/AuthenticationPackets.cpp index 40af397e110..74f558baa73 100644 --- a/src/server/game/Server/Packets/AuthenticationPackets.cpp +++ b/src/server/game/Server/Packets/AuthenticationPackets.cpp @@ -318,258 +318,258 @@ WorldPacket const* WorldPackets::Auth::ConnectTo::Write() uint8* hmac = hmacHash.GetDigest(); - payload << uint8((port >> 8) & 0xFF); - payload << uint8(PiDigits[59]); - payload << uint8(address[4]); - payload << uint8(PiDigits[18]); - payload << uint8(PiDigits[50]); - payload << uint8(PiDigits[95]); - payload << uint8(PiDigits[101]); - payload << uint8(Payload.PanamaKey[9]); - payload << uint8(PiDigits[70]); - payload << uint8(PiDigits[56]); - payload << uint8(PiDigits[28]); - payload << uint8(Haiku[63]); - payload << uint8(Haiku[30]); - payload << uint8(PiDigits[42]); - payload << uint8(PiDigits[93]); - payload << uint8(address[15]); - payload << uint8(PiDigits[2]); - payload << uint8(PiDigits[1]); + payload << uint8(PiDigits[31]); + payload << uint8(Haiku[24]); + payload << uint8(address[2]); payload << uint8(address[1]); - payload << uint8(PiDigits[94]); - payload << uint8(PiDigits[26]); + payload << uint8(PiDigits[90]); + payload << uint8(Haiku[28]); + payload << uint8(PiDigits[89]); + payload << uint8(PiDigits[68]); payload << uint8(PiDigits[39]); - payload << uint8(Haiku[19]); - payload << uint8(PiDigits[46]); - payload << uint8(PiDigits[13]); - payload << uint8(Haiku[70]); - payload << uint8(Haiku[45]); - payload << uint8(PiDigits[7]); - payload << uint8(Haiku[50]); - payload << uint8(Payload.PanamaKey[0]); - payload << uint8(address[10]); - payload << uint8(Payload.PanamaKey[27]); - payload << uint8(Payload.PanamaKey[21]); - payload << uint8(hmac[2]); - payload << uint8(PiDigits[37]); - payload << uint8(Haiku[61]); - payload << uint8(PiDigits[83]); - payload << uint8(PiDigits[47]); - payload << uint8(Haiku[37]); - payload << uint8(Haiku[46]); + payload << uint8(Payload.PanamaKey[3]); + payload << uint8(PiDigits[64]); + payload << uint8(Payload.PanamaKey[31]); payload << uint8(PiDigits[73]); - payload << uint8(Payload.PanamaKey[30]); - payload << uint8(address[9]); - payload << uint8(address[11]); - payload << uint8(PiDigits[20]); + payload << uint8(Payload.PanamaKey[17]); + payload << uint8(hmac[8]); + payload << uint8(Haiku[58]); + payload << uint8(Haiku[16]); + payload << uint8(PiDigits[36]); + payload << uint8(PiDigits[23]); + payload << uint8(PiDigits[84]); + payload << uint8(PiDigits[91]); + payload << uint8(Haiku[42]); + payload << uint8(Haiku[46]); + payload << uint8(PiDigits[81]); + payload << uint8(hmac[5]); + payload << uint8(Haiku[35]); + payload << uint8(Haiku[3]); payload << uint8(Haiku[54]); - payload << uint8(Payload.PanamaKey[23]); - payload << uint8(PiDigits[38]); - payload << uint8(hmac[1]); - payload << uint8(address[8]); - payload << uint8(PiDigits[43]); - payload << uint8(Payload.PanamaKey[15]); - payload << uint8(PiDigits[97]); - payload << uint8(Haiku[55]); + payload << uint8(PiDigits[9]); + payload << uint8(PiDigits[26]); + payload << uint8(Haiku[20]); + payload << uint8(Haiku[53]); + payload << uint8(Payload.PanamaKey[2]); + payload << uint8(PiDigits[42]); + payload << uint8(PiDigits[99]); + payload << uint8(address[13]); + payload << uint8(PiDigits[59]); + payload << uint8(PiDigits[18]); + payload << uint8(PiDigits[44]); + payload << uint8(PiDigits[49]); + payload << uint8(address[4]); + payload << uint8(PiDigits[106]); payload << uint8(Payload.PanamaKey[24]); - payload << uint8(PiDigits[36]); - payload << uint8(Haiku[48]); + payload << uint8(PiDigits[107]); + payload << uint8(Payload.PanamaKey[4]); + payload << uint8(Haiku[0]); + payload << uint8(Haiku[7]); + payload << uint8(PiDigits[74]); + payload << uint8(PiDigits[85]); + payload << uint8(hmac[2]); + payload << uint8(Haiku[51]); + payload << uint8(PiDigits[22]); + payload << uint8(Payload.PanamaKey[8]); + payload << uint8(PiDigits[92]); + payload << uint8(Haiku[32]); payload << uint8(Haiku[41]); - payload << uint8(Haiku[22]); - payload << uint8(Payload.PanamaKey[18]); - payload << uint8(PiDigits[25]); - payload << uint8(Haiku[36]); + payload << uint32(Payload.Adler32); payload << uint8(PiDigits[52]); - payload << uint8(Haiku[53]); - payload << uint8(Haiku[15]); - payload << uint8(PiDigits[87]); - payload << uint8(PiDigits[21]); - payload << uint8(Payload.XorMagic); - payload << uint8(Payload.PanamaKey[1]); - payload << uint8(Haiku[44]); - payload << uint8(Payload.PanamaKey[16]); - payload << uint8(PiDigits[80]); - payload << uint8(address[12]); - payload << uint8(PiDigits[81]); - payload << uint8(Haiku[69]); + payload << uint8(Haiku[9]); payload << uint8(PiDigits[61]); - payload << uint8(PiDigits[69]); - payload << uint8(PiDigits[96]); - payload << uint8(Haiku[68]); - payload << uint8(Haiku[18]); - payload << uint8(PiDigits[41]); - payload << uint8(Haiku[56]); - payload << uint8(PiDigits[74]); - payload << uint8(Payload.PanamaKey[7]); - payload << uint8(Haiku[20]); - payload << uint8(PiDigits[3]); - payload << uint8(hmac[4]); - payload << uint8(Payload.PanamaKey[26]); - payload << uint8(Haiku[14]); - payload << uint8(Payload.PanamaKey[6]); - payload << uint8(Payload.PanamaKey[5]); - payload << uint8(PiDigits[89]); + payload << uint8(PiDigits[5]); + payload << uint8(hmac[0]); + payload << uint8(hmac[7]); + payload << uint8(PiDigits[83]); + payload << uint8(hmac[10]); payload << uint8(hmac[3]); - payload << uint8(PiDigits[60]); + payload << uint8(PiDigits[34]); + payload << uint8(address[8]); + payload << uint8(PiDigits[15]); + payload << uint8(Haiku[39]); + payload << uint8(PiDigits[103]); + payload << uint8(hmac[15]); + payload << uint8(Haiku[11]); payload << uint8(PiDigits[54]); - payload << uint8(PiDigits[67]); + payload << uint8(Haiku[68]); + payload << uint8(PiDigits[4]); + payload << uint8(Haiku[2]); + payload << uint8(addressType); payload << uint8(Haiku[52]); - payload << uint8(PiDigits[32]); - payload << uint8(Haiku[29]); - payload << uint8(address[2]); - payload << uint8(PiDigits[44]); - payload << uint8(PiDigits[78]); - payload << uint8(Haiku[65]); - payload << uint8(PiDigits[51]); - payload << uint8(PiDigits[72]); - payload << uint8(PiDigits[53]); - payload << uint8(Haiku[49]); - payload << uint8(PiDigits[6]); - payload << uint8(Haiku[33]); - payload << uint8(Haiku[28]); - payload << uint8(Haiku[0]); - payload << uint8(Payload.PanamaKey[20]); - payload << uint8(PiDigits[75]); + payload << uint8(PiDigits[105]); + payload << uint8(Payload.PanamaKey[21]); + payload << uint8(Payload.XorMagic); + payload << uint8(hmac[1]); + payload << uint8(PiDigits[30]); + payload << uint8(PiDigits[2]); + payload << uint8(PiDigits[101]); + payload << uint8(PiDigits[8]); + payload << uint8(address[10]); + payload << uint8(Payload.PanamaKey[27]); + payload << uint8(hmac[16]); + payload << uint8(Payload.PanamaKey[6]); + payload << uint8(PiDigits[98]); + payload << uint8(PiDigits[104]); + payload << uint8((port >> 8) & 0xFF); payload << uint8(address[6]); - payload << uint8(PiDigits[86]); - payload << uint8(Haiku[60]); + payload << uint8(Payload.PanamaKey[12]); + payload << uint8(PiDigits[50]); + payload << uint8(Haiku[19]); + payload << uint8(PiDigits[1]); + payload << uint8(PiDigits[82]); + payload << uint8(PiDigits[35]); + payload << uint8(PiDigits[14]); + payload << uint8(hmac[19]); + payload << uint8(PiDigits[40]); + payload << uint8(PiDigits[62]); + payload << uint8(PiDigits[72]); + payload << uint8(PiDigits[80]); + payload << uint8(Haiku[31]); + payload << uint8(PiDigits[47]); + payload << uint8(PiDigits[60]); + payload << uint8(PiDigits[19]); + payload << uint8(Payload.PanamaKey[14]); + payload << uint8(PiDigits[67]); + payload << uint8(Payload.PanamaKey[13]); + payload << uint8(Payload.PanamaKey[18]); + payload << uint8(PiDigits[16]); + payload << uint8(address[12]); + payload << uint8(port & 0xFF); + payload << uint8(Haiku[36]); + payload << uint8(Haiku[44]); + payload << uint8(PiDigits[77]); + payload << uint8(Haiku[61]); + payload << uint8(PiDigits[20]); + payload << uint8(PiDigits[0]); payload << uint8(hmac[12]); - payload << uint8(Haiku[35]); - payload << uint8(PiDigits[45]); - payload << uint8(Haiku[67]); - payload << uint8(Haiku[26]); + payload << uint8(PiDigits[12]); + payload << uint8(address[9]); + payload << uint8(PiDigits[100]); + payload << uint8(hmac[11]); + payload << uint8(hmac[13]); + payload << uint8(Haiku[37]); + payload << uint8(Haiku[70]); + payload << uint8(Haiku[63]); + payload << uint8(PiDigits[93]); + payload << uint8(Haiku[18]); + payload << uint8(Haiku[15]); + payload << uint8(Payload.PanamaKey[28]); + payload << uint8(Haiku[23]); + payload << uint8(hmac[17]); + payload << uint8(PiDigits[65]); + payload << uint8(PiDigits[27]); payload << uint8(PiDigits[57]); - payload << uint8(PiDigits[90]); + payload << uint8(address[11]); + payload << uint8(PiDigits[17]); + payload << uint8(Payload.PanamaKey[20]); + payload << uint8(Haiku[64]); + payload << uint8(Payload.PanamaKey[5]); + payload << uint8(PiDigits[41]); + payload << uint8(PiDigits[25]); + payload << uint8(address[5]); + payload << uint8(PiDigits[37]); + payload << uint8(PiDigits[46]); + payload << uint8(Haiku[65]); + payload << uint8(Haiku[12]); + payload << uint8(PiDigits[95]); + payload << uint8(PiDigits[96]); + payload << uint8(PiDigits[94]); + payload << uint8(Haiku[43]); + payload << uint8(PiDigits[10]); + payload << uint8(PiDigits[86]); + payload << uint8(Haiku[10]); + payload << uint8(Payload.PanamaKey[15]); + payload << uint8(PiDigits[75]); payload << uint8(Haiku[5]); - payload << uint8(Haiku[13]); - payload << uint8(Haiku[8]); + payload << uint8(Haiku[25]); + payload << uint8(PiDigits[33]); + payload << uint8(Haiku[6]); + payload << uint8(Payload.PanamaKey[30]); + payload << uint8(hmac[6]); + payload << uint8(Haiku[59]); + payload << uint8(PiDigits[45]); + payload << uint8(Haiku[57]); + payload << uint8(Haiku[29]); + payload << uint8(Haiku[14]); + payload << uint8(Haiku[30]); + payload << uint8(PiDigits[66]); + payload << uint8(PiDigits[3]); + payload << uint8(hmac[18]); payload << uint8(Haiku[17]); - payload << uint8(Payload.PanamaKey[10]); - payload << uint8(PiDigits[104]); - payload << uint8(address[0]); - payload << uint8(PiDigits[15]); - payload << uint8(hmac[19]); - payload << uint8(PiDigits[8]); - payload << uint8(PiDigits[64]); - payload << uint8(PiDigits[27]); - payload << uint8(Haiku[7]); - payload << uint8(hmac[10]); - payload << uint8(hmac[14]); - payload << uint8(Haiku[10]); - payload << uint8(Haiku[2]); + payload << uint8(PiDigits[21]); + payload << uint8(Haiku[4]); + payload << uint8(Haiku[26]); + payload << uint8(Haiku[45]); payload << uint8(address[14]); - payload << uint8(Haiku[21]); - payload << uint32(Payload.Adler32); - payload << uint8(Payload.PanamaKey[14]); - payload << uint8(Haiku[39]); - payload << uint8(Payload.PanamaKey[19]); - payload << uint8(PiDigits[16]); - payload << uint8(PiDigits[91]); - payload << uint8(hmac[6]); - payload << uint8(addressType); - payload << uint8(hmac[16]); + payload << uint8(PiDigits[69]); + payload << uint8(PiDigits[38]); + payload << uint8(Haiku[38]); payload << uint8(PiDigits[63]); - payload << uint8(PiDigits[12]); - payload << uint8(PiDigits[102]); - payload << uint8(PiDigits[62]); - payload << uint8(PiDigits[22]); - payload << uint8(Haiku[32]); - payload << uint8(PiDigits[14]); - payload << uint8(PiDigits[30]); - payload << uint8(Haiku[16]); + payload << uint8(PiDigits[6]); + payload << uint8(Haiku[62]); + payload << uint8(Haiku[55]); + payload << uint8(Haiku[60]); + payload << uint8(address[15]); + payload << uint8(PiDigits[97]); + payload << uint8(PiDigits[87]); + payload << uint8(PiDigits[78]); + payload << uint8(Haiku[34]); + payload << uint8(hmac[14]); + payload << uint8(PiDigits[88]); + payload << uint8(Payload.PanamaKey[7]); + payload << uint8(hmac[4]); + payload << uint8(Haiku[8]); + payload << uint8(Payload.PanamaKey[29]); + payload << uint8(PiDigits[24]); + payload << uint8(Payload.PanamaKey[1]); + payload << uint8(Haiku[69]); payload << uint8(Haiku[47]); - payload << uint8(Haiku[9]); - payload << uint8(PiDigits[34]); - payload << uint8(Payload.PanamaKey[4]); - payload << uint8(PiDigits[29]); - payload << uint8(PiDigits[76]); + payload << uint8(hmac[9]); + payload << uint8(Payload.PanamaKey[26]); payload << uint8(Haiku[40]); - payload << uint8(Haiku[59]); - payload << uint8(PiDigits[5]); - payload << uint8(PiDigits[31]); - payload << uint8(Haiku[43]); - payload << uint8(Haiku[3]); - payload << uint8(PiDigits[0]); - payload << uint8(PiDigits[49]); - payload << uint8(Haiku[24]); - payload << uint8(Payload.PanamaKey[17]); - payload << uint8(Haiku[62]); - payload << uint8(Payload.PanamaKey[13]); - payload << uint8(hmac[5]); + payload << uint8(Haiku[48]); + payload << uint8(PiDigits[28]); + payload << uint8(Haiku[50]); + payload << uint8(Payload.PanamaKey[25]); + payload << uint8(PiDigits[102]); + payload << uint8(PiDigits[53]); + payload << uint8(Haiku[56]); + payload << uint8(PiDigits[56]); + payload << uint8(PiDigits[32]); + payload << uint8(PiDigits[79]); + payload << uint8(Payload.PanamaKey[0]); + payload << uint8(Payload.PanamaKey[10]); + payload << uint8(Haiku[21]); payload << uint8(Haiku[27]); - payload << uint8(hmac[13]); - payload << uint8(address[5]); - payload << uint8(Payload.PanamaKey[3]); + payload << uint8(PiDigits[7]); + payload << uint8(PiDigits[48]); + payload << uint8(Payload.PanamaKey[22]); + payload << uint8(Payload.PanamaKey[11]); + payload << uint8(PiDigits[43]); + payload << uint8(address[0]); + payload << uint8(Payload.PanamaKey[23]); + payload << uint8(PiDigits[70]); + payload << uint8(Payload.PanamaKey[19]); + payload << uint8(PiDigits[29]); payload << uint8(PiDigits[71]); - payload << uint8(Haiku[38]); - payload << uint8(PiDigits[98]); - payload << uint8(PiDigits[100]); - payload << uint8(PiDigits[66]); - payload << uint8(Haiku[6]); - payload << uint8(PiDigits[40]); - payload << uint8(Haiku[31]); - payload << uint8(PiDigits[17]); - payload << uint8(PiDigits[92]); - payload << uint8(address[3]); - payload << uint8(Payload.PanamaKey[8]); - payload << uint8(PiDigits[88]); - payload << uint8(PiDigits[65]); - payload << uint8(Payload.PanamaKey[31]); - payload << uint8(PiDigits[58]); - payload << uint8(Payload.PanamaKey[2]); - payload << uint8(PiDigits[79]); - payload << uint8(Haiku[66]); - payload << uint8(PiDigits[24]); - payload << uint8(Haiku[34]); - payload << uint8(PiDigits[77]); - payload << uint8(Haiku[58]); - payload << uint8(Haiku[1]); - payload << uint8(PiDigits[10]); - payload << uint8(PiDigits[107]); payload << uint8(PiDigits[55]); - payload << uint8(Haiku[12]); - payload << uint8(PiDigits[106]); - payload << uint8(hmac[8]); - payload << uint8(PiDigits[105]); - payload << uint8(Payload.PanamaKey[12]); - payload << uint8(PiDigits[4]); + payload << uint8(Haiku[49]); + payload << uint8(Haiku[33]); + payload << uint8(Haiku[66]); + payload << uint8(Payload.PanamaKey[16]); payload << uint8(PiDigits[11]); - payload << uint8(PiDigits[99]); - payload << uint8(Haiku[23]); - payload << uint8(Haiku[42]); - payload << uint8(Haiku[4]); - payload << uint8(PiDigits[19]); - payload << uint8(PiDigits[48]); - payload << uint8(PiDigits[85]); - payload << uint8(hmac[15]); - payload << uint8(PiDigits[82]); - payload << uint8(PiDigits[103]); - payload << uint8(address[13]); - payload << uint8(PiDigits[23]); - payload << uint8(Haiku[64]); - payload << uint8(Haiku[11]); - payload << uint8(hmac[11]); - payload << uint8(hmac[0]); - payload << uint8(PiDigits[68]); - payload << uint8(Haiku[57]); - payload << uint8(hmac[18]); - payload << uint8(PiDigits[9]); - payload << uint8(hmac[9]); - payload << uint8(hmac[7]); - payload << uint8(Payload.PanamaKey[29]); - payload << uint8(Haiku[51]); - payload << uint8(Payload.PanamaKey[11]); - payload << uint8(Haiku[25]); - payload << uint8(Payload.PanamaKey[22]); + payload << uint8(PiDigits[13]); + payload << uint8(PiDigits[51]); + payload << uint8(Haiku[13]); + payload << uint8(Haiku[67]); + payload << uint8(Haiku[22]); + payload << uint8(PiDigits[58]); + payload << uint8(Haiku[1]); payload << uint8(address[7]); - payload << uint8(hmac[17]); - payload << uint8(PiDigits[35]); - payload << uint8(PiDigits[84]); - payload << uint8(PiDigits[33]); - payload << uint8(Payload.PanamaKey[25]); - payload << uint8(port & 0xFF); - payload << uint8(Payload.PanamaKey[28]); + payload << uint8(address[3]); + payload << uint8(PiDigits[76]); + payload << uint8(Payload.PanamaKey[9]); BigNumber bnData; bnData.SetBinary(payload.contents(), payload.size()); diff --git a/src/server/game/Server/Packets/ChannelPackets.cpp b/src/server/game/Server/Packets/ChannelPackets.cpp index c8779052c95..cc6406b81bc 100644 --- a/src/server/game/Server/Packets/ChannelPackets.cpp +++ b/src/server/game/Server/Packets/ChannelPackets.cpp @@ -86,7 +86,7 @@ WorldPacket const* WorldPackets::Channel::ChannelNotifyLeft::Write() WorldPacket const* WorldPackets::Channel::UserlistAdd::Write() { _worldPacket << AddedUserGUID; - _worldPacket << uint8(ChannelFlags); + _worldPacket << uint8(_ChannelFlags); _worldPacket << uint8(UserFlags); _worldPacket << uint32(ChannelID); @@ -101,7 +101,7 @@ WorldPacket const* WorldPackets::Channel::UserlistRemove::Write() { _worldPacket << RemovedUserGUID; - _worldPacket << uint8(ChannelFlags); + _worldPacket << uint8(_ChannelFlags); _worldPacket << uint32(ChannelID); @@ -115,7 +115,7 @@ WorldPacket const* WorldPackets::Channel::UserlistUpdate::Write() { _worldPacket << UpdatedUserGUID; - _worldPacket << uint8(ChannelFlags); + _worldPacket << uint8(_ChannelFlags); _worldPacket << uint8(UserFlags); _worldPacket << uint32(ChannelID); diff --git a/src/server/game/Server/Packets/ChannelPackets.h b/src/server/game/Server/Packets/ChannelPackets.h index 8dba1e84677..7464e9bd391 100644 --- a/src/server/game/Server/Packets/ChannelPackets.h +++ b/src/server/game/Server/Packets/ChannelPackets.h @@ -104,7 +104,7 @@ namespace WorldPackets ObjectGuid AddedUserGUID; - uint8 ChannelFlags = CHANNEL_FLAG_NONE; + uint8 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags uint8 UserFlags = MEMBER_FLAG_NONE; int32 ChannelID = 0; @@ -121,7 +121,7 @@ namespace WorldPackets ObjectGuid RemovedUserGUID; - uint8 ChannelFlags = CHANNEL_FLAG_NONE; + uint8 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags uint32 ChannelID = 0; @@ -137,7 +137,7 @@ namespace WorldPackets ObjectGuid UpdatedUserGUID; - uint8 ChannelFlags = CHANNEL_FLAG_NONE; + uint8 _ChannelFlags = CHANNEL_FLAG_NONE; ///< @see enum ChannelFlags uint8 UserFlags = MEMBER_FLAG_NONE; int32 ChannelID = 0; diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index a48639f1b03..9c6bb07f56e 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -498,3 +498,40 @@ WorldPacket const* WorldPackets::Character::SetFactionVisible::Write() _worldPacket << FactionIndex; return &_worldPacket; } + +WorldPackets::Character::CharCustomizeResponse::CharCustomizeResponse(WorldPackets::Character::CharCustomizeInfo const* info) + : ServerPacket(SMSG_CHAR_CUSTOMIZE, 16 + 1 + 1 + 1 + 1 + 1 + 1 + 1) +{ + CharGUID = info->CharGUID; + SexID = info->SexID; + SkinID = info->SkinID; + HairColorID = info->HairColorID; + HairStyleID = info->HairStyleID; + FacialHairStyleID = info->FacialHairStyleID; + FaceID = info->FaceID; + CharName = info->CharName; +} + +WorldPacket const* WorldPackets::Character::CharCustomizeResponse::Write() +{ + _worldPacket << CharGUID; + _worldPacket << uint8(SexID); + _worldPacket << uint8(SkinID); + _worldPacket << uint8(HairColorID); + _worldPacket << uint8(HairStyleID); + _worldPacket << uint8(FacialHairStyleID); + _worldPacket << uint8(FaceID); + _worldPacket.WriteBits(CharName.length(), 6); + _worldPacket.FlushBits(); + _worldPacket.WriteString(CharName); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Character::CharCustomizeFailed::Write() +{ + _worldPacket << uint8(Result); + _worldPacket << CharGUID; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index cee4f5edb5c..10f1053f8ee 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -608,7 +608,7 @@ namespace WorldPackets WorldPacket const* Write() override; - BarberShopResult Result; + BarberShopResult Result = BARBER_SHOP_RESULT_SUCCESS; }; class LogXPGain final : public ServerPacket @@ -686,6 +686,35 @@ namespace WorldPackets uint32 FactionIndex = 0; }; + + class CharCustomizeResponse final : public ServerPacket + { + public: + CharCustomizeResponse() : ServerPacket(SMSG_CHAR_CUSTOMIZE, 16 + 1 + 1 + 1 + 1 + 1 + 1 + 1) { } + CharCustomizeResponse(CharCustomizeInfo const* customizeInfo); + + WorldPacket const* Write() override; + + ObjectGuid CharGUID; + std::string CharName; + uint8 SexID = 0; + uint8 SkinID = 0; + uint8 HairColorID = 0; + uint8 HairStyleID = 0; + uint8 FacialHairStyleID = 0; + uint8 FaceID = 0; + }; + + class CharCustomizeFailed final : public ServerPacket + { + public: + CharCustomizeFailed() : ServerPacket(SMSG_CHAR_CUSTOMIZE_FAILED, 1 + 16) { } + + WorldPacket const* Write() override; + + uint8 Result = 0; + ObjectGuid CharGUID; + }; } } diff --git a/src/server/game/Server/Packets/ChatPackets.cpp b/src/server/game/Server/Packets/ChatPackets.cpp index 4204278d514..726e1b87cc6 100644 --- a/src/server/game/Server/Packets/ChatPackets.cpp +++ b/src/server/game/Server/Packets/ChatPackets.cpp @@ -92,6 +92,15 @@ void WorldPackets::Chat::ChatMessageEmote::Read() Text = _worldPacket.ReadString(len); } +WorldPackets::Chat::Chat::Chat(Chat const& chat) : ServerPacket(SMSG_CHAT, chat._worldPacket.size()), + SlashCmd(chat.SlashCmd), _Language(chat._Language), SenderGUID(chat.SenderGUID), + SenderGuildGUID(chat.SenderGuildGUID), SenderAccountGUID(chat.SenderAccountGUID), TargetGUID(chat.TargetGUID), PartyGUID(chat.PartyGUID), + SenderVirtualAddress(chat.SenderVirtualAddress), TargetVirtualAddress(chat.TargetVirtualAddress), SenderName(chat.SenderName), TargetName(chat.TargetName), + Prefix(chat.Prefix), _Channel(chat._Channel), ChatText(chat.ChatText), AchievementID(chat.AchievementID), _ChatFlags(chat._ChatFlags), + DisplayTime(chat.DisplayTime), HideChatLog(chat.HideChatLog), FakeSenderName(chat.FakeSenderName) +{ +} + void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId /*= 0*/, std::string channelName /*= ""*/, LocaleConstant locale /*= DEFAULT_LOCALE*/, std::string addonPrefix /*= ""*/) { @@ -111,30 +120,10 @@ void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, W _Language = language; if (sender) - { - SenderGUID = sender->GetGUID(); - - if (Creature const* creatureSender = sender->ToCreature()) - SenderName = creatureSender->GetNameForLocaleIdx(locale); - - if (Player const* playerSender = sender->ToPlayer()) - { - SenderAccountGUID = playerSender->GetSession()->GetAccountGUID(); - _ChatFlags = playerSender->GetChatFlags(); - - SenderGuildGUID = ObjectGuid::Create<HighGuid::Guild>(playerSender->GetGuildId()); - - if (Group const* group = playerSender->GetGroup()) - PartyGUID = group->GetGUID(); - } - } + SetSender(sender, locale); if (receiver) - { - TargetGUID = receiver->GetGUID(); - if (Creature const* creatureReceiver = receiver->ToCreature()) - TargetName = creatureReceiver->GetNameForLocaleIdx(locale); - } + SetReceiver(receiver, locale); SenderVirtualAddress = GetVirtualRealmAddress(); TargetVirtualAddress = GetVirtualRealmAddress(); @@ -144,6 +133,32 @@ void WorldPackets::Chat::Chat::Initialize(ChatMsg chatType, Language language, W ChatText = std::move(message); } +void WorldPackets::Chat::Chat::SetSender(WorldObject const* sender, LocaleConstant locale) +{ + SenderGUID = sender->GetGUID(); + + if (Creature const* creatureSender = sender->ToCreature()) + SenderName = creatureSender->GetNameForLocaleIdx(locale); + + if (Player const* playerSender = sender->ToPlayer()) + { + SenderAccountGUID = playerSender->GetSession()->GetAccountGUID(); + _ChatFlags = playerSender->GetChatFlags(); + + SenderGuildGUID = ObjectGuid::Create<HighGuid::Guild>(playerSender->GetGuildId()); + + if (Group const* group = playerSender->GetGroup()) + PartyGUID = group->GetGUID(); + } +} + +void WorldPackets::Chat::Chat::SetReceiver(WorldObject const* receiver, LocaleConstant locale) +{ + TargetGUID = receiver->GetGUID(); + if (Creature const* creatureReceiver = receiver->ToCreature()) + TargetName = creatureReceiver->GetNameForLocaleIdx(locale); +} + WorldPacket const* WorldPackets::Chat::Chat::Write() { _worldPacket << SlashCmd; @@ -245,3 +260,13 @@ void WorldPackets::Chat::ChatRegisterAddonPrefixes::Read() Prefixes.push_back(_worldPacket.ReadString(lenghts)); } } + +WorldPacket const* WorldPackets::Chat::DefenseMessage::Write() +{ + _worldPacket << int32(ZoneID); + _worldPacket.WriteBits(MessageText.length(), 12); + _worldPacket.FlushBits(); + _worldPacket.WriteString(MessageText); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/ChatPackets.h b/src/server/game/Server/Packets/ChatPackets.h index c8bb038ce19..0686fe63c00 100644 --- a/src/server/game/Server/Packets/ChatPackets.h +++ b/src/server/game/Server/Packets/ChatPackets.h @@ -150,8 +150,12 @@ namespace WorldPackets { public: Chat() : ServerPacket(SMSG_CHAT, 100) { } + Chat(Chat const& chat); void Initialize(ChatMsg chatType, Language language, WorldObject const* sender, WorldObject const* receiver, std::string message, uint32 achievementId = 0, std::string channelName = "", LocaleConstant locale = DEFAULT_LOCALE, std::string addonPrefix = ""); + void SetSender(WorldObject const* sender, LocaleConstant locale); + void SetReceiver(WorldObject const* receiver, LocaleConstant locale); + WorldPacket const* Write() override; uint8 SlashCmd = 0; ///< @see enum ChatMsg @@ -268,6 +272,17 @@ namespace WorldPackets void Read() override { } }; + + class DefenseMessage final : public ServerPacket + { + public: + DefenseMessage() : ServerPacket(SMSG_DEFENSE_MESSAGE) { } + + WorldPacket const* Write() override; + + int32 ZoneID = 0; + std::string MessageText; + }; } } diff --git a/src/server/game/Server/Packets/CombatLogPackets.cpp b/src/server/game/Server/Packets/CombatLogPackets.cpp index 6742e797c54..295f27375da 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.cpp +++ b/src/server/game/Server/Packets/CombatLogPackets.cpp @@ -184,3 +184,39 @@ WorldPacket const* WorldPackets::CombatLog::SpellPeriodicAuraLog::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::CombatLog::SpellInterruptLog::Write() +{ + _worldPacket << Caster; + _worldPacket << Victim; + _worldPacket << int32(InterruptedSpellID); + _worldPacket << int32(SpellID); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::CombatLog::SpellEnergizeLog::Write() +{ + _worldPacket << CasterGUID; + _worldPacket << TargetGUID; + + _worldPacket << int32(SpellID); + _worldPacket << int32(Type); + _worldPacket << int32(Amount); + + _worldPacket.WriteBit(LogData.is_initialized()); + _worldPacket.FlushBits(); + if (LogData) + _worldPacket << *LogData; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::CombatLog::SpellInstakillLog::Write() +{ + _worldPacket << Target; + _worldPacket << Caster; + _worldPacket << int32(SpellID); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatLogPackets.h b/src/server/game/Server/Packets/CombatLogPackets.h index a931166ef80..5566ea62180 100644 --- a/src/server/game/Server/Packets/CombatLogPackets.h +++ b/src/server/game/Server/Packets/CombatLogPackets.h @@ -140,6 +140,46 @@ namespace WorldPackets std::vector<SpellLogEffect> Effects; Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false }; + + class SpellInterruptLog final : public ServerPacket + { + public: + SpellInterruptLog() : ServerPacket(SMSG_SPELL_INTERRUPT_LOG, 16 + 16 + 4 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid Caster; + ObjectGuid Victim; + int32 InterruptedSpellID = 0; + int32 SpellID = 0; + }; + + class SpellEnergizeLog final : public ServerPacket + { + public: + SpellEnergizeLog() : ServerPacket(SMSG_SPELL_ENERGIZE_LOG, 16 + 16 + 4 + 4 + 4 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid CasterGUID; + ObjectGuid TargetGUID; + int32 SpellID = 0; + int32 Type = 0; + int32 Amount = 0; + Optional<Spells::SpellCastLogData> LogData; /// @todo: find the correct way where to use it, in sniff always false + }; + + class SpellInstakillLog final : public ServerPacket + { + public: + SpellInstakillLog() : ServerPacket(SMSG_SPELL_INSTAKILL_LOG, 16 + 16 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid Target; + ObjectGuid Caster; + int32 SpellID = 0; + }; } } diff --git a/src/server/game/Server/Packets/CombatPackets.cpp b/src/server/game/Server/Packets/CombatPackets.cpp index e095e951e36..d47f2275ee6 100644 --- a/src/server/game/Server/Packets/CombatPackets.cpp +++ b/src/server/game/Server/Packets/CombatPackets.cpp @@ -198,3 +198,12 @@ WorldPacket const* WorldPackets::Combat::ThreatClear::Write() _worldPacket << UnitGUID; return &_worldPacket; } + +WorldPacket const* WorldPackets::Combat::PvPCredit::Write() +{ + _worldPacket << int32(Honor); + _worldPacket << Target; + _worldPacket << int32(Rank); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CombatPackets.h b/src/server/game/Server/Packets/CombatPackets.h index 0cab58044eb..deeb98fe335 100644 --- a/src/server/game/Server/Packets/CombatPackets.h +++ b/src/server/game/Server/Packets/CombatPackets.h @@ -246,6 +246,18 @@ namespace WorldPackets ObjectGuid UnitGUID; }; + + class PvPCredit final : public ServerPacket + { + public: + PvPCredit() : ServerPacket(SMSG_PVP_CREDIT, 4 + 16 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid Target; + int32 Honor = 0; + int32 Rank = 0; + }; } } diff --git a/src/server/game/Server/Packets/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 88374e7ce62..041655aa4c6 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -25,6 +25,14 @@ WorldPacket const* WorldPackets::Garrison::GarrisonCreateResult::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Garrison::GarrisonDeleteResult::Write() +{ + _worldPacket << uint32(Result); + _worldPacket << uint32(GarrSiteID); + + return &_worldPacket; +} + ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonPlotInfo& plotInfo) { data << uint32(plotInfo.GarrPlotInstanceID); @@ -245,3 +253,10 @@ WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Garrison::GarrisonBuildingActivated::Write() +{ + _worldPacket << uint32(GarrPlotInstanceID); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index 1bb04c7ba95..a783b1bc1af 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -39,6 +39,17 @@ namespace WorldPackets uint32 Result = 0; }; + class GarrisonDeleteResult final : public ServerPacket + { + public: + GarrisonDeleteResult() : ServerPacket(SMSG_GARRISON_DELETE_RESULT, 4 + 4) { } + + WorldPacket const* Write() override; + + uint32 Result = 0; + uint32 GarrSiteID = 0; + }; + class GetGarrisonInfo final : public ClientPacket { public: @@ -279,6 +290,16 @@ namespace WorldPackets GarrisonFollower Follower; uint32 Result = 0; }; + + class GarrisonBuildingActivated final : public ServerPacket + { + public: + GarrisonBuildingActivated() : ServerPacket(SMSG_GARRISON_BUILDING_ACTIVATED, 4) { } + + WorldPacket const* Write() override; + + uint32 GarrPlotInstanceID = 0; + }; } } diff --git a/src/server/game/Server/Packets/GuildPackets.cpp b/src/server/game/Server/Packets/GuildPackets.cpp index 1e361b3b7f6..34ea92ce27c 100644 --- a/src/server/game/Server/Packets/GuildPackets.cpp +++ b/src/server/game/Server/Packets/GuildPackets.cpp @@ -801,10 +801,10 @@ WorldPacket const* WorldPackets::Guild::GuildChallengeUpdate::Write() void WorldPackets::Guild::SaveGuildEmblem::Read() { _worldPacket >> Vendor; - _worldPacket >> BStyle; _worldPacket >> EStyle; - _worldPacket >> BColor; _worldPacket >> EColor; + _worldPacket >> BStyle; + _worldPacket >> BColor; _worldPacket >> Bg; } diff --git a/src/server/game/Server/Packets/InstancePackets.cpp b/src/server/game/Server/Packets/InstancePackets.cpp index db5bdcbd9e8..7cf46454533 100644 --- a/src/server/game/Server/Packets/InstancePackets.cpp +++ b/src/server/game/Server/Packets/InstancePackets.cpp @@ -56,3 +56,19 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Instance::InstanceLockInf return data; } + +WorldPacket const* WorldPackets::Instance::InstanceReset::Write() +{ + _worldPacket << uint32(MapID); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Instance::InstanceResetFailed::Write() +{ + _worldPacket << uint32(MapID); + _worldPacket.WriteBits(ResetFailedReason, 2); + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/InstancePackets.h b/src/server/game/Server/Packets/InstancePackets.h index e38bcb97462..bfc14dddc5b 100644 --- a/src/server/game/Server/Packets/InstancePackets.h +++ b/src/server/game/Server/Packets/InstancePackets.h @@ -68,6 +68,43 @@ namespace WorldPackets std::vector<InstanceLockInfos> LockList; }; + + class ResetInstances final : public ClientPacket + { + public: + ResetInstances(WorldPacket&& packet) : ClientPacket(CMSG_RESET_INSTANCES, std::move(packet)) { } + + void Read() override { } + }; + + class InstanceReset final : public ServerPacket + { + public: + InstanceReset() : ServerPacket(SMSG_INSTANCE_RESET, 4) { } + + WorldPacket const* Write() override; + + uint32 MapID = 0; + }; + + class InstanceResetFailed final : public ServerPacket + { + public: + InstanceResetFailed() : ServerPacket(SMSG_INSTANCE_RESET_FAILED, 4 + 4) { } + + WorldPacket const* Write() override; + + uint32 MapID = 0; + uint8 ResetFailedReason = 0; + }; + + class ResetFailedNotify final : public ServerPacket + { + public: + ResetFailedNotify() : ServerPacket(SMSG_RESET_FAILED_NOTIFY, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; } } diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index bbd3fcb2ba7..c36401cb48c 100644 --- a/src/server/game/Server/Packets/MiscPackets.cpp +++ b/src/server/game/Server/Packets/MiscPackets.cpp @@ -154,6 +154,7 @@ WorldPacket const* WorldPackets::Misc::WorldServerInfo::Write() _worldPacket << uint32(DifficultyID); _worldPacket << uint8(IsTournamentRealm); _worldPacket << uint32(WeeklyReset); + _worldPacket.WriteBit(XRealmPvpAlert); _worldPacket.WriteBit(RestrictedAccountMaxLevel.is_initialized()); _worldPacket.WriteBit(RestrictedAccountMaxMoney.is_initialized()); _worldPacket.WriteBit(IneligibleForLootMask.is_initialized()); @@ -520,3 +521,20 @@ WorldPacket const* WorldPackets::Misc::LoadCUFProfiles::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Misc::SetAIAnimKit::Write() +{ + _worldPacket << Unit; + _worldPacket << uint16(AnimKitID); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Misc::SetPlayHoverAnim::Write() +{ + _worldPacket << UnitGUID; + _worldPacket.WriteBit(PlayHoverAnim); + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 93bac0d208b..76b805ab6c2 100644 --- a/src/server/game/Server/Packets/MiscPackets.h +++ b/src/server/game/Server/Packets/MiscPackets.h @@ -242,6 +242,7 @@ namespace WorldPackets Optional<uint32> RestrictedAccountMaxLevel; Optional<uint32> RestrictedAccountMaxMoney; uint32 DifficultyID = 0; + bool XRealmPvpAlert = false; }; class AreaTrigger final : public ClientPacket @@ -663,6 +664,28 @@ namespace WorldPackets std::vector<CUFProfile const*> CUFProfiles; }; + + class SetAIAnimKit final : public ServerPacket + { + public: + SetAIAnimKit() : ServerPacket(SMSG_SET_AI_ANIM_KIT, 16 + 2) { } + + WorldPacket const* Write() override; + + ObjectGuid Unit; + uint16 AnimKitID = 0; + }; + + class SetPlayHoverAnim final : public ServerPacket + { + public: + SetPlayHoverAnim() : ServerPacket(SMSG_SET_PLAY_HOVER_ANIM, 16 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + bool PlayHoverAnim = false; + }; } } diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 14fb2ecb33c..789c37cd72a 100644 --- a/src/server/game/Server/Packets/MovementPackets.cpp +++ b/src/server/game/Server/Packets/MovementPackets.cpp @@ -47,7 +47,7 @@ ByteBuffer& operator<<(ByteBuffer& data, MovementInfo& movementInfo) }*/ data.WriteBits(movementInfo.flags, 30); - data.WriteBits(movementInfo.flags2, 15); + data.WriteBits(movementInfo.flags2, 16); data.WriteBit(hasTransportData); data.WriteBit(hasFallData); @@ -102,7 +102,7 @@ ByteBuffer& operator>>(ByteBuffer& data, MovementInfo& movementInfo) } movementInfo.flags = data.ReadBits(30); - movementInfo.flags2 = data.ReadBits(15); + movementInfo.flags2 = data.ReadBits(16); bool hasTransport = data.ReadBit(); bool hasFall = data.ReadBit(); @@ -283,7 +283,7 @@ void WorldPackets::Movement::CommonMovement::WriteCreateObjectSplineDataBlock(:: ::Movement::MoveSplineFlag const& splineFlags = moveSpline.splineflags; - data.WriteBits(moveSpline.splineflags.raw(), 25); // SplineFlags + data.WriteBits(moveSpline.splineflags.raw(), 28); // SplineFlags uint8 face = ::Movement::MONSTER_MOVE_NORMAL; if (splineFlags.final_angle) @@ -546,6 +546,7 @@ WorldPacket const* WorldPackets::Movement::MoveUpdateTeleport::Write() { _worldPacket << force.ID; _worldPacket << force.Direction; + _worldPacket << force.TransportPosition; _worldPacket << force.TransportID; _worldPacket << force.Magnitude; _worldPacket.WriteBits(force.Type, 2); diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index 6803bdf3b95..2543a990937 100644 --- a/src/server/game/Server/Packets/MovementPackets.h +++ b/src/server/game/Server/Packets/MovementPackets.h @@ -249,6 +249,7 @@ namespace WorldPackets { ObjectGuid ID; G3D::Vector3 Direction; + G3D::Vector3 TransportPosition; uint32 TransportID = 0; float Magnitude = 0; uint8 Type = 0; @@ -398,7 +399,7 @@ namespace WorldPackets void Read() override; ObjectGuid MoverGUID; - uint32 TimeSkipped; + uint32 TimeSkipped = 0; }; } diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index f5cbfd7f5c2..81cdfd22649 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -665,7 +665,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Party::GroupPlayerInfos c { data.WriteBits(playerInfos.Name.size(), 6); data.FlushBits(); - + data << playerInfos.GUID; data << playerInfos.Status; data << playerInfos.Subgroup; diff --git a/src/server/game/Server/Packets/PartyPackets.h b/src/server/game/Server/Packets/PartyPackets.h index ed3eed60ef4..34e8097f985 100644 --- a/src/server/game/Server/Packets/PartyPackets.h +++ b/src/server/game/Server/Packets/PartyPackets.h @@ -73,9 +73,9 @@ namespace WorldPackets // Inviter ObjectGuid InviterGUID; - ObjectGuid InviterBNetAccountId; + ObjectGuid InviterBNetAccountId; std::string InviterName; - + // Realm bool IsXRealm = false; bool IsLocal = true; @@ -166,7 +166,7 @@ namespace WorldPackets std::vector<GroupAura> AuraList; }; - + struct GroupMemberStats { ObjectGuid GUID; @@ -523,7 +523,7 @@ namespace WorldPackets int8 PartyFlags = 0; int8 PartyIndex = 0; int8 PartyType = 0; - + ObjectGuid PartyGUID; ObjectGuid LeaderGUID; diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index f7806a9e588..094e29d5faa 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -258,9 +258,10 @@ void WorldPackets::Query::DBQueryBulk::Read() WorldPacket const* WorldPackets::Query::DBReply::Write() { - _worldPacket << TableHash; - _worldPacket << RecordID; - _worldPacket << Timestamp; + _worldPacket << uint32(TableHash); + _worldPacket << uint32(RecordID); + _worldPacket << uint32(Timestamp); + _worldPacket.WriteBit(Allow); _worldPacket << uint32(Data.size()); _worldPacket.append(Data); diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 88bf5a887f6..9c2ef75ff11 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -178,7 +178,7 @@ namespace WorldPackets struct DBQueryRecord { ObjectGuid GUID; - int32 RecordID = 0; + uint32 RecordID = 0; }; DBQueryBulk(WorldPacket&& packet) : ClientPacket(CMSG_DB_QUERY_BULK, std::move(packet)) { } @@ -198,7 +198,8 @@ namespace WorldPackets uint32 TableHash = 0; uint32 Timestamp = 0; - int32 RecordID = 0; + uint32 RecordID = 0; + bool Allow = false; ByteBuffer Data; }; diff --git a/src/server/game/Server/Packets/QuestPackets.cpp b/src/server/game/Server/Packets/QuestPackets.cpp index d792783cf9a..7135a79a74e 100644 --- a/src/server/game/Server/Packets/QuestPackets.cpp +++ b/src/server/game/Server/Packets/QuestPackets.cpp @@ -75,7 +75,7 @@ WorldPacket const* WorldPackets::Quest::QueryQuestInfoResponse::Write() _worldPacket << Info.RewardXPMultiplier; _worldPacket << Info.RewardMoney; _worldPacket << Info.RewardMoneyDifficulty; - _worldPacket << Info.Float13; // Unk + _worldPacket << Info.RewardMoneyMultiplier; _worldPacket << Info.RewardBonusMoney; _worldPacket << Info.RewardDisplaySpell; _worldPacket << Info.RewardSpell; diff --git a/src/server/game/Server/Packets/QuestPackets.h b/src/server/game/Server/Packets/QuestPackets.h index b2d7269ebb0..90568ed36ea 100644 --- a/src/server/game/Server/Packets/QuestPackets.h +++ b/src/server/game/Server/Packets/QuestPackets.h @@ -118,7 +118,8 @@ namespace WorldPackets int32 RewardXPDifficulty = 0; // used for calculating rewarded experience float RewardXPMultiplier = 1.0f; int32 RewardMoney = 0; // reward money (below max lvl) - int32 RewardMoneyDifficulty = 0; // used in XP calculation at client + int32 RewardMoneyDifficulty = 0; + float RewardMoneyMultiplier = 1.0f; int32 RewardBonusMoney = 0; int32 RewardDisplaySpell = 0; // reward spell, this spell will be displayed (icon) int32 RewardSpell = 0; @@ -131,6 +132,7 @@ namespace WorldPackets float POIx = 0.0f; float POIy = 0.0f; int32 POIPriority = 0; + int32 AllowableRaces = -1; std::string LogTitle; std::string LogDescription; std::string QuestDescription; @@ -163,9 +165,6 @@ namespace WorldPackets int32 RewardFactionOverride[QUEST_REWARD_REPUTATIONS_COUNT] = {}; int32 RewardCurrencyID[QUEST_REWARD_CURRENCY_COUNT] = {}; int32 RewardCurrencyQty[QUEST_REWARD_CURRENCY_COUNT] = {}; - - float Float13 = 1.0f; - int32 AllowableRaces = -1; }; class QueryQuestInfoResponse final : public ServerPacket diff --git a/src/server/game/Server/Packets/ScenePackets.h b/src/server/game/Server/Packets/ScenePackets.h index 50aed92615a..ac5681d4090 100644 --- a/src/server/game/Server/Packets/ScenePackets.h +++ b/src/server/game/Server/Packets/ScenePackets.h @@ -31,7 +31,7 @@ namespace WorldPackets PlayScene() : ServerPacket(SMSG_PLAY_SCENE, 34) { } WorldPacket const* Write() override; - + int32 SceneID = 0; int32 PlaybackFlags = 0; int32 SceneInstanceID = 0; @@ -39,7 +39,7 @@ namespace WorldPackets ObjectGuid TransportGUID; Position Location; }; - + class SceneTriggerEvent final : public ClientPacket { public: @@ -50,7 +50,7 @@ namespace WorldPackets uint32 SceneInstanceID = 0; std::string _Event; }; - + class ScenePlaybackComplete final : public ClientPacket { public: @@ -60,7 +60,7 @@ namespace WorldPackets uint32 SceneInstanceID = 0; }; - + class ScenePlaybackCanceled final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/SpellPackets.cpp b/src/server/game/Server/Packets/SpellPackets.cpp index 421a2e9a46c..832dfc82b06 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -706,3 +706,39 @@ void WorldPackets::Spells::UnlearnSkill::Read() { _worldPacket >> SkillLine; } + +void WorldPackets::Spells::GetMirrorImageData::Read() +{ + _worldPacket >> UnitGUID; + _worldPacket >> DisplayID; +} + +WorldPacket const* WorldPackets::Spells::MirrorImageComponentedData::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << DisplayID; + _worldPacket << RaceID; + _worldPacket << Gender; + _worldPacket << ClassID; + _worldPacket << SkinColor; + _worldPacket << FaceVariation; + _worldPacket << HairVariation; + _worldPacket << HairColor; + _worldPacket << BeardVariation; + _worldPacket << GuildGUID; + + _worldPacket << uint32(ItemDisplayID.size()); + + for (auto const& itemDisplayId : ItemDisplayID) + _worldPacket << itemDisplayId; + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write() +{ + _worldPacket << UnitGUID; + _worldPacket << DisplayID; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index 9408ac13398..a3fa6c10925 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -694,6 +694,50 @@ namespace WorldPackets void Read() override { } }; + + class GetMirrorImageData final : public ClientPacket + { + public: + GetMirrorImageData(WorldPacket&& packet) : ClientPacket(CMSG_GET_MIRROR_IMAGE_DATA, std::move(packet)) {} + + void Read() override; + + ObjectGuid UnitGUID; + uint32 DisplayID = 0; + }; + + class MirrorImageComponentedData final : public ServerPacket + { + public: + MirrorImageComponentedData() : ServerPacket(SMSG_MIRROR_IMAGE_COMPONENTED_DATA, 8 + 4 + 8 * 1 + 8 + 11 * 4) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + uint32 DisplayID = 0; + uint8 RaceID = 0; + uint8 Gender = 0; + uint8 ClassID = 0; + uint8 SkinColor = 0; + uint8 FaceVariation = 0; + uint8 HairVariation = 0; + uint8 HairColor = 0; + uint8 BeardVariation = 0; + ObjectGuid GuildGUID; + + std::vector<uint32> ItemDisplayID; + }; + + class MirrorImageCreatureData final : public ServerPacket + { + public: + MirrorImageCreatureData() : ServerPacket(SMSG_MIRROR_IMAGE_CREATURE_DATA, 8 + 4) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + uint32 DisplayID = 0; + }; } } diff --git a/src/server/game/Server/Packets/SystemPackets.cpp b/src/server/game/Server/Packets/SystemPackets.cpp index b03994aebab..c4cbfc6d378 100644 --- a/src/server/game/Server/Packets/SystemPackets.cpp +++ b/src/server/game/Server/Packets/SystemPackets.cpp @@ -43,7 +43,7 @@ WorldPacket const* WorldPackets::System::FeatureSystemStatus::Write() _worldPacket.WriteBit(CharUndeleteEnabled); _worldPacket.WriteBit(RestrictedAccount); _worldPacket.WriteBit(TutorialsEnabled); - _worldPacket.WriteBit(UnkBit90); + _worldPacket.WriteBit(NPETutorialsEnabled); _worldPacket.WriteBit(TwitterEnabled); _worldPacket.WriteBit(CommerceSystemEnabled); _worldPacket.WriteBit(Unk67); diff --git a/src/server/game/Server/Packets/SystemPackets.h b/src/server/game/Server/Packets/SystemPackets.h index 851c84ec3b8..9b19258b838 100644 --- a/src/server/game/Server/Packets/SystemPackets.h +++ b/src/server/game/Server/Packets/SystemPackets.h @@ -83,7 +83,7 @@ namespace WorldPackets bool RestrictedAccount = false; bool TutorialsEnabled = false; - bool UnkBit90 = false; + bool NPETutorialsEnabled = false; bool UnkBit61 = false; }; diff --git a/src/server/game/Server/Packets/TicketPackets.cpp b/src/server/game/Server/Packets/TicketPackets.cpp index cdbeea53e32..e6d15c0da4c 100644 --- a/src/server/game/Server/Packets/TicketPackets.cpp +++ b/src/server/game/Server/Packets/TicketPackets.cpp @@ -66,124 +66,6 @@ void WorldPackets::Ticket::GMTicketAcknowledgeSurvey::Read() _worldPacket >> CaseID; } -WorldPacket const* WorldPackets::Ticket::GMTicketGetTicketResponse::Write() -{ - _worldPacket << Result; - _worldPacket.WriteBit(Info.is_initialized()); - _worldPacket.FlushBits(); - - if (Info) - { - _worldPacket << int32(Info->TicketID); - _worldPacket << uint8(Info->Category); - _worldPacket.AppendPackedTime(Info->TicketOpenTime); - _worldPacket.AppendPackedTime(Info->OldestTicketTime); - _worldPacket.AppendPackedTime(Info->UpdateTime); - _worldPacket << uint8(Info->AssignedToGM); - _worldPacket << uint8(Info->OpenedByGM); - _worldPacket << int32(Info->WaitTimeOverrideMinutes); - - _worldPacket.WriteBits(Info->TicketDescription.size(), 11); - _worldPacket.WriteBits(Info->WaitTimeOverrideMessage.size(), 10); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(Info->TicketDescription); - _worldPacket.WriteString(Info->WaitTimeOverrideMessage); - } - - - return &_worldPacket; -} - -void WorldPackets::Ticket::GMTicketCreate::Read() -{ - _worldPacket >> Map; - _worldPacket >> Pos; - _worldPacket >> Flags; - - uint16 descLength = _worldPacket.ReadBits(11); - Description = _worldPacket.ReadString(descLength); - _worldPacket.ResetBitPos(); - - NeedResponse = _worldPacket.ReadBit(); - NeedMoreHelp = _worldPacket.ReadBit(); - _worldPacket >> DataLength; - - if (DataLength > 0) - { - _worldPacket >> ChatHistoryData.TextCount; - for (uint8 i = 0; i < ChatHistoryData.TextCount; ++i) - ChatHistoryData.Sent.push_back(_worldPacket.read<uint32>()); - - _worldPacket >> ChatHistoryData.DecompressedSize; - - //Note: don't ask why, but it works... - uint32 realLength = DataLength - ((ChatHistoryData.TextCount * 4) + 5); - ChatHistoryData.Data.resize(realLength); - _worldPacket.read(ChatHistoryData.Data.contents(), realLength); - } -} - -void WorldPackets::Ticket::GMTicketUpdateText::Read() -{ - uint16 descLength = _worldPacket.ReadBits(11); - Description = _worldPacket.ReadString(descLength); -} - -WorldPacket const* WorldPackets::Ticket::GMTicketUpdate::Write() -{ - _worldPacket << uint8(Result); - - return &_worldPacket; -} - -WorldPacket const* WorldPackets::Ticket::GMTicketStatusUpdate::Write() -{ - _worldPacket << int32(StatusInt); - - return &_worldPacket; -} - -WorldPacket const* WorldPackets::Ticket::GMTicketResponse::Write() -{ - _worldPacket << uint32(TicketID); - _worldPacket << uint32(ResponseID); - - _worldPacket.WriteBits(Description.size(), 11); - _worldPacket.WriteBits(ResponseText.size(), 14); - _worldPacket.FlushBits(); - - _worldPacket.WriteString(Description); - _worldPacket.WriteString(ResponseText); - - return &_worldPacket; -} - -WorldPacket const* WorldPackets::Ticket::GMTicketResolveResponse::Write() -{ - _worldPacket.WriteBit(ShowSurvey); - - _worldPacket.FlushBits(); - return &_worldPacket; -} - -void WorldPackets::Ticket::GMSurveySubmit::Read() -{ - _worldPacket >> SurveyID; - - SurveyQuestion.resize(_worldPacket.ReadBits(4)); - uint16 commentLength = _worldPacket.ReadBits(11); - - for (auto& q : SurveyQuestion) - { - _worldPacket >> q.QuestionID; - _worldPacket >> q.Answer; - q.AnswerComment = _worldPacket.ReadString(_worldPacket.ReadBits(11)); - } - - Comment = _worldPacket.ReadString(commentLength); -} - void WorldPackets::Ticket::SupportTicketSubmitBug::Read() { _worldPacket >> Header; @@ -206,8 +88,7 @@ WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketChatLine::Suppo WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketChatLine::SupportTicketChatLine(uint32 timestamp, std::string const& text) : Timestamp(timestamp), Text(text) -{ -} +{ } ByteBuffer& operator>>(ByteBuffer& data, WorldPackets::Ticket::SupportTicketSubmitComplaint::SupportTicketChatLine& line) { diff --git a/src/server/game/Server/Packets/TicketPackets.h b/src/server/game/Server/Packets/TicketPackets.h index 2cab591b171..050be771274 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -81,154 +81,7 @@ namespace WorldPackets time_t OldestTicketTime = 0; time_t UpdateTime = 0; std::vector<GMTicketCase> Cases; - }; - - class GMTicketGetTicket final : public ClientPacket - { - public: - GMTicketGetTicket(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_GET_TICKET, std::move(packet)) { } - - void Read() override { } - }; - - class GMTicketGetTicketResponse final : public ServerPacket - { - public: - struct GMTicketInfo - { - int32 TicketID = 0; - std::string TicketDescription; - uint8 Category = 0; - time_t TicketOpenTime = 0; - time_t OldestTicketTime = 0; - time_t UpdateTime = 0; - uint8 AssignedToGM = 0; - uint8 OpenedByGM = 0; - std::string WaitTimeOverrideMessage; - int32 WaitTimeOverrideMinutes = 0; - }; - - GMTicketGetTicketResponse() : ServerPacket(SMSG_GM_TICKET_GET_TICKET_RESPONSE, 5) { } - - WorldPacket const* Write() override; - - int32 Result = 0; - Optional<GMTicketInfo> Info; - }; - - class GMTicketCreate final : public ClientPacket - { - public: - struct ChatHistoryData - { - uint8 TextCount = 0; - std::vector<uint32> Sent; - uint32 DecompressedSize = 0; - ByteBuffer Data; - }; - - GMTicketCreate(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_CREATE, std::move(packet)) { } - - void Read() override; - - int32 Map = 0; - G3D::Vector3 Pos; - uint8 Flags = 0; - std::string Description; - bool NeedMoreHelp = false; - bool NeedResponse = false; - uint32 DataLength = 0; - ChatHistoryData ChatHistoryData; ///< Compressed Data - }; - - class GMTicketUpdateText final : public ClientPacket - { - public: - GMTicketUpdateText(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_UPDATE_TEXT, std::move(packet)) { } - - void Read() override; - - std::string Description; - }; - - class GMTicketUpdate final : public ServerPacket - { - public: - GMTicketUpdate() : ServerPacket(SMSG_GM_TICKET_UPDATE, 1) { } - - WorldPacket const* Write() override; - - uint8 Result = 0; - }; - - class GMTicketStatusUpdate final : public ServerPacket - { - public: - GMTicketStatusUpdate() : ServerPacket(SMSG_GM_TICKET_STATUS_UPDATE, 4) { } - - WorldPacket const* Write() override; - - int32 StatusInt = 0; - }; - - class GMTicketDelete final : public ClientPacket - { - public: - GMTicketDelete(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_DELETE_TICKET, std::move(packet)) { } - - void Read() override { } - }; - - class GMTicketResponse final : public ServerPacket - { - public: - GMTicketResponse() : ServerPacket(SMSG_GM_TICKET_RESPONSE, 12) { } - - WorldPacket const* Write() override; - - uint32 TicketID = 0; - uint32 ResponseID = 0; - std::string Description; - std::string ResponseText; - }; - - class GMTicketResponseResolve final : public ClientPacket - { - public: - GMTicketResponseResolve(WorldPacket&& packet) : ClientPacket(CMSG_GM_TICKET_RESPONSE_RESOLVE, std::move(packet)) { } - - void Read() override { } - }; - - class GMTicketResolveResponse final : public ServerPacket - { - public: - GMTicketResolveResponse() : ServerPacket(SMSG_GM_TICKET_RESOLVE_RESPONSE, 1) { } - - WorldPacket const* Write() override; - - bool ShowSurvey = false; - }; - - class GMSurveySubmit final : public ClientPacket - { - public: - struct GMSurveyQuestion - { - int32 QuestionID = 0; - uint8 Answer = 0; - std::string AnswerComment; - }; - - GMSurveySubmit(WorldPacket&& packet) : ClientPacket(CMSG_GM_SURVEY_SUBMIT, std::move(packet)) { } - - void Read() override; - - int32 SurveyID = 0; - std::vector<GMSurveyQuestion> SurveyQuestion; - std::string Comment; - - }; + }; class GMTicketAcknowledgeSurvey final : public ClientPacket { @@ -240,14 +93,6 @@ namespace WorldPackets int32 CaseID; }; - class GMTicketResponseError final : public ServerPacket - { - public: - GMTicketResponseError() : ServerPacket(SMSG_GM_TICKET_RESPONSE_ERROR, 0) { } - - WorldPacket const* Write() { return &_worldPacket; } - }; - class SupportTicketSubmitBug final : public ClientPacket { public: diff --git a/src/server/game/Server/Packets/TokenPackets.cpp b/src/server/game/Server/Packets/TokenPackets.cpp index a197eefdec8..00238ddcb6b 100644 --- a/src/server/game/Server/Packets/TokenPackets.cpp +++ b/src/server/game/Server/Packets/TokenPackets.cpp @@ -44,7 +44,7 @@ void WorldPackets::Token::RequestWowTokenMarketPrice::Read() _worldPacket >> UnkInt; } -WorldPacket const* WorldPackets::Token::RequestWowTokenMarketPriceResponse::Write() +WorldPacket const* WorldPackets::Token::WowTokenMarketPriceResponse::Write() { _worldPacket << CurrentMarketPrice; _worldPacket << UnkInt; diff --git a/src/server/game/Server/Packets/TokenPackets.h b/src/server/game/Server/Packets/TokenPackets.h index 0db58bbac7d..ae6825afee6 100644 --- a/src/server/game/Server/Packets/TokenPackets.h +++ b/src/server/game/Server/Packets/TokenPackets.h @@ -37,7 +37,7 @@ namespace WorldPackets class UpdateListedAuctionableTokensResponse final : public ServerPacket { public: - UpdateListedAuctionableTokensResponse() : ServerPacket(SMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST_RESPONSE, 12) { } + UpdateListedAuctionableTokensResponse() : ServerPacket(SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE, 12) { } WorldPacket const* Write() override; @@ -65,10 +65,10 @@ namespace WorldPackets uint32 UnkInt = 0; }; - class RequestWowTokenMarketPriceResponse final : public ServerPacket + class WowTokenMarketPriceResponse final : public ServerPacket { public: - RequestWowTokenMarketPriceResponse() : ServerPacket(SMSG_REQUEST_WOW_TOKEN_MARKET_PRICE_RESPONSE, 20) { } + WowTokenMarketPriceResponse() : ServerPacket(SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE, 20) { } WorldPacket const* Write() override; diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 3a2397eabdc..99b173e95ac 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -153,45 +153,45 @@ void OpcodeTable::Initialize() #define DEFINE_OPCODE_HANDLER_OLD(opcode, status, processing, handler) \ DEFINE_HANDLER(opcode, status, processing, WorldPacket, handler); - DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::AcceptGuildInvite, &WorldSession::HandleGuildAcceptInvite); - DEFINE_HANDLER(CMSG_ACCEPT_LEVEL_GRANT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::AcceptLevelGrant, &WorldSession::HandleAcceptGrantLevel); - DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::AcceptTrade, &WorldSession::HandleAcceptTradeOpcode); + DEFINE_HANDLER(CMSG_ACCEPT_GUILD_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::AcceptGuildInvite, &WorldSession::HandleGuildAcceptInvite); + DEFINE_HANDLER(CMSG_ACCEPT_LEVEL_GRANT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::RaF::AcceptLevelGrant, &WorldSession::HandleAcceptGrantLevel); + DEFINE_HANDLER(CMSG_ACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::AcceptTrade, &WorldSession::HandleAcceptTradeOpcode); DEFINE_HANDLER(CMSG_ACCEPT_WARGAME_INVITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_ACTIVATE_TAXI, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleActivateTaxiOpcode ); DEFINE_HANDLER(CMSG_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ADD_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddFriend, &WorldSession::HandleAddFriendOpcode); DEFINE_HANDLER(CMSG_ADD_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::AddIgnore, &WorldSession::HandleAddIgnoreOpcode); DEFINE_HANDLER(CMSG_ADD_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::AlterApperance, &WorldSession::HandleAlterAppearance); - DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQuery, &WorldSession::HandleAreaSpiritHealerQueryOpcode); - DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQueue, &WorldSession::HandleAreaSpiritHealerQueueOpcode); + DEFINE_HANDLER(CMSG_ALTER_APPEARANCE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::AlterApperance, &WorldSession::HandleAlterAppearance); + DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQuery, &WorldSession::HandleAreaSpiritHealerQueryOpcode); + DEFINE_HANDLER(CMSG_AREA_SPIRIT_HEALER_QUEUE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::AreaSpiritHealerQueue, &WorldSession::HandleAreaSpiritHealerQueueOpcode); DEFINE_HANDLER(CMSG_AREA_TRIGGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::AreaTrigger, &WorldSession::HandleAreaTriggerOpcode); - DEFINE_HANDLER(CMSG_ATTACK_STOP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackStop, &WorldSession::HandleAttackStopOpcode); - DEFINE_HANDLER(CMSG_ATTACK_SWING, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::AttackSwing, &WorldSession::HandleAttackSwingOpcode); - DEFINE_HANDLER(CMSG_AUCTION_HELLO_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionHelloRequest, &WorldSession::HandleAuctionHelloOpcode); - DEFINE_HANDLER(CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListBidderItems, &WorldSession::HandleAuctionListBidderItems); - DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListItems, &WorldSession::HandleAuctionListItems); - DEFINE_HANDLER(CMSG_AUCTION_LIST_OWNER_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListOwnerItems, &WorldSession::HandleAuctionListOwnerItems); - DEFINE_HANDLER(CMSG_AUCTION_LIST_PENDING_SALES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListPendingSales, &WorldSession::HandleAuctionListPendingSales); - DEFINE_HANDLER(CMSG_AUCTION_PLACE_BID, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionPlaceBid, &WorldSession::HandleAuctionPlaceBid); - DEFINE_HANDLER(CMSG_AUCTION_REMOVE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionRemoveItem, &WorldSession::HandleAuctionRemoveItem); - DEFINE_HANDLER(CMSG_AUCTION_REPLICATE_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionReplicateItems, &WorldSession::HandleReplicateItems); - DEFINE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionSellItem, &WorldSession::HandleAuctionSellItem); + DEFINE_HANDLER(CMSG_ATTACK_STOP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Combat::AttackStop, &WorldSession::HandleAttackStopOpcode); + DEFINE_HANDLER(CMSG_ATTACK_SWING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Combat::AttackSwing, &WorldSession::HandleAttackSwingOpcode); + DEFINE_HANDLER(CMSG_AUCTION_HELLO_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionHelloRequest, &WorldSession::HandleAuctionHelloOpcode); + DEFINE_HANDLER(CMSG_AUCTION_LIST_BIDDER_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListBidderItems, &WorldSession::HandleAuctionListBidderItems); + DEFINE_HANDLER(CMSG_AUCTION_LIST_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListItems, &WorldSession::HandleAuctionListItems); + DEFINE_HANDLER(CMSG_AUCTION_LIST_OWNER_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListOwnerItems, &WorldSession::HandleAuctionListOwnerItems); + DEFINE_HANDLER(CMSG_AUCTION_LIST_PENDING_SALES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionListPendingSales, &WorldSession::HandleAuctionListPendingSales); + DEFINE_HANDLER(CMSG_AUCTION_PLACE_BID, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionPlaceBid, &WorldSession::HandleAuctionPlaceBid); + DEFINE_HANDLER(CMSG_AUCTION_REMOVE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionRemoveItem, &WorldSession::HandleAuctionRemoveItem); + DEFINE_HANDLER(CMSG_AUCTION_REPLICATE_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionReplicateItems, &WorldSession::HandleReplicateItems); + DEFINE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::AuctionHouse::AuctionSellItem, &WorldSession::HandleAuctionSellItem); DEFINE_HANDLER(CMSG_AUTH_CONTINUED_SESSION, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_AUTH_SESSION, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); - DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoBankItem, &WorldSession::HandleAutoBankItemOpcode); + DEFINE_HANDLER(CMSG_AUTOBANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoBankItem, &WorldSession::HandleAutoBankItemOpcode); DEFINE_HANDLER(CMSG_AUTOBANK_REAGENT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoStoreBankItem, &WorldSession::HandleAutoStoreBankItemOpcode); + DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Bank::AutoStoreBankItem, &WorldSession::HandleAutoStoreBankItemOpcode); DEFINE_HANDLER(CMSG_AUTOSTORE_BANK_REAGENT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode); - DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItemSlot, &WorldSession::HandleAutoEquipItemSlotOpcode); - DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); - DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); - DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldLeave, &WorldSession::HandleBattlefieldLeaveOpcode); - DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldListRequest, &WorldSession::HandleBattlefieldListOpcode); - DEFINE_HANDLER(CMSG_BATTLEFIELD_PORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldPort, &WorldSession::HandleBattleFieldPortOpcode); - DEFINE_HANDLER(CMSG_BATTLEMASTER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBattlemasterHelloOpcode); - DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlemasterJoin, &WorldSession::HandleBattlemasterJoinOpcode); + DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItem, &WorldSession::HandleAutoEquipItemOpcode); + DEFINE_HANDLER(CMSG_AUTO_EQUIP_ITEM_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoEquipItemSlot, &WorldSession::HandleAutoEquipItemSlotOpcode); + DEFINE_HANDLER(CMSG_AUTO_STORE_BAG_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::AutoStoreBagItem, &WorldSession::HandleAutoStoreBagItemOpcode); + DEFINE_HANDLER(CMSG_BANKER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBankerActivateOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldLeave, &WorldSession::HandleBattlefieldLeaveOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldListRequest, &WorldSession::HandleBattlefieldListOpcode); + DEFINE_HANDLER(CMSG_BATTLEFIELD_PORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlefieldPort, &WorldSession::HandleBattleFieldPortOpcode); + DEFINE_HANDLER(CMSG_BATTLEMASTER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBattlemasterHelloOpcode); + DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::BattlemasterJoin, &WorldSession::HandleBattlemasterJoinOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BATTLEMASTER_JOIN_ARENA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleBattlemasterJoinArena ); DEFINE_HANDLER(CMSG_BATTLEMASTER_JOIN_SKIRMISH, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLENET_CHALLENGE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -201,6 +201,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PAY_GET_PRODUCT_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_GET_PURCHASE_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PAY_START_PURCHASE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_BATTLE_PAY_START_VAS_PURCHASE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_DELETE_PET_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_MODIFY_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -210,20 +211,20 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_BATTLE_PET_SET_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_SUMMON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BATTLE_PET_UPDATE_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BeginTrade, &WorldSession::HandleBeginTradeOpcode); + DEFINE_HANDLER(CMSG_BEGIN_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::BeginTrade, &WorldSession::HandleBeginTradeOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_ENTRY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfEntryInviteResponse ); DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_QUEUE_EXIT_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfExitRequest); DEFINE_OPCODE_HANDLER_OLD(CMSG_BF_MGR_QUEUE_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleBfQueueInviteResponse ); DEFINE_HANDLER(CMSG_BF_MGR_QUEUE_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBinderActivateOpcode); + DEFINE_HANDLER(CMSG_BINDER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleBinderActivateOpcode); DEFINE_HANDLER(CMSG_BLACK_MARKET_BID_ON_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen); + DEFINE_HANDLER(CMSG_BLACK_MARKET_OPEN, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::BlackMarket::BlackMarketOpen, &WorldSession::HandleBlackMarketOpen); DEFINE_HANDLER(CMSG_BLACK_MARKET_REQUEST_ITEMS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::BugReport, &WorldSession::HandleBugReportOpcode); - DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::BusyTrade, &WorldSession::HandleBusyTradeOpcode); - DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem); - DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Bank::BuyBankSlot, &WorldSession::HandleBuyBankSlotOpcode); - DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode); + DEFINE_HANDLER(CMSG_BUG_REPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::BugReport, &WorldSession::HandleBugReportOpcode); + DEFINE_HANDLER(CMSG_BUSY_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::BusyTrade, &WorldSession::HandleBusyTradeOpcode); + DEFINE_HANDLER(CMSG_BUY_BACK_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyBackItem, &WorldSession::HandleBuybackItem); + DEFINE_HANDLER(CMSG_BUY_BANK_SLOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Bank::BuyBankSlot, &WorldSession::HandleBuyBankSlotOpcode); + DEFINE_HANDLER(CMSG_BUY_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::BuyItem, &WorldSession::HandleBuyItemOpcode); DEFINE_HANDLER(CMSG_BUY_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_BUY_WOW_TOKEN_START, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -243,24 +244,24 @@ void OpcodeTable::Initialize() 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_THREADUNSAFE, &WorldSession::HandleCalendarEventRemoveInvite ); DEFINE_OPCODE_HANDLER_OLD(CMSG_CALENDAR_UPDATE_EVENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCalendarUpdateEvent ); - DEFINE_HANDLER(CMSG_CANCEL_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelAura, &WorldSession::HandleCancelAuraOpcode); + DEFINE_HANDLER(CMSG_CANCEL_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelAura, &WorldSession::HandleCancelAuraOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_AUTO_REPEAT_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelAutoRepeatSpellOpcode); - DEFINE_HANDLER(CMSG_CANCEL_CAST, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::CancelCast, &WorldSession::HandleCancelCastOpcode); + DEFINE_HANDLER(CMSG_CANCEL_CAST, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Spells::CancelCast, &WorldSession::HandleCancelCastOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_CANCEL_CHANNELLING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleCancelChanneling ); - DEFINE_HANDLER(CMSG_CANCEL_GROWTH_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelGrowthAura, &WorldSession::HandleCancelGrowthAuraOpcode); + DEFINE_HANDLER(CMSG_CANCEL_GROWTH_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelGrowthAura, &WorldSession::HandleCancelGrowthAuraOpcode); DEFINE_HANDLER(CMSG_CANCEL_MASTER_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CANCEL_MOUNT_AURA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelMountAura, &WorldSession::HandleCancelMountAuraOpcode); + DEFINE_HANDLER(CMSG_CANCEL_MOUNT_AURA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::CancelMountAura, &WorldSession::HandleCancelMountAuraOpcode); DEFINE_HANDLER(CMSG_CANCEL_QUEUED_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::CancelTempEnchantment, &WorldSession::HandleCancelTempEnchantmentOpcode); + DEFINE_HANDLER(CMSG_CANCEL_TEMP_ENCHANTMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::CancelTempEnchantment, &WorldSession::HandleCancelTempEnchantmentOpcode); DEFINE_HANDLER(CMSG_CANCEL_TRADE, STATUS_LOGGEDIN_OR_RECENTLY_LOGGOUT, PROCESS_THREADUNSAFE, WorldPackets::Trade::CancelTrade, &WorldSession::HandleCancelTradeOpcode); - DEFINE_HANDLER(CMSG_CAN_DUEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Duel::CanDuel, &WorldSession::HandleCanDuel); - DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Spells::CastSpell, &WorldSession::HandleCastSpellOpcode); + DEFINE_HANDLER(CMSG_CAN_DUEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Duel::CanDuel, &WorldSession::HandleCanDuel); + DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Spells::CastSpell, &WorldSession::HandleCastSpellOpcode); DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_LEADERS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHANGE_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode); + DEFINE_HANDLER(CMSG_CHANGE_SUB_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::ChangeSubGroup, &WorldSession::HandleChangeSubGroupOpcode); DEFINE_HANDLER(CMSG_CHARACTER_RENAME_REQUEST, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharacterRenameRequest, &WorldSession::HandleCharRenameOpcode); DEFINE_HANDLER(CMSG_CHAR_CUSTOMIZE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharCustomize, &WorldSession::HandleCharCustomizeOpcode); DEFINE_HANDLER(CMSG_CHAR_DELETE, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CharDelete, &WorldSession::HandleCharDeleteOpcode); @@ -309,16 +310,16 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_CHAT_MESSAGE_SAY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); DEFINE_HANDLER(CMSG_CHAT_MESSAGE_WHISPER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessageWhisper, &WorldSession::HandleChatMessageWhisperOpcode); DEFINE_HANDLER(CMSG_CHAT_MESSAGE_YELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatMessage, &WorldSession::HandleChatMessageOpcode); - DEFINE_HANDLER(CMSG_CHAT_REGISTER_ADDON_PREFIXES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatRegisterAddonPrefixes, &WorldSession::HandleAddonRegisteredPrefixesOpcode); + DEFINE_HANDLER(CMSG_CHAT_REGISTER_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatRegisterAddonPrefixes, &WorldSession::HandleAddonRegisteredPrefixesOpcode); DEFINE_HANDLER(CMSG_CHAT_REPORT_FILTERED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_CHAT_REPORT_IGNORED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleChatIgnoredOpcode ); - DEFINE_HANDLER(CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatUnregisterAllAddonPrefixes, &WorldSession::HandleUnregisterAllAddonPrefixesOpcode); + DEFINE_HANDLER(CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Chat::ChatUnregisterAllAddonPrefixes, &WorldSession::HandleUnregisterAllAddonPrefixesOpcode); DEFINE_HANDLER(CMSG_CHECK_RAF_EMAIL_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_CHOICE_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::ClearRaidMarker, &WorldSession::HandleClearRaidMarker); - DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::ClearTradeItem, &WorldSession::HandleClearTradeItemOpcode); - DEFINE_HANDLER(CMSG_CLIENT_PORT_GRAVEYARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::PortGraveyard, &WorldSession::HandlePortGraveyard); + DEFINE_HANDLER(CMSG_CLEAR_RAID_MARKER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::ClearRaidMarker, &WorldSession::HandleClearRaidMarker); + DEFINE_HANDLER(CMSG_CLEAR_TRADE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::ClearTradeItem, &WorldSession::HandleClearTradeItemOpcode); + DEFINE_HANDLER(CMSG_CLIENT_PORT_GRAVEYARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::PortGraveyard, &WorldSession::HandlePortGraveyard); DEFINE_HANDLER(CMSG_CLOSE_INTERACTION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_COMMENTATOR_ENABLE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_COMMENTATOR_ENTER_INSTANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -327,22 +328,21 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_COMMENTATOR_GET_PLAYER_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_COMMENTATOR_START_WARGAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_COMPLAINT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleComplainOpcode ); - DEFINE_HANDLER(CMSG_COMPLETE_ALL_READY_SHIPMENTS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::CompleteCinematic, &WorldSession::HandleCompleteCinematic); + DEFINE_HANDLER(CMSG_COMPLETE_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::CompleteCinematic, &WorldSession::HandleCompleteCinematic); DEFINE_HANDLER(CMSG_COMPLETE_MOVIE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_CONFIRM_RESPEC_WIPE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleConfirmRespecWipeOpcode ); DEFINE_HANDLER(CMSG_CONNECT_TO_FAILED, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); - DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ConvertRaid, &WorldSession::HandleConvertRaidOpcode); + DEFINE_HANDLER(CMSG_CONVERT_RAID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::ConvertRaid, &WorldSession::HandleConvertRaidOpcode); DEFINE_HANDLER(CMSG_CREATE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::CreateCharacter, &WorldSession::HandleCharCreateOpcode); DEFINE_HANDLER(CMSG_CREATE_SHIPMENT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_DB_QUERY_BULK, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Query::DBQueryBulk, &WorldSession::HandleDBQueryBulk); - DEFINE_HANDLER(CMSG_DECLINE_GUILD_INVITES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::DeclineGuildInvites, &WorldSession::HandleDeclineGuildInvites); - DEFINE_HANDLER(CMSG_DECLINE_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::DeclinePetition, &WorldSession::HandleDeclinePetition); + DEFINE_HANDLER(CMSG_DECLINE_GUILD_INVITES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::DeclineGuildInvites, &WorldSession::HandleDeclineGuildInvites); + DEFINE_HANDLER(CMSG_DECLINE_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::DeclinePetition, &WorldSession::HandleDeclinePetition); DEFINE_HANDLER(CMSG_DELETE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::DeleteEquipmentSet, &WorldSession::HandleDeleteEquipmentSet); DEFINE_HANDLER(CMSG_DEL_FRIEND, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelFriend, &WorldSession::HandleDelFriendOpcode); DEFINE_HANDLER(CMSG_DEL_IGNORE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::DelIgnore, &WorldSession::HandleDelIgnoreOpcode); DEFINE_HANDLER(CMSG_DEPOSIT_REAGENT_BANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode); + DEFINE_HANDLER(CMSG_DESTROY_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::DestroyItem, &WorldSession::HandleDestroyItemOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_BOOT_PLAYER_VOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLfgSetBootVoteOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_GET_JOIN_STATUS, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleDFGetJoinStatus ); DEFINE_OPCODE_HANDLER_OLD(CMSG_DF_GET_SYSTEM_INFO, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleDFGetSystemInfo ); @@ -358,30 +358,30 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_DISCARDED_TIME_SYNC_ACKS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_DISMISS_CRITTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleDismissCritter ); DEFINE_HANDLER(CMSG_DO_MASTER_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_DO_READY_CHECK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::DoReadyCheck, &WorldSession::HandleDoReadyCheckOpcode); - DEFINE_HANDLER(CMSG_DUEL_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Duel::DuelResponse, &WorldSession::HandleDuelResponseOpcode); - DEFINE_HANDLER(CMSG_EJECT_PASSENGER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::EjectPassenger, &WorldSession::HandleEjectPassenger); - DEFINE_HANDLER(CMSG_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::EmoteClient, &WorldSession::HandleEmoteOpcode); + DEFINE_HANDLER(CMSG_DO_READY_CHECK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::DoReadyCheck, &WorldSession::HandleDoReadyCheckOpcode); + DEFINE_HANDLER(CMSG_DUEL_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Duel::DuelResponse, &WorldSession::HandleDuelResponseOpcode); + DEFINE_HANDLER(CMSG_EJECT_PASSENGER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::EjectPassenger, &WorldSession::HandleEjectPassenger); + DEFINE_HANDLER(CMSG_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Chat::EmoteClient, &WorldSession::HandleEmoteOpcode); DEFINE_HANDLER(CMSG_ENABLE_NAGLE, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_OPCODE_HANDLER_OLD(CMSG_ENABLE_TAXI_NODE, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiQueryAvailableNodes ); DEFINE_HANDLER(CMSG_ENGINE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_ENUM_CHARACTERS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharEnumOpcode); DEFINE_HANDLER(CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::EnumCharacters, &WorldSession::HandleCharUndeleteEnumOpcode); - DEFINE_HANDLER(CMSG_FAR_SIGHT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::FarSight, &WorldSession::HandleFarSightOpcode); - DEFINE_HANDLER(CMSG_GAME_OBJ_REPORT_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjReportUse, &WorldSession::HandleGameobjectReportUse); - DEFINE_HANDLER(CMSG_GAME_OBJ_USE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjUse, &WorldSession::HandleGameObjectUseOpcode); + DEFINE_HANDLER(CMSG_FAR_SIGHT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::FarSight, &WorldSession::HandleFarSightOpcode); + DEFINE_HANDLER(CMSG_GAME_OBJ_REPORT_USE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjReportUse, &WorldSession::HandleGameobjectReportUse); + DEFINE_HANDLER(CMSG_GAME_OBJ_USE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::GameObject::GameObjUse, &WorldSession::HandleGameObjectUseOpcode); DEFINE_HANDLER(CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GARRISON_CANCEL_CONSTRUCTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonCancelConstruction, &WorldSession::HandleGarrisonCancelConstruction); + DEFINE_HANDLER(CMSG_GARRISON_CANCEL_CONSTRUCTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonCancelConstruction, &WorldSession::HandleGarrisonCancelConstruction); DEFINE_HANDLER(CMSG_GARRISON_CHECK_UPGRADEABLE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_COMPLETE_MISSION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_GENERATE_RECRUITS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GARRISON_GET_BUILDING_LANDMARKS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonGetBuildingLandmarks, &WorldSession::HandleGarrisonGetBuildingLandmarks); + DEFINE_HANDLER(CMSG_GARRISON_GET_BUILDING_LANDMARKS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonGetBuildingLandmarks, &WorldSession::HandleGarrisonGetBuildingLandmarks); DEFINE_HANDLER(CMSG_GARRISON_MISSION_BONUS_ROLL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GARRISON_PURCHASE_BUILDING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonPurchaseBuilding, &WorldSession::HandleGarrisonPurchaseBuilding); + DEFINE_HANDLER(CMSG_GARRISON_PURCHASE_BUILDING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonPurchaseBuilding, &WorldSession::HandleGarrisonPurchaseBuilding); DEFINE_HANDLER(CMSG_GARRISON_RECRUIT_FOLLOWER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REMOVE_FOLLOWER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationData, &WorldSession::HandleGarrisonRequestBlueprintAndSpecializationData); + DEFINE_HANDLER(CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GarrisonRequestBlueprintAndSpecializationData, &WorldSession::HandleGarrisonRequestBlueprintAndSpecializationData); DEFINE_HANDLER(CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_REQUEST_SHIPMENT_INFO, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GARRISON_SET_BUILDING_ACTIVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -392,87 +392,80 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_GARRISON_SWAP_BUILDINGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GENERATE_RANDOM_CHARACTER_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GenerateRandomCharacterName, &WorldSession::HandleRandomizeCharNameOpcode); DEFINE_HANDLER(CMSG_GET_CHALLENGE_MODE_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GET_GARRISON_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GetGarrisonInfo, &WorldSession::HandleGetGarrisonInfo); - DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData); - DEFINE_OPCODE_HANDLER_OLD(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMirrorImageDataRequest ); - DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Battleground::GetPVPOptionsEnabled, &WorldSession::HandleGetPVPOptionsEnabled); + DEFINE_HANDLER(CMSG_GET_GARRISON_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Garrison::GetGarrisonInfo, &WorldSession::HandleGetGarrisonInfo); + DEFINE_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData); + DEFINE_HANDLER(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::GetMirrorImageData, &WorldSession::HandleMirrorImageDataRequest); + DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Battleground::GetPVPOptionsEnabled, &WorldSession::HandleGetPVPOptionsEnabled); DEFINE_HANDLER(CMSG_GET_REMAINING_GAME_TIME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GET_TROPHY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::GetUndeleteCharacterCooldownStatus, &WorldSession::HandleGetUndeleteCooldownStatus); - DEFINE_HANDLER(CMSG_GM_LAG_REPORT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GM_SURVEY_SUBMIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMSurveySubmit, &WorldSession::HandleGMSurveySubmit); DEFINE_HANDLER(CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GM_TICKET_CREATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketCreate, &WorldSession::HandleGMTicketCreateOpcode); - DEFINE_HANDLER(CMSG_GM_TICKET_DELETE_TICKET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketDelete, &WorldSession::HandleGMTicketDeleteOpcode); - DEFINE_HANDLER(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetCaseStatus, &WorldSession::HandleGMTicketGetCaseStatusOpcode); - DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode); - DEFINE_HANDLER(CMSG_GM_TICKET_GET_TICKET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetTicket, &WorldSession::HandleGMTicketGetTicketOpcode); - DEFINE_HANDLER(CMSG_GM_TICKET_RESPONSE_RESOLVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketResponseResolve, &WorldSession::HandleGMResponseResolve); - DEFINE_HANDLER(CMSG_GM_TICKET_UPDATE_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketUpdateText, &WorldSession::HandleGMTicketUpdateTextOpcode); - DEFINE_HANDLER(CMSG_GOSSIP_SELECT_OPTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::GossipSelectOption, &WorldSession::HandleGossipSelectOptionOpcode); - DEFINE_HANDLER(CMSG_GRANT_LEVEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::RaF::GrantLevel, &WorldSession::HandleGrantLevel); + DEFINE_HANDLER(CMSG_GM_TICKET_GET_CASE_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Ticket::GMTicketGetCaseStatus, &WorldSession::HandleGMTicketGetCaseStatusOpcode); + DEFINE_HANDLER(CMSG_GM_TICKET_GET_SYSTEM_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::GMTicketGetSystemStatus, &WorldSession::HandleGMTicketSystemStatusOpcode); + DEFINE_HANDLER(CMSG_GOSSIP_SELECT_OPTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::GossipSelectOption, &WorldSession::HandleGossipSelectOptionOpcode); + DEFINE_HANDLER(CMSG_GRANT_LEVEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::RaF::GrantLevel, &WorldSession::HandleGrantLevel); DEFINE_HANDLER(CMSG_GUILD_ADD_BATTLENET_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_ADD_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAddRank, &WorldSession::HandleGuildAddRank); - DEFINE_HANDLER(CMSG_GUILD_ASSIGN_MEMBER_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAssignMemberRank, &WorldSession::HandleGuildAssignRank); + DEFINE_HANDLER(CMSG_GUILD_ADD_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAddRank, &WorldSession::HandleGuildAddRank); + DEFINE_HANDLER(CMSG_GUILD_ASSIGN_MEMBER_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildAssignMemberRank, &WorldSession::HandleGuildAssignRank); DEFINE_HANDLER(CMSG_GUILD_AUTO_DECLINE_INVITATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_BANK_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankActivate, &WorldSession::HandleGuildBankActivate); - DEFINE_HANDLER(CMSG_GUILD_BANK_BUY_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankBuyTab, &WorldSession::HandleGuildBankBuyTab); - DEFINE_HANDLER(CMSG_GUILD_BANK_DEPOSIT_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankDepositMoney, &WorldSession::HandleGuildBankDepositMoney); - DEFINE_HANDLER(CMSG_GUILD_BANK_LOG_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankLogQuery, &WorldSession::HandleGuildBankLogQuery); - DEFINE_HANDLER(CMSG_GUILD_BANK_QUERY_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankQueryTab, &WorldSession::HandleGuildBankQueryTab); - DEFINE_HANDLER(CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankRemainingWithdrawMoneyQuery, &WorldSession::HandleGuildBankMoneyWithdrawn); - DEFINE_HANDLER(CMSG_GUILD_BANK_SET_TAB_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSetTabText, &WorldSession::HandleGuildBankSetTabText); - DEFINE_HANDLER(CMSG_GUILD_BANK_SWAP_ITEMS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSwapItems, &WorldSession::HandleGuildBankSwapItems); - DEFINE_HANDLER(CMSG_GUILD_BANK_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankTextQuery, &WorldSession::HandleGuildBankTextQuery); - DEFINE_HANDLER(CMSG_GUILD_BANK_UPDATE_TAB, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankUpdateTab, &WorldSession::HandleGuildBankUpdateTab); - DEFINE_HANDLER(CMSG_GUILD_BANK_WITHDRAW_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankWithdrawMoney, &WorldSession::HandleGuildBankWithdrawMoney); - DEFINE_HANDLER(CMSG_GUILD_CHALLENGE_UPDATE_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildChallengeUpdateRequest, &WorldSession::HandleGuildChallengeUpdateRequest); + DEFINE_HANDLER(CMSG_GUILD_BANK_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankActivate, &WorldSession::HandleGuildBankActivate); + DEFINE_HANDLER(CMSG_GUILD_BANK_BUY_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankBuyTab, &WorldSession::HandleGuildBankBuyTab); + DEFINE_HANDLER(CMSG_GUILD_BANK_DEPOSIT_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankDepositMoney, &WorldSession::HandleGuildBankDepositMoney); + DEFINE_HANDLER(CMSG_GUILD_BANK_LOG_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankLogQuery, &WorldSession::HandleGuildBankLogQuery); + DEFINE_HANDLER(CMSG_GUILD_BANK_QUERY_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankQueryTab, &WorldSession::HandleGuildBankQueryTab); + DEFINE_HANDLER(CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankRemainingWithdrawMoneyQuery, &WorldSession::HandleGuildBankMoneyWithdrawn); + DEFINE_HANDLER(CMSG_GUILD_BANK_SET_TAB_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSetTabText, &WorldSession::HandleGuildBankSetTabText); + DEFINE_HANDLER(CMSG_GUILD_BANK_SWAP_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankSwapItems, &WorldSession::HandleGuildBankSwapItems); + DEFINE_HANDLER(CMSG_GUILD_BANK_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankTextQuery, &WorldSession::HandleGuildBankTextQuery); + DEFINE_HANDLER(CMSG_GUILD_BANK_UPDATE_TAB, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankUpdateTab, &WorldSession::HandleGuildBankUpdateTab); + DEFINE_HANDLER(CMSG_GUILD_BANK_WITHDRAW_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildBankWithdrawMoney, &WorldSession::HandleGuildBankWithdrawMoney); + DEFINE_HANDLER(CMSG_GUILD_CHALLENGE_UPDATE_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildChallengeUpdateRequest, &WorldSession::HandleGuildChallengeUpdateRequest); DEFINE_HANDLER(CMSG_GUILD_CHANGE_NAME_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_DECLINE_INVITATION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDeclineInvitation, &WorldSession::HandleGuildDeclineInvitation); - DEFINE_HANDLER(CMSG_GUILD_DELETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDelete, &WorldSession::HandleGuildDelete); - DEFINE_HANDLER(CMSG_GUILD_DELETE_RANK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDeleteRank, &WorldSession::HandleGuildDeleteRank); - DEFINE_HANDLER(CMSG_GUILD_DEMOTE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDemoteMember, &WorldSession::HandleGuildDemoteMember); - DEFINE_HANDLER(CMSG_GUILD_EVENT_LOG_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildEventLogQuery, &WorldSession::HandleGuildEventLogQuery); + DEFINE_HANDLER(CMSG_GUILD_DECLINE_INVITATION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDeclineInvitation, &WorldSession::HandleGuildDeclineInvitation); + DEFINE_HANDLER(CMSG_GUILD_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDelete, &WorldSession::HandleGuildDelete); + DEFINE_HANDLER(CMSG_GUILD_DELETE_RANK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDeleteRank, &WorldSession::HandleGuildDeleteRank); + DEFINE_HANDLER(CMSG_GUILD_DEMOTE_MEMBER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildDemoteMember, &WorldSession::HandleGuildDemoteMember); + DEFINE_HANDLER(CMSG_GUILD_EVENT_LOG_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildEventLogQuery, &WorldSession::HandleGuildEventLogQuery); DEFINE_HANDLER(CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_GET_RANKS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildGetRanks, &WorldSession::HandleGuildGetRanks); - DEFINE_HANDLER(CMSG_GUILD_GET_ROSTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildGetRoster, &WorldSession::HandleGuildGetRoster); - DEFINE_HANDLER(CMSG_GUILD_INVITE_BY_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildInviteByName, &WorldSession::HandleGuildInviteByName); - DEFINE_HANDLER(CMSG_GUILD_LEAVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildLeave, &WorldSession::HandleGuildLeave); + DEFINE_HANDLER(CMSG_GUILD_GET_RANKS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildGetRanks, &WorldSession::HandleGuildGetRanks); + DEFINE_HANDLER(CMSG_GUILD_GET_ROSTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildGetRoster, &WorldSession::HandleGuildGetRoster); + DEFINE_HANDLER(CMSG_GUILD_INVITE_BY_NAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildInviteByName, &WorldSession::HandleGuildInviteByName); + DEFINE_HANDLER(CMSG_GUILD_LEAVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildLeave, &WorldSession::HandleGuildLeave); DEFINE_HANDLER(CMSG_GUILD_MEMBER_SEND_SOR_REQUEST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Guild::GuildNewsUpdateSticky, &WorldSession::HandleGuildNewsUpdateSticky); - DEFINE_HANDLER(CMSG_GUILD_OFFICER_REMOVE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildOfficerRemoveMember, &WorldSession::HandleGuildOfficerRemoveMember); - DEFINE_HANDLER(CMSG_GUILD_PERMISSIONS_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPermissionsQuery, &WorldSession::HandleGuildPermissionsQuery); - DEFINE_HANDLER(CMSG_GUILD_PROMOTE_MEMBER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPromoteMember, &WorldSession::HandleGuildPromoteMember); + DEFINE_HANDLER(CMSG_GUILD_NEWS_UPDATE_STICKY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::GuildNewsUpdateSticky, &WorldSession::HandleGuildNewsUpdateSticky); + DEFINE_HANDLER(CMSG_GUILD_OFFICER_REMOVE_MEMBER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildOfficerRemoveMember, &WorldSession::HandleGuildOfficerRemoveMember); + DEFINE_HANDLER(CMSG_GUILD_PERMISSIONS_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPermissionsQuery, &WorldSession::HandleGuildPermissionsQuery); + DEFINE_HANDLER(CMSG_GUILD_PROMOTE_MEMBER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildPromoteMember, &WorldSession::HandleGuildPromoteMember); DEFINE_HANDLER(CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GUILD_QUERY_MEMBER_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_QUERY_NEWS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Guild::GuildQueryNews, &WorldSession::HandleGuildQueryNews); + DEFINE_HANDLER(CMSG_GUILD_QUERY_NEWS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::GuildQueryNews, &WorldSession::HandleGuildQueryNews); DEFINE_HANDLER(CMSG_GUILD_QUERY_RECIPES, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_GUILD_REPLACE_GUILD_MASTER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetAchievementTracking, &WorldSession::HandleGuildSetAchievementTracking); - DEFINE_HANDLER(CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Achievement::GuildSetFocusedAchievement, &WorldSession::HandleGuildSetFocusedAchievement); - DEFINE_HANDLER(CMSG_GUILD_SET_GUILD_MASTER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetGuildMaster, &WorldSession::HandleGuildSetGuildMaster); - DEFINE_HANDLER(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetMemberNote, &WorldSession::HandleGuildSetMemberNote); - DEFINE_HANDLER(CMSG_GUILD_SET_RANK_PERMISSIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetRankPermissions, &WorldSession::HandleGuildSetRankPermissions); + DEFINE_HANDLER(CMSG_GUILD_SET_ACHIEVEMENT_TRACKING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetAchievementTracking, &WorldSession::HandleGuildSetAchievementTracking); + DEFINE_HANDLER(CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Achievement::GuildSetFocusedAchievement, &WorldSession::HandleGuildSetFocusedAchievement); + DEFINE_HANDLER(CMSG_GUILD_SET_GUILD_MASTER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetGuildMaster, &WorldSession::HandleGuildSetGuildMaster); + DEFINE_HANDLER(CMSG_GUILD_SET_MEMBER_NOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetMemberNote, &WorldSession::HandleGuildSetMemberNote); + DEFINE_HANDLER(CMSG_GUILD_SET_RANK_PERMISSIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildSetRankPermissions, &WorldSession::HandleGuildSetRankPermissions); DEFINE_HANDLER(CMSG_GUILD_SHIFT_RANK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateInfoText, &WorldSession::HandleGuildUpdateInfoText); - DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateMotdText, &WorldSession::HandleGuildUpdateMotdText); - DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::HearthAndResurrect, &WorldSession::HandleHearthAndResurrect); - DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::IgnoreTrade, &WorldSession::HandleIgnoreTradeOpcode); + DEFINE_HANDLER(CMSG_GUILD_UPDATE_INFO_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateInfoText, &WorldSession::HandleGuildUpdateInfoText); + DEFINE_HANDLER(CMSG_GUILD_UPDATE_MOTD_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::GuildUpdateMotdText, &WorldSession::HandleGuildUpdateMotdText); + DEFINE_HANDLER(CMSG_HEARTH_AND_RESURRECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::HearthAndResurrect, &WorldSession::HandleHearthAndResurrect); + DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::IgnoreTrade, &WorldSession::HandleIgnoreTradeOpcode); DEFINE_HANDLER(CMSG_INCREASE_CAST_TIME_FOR_SPELL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::InitiateRolePoll, &WorldSession::HandleInitiateRolePoll); - DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::InitiateTrade, &WorldSession::HandleInitiateTradeOpcode); - DEFINE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::Inspect, &WorldSession::HandleInspectOpcode); - DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::InspectPVPRequest, &WorldSession::HandleInspectPVP); + DEFINE_HANDLER(CMSG_INITIATE_ROLE_POLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::InitiateRolePoll, &WorldSession::HandleInitiateRolePoll); + DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::InitiateTrade, &WorldSession::HandleInitiateTradeOpcode); + DEFINE_HANDLER(CMSG_INSPECT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::Inspect, &WorldSession::HandleInspectOpcode); + DEFINE_HANDLER(CMSG_INSPECT_PVP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::InspectPVPRequest, &WorldSession::HandleInspectPVP); DEFINE_OPCODE_HANDLER_OLD(CMSG_INSTANCE_LOCK_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse); DEFINE_OPCODE_HANDLER_OLD(CMSG_ITEM_PURCHASE_REFUND, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleItemRefund ); - DEFINE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::ItemTextQuery, &WorldSession::HandleItemTextQuery); + DEFINE_HANDLER(CMSG_ITEM_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::ItemTextQuery, &WorldSession::HandleItemTextQuery); DEFINE_HANDLER(CMSG_JOIN_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_JOIN_RATED_BATTLEGROUND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_KEEP_ALIVE, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); + DEFINE_HANDLER(CMSG_KEEP_ALIVE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_KEYBOUND_OVERRIDE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LEARN_PET_SPECIALIZATION_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode); - DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::LeaveGroup, &WorldSession::HandleLeaveGroupOpcode); + DEFINE_HANDLER(CMSG_LEARN_TALENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Talent::LearnTalents, &WorldSession::HandleLearnTalentsOpcode); + DEFINE_HANDLER(CMSG_LEAVE_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::LeaveGroup, &WorldSession::HandleLeaveGroupOpcode); DEFINE_HANDLER(CMSG_LEAVE_PET_BATTLE_QUEUE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LFG_LIST_APPLY_TO_GROUP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LFG_LIST_CANCEL_APPLICATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -492,7 +485,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_GET_RECRUITS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderGetRecruits ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_REMOVE_RECRUIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderRemoveRecruit ); DEFINE_OPCODE_HANDLER_OLD(CMSG_LF_GUILD_SET_GUILD_POST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleGuildFinderSetGuildPost ); - DEFINE_HANDLER(CMSG_LIST_INVENTORY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleListInventoryOpcode); + DEFINE_HANDLER(CMSG_LIST_INVENTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleListInventoryOpcode); DEFINE_HANDLER(CMSG_LOADING_SCREEN_NOTIFY, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::LoadingScreenNotify, &WorldSession::HandleLoadScreenOpcode); DEFINE_HANDLER(CMSG_LOAD_SELECTED_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOGOUT_CANCEL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutCancel, &WorldSession::HandleLogoutCancelOpcode); @@ -500,22 +493,22 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_LOGOUT_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::LogoutRequest, &WorldSession::HandleLogoutRequestOpcode); DEFINE_HANDLER(CMSG_LOG_DISCONNECT, STATUS_NEVER, PROCESS_INPLACE, WorldPacket, &WorldSession::Handle_EarlyProccess); DEFINE_HANDLER(CMSG_LOG_STREAMING_ERROR, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_LOOT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootItem, &WorldSession::HandleAutostoreLootItemOpcode); - 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_HANDLER(CMSG_LOOT_ROLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRoll, &WorldSession::HandleLootRoll); - DEFINE_HANDLER(CMSG_LOOT_UNIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootUnit, &WorldSession::HandleLootOpcode); + DEFINE_HANDLER(CMSG_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootItem, &WorldSession::HandleAutostoreLootItemOpcode); + DEFINE_HANDLER(CMSG_LOOT_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootMoney, &WorldSession::HandleLootMoneyOpcode); + DEFINE_HANDLER(CMSG_LOOT_RELEASE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRelease, &WorldSession::HandleLootReleaseOpcode); + DEFINE_HANDLER(CMSG_LOOT_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootRoll, &WorldSession::HandleLootRoll); + DEFINE_HANDLER(CMSG_LOOT_UNIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Loot::LootUnit, &WorldSession::HandleLootOpcode); DEFINE_HANDLER(CMSG_LOW_LEVEL_RAID1, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_LOW_LEVEL_RAID2, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailCreateTextItem, &WorldSession::HandleMailCreateTextItem); - DEFINE_HANDLER(CMSG_MAIL_DELETE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailDelete, &WorldSession::HandleMailDelete); - DEFINE_HANDLER(CMSG_MAIL_GET_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailGetList, &WorldSession::HandleGetMailList); - DEFINE_HANDLER(CMSG_MAIL_MARK_AS_READ, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailMarkAsRead, &WorldSession::HandleMailMarkAsRead); - DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailReturnToSender, &WorldSession::HandleMailReturnToSender); - DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeItem, &WorldSession::HandleMailTakeItem); - DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeMoney, &WorldSession::HandleMailTakeMoney); + DEFINE_HANDLER(CMSG_MAIL_CREATE_TEXT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailCreateTextItem, &WorldSession::HandleMailCreateTextItem); + DEFINE_HANDLER(CMSG_MAIL_DELETE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailDelete, &WorldSession::HandleMailDelete); + DEFINE_HANDLER(CMSG_MAIL_GET_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailGetList, &WorldSession::HandleGetMailList); + DEFINE_HANDLER(CMSG_MAIL_MARK_AS_READ, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailMarkAsRead, &WorldSession::HandleMailMarkAsRead); + DEFINE_HANDLER(CMSG_MAIL_RETURN_TO_SENDER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailReturnToSender, &WorldSession::HandleMailReturnToSender); + DEFINE_HANDLER(CMSG_MAIL_TAKE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeItem, &WorldSession::HandleMailTakeItem); + DEFINE_HANDLER(CMSG_MAIL_TAKE_MONEY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailTakeMoney, &WorldSession::HandleMailTakeMoney); DEFINE_OPCODE_HANDLER_OLD(CMSG_MASTER_LOOT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleLootMasterGiveOpcode ); - DEFINE_HANDLER(CMSG_MINIMAP_PING, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::MinimapPingClient, &WorldSession::HandleMinimapPingOpcode); + DEFINE_HANDLER(CMSG_MINIMAP_PING, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::MinimapPingClient, &WorldSession::HandleMinimapPingOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_MISSILE_TRAJECTORY_COLLISION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateProjectilePosition ); DEFINE_HANDLER(CMSG_MOUNT_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOUNT_SPECIAL_ANIM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMountSpecialAnimOpcode ); @@ -580,25 +573,25 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_MOVE_TELEPORT_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_MOVE_TIME_SKIPPED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Movement::MoveTimeSkipped, &WorldSession::HandleMoveTimeSkippedOpcode); DEFINE_HANDLER(CMSG_MOVE_TOGGLE_COLLISION_CHEAT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, WorldPackets::Movement::MovementAckMessage, &WorldSession::HandleMovementAckMessage); + DEFINE_HANDLER(CMSG_MOVE_WATER_WALK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, WorldPackets::Movement::MovementAckMessage, &WorldSession::HandleMovementAckMessage); DEFINE_HANDLER(CMSG_NEUTRAL_PLAYER_SELECT_FACTION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::NextCinematicCamera, &WorldSession::HandleNextCinematicCamera); - DEFINE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ObjectUpdateFailed, &WorldSession::HandleObjectUpdateFailedOpcode); - DEFINE_HANDLER(CMSG_OBJECT_UPDATE_RESCUED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::ObjectUpdateRescued, &WorldSession::HandleObjectUpdateRescuedOpcode); - DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); + DEFINE_HANDLER(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::NextCinematicCamera, &WorldSession::HandleNextCinematicCamera); + DEFINE_HANDLER(CMSG_OBJECT_UPDATE_FAILED, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::ObjectUpdateFailed, &WorldSession::HandleObjectUpdateFailedOpcode); + DEFINE_HANDLER(CMSG_OBJECT_UPDATE_RESCUED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Misc::ObjectUpdateRescued, &WorldSession::HandleObjectUpdateRescuedOpcode); + DEFINE_HANDLER(CMSG_OFFER_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::OfferPetition, &WorldSession::HandleOfferPetition); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); - DEFINE_HANDLER(CMSG_OPEN_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::OpenItem, &WorldSession::HandleOpenItemOpcode); + DEFINE_HANDLER(CMSG_OPEN_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::OpenItem, &WorldSession::HandleOpenItemOpcode); DEFINE_HANDLER(CMSG_OPEN_MISSION_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_OPEN_SHIPMENT_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::OptOutOfLoot, &WorldSession::HandleOptOutOfLootOpcode); - DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode); - DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteResponse, &WorldSession::HandlePartyInviteResponseOpcode); - DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyUninvite, &WorldSession::HandlePartyUninviteOpcode); - DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionBuy, &WorldSession::HandlePetitionBuy); - DEFINE_HANDLER(CMSG_PETITION_RENAME_GUILD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionRenameGuild, &WorldSession::HandlePetitionRenameGuild); - DEFINE_HANDLER(CMSG_PETITION_SHOW_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowList, &WorldSession::HandlePetitionShowList); - DEFINE_HANDLER(CMSG_PETITION_SHOW_SIGNATURES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowSignatures, &WorldSession::HandlePetitionShowSignatures); + DEFINE_HANDLER(CMSG_OPT_OUT_OF_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::OptOutOfLoot, &WorldSession::HandleOptOutOfLootOpcode); + DEFINE_HANDLER(CMSG_PARTY_INVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteClient, &WorldSession::HandlePartyInviteOpcode); + DEFINE_HANDLER(CMSG_PARTY_INVITE_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyInviteResponse, &WorldSession::HandlePartyInviteResponseOpcode); + DEFINE_HANDLER(CMSG_PARTY_UNINVITE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::PartyUninvite, &WorldSession::HandlePartyUninviteOpcode); + DEFINE_HANDLER(CMSG_PETITION_BUY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionBuy, &WorldSession::HandlePetitionBuy); + DEFINE_HANDLER(CMSG_PETITION_RENAME_GUILD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionRenameGuild, &WorldSession::HandlePetitionRenameGuild); + DEFINE_HANDLER(CMSG_PETITION_SHOW_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowList, &WorldSession::HandlePetitionShowList); + DEFINE_HANDLER(CMSG_PETITION_SHOW_SIGNATURES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::PetitionShowSignatures, &WorldSession::HandlePetitionShowSignatures); 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_HANDLER(CMSG_PET_BATTLE_FINAL_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -611,7 +604,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PET_BATTLE_REQUEST_WILD, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &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::PetCastSpell, &WorldSession::HandlePetCastSpellOpcode); + DEFINE_HANDLER(CMSG_PET_CAST_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::PetCastSpell, &WorldSession::HandlePetCastSpellOpcode); 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_SPELL_AUTOCAST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetSpellAutocastOpcode ); @@ -620,166 +613,166 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_PLAYER_LOGIN, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::PlayerLogin, &WorldSession::HandlePlayerLoginOpcode); DEFINE_HANDLER(CMSG_PROTOCOL_MISMATCH, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_PUSH_QUEST_TO_PARTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePushQuestToParty ); - DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::PVPLogDataRequest, &WorldSession::HandlePVPLogDataOpcode); + DEFINE_HANDLER(CMSG_PVP_LOG_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::PVPLogDataRequest, &WorldSession::HandlePVPLogDataOpcode); DEFINE_HANDLER(CMSG_QUERY_BATTLE_PET_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - 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_HANDLER(CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseLocationFromClient, &WorldSession::HandleQueryCorpseLocation); + DEFINE_HANDLER(CMSG_QUERY_CORPSE_TRANSPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryCorpseTransport, &WorldSession::HandleQueryCorpseTransport); DEFINE_HANDLER(CMSG_QUERY_COUNTDOWN_TIMER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_CREATURE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryCreature, &WorldSession::HandleCreatureQuery); DEFINE_HANDLER(CMSG_QUERY_GAME_OBJECT, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Query::QueryGameObject, &WorldSession::HandleGameObjectQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_GARRISON_CREATURE_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_QUERY_GUILD_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::QueryGuildInfo, &WorldSession::HandleGuildQueryOpcode); - DEFINE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::QueryInspectAchievements, &WorldSession::HandleQueryInspectAchievements); - DEFINE_HANDLER(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailQueryNextMailTime, &WorldSession::HandleQueryNextMailTime); - DEFINE_HANDLER(CMSG_QUERY_NPC_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryNPCText, &WorldSession::HandleNpcTextQueryOpcode); - DEFINE_HANDLER(CMSG_QUERY_PAGE_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPageText, &WorldSession::HandleQueryPageText); - DEFINE_HANDLER(CMSG_QUERY_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::QueryPetition, &WorldSession::HandleQueryPetition); + DEFINE_HANDLER(CMSG_QUERY_GUILD_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::QueryGuildInfo, &WorldSession::HandleGuildQueryOpcode); + DEFINE_HANDLER(CMSG_QUERY_INSPECT_ACHIEVEMENTS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::QueryInspectAchievements, &WorldSession::HandleQueryInspectAchievements); + DEFINE_HANDLER(CMSG_QUERY_NEXT_MAIL_TIME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::MailQueryNextMailTime, &WorldSession::HandleQueryNextMailTime); + DEFINE_HANDLER(CMSG_QUERY_NPC_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryNPCText, &WorldSession::HandleNpcTextQueryOpcode); + DEFINE_HANDLER(CMSG_QUERY_PAGE_TEXT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPageText, &WorldSession::HandleQueryPageText); + DEFINE_HANDLER(CMSG_QUERY_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::QueryPetition, &WorldSession::HandleQueryPetition); DEFINE_HANDLER(CMSG_QUERY_PET_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPetName, &WorldSession::HandleQueryPetName); DEFINE_HANDLER(CMSG_QUERY_PLAYER_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode); - DEFINE_HANDLER(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryQuestCompletionNPCs, &WorldSession::HandleQueryQuestCompletionNPCs); + DEFINE_HANDLER(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryQuestCompletionNPCs, &WorldSession::HandleQueryQuestCompletionNPCs); DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QueryQuestInfo, &WorldSession::HandleQuestQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_REALM_NAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_SCENARIO_POI, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_QUERY_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryTime, &WorldSession::HandleQueryTimeOpcode); - DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::QueryVoidStorage, &WorldSession::HandleVoidStorageQuery); - DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestConfirmAccept, &WorldSession::HandleQuestConfirmAccept); - DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverAcceptQuest, &WorldSession::HandleQuestgiverAcceptQuestOpcode); - DEFINE_HANDLER(CMSG_QUEST_GIVER_CHOOSE_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverChooseReward, &WorldSession::HandleQuestgiverChooseRewardOpcode); - DEFINE_HANDLER(CMSG_QUEST_GIVER_COMPLETE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverCompleteQuest, &WorldSession::HandleQuestgiverCompleteQuest); - DEFINE_HANDLER(CMSG_QUEST_GIVER_HELLO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverHello, &WorldSession::HandleQuestgiverHelloOpcode); - DEFINE_HANDLER(CMSG_QUEST_GIVER_QUERY_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverQueryQuest, &WorldSession::HandleQuestgiverQueryQuestOpcode); - DEFINE_HANDLER(CMSG_QUEST_GIVER_REQUEST_REWARD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverRequestReward, &WorldSession::HandleQuestgiverRequestRewardOpcode); + DEFINE_HANDLER(CMSG_QUERY_VOID_STORAGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::QueryVoidStorage, &WorldSession::HandleVoidStorageQuery); + DEFINE_HANDLER(CMSG_QUEST_CONFIRM_ACCEPT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestConfirmAccept, &WorldSession::HandleQuestConfirmAccept); + DEFINE_HANDLER(CMSG_QUEST_GIVER_ACCEPT_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverAcceptQuest, &WorldSession::HandleQuestgiverAcceptQuestOpcode); + DEFINE_HANDLER(CMSG_QUEST_GIVER_CHOOSE_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverChooseReward, &WorldSession::HandleQuestgiverChooseRewardOpcode); + DEFINE_HANDLER(CMSG_QUEST_GIVER_COMPLETE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverCompleteQuest, &WorldSession::HandleQuestgiverCompleteQuest); + DEFINE_HANDLER(CMSG_QUEST_GIVER_HELLO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverHello, &WorldSession::HandleQuestgiverHelloOpcode); + DEFINE_HANDLER(CMSG_QUEST_GIVER_QUERY_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverQueryQuest, &WorldSession::HandleQuestgiverQueryQuestOpcode); + DEFINE_HANDLER(CMSG_QUEST_GIVER_REQUEST_REWARD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverRequestReward, &WorldSession::HandleQuestgiverRequestRewardOpcode); DEFINE_HANDLER(CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestGiverStatusMultipleQuery, &WorldSession::HandleQuestgiverStatusMultipleQuery); DEFINE_HANDLER(CMSG_QUEST_GIVER_STATUS_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Quest::QuestGiverStatusQuery, &WorldSession::HandleQuestgiverStatusQueryOpcode); - DEFINE_HANDLER(CMSG_QUEST_LOG_REMOVE_QUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestLogRemoveQuest, &WorldSession::HandleQuestLogRemoveQuest); - DEFINE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QuestPOIQuery, &WorldSession::HandleQuestPOIQuery); + DEFINE_HANDLER(CMSG_QUEST_LOG_REMOVE_QUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Quest::QuestLogRemoveQuest, &WorldSession::HandleQuestLogRemoveQuest); + DEFINE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Query::QuestPOIQuery, &WorldSession::HandleQuestPOIQuery); DEFINE_OPCODE_HANDLER_OLD(CMSG_QUEST_PUSH_RESULT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestPushResult ); DEFINE_HANDLER(CMSG_QUEUED_MESSAGES_END, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_RANDOM_ROLL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RandomRollClient, &WorldSession::HandleRandomRollOpcode); - DEFINE_HANDLER(CMSG_READY_CHECK_RESPONSE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::ReadyCheckResponseClient, &WorldSession::HandleReadyCheckResponseOpcode); - DEFINE_HANDLER(CMSG_READ_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::ReadItem, &WorldSession::HandleReadItem); - DEFINE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ReclaimCorpse, &WorldSession::HandleReclaimCorpse); + DEFINE_HANDLER(CMSG_RANDOM_ROLL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::RandomRollClient, &WorldSession::HandleRandomRollOpcode); + DEFINE_HANDLER(CMSG_READY_CHECK_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::ReadyCheckResponseClient, &WorldSession::HandleReadyCheckResponseOpcode); + DEFINE_HANDLER(CMSG_READ_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::ReadItem, &WorldSession::HandleReadItem); + DEFINE_HANDLER(CMSG_RECLAIM_CORPSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::ReclaimCorpse, &WorldSession::HandleReclaimCorpse); DEFINE_HANDLER(CMSG_RECRUIT_A_FRIEND, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REDEEM_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_REDEEM_WOW_TOKEN_START, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - 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_HANDLER(CMSG_REORDER_CHARACTERS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::ReorderCharacters, &WorldSession::HandleReorderCharacters); + DEFINE_HANDLER(CMSG_REPAIR_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::RepairItem, &WorldSession::HandleRepairItemOpcode); DEFINE_HANDLER(CMSG_REPLACE_TROPHY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::RepopRequest, &WorldSession::HandleRepopRequest); - DEFINE_HANDLER(CMSG_REPORT_PVP_PLAYER_AFK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::ReportPvPPlayerAFK, &WorldSession::HandleReportPvPAFK); + DEFINE_HANDLER(CMSG_REPOP_REQUEST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::RepopRequest, &WorldSession::HandleRepopRequest); + DEFINE_HANDLER(CMSG_REPORT_PVP_PLAYER_AFK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::ReportPvPPlayerAFK, &WorldSession::HandleReportPvPAFK); DEFINE_HANDLER(CMSG_REQUEST_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::RequestAccountData, &WorldSession::HandleRequestAccountData); - DEFINE_HANDLER(CMSG_REQUEST_BATTLEFIELD_STATUS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Battleground::RequestBattlefieldStatus, &WorldSession::HandleRequestBattlefieldStatusOpcode); - DEFINE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Spells::RequestCategoryCooldowns, &WorldSession::HandleRequestCategoryCooldowns); - DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::RequestCemeteryList, &WorldSession::HandleRequestCemeteryList); + DEFINE_HANDLER(CMSG_REQUEST_BATTLEFIELD_STATUS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Battleground::RequestBattlefieldStatus, &WorldSession::HandleRequestBattlefieldStatusOpcode); + DEFINE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Spells::RequestCategoryCooldowns, &WorldSession::HandleRequestCategoryCooldowns); + DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Misc::RequestCemeteryList, &WorldSession::HandleRequestCemeteryList); DEFINE_HANDLER(CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_REQUEST_FORCED_REACTIONS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Reputation::RequestForcedReactions, &WorldSession::HandleRequestForcedReactionsOpcode); - DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::RequestGuildPartyState, &WorldSession::HandleGuildRequestPartyState); - DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Guild::RequestGuildRewardsList, &WorldSession::HandleRequestGuildRewardsList); - DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Inspect::RequestHonorStats, &WorldSession::HandleRequestHonorStatsOpcode); + DEFINE_HANDLER(CMSG_REQUEST_FORCED_REACTIONS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Reputation::RequestForcedReactions, &WorldSession::HandleRequestForcedReactionsOpcode); + DEFINE_HANDLER(CMSG_REQUEST_GUILD_PARTY_STATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::RequestGuildPartyState, &WorldSession::HandleGuildRequestPartyState); + DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Guild::RequestGuildRewardsList, &WorldSession::HandleRequestGuildRewardsList); + DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Inspect::RequestHonorStats, &WorldSession::HandleRequestHonorStatsOpcode); DEFINE_HANDLER(CMSG_REQUEST_LFG_LIST_BLACKLIST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyJoinUpdates, &WorldSession::HandleRequestPartyJoinUpdates); - DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyMemberStats, &WorldSession::HandleRequestPartyMemberStatsOpcode); + DEFINE_HANDLER(CMSG_REQUEST_PARTY_JOIN_UPDATES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyJoinUpdates, &WorldSession::HandleRequestPartyJoinUpdates); + DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestPartyMemberStats, &WorldSession::HandleRequestPartyMemberStatsOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PET_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfoOpcode ); - DEFINE_HANDLER(CMSG_REQUEST_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::RequestPlayedTime, &WorldSession::HandlePlayedTime); + DEFINE_HANDLER(CMSG_REQUEST_PLAYED_TIME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::RequestPlayedTime, &WorldSession::HandlePlayedTime); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_PVP_REWARDS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleRequestPvpReward ); - DEFINE_HANDLER(CMSG_REQUEST_RAID_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestRaidInfo, &WorldSession::HandleRequestRaidInfoOpcode); + DEFINE_HANDLER(CMSG_REQUEST_RAID_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::RequestRaidInfo, &WorldSession::HandleRequestRaidInfoOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_RATED_BATTLEFIELD_INFO, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestRatedBattlefieldInfo); DEFINE_HANDLER(CMSG_REQUEST_RESEARCH_HISTORY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_REQUEST_STABLED_PETS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleListStabledPetsOpcode ); - DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleExit, &WorldSession::HandleRequestVehicleExit); - DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleNextSeat, &WorldSession::HandleRequestVehicleNextSeat); - DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehiclePrevSeat, &WorldSession::HandleRequestVehiclePrevSeat); - DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleSwitchSeat, &WorldSession::HandleRequestVehicleSwitchSeat); - DEFINE_HANDLER(CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Token::RequestWowTokenMarketPrice, &WorldSession::HandleRequestWowTokenMarketPrice); + DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_EXIT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleExit, &WorldSession::HandleRequestVehicleExit); + DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_NEXT_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleNextSeat, &WorldSession::HandleRequestVehicleNextSeat); + DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_PREV_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehiclePrevSeat, &WorldSession::HandleRequestVehiclePrevSeat); + DEFINE_HANDLER(CMSG_REQUEST_VEHICLE_SWITCH_SEAT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RequestVehicleSwitchSeat, &WorldSession::HandleRequestVehicleSwitchSeat); + DEFINE_HANDLER(CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Token::RequestWowTokenMarketPrice, &WorldSession::HandleRequestWowTokenMarketPrice); DEFINE_HANDLER(CMSG_RESET_CHALLENGE_MODE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_OPCODE_HANDLER_OLD(CMSG_RESET_INSTANCES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleResetInstancesOpcode ); - DEFINE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::ResurrectResponse, &WorldSession::HandleResurrectResponse); + DEFINE_HANDLER(CMSG_RESET_INSTANCES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Instance::ResetInstances, &WorldSession::HandleResetInstancesOpcode); + DEFINE_HANDLER(CMSG_RESURRECT_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::ResurrectResponse, &WorldSession::HandleResurrectResponse); DEFINE_HANDLER(CMSG_REVERT_MONUMENT_APPEARANCE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_RIDE_VEHICLE_INTERACT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RideVehicleInteract, &WorldSession::HandleRideVehicleInteract); - DEFINE_HANDLER(CMSG_SAVE_CUF_PROFILES, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::SaveCUFProfiles, &WorldSession::HandleSaveCUFProfiles); - DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); - DEFINE_HANDLER(CMSG_SAVE_GUILD_EMBLEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Guild::SaveGuildEmblem, &WorldSession::HandleSaveGuildEmblem); - DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_CANCELED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackCanceled, &WorldSession::HandleScenePlaybackCanceled); - DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_COMPLETE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackComplete, &WorldSession::HandleScenePlaybackComplete); - DEFINE_HANDLER(CMSG_SCENE_TRIGGER_EVENT, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Scenes::SceneTriggerEvent, &WorldSession::HandleSceneTriggerEvent); - DEFINE_HANDLER(CMSG_SELF_RES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SelfRes, &WorldSession::HandleSelfResOpcode); - DEFINE_HANDLER(CMSG_SELL_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SellItem, &WorldSession::HandleSellItemOpcode); + DEFINE_HANDLER(CMSG_RIDE_VEHICLE_INTERACT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Vehicle::RideVehicleInteract, &WorldSession::HandleRideVehicleInteract); + DEFINE_HANDLER(CMSG_SAVE_CUF_PROFILES, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Misc::SaveCUFProfiles, &WorldSession::HandleSaveCUFProfiles); + DEFINE_HANDLER(CMSG_SAVE_EQUIPMENT_SET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::SaveEquipmentSet, &WorldSession::HandleEquipmentSetSave); + DEFINE_HANDLER(CMSG_SAVE_GUILD_EMBLEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Guild::SaveGuildEmblem, &WorldSession::HandleSaveGuildEmblem); + DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_CANCELED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackCanceled, &WorldSession::HandleScenePlaybackCanceled); + DEFINE_HANDLER(CMSG_SCENE_PLAYBACK_COMPLETE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Scenes::ScenePlaybackComplete, &WorldSession::HandleScenePlaybackComplete); + DEFINE_HANDLER(CMSG_SCENE_TRIGGER_EVENT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Scenes::SceneTriggerEvent, &WorldSession::HandleSceneTriggerEvent); + DEFINE_HANDLER(CMSG_SELF_RES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::SelfRes, &WorldSession::HandleSelfResOpcode); + DEFINE_HANDLER(CMSG_SELL_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SellItem, &WorldSession::HandleSellItemOpcode); DEFINE_HANDLER(CMSG_SELL_WOW_TOKEN_CONFIRM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SELL_WOW_TOKEN_START, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SEND_CONTACT_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::SendContactList, &WorldSession::HandleContactListOpcode); - DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Mail::SendMail, &WorldSession::HandleSendMail); + DEFINE_HANDLER(CMSG_SEND_CONTACT_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Social::SendContactList, &WorldSession::HandleContactListOpcode); + DEFINE_HANDLER(CMSG_SEND_MAIL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Mail::SendMail, &WorldSession::HandleSendMail); DEFINE_HANDLER(CMSG_SEND_SOR_REQUEST_VIA_ADDRESS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SEND_TEXT_EMOTE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Chat::CTextEmote, &WorldSession::HandleTextEmoteOpcode); + DEFINE_HANDLER(CMSG_SEND_TEXT_EMOTE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Chat::CTextEmote, &WorldSession::HandleTextEmoteOpcode); DEFINE_HANDLER(CMSG_SET_ACHIEVEMENTS_HIDDEN, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_ACTION_BAR_TOGGLES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetActionBarToggles, &WorldSession::HandleSetActionBarToggles); DEFINE_HANDLER(CMSG_SET_ACTION_BUTTON, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SetActionButton, &WorldSession::HandleSetActionButtonOpcode); DEFINE_HANDLER(CMSG_SET_ACTIVE_MOVER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Movement::SetActiveMover, &WorldSession::HandleSetActiveMoverOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_ACTIVE_VOICE_CHANNEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetActiveVoiceChannel ); DEFINE_HANDLER(CMSG_SET_ADVANCED_COMBAT_LOGGING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_ASSISTANT_LEADER, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SetAssistantLeader, &WorldSession::HandleSetAssistantLeaderOpcode); + DEFINE_HANDLER(CMSG_SET_ASSISTANT_LEADER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SetAssistantLeader, &WorldSession::HandleSetAssistantLeaderOpcode); DEFINE_HANDLER(CMSG_SET_BACKPACK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_BANK_AUTOSORT_DISABLED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_BANK_BAG_SLOT_FLAG, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_CONTACT_NOTES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Social::SetContactNotes, &WorldSession::HandleSetContactNotesOpcode); + DEFINE_HANDLER(CMSG_SET_CONTACT_NOTES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Social::SetContactNotes, &WorldSession::HandleSetContactNotesOpcode); DEFINE_HANDLER(CMSG_SET_CURRENCY_FLAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_DIFFICULTY_ID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_DUNGEON_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetDungeonDifficulty, &WorldSession::HandleSetDungeonDifficultyOpcode); - DEFINE_HANDLER(CMSG_SET_EVERYONE_IS_ASSISTANT, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SetEveryoneIsAssistant, &WorldSession::HandleSetEveryoneIsAssistant); - DEFINE_HANDLER(CMSG_SET_FACTION_AT_WAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionAtWar, &WorldSession::HandleSetFactionAtWar); - DEFINE_HANDLER(CMSG_SET_FACTION_INACTIVE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionInactive, &WorldSession::HandleSetFactionInactiveOpcode); - DEFINE_HANDLER(CMSG_SET_FACTION_NOT_AT_WAR, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionNotAtWar, &WorldSession::HandleSetFactionNotAtWar); + DEFINE_HANDLER(CMSG_SET_DUNGEON_DIFFICULTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetDungeonDifficulty, &WorldSession::HandleSetDungeonDifficultyOpcode); + DEFINE_HANDLER(CMSG_SET_EVERYONE_IS_ASSISTANT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SetEveryoneIsAssistant, &WorldSession::HandleSetEveryoneIsAssistant); + DEFINE_HANDLER(CMSG_SET_FACTION_AT_WAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionAtWar, &WorldSession::HandleSetFactionAtWar); + DEFINE_HANDLER(CMSG_SET_FACTION_INACTIVE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionInactive, &WorldSession::HandleSetFactionInactiveOpcode); + DEFINE_HANDLER(CMSG_SET_FACTION_NOT_AT_WAR, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::SetFactionNotAtWar, &WorldSession::HandleSetFactionNotAtWar); DEFINE_HANDLER(CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_LFG_BONUS_FACTION_ID, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_LOOT_METHOD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::SetLootMethod, &WorldSession::HandleSetLootMethodOpcode); + DEFINE_HANDLER(CMSG_SET_LOOT_METHOD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::SetLootMethod, &WorldSession::HandleSetLootMethodOpcode); DEFINE_HANDLER(CMSG_SET_LOOT_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PARTY_ASSIGNMENT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePartyAssignmentOpcode ); - DEFINE_HANDLER(CMSG_SET_PARTY_LEADER, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SetPartyLeader, &WorldSession::HandleSetPartyLeaderOpcode); + DEFINE_HANDLER(CMSG_SET_PARTY_LEADER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SetPartyLeader, &WorldSession::HandleSetPartyLeaderOpcode); DEFINE_HANDLER(CMSG_SET_PET_SLOT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_PLAYER_DECLINED_NAMES, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetPlayerDeclinedNames ); DEFINE_HANDLER(CMSG_SET_PREFERRED_CEMETERY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SET_PVP, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_RAID_DIFFICULTY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetRaidDifficulty, &WorldSession::HandleSetRaidDifficultyOpcode); - DEFINE_HANDLER(CMSG_SET_ROLE, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SetRole, &WorldSession::HandleSetRoleOpcode); + DEFINE_HANDLER(CMSG_SET_RAID_DIFFICULTY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetRaidDifficulty, &WorldSession::HandleSetRaidDifficultyOpcode); + DEFINE_HANDLER(CMSG_SET_ROLE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SetRole, &WorldSession::HandleSetRoleOpcode); 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_HANDLER(CMSG_SET_SHEATHED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Combat::SetSheathed, &WorldSession::HandleSetSheathedOpcode); + DEFINE_HANDLER(CMSG_SET_SELECTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::SetSelection, &WorldSession::HandleSetSelectionOpcode); + DEFINE_HANDLER(CMSG_SET_SHEATHED, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Combat::SetSheathed, &WorldSession::HandleSetSheathedOpcode); DEFINE_HANDLER(CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); + DEFINE_HANDLER(CMSG_SET_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Talent::SetSpecialization, &WorldSession::HandleSetSpecializationOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_SET_TAXI_BENCHMARK_MODE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSetTaxiBenchmarkOpcode ); - DEFINE_HANDLER(CMSG_SET_TITLE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetTitle, &WorldSession::HandleSetTitleOpcode); - DEFINE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeCurrency, &WorldSession::HandleSetTradeCurrencyOpcode); - DEFINE_HANDLER(CMSG_SET_TRADE_GOLD, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeGold, &WorldSession::HandleSetTradeGoldOpcode); - DEFINE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeItem, &WorldSession::HandleSetTradeItemOpcode); + DEFINE_HANDLER(CMSG_SET_TITLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::SetTitle, &WorldSession::HandleSetTitleOpcode); + DEFINE_HANDLER(CMSG_SET_TRADE_CURRENCY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeCurrency, &WorldSession::HandleSetTradeCurrencyOpcode); + DEFINE_HANDLER(CMSG_SET_TRADE_GOLD, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeGold, &WorldSession::HandleSetTradeGoldOpcode); + DEFINE_HANDLER(CMSG_SET_TRADE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::SetTradeItem, &WorldSession::HandleSetTradeItemOpcode); DEFINE_HANDLER(CMSG_SET_USING_PARTY_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SET_WATCHED_FACTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::SetWatchedFaction, &WorldSession::HandleSetWatchedFactionOpcode); - DEFINE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingCloak, &WorldSession::HandleShowingCloakOpcode); - DEFINE_HANDLER(CMSG_SHOWING_HELM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingHelm, &WorldSession::HandleShowingHelmOpcode); + DEFINE_HANDLER(CMSG_SET_WATCHED_FACTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::SetWatchedFaction, &WorldSession::HandleSetWatchedFactionOpcode); + DEFINE_HANDLER(CMSG_SHOWING_CLOAK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingCloak, &WorldSession::HandleShowingCloakOpcode); + DEFINE_HANDLER(CMSG_SHOWING_HELM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Character::ShowingHelm, &WorldSession::HandleShowingHelmOpcode); DEFINE_HANDLER(CMSG_SHOW_TRADE_SKILL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_SIGN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::SignPetition, &WorldSession::HandleSignPetition); + DEFINE_HANDLER(CMSG_SIGN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::SignPetition, &WorldSession::HandleSignPetition); DEFINE_HANDLER(CMSG_SILENCE_PARTY_TALKER, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_SOCKET_GEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSocketOpcode ); DEFINE_HANDLER(CMSG_SORT_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SORT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SORT_REAGENT_BANK_BAGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_SPELL_CLICK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSpellClick ); - DEFINE_HANDLER(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::SpiritHealerActivate, &WorldSession::HandleSpiritHealerActivate); - DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode); - DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::StandStateChange, &WorldSession::HandleStandStateChangeOpcode); + DEFINE_HANDLER(CMSG_SPIRIT_HEALER_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::SpiritHealerActivate, &WorldSession::HandleSpiritHealerActivate); + DEFINE_HANDLER(CMSG_SPLIT_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SplitItem, &WorldSession::HandleSplitItemOpcode); + DEFINE_HANDLER(CMSG_STAND_STATE_CHANGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::StandStateChange, &WorldSession::HandleStandStateChangeOpcode); DEFINE_HANDLER(CMSG_START_SPECTATOR_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_START_WAR_GAME, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_SUMMON_RESPONSE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleSummonResponseOpcode ); - DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_BUG, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitBug, &WorldSession::HandleSupportTicketSubmitBug); - DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitComplaint, &WorldSession::HandleSupportTicketSubmitComplaint); - DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitSuggestion, &WorldSession::HandleSupportTicketSubmitSuggestion); + DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_BUG, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitBug, &WorldSession::HandleSupportTicketSubmitBug); + DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitComplaint, &WorldSession::HandleSupportTicketSubmitComplaint); + DEFINE_HANDLER(CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Ticket::SupportTicketSubmitSuggestion, &WorldSession::HandleSupportTicketSubmitSuggestion); DEFINE_HANDLER(CMSG_SUSPEND_COMMS_ACK, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_SUSPEND_TOKEN_RESPONSE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &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_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode); - DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::SwapVoidItem, &WorldSession::HandleVoidSwapItem); - DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTabardVendorActivateOpcode); - DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode); + DEFINE_HANDLER(CMSG_SWAP_INV_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapInvItem, &WorldSession::HandleSwapInvItemOpcode); + DEFINE_HANDLER(CMSG_SWAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::SwapItem, &WorldSession::HandleSwapItem); + DEFINE_HANDLER(CMSG_SWAP_SUB_GROUPS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Party::SwapSubGroups, &WorldSession::HandleSwapSubGroupsOpcode); + DEFINE_HANDLER(CMSG_SWAP_VOID_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::SwapVoidItem, &WorldSession::HandleVoidSwapItem); + DEFINE_HANDLER(CMSG_TABARD_VENDOR_ACTIVATE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTabardVendorActivateOpcode); + DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode); 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_HANDLER(CMSG_TAXI_REQUEST_EARLY_LANDING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -792,45 +785,46 @@ void OpcodeTable::Initialize() 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_HANDLER(CMSG_TOY_SET_FAVORITE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode); - DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode); + DEFINE_HANDLER(CMSG_TRAINER_BUY_SPELL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::TrainerBuySpell, &WorldSession::HandleTrainerBuySpellOpcode); + DEFINE_HANDLER(CMSG_TRAINER_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTrainerListOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_TRANSMOGRIFY_ITEMS, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleTransmogrifyItems ); - DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::TurnInPetition, &WorldSession::HandleTurnInPetition); - DEFINE_HANDLER(CMSG_TUTORIAL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); + DEFINE_HANDLER(CMSG_TURN_IN_PETITION, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Petition::TurnInPetition, &WorldSession::HandleTurnInPetition); + DEFINE_HANDLER(CMSG_TUTORIAL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Misc::TutorialSetFlag, &WorldSession::HandleTutorialFlag); DEFINE_HANDLER(CMSG_TWITTER_CHECK_STATUS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TWITTER_CONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TWITTER_DISCONNECT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_TWITTER_POST, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UI_TIME_REQUEST, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Misc::UITimeRequest, &WorldSession::HandleUITimeRequest); - DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Trade::UnacceptTrade, &WorldSession::HandleUnacceptTradeOpcode); + DEFINE_HANDLER(CMSG_UNACCEPT_TRADE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Trade::UnacceptTrade, &WorldSession::HandleUnacceptTradeOpcode); DEFINE_HANDLER(CMSG_UNDELETE_CHARACTER, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::Character::UndeleteCharacter, &WorldSession::HandleCharUndeleteOpcode); - DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UnlearnSkill, &WorldSession::HandleUnlearnSkillOpcode); + DEFINE_HANDLER(CMSG_UNLEARN_SKILL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::UnlearnSkill, &WorldSession::HandleUnlearnSkillOpcode); DEFINE_HANDLER(CMSG_UNLEARN_SPECIALIZATION, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_UNLOCK_VOID_STORAGE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::UnlockVoidStorage, &WorldSession::HandleVoidStorageUnlock); + DEFINE_HANDLER(CMSG_UNLOCK_VOID_STORAGE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::UnlockVoidStorage, &WorldSession::HandleVoidStorageUnlock); DEFINE_HANDLER(CMSG_UPDATE_ACCOUNT_DATA, STATUS_AUTHED, PROCESS_THREADUNSAFE, WorldPackets::ClientConfig::UserClientUpdateAccountData, &WorldSession::HandleUpdateAccountData); DEFINE_HANDLER(CMSG_UPDATE_CLIENT_SETTINGS, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_UPDATE_MISSILE_TRAJECTORY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleUpdateMissileTrajectory ); - DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Party::UpdateRaidTarget, &WorldSession::HandleUpdateRaidTargetOpcode); - DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Token::UpdateListedAuctionableTokens, &WorldSession::HandleUpdateListedAuctionableTokens); + DEFINE_HANDLER(CMSG_UPDATE_RAID_TARGET, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Party::UpdateRaidTarget, &WorldSession::HandleUpdateRaidTargetOpcode); + DEFINE_HANDLER(CMSG_UPDATE_VAS_PURCHASE_STATES, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); + DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Token::UpdateListedAuctionableTokens, &WorldSession::HandleUpdateListedAuctionableTokens); DEFINE_HANDLER(CMSG_UPDATE_WOW_TOKEN_COUNT, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPGRADE_GARRISON, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_UPGRADE_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USED_FOLLOW, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USE_CRITTER_ITEM, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_USE_EQUIPMENT_SET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::EquipmentSet::UseEquipmentSet, &WorldSession::HandleUseEquipmentSet); - DEFINE_HANDLER(CMSG_USE_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::UseItem, &WorldSession::HandleUseItemOpcode); + DEFINE_HANDLER(CMSG_USE_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Spells::UseItem, &WorldSession::HandleUseItemOpcode); DEFINE_HANDLER(CMSG_USE_TOY, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); - DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_AUTHED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel); + DEFINE_HANDLER(CMSG_VIOLENCE_LEVEL, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Misc::ViolenceLevel, &WorldSession::HandleViolenceLevel); DEFINE_HANDLER(CMSG_VOICE_ADD_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_HANDLER(CMSG_VOICE_DEL_IGNORE, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); DEFINE_OPCODE_HANDLER_OLD(CMSG_VOICE_SESSION_ENABLE, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleVoiceSessionEnableOpcode ); - DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::VoidStorageTransfer, &WorldSession::HandleVoidStorageTransfer); + DEFINE_HANDLER(CMSG_VOID_STORAGE_TRANSFER, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::VoidStorage::VoidStorageTransfer, &WorldSession::HandleVoidStorageTransfer); DEFINE_OPCODE_HANDLER_OLD(CMSG_WARDEN_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWardenDataOpcode ); DEFINE_HANDLER(CMSG_WHO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoRequestPkt, &WorldSession::HandleWhoOpcode); DEFINE_HANDLER(CMSG_WHO_IS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Who::WhoIsRequest, &WorldSession::HandleWhoIsOpcode); DEFINE_HANDLER(CMSG_WORLD_PORT_RESPONSE, STATUS_TRANSFER, PROCESS_THREADUNSAFE, WorldPackets::Movement::WorldPortResponse, &WorldSession::HandleMoveWorldportAckOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_WORLD_TELEPORT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleWorldTeleportOpcode ); - DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem); + DEFINE_HANDLER(CMSG_WRAP_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::WrapItem, &WorldSession::HandleWrapItem); #undef DEFINE_OPCODE_HANDLER_OLD #undef DEFINE_HANDLER @@ -842,6 +836,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ABORT_NEW_WORLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_CRITERIA_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_DATA_TIMES, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_HEIRLOOM_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ACCOUNT_MOUNT_UPDATE, 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_NEVER, CONNECTION_TYPE_INSTANCE); @@ -855,53 +850,53 @@ void OpcodeTable::Initialize() 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_AI_REACTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ALL_ACCOUNT_CRITERIA, STATUS_NEVER, 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_ALL_GUILD_ACHIEVEMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARCHAEOLOGY_SURVERY_CAST, STATUS_UNHANDLED, 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_NO_CORPSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_NO_CORPSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_PATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AREA_TRIGGER_RE_SHAPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKER_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_STOP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_SWING_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACKER_STATE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_STOP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_SWING_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ATTACK_SWING_LANDED_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_CLOSED_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_HELLO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_LIST_PENDING_SALES_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OUTBID_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_OWNER_BID_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_REPLICATE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUCTION_WON_NOTIFICATION, STATUS_NEVER, 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_RESPONSE, STATUS_UNHANDLED, 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_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_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_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_AURA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_CHALLENGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AUTH_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_AVAILABLE_VOICE_CHANNEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BARBER_SHOP_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_PORT_DENIED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_ACTIVE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_NONE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEFIELD_STATUS_QUEUED, STATUS_NEVER, 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_NEED_CONFIRMATION, 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_WAIT_FOR_GROUPS, 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_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_JOINED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_LEFT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BATTLEGROUND_PLAYER_POSITIONS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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); @@ -938,8 +933,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_QUEUE_STATUS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BF_MGR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BIND_POINT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BINDER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BIND_POINT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BLACK_MARKET_OUTBID, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -948,8 +943,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_BONUS_ROLL_EMPTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BOSS_KILL_CREDIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_BREAK_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_BUY_SUCCEEDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CACHE_VERSION, STATUS_NEVER, 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); @@ -972,15 +967,15 @@ void OpcodeTable::Initialize() 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_CAMERA_SHAKE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_AUTO_REPEAT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_COMBAT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_ORPHAN_SPELL_VISUAL, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CANCEL_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAN_DUEL_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAN_DUEL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATEGORY_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLEGE_MODE_REWARDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); 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); @@ -1001,8 +996,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_UPGRADE_STARTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_FACTION_CHANGE_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_AUTO_RESPONDED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1018,31 +1013,31 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHEAT_IGNORE_DIMISHING_RETURNS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHECK_WARGAME_ENTRY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHUNKED_PACKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_ALL_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_BOSS_EMOTES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_COOLDOWNS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CLEAR_TARGET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COIN_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMBAT_EVENT_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_MAP_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMMENTATOR_STATE_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLAINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_COMPLAINT_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_PACKET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONNECT_TO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONQUEST_FORMULA_CONSTANTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONSOLE_WRITE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTROL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTACT_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CONTROL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); 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_NEVER, CONNECTION_TYPE_INSTANCE); - 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_COOLDOWN_EVENT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_LOCATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_RECLAIM_DELAY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_TRANSPORT_QUERY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATE_SHIPMENT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1053,15 +1048,15 @@ void OpcodeTable::Initialize() 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_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_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DB_REPLY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); // do not enable until all DB2 stores have updated structures + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEATH_RELEASE_LOC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DEFENSE_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_CHAR, STATUS_NEVER, 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); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_DISMOUNT_RESULT, 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); @@ -1071,15 +1066,15 @@ void OpcodeTable::Initialize() 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_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_COUNTDOWN, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_IN_BOUNDS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_OUT_OF_BOUNDS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_REQUESTED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_WINNER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_DURABILITY_DAMAGE_DEATH, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, STATUS_NEVER, 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_IN_BOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DUEL_OUT_OF_BOUNDS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + 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_DURABILITY_DAMAGE_DEATH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EMOTE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENABLE_BARBER_SHOP, 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); @@ -1087,7 +1082,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTAL_DAMAGE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EQUIPMENT_SET_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPECTED_SPAM_RECORDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_EXPLORATION_EXPERIENCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FACTION_BONUS_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FAILED_PLAYER_CONDITION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_FEATURE_SYSTEM_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1100,32 +1095,34 @@ void OpcodeTable::Initialize() 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_OBJECT_RELINK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_FRIEND_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_CUSTOM_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_DESPAWN, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_DESPAWN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_OBJECT_RESET_STATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_SPEED_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_SET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAME_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ADD_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_ACTIVATED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_LANDMARKS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_LANDMARKS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_COMPLETE_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CREATE_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_CREATE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_DELETE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL2, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_FOLLOWER_CHANGED_XP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_IS_UPGRADEABLE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LANDINGPAGE_SHIPMENTS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_BLUEPRINT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); @@ -1133,105 +1130,100 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_ARCHITECT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_MISSION_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_RECRUITMENT_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_OPEN_TRADESKILL_NPC, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLACE_BUILDING_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_PLACED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_REMOVED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLACE_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_PLACED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_PLOT_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECALL_PORTAL_USED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOTE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_START_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UPGRADE_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_GARRISON_INFO_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_SHIPMENT_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GET_TROPHY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_REQUEST_PLAYER_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_GET_TICKET_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESOLVE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_RESPONSE_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_STATUS_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_CASE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GM_TICKET_SYSTEM_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOD_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GOSSIP_POI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_ACTION_THROTTLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DECLINE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_DESTROYED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_NEW_LEADER, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_DELETED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM); + 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_NEW_LEADER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GROUP_UNINVITE, 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_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_LOG_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_QUERY_RESULTS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_BANK_TEXT_QUERY_RESULT, 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_UPDATE, 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_NEVER, 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_COMMAND_RESULT, 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_EVENT_BANK_CONTENTS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_BANK_MONEY_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_DISBANDED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_LOG_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_MOTD, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_NEW_LEADER, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PLAYER_JOINED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PLAYER_LEFT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_PRESENCE_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_RANKS_UPDATED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_RANK_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_ADDED, STATUS_NEVER, 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_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_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_EVENT_TAB_TEXT_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_FLAGGED_FOR_RENAME, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_INVITE, STATUS_NEVER, 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_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_MEMBERS_WITH_RECIPE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_MEMBER_DAILY_RESET, STATUS_NEVER, 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_NEVER, 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_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_NEVER, 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_PARTY_STATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PERMISSIONS_QUERY_RESULTS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_RANKS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_PARTY_STATE, 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_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_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARD_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ROSTER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_SEND_RANK_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_HEALTH_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_REWARD_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_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_HEALTH_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_HIGHEST_THREAT_UPDATE, STATUS_UNHANDLED, 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_HOTFIX_NOTIFY_BLOB, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INCREASE_CAST_TIME_FOR_SPELL, 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_INITIALIZE_FACTIONS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INITIAL_SETUP, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_PVP, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1249,21 +1241,21 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_ENCOUNTER_TIMER_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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_RESET_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_SAVE_CREATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVALIDATE_PLAYER, STATUS_UNHANDLED, 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_INVENTORY_CHANGE_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_IS_QUEST_COMPLETE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_ENCHANT_TIME_UPDATE, STATUS_NEVER, 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_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_PUSH_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_TIME_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_KICK_REASON, 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); @@ -1299,7 +1291,7 @@ void OpcodeTable::Initialize() 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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_CUF_PROFILES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_EQUIPMENT_SET, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOAD_SELECTED_TROPHY_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGIN_SET_TIME_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1307,32 +1299,32 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_CANCEL_ACK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOGOUT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XP_GAIN, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOG_XP_GAIN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_ALL_PASSED, 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_LIST, 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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_MONEY_NOTIFY, STATUS_UNHANDLED, 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_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_LOOT_RESPONSE, STATUS_UNHANDLED, 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_LOSS_OF_CONTROL_AURA_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_LIST_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_QUERY_NEXT_TIME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MAIL_COMMAND_RESULT, 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_MESSAGE_BOX, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MINIMAP_PING, 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_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MODIFY_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOTD, STATUS_NEVER, 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_INSTANCE); @@ -1398,7 +1390,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNROOT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_FLY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVERING, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_HOVERING, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_INSTANCE); @@ -1422,28 +1414,28 @@ void OpcodeTable::Initialize() 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_MONEY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NOTIFY_RECEIVED_MAIL, 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_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_OPEN_SHIPMENT_NPC_RESULT, 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_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_INVITE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT, STATUS_UNHANDLED, 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_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAUSE_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATE, 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_PENDING_RAID_LOCK, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_ALREADY_SIGNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_RENAME_GUILD_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_LIST, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SHOW_SIGNATURES, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_SIGN_RESULTS, STATUS_NEVER, 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); @@ -1479,9 +1471,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PHASE_SHIFT_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYED_TIME, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_BOUND, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SAVE_GUILD_EMBLEM, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SAVE_GUILD_EMBLEM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_SKINNED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TABARD_VENDOR_ACTIVATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAYER_TABARD_VENDOR_ACTIVATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_MUSIC, STATUS_NEVER, 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); @@ -1494,74 +1486,73 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PLAY_TIME_WARNING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PONG, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_POWER_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRINT_NOTIFICATION, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRE_RESSURECT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PRINT_NOTIFICATION, 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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PROPOSE_LEVEL_GRANT, 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_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_SEASON, 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_CREATURE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GAME_OBJECT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_GUILD_INFO_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_ITEM_TEXT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_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_PET_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUEST_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_CONFIRM_ACCEPT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_COMPLETION_NPC_RESPONSE, 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_REMOVED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_INVALID_QUEST, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_COMPLETE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_DETAILS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_REQUEST_ITEMS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_STATUS_MULTIPLE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_LOG_FULL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_POI_QUERY_RESPONSE, STATUS_NEVER, 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_UPDATE_ADD_CREDIT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_UPDATE_ADD_CREDIT, STATUS_UNHANDLED, 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_NEVER, 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_RAF_EMAIL_ENABLED_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_DIFFICULTY_SET, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_DIFFICULTY_SET, 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_MESSAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOM_ROLL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BATTLEFIELD_INFO, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_COMPLETED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READY_CHECK_STARTED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_RESULT_OK, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_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_RESULT_FAILED, 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_RECRUIT_A_FRIEND_RESPONSE, STATUS_UNHANDLED, 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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFER_A_FRIEND_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_COMPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REFRESH_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_ITEM_PASSIVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REMOVE_LOSS_OF_CONTROL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPLACE_TROPHY_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_PLAYER_AFK_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REPORT_PVP_PLAYER_AFK_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_WOW_TOKEN_MARKET_PRICE_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESEARCH_COMPLETE, 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); @@ -1572,11 +1563,11 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_CAST_BAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_COMMS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESUME_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESURRECT_REQUEST, STATUS_NEVER, 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_NEVER, 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_INFORM, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ROLE_POLL_INFORM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RUNE_REGEN_DEBUG, 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); @@ -1592,14 +1583,14 @@ void OpcodeTable::Initialize() 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_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_ITEM_PASSIVES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_KNOWN_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_ALL, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_RAID_TARGET_UPDATE_SINGLE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_CHARGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + 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_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_SPELL_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SEND_UNLEARN_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1608,22 +1599,21 @@ void OpcodeTable::Initialize() 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_CURRENCY, STATUS_UNHANDLED, 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); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_DUNGEON_DIFFICULTY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_AT_WAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_NOT_VISIBLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_STANDING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_NEVER, 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_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FACTION_VISIBLE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FLAT_SPELL_MODIFIER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_FORCED_REACTIONS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_PCT_SPELL_MODIFIER, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PET_SPECIALIZATION, 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); @@ -1631,45 +1621,46 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_SET_VEHICLE_REC_ID, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_MAILBOX, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SHOW_BANK, STATUS_UNHANDLED, 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_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, 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_SPELL_CHANNEL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CHANNEL_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ABSORB_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CHANNEL_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_CHANNEL_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_COOLDOWN, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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_DISPELL_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_NEVER, 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_NEVER, 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_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_UNHANDLED, 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_NON_MELEE_DAMAGE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_OR_DAMAGE_IMMUNE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PERIODIC_AURA_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_PERIODIC_AURA_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_UNHANDLED, 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_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_STAND_STATE_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_STAND_STATE_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_NEVER, 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_ELAPSED_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_MIRROR_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STOP_SPEAKERBOT_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_STREAMING_MOVIES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUMMON_CANCEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1681,70 +1672,78 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SUSPEND_TOKEN, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TALENTS_INVOLUNTARILY_RESET, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TAXI_NODE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_CLEAR, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TEXT_EMOTE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_CLEAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_REMOVE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_THREAT_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_ADJUSTMENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TIME_SYNC_REQUEST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_LOST, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TOKEN_UNK1, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TITLE_EARNED, 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_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRADE_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_BUY_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRAINER_LIST, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_ABORTED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRANSFER_PENDING, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_CINEMATIC, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TRIGGER_MOVIE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TURN_IN_PETITION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_TUTORIAL_FLAGS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_TWITTER_STATUS, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_TWITTER_STATUS, STATUS_UNHANDLED, 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_UNLEARNED_SPELLS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UNLEARNED_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACCOUNT_DATA, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_ACTION_BUTTONS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_CHARACTER_FLAGS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_EXPANSION_LEVEL, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_OWNERSHIP, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_LAST_INSTANCE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_OBJECT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TALENT_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WORLD_STATE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_ADD, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_REMOVE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USERLIST_UPDATE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_USE_EQUIPMENT_SET_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VENDOR_INVENTORY, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VIGNETTE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_CHAT_STATUS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_PARENTAL_CONTROLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_LEAVE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOICE_SESSION_ROSTER_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_ITEM_SWAP_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_CONTENTS, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_STORAGE_TRANSFER_CHANGES, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_VOID_TRANSFER_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_FINISH, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WAIT_QUEUE_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARDEN_DATA, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEATHER, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WEEKLY_SPELL_USAGE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WHO_IS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_SERVER_INFO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_WORLD_TEXT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_AUCTION_SOLD, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_REDEEM_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ABORTED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_XP_GAIN_ENABLED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ZONE_UNDER_ATTACK, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index a17fe288ce6..a63d68b4636 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -43,1605 +43,1603 @@ enum OpcodeMisc : uint32 NULL_OPCODE = 0xBADD }; -// CMSGs 6.1.2.19802 enum OpcodeClient : uint32 { - CMSG_ACCEPT_GUILD_INVITE = 0x0B36, - CMSG_ACCEPT_LEVEL_GRANT = 0x18F2, - CMSG_ACCEPT_TRADE = 0x0F07, - CMSG_ACCEPT_WARGAME_INVITE = 0x0E3F, - CMSG_ACTIVATE_TAXI = 0x1E83, - CMSG_ADD_BATTLENET_FRIEND = 0x0335, - CMSG_ADD_FRIEND = 0x039E, - CMSG_ADD_IGNORE = 0x16A0, - CMSG_ADD_TOY = 0x1E48, - CMSG_ALTER_APPEARANCE = 0x0F82, - CMSG_AREA_SPIRIT_HEALER_QUERY = 0x1825, - CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x0E81, - CMSG_AREA_TRIGGER = 0x0BDB, - CMSG_ATTACK_STOP = 0x0A01, - CMSG_ATTACK_SWING = 0x0BF4, - CMSG_AUCTION_HELLO_REQUEST = 0x1F82, - CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x1821, - CMSG_AUCTION_LIST_ITEMS = 0x0CB6, - CMSG_AUCTION_LIST_OWNER_ITEMS = 0x08A5, - CMSG_AUCTION_LIST_PENDING_SALES = 0x0935, - CMSG_AUCTION_PLACE_BID = 0x18F6, - CMSG_AUCTION_REMOVE_ITEM = 0x1C32, - CMSG_AUCTION_REPLICATE_ITEMS = 0x0E82, - CMSG_AUCTION_SELL_ITEM = 0x0D25, - CMSG_AUTH_CONTINUED_SESSION = 0x0376, - CMSG_AUTH_SESSION = 0x03DD, - CMSG_AUTOBANK_ITEM = 0x043F, - CMSG_AUTOBANK_REAGENT = 0x083F, - CMSG_AUTOSTORE_BANK_ITEM = 0x0027, - CMSG_AUTOSTORE_BANK_REAGENT = 0x0040, - CMSG_AUTO_EQUIP_ITEM = 0x0423, - CMSG_AUTO_EQUIP_ITEM_SLOT = 0x0838, - CMSG_AUTO_STORE_BAG_ITEM = 0x0424, - CMSG_BANKER_ACTIVATE = 0x0CA5, - CMSG_BATTLEFIELD_LEAVE = 0x0272, - CMSG_BATTLEFIELD_LIST = 0x0250, - CMSG_BATTLEFIELD_PORT = 0x1D32, - CMSG_BATTLEMASTER_HELLO = 0x1605, - CMSG_BATTLEMASTER_JOIN = 0x1D36, - CMSG_BATTLEMASTER_JOIN_ARENA = 0x0865, - CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x1E01, - CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x0695, - CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x0E3D, - CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x1A1F, - CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x0B1E, - CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x0A1D, - CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x1616, - CMSG_BATTLE_PAY_START_PURCHASE = 0x173F, - CMSG_BATTLE_PET_DELETE_PET = 0x07BD, - CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x079D, - CMSG_BATTLE_PET_MODIFY_NAME = 0x0B37, - CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x0F37, - CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x0396, - CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x17BD, - CMSG_BATTLE_PET_SET_FLAGS = 0x16BD, - CMSG_BATTLE_PET_SUMMON = 0x0A9D, - CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x1A24, - CMSG_BEGIN_TRADE = 0x0E53, - CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0x0F36, - CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0x0F96, - CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0x17BE, - CMSG_BF_MGR_QUEUE_REQUEST = 0x1748, - CMSG_BINDER_ACTIVATE = 0x1C71, - CMSG_BLACK_MARKET_BID_ON_ITEM = 0x1822, - CMSG_BLACK_MARKET_OPEN = 0x0F84, - CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x016D, - CMSG_BUG_REPORT = 0x0B96, - CMSG_BUSY_TRADE = 0x0E2B, - CMSG_BUY_BACK_ITEM = 0x1E84, - CMSG_BUY_BANK_SLOT = 0x1DE2, - CMSG_BUY_ITEM = 0x1CE5, - CMSG_BUY_REAGENT_BANK = 0x1D75, - CMSG_BUY_WOW_TOKEN_CONFIRM = 0x17B8, - CMSG_BUY_WOW_TOKEN_START = 0x1A35, - CMSG_CAGE_BATTLE_PET = 0x0AAB, - CMSG_CALENDAR_ADD_EVENT = 0x0320, - CMSG_CALENDAR_COMPLAIN = 0x1395, - CMSG_CALENDAR_COPY_EVENT = 0x123F, - CMSG_CALENDAR_EVENT_INVITE = 0x02B5, - CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x03B8, - CMSG_CALENDAR_EVENT_RSVP = 0x021E, - CMSG_CALENDAR_EVENT_SIGN_UP = 0x0F3F, - CMSG_CALENDAR_EVENT_STATUS = 0x13B8, - CMSG_CALENDAR_GET = 0x1A38, - CMSG_CALENDAR_GET_EVENT = 0x13BD, - CMSG_CALENDAR_GET_NUM_PENDING = 0x0BB6, - CMSG_CALENDAR_GUILD_FILTER = 0x123D, - CMSG_CALENDAR_REMOVE_EVENT = 0x023F, - CMSG_CALENDAR_REMOVE_INVITE = 0x16B8, - CMSG_CALENDAR_UPDATE_EVENT = 0x0F1E, - CMSG_CANCEL_AURA = 0x12FB, - CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x0821, - CMSG_CANCEL_CAST = 0x058A, - CMSG_CANCEL_CHANNELLING = 0x0F71, - CMSG_CANCEL_GROWTH_AURA = 0x0AA3, - CMSG_CANCEL_MASTER_LOOT_ROLL = 0x06F9, - CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x018A, - CMSG_CANCEL_MOUNT_AURA = 0x012D, - CMSG_CANCEL_QUEUED_SPELL = 0x0EA2, - CMSG_CANCEL_TEMP_ENCHANTMENT = 0x004E, - CMSG_CANCEL_TRADE = 0x0E0F, - CMSG_CAN_DUEL = 0x0A38, - CMSG_CAST_SPELL = 0x1274, - CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x1017, - CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x1503, - CMSG_CHANGE_BAG_SLOT_FLAG = 0x0628, - CMSG_CHANGE_MONUMENT_APPEARANCE = 0x1A48, - CMSG_CHANGE_SUB_GROUP = 0x0AB7, - CMSG_CHARACTER_RENAME_REQUEST = 0x0616, - CMSG_CHAR_CUSTOMIZE = 0x0A3D, - CMSG_CHAR_DELETE = 0x12B8, - CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x0F38, - CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x1199, - CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x1C3D, - CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x1D9A, - CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x1C8D, - CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x1D89, - CMSG_CHAT_ADDON_MESSAGE_RAID = 0x10F9, - CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x10FD, - CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x11B9, - CMSG_CHAT_CHANNEL_BAN = 0x187E, - CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x10D9, - CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x119D, - CMSG_CHAT_CHANNEL_INVITE = 0x142D, - CMSG_CHAT_CHANNEL_KICK = 0x153D, - CMSG_CHAT_CHANNEL_LIST = 0x1999, - CMSG_CHAT_CHANNEL_MODERATE = 0x1C8E, - CMSG_CHAT_CHANNEL_MODERATOR = 0x152D, - CMSG_CHAT_CHANNEL_MUTE = 0x1909, - CMSG_CHAT_CHANNEL_OWNER = 0x15ED, - CMSG_CHAT_CHANNEL_PASSWORD = 0x193A, - CMSG_CHAT_CHANNEL_SET_OWNER = 0x14CA, - CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x141E, - CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x148E, - CMSG_CHAT_CHANNEL_UNBAN = 0x155D, - CMSG_CHAT_CHANNEL_UNMODERATOR = 0x10AE, - CMSG_CHAT_CHANNEL_UNMUTE = 0x109A, - CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x11FE, - CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x10FE, - CMSG_CHAT_CHANNEL_VOICE_OFF = 0x103E, - CMSG_CHAT_CHANNEL_VOICE_ON = 0x1419, - CMSG_CHAT_JOIN_CHANNEL = 0x152A, - CMSG_CHAT_LEAVE_CHANNEL = 0x113D, - CMSG_CHAT_MESSAGE_AFK = 0x185E, - CMSG_CHAT_MESSAGE_CHANNEL = 0x1D8A, - CMSG_CHAT_MESSAGE_DND = 0x183E, - CMSG_CHAT_MESSAGE_EMOTE = 0x1DAA, - CMSG_CHAT_MESSAGE_GUILD = 0x14E9, - CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x14FD, - CMSG_CHAT_MESSAGE_OFFICER = 0x155A, - CMSG_CHAT_MESSAGE_PARTY = 0x14BA, - CMSG_CHAT_MESSAGE_RAID = 0x1CAA, - CMSG_CHAT_MESSAGE_RAID_WARNING = 0x147A, - CMSG_CHAT_MESSAGE_SAY = 0x192A, - CMSG_CHAT_MESSAGE_WHISPER = 0x103A, - CMSG_CHAT_MESSAGE_YELL = 0x1CB9, - CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x1D2A, - CMSG_CHAT_REPORT_FILTERED = 0x159E, - CMSG_CHAT_REPORT_IGNORED = 0x151A, - CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x15FA, - CMSG_CHECK_RAF_EMAIL_ENABLED = 0x1620, - CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x0337, - CMSG_CHOICE_RESPONSE = 0x1FCF, - CMSG_CLEAR_RAID_MARKER = 0x0FDB, - CMSG_CLEAR_TRADE_ITEM = 0x0F7B, - CMSG_CLIENT_PORT_GRAVEYARD = 0x0C65, - CMSG_CLOSE_INTERACTION = 0x1C36, - CMSG_COMMENTATOR_ENABLE = 0x073F, - CMSG_COMMENTATOR_ENTER_INSTANCE = 0x03BD, - CMSG_COMMENTATOR_EXIT_INSTANCE = 0x0698, - CMSG_COMMENTATOR_GET_MAP_INFO = 0x1A40, - CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x171F, - CMSG_COMMENTATOR_START_WARGAME = 0x0637, - CMSG_COMPLAINT = 0x0F40, - CMSG_COMPLETE_ALL_READY_SHIPMENTS = 0x0F06, - CMSG_COMPLETE_CINEMATIC = 0x0CF2, - CMSG_COMPLETE_MOVIE = 0x1E0A, - CMSG_CONFIRM_RESPEC_WIPE = 0x1226, - CMSG_CONNECT_TO_FAILED = 0x0736, - CMSG_CONVERT_RAID = 0x0A98, - CMSG_CREATE_CHARACTER = 0x1636, - CMSG_CREATE_SHIPMENT = 0x010E, - CMSG_DB_QUERY_BULK = 0x039F, - CMSG_DECLINE_GUILD_INVITES = 0x09B1, - CMSG_DECLINE_PETITION = 0x1D66, - CMSG_DELETE_EQUIPMENT_SET = 0x014A, - CMSG_DEL_FRIEND = 0x163F, - CMSG_DEL_IGNORE = 0x03C0, - CMSG_DEPOSIT_REAGENT_BANK = 0x002A, - CMSG_DESTROY_ITEM = 0x0A72, - CMSG_DF_BOOT_PLAYER_VOTE = 0x0EBF, - CMSG_DF_GET_JOIN_STATUS = 0x1236, - CMSG_DF_GET_SYSTEM_INFO = 0x1298, - CMSG_DF_JOIN = 0x1237, - CMSG_DF_LEAVE = 0x029D, - CMSG_DF_PROPOSAL_RESPONSE = 0x0795, - CMSG_DF_READY_CHECK_RESPONSE = 0x06A0, - CMSG_DF_SEARCH_JOIN = 0x1797, - CMSG_DF_SEARCH_LEAVE = 0x0EB7, - CMSG_DF_SET_COMMENT = 0x0615, - CMSG_DF_SET_ROLES = 0x0297, - CMSG_DF_TELEPORT = 0x0FB7, - CMSG_DISCARDED_TIME_SYNC_ACKS = 0x0103, - CMSG_DISMISS_CRITTER = 0x1D21, - CMSG_DO_MASTER_LOOT_ROLL = 0x0409, - CMSG_DO_READY_CHECK = 0x139E, - CMSG_DUEL_RESPONSE = 0x0C62, - CMSG_EJECT_PASSENGER = 0x1AD0, - CMSG_EMOTE = 0x0E03, - CMSG_ENABLE_NAGLE = 0x0B55, - CMSG_ENABLE_TAXI_NODE = 0x0926, - CMSG_ENGINE_SURVEY = 0x0FA0, - CMSG_ENUM_CHARACTERS = 0x1696, - CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x1216, - CMSG_FAR_SIGHT = 0x00EE, - CMSG_GAME_OBJ_REPORT_USE = 0x18B2, - CMSG_GAME_OBJ_USE = 0x08B1, - CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x0651, - CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x1A02, - CMSG_GARRISON_CHECK_UPGRADEABLE = 0x12FA, - CMSG_GARRISON_COMPLETE_MISSION = 0x0BA2, - CMSG_GARRISON_GENERATE_RECRUITS = 0x0FFA, - CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x0EFC, - CMSG_GARRISON_MISSION_BONUS_ROLL = 0x07D2, - CMSG_GARRISON_PURCHASE_BUILDING = 0x1208, - CMSG_GARRISON_RECRUIT_FOLLOWER = 0x0E21, - CMSG_GARRISON_REMOVE_FOLLOWER = 0x0374, - CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x035B, - CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x1B8C, - CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x06DA, - CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x03FA, - CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x16CF, - CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x0BDA, - CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x0AC8, - CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x020D, - CMSG_GARRISON_START_MISSION = 0x0E0E, - CMSG_GARRISON_SWAP_BUILDINGS = 0x0ADB, - CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x0B3E, - CMSG_GET_CHALLENGE_MODE_REWARDS = 0x1118, - CMSG_GET_GARRISON_INFO = 0x072D, - CMSG_GET_ITEM_PURCHASE_DATA = 0x016E, - CMSG_GET_MIRROR_IMAGE_DATA = 0x0E74, - CMSG_GET_PVP_OPTIONS_ENABLED = 0x029E, - CMSG_GET_REMAINING_GAME_TIME = 0x0696, - CMSG_GET_TROPHY_LIST = 0x17D0, - CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x063D, - CMSG_GM_LAG_REPORT = 0x0B3F, - CMSG_GM_SURVEY_SUBMIT = 0x0E15, - CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x0FBE, - CMSG_GM_TICKET_CREATE = 0x0A1E, - CMSG_GM_TICKET_DELETE_TICKET = 0x129E, - CMSG_GM_TICKET_GET_CASE_STATUS = 0x1A3F, - CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x0A18, - CMSG_GM_TICKET_GET_TICKET = 0x0717, - CMSG_GM_TICKET_RESPONSE_RESOLVE = 0x0217, - CMSG_GM_TICKET_UPDATE_TEXT = 0x13A0, - CMSG_GOSSIP_SELECT_OPTION = 0x1E0C, - CMSG_GRANT_LEVEL = 0x1DF1, - CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x1C07, - CMSG_GUILD_ADD_RANK = 0x1953, - CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x1844, - CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x1853, - CMSG_GUILD_BANK_ACTIVATE = 0x0DE2, - CMSG_GUILD_BANK_BUY_TAB = 0x0F09, - CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x0832, - CMSG_GUILD_BANK_LOG_QUERY = 0x1973, - CMSG_GUILD_BANK_QUERY_TAB = 0x1DE5, - CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x1417, - CMSG_GUILD_BANK_SET_TAB_TEXT = 0x1917, - CMSG_GUILD_BANK_SWAP_ITEMS = 0x1C75, - CMSG_GUILD_BANK_TEXT_QUERY = 0x1914, - CMSG_GUILD_BANK_UPDATE_TAB = 0x1F09, - CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x1D61, - CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x1817, - CMSG_GUILD_CHANGE_NAME_REQUEST = 0x1527, - CMSG_GUILD_DECLINE_INVITATION = 0x1967, - CMSG_GUILD_DELETE = 0x1473, - CMSG_GUILD_DELETE_RANK = 0x1864, - CMSG_GUILD_DEMOTE_MEMBER = 0x1453, - CMSG_GUILD_EVENT_LOG_QUERY = 0x1933, - CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x1833, - CMSG_GUILD_GET_RANKS = 0x1533, - CMSG_GUILD_GET_ROSTER = 0x1434, - CMSG_GUILD_INVITE_BY_NAME = 0x0716, - CMSG_GUILD_LEAVE = 0x1168, - CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x1138, - CMSG_GUILD_NEWS_UPDATE_STICKY = 0x1538, - CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x1928, - CMSG_GUILD_PERMISSIONS_QUERY = 0x1878, - CMSG_GUILD_PROMOTE_MEMBER = 0x1147, - CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x1C13, - CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x1063, - CMSG_GUILD_QUERY_NEWS = 0x1573, - CMSG_GUILD_QUERY_RECIPES = 0x1843, - CMSG_GUILD_REPLACE_GUILD_MASTER = 0x1923, - CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x1977, - CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x1167, - CMSG_GUILD_SET_GUILD_MASTER = 0x1316, - CMSG_GUILD_SET_MEMBER_NOTE = 0x1427, - CMSG_GUILD_SET_RANK_PERMISSIONS = 0x1053, - CMSG_GUILD_SHIFT_RANK = 0x1458, - CMSG_GUILD_UPDATE_INFO_TEXT = 0x1507, - CMSG_GUILD_UPDATE_MOTD_TEXT = 0x1C08, - CMSG_HEARTH_AND_RESURRECT = 0x0E0C, - CMSG_IGNORE_TRADE = 0x1A08, - CMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x0F5B, - CMSG_INITIATE_ROLE_POLL = 0x071E, - CMSG_INITIATE_TRADE = 0x1A8C, - CMSG_INSPECT = 0x1C21, - CMSG_INSPECT_PVP = 0x0A9E, - CMSG_INSTANCE_LOCK_RESPONSE = 0x1DE6, - CMSG_ITEM_PURCHASE_REFUND = 0x08B2, - CMSG_ITEM_TEXT_QUERY = 0x037B, - CMSG_JOIN_PET_BATTLE_QUEUE = 0x0F2A, - CMSG_JOIN_RATED_BATTLEGROUND = 0x01AA, - CMSG_KEEP_ALIVE = 0x1737, - CMSG_KEYBOUND_OVERRIDE = 0x0ADA, - CMSG_LEARN_PET_SPECIALIZATION_GROUP = 0x06FA, - CMSG_LEARN_TALENTS = 0x0AAA, - CMSG_LEAVE_GROUP = 0x179E, - CMSG_LEAVE_PET_BATTLE_QUEUE = 0x0751, - CMSG_LFG_LIST_APPLY_TO_GROUP = 0x061F, - CMSG_LFG_LIST_CANCEL_APPLICATION = 0x0BB7, - CMSG_LFG_LIST_DECLINE_APPLICANT = 0x17B6, - CMSG_LFG_LIST_GET_STATUS = 0x0338, - CMSG_LFG_LIST_INVITE_APPLICANT = 0x0A3F, - CMSG_LFG_LIST_INVITE_RESPONSE = 0x0720, - CMSG_LFG_LIST_JOIN = 0x13B6, - CMSG_LFG_LIST_LEAVE = 0x0B20, - CMSG_LFG_LIST_SEARCH = 0x1A1D, - CMSG_LFG_LIST_UPDATE_REQUEST = 0x12B7, - CMSG_LF_GUILD_ADD_RECRUIT = 0x0B9F, - CMSG_LF_GUILD_BROWSE = 0x1A37, - CMSG_LF_GUILD_DECLINE_RECRUIT = 0x1023, - CMSG_LF_GUILD_GET_APPLICATIONS = 0x1548, - CMSG_LF_GUILD_GET_GUILD_POST = 0x1054, - CMSG_LF_GUILD_GET_RECRUITS = 0x1464, - CMSG_LF_GUILD_REMOVE_RECRUIT = 0x1803, - CMSG_LF_GUILD_SET_GUILD_POST = 0x121F, - CMSG_LIST_INVENTORY = 0x1922, - CMSG_LOADING_SCREEN_NOTIFY = 0x13C0, - CMSG_LOAD_SELECTED_TROPHY = 0x0F47, - CMSG_LOGOUT_CANCEL = 0x0F8C, - CMSG_LOGOUT_INSTANT = 0x1CA5, - CMSG_LOGOUT_REQUEST = 0x0CA6, - CMSG_LOG_DISCONNECT = 0x12D5, - CMSG_LOG_STREAMING_ERROR = 0x12D6, - CMSG_LOOT_ITEM = 0x1BAC, - CMSG_LOOT_MONEY = 0x050A, - CMSG_LOOT_RELEASE = 0x1A25, - CMSG_LOOT_ROLL = 0x1F23, - CMSG_LOOT_UNIT = 0x0BF1, - CMSG_LOW_LEVEL_RAID1 = 0x02C0, - CMSG_LOW_LEVEL_RAID2 = 0x0F0B, - CMSG_MAIL_CREATE_TEXT_ITEM = 0x0149, - CMSG_MAIL_DELETE = 0x0A73, - CMSG_MAIL_GET_LIST = 0x1F04, - CMSG_MAIL_MARK_AS_READ = 0x1C31, - CMSG_MAIL_RETURN_TO_SENDER = 0x02A0, - CMSG_MAIL_TAKE_ITEM = 0x0975, - CMSG_MAIL_TAKE_MONEY = 0x0871, - CMSG_MASTER_LOOT_ITEM = 0x06D9, - CMSG_MINIMAP_PING = 0x1218, - CMSG_MISSILE_TRAJECTORY_COLLISION = 0x0B74, - CMSG_MOUNT_SET_FAVORITE = 0x061E, - CMSG_MOUNT_SPECIAL_ANIM = 0x02D1, - CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x090F, - CMSG_MOVE_CHANGE_TRANSPORT = 0x044F, - CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x0404, - CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x055B, - CMSG_MOVE_DISMISS_VEHICLE = 0x085F, - CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x0944, - CMSG_MOVE_FALL_LAND = 0x095F, - CMSG_MOVE_FALL_RESET = 0x0448, - CMSG_MOVE_FEATHER_FALL_ACK = 0x0120, - CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x0148, - CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x004F, - CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x0410, - CMSG_MOVE_FORCE_ROOT_ACK = 0x0008, - CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x044C, - CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x0407, - CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x0110, - CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x0517, - CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x014C, - CMSG_MOVE_FORCE_UNROOT_ACK = 0x054C, - CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x0813, - CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x050B, - CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x0017, - CMSG_MOVE_HEARTBEAT = 0x055C, - CMSG_MOVE_HOVER_ACK = 0x0860, - CMSG_MOVE_JUMP = 0x0158, - CMSG_MOVE_KNOCK_BACK_ACK = 0x040F, - CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x0913, - CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x090C, - CMSG_MOVE_SET_CAN_FLY_ACK = 0x0C03, - CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x054F, - CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x0018, - CMSG_MOVE_SET_FACING = 0x0803, - CMSG_MOVE_SET_FLY = 0x010C, - CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x0557, - CMSG_MOVE_SET_PITCH = 0x080F, - CMSG_MOVE_SET_RELATIVE_POSITION = 0x051B, - CMSG_MOVE_SET_RUN_MODE = 0x0053, - CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x091B, - CMSG_MOVE_SET_WALK_MODE = 0x0843, - CMSG_MOVE_SPLINE_DONE = 0x0514, - CMSG_MOVE_START_ASCEND = 0x0510, - CMSG_MOVE_START_BACKWARD = 0x0147, - CMSG_MOVE_START_DESCEND = 0x0117, - CMSG_MOVE_START_FORWARD = 0x0004, - CMSG_MOVE_START_PITCH_DOWN = 0x004B, - CMSG_MOVE_START_PITCH_UP = 0x0450, - CMSG_MOVE_START_STRAFE_LEFT = 0x0844, - CMSG_MOVE_START_STRAFE_RIGHT = 0x0957, - CMSG_MOVE_START_SWIM = 0x0157, - CMSG_MOVE_START_TURN_LEFT = 0x0918, - CMSG_MOVE_START_TURN_RIGHT = 0x094B, - CMSG_MOVE_STOP = 0x044B, - CMSG_MOVE_STOP_ASCEND = 0x011C, - CMSG_MOVE_STOP_PITCH = 0x045B, - CMSG_MOVE_STOP_STRAFE = 0x084B, - CMSG_MOVE_STOP_SWIM = 0x081B, - CMSG_MOVE_STOP_TURN = 0x0854, - CMSG_MOVE_TELEPORT_ACK = 0x0520, - CMSG_MOVE_TELEPORT_CHEAT = 0x0C0B, - CMSG_MOVE_TIME_SKIPPED = 0x0903, - CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x0548, - CMSG_MOVE_WATER_WALK_ACK = 0x0C07, - CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x0EC8, - CMSG_NEXT_CINEMATIC_CAMERA = 0x0CE1, - CMSG_OBJECT_UPDATE_FAILED = 0x0B2D, - CMSG_OBJECT_UPDATE_RESCUED = 0x0A89, - CMSG_OFFER_PETITION = 0x1A17, - CMSG_OPENING_CINEMATIC = 0x0E0A, - CMSG_OPEN_ITEM = 0x0354, - CMSG_OPEN_MISSION_NPC = 0x0BA9, - CMSG_OPEN_SHIPMENT_NPC = 0x074F, - CMSG_OPEN_TRADESKILL_NPC = 0x06DB, - CMSG_OPT_OUT_OF_LOOT = 0x1F89, - CMSG_PARTY_INVITE = 0x12BD, - CMSG_PARTY_INVITE_RESPONSE = 0x16BF, - CMSG_PARTY_UNINVITE = 0x02B6, - CMSG_PETITION_BUY = 0x1872, - CMSG_PETITION_RENAME_GUILD = 0x0E37, - CMSG_PETITION_SHOW_LIST = 0x0CF5, - CMSG_PETITION_SHOW_SIGNATURES = 0x09B6, - CMSG_PET_ABANDON = 0x09E1, - CMSG_PET_ACTION = 0x09F5, - CMSG_PET_BATTLE_FINAL_NOTIFY = 0x030D, - CMSG_PET_BATTLE_INPUT = 0x071F, - CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x1ACF, - CMSG_PET_BATTLE_QUIT_NOTIFY = 0x0B03, - CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x0B35, - CMSG_PET_BATTLE_REQUEST_PVP = 0x16C8, - CMSG_PET_BATTLE_REQUEST_UPDATE = 0x0A5B, - CMSG_PET_BATTLE_REQUEST_WILD = 0x1FAC, - CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x0EAB, - CMSG_PET_CANCEL_AURA = 0x01E9, - CMSG_PET_CAST_SPELL = 0x1B0A, - CMSG_PET_RENAME = 0x1618, - CMSG_PET_SET_ACTION = 0x0C75, - CMSG_PET_SPELL_AUTOCAST = 0x0CE5, - CMSG_PET_STOP_ATTACK = 0x09A6, - CMSG_PING = 0x12DE, - CMSG_PLAYER_LOGIN = 0x0E98, - CMSG_PROTOCOL_MISMATCH = 0x0356, - CMSG_PUSH_QUEST_TO_PARTY = 0x0DE1, - CMSG_PVP_LOG_DATA = 0x0E08, - CMSG_QUERY_BATTLE_PET_NAME = 0x0AFC, - CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x03B7, - CMSG_QUERY_CORPSE_TRANSPORT = 0x1215, - CMSG_QUERY_COUNTDOWN_TIMER = 0x06F1, - CMSG_QUERY_CREATURE = 0x0FD3, - CMSG_QUERY_GAME_OBJECT = 0x06C8, - CMSG_QUERY_GARRISON_CREATURE_NAME = 0x0F28, - CMSG_QUERY_GUILD_INFO = 0x12BE, - CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x014E, - CMSG_QUERY_NEXT_MAIL_TIME = 0x08B6, - CMSG_QUERY_NPC_TEXT = 0x1E24, - CMSG_QUERY_PAGE_TEXT = 0x1AA2, - CMSG_QUERY_PETITION = 0x0FAC, - CMSG_QUERY_PET_NAME = 0x0E30, - CMSG_QUERY_PLAYER_NAME = 0x0BBD, - CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x0489, - CMSG_QUERY_QUEST_INFO = 0x0FA9, - CMSG_QUERY_REALM_NAME = 0x0F9F, - CMSG_QUERY_SCENARIO_POI = 0x161D, - CMSG_QUERY_TIME = 0x0F0A, - CMSG_QUERY_VOID_STORAGE = 0x03D3, - CMSG_QUEST_CONFIRM_ACCEPT = 0x08A1, - CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x1865, - CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x0DA2, - CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x0CE6, - CMSG_QUEST_GIVER_HELLO = 0x01CE, - CMSG_QUEST_GIVER_QUERY_QUEST = 0x0DA6, - CMSG_QUEST_GIVER_REQUEST_REWARD = 0x19F6, - CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x0DA5, - CMSG_QUEST_GIVER_STATUS_QUERY = 0x0836, - CMSG_QUEST_LOG_REMOVE_QUEST = 0x1DE1, - CMSG_QUEST_POI_QUERY = 0x1240, - CMSG_QUEST_PUSH_RESULT = 0x1F81, - CMSG_QUEUED_MESSAGES_END = 0x027E, - CMSG_RANDOM_ROLL = 0x179F, - CMSG_READY_CHECK_RESPONSE = 0x07B5, - CMSG_READ_ITEM = 0x042A, - CMSG_RECLAIM_CORPSE = 0x0DB1, - CMSG_RECRUIT_A_FRIEND = 0x0F3E, - CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x06BD, - CMSG_REDEEM_WOW_TOKEN_START = 0x03B5, - CMSG_REORDER_CHARACTERS = 0x17B7, - CMSG_REPAIR_ITEM = 0x19A2, - CMSG_REPLACE_TROPHY = 0x0605, - CMSG_REPOP_REQUEST = 0x0D36, - CMSG_REPORT_PVP_PLAYER_AFK = 0x0F0C, - CMSG_REQUEST_ACCOUNT_DATA = 0x0798, - CMSG_REQUEST_BATTLEFIELD_STATUS = 0x039D, - CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x0ED3, - CMSG_REQUEST_CEMETERY_LIST = 0x0FD0, - CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x1B8A, - CMSG_REQUEST_FORCED_REACTIONS = 0x1AAC, - CMSG_REQUEST_GUILD_PARTY_STATE = 0x0B5B, - CMSG_REQUEST_GUILD_REWARDS_LIST = 0x0F2F, - CMSG_REQUEST_HONOR_STATS = 0x1207, - CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x0A02, - CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x0620, - CMSG_REQUEST_PARTY_MEMBER_STATS = 0x0EB8, - CMSG_REQUEST_PET_INFO = 0x19F5, - CMSG_REQUEST_PLAYED_TIME = 0x0750, - CMSG_REQUEST_PVP_REWARDS = 0x06DC, - CMSG_REQUEST_RAID_INFO = 0x0A96, - CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x0A40, - CMSG_REQUEST_RESEARCH_HISTORY = 0x0EA9, - CMSG_REQUEST_STABLED_PETS = 0x01CA, - CMSG_REQUEST_VEHICLE_EXIT = 0x054D, - CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x0FA3, - CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x1E2A, - CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x0E7C, - CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x0718, - CMSG_RESET_CHALLENGE_MODE = 0x1248, - CMSG_RESET_INSTANCES = 0x0A97, - CMSG_RESURRECT_RESPONSE = 0x033E, - CMSG_REVERT_MONUMENT_APPEARANCE = 0x0679, - CMSG_RIDE_VEHICLE_INTERACT = 0x1ED0, - CMSG_SAVE_CUF_PROFILES = 0x0EC7, - CMSG_SAVE_EQUIPMENT_SET = 0x09E2, - CMSG_SAVE_GUILD_EMBLEM = 0x0B0C, - CMSG_SCENE_PLAYBACK_CANCELED = 0x0A8C, - CMSG_SCENE_PLAYBACK_COMPLETE = 0x0BD0, - CMSG_SCENE_TRIGGER_EVENT = 0x0589, - CMSG_SELF_RES = 0x1E0B, - CMSG_SELL_ITEM = 0x1931, - CMSG_SELL_WOW_TOKEN_CONFIRM = 0x031E, - CMSG_SELL_WOW_TOKEN_START = 0x0FB8, - CMSG_SEND_CONTACT_LIST = 0x0EC0, - CMSG_SEND_MAIL = 0x0240, - CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x1335, - CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0x0AB5, - CMSG_SEND_TEXT_EMOTE = 0x01EE, - CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x16D0, - CMSG_SET_ACTION_BAR_TOGGLES = 0x0F81, - CMSG_SET_ACTION_BUTTON = 0x133F, - CMSG_SET_ACTIVE_MOVER = 0x0108, - CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x0298, - CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x035A, - CMSG_SET_ASSISTANT_LEADER = 0x0395, - CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x0AF9, - CMSG_SET_BANK_AUTOSORT_DISABLED = 0x0BA3, - CMSG_SET_BANK_BAG_SLOT_FLAG = 0x0B72, - CMSG_SET_CONTACT_NOTES = 0x0B3D, - CMSG_SET_CURRENCY_FLAGS = 0x065C, - CMSG_SET_DIFFICULTY_ID = 0x0BD3, - CMSG_SET_DUNGEON_DIFFICULTY = 0x0E16, - CMSG_SET_EVERYONE_IS_ASSISTANT = 0x1716, - CMSG_SET_FACTION_AT_WAR = 0x1C66, - CMSG_SET_FACTION_INACTIVE = 0x1862, - CMSG_SET_FACTION_NOT_AT_WAR = 0x0DF2, - CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x12DB, - CMSG_SET_LFG_BONUS_FACTION_ID = 0x0252, - CMSG_SET_LOOT_METHOD = 0x0E3E, - CMSG_SET_LOOT_SPECIALIZATION = 0x0D72, - CMSG_SET_PARTY_ASSIGNMENT = 0x0AB8, - CMSG_SET_PARTY_LEADER = 0x131D, - CMSG_SET_PET_SLOT = 0x1B02, - CMSG_SET_PLAYER_DECLINED_NAMES = 0x1617, - CMSG_SET_PREFERRED_CEMETERY = 0x07DA, - CMSG_SET_PVP = 0x1BC7, - CMSG_SET_RAID_DIFFICULTY = 0x0397, - CMSG_SET_ROLE = 0x0398, - CMSG_SET_SAVED_INSTANCE_EXTEND = 0x0B97, - CMSG_SET_SELECTION = 0x0E8C, - CMSG_SET_SHEATHED = 0x1CB1, - CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x1F2C, - CMSG_SET_SPECIALIZATION = 0x0759, - CMSG_SET_TAXI_BENCHMARK_MODE = 0x0CF6, - CMSG_SET_TITLE = 0x1650, - CMSG_SET_TRADE_CURRENCY = 0x06F2, - CMSG_SET_TRADE_GOLD = 0x0E5A, - CMSG_SET_TRADE_ITEM = 0x0626, - CMSG_SET_USING_PARTY_GARRISON = 0x1A26, - CMSG_SET_WATCHED_FACTION = 0x1E82, - CMSG_SHOWING_CLOAK = 0x0F04, - CMSG_SHOWING_HELM = 0x0C36, - CMSG_SHOW_TRADE_SKILL = 0x1735, - CMSG_SIGN_PETITION = 0x18E5, - CMSG_SILENCE_PARTY_TALKER = 0x1A36, - CMSG_SOCKET_GEMS = 0x0F8B, - CMSG_SORT_BAGS = 0x0AF1, - CMSG_SORT_BANK_BAGS = 0x0659, - CMSG_SORT_REAGENT_BANK_BAGS = 0x06D2, - CMSG_SPELL_CLICK = 0x1DB2, - CMSG_SPIRIT_HEALER_ACTIVATE = 0x1E8A, - CMSG_SPLIT_ITEM = 0x052B, - CMSG_STAND_STATE_CHANGE = 0x01AD, - CMSG_START_SPECTATOR_WAR_GAME = 0x16B5, - CMSG_START_WAR_GAME = 0x12BF, - CMSG_SUMMON_RESPONSE = 0x0740, - CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x06B6, - CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x16C0, - CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x1A16, - CMSG_SUSPEND_COMMS_ACK = 0x1375, - CMSG_SUSPEND_TOKEN_RESPONSE = 0x1255, - CMSG_SWAP_INV_ITEM = 0x003C, - CMSG_SWAP_ITEM = 0x0438, - CMSG_SWAP_SUB_GROUPS = 0x0F98, - CMSG_SWAP_VOID_ITEM = 0x0B02, - CMSG_TABARD_VENDOR_ACTIVATE = 0x07FC, - CMSG_TALK_TO_GOSSIP = 0x1C22, - CMSG_TAXI_NODE_STATUS_QUERY = 0x0CF1, - CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x0E02, - CMSG_TAXI_REQUEST_EARLY_LANDING = 0x0DE6, - CMSG_TELEPORT_TO_UNIT = 0x069D, - CMSG_TIME_ADJUSTMENT_RESPONSE = 0x0554, - CMSG_TIME_SYNC_RESPONSE = 0x0550, - CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x040B, - CMSG_TIME_SYNC_RESPONSE_FAILED = 0x0153, - CMSG_TOGGLE_DIFFICULTY = 0x0FC0, - CMSG_TOGGLE_PVP = 0x1BAB, - CMSG_TOTEM_DESTROYED = 0x19B5, - CMSG_TOY_SET_FAVORITE = 0x02BE, - CMSG_TRAINER_BUY_SPELL = 0x0921, - CMSG_TRAINER_LIST = 0x0D21, - CMSG_TRANSMOGRIFY_ITEMS = 0x03F1, - CMSG_TURN_IN_PETITION = 0x0DF5, - CMSG_TUTORIAL = 0x0E9F, - CMSG_TWITTER_CHECK_STATUS = 0x0CDE, - CMSG_TWITTER_CONNECT = 0x089D, - CMSG_TWITTER_DISCONNECT = 0x0D1A, - CMSG_TWITTER_POST = 0x0FA2, - CMSG_UI_TIME_REQUEST = 0x0316, - CMSG_UNACCEPT_TRADE = 0x0AD1, - CMSG_UNDELETE_CHARACTER = 0x1296, - CMSG_UNLEARN_SKILL = 0x0931, - CMSG_UNLEARN_SPECIALIZATION = 0x0708, - CMSG_UNLOCK_VOID_STORAGE = 0x0AA1, - CMSG_UPDATE_ACCOUNT_DATA = 0x1637, - CMSG_UPDATE_CLIENT_SETTINGS = 0x0218, - CMSG_UPDATE_MISSILE_TRAJECTORY = 0x025A, - CMSG_UPDATE_RAID_TARGET = 0x17A0, - CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x1795, - CMSG_UPDATE_WOW_TOKEN_COUNT = 0x0A16, - CMSG_UPGRADE_GARRISON = 0x1B82, - CMSG_UPGRADE_ITEM = 0x0AA4, - CMSG_USED_FOLLOW = 0x054E, - CMSG_USE_CRITTER_ITEM = 0x0ADC, - CMSG_USE_EQUIPMENT_SET = 0x083C, - CMSG_USE_ITEM = 0x06D0, - CMSG_USE_TOY = 0x0B48, - CMSG_VIOLENCE_LEVEL = 0x0F48, - CMSG_VOICE_ADD_IGNORE = 0x033D, - CMSG_VOICE_DEL_IGNORE = 0x0E95, - CMSG_VOICE_SESSION_ENABLE = 0x1238, - CMSG_VOID_STORAGE_TRANSFER = 0x0E07, - CMSG_WARDEN_DATA = 0x02B8, - CMSG_WHO = 0x079E, - CMSG_WHO_IS = 0x17BF, - CMSG_WORLD_PORT_RESPONSE = 0x061D, - CMSG_WORLD_TELEPORT = 0x0E97, - CMSG_WRAP_ITEM = 0x0528, + CMSG_ACCEPT_GUILD_INVITE = 0x00A6, + CMSG_ACCEPT_LEVEL_GRANT = 0x04D8, + CMSG_ACCEPT_TRADE = 0x10D4, + CMSG_ACCEPT_WARGAME_INVITE = 0x0A11, + CMSG_ACTIVATE_TAXI = 0x024F, + CMSG_ADD_BATTLENET_FRIEND = 0x04B2, + CMSG_ADD_FRIEND = 0x0035, + CMSG_ADD_IGNORE = 0x00D6, + CMSG_ADD_TOY = 0x16B7, + CMSG_ALTER_APPEARANCE = 0x068F, + CMSG_AREA_SPIRIT_HEALER_QUERY = 0x021B, + CMSG_AREA_SPIRIT_HEALER_QUEUE = 0x02DF, + CMSG_AREA_TRIGGER = 0x1044, + CMSG_ATTACK_STOP = 0x022B, + CMSG_ATTACK_SWING = 0x1D58, + CMSG_AUCTION_HELLO_REQUEST = 0x04A0, + CMSG_AUCTION_LIST_BIDDER_ITEMS = 0x0293, + CMSG_AUCTION_LIST_ITEMS = 0x0848, + CMSG_AUCTION_LIST_OWNER_ITEMS = 0x0810, + CMSG_AUCTION_LIST_PENDING_SALES = 0x0887, + CMSG_AUCTION_PLACE_BID = 0x00D3, + CMSG_AUCTION_REMOVE_ITEM = 0x061C, + CMSG_AUCTION_REPLICATE_ITEMS = 0x00DF, + CMSG_AUCTION_SELL_ITEM = 0x0A08, + CMSG_AUTH_CONTINUED_SESSION = 0x06DA, + CMSG_AUTH_SESSION = 0x045A, + CMSG_AUTOBANK_ITEM = 0x0263, + CMSG_AUTOBANK_REAGENT = 0x0352, + CMSG_AUTOSTORE_BANK_ITEM = 0x0364, + CMSG_AUTOSTORE_BANK_REAGENT = 0x076C, + CMSG_AUTO_EQUIP_ITEM = 0x0A64, + CMSG_AUTO_EQUIP_ITEM_SLOT = 0x0612, + CMSG_AUTO_STORE_BAG_ITEM = 0x0245, + CMSG_BANKER_ACTIVATE = 0x0298, + CMSG_BATTLEFIELD_LEAVE = 0x13F3, + CMSG_BATTLEFIELD_LIST = 0x1553, + CMSG_BATTLEFIELD_PORT = 0x08CB, + CMSG_BATTLEMASTER_HELLO = 0x0C45, + CMSG_BATTLEMASTER_JOIN = 0x02E0, + CMSG_BATTLEMASTER_JOIN_ARENA = 0x00E0, + CMSG_BATTLEMASTER_JOIN_SKIRMISH = 0x025C, + CMSG_BATTLENET_CHALLENGE_RESPONSE = 0x0725, + CMSG_BATTLE_PAY_ACK_FAILED_RESPONSE = 0x0721, + CMSG_BATTLE_PAY_CONFIRM_PURCHASE_RESPONSE = 0x0621, + CMSG_BATTLE_PAY_DISTRIBUTION_ASSIGN_TO_TARGET = 0x0FB5, + CMSG_BATTLE_PAY_GET_PRODUCT_LIST = 0x0B02, + CMSG_BATTLE_PAY_GET_PURCHASE_LIST = 0x0C21, + CMSG_BATTLE_PAY_START_PURCHASE = 0x0935, + CMSG_BATTLE_PAY_START_VAS_PURCHASE = 0x01A2, + CMSG_BATTLE_PET_DELETE_PET = 0x0AD1, + CMSG_BATTLE_PET_DELETE_PET_CHEAT = 0x0095, + CMSG_BATTLE_PET_MODIFY_NAME = 0x0A92, + CMSG_BATTLE_PET_REQUEST_JOURNAL = 0x0BB1, + CMSG_BATTLE_PET_REQUEST_JOURNAL_LOCK = 0x03B1, + CMSG_BATTLE_PET_SET_BATTLE_SLOT = 0x08D6, + CMSG_BATTLE_PET_SET_FLAGS = 0x07A5, + CMSG_BATTLE_PET_SUMMON = 0x03C1, + CMSG_BATTLE_PET_UPDATE_NOTIFY = 0x0CC2, + CMSG_BEGIN_TRADE = 0x1661, + CMSG_BF_MGR_ENTRY_INVITE_RESPONSE = 0x00B1, + CMSG_BF_MGR_QUEUE_EXIT_REQUEST = 0x0BB6, + CMSG_BF_MGR_QUEUE_INVITE_RESPONSE = 0x01A1, + CMSG_BF_MGR_QUEUE_REQUEST = 0x12E6, + CMSG_BINDER_ACTIVATE = 0x0604, + CMSG_BLACK_MARKET_BID_ON_ITEM = 0x0853, + CMSG_BLACK_MARKET_OPEN = 0x0297, + CMSG_BLACK_MARKET_REQUEST_ITEMS = 0x0A44, + CMSG_BUG_REPORT = 0x0836, + CMSG_BUSY_TRADE = 0x1731, + CMSG_BUY_BACK_ITEM = 0x008C, + CMSG_BUY_BANK_SLOT = 0x0813, + CMSG_BUY_ITEM = 0x08DF, + CMSG_BUY_REAGENT_BANK = 0x00CF, + CMSG_BUY_WOW_TOKEN_CONFIRM = 0x09A2, + CMSG_BUY_WOW_TOKEN_START = 0x0952, + CMSG_CAGE_BATTLE_PET = 0x1448, + CMSG_CALENDAR_ADD_EVENT = 0x0955, + CMSG_CALENDAR_COMPLAIN = 0x0BD5, + CMSG_CALENDAR_COPY_EVENT = 0x0956, + CMSG_CALENDAR_EVENT_INVITE = 0x0FA1, + CMSG_CALENDAR_EVENT_MODERATOR_STATUS = 0x09A5, + CMSG_CALENDAR_EVENT_RSVP = 0x03C2, + CMSG_CALENDAR_EVENT_SIGN_UP = 0x0826, + CMSG_CALENDAR_EVENT_STATUS = 0x01D6, + CMSG_CALENDAR_GET = 0x0B41, + CMSG_CALENDAR_GET_EVENT = 0x06A1, + CMSG_CALENDAR_GET_NUM_PENDING = 0x0AB1, + CMSG_CALENDAR_GUILD_FILTER = 0x0531, + CMSG_CALENDAR_REMOVE_EVENT = 0x03A1, + CMSG_CALENDAR_REMOVE_INVITE = 0x0026, + CMSG_CALENDAR_UPDATE_EVENT = 0x0922, + CMSG_CANCEL_AURA = 0x14D3, + CMSG_CANCEL_AUTO_REPEAT_SPELL = 0x04D0, + CMSG_CANCEL_CAST = 0x1458, + CMSG_CANCEL_CHANNELLING = 0x17F1, + CMSG_CANCEL_GROWTH_AURA = 0x1C04, + CMSG_CANCEL_MASTER_LOOT_ROLL = 0x1375, + CMSG_CANCEL_MOD_SPEED_NO_CONTROL_AURAS = 0x1A31, + CMSG_CANCEL_MOUNT_AURA = 0x1518, + CMSG_CANCEL_QUEUED_SPELL = 0x1225, + CMSG_CANCEL_TEMP_ENCHANTMENT = 0x0697, + CMSG_CANCEL_TRADE = 0x1223, + CMSG_CAN_DUEL = 0x0096, + CMSG_CAST_SPELL = 0x1632, + CMSG_CHALLENGE_MODE_REQUEST_LEADERS = 0x0A09, + CMSG_CHALLENGE_MODE_REQUEST_MAP_STATS = 0x0B49, + CMSG_CHANGE_BAG_SLOT_FLAG = 0x10D8, + CMSG_CHANGE_MONUMENT_APPEARANCE = 0x1C13, + CMSG_CHANGE_SUB_GROUP = 0x04B1, + CMSG_CHARACTER_RENAME_REQUEST = 0x0B06, + CMSG_CHAR_CUSTOMIZE = 0x0DB2, + CMSG_CHAR_DELETE = 0x0DA2, + CMSG_CHAR_RACE_OR_FACTION_CHANGE = 0x09D5, + CMSG_CHAT_ADDON_MESSAGE_CHANNEL = 0x04E9, + CMSG_CHAT_ADDON_MESSAGE_GUILD = 0x0C39, + CMSG_CHAT_ADDON_MESSAGE_INSTANCE_CHAT = 0x05EE, + CMSG_CHAT_ADDON_MESSAGE_OFFICER = 0x0139, + CMSG_CHAT_ADDON_MESSAGE_PARTY = 0x0A7A, + CMSG_CHAT_ADDON_MESSAGE_RAID = 0x0379, + CMSG_CHAT_ADDON_MESSAGE_WHISPER = 0x04AA, + CMSG_CHAT_CHANNEL_ANNOUNCEMENTS = 0x05BE, + CMSG_CHAT_CHANNEL_BAN = 0x057E, + CMSG_CHAT_CHANNEL_DECLINE_INVITE = 0x067E, + CMSG_CHAT_CHANNEL_DISPLAY_LIST = 0x0C6D, + CMSG_CHAT_CHANNEL_INVITE = 0x07AE, + CMSG_CHAT_CHANNEL_KICK = 0x062E, + CMSG_CHAT_CHANNEL_LIST = 0x00BE, + CMSG_CHAT_CHANNEL_MODERATE = 0x036E, + CMSG_CHAT_CHANNEL_MODERATOR = 0x016D, + CMSG_CHAT_CHANNEL_MUTE = 0x002D, + CMSG_CHAT_CHANNEL_OWNER = 0x0ABD, + CMSG_CHAT_CHANNEL_PASSWORD = 0x09ED, + CMSG_CHAT_CHANNEL_SET_OWNER = 0x08A9, + CMSG_CHAT_CHANNEL_SILENCE_ALL = 0x016A, + CMSG_CHAT_CHANNEL_SILENCE_VOICE = 0x03AA, + CMSG_CHAT_CHANNEL_UNBAN = 0x0BF9, + CMSG_CHAT_CHANNEL_UNMODERATOR = 0x02FA, + CMSG_CHAT_CHANNEL_UNMUTE = 0x0629, + CMSG_CHAT_CHANNEL_UNSILENCE_ALL = 0x096E, + CMSG_CHAT_CHANNEL_UNSILENCE_VOICE = 0x07B9, + CMSG_CHAT_CHANNEL_VOICE_OFF = 0x04A9, + CMSG_CHAT_CHANNEL_VOICE_ON = 0x07BD, + CMSG_CHAT_JOIN_CHANNEL = 0x0829, + CMSG_CHAT_LEAVE_CHANNEL = 0x03EE, + CMSG_CHAT_MESSAGE_AFK = 0x05A9, + CMSG_CHAT_MESSAGE_CHANNEL = 0x09FE, + CMSG_CHAT_MESSAGE_DND = 0x01BA, + CMSG_CHAT_MESSAGE_EMOTE = 0x093D, + CMSG_CHAT_MESSAGE_GUILD = 0x0AE9, + CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x07BE, + CMSG_CHAT_MESSAGE_OFFICER = 0x046E, + CMSG_CHAT_MESSAGE_PARTY = 0x012E, + CMSG_CHAT_MESSAGE_RAID = 0x02A9, + CMSG_CHAT_MESSAGE_RAID_WARNING = 0x06FA, + CMSG_CHAT_MESSAGE_SAY = 0x0BB9, + CMSG_CHAT_MESSAGE_WHISPER = 0x0479, + CMSG_CHAT_MESSAGE_YELL = 0x007D, + CMSG_CHAT_REGISTER_ADDON_PREFIXES = 0x0569, + CMSG_CHAT_REPORT_FILTERED = 0x092D, + CMSG_CHAT_REPORT_IGNORED = 0x097D, + CMSG_CHAT_UNREGISTER_ALL_ADDON_PREFIXES = 0x0C7E, + CMSG_CHECK_RAF_EMAIL_ENABLED = 0x0C31, + CMSG_CHECK_WOW_TOKEN_VETERAN_ELIGIBILITY = 0x0946, + CMSG_CHOICE_RESPONSE = 0x17A2, + CMSG_CLEAR_RAID_MARKER = 0x0B2B, + CMSG_CLEAR_TRADE_ITEM = 0x1674, + CMSG_CLIENT_PORT_GRAVEYARD = 0x06A0, + CMSG_CLOSE_INTERACTION = 0x04E0, + CMSG_COMMENTATOR_ENABLE = 0x09C1, + CMSG_COMMENTATOR_ENTER_INSTANCE = 0x0731, + CMSG_COMMENTATOR_EXIT_INSTANCE = 0x0426, + CMSG_COMMENTATOR_GET_MAP_INFO = 0x0916, + CMSG_COMMENTATOR_GET_PLAYER_INFO = 0x02B6, + CMSG_COMMENTATOR_START_WARGAME = 0x0FB1, + CMSG_COMPLAINT = 0x0BD1, + CMSG_COMPLETE_CINEMATIC = 0x06D4, + CMSG_COMPLETE_MOVIE = 0x08DB, + CMSG_CONFIRM_RESPEC_WIPE = 0x1364, + CMSG_CONNECT_TO_FAILED = 0x0821, + CMSG_CONVERT_RAID = 0x02A6, + CMSG_CREATE_CHARACTER = 0x0FA5, + CMSG_CREATE_SHIPMENT = 0x0E16, + CMSG_DB_QUERY_BULK = 0x0A42, + CMSG_DECLINE_GUILD_INVITES = 0x084C, + CMSG_DECLINE_PETITION = 0x02CF, + CMSG_DELETE_EQUIPMENT_SET = 0x0620, + CMSG_DEL_FRIEND = 0x0CB1, + CMSG_DEL_IGNORE = 0x0532, + CMSG_DEPOSIT_REAGENT_BANK = 0x1A73, + CMSG_DESTROY_ITEM = 0x1331, + CMSG_DF_BOOT_PLAYER_VOTE = 0x0911, + CMSG_DF_GET_JOIN_STATUS = 0x07B6, + CMSG_DF_GET_SYSTEM_INFO = 0x04A6, + CMSG_DF_JOIN = 0x0B15, + CMSG_DF_LEAVE = 0x0942, + CMSG_DF_PROPOSAL_RESPONSE = 0x0806, + CMSG_DF_READY_CHECK_RESPONSE = 0x0092, + CMSG_DF_SEARCH_JOIN = 0x0F22, + CMSG_DF_SEARCH_LEAVE = 0x0906, + CMSG_DF_SET_COMMENT = 0x0E21, + CMSG_DF_SET_ROLES = 0x0B56, + CMSG_DF_TELEPORT = 0x0635, + CMSG_DISCARDED_TIME_SYNC_ACKS = 0x1217, + CMSG_DISMISS_CRITTER = 0x0653, + CMSG_DO_MASTER_LOOT_ROLL = 0x08C5, + CMSG_DO_READY_CHECK = 0x0AD6, + CMSG_DUEL_RESPONSE = 0x0248, + CMSG_EJECT_PASSENGER = 0x1D03, + CMSG_EMOTE = 0x0488, + CMSG_ENABLE_NAGLE = 0x065D, + CMSG_ENABLE_TAXI_NODE = 0x0857, + CMSG_ENGINE_SURVEY = 0x0025, + CMSG_ENUM_CHARACTERS = 0x03C6, + CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT = 0x0C22, + CMSG_FAR_SIGHT = 0x040F, + CMSG_GAME_OBJ_REPORT_USE = 0x02D4, + CMSG_GAME_OBJ_USE = 0x068B, + CMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING = 0x0928, + CMSG_GARRISON_CANCEL_CONSTRUCTION = 0x1635, + CMSG_GARRISON_CHECK_UPGRADEABLE = 0x1048, + CMSG_GARRISON_COMPLETE_MISSION = 0x0B2F, + CMSG_GARRISON_GENERATE_RECRUITS = 0x0C81, + CMSG_GARRISON_GET_BUILDING_LANDMARKS = 0x072B, + CMSG_GARRISON_MISSION_BONUS_ROLL = 0x1738, + CMSG_GARRISON_PURCHASE_BUILDING = 0x1A77, + CMSG_GARRISON_RECRUIT_FOLLOWER = 0x1D97, + CMSG_GARRISON_REMOVE_FOLLOWER = 0x1C84, + CMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING = 0x032B, + CMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA = 0x12A3, + CMSG_GARRISON_REQUEST_LANDING_PAGE_SHIPMENT_INFO = 0x12E4, + CMSG_GARRISON_REQUEST_SHIPMENT_INFO = 0x16F4, + CMSG_GARRISON_SET_BUILDING_ACTIVE = 0x1807, + CMSG_GARRISON_SET_FOLLOWER_FAVORITE = 0x0155, + CMSG_GARRISON_SET_FOLLOWER_INACTIVE = 0x1C54, + CMSG_GARRISON_SET_RECRUITMENT_PREFERENCES = 0x1987, + CMSG_GARRISON_START_MISSION = 0x1508, + CMSG_GARRISON_SWAP_BUILDINGS = 0x0824, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x0336, + CMSG_GET_CHALLENGE_MODE_REWARDS = 0x0849, + CMSG_GET_GARRISON_INFO = 0x17E3, + CMSG_GET_ITEM_PURCHASE_DATA = 0x0897, + CMSG_GET_MIRROR_IMAGE_DATA = 0x1113, + CMSG_GET_PVP_OPTIONS_ENABLED = 0x0726, + CMSG_GET_REMAINING_GAME_TIME = 0x0032, + CMSG_GET_TROPHY_LIST = 0x12B2, + CMSG_GET_UNDELETE_CHARACTER_COOLDOWN_STATUS = 0x0332, + CMSG_GM_TICKET_ACKNOWLEDGE_SURVEY = 0x0326, + CMSG_GM_TICKET_GET_CASE_STATUS = 0x0892, + CMSG_GM_TICKET_GET_SYSTEM_STATUS = 0x0B21, + CMSG_GOSSIP_SELECT_OPTION = 0x0420, + CMSG_GRANT_LEVEL = 0x0890, + CMSG_GUILD_ADD_BATTLENET_FRIEND = 0x0A5A, + CMSG_GUILD_ADD_RANK = 0x0409, + CMSG_GUILD_ASSIGN_MEMBER_RANK = 0x04C9, + CMSG_GUILD_AUTO_DECLINE_INVITATION = 0x001E, + CMSG_GUILD_BANK_ACTIVATE = 0x0250, + CMSG_GUILD_BANK_BUY_TAB = 0x025F, + CMSG_GUILD_BANK_DEPOSIT_MONEY = 0x04C8, + CMSG_GUILD_BANK_LOG_QUERY = 0x091E, + CMSG_GUILD_BANK_QUERY_TAB = 0x0850, + CMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY_QUERY = 0x004A, + CMSG_GUILD_BANK_SET_TAB_TEXT = 0x060D, + CMSG_GUILD_BANK_SWAP_ITEMS = 0x0847, + CMSG_GUILD_BANK_TEXT_QUERY = 0x0C0D, + CMSG_GUILD_BANK_UPDATE_TAB = 0x0A48, + CMSG_GUILD_BANK_WITHDRAW_MONEY = 0x080F, + CMSG_GUILD_CHALLENGE_UPDATE_REQUEST = 0x0B1D, + CMSG_GUILD_CHANGE_NAME_REQUEST = 0x021A, + CMSG_GUILD_DECLINE_INVITATION = 0x085D, + CMSG_GUILD_DELETE = 0x080E, + CMSG_GUILD_DELETE_RANK = 0x095D, + CMSG_GUILD_DEMOTE_MEMBER = 0x040E, + CMSG_GUILD_EVENT_LOG_QUERY = 0x07CD, + CMSG_GUILD_GET_ACHIEVEMENT_MEMBERS = 0x004D, + CMSG_GUILD_GET_RANKS = 0x030E, + CMSG_GUILD_GET_ROSTER = 0x015A, + CMSG_GUILD_INVITE_BY_NAME = 0x0845, + CMSG_GUILD_LEAVE = 0x044E, + CMSG_GUILD_MEMBER_SEND_SOR_REQUEST = 0x0A0D, + CMSG_GUILD_NEWS_UPDATE_STICKY = 0x0B4E, + CMSG_GUILD_OFFICER_REMOVE_MEMBER = 0x011E, + CMSG_GUILD_PERMISSIONS_QUERY = 0x010A, + CMSG_GUILD_PROMOTE_MEMBER = 0x011A, + CMSG_GUILD_QUERY_MEMBERS_FOR_RECIPE = 0x04CD, + CMSG_GUILD_QUERY_MEMBER_RECIPES = 0x010D, + CMSG_GUILD_QUERY_NEWS = 0x080A, + CMSG_GUILD_QUERY_RECIPES = 0x094A, + CMSG_GUILD_REPLACE_GUILD_MASTER = 0x090E, + CMSG_GUILD_SET_ACHIEVEMENT_TRACKING = 0x014E, + CMSG_GUILD_SET_FOCUSED_ACHIEVEMENT = 0x034E, + CMSG_GUILD_SET_GUILD_MASTER = 0x07A2, + CMSG_GUILD_SET_MEMBER_NOTE = 0x0B59, + CMSG_GUILD_SET_RANK_PERMISSIONS = 0x0A0A, + CMSG_GUILD_SHIFT_RANK = 0x015D, + CMSG_GUILD_UPDATE_INFO_TEXT = 0x0049, + CMSG_GUILD_UPDATE_MOTD_TEXT = 0x05CD, + CMSG_HEARTH_AND_RESURRECT = 0x08CF, + CMSG_IGNORE_TRADE = 0x18C3, + CMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x0282, + CMSG_INITIATE_ROLE_POLL = 0x02A1, + CMSG_INITIATE_TRADE = 0x12F4, + CMSG_INSPECT = 0x004C, + CMSG_INSPECT_PVP = 0x0AB2, + CMSG_INSTANCE_LOCK_RESPONSE = 0x06C7, + CMSG_ITEM_PURCHASE_REFUND = 0x028B, + CMSG_ITEM_TEXT_QUERY = 0x1774, + CMSG_JOIN_PET_BATTLE_QUEUE = 0x0185, + CMSG_JOIN_RATED_BATTLEGROUND = 0x1584, + CMSG_KEEP_ALIVE = 0x0325, + CMSG_KEYBOUND_OVERRIDE = 0x13F5, + CMSG_LEARN_PET_SPECIALIZATION_GROUP = 0x15C8, + CMSG_LEARN_TALENTS = 0x16A3, + CMSG_LEAVE_GROUP = 0x01C2, + CMSG_LEAVE_PET_BATTLE_QUEUE = 0x1637, + CMSG_LFG_LIST_APPLY_TO_GROUP = 0x00D2, + CMSG_LFG_LIST_CANCEL_APPLICATION = 0x0A22, + CMSG_LFG_LIST_DECLINE_APPLICANT = 0x0131, + CMSG_LFG_LIST_GET_STATUS = 0x0D26, + CMSG_LFG_LIST_INVITE_APPLICANT = 0x0931, + CMSG_LFG_LIST_INVITE_RESPONSE = 0x0536, + CMSG_LFG_LIST_JOIN = 0x01B6, + CMSG_LFG_LIST_LEAVE = 0x0E36, + CMSG_LFG_LIST_SEARCH = 0x03D5, + CMSG_LFG_LIST_UPDATE_REQUEST = 0x0FB2, + CMSG_LF_GUILD_ADD_RECRUIT = 0x0941, + CMSG_LF_GUILD_BROWSE = 0x0022, + CMSG_LF_GUILD_DECLINE_RECRUIT = 0x068A, + CMSG_LF_GUILD_GET_APPLICATIONS = 0x054E, + CMSG_LF_GUILD_GET_GUILD_POST = 0x0709, + CMSG_LF_GUILD_GET_RECRUITS = 0x078A, + CMSG_LF_GUILD_REMOVE_RECRUIT = 0x0449, + CMSG_LF_GUILD_SET_GUILD_POST = 0x0926, + CMSG_LIST_INVENTORY = 0x001F, + CMSG_LOADING_SCREEN_NOTIFY = 0x0735, + CMSG_LOAD_SELECTED_TROPHY = 0x1328, + CMSG_LOGOUT_CANCEL = 0x00C8, + CMSG_LOGOUT_INSTANT = 0x0410, + CMSG_LOGOUT_REQUEST = 0x085C, + CMSG_LOG_DISCONNECT = 0x045D, + CMSG_LOG_STREAMING_ERROR = 0x0DD9, + CMSG_LOOT_ITEM = 0x11C3, + CMSG_LOOT_MONEY = 0x0D24, + CMSG_LOOT_RELEASE = 0x17F6, + CMSG_LOOT_ROLL = 0x0B28, + CMSG_LOOT_UNIT = 0x14C8, + CMSG_LOW_LEVEL_RAID1 = 0x0CB6, + CMSG_LOW_LEVEL_RAID2 = 0x0618, + CMSG_MAIL_CREATE_TEXT_ITEM = 0x0660, + CMSG_MAIL_DELETE = 0x1984, + CMSG_MAIL_GET_LIST = 0x0090, + CMSG_MAIL_MARK_AS_READ = 0x029F, + CMSG_MAIL_RETURN_TO_SENDER = 0x0A36, + CMSG_MAIL_TAKE_ITEM = 0x0244, + CMSG_MAIL_TAKE_MONEY = 0x00CC, + CMSG_MASTER_LOOT_ITEM = 0x11C8, + CMSG_MINIMAP_PING = 0x02D2, + CMSG_MISSILE_TRAJECTORY_COLLISION = 0x0568, + CMSG_MOUNT_SET_FAVORITE = 0x01A5, + CMSG_MOUNT_SPECIAL_ANIM = 0x0E28, + CMSG_MOVE_APPLY_MOVEMENT_FORCE_ACK = 0x1B07, + CMSG_MOVE_CHANGE_TRANSPORT = 0x1B13, + CMSG_MOVE_CHANGE_VEHICLE_SEATS = 0x1B58, + CMSG_MOVE_CHARM_TELEPORT_CHEAT = 0x1604, + CMSG_MOVE_DISMISS_VEHICLE = 0x1A84, + CMSG_MOVE_ENABLE_SWIM_TO_FLY_TRANS_ACK = 0x1794, + CMSG_MOVE_FALL_LAND = 0x12C8, + CMSG_MOVE_FALL_RESET = 0x1BC8, + CMSG_MOVE_FEATHER_FALL_ACK = 0x1707, + CMSG_MOVE_FORCE_FLIGHT_BACK_SPEED_CHANGE_ACK = 0x1397, + CMSG_MOVE_FORCE_FLIGHT_SPEED_CHANGE_ACK = 0x1A44, + CMSG_MOVE_FORCE_PITCH_RATE_CHANGE_ACK = 0x12C4, + CMSG_MOVE_FORCE_ROOT_ACK = 0x1747, + CMSG_MOVE_FORCE_RUN_BACK_SPEED_CHANGE_ACK = 0x1A04, + CMSG_MOVE_FORCE_RUN_SPEED_CHANGE_ACK = 0x1383, + CMSG_MOVE_FORCE_SWIM_BACK_SPEED_CHANGE_ACK = 0x1B83, + CMSG_MOVE_FORCE_SWIM_SPEED_CHANGE_ACK = 0x1314, + CMSG_MOVE_FORCE_TURN_RATE_CHANGE_ACK = 0x1683, + CMSG_MOVE_FORCE_UNROOT_ACK = 0x1744, + CMSG_MOVE_FORCE_WALK_SPEED_CHANGE_ACK = 0x1E18, + CMSG_MOVE_GRAVITY_DISABLE_ACK = 0x13D4, + CMSG_MOVE_GRAVITY_ENABLE_ACK = 0x1394, + CMSG_MOVE_HEARTBEAT = 0x1B18, + CMSG_MOVE_HOVER_ACK = 0x1284, + CMSG_MOVE_JUMP = 0x1A18, + CMSG_MOVE_KNOCK_BACK_ACK = 0x1244, + CMSG_MOVE_REMOVE_MOVEMENT_FORCES = 0x1688, + CMSG_MOVE_REMOVE_MOVEMENT_FORCE_ACK = 0x1E07, + CMSG_MOVE_SET_CAN_FLY_ACK = 0x1798, + CMSG_MOVE_SET_CAN_TURN_WHILE_FALLING_ACK = 0x17C7, + CMSG_MOVE_SET_COLLISION_HEIGHT_ACK = 0x1BC7, + CMSG_MOVE_SET_FACING = 0x1A13, + CMSG_MOVE_SET_FLY = 0x1384, + CMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES_ACK = 0x1A97, + CMSG_MOVE_SET_PITCH = 0x1797, + CMSG_MOVE_SET_RELATIVE_POSITION = 0x1388, + CMSG_MOVE_SET_RUN_MODE = 0x1287, + CMSG_MOVE_SET_VEHICLE_REC_ID_ACK = 0x1BD7, + CMSG_MOVE_SET_WALK_MODE = 0x16C4, + CMSG_MOVE_SPLINE_DONE = 0x16C8, + CMSG_MOVE_START_ASCEND = 0x17C4, + CMSG_MOVE_START_BACKWARD = 0x1294, + CMSG_MOVE_START_DESCEND = 0x1B43, + CMSG_MOVE_START_FORWARD = 0x1B97, + CMSG_MOVE_START_PITCH_DOWN = 0x1704, + CMSG_MOVE_START_PITCH_UP = 0x12D7, + CMSG_MOVE_START_STRAFE_LEFT = 0x1A53, + CMSG_MOVE_START_STRAFE_RIGHT = 0x1657, + CMSG_MOVE_START_SWIM = 0x13C8, + CMSG_MOVE_START_TURN_LEFT = 0x1298, + CMSG_MOVE_START_TURN_RIGHT = 0x1A03, + CMSG_MOVE_STOP = 0x1A08, + CMSG_MOVE_STOP_ASCEND = 0x1303, + CMSG_MOVE_STOP_PITCH = 0x1A98, + CMSG_MOVE_STOP_STRAFE = 0x1218, + CMSG_MOVE_STOP_SWIM = 0x1247, + CMSG_MOVE_STOP_TURN = 0x16D7, + CMSG_MOVE_TELEPORT_ACK = 0x17C8, + CMSG_MOVE_TELEPORT_CHEAT = 0x1A57, + CMSG_MOVE_TIME_SKIPPED = 0x1317, + CMSG_MOVE_TOGGLE_COLLISION_CHEAT = 0x1608, + CMSG_MOVE_WATER_WALK_ACK = 0x1754, + CMSG_NEUTRAL_PLAYER_SELECT_FACTION = 0x1237, + CMSG_NEXT_CINEMATIC_CAMERA = 0x0057, + CMSG_OBJECT_UPDATE_FAILED = 0x1C87, + CMSG_OBJECT_UPDATE_RESCUED = 0x1988, + CMSG_OFFER_PETITION = 0x08B1, + CMSG_OPENING_CINEMATIC = 0x0650, + CMSG_OPEN_ITEM = 0x16F2, + CMSG_OPEN_MISSION_NPC = 0x0D64, + CMSG_OPEN_SHIPMENT_NPC = 0x0E92, + CMSG_OPEN_TRADESKILL_NPC = 0x0B24, + CMSG_OPT_OUT_OF_LOOT = 0x0A17, + CMSG_PARTY_INVITE = 0x10C1, + CMSG_PARTY_INVITE_RESPONSE = 0x0736, + CMSG_PARTY_UNINVITE = 0x01B2, + CMSG_PETITION_BUY = 0x00DB, + CMSG_PETITION_RENAME_GUILD = 0x0F26, + CMSG_PETITION_SHOW_LIST = 0x0208, + CMSG_PETITION_SHOW_SIGNATURES = 0x0658, + CMSG_PET_ABANDON = 0x02C3, + CMSG_PET_ACTION = 0x000B, + CMSG_PET_BATTLE_FINAL_NOTIFY = 0x10C8, + CMSG_PET_BATTLE_INPUT = 0x0C25, + CMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH_RESULT = 0x1808, + CMSG_PET_BATTLE_QUIT_NOTIFY = 0x1594, + CMSG_PET_BATTLE_REPLACE_FRONT_PET = 0x0D31, + CMSG_PET_BATTLE_REQUEST_PVP = 0x1DC8, + CMSG_PET_BATTLE_REQUEST_UPDATE = 0x16A8, + CMSG_PET_BATTLE_REQUEST_WILD = 0x13F8, + CMSG_PET_BATTLE_SCRIPT_ERROR_NOTIFY = 0x1C88, + CMSG_PET_CANCEL_AURA = 0x0A4F, + CMSG_PET_CAST_SPELL = 0x13E2, + CMSG_PET_RENAME = 0x09A1, + CMSG_PET_SET_ACTION = 0x06D8, + CMSG_PET_SPELL_AUTOCAST = 0x0083, + CMSG_PET_STOP_ATTACK = 0x0694, + CMSG_PING = 0x0659, + CMSG_PLAYER_LOGIN = 0x0921, + CMSG_PROTOCOL_MISMATCH = 0x0419, + CMSG_PUSH_QUEST_TO_PARTY = 0x044F, + CMSG_PVP_LOG_DATA = 0x1CC3, + CMSG_QUERY_BATTLE_PET_NAME = 0x0B23, + CMSG_QUERY_CORPSE_LOCATION_FROM_CLIENT = 0x05A1, + CMSG_QUERY_CORPSE_TRANSPORT = 0x0B32, + CMSG_QUERY_COUNTDOWN_TIMER = 0x1376, + CMSG_QUERY_CREATURE = 0x1408, + CMSG_QUERY_GAME_OBJECT = 0x17F8, + CMSG_QUERY_GARRISON_CREATURE_NAME = 0x1D14, + CMSG_QUERY_GUILD_INFO = 0x08B5, + CMSG_QUERY_INSPECT_ACHIEVEMENTS = 0x0A4B, + CMSG_QUERY_NEXT_MAIL_TIME = 0x0883, + CMSG_QUERY_NPC_TEXT = 0x1C47, + CMSG_QUERY_PAGE_TEXT = 0x1D94, + CMSG_QUERY_PETITION = 0x1675, + CMSG_QUERY_PET_NAME = 0x17E8, + CMSG_QUERY_PLAYER_NAME = 0x0DA6, + CMSG_QUERY_QUEST_COMPLETION_NPCS = 0x1488, + CMSG_QUERY_QUEST_INFO = 0x0A24, + CMSG_QUERY_REALM_NAME = 0x0951, + CMSG_QUERY_SCENARIO_POI = 0x0236, + CMSG_QUERY_TIME = 0x025B, + CMSG_QUERY_VOID_STORAGE = 0x1814, + CMSG_QUEST_CONFIRM_ACCEPT = 0x0807, + CMSG_QUEST_GIVER_ACCEPT_QUEST = 0x0014, + CMSG_QUEST_GIVER_CHOOSE_REWARD = 0x0084, + CMSG_QUEST_GIVER_COMPLETE_QUEST = 0x0017, + CMSG_QUEST_GIVER_HELLO = 0x009C, + CMSG_QUEST_GIVER_QUERY_QUEST = 0x0A43, + CMSG_QUEST_GIVER_REQUEST_REWARD = 0x0894, + CMSG_QUEST_GIVER_STATUS_MULTIPLE_QUERY = 0x065C, + CMSG_QUEST_GIVER_STATUS_QUERY = 0x0493, + CMSG_QUEST_LOG_REMOVE_QUEST = 0x060B, + CMSG_QUEST_POI_QUERY = 0x05B5, + CMSG_QUEST_PUSH_RESULT = 0x089C, + CMSG_QUEUED_MESSAGES_END = 0x069A, + CMSG_RANDOM_ROLL = 0x0231, + CMSG_READY_CHECK_RESPONSE = 0x0B46, + CMSG_READ_ITEM = 0x1D43, + CMSG_RECLAIM_CORPSE = 0x0287, + CMSG_RECRUIT_A_FRIEND = 0x0031, + CMSG_REDEEM_WOW_TOKEN_CONFIRM = 0x0801, + CMSG_REDEEM_WOW_TOKEN_START = 0x09C6, + CMSG_REORDER_CHARACTERS = 0x0A45, + CMSG_REPAIR_ITEM = 0x0498, + CMSG_REPLACE_TROPHY = 0x0982, + CMSG_REPOP_REQUEST = 0x089F, + CMSG_REPORT_PVP_PLAYER_AFK = 0x04C7, + CMSG_REQUEST_ACCOUNT_DATA = 0x0A46, + CMSG_REQUEST_BATTLEFIELD_STATUS = 0x0122, + CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x0D23, + CMSG_REQUEST_CEMETERY_LIST = 0x15D3, + CMSG_REQUEST_CONQUEST_FORMULA_CONSTANTS = 0x0E02, + CMSG_REQUEST_FORCED_REACTIONS = 0x12E8, + CMSG_REQUEST_GUILD_PARTY_STATE = 0x0868, + CMSG_REQUEST_GUILD_REWARDS_LIST = 0x1407, + CMSG_REQUEST_HONOR_STATS = 0x0146, + CMSG_REQUEST_LFG_LIST_BLACKLIST = 0x1C94, + CMSG_REQUEST_PARTY_JOIN_UPDATES = 0x0121, + CMSG_REQUEST_PARTY_MEMBER_STATS = 0x0851, + CMSG_REQUEST_PET_INFO = 0x0288, + CMSG_REQUEST_PLAYED_TIME = 0x18D8, + CMSG_REQUEST_PVP_REWARDS = 0x1361, + CMSG_REQUEST_RAID_INFO = 0x0A12, + CMSG_REQUEST_RATED_BATTLEFIELD_INFO = 0x1185, + CMSG_REQUEST_RESEARCH_HISTORY = 0x1768, + CMSG_REQUEST_STABLED_PETS = 0x04C4, + CMSG_REQUEST_VEHICLE_EXIT = 0x1843, + CMSG_REQUEST_VEHICLE_NEXT_SEAT = 0x1636, + CMSG_REQUEST_VEHICLE_PREV_SEAT = 0x1737, + CMSG_REQUEST_VEHICLE_SWITCH_SEAT = 0x14C4, + CMSG_REQUEST_WOW_TOKEN_MARKET_PRICE = 0x05B1, + CMSG_RESET_CHALLENGE_MODE = 0x1A75, + CMSG_RESET_INSTANCES = 0x03B2, + CMSG_RESURRECT_RESPONSE = 0x0535, + CMSG_REVERT_MONUMENT_APPEARANCE = 0x062C, + CMSG_RIDE_VEHICLE_INTERACT = 0x1A34, + CMSG_SAVE_CUF_PROFILES = 0x1267, + CMSG_SAVE_EQUIPMENT_SET = 0x04CF, + CMSG_SAVE_GUILD_EMBLEM = 0x0A2B, + CMSG_SCENE_PLAYBACK_CANCELED = 0x0145, + CMSG_SCENE_PLAYBACK_COMPLETE = 0x0F2F, + CMSG_SCENE_TRIGGER_EVENT = 0x1621, + CMSG_SELF_RES = 0x0484, + CMSG_SELL_ITEM = 0x045B, + CMSG_SELL_WOW_TOKEN_CONFIRM = 0x0222, + CMSG_SELL_WOW_TOKEN_START = 0x06B1, + CMSG_SEND_CONTACT_LIST = 0x02D5, + CMSG_SEND_MAIL = 0x0DA1, + CMSG_SEND_SOR_REQUEST_VIA_ADDRESS = 0x02B2, + CMSG_SEND_SOR_REQUEST_VIA_BNET_ACCOUNT_ID = 0x07B2, + CMSG_SEND_TEXT_EMOTE = 0x0A53, + CMSG_SET_ACHIEVEMENTS_HIDDEN = 0x1723, + CMSG_SET_ACTION_BAR_TOGGLES = 0x0418, + CMSG_SET_ACTION_BUTTON = 0x03A5, + CMSG_SET_ACTIVE_MOVER = 0x12C3, + CMSG_SET_ACTIVE_VOICE_CHANNEL = 0x0D32, + CMSG_SET_ADVANCED_COMBAT_LOGGING = 0x0E12, + CMSG_SET_ASSISTANT_LEADER = 0x0C26, + CMSG_SET_BACKPACK_AUTOSORT_DISABLED = 0x1233, + CMSG_SET_BANK_AUTOSORT_DISABLED = 0x0330, + CMSG_SET_BANK_BAG_SLOT_FLAG = 0x1507, + CMSG_SET_CONTACT_NOTES = 0x0901, + CMSG_SET_CURRENCY_FLAGS = 0x0E85, + CMSG_SET_DIFFICULTY_ID = 0x1634, + CMSG_SET_DUNGEON_DIFFICULTY = 0x0EA6, + CMSG_SET_EVERYONE_IS_ASSISTANT = 0x0432, + CMSG_SET_FACTION_AT_WAR = 0x028F, + CMSG_SET_FACTION_INACTIVE = 0x009B, + CMSG_SET_FACTION_NOT_AT_WAR = 0x0A10, + CMSG_SET_INSERT_ITEMS_LEFT_TO_RIGHT = 0x0D63, + CMSG_SET_LFG_BONUS_FACTION_ID = 0x1363, + CMSG_SET_LOOT_METHOD = 0x05A2, + CMSG_SET_LOOT_SPECIALIZATION = 0x0048, + CMSG_SET_PARTY_ASSIGNMENT = 0x0636, + CMSG_SET_PARTY_LEADER = 0x0856, + CMSG_SET_PET_SLOT = 0x0C41, + CMSG_SET_PLAYER_DECLINED_NAMES = 0x0522, + CMSG_SET_PREFERRED_CEMETERY = 0x1C08, + CMSG_SET_PVP = 0x13A1, + CMSG_SET_RAID_DIFFICULTY = 0x0F25, + CMSG_SET_ROLE = 0x0A25, + CMSG_SET_SAVED_INSTANCE_EXTEND = 0x0521, + CMSG_SET_SELECTION = 0x0610, + CMSG_SET_SHEATHED = 0x06DC, + CMSG_SET_SORT_BAGS_RIGHT_TO_LEFT = 0x1268, + CMSG_SET_SPECIALIZATION = 0x17A7, + CMSG_SET_TAXI_BENCHMARK_MODE = 0x04D7, + CMSG_SET_TITLE = 0x1676, + CMSG_SET_TRADE_CURRENCY = 0x0886, + CMSG_SET_TRADE_GOLD = 0x1761, + CMSG_SET_TRADE_ITEM = 0x0152, + CMSG_SET_USING_PARTY_GARRISON = 0x1338, + CMSG_SET_WATCHED_FACTION = 0x0007, + CMSG_SHOWING_CLOAK = 0x0843, + CMSG_SHOWING_HELM = 0x0A5B, + CMSG_SHOW_TRADE_SKILL = 0x01D2, + CMSG_SIGN_PETITION = 0x08D4, + CMSG_SILENCE_PARTY_TALKER = 0x0925, + CMSG_SOCKET_GEMS = 0x0260, + CMSG_SORT_BAGS = 0x16A1, + CMSG_SORT_BANK_BAGS = 0x1A74, + CMSG_SORT_REAGENT_BANK_BAGS = 0x18C8, + CMSG_SPELL_CLICK = 0x0403, + CMSG_SPIRIT_HEALER_ACTIVATE = 0x0A54, + CMSG_SPLIT_ITEM = 0x0370, + CMSG_STAND_STATE_CHANGE = 0x1913, + CMSG_START_SPECTATOR_WAR_GAME = 0x0891, + CMSG_START_WAR_GAME = 0x03A6, + CMSG_SUMMON_RESPONSE = 0x0E25, + CMSG_SUPPORT_TICKET_SUBMIT_BUG = 0x0B55, + CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT = 0x0F35, + CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION = 0x03D6, + CMSG_SUSPEND_COMMS_ACK = 0x0C99, + CMSG_SUSPEND_TOKEN_RESPONSE = 0x0C9E, + CMSG_SWAP_INV_ITEM = 0x0651, + CMSG_SWAP_ITEM = 0x066C, + CMSG_SWAP_SUB_GROUPS = 0x0A52, + CMSG_SWAP_VOID_ITEM = 0x0ED2, + CMSG_TABARD_VENDOR_ACTIVATE = 0x1625, + CMSG_TALK_TO_GOSSIP = 0x04D3, + CMSG_TAXI_NODE_STATUS_QUERY = 0x0284, + CMSG_TAXI_QUERY_AVAILABLE_NODES = 0x0218, + CMSG_TAXI_REQUEST_EARLY_LANDING = 0x088F, + CMSG_TELEPORT_TO_UNIT = 0x0A21, + CMSG_TIME_ADJUSTMENT_RESPONSE = 0x1344, + CMSG_TIME_SYNC_RESPONSE = 0x1A94, + CMSG_TIME_SYNC_RESPONSE_DROPPED = 0x1283, + CMSG_TIME_SYNC_RESPONSE_FAILED = 0x13C7, + CMSG_TOGGLE_DIFFICULTY = 0x0AB6, + CMSG_TOGGLE_PVP = 0x16E4, + CMSG_TOTEM_DESTROYED = 0x0614, + CMSG_TOY_SET_FAVORITE = 0x02D6, + CMSG_TRAINER_BUY_SPELL = 0x0207, + CMSG_TRAINER_LIST = 0x0258, + CMSG_TRANSMOGRIFY_ITEMS = 0x1147, + CMSG_TURN_IN_PETITION = 0x069F, + CMSG_TUTORIAL = 0x0842, + CMSG_TWITTER_CHECK_STATUS = 0x08F4, + CMSG_TWITTER_CONNECT = 0x04A3, + CMSG_TWITTER_DISCONNECT = 0x00AB, + CMSG_TWITTER_POST = 0x12A4, + CMSG_UI_TIME_REQUEST = 0x0905, + CMSG_UNACCEPT_TRADE = 0x1666, + CMSG_UNDELETE_CHARACTER = 0x0DB1, + CMSG_UNLEARN_SKILL = 0x04DB, + CMSG_UNLEARN_SPECIALIZATION = 0x1778, + CMSG_UNLOCK_VOID_STORAGE = 0x032C, + CMSG_UPDATE_ACCOUNT_DATA = 0x0FA2, + CMSG_UPDATE_CLIENT_SETTINGS = 0x0812, + CMSG_UPDATE_MISSILE_TRAJECTORY = 0x13B2, + CMSG_UPDATE_RAID_TARGET = 0x0BD6, + CMSG_UPDATE_VAS_PURCHASE_STATES = 0x0722, + CMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST = 0x0E26, + CMSG_UPDATE_WOW_TOKEN_COUNT = 0x08B2, + CMSG_UPGRADE_GARRISON = 0x1117, + CMSG_UPGRADE_ITEM = 0x1047, + CMSG_USED_FOLLOW = 0x0C46, + CMSG_USE_CRITTER_ITEM = 0x1018, + CMSG_USE_EQUIPMENT_SET = 0x0668, + CMSG_USE_ITEM = 0x1144, + CMSG_USE_TOY = 0x16F1, + CMSG_VIOLENCE_LEVEL = 0x1118, + CMSG_VOICE_ADD_IGNORE = 0x00D5, + CMSG_VOICE_DEL_IGNORE = 0x0425, + CMSG_VOICE_SESSION_ENABLE = 0x08A5, + CMSG_VOID_STORAGE_TRANSFER = 0x0A82, + CMSG_WARDEN_DATA = 0x0AA6, + CMSG_WHO = 0x03A2, + CMSG_WHO_IS = 0x0126, + CMSG_WORLD_PORT_RESPONSE = 0x04B6, + CMSG_WORLD_TELEPORT = 0x0A35, + CMSG_WRAP_ITEM = 0x0363 }; -// SMSGs 6.1.2.19802 enum OpcodeServer : uint32 { - SMSG_ABORT_NEW_WORLD = 0x0740, - SMSG_ACCOUNT_CRITERIA_UPDATE = 0x1635, - SMSG_ACCOUNT_DATA_TIMES = 0x16B8, - SMSG_ACCOUNT_MOUNT_UPDATE = 0x079D, - SMSG_ACCOUNT_TOYS_UPDATE = 0x0E1D, - SMSG_ACHIEVEMENT_DELETED = 0x1CF2, - SMSG_ACHIEVEMENT_EARNED = 0x06C0, - SMSG_ACTIVATE_TAXI_REPLY = 0x0C61, - SMSG_ADDON_INFO = 0x1715, - SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x0F8B, - SMSG_ADD_ITEM_PASSIVE = 0x1DB1, - SMSG_ADD_LOSS_OF_CONTROL = 0x19E2, - SMSG_ADD_RUNE_POWER = 0x1718, - SMSG_ADJUST_SPLINE_DURATION = 0x0E97, - SMSG_AE_LOOT_TARGETS = 0x1835, - SMSG_AE_LOOT_TARGET_ACK = 0x1C72, - SMSG_AI_REACTION = 0x1739, - SMSG_ALL_ACCOUNT_CRITERIA = 0x0392, - SMSG_ALL_ACHIEVEMENT_DATA = 0x163D, - SMSG_ALL_GUILD_ACHIEVEMENTS = 0x14AB, - SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x160F, - SMSG_AREA_SPIRIT_HEALER_TIME = 0x02B7, - SMSG_AREA_TRIGGER_DENIED = 0x1391, - SMSG_AREA_TRIGGER_NO_CORPSE = 0x0297, - SMSG_AREA_TRIGGER_RE_PATH = 0x1F09, - SMSG_AREA_TRIGGER_RE_SHAPE = 0x1A0E, - SMSG_ARENA_ERROR = 0x122E, - SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x1876, - SMSG_ATTACKER_STATE_UPDATE = 0x0EBD, - SMSG_ATTACK_START = 0x1971, - SMSG_ATTACK_STOP = 0x17C0, - SMSG_ATTACK_SWING_ERROR = 0x1D66, - SMSG_ATTACK_SWING_LANDED_LOG = 0x1865, - SMSG_AUCTION_CLOSED_NOTIFICATION = 0x0EA0, - SMSG_AUCTION_COMMAND_RESULT = 0x13B6, - SMSG_AUCTION_HELLO_RESPONSE = 0x1338, - SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x02B9, - SMSG_AUCTION_LIST_ITEMS_RESULT = 0x0E01, - SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x0FA0, - SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x0E1F, - SMSG_AUCTION_OUTBID_NOTIFICATION = 0x073E, - SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x0612, - SMSG_AUCTION_REPLICATE_RESPONSE = 0x161D, - SMSG_AUCTION_WON_NOTIFICATION = 0x161A, - SMSG_AURA_POINTS_DEPLETED = 0x119D, - SMSG_AURA_UPDATE = 0x1999, - SMSG_AUTH_CHALLENGE = 0x007E, - SMSG_AUTH_RESPONSE = 0x18F6, - SMSG_AVAILABLE_VOICE_CHANNEL = 0x15C3, - SMSG_BARBER_SHOP_RESULT = 0x1866, - SMSG_BATTLEFIELD_LIST = 0x0338, - SMSG_BATTLEFIELD_PORT_DENIED = 0x1E82, - SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x0B38, - SMSG_BATTLEFIELD_STATUS_FAILED = 0x0715, - SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x1E8A, - SMSG_BATTLEFIELD_STATUS_NONE = 0x07B7, - SMSG_BATTLEFIELD_STATUS_QUEUED = 0x163F, - SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x0791, - SMSG_BATTLEGROUND_INFO_THROTTLED = 0x12A0, - SMSG_BATTLEGROUND_INIT = 0x1961, - SMSG_BATTLEGROUND_PLAYER_JOINED = 0x1C26, - SMSG_BATTLEGROUND_PLAYER_LEFT = 0x0AA0, - SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x0976, - SMSG_BATTLEGROUND_POINTS = 0x0617, - SMSG_BATTLENET_CHALLENGE_ABORT = 0x0312, - SMSG_BATTLENET_CHALLENGE_START = 0x0961, - SMSG_BATTLE_PAY_ACK_FAILED = 0x09F6, - SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x1716, - SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x0DE1, - SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x058E, - SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x08B6, - SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x120E, - SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x0CE1, - SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x02C0, - SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x1639, - SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x1212, - SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x0F04, - SMSG_BATTLE_PETS_HEALED = 0x162E, - SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x1972, - SMSG_BATTLE_PET_DELETED = 0x0A40, - SMSG_BATTLE_PET_ERROR = 0x1DB2, - SMSG_BATTLE_PET_JOURNAL = 0x1C35, - SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x023F, - SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x1346, - SMSG_BATTLE_PET_LICENSE_CHANGED = 0x131A, - SMSG_BATTLE_PET_RESTORED = 0x1D62, - SMSG_BATTLE_PET_REVOKED = 0x0F0C, - SMSG_BATTLE_PET_TRAP_LEVEL = 0x0638, - SMSG_BATTLE_PET_UPDATES = 0x1340, - SMSG_BF_MGR_DROP_TIMER_CANCELLED = 0x120D, - SMSG_BF_MGR_DROP_TIMER_STARTED = 0x0F98, - SMSG_BF_MGR_EJECTED = 0x121E, - SMSG_BF_MGR_EJECT_PENDING = 0x0F95, - SMSG_BF_MGR_ENTERING = 0x0299, - SMSG_BF_MGR_ENTRY_INVITE = 0x18B1, - SMSG_BF_MGR_QUEUE_INVITE = 0x0B17, - SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0x1631, - SMSG_BF_MGR_QUEUE_STATUS_UPDATE = 0x169A, - SMSG_BF_MGR_STATE_CHANGED = 0x0316, - SMSG_BINDER_CONFIRM = 0x19E5, - SMSG_BIND_POINT_UPDATE = 0x0399, - SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x0DB2, - SMSG_BLACK_MARKET_OPEN_RESULT = 0x18B5, - SMSG_BLACK_MARKET_OUTBID = 0x18E6, - SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x06B6, - SMSG_BLACK_MARKET_WON = 0x1A45, - SMSG_BONUS_ROLL_EMPTY = 0x0A46, - SMSG_BOSS_KILL_CREDIT = 0x0395, - SMSG_BREAK_TARGET = 0x0E02, - SMSG_BUY_FAILED = 0x1337, - SMSG_BUY_SUCCEEDED = 0x1320, - SMSG_CACHE_VERSION = 0x0E09, - SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x0932, - SMSG_CALENDAR_COMMAND_RESULT = 0x0CE5, - SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x1F82, - SMSG_CALENDAR_EVENT_INVITE = 0x0298, - SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x1797, - SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x0835, - SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x0F01, - SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x1922, - SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x09A6, - SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x0A20, - SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x1637, - SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x0738, - SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x061D, - SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x12B7, - SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x05AE, - SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x07B9, - SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x0CF5, - SMSG_CALENDAR_SEND_CALENDAR = 0x0A1F, - SMSG_CALENDAR_SEND_EVENT = 0x17BE, - SMSG_CALENDAR_SEND_NUM_PENDING = 0x129E, - SMSG_CAMERA_SHAKE = 0x1638, - SMSG_CANCEL_AUTO_REPEAT = 0x1931, - SMSG_CANCEL_COMBAT = 0x0220, - SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x10ED, - SMSG_CANCEL_SCENE = 0x0AB8, - SMSG_CANCEL_SPELL_VISUAL = 0x106D, - SMSG_CANCEL_SPELL_VISUAL_KIT = 0x112E, - SMSG_CAN_DUEL_RESULT = 0x1831, - SMSG_CAST_FAILED = 0x1409, - SMSG_CATEGORY_COOLDOWN = 0x15FA, - SMSG_CHALLEGE_MODE_REWARDS = 0x08F5, - SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x0D22, - SMSG_CHALLENGE_MODE_COMPLETE = 0x0A97, - SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x07C0, - SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x13A0, - SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x1976, - SMSG_CHALLENGE_MODE_RESET = 0x1232, - SMSG_CHALLENGE_MODE_START = 0x03B1, - SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x0921, - SMSG_CHANNEL_LIST = 0x14CC, - SMSG_CHANNEL_NOTIFY = 0x15EF, - SMSG_CHANNEL_NOTIFY_JOINED = 0x14C3, - SMSG_CHANNEL_NOTIFY_LEFT = 0x19CF, - SMSG_CHARACTER_LOGIN_FAILED = 0x0FBD, - SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x0872, - SMSG_CHARACTER_RENAME_RESULT = 0x1F81, - SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN = 0x0FBF, - SMSG_CHARACTER_UPGRADE_COMPLETE = 0x063F, - SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x0339, - SMSG_CHARACTER_UPGRADE_STARTED = 0x1732, - SMSG_CHAR_CUSTOMIZE = 0x03B9, - SMSG_CHAR_CUSTOMIZE_FAILED = 0x121A, - SMSG_CHAR_FACTION_CHANGE_RESULT = 0x0F8A, - SMSG_CHAT = 0x11E7, - SMSG_CHAT_AUTO_RESPONDED = 0x14C7, - SMSG_CHAT_DOWN = 0x14E7, - SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x19CB, - SMSG_CHAT_IS_DOWN = 0x15EB, - SMSG_CHAT_NOT_IN_PARTY = 0x19CC, - SMSG_CHAT_PLAYER_AMBIGUOUS = 0x18E3, - SMSG_CHAT_PLAYER_NOTFOUND = 0x19D0, - SMSG_CHAT_RECONNECT = 0x14F0, - SMSG_CHAT_RESTRICTED = 0x19E8, - SMSG_CHAT_SERVER_MESSAGE = 0x14E3, - SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x118E, - SMSG_CHECK_WARGAME_ENTRY = 0x129F, - SMSG_CHUNKED_PACKET = 0x005A, - SMSG_CLEAR_ALL_SPELL_CHARGES = 0x152D, - SMSG_CLEAR_BOSS_EMOTES = 0x18A1, - SMSG_CLEAR_COOLDOWN = 0x0A38, - SMSG_CLEAR_COOLDOWNS = 0x15ED, - SMSG_CLEAR_LOSS_OF_CONTROL = 0x0636, - SMSG_CLEAR_SPELL_CHARGES = 0x10AE, - SMSG_CLEAR_TARGET = 0x1DF5, - SMSG_COIN_REMOVED = 0x069D, - SMSG_COMBAT_EVENT_FAILED = 0x0792, - SMSG_COMMENTATOR_MAP_INFO = 0x02B6, - SMSG_COMMENTATOR_PLAYER_INFO = 0x1A30, - SMSG_COMMENTATOR_STATE_CHANGED = 0x0332, - SMSG_COMPLAINT_RESULT = 0x1C71, - SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x0EBE, - SMSG_COMPRESSED_PACKET = 0x007D, - SMSG_CONNECT_TO = 0x0119, - SMSG_CONQUEST_FORMULA_CONSTANTS = 0x1C75, - SMSG_CONSOLE_WRITE = 0x169F, - SMSG_CONTACT_LIST = 0x039F, - SMSG_CONTROL_UPDATE = 0x0D32, - SMSG_CONVERT_RUNE = 0x052E, - SMSG_COOLDOWN_CHEAT = 0x029D, - SMSG_COOLDOWN_EVENT = 0x0922, - SMSG_CORPSE_LOCATION = 0x0ABF, - SMSG_CORPSE_RECLAIM_DELAY = 0x02BA, - SMSG_CORPSE_TRANSPORT_QUERY = 0x1E2E, - SMSG_CREATE_CHAR = 0x16BA, - SMSG_CREATE_SHIPMENT_RESPONSE = 0x0D61, - SMSG_CRITERIA_DELETED = 0x1E2F, - SMSG_CRITERIA_UPDATE = 0x0716, - SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x133A, - SMSG_CUSTOM_LOAD_SCREEN = 0x1E0E, - SMSG_DAILY_QUESTS_RESET = 0x055B, - SMSG_DAMAGE_CALC_LOG = 0x123D, - SMSG_DANCE_STUDIO_CREATE_RESULT = 0x09E6, - SMSG_DB_REPLY = 0x09A5, - SMSG_DEATH_RELEASE_LOC = 0x0A17, - SMSG_DEFENSE_MESSAGE = 0x11E3, - SMSG_DELETE_CHAR = 0x06B8, - SMSG_DESTROY_ARENA_UNIT = 0x0826, - SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x08B5, - SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x1DE5, - SMSG_DISENCHANT_CREDIT = 0x19A1, - SMSG_DISMOUNT = 0x03BF, - SMSG_DISMOUNT_RESULT = 0x0C62, - SMSG_DISPEL_FAILED = 0x148E, - SMSG_DISPLAY_GAME_ERROR = 0x13B1, - SMSG_DISPLAY_PLAYER_CHOICE = 0x0C76, - SMSG_DISPLAY_PROMOTION = 0x0236, - SMSG_DISPLAY_QUEST_POPUP = 0x0827, - SMSG_DISPLAY_TOAST = 0x1CF1, - SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x162D, - SMSG_DROP_NEW_CONNECTION = 0x011E, - SMSG_DUEL_COMPLETE = 0x1E83, - SMSG_DUEL_COUNTDOWN = 0x0318, - SMSG_DUEL_IN_BOUNDS = 0x0796, - SMSG_DUEL_OUT_OF_BOUNDS = 0x07B1, - SMSG_DUEL_REQUESTED = 0x0BBF, - SMSG_DUEL_WINNER = 0x1299, - SMSG_DURABILITY_DAMAGE_DEATH = 0x1936, - SMSG_EMOTE = 0x0FC0, - SMSG_ENABLE_BARBER_SHOP = 0x17B1, - SMSG_ENCHANTMENT_LOG = 0x0DA6, - SMSG_ENCOUNTER_END = 0x0862, - SMSG_ENCOUNTER_START = 0x171A, - SMSG_ENUM_CHARACTERS_RESULT = 0x18F1, - SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x183E, - SMSG_EQUIPMENT_SET_ID = 0x03B7, - SMSG_EXPECTED_SPAM_RECORDS = 0x18C3, - SMSG_EXPLORATION_EXPERIENCE = 0x0692, - SMSG_FACTION_BONUS_INFO = 0x0E89, - SMSG_FAILED_PLAYER_CONDITION = 0x0A9E, - SMSG_FEATURE_SYSTEM_STATUS = 0x0B3E, - SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x0A1D, - SMSG_FEIGN_DEATH_RESISTED = 0x1CE5, - SMSG_FINAL_CHUNK = 0x001A, - SMSG_FISH_ESCAPED = 0x0A3E, - SMSG_FISH_NOT_HOOKED = 0x0231, - SMSG_FLIGHT_SPLINE_SYNC = 0x1647, - SMSG_FORCED_DEATH_UPDATE = 0x0346, - SMSG_FORCE_ANIM = 0x0F37, - SMSG_FORCE_OBJECT_RELINK = 0x173F, - SMSG_FRIEND_STATUS = 0x0F03, - SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x0DA5, - SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x0797, - SMSG_GAME_OBJECT_DESPAWN = 0x0E0A, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x19AD, - SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x141D, - SMSG_GAME_OBJECT_RESET_STATE = 0x1CB1, - SMSG_GAME_SPEED_SET = 0x1331, - SMSG_GAME_TIME_SET = 0x0F9F, - SMSG_GAME_TIME_UPDATE = 0x0D76, - SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x08A3, - SMSG_GARRISON_ADD_MISSION_RESULT = 0x01DB, - SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x0187, - SMSG_GARRISON_BUILDING_ACTIVATED = 0x00AB, - SMSG_GARRISON_BUILDING_LANDMARKS = 0x0987, - SMSG_GARRISON_BUILDING_REMOVED = 0x08F7, - SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x00F8, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x00F7, - SMSG_GARRISON_CREATE_RESULT = 0x01BB, - SMSG_GARRISON_DELETE_RESULT = 0x01FC, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x01B4, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL2 = 0x0093, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x00AC, - SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x01A8, - SMSG_GARRISON_LANDINGPAGE_SHIPMENTS = 0x1CA5, - SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x08D8, - SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x08AB, - SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x01FB, - SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x08C3, - SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x019C, - SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x088F, - SMSG_GARRISON_OPEN_ARCHITECT = 0x08FB, - SMSG_GARRISON_OPEN_MISSION_NPC = 0x08C0, - SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x018F, - SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x08A4, - SMSG_GARRISON_PLOT_PLACED = 0x00E7, - SMSG_GARRISON_PLOT_REMOVED = 0x01AB, - SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x089B, - SMSG_GARRISON_RECALL_PORTAL_USED = 0x0197, - SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x0088, - SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x01EC, - SMSG_GARRISON_REMOTE_INFO = 0x01B0, - SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x01AC, - SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x098B, - SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x08B4, - SMSG_GARRISON_START_MISSION_RESULT = 0x01E0, - SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x08EB, - SMSG_GARRISON_UPGRADE_RESULT = 0x00B3, - SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x0216, - SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x0DB6, - SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x01D4, - SMSG_GET_GARRISON_INFO_RESULT = 0x0084, - SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x1A10, - SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x1D35, - SMSG_GET_TROPHY_LIST_RESPONSE = 0x0391, - SMSG_GM_PLAYER_INFO = 0x0CB5, - SMSG_GM_REQUEST_PLAYER_INFO = 0x0BC0, - SMSG_GM_TICKET_CASE_STATUS = 0x17B7, - SMSG_GM_TICKET_GET_TICKET_RESPONSE = 0x0B95, - SMSG_GM_TICKET_RESOLVE_RESPONSE = 0x0A37, - SMSG_GM_TICKET_RESPONSE = 0x07B6, - SMSG_GM_TICKET_RESPONSE_ERROR = 0x08A2, - SMSG_GM_TICKET_STATUS_UPDATE = 0x13B7, - SMSG_GM_TICKET_SYSTEM_STATUS = 0x0B16, - SMSG_GM_TICKET_UPDATE = 0x0925, - SMSG_GOD_MODE = 0x0DE2, - SMSG_GOSSIP_COMPLETE = 0x0010, - SMSG_GOSSIP_MESSAGE = 0x0077, - SMSG_GOSSIP_POI = 0x1CA1, - SMSG_GROUP_ACTION_THROTTLED = 0x1F02, - SMSG_GROUP_DECLINE = 0x139F, - SMSG_GROUP_DESTROYED = 0x1395, - SMSG_GROUP_NEW_LEADER = 0x0C32, - SMSG_GROUP_UNINVITE = 0x1318, - SMSG_GUILD_ACHIEVEMENT_DELETED = 0x11AB, - SMSG_GUILD_ACHIEVEMENT_EARNED = 0x14B8, - SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x10B3, - SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x10AB, - SMSG_GUILD_BANK_QUERY_RESULTS = 0x1083, - SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x1588, - SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x10B8, - SMSG_GUILD_CHALLENGE_COMPLETED = 0x14AF, - SMSG_GUILD_CHALLENGE_UPDATE = 0x1183, - SMSG_GUILD_CHANGE_NAME_RESULT = 0x11B4, - SMSG_GUILD_COMMAND_RESULT = 0x10AC, - SMSG_GUILD_CRITERIA_DELETED = 0x118F, - SMSG_GUILD_CRITERIA_UPDATE = 0x14AC, - SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x11AF, - SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x10C0, - SMSG_GUILD_EVENT_DISBANDED = 0x14A3, - SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x119B, - SMSG_GUILD_EVENT_MOTD = 0x10BF, - SMSG_GUILD_EVENT_NEW_LEADER = 0x1587, - SMSG_GUILD_EVENT_PLAYER_JOINED = 0x1198, - SMSG_GUILD_EVENT_PLAYER_LEFT = 0x109B, - SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x10AF, - SMSG_GUILD_EVENT_RANKS_UPDATED = 0x11BC, - SMSG_GUILD_EVENT_RANK_CHANGED = 0x10BC, - SMSG_GUILD_EVENT_TAB_ADDED = 0x1084, - SMSG_GUILD_EVENT_TAB_DELETED = 0x1190, - SMSG_GUILD_EVENT_TAB_MODIFIED = 0x14A8, - SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x1497, - SMSG_GUILD_FLAGGED_FOR_RENAME = 0x14B3, - SMSG_GUILD_INVITE = 0x11C0, - SMSG_GUILD_INVITE_DECLINED = 0x10A7, - SMSG_GUILD_INVITE_EXPIRED = 0x118B, - SMSG_GUILD_KNOWN_RECIPES = 0x11A3, - SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x1090, - SMSG_GUILD_MEMBER_DAILY_RESET = 0x148C, - SMSG_GUILD_MEMBER_RECIPES = 0x1483, - SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x1187, - SMSG_GUILD_MOVED = 0x11A8, - SMSG_GUILD_MOVE_STARTING = 0x14A7, - SMSG_GUILD_NAME_CHANGED = 0x1488, - SMSG_GUILD_NEWS = 0x10A4, - SMSG_GUILD_NEWS_DELETED = 0x149B, - SMSG_GUILD_PARTY_STATE = 0x1094, - SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x1097, - SMSG_GUILD_RANKS = 0x14B0, - SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x149F, - SMSG_GUILD_RESET = 0x119C, - SMSG_GUILD_REWARD_LIST = 0x1494, - SMSG_GUILD_ROSTER = 0x1498, - SMSG_GUILD_ROSTER_UPDATE = 0x1493, - SMSG_GUILD_SEND_RANK_CHANGE = 0x10B7, - SMSG_HEALTH_UPDATE = 0x07BD, - SMSG_HIGHEST_THREAT_UPDATE = 0x0F35, - SMSG_HOTFIX_NOTIFY = 0x1736, - SMSG_HOTFIX_NOTIFY_BLOB = 0x1D71, - SMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x1C8E, - SMSG_INITIALIZE_FACTIONS = 0x1C32, - SMSG_INITIAL_SETUP = 0x0238, - SMSG_INIT_WORLD_STATES = 0x09E1, - SMSG_INSPECT_HONOR_STATS = 0x1740, - SMSG_INSPECT_PVP = 0x12B9, - SMSG_INSPECT_RESULT = 0x1D22, - SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x0C72, - SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x1DB6, - SMSG_INSTANCE_ENCOUNTER_END = 0x16B5, - SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x08E6, - SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x0866, - SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x1717, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x0735, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x0B3D, - SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x1219, - SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x0F89, - SMSG_INSTANCE_ENCOUNTER_START = 0x06B9, - SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x0619, - SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x1C22, - SMSG_INSTANCE_INFO = 0x12B5, - SMSG_INSTANCE_RESET = 0x0825, - SMSG_INSTANCE_RESET_FAILED = 0x0F40, - SMSG_INSTANCE_SAVE_CREATED = 0x0DA2, - SMSG_INVALIDATE_PLAYER = 0x0B9D, - SMSG_INVALID_PROMOTION_CODE = 0x1A16, - SMSG_INVENTORY_CHANGE_FAILURE = 0x07B5, - SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x0063, - SMSG_ITEM_CHANGED = 0x19B5, - SMSG_ITEM_COOLDOWN = 0x0D35, - SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x1E30, - SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x1798, - SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x1620, - SMSG_ITEM_PUSH_RESULT = 0x0B15, - SMSG_ITEM_TIME_UPDATE = 0x1DB5, - SMSG_KICK_REASON = 0x042E, - SMSG_LEARNED_SPELLS = 0x183D, - SMSG_LEARN_TALENT_FAILED = 0x0B9E, - SMSG_LEVEL_UP_INFO = 0x0B36, - SMSG_LFG_BOOT_PLAYER = 0x0E11, - SMSG_LFG_DISABLED = 0x0EBA, - SMSG_LFG_JOIN_RESULT = 0x1B31, - SMSG_LFG_LIST_JOIN_RESULT = 0x0B99, - SMSG_LFG_LIST_SEARCH_RESULTS = 0x0B32, - SMSG_LFG_LIST_SEARCH_STATUS = 0x1A9A, - SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x0F31, - SMSG_LFG_LIST_UPDATE_STATUS = 0x0B12, - SMSG_LFG_OFFER_CONTINUE = 0x0FB9, - SMSG_LFG_PARTY_INFO = 0x1B39, - SMSG_LFG_PLAYER_INFO = 0x0E32, - SMSG_LFG_PLAYER_REWARD = 0x0E91, - SMSG_LFG_PROPOSAL_UPDATE = 0x1B3A, - SMSG_LFG_QUEUE_STATUS = 0x1A91, - SMSG_LFG_READY_CHECK_RESULT = 0x0EB2, - SMSG_LFG_READY_CHECK_UPDATE = 0x0F11, - SMSG_LFG_ROLE_CHECK_UPDATE = 0x1A11, - SMSG_LFG_SEARCH_RESULTS = 0x0E19, - SMSG_LFG_SLOT_INVALID = 0x1AB9, - SMSG_LFG_TELEPORT_DENIED = 0x0FB1, - SMSG_LFG_UPDATE_STATUS = 0x1A92, - SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x118C, - SMSG_LF_GUILD_APPLICATIONS = 0x11BF, - SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x1193, - SMSG_LF_GUILD_BROWSE = 0x1197, - SMSG_LF_GUILD_COMMAND_RESULT = 0x11A0, - SMSG_LF_GUILD_POST = 0x10B0, - SMSG_LF_GUILD_RECRUITS = 0x11BB, - SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x1A0D, - SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x0E3D, - SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x18B2, - SMSG_LOAD_CUF_PROFILES = 0x139A, - SMSG_LOAD_EQUIPMENT_SET = 0x079E, - SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x1D72, - SMSG_LOGIN_SET_TIME_SPEED = 0x0D65, - SMSG_LOGIN_VERIFY_WORLD = 0x0A98, - SMSG_LOGOUT_CANCEL_ACK = 0x08B2, - SMSG_LOGOUT_COMPLETE = 0x0E95, - SMSG_LOGOUT_RESPONSE = 0x0731, - SMSG_LOG_XP_GAIN = 0x0E3E, - SMSG_LOOT_ALL_PASSED = 0x0C26, - SMSG_LOOT_CONTENTS = 0x02BF, - SMSG_LOOT_ITEM_LIST = 0x061F, - SMSG_LOOT_LIST = 0x08E2, - SMSG_LOOT_MONEY_NOTIFY = 0x17A0, - SMSG_LOOT_RELEASE = 0x06B7, - SMSG_LOOT_RELEASE_ALL = 0x1C61, - SMSG_LOOT_REMOVED = 0x0F15, - SMSG_LOOT_RESPONSE = 0x122D, - SMSG_LOOT_ROLL = 0x09B2, - SMSG_LOOT_ROLLS_COMPLETE = 0x0219, - SMSG_LOOT_ROLL_WON = 0x1296, - SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x0737, - SMSG_MAIL_COMMAND_RESULT = 0x17BF, - SMSG_MAIL_LIST_RESULT = 0x0871, - SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x0F8C, - SMSG_MAP_OBJECTIVES_INIT = 0x1238, - SMSG_MAP_OBJ_EVENTS = 0x161F, - SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x1821, - SMSG_MESSAGE_BOX = 0x13BD, - SMSG_MINIMAP_PING = 0x1697, - SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x159E, - SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x151A, - SMSG_MISSILE_CANCEL = 0x1A17, - SMSG_MODIFY_COOLDOWN = 0x0832, - SMSG_MOTD = 0x18E8, - SMSG_MOUNT_RESULT = 0x06BE, - SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x1F50, - SMSG_MOVE_DISABLE_COLLISION = 0x0A2A, - SMSG_MOVE_DISABLE_GRAVITY = 0x1B81, - SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x1EAC, - SMSG_MOVE_ENABLE_COLLISION = 0x1E27, - SMSG_MOVE_ENABLE_GRAVITY = 0x002D, - SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x0BCF, - SMSG_MOVE_KNOCK_BACK = 0x1BA3, - SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x000E, - SMSG_MOVE_ROOT = 0x018A, - SMSG_MOVE_SET_ACTIVE_MOVER = 0x025B, - SMSG_MOVE_SET_CAN_FLY = 0x012A, - SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x0EA1, - SMSG_MOVE_SET_COLLISION_HEIGHT = 0x1BA4, - SMSG_MOVE_SET_COMPOUND_STATE = 0x02D0, - SMSG_MOVE_SET_FEATHER_FALL = 0x0674, - SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x030D, - SMSG_MOVE_SET_FLIGHT_SPEED = 0x046D, - SMSG_MOVE_SET_HOVERING = 0x0B21, - SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x1347, - SMSG_MOVE_SET_LAND_WALK = 0x0AC7, - SMSG_MOVE_SET_NORMAL_FALL = 0x04EE, - SMSG_MOVE_SET_PITCH_RATE = 0x0B2C, - SMSG_MOVE_SET_RUN_BACK_SPEED = 0x03DA, - SMSG_MOVE_SET_RUN_SPEED = 0x1EA9, - SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x0605, - SMSG_MOVE_SET_SWIM_SPEED = 0x1628, - SMSG_MOVE_SET_TURN_RATE = 0x1E24, - SMSG_MOVE_SET_VEHICLE_REC_ID = 0x1A29, - SMSG_MOVE_SET_WALK_SPEED = 0x0F28, - SMSG_MOVE_SET_WATER_WALK = 0x035C, - SMSG_MOVE_SKIP_TIME = 0x0FCF, - SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x1A8A, - SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x1A21, - SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x0254, - SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x0252, - SMSG_MOVE_SPLINE_ROOT = 0x02D1, - SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x0F30, - SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x1F22, - SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x1208, - SMSG_MOVE_SPLINE_SET_FLYING = 0x0B2A, - SMSG_MOVE_SPLINE_SET_HOVER = 0x1B21, - SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x1A28, - SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x037A, - SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x02C8, - SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x0305, - SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x1A8C, - SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x164F, - SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x0A47, - SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x0E22, - SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x035B, - SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x0B09, - SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x1205, - SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x0EAB, - SMSG_MOVE_SPLINE_START_SWIM = 0x1A81, - SMSG_MOVE_SPLINE_STOP_SWIM = 0x1A0B, - SMSG_MOVE_SPLINE_UNROOT = 0x1BA2, - SMSG_MOVE_SPLINE_UNSET_FLYING = 0x1A2C, - SMSG_MOVE_SPLINE_UNSET_HOVER = 0x0E47, - SMSG_MOVE_TELEPORT = 0x1206, - SMSG_MOVE_UNROOT = 0x046E, - SMSG_MOVE_UNSET_CAN_FLY = 0x03DC, - SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x124F, - SMSG_MOVE_UNSET_HOVERING = 0x0651, - SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x0F2B, - SMSG_MOVE_UPDATE = 0x0F2C, - SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x0705, - SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x1A04, - SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x032E, - SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x0628, - SMSG_MOVE_UPDATE_KNOCK_BACK = 0x0273, - SMSG_MOVE_UPDATE_PITCH_RATE = 0x1AAC, - SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x1F47, - SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x1B82, - SMSG_MOVE_UPDATE_RUN_SPEED = 0x06DA, - SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x0B06, - SMSG_MOVE_UPDATE_SWIM_SPEED = 0x1A83, - SMSG_MOVE_UPDATE_TELEPORT = 0x1F21, - SMSG_MOVE_UPDATE_TURN_RATE = 0x000A, - SMSG_MOVE_UPDATE_WALK_SPEED = 0x1F29, - SMSG_MULTIPLE_PACKETS = 0x0039, - SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x1332, - SMSG_NEW_TAXI_PATH = 0x06BA, - SMSG_NEW_WORLD = 0x0A15, - SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x1589, - SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x073F, - SMSG_NOTIFY_MONEY = 0x0B1E, - SMSG_NOTIFY_RECEIVED_MAIL = 0x18E2, - SMSG_OFFER_PETITION_ERROR = 0x1DA2, - SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x0C66, - SMSG_ON_MONSTER_MOVE = 0x0EA9, - SMSG_OPEN_CONTAINER = 0x0235, - SMSG_OPEN_LFG_DUNGEON_FINDER = 0x0E99, - SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x1712, - SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x1230, - SMSG_OVERRIDE_LIGHT = 0x0936, - SMSG_PAGE_TEXT = 0x0E03, - SMSG_PARTY_COMMAND_RESULT = 0x13B5, - SMSG_PARTY_INVITE = 0x0E83, - SMSG_PARTY_KILL_LOG = 0x120F, - SMSG_PARTY_MEMBER_STATE = 0x0335, - SMSG_PARTY_UPDATE = 0x0F02, - SMSG_PAUSE_MIRROR_TIMER = 0x029F, - SMSG_PENDING_RAID_LOCK = 0x071D, - SMSG_PETITION_ALREADY_SIGNED = 0x0F18, - SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x1484, - SMSG_PETITION_SHOW_LIST = 0x0B1F, - SMSG_PETITION_SHOW_SIGNATURES = 0x1CA2, - SMSG_PETITION_SIGN_RESULTS = 0x1C31, - SMSG_PET_ACTION_FEEDBACK = 0x1692, - SMSG_PET_ACTION_SOUND = 0x0875, - SMSG_PET_ADDED = 0x0F83, - SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x1396, - SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x1F01, - SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x0A35, - SMSG_PET_BATTLE_FINAL_ROUND = 0x18B6, - SMSG_PET_BATTLE_FINISHED = 0x19B6, - SMSG_PET_BATTLE_FIRST_ROUND = 0x08A1, - SMSG_PET_BATTLE_INITIAL_UPDATE = 0x17B6, - SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x0962, - SMSG_PET_BATTLE_PVP_CHALLENGE = 0x1A2F, - SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x1C76, - SMSG_PET_BATTLE_QUEUE_STATUS = 0x1612, - SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x0E9E, - SMSG_PET_BATTLE_REQUEST_FAILED = 0x0EB5, - SMSG_PET_BATTLE_ROUND_RESULT = 0x0292, - SMSG_PET_BATTLE_SLOT_UPDATES = 0x1D21, - SMSG_PET_CAST_FAILED = 0x108D, - SMSG_PET_CLEAR_SPELLS = 0x193A, - SMSG_PET_DISMISS_SOUND = 0x0237, - SMSG_PET_GOD_MODE = 0x1C66, - SMSG_PET_GUIDS = 0x0245, - SMSG_PET_LEARNED_SPELLS = 0x1099, - SMSG_PET_MODE = 0x1F0B, - SMSG_PET_NAME_INVALID = 0x0975, - SMSG_PET_SLOT_UPDATED = 0x0640, - SMSG_PET_SPELLS_MESSAGE = 0x14CA, - SMSG_PET_STABLE_LIST = 0x0D36, - SMSG_PET_STABLE_RESULT = 0x0E0C, - SMSG_PET_TAME_FAILURE = 0x0616, - SMSG_PET_UNLEARNED_SPELLS = 0x15CD, - SMSG_PHASE_SHIFT_CHANGE = 0x18A6, - SMSG_PLAYED_TIME = 0x1875, - SMSG_PLAYER_BOUND = 0x1935, - SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x148B, - SMSG_PLAYER_SKINNED = 0x0D21, - SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x139E, - SMSG_PLAY_MUSIC = 0x09F1, - SMSG_PLAY_OBJECT_SOUND = 0x16BF, - SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x0FB6, - SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x191E, - SMSG_PLAY_SCENE = 0x09B1, - SMSG_PLAY_SOUND = 0x1298, - SMSG_PLAY_SPEAKERBOT_SOUND = 0x0F81, - SMSG_PLAY_SPELL_VISUAL = 0x11EA, - SMSG_PLAY_SPELL_VISUAL_KIT = 0x1859, - SMSG_PLAY_TIME_WARNING = 0x0972, - SMSG_PONG = 0x005E, - SMSG_POWER_UPDATE = 0x0F96, - SMSG_PRE_RESSURECT = 0x058D, - SMSG_PRINT_NOTIFICATION = 0x0F3D, - SMSG_PROC_RESIST = 0x0611, - SMSG_PROPOSE_LEVEL_GRANT = 0x1C65, - SMSG_PVP_CREDIT = 0x0B18, - SMSG_PVP_LOG_DATA = 0x063E, - SMSG_PVP_OPTIONS_ENABLED = 0x1E0F, - SMSG_PVP_SEASON = 0x1D61, - SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x17BD, - SMSG_QUERY_CREATURE_RESPONSE = 0x1A15, - SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x1345, - SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x00E0, - SMSG_QUERY_GUILD_INFO_RESPONSE = 0x1194, - SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x1D36, - SMSG_QUERY_NPC_TEXT_RESPONSE = 0x071E, - SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x048E, - SMSG_QUERY_PETITION_RESPONSE = 0x1872, - SMSG_QUERY_PET_NAME_RESPONSE = 0x023D, - SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x0C71, - SMSG_QUERY_QUEST_INFO_RESPONSE = 0x0817, - SMSG_QUERY_TIME_RESPONSE = 0x0CF1, - SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x0540, - SMSG_QUEST_CONFIRM_ACCEPT = 0x054C, - SMSG_QUEST_FORCE_REMOVED = 0x0504, - SMSG_QUEST_GIVER_INVALID_QUEST = 0x0543, - SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x0547, - SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x004C, - SMSG_QUEST_GIVER_QUEST_DETAILS = 0x0534, - SMSG_QUEST_GIVER_QUEST_FAILED = 0x007F, - SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x0843, - SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x0528, - SMSG_QUEST_GIVER_STATUS = 0x052F, - SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x0814, - SMSG_QUEST_LOG_FULL = 0x0508, - SMSG_QUEST_POI_QUERY_RESPONSE = 0x051F, - SMSG_QUEST_PUSH_RESULT = 0x007B, - SMSG_QUEST_UPDATE_ADD_CREDIT = 0x006C, - SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x0070, - SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x005B, - SMSG_QUEST_UPDATE_COMPLETE = 0x0480, - SMSG_QUEST_UPDATE_FAILED = 0x0573, - SMSG_QUEST_UPDATE_FAILED_TIMER = 0x0108, - SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x0695, - SMSG_RAID_DIFFICULTY_SET = 0x0E8B, - SMSG_RAID_GROUP_ONLY = 0x1832, - SMSG_RAID_INSTANCE_MESSAGE = 0x15CB, - SMSG_RAID_MARKERS_CHANGED = 0x18F5, - SMSG_RANDOM_ROLL = 0x1240, - SMSG_RATED_BATTLEFIELD_INFO = 0x0311, - SMSG_READY_CHECK_COMPLETED = 0x0B35, - SMSG_READY_CHECK_RESPONSE = 0x0DF6, - SMSG_READY_CHECK_STARTED = 0x1618, - SMSG_READ_ITEM_RESULT_FAILED = 0x1617, - SMSG_READ_ITEM_RESULT_OK = 0x131E, - SMSG_REALM_QUERY_RESPONSE = 0x0DF2, - SMSG_REALM_SPLIT = 0x1E8C, - SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x08F1, - SMSG_REFER_A_FRIEND_EXPIRED = 0x0C25, - SMSG_REFER_A_FRIEND_FAILURE = 0x0B98, - SMSG_REFRESH_COMPONENT = 0x0E04, - SMSG_REFRESH_SPELL_HISTORY = 0x153D, - SMSG_REMOVE_ITEM_PASSIVE = 0x179D, - SMSG_REMOVE_LOSS_OF_CONTROL = 0x0821, - SMSG_REPLACE_TROPHY_RESPONSE = 0x19B2, - SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x12B2, - SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x1398, - SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x0218, - SMSG_REQUEST_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x1215, - SMSG_RESEARCH_COMPLETE = 0x1335, - SMSG_RESET_COMPRESSION_CONTEXT = 0x0059, - SMSG_RESET_FAILED_NOTIFY = 0x040D, - SMSG_RESET_RANGED_COMBAT_TIMER = 0x171F, - SMSG_RESET_WEEKLY_CURRENCY = 0x18F2, - SMSG_RESPEC_WIPE_CONFIRM = 0x1630, - SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x1A2E, - SMSG_RESUME_CAST_BAR = 0x10F9, - SMSG_RESUME_COMMS = 0x003A, - SMSG_RESUME_TOKEN = 0x0E20, - SMSG_RESURRECT_REQUEST = 0x0CF2, - SMSG_RESYNC_RUNES = 0x06BD, - SMSG_ROLE_CHANGED_INFORM = 0x0F09, - SMSG_ROLE_CHOSEN = 0x0A9A, - SMSG_ROLE_POLL_INFORM = 0x0EC0, - SMSG_RUNE_REGEN_DEBUG = 0x0732, - SMSG_SCENARIO_BOOT = 0x0212, - SMSG_SCENARIO_COMPLETED = 0x1925, - SMSG_SCENARIO_OUT_OF_BOUNDS = 0x16BD, - SMSG_SCENARIO_PO_IS = 0x0CB2, - SMSG_SCENARIO_PROGRESS_UPDATE = 0x1F89, - SMSG_SCENARIO_STATE = 0x0E16, - SMSG_SCENE_OBJECT_EVENT = 0x1DA5, - SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x1792, - SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x1610, - SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x1611, - SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x021E, - SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x0A36, - SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x1E84, - SMSG_SCRIPT_CAST = 0x106A, - SMSG_SELL_RESPONSE = 0x133E, - SMSG_SEND_ITEM_PASSIVES = 0x0CB6, - SMSG_SEND_KNOWN_SPELLS = 0x109A, - SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x1F84, - SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x1F0C, - SMSG_SEND_SPELL_CHARGES = 0x187E, - SMSG_SEND_SPELL_HISTORY = 0x142D, - SMSG_SEND_UNLEARN_SPELLS = 0x155D, - SMSG_SERVER_FIRST_ACHIEVEMENT = 0x11D0, - SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x0337, - SMSG_SERVER_TIME = 0x160D, - SMSG_SETUP_CURRENCY = 0x1CE2, - SMSG_SETUP_RESEARCH_HISTORY = 0x071F, - SMSG_SET_AI_ANIM_KIT = 0x1295, - SMSG_SET_ALL_TASK_PROGRESS = 0x0ABD, - SMSG_SET_ANIM_TIER = 0x0317, - SMSG_SET_CURRENCY = 0x0336, - SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x0FBA, - SMSG_SET_DUNGEON_DIFFICULTY = 0x19F2, - SMSG_SET_FACTION_AT_WAR = 0x0F9D, - SMSG_SET_FACTION_NOT_VISIBLE = 0x1217, - SMSG_SET_FACTION_STANDING = 0x1210, - SMSG_SET_FACTION_VISIBLE = 0x18A5, - SMSG_SET_FLAT_SPELL_MODIFIER = 0x192A, - SMSG_SET_FORCED_REACTIONS = 0x07BA, - SMSG_SET_ITEM_PURCHASE_DATA = 0x179E, - SMSG_SET_LFG_TIME_WALKER = 0x0A92, - SMSG_SET_LOOT_METHOD_FAILED = 0x09B6, - SMSG_SET_MAX_WEEKLY_QUANTITY = 0x0D31, - SMSG_SET_MELEE_ANIM_KIT = 0x0BB5, - SMSG_SET_MOVEMENT_ANIM_KIT = 0x0D25, - SMSG_SET_PCT_SPELL_MODIFIER = 0x1DAA, - SMSG_SET_PET_SPECIALIZATION = 0x1336, + SMSG_ABORT_NEW_WORLD = 0x0895, + SMSG_ACCOUNT_CRITERIA_UPDATE = 0x09C5, + SMSG_ACCOUNT_DATA_TIMES = 0x000C, + SMSG_ACCOUNT_HEIRLOOM_UPDATE = 0x0521, + SMSG_ACCOUNT_MOUNT_UPDATE = 0x085C, + SMSG_ACCOUNT_TOYS_UPDATE = 0x0ACF, + SMSG_ACHIEVEMENT_DELETED = 0x0093, + SMSG_ACHIEVEMENT_EARNED = 0x01A1, + SMSG_ACTIVATE_TAXI_REPLY = 0x0A90, + SMSG_ADDON_INFO = 0x0B21, + SMSG_ADD_BATTLENET_FRIEND_RESPONSE = 0x03A5, + SMSG_ADD_ITEM_PASSIVE = 0x04C7, + SMSG_ADD_LOSS_OF_CONTROL = 0x0CB6, + SMSG_ADD_RUNE_POWER = 0x0288, + SMSG_ADJUST_SPLINE_DURATION = 0x025B, + SMSG_AE_LOOT_TARGETS = 0x02C7, + SMSG_AE_LOOT_TARGET_ACK = 0x0221, + SMSG_AI_REACTION = 0x080B, + SMSG_ALL_ACCOUNT_CRITERIA = 0x0887, + SMSG_ALL_ACHIEVEMENT_DATA = 0x0457, + SMSG_ALL_GUILD_ACHIEVEMENTS = 0x08E3, + SMSG_ARCHAEOLOGY_SURVERY_CAST = 0x0825, + SMSG_AREA_SPIRIT_HEALER_TIME = 0x03D5, + SMSG_AREA_TRIGGER_DENIED = 0x0922, + SMSG_AREA_TRIGGER_NO_CORPSE = 0x0E90, + SMSG_AREA_TRIGGER_RE_PATH = 0x05A5, + SMSG_AREA_TRIGGER_RE_SHAPE = 0x0C13, + SMSG_ARENA_ERROR = 0x0816, + SMSG_ARENA_PREP_OPPONENT_SPECIALIZATIONS = 0x0E50, + SMSG_ATTACKER_STATE_UPDATE = 0x0813, + SMSG_ATTACK_START = 0x01B5, + SMSG_ATTACK_STOP = 0x0C57, + SMSG_ATTACK_SWING_ERROR = 0x0A95, + SMSG_ATTACK_SWING_LANDED_LOG = 0x0526, + SMSG_AUCTION_CLOSED_NOTIFICATION = 0x0C18, + SMSG_AUCTION_COMMAND_RESULT = 0x0B16, + SMSG_AUCTION_HELLO_RESPONSE = 0x0C5B, + SMSG_AUCTION_LIST_BIDDER_ITEMS_RESULT = 0x04A0, + SMSG_AUCTION_LIST_ITEMS_RESULT = 0x0847, + SMSG_AUCTION_LIST_OWNER_ITEMS_RESULT = 0x0287, + SMSG_AUCTION_LIST_PENDING_SALES_RESULT = 0x0EC3, + SMSG_AUCTION_OUTBID_NOTIFICATION = 0x04DB, + SMSG_AUCTION_OWNER_BID_NOTIFICATION = 0x0418, + SMSG_AUCTION_REPLICATE_RESPONSE = 0x0ECB, + SMSG_AUCTION_WON_NOTIFICATION = 0x0636, + SMSG_AURA_POINTS_DEPLETED = 0x0C6D, + SMSG_AURA_UPDATE = 0x0ABD, + SMSG_AUTH_CHALLENGE = 0x1102, + SMSG_AUTH_RESPONSE = 0x0403, + SMSG_AVAILABLE_VOICE_CHANNEL = 0x1659, + SMSG_BARBER_SHOP_RESULT = 0x0E44, + SMSG_BATTLEFIELD_LIST = 0x0454, + SMSG_BATTLEFIELD_PORT_DENIED = 0x0058, + SMSG_BATTLEFIELD_STATUS_ACTIVE = 0x065F, + SMSG_BATTLEFIELD_STATUS_FAILED = 0x0525, + SMSG_BATTLEFIELD_STATUS_NEED_CONFIRMATION = 0x06C8, + SMSG_BATTLEFIELD_STATUS_NONE = 0x0E22, + SMSG_BATTLEFIELD_STATUS_QUEUED = 0x0888, + SMSG_BATTLEFIELD_STATUS_WAIT_FOR_GROUPS = 0x0B26, + SMSG_BATTLEGROUND_INFO_THROTTLED = 0x0B11, + SMSG_BATTLEGROUND_INIT = 0x0A11, + SMSG_BATTLEGROUND_PLAYER_JOINED = 0x00C8, + SMSG_BATTLEGROUND_PLAYER_LEFT = 0x0018, + SMSG_BATTLEGROUND_PLAYER_POSITIONS = 0x0C98, + SMSG_BATTLEGROUND_POINTS = 0x00D6, + SMSG_BATTLENET_CHALLENGE_ABORT = 0x0532, + SMSG_BATTLENET_CHALLENGE_START = 0x0A18, + SMSG_BATTLE_PAY_ACK_FAILED = 0x0F25, + SMSG_BATTLE_PAY_CONFIRM_PURCHASE = 0x0608, + SMSG_BATTLE_PAY_DELIVERY_ENDED = 0x07A2, + SMSG_BATTLE_PAY_DELIVERY_STARTED = 0x0ED3, + SMSG_BATTLE_PAY_DISTRIBUTION_UPDATE = 0x06D0, + SMSG_BATTLE_PAY_GET_DISTRIBUTION_LIST_RESPONSE = 0x04CF, + SMSG_BATTLE_PAY_GET_PRODUCT_LIST_RESPONSE = 0x0295, + SMSG_BATTLE_PAY_GET_PURCHASE_LIST_RESPONSE = 0x0EC4, + SMSG_BATTLE_PAY_PURCHASE_UPDATE = 0x0E14, + SMSG_BATTLE_PAY_START_DISTRIBUTION_ASSIGN_TO_TARGET_RESPONSE = 0x0614, + SMSG_BATTLE_PAY_START_PURCHASE_RESPONSE = 0x0858, + SMSG_BATTLE_PETS_HEALED = 0x0254, + SMSG_BATTLE_PET_CAGE_DATE_ERROR = 0x068F, + SMSG_BATTLE_PET_DELETED = 0x0AD8, + SMSG_BATTLE_PET_ERROR = 0x09A6, + SMSG_BATTLE_PET_JOURNAL = 0x060F, + SMSG_BATTLE_PET_JOURNAL_LOCK_ACQUIRED = 0x0AA0, + SMSG_BATTLE_PET_JOURNAL_LOCK_DENIED = 0x02C4, + SMSG_BATTLE_PET_LICENSE_CHANGED = 0x05B1, + SMSG_BATTLE_PET_RESTORED = 0x0A51, + SMSG_BATTLE_PET_REVOKED = 0x0854, + SMSG_BATTLE_PET_TRAP_LEVEL = 0x0247, + SMSG_BATTLE_PET_UPDATES = 0x0AD5, + SMSG_BF_MGR_DROP_TIMER_CANCELLED = 0x04D4, + SMSG_BF_MGR_DROP_TIMER_STARTED = 0x0617, + SMSG_BF_MGR_EJECTED = 0x0AD2, + SMSG_BF_MGR_EJECT_PENDING = 0x0603, + SMSG_BF_MGR_ENTERING = 0x028B, + SMSG_BF_MGR_ENTRY_INVITE = 0x0FA2, + SMSG_BF_MGR_QUEUE_INVITE = 0x0CC7, + SMSG_BF_MGR_QUEUE_REQUEST_RESPONSE = 0x0250, + SMSG_BF_MGR_QUEUE_STATUS_UPDATE = 0x0684, + SMSG_BF_MGR_STATE_CHANGED = 0x0C20, + SMSG_BINDER_CONFIRM = 0x0497, + SMSG_BIND_POINT_UPDATE = 0x00C4, + SMSG_BLACK_MARKET_BID_ON_ITEM_RESULT = 0x0921, + SMSG_BLACK_MARKET_OPEN_RESULT = 0x0A58, + SMSG_BLACK_MARKET_OUTBID = 0x0226, + SMSG_BLACK_MARKET_REQUEST_ITEMS_RESULT = 0x0A14, + SMSG_BLACK_MARKET_WON = 0x01C5, + SMSG_BONUS_ROLL_EMPTY = 0x000F, + SMSG_BOSS_KILL_CREDIT = 0x06C4, + SMSG_BREAK_TARGET = 0x0A44, + SMSG_BUY_FAILED = 0x0604, + SMSG_BUY_SUCCEEDED = 0x0E26, + SMSG_CACHE_VERSION = 0x0932, + SMSG_CALENDAR_CLEAR_PENDING_ACTION = 0x09C2, + SMSG_CALENDAR_COMMAND_RESULT = 0x0722, + SMSG_CALENDAR_EVENT_INITIAL_INVITES = 0x0C48, + SMSG_CALENDAR_EVENT_INVITE = 0x0284, + SMSG_CALENDAR_EVENT_INVITE_ALERT = 0x0C93, + SMSG_CALENDAR_EVENT_INVITE_MODERATOR_STATUS = 0x0735, + SMSG_CALENDAR_EVENT_INVITE_NOTES = 0x0C53, + SMSG_CALENDAR_EVENT_INVITE_NOTES_ALERT = 0x0243, + SMSG_CALENDAR_EVENT_INVITE_REMOVED = 0x0484, + SMSG_CALENDAR_EVENT_INVITE_REMOVED_ALERT = 0x00D8, + SMSG_CALENDAR_EVENT_INVITE_STATUS = 0x0235, + SMSG_CALENDAR_EVENT_INVITE_STATUS_ALERT = 0x088C, + SMSG_CALENDAR_EVENT_REMOVED_ALERT = 0x09B6, + SMSG_CALENDAR_EVENT_UPDATED_ALERT = 0x0A87, + SMSG_CALENDAR_RAID_LOCKOUT_ADDED = 0x0232, + SMSG_CALENDAR_RAID_LOCKOUT_REMOVED = 0x0C1B, + SMSG_CALENDAR_RAID_LOCKOUT_UPDATED = 0x0CC4, + SMSG_CALENDAR_SEND_CALENDAR = 0x088B, + SMSG_CALENDAR_SEND_EVENT = 0x05B2, + SMSG_CALENDAR_SEND_NUM_PENDING = 0x08B5, + SMSG_CAMERA_SHAKE = 0x0C43, + SMSG_CANCEL_AUTO_REPEAT = 0x0814, + SMSG_CANCEL_COMBAT = 0x020F, + SMSG_CANCEL_ORPHAN_SPELL_VISUAL = 0x01BD, + SMSG_CANCEL_SCENE = 0x0A15, + SMSG_CANCEL_SPELL_VISUAL = 0x006D, + SMSG_CANCEL_SPELL_VISUAL_KIT = 0x0BFA, + SMSG_CAN_DUEL_RESULT = 0x0098, + SMSG_CAST_FAILED = 0x066E, + SMSG_CATEGORY_COOLDOWN = 0x0C7E, + SMSG_CHALLEGE_MODE_REWARDS = 0x00E0, + SMSG_CHALLENGE_MODE_ALL_MAP_STATS = 0x0A22, + SMSG_CHALLENGE_MODE_COMPLETE = 0x0935, + SMSG_CHALLENGE_MODE_MAP_STATS_UPDATE = 0x0810, + SMSG_CHALLENGE_MODE_NEW_PLAYER_RECORD = 0x02D1, + SMSG_CHALLENGE_MODE_REQUEST_LEADERS_RESULT = 0x0453, + SMSG_CHALLENGE_MODE_RESET = 0x0E83, + SMSG_CHALLENGE_MODE_START = 0x068B, + SMSG_CHANGE_PLAYER_DIFFICULTY_RESULT = 0x03B6, + SMSG_CHANNEL_LIST = 0x14DA, + SMSG_CHANNEL_NOTIFY = 0x1699, + SMSG_CHANNEL_NOTIFY_JOINED = 0x1519, + SMSG_CHANNEL_NOTIFY_LEFT = 0x145A, + SMSG_CHARACTER_LOGIN_FAILED = 0x0488, + SMSG_CHARACTER_OBJECT_TEST_RESPONSE = 0x0CE0, + SMSG_CHARACTER_RENAME_RESULT = 0x00A6, + SMSG_CHARACTER_UPGRADE_CHARACTER_CHOSEN = 0x00D3, + SMSG_CHARACTER_UPGRADE_COMPLETE = 0x0893, + SMSG_CHARACTER_UPGRADE_SPELL_TIER_SET = 0x0860, + SMSG_CHARACTER_UPGRADE_STARTED = 0x07B5, + SMSG_CHAR_CUSTOMIZE = 0x0A1B, + SMSG_CHAR_CUSTOMIZE_FAILED = 0x041F, + SMSG_CHAR_FACTION_CHANGE_RESULT = 0x0C22, + SMSG_CHAT = 0x144A, + SMSG_CHAT_AUTO_RESPONDED = 0x15D9, + SMSG_CHAT_DOWN = 0x1CDA, + SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x1C89, + SMSG_CHAT_IS_DOWN = 0x1C8A, + SMSG_CHAT_NOT_IN_PARTY = 0x1719, + SMSG_CHAT_PLAYER_AMBIGUOUS = 0x1459, + SMSG_CHAT_PLAYER_NOTFOUND = 0x17D9, + SMSG_CHAT_RECONNECT = 0x179A, + SMSG_CHAT_RESTRICTED = 0x16DA, + SMSG_CHAT_SERVER_MESSAGE = 0x1D49, + SMSG_CHEAT_IGNORE_DIMISHING_RETURNS = 0x067D, + SMSG_CHECK_WARGAME_ENTRY = 0x0BB2, + SMSG_CHUNKED_PACKET = 0x1201, + SMSG_CLEAR_ALL_SPELL_CHARGES = 0x016D, + SMSG_CLEAR_BOSS_EMOTES = 0x0048, + SMSG_CLEAR_COOLDOWN = 0x0ED7, + SMSG_CLEAR_COOLDOWNS = 0x05BE, + SMSG_CLEAR_LOSS_OF_CONTROL = 0x0883, + SMSG_CLEAR_SPELL_CHARGES = 0x08A9, + SMSG_CLEAR_TARGET = 0x02D5, + SMSG_COIN_REMOVED = 0x0846, + SMSG_COMBAT_EVENT_FAILED = 0x0A46, + SMSG_COMMENTATOR_MAP_INFO = 0x061F, + SMSG_COMMENTATOR_PLAYER_INFO = 0x0A4C, + SMSG_COMMENTATOR_STATE_CHANGED = 0x0856, + SMSG_COMPLAINT_RESULT = 0x0D31, + SMSG_COMPLETE_SHIPMENT_RESPONSE = 0x0643, + SMSG_COMPRESSED_PACKET = 0x1806, + SMSG_CONNECT_TO = 0x1101, + SMSG_CONQUEST_FORMULA_CONSTANTS = 0x0906, + SMSG_CONSOLE_WRITE = 0x06D3, + SMSG_CONTACT_LIST = 0x0B05, + SMSG_CONTROL_UPDATE = 0x004B, + SMSG_CONVERT_RUNE = 0x0822, + SMSG_COOLDOWN_CHEAT = 0x0E87, + SMSG_COOLDOWN_EVENT = 0x021F, + SMSG_CORPSE_LOCATION = 0x0905, + SMSG_CORPSE_RECLAIM_DELAY = 0x0031, + SMSG_CORPSE_TRANSPORT_QUERY = 0x02A0, + SMSG_CREATE_CHAR = 0x0A16, + SMSG_CREATE_SHIPMENT_RESPONSE = 0x0220, + SMSG_CRITERIA_DELETED = 0x0EE0, + SMSG_CRITERIA_UPDATE = 0x0BA5, + SMSG_CROSSED_INEBRIATION_THRESHOLD = 0x08D6, + SMSG_CUSTOM_LOAD_SCREEN = 0x02D6, + SMSG_DAILY_QUESTS_RESET = 0x090A, + SMSG_DAMAGE_CALC_LOG = 0x0CC3, + SMSG_DANCE_STUDIO_CREATE_RESULT = 0x0945, + SMSG_DB_REPLY = 0x0C5F, + SMSG_DEATH_RELEASE_LOC = 0x0A5C, + SMSG_DEFENSE_MESSAGE = 0x1CD9, + SMSG_DELETE_CHAR = 0x0E9B, + SMSG_DESTROY_ARENA_UNIT = 0x0322, + SMSG_DESTRUCTIBLE_BUILDING_DAMAGE = 0x02C8, + SMSG_DIFFERENT_INSTANCE_FROM_PARTY = 0x03A2, + SMSG_DISENCHANT_CREDIT = 0x02DB, + SMSG_DISMOUNT = 0x02DF, + SMSG_DISMOUNT_RESULT = 0x0AB2, + SMSG_DISPEL_FAILED = 0x057E, + SMSG_DISPLAY_GAME_ERROR = 0x07B1, + SMSG_DISPLAY_PLAYER_CHOICE = 0x0244, + SMSG_DISPLAY_PROMOTION = 0x0B06, + SMSG_DISPLAY_QUEST_POPUP = 0x060D, + SMSG_DISPLAY_TOAST = 0x0B25, + SMSG_DONT_AUTO_PUSH_SPELLS_TO_ACTION_BAR = 0x0931, + SMSG_DROP_NEW_CONNECTION = 0x1002, + SMSG_DUEL_COMPLETE = 0x03D2, + SMSG_DUEL_COUNTDOWN = 0x0450, + SMSG_DUEL_IN_BOUNDS = 0x069F, + SMSG_DUEL_OUT_OF_BOUNDS = 0x08B6, + SMSG_DUEL_REQUESTED = 0x0941, + SMSG_DUEL_WINNER = 0x0B15, + SMSG_DURABILITY_DAMAGE_DEATH = 0x0698, + SMSG_EMOTE = 0x0531, + SMSG_ENABLE_BARBER_SHOP = 0x09C6, + SMSG_ENCHANTMENT_LOG = 0x0926, + SMSG_ENCOUNTER_END = 0x08DF, + SMSG_ENCOUNTER_START = 0x08D7, + SMSG_ENUM_CHARACTERS_RESULT = 0x0290, + SMSG_ENVIRONMENTAL_DAMAGE_LOG = 0x093D, + SMSG_EQUIPMENT_SET_ID = 0x0843, + SMSG_EXPECTED_SPAM_RECORDS = 0x1C9A, + SMSG_EXPLORATION_EXPERIENCE = 0x0C90, + SMSG_FACTION_BONUS_INFO = 0x041C, + SMSG_FAILED_PLAYER_CONDITION = 0x0DA5, + SMSG_FEATURE_SYSTEM_STATUS = 0x0090, + SMSG_FEATURE_SYSTEM_STATUS_GLUE_SCREEN = 0x0683, + SMSG_FEIGN_DEATH_RESISTED = 0x0DB5, + SMSG_FINAL_CHUNK = 0x1305, + SMSG_FISH_ESCAPED = 0x0087, + SMSG_FISH_NOT_HOOKED = 0x0955, + SMSG_FLIGHT_SPLINE_SYNC = 0x0F23, + SMSG_FORCED_DEATH_UPDATE = 0x089F, + SMSG_FORCE_ANIM = 0x029F, + SMSG_FORCE_OBJECT_RELINK = 0x0E9F, + SMSG_FRIEND_STATUS = 0x0084, + SMSG_GAME_OBJECT_ACTIVATE_ANIM_KIT = 0x0335, + SMSG_GAME_OBJECT_CUSTOM_ANIM = 0x0FB2, + SMSG_GAME_OBJECT_DESPAWN = 0x0E88, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL = 0x037D, + SMSG_GAME_OBJECT_PLAY_SPELL_VISUAL_KIT = 0x0AAE, + SMSG_GAME_OBJECT_RESET_STATE = 0x07A6, + SMSG_GAME_SPEED_SET = 0x0125, + SMSG_GAME_TIME_SET = 0x0421, + SMSG_GAME_TIME_UPDATE = 0x0207, + SMSG_GARRISON_ADD_FOLLOWER_RESULT = 0x05E2, + SMSG_GARRISON_ADD_MISSION_RESULT = 0x0366, + SMSG_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING_RESULT = 0x0272, + SMSG_GARRISON_BUILDING_ACTIVATED = 0x0662, + SMSG_GARRISON_BUILDING_LANDMARKS = 0x0B61, + SMSG_GARRISON_BUILDING_REMOVED = 0x04F5, + SMSG_GARRISON_BUILDING_SET_ACTIVE_SPECIALIZATION_RESULT = 0x0876, + SMSG_GARRISON_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x0361, + SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x03E6, + SMSG_GARRISON_CREATE_RESULT = 0x0976, + SMSG_GARRISON_DELETE_RESULT = 0x0BF5, + SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x0871, + SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x0466, + SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x0775, + SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x0AE2, + SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x07E1, + SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 0x089C, + SMSG_GARRISON_LEARN_BLUEPRINT_RESULT = 0x0176, + SMSG_GARRISON_LEARN_SPECIALIZATION_RESULT = 0x0076, + SMSG_GARRISON_LIST_FOLLOWERS_CHEAT_RESULT = 0x0462, + SMSG_GARRISON_LIST_MISSIONS_CHEAT_RESULT = 0x0661, + SMSG_GARRISON_MISSION_AREA_BONUS_ADDED = 0x04E1, + SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT = 0x01F2, + SMSG_GARRISON_NUM_FOLLOWER_ACTIVATIONS_REMAINING = 0x0862, + SMSG_GARRISON_OPEN_ARCHITECT = 0x0A65, + SMSG_GARRISON_OPEN_MISSION_NPC = 0x0566, + SMSG_GARRISON_OPEN_RECRUITMENT_NPC = 0x0576, + SMSG_GARRISON_OPEN_TRADESKILL_NPC = 0x0C65, + SMSG_GARRISON_PLACE_BUILDING_RESULT = 0x08F1, + SMSG_GARRISON_PLOT_PLACED = 0x0172, + SMSG_GARRISON_PLOT_REMOVED = 0x0866, + SMSG_GARRISON_RECALL_PORTAL_LAST_USED_TIME = 0x00E5, + SMSG_GARRISON_RECALL_PORTAL_USED = 0x07F1, + SMSG_GARRISON_RECRUITMENT_FOLLOWERS_GENERATED = 0x00E2, + SMSG_GARRISON_RECRUIT_FOLLOWER_RESULT = 0x0162, + SMSG_GARRISON_REMOTE_INFO = 0x01F5, + SMSG_GARRISON_REMOVE_FOLLOWER_FROM_BUILDING_RESULT = 0x06E5, + SMSG_GARRISON_REMOVE_FOLLOWER_RESULT = 0x08F5, + SMSG_GARRISON_REQUEST_BLUEPRINT_AND_SPECIALIZATION_DATA_RESULT = 0x05F5, + SMSG_GARRISON_START_MISSION_RESULT = 0x07E6, + SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT = 0x0861, + SMSG_GARRISON_UPGRADE_RESULT = 0x0165, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x0693, + SMSG_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x0008, + SMSG_GET_DISPLAYED_TROPHY_LIST_RESPONSE = 0x06F2, + SMSG_GET_GARRISON_INFO_RESULT = 0x0B75, + SMSG_GET_SHIPMENTS_OF_TYPE_RESPONSE = 0x03A6, + SMSG_GET_SHIPMENT_INFO_RESPONSE = 0x024F, + SMSG_GET_TROPHY_LIST_RESPONSE = 0x005C, + SMSG_GM_PLAYER_INFO = 0x0E25, + SMSG_GM_REQUEST_PLAYER_INFO = 0x0946, + SMSG_GM_TICKET_CASE_STATUS = 0x005F, + SMSG_GM_TICKET_SYSTEM_STATUS = 0x0ADF, + SMSG_GOD_MODE = 0x04A5, + SMSG_GOSSIP_COMPLETE = 0x0D89, + SMSG_GOSSIP_MESSAGE = 0x0E0A, + SMSG_GOSSIP_POI = 0x0925, + SMSG_GROUP_ACTION_THROTTLED = 0x06DC, + SMSG_GROUP_DECLINE = 0x0E1F, + SMSG_GROUP_DESTROYED = 0x08D4, + SMSG_GROUP_NEW_LEADER = 0x009F, + SMSG_GROUP_UNINVITE = 0x0126, + SMSG_GUILD_ACHIEVEMENT_DELETED = 0x06AC, + SMSG_GUILD_ACHIEVEMENT_EARNED = 0x04FC, + SMSG_GUILD_ACHIEVEMENT_MEMBERS = 0x08FB, + SMSG_GUILD_BANK_LOG_QUERY_RESULTS = 0x06EB, + SMSG_GUILD_BANK_QUERY_RESULTS = 0x06FC, + SMSG_GUILD_BANK_REMAINING_WITHDRAW_MONEY = 0x0CA4, + SMSG_GUILD_BANK_TEXT_QUERY_RESULT = 0x02E4, + SMSG_GUILD_CHALLENGE_COMPLETED = 0x00BC, + SMSG_GUILD_CHALLENGE_UPDATE = 0x02AB, + SMSG_GUILD_CHANGE_NAME_RESULT = 0x08AC, + SMSG_GUILD_COMMAND_RESULT = 0x04F4, + SMSG_GUILD_CRITERIA_DELETED = 0x00AB, + SMSG_GUILD_CRITERIA_UPDATE = 0x06AB, + SMSG_GUILD_EVENT_BANK_CONTENTS_CHANGED = 0x00F3, + SMSG_GUILD_EVENT_BANK_MONEY_CHANGED = 0x0AF4, + SMSG_GUILD_EVENT_DISBANDED = 0x06F3, + SMSG_GUILD_EVENT_LOG_QUERY_RESULTS = 0x08B4, + SMSG_GUILD_EVENT_MOTD = 0x02A3, + SMSG_GUILD_EVENT_NEW_LEADER = 0x02F3, + SMSG_GUILD_EVENT_PLAYER_JOINED = 0x06E4, + SMSG_GUILD_EVENT_PLAYER_LEFT = 0x06A4, + SMSG_GUILD_EVENT_PRESENCE_CHANGE = 0x06F4, + SMSG_GUILD_EVENT_RANKS_UPDATED = 0x00F4, + SMSG_GUILD_EVENT_RANK_CHANGED = 0x08A3, + SMSG_GUILD_EVENT_TAB_ADDED = 0x0AA4, + SMSG_GUILD_EVENT_TAB_DELETED = 0x04B4, + SMSG_GUILD_EVENT_TAB_MODIFIED = 0x04A3, + SMSG_GUILD_EVENT_TAB_TEXT_CHANGED = 0x08F4, + SMSG_GUILD_FLAGGED_FOR_RENAME = 0x02F4, + SMSG_GUILD_INVITE = 0x08BB, + SMSG_GUILD_INVITE_DECLINED = 0x02E3, + SMSG_GUILD_INVITE_EXPIRED = 0x0AA3, + SMSG_GUILD_KNOWN_RECIPES = 0x04BB, + SMSG_GUILD_MEMBERS_WITH_RECIPE = 0x04E4, + SMSG_GUILD_MEMBER_DAILY_RESET = 0x0AFB, + SMSG_GUILD_MEMBER_RECIPES = 0x08EC, + SMSG_GUILD_MEMBER_UPDATE_NOTE = 0x02FB, + SMSG_GUILD_MOVED = 0x0AE4, + SMSG_GUILD_MOVE_STARTING = 0x08EB, + SMSG_GUILD_NAME_CHANGED = 0x0AAB, + SMSG_GUILD_NEWS = 0x00A3, + SMSG_GUILD_NEWS_DELETED = 0x0AEC, + SMSG_GUILD_PARTY_STATE = 0x0ABC, + SMSG_GUILD_PERMISSIONS_QUERY_RESULTS = 0x00EC, + SMSG_GUILD_RANKS = 0x06FB, + SMSG_GUILD_REPUTATION_REACTION_CHANGED = 0x00E3, + SMSG_GUILD_RESET = 0x0AFC, + SMSG_GUILD_REWARD_LIST = 0x0AF3, + SMSG_GUILD_ROSTER = 0x04B3, + SMSG_GUILD_ROSTER_UPDATE = 0x00BB, + SMSG_GUILD_SEND_RANK_CHANGE = 0x00B4, + SMSG_HEALTH_UPDATE = 0x06D4, + SMSG_HIGHEST_THREAT_UPDATE = 0x0B36, + SMSG_HOTFIX_NOTIFY = 0x0AA1, + SMSG_HOTFIX_NOTIFY_BLOB = 0x0095, + SMSG_INCREASE_CAST_TIME_FOR_SPELL = 0x036E, + SMSG_INITIALIZE_FACTIONS = 0x04E0, + SMSG_INITIAL_SETUP = 0x02CC, + SMSG_INIT_WORLD_STATES = 0x0E53, + SMSG_INSPECT_HONOR_STATS = 0x0AC7, + SMSG_INSPECT_PVP = 0x08D3, + SMSG_INSPECT_RESULT = 0x01B2, + SMSG_INSTANCE_ENCOUNTER_CHANGE_PRIORITY = 0x0094, + SMSG_INSTANCE_ENCOUNTER_DISENGAGE_UNIT = 0x0648, + SMSG_INSTANCE_ENCOUNTER_END = 0x0901, + SMSG_INSTANCE_ENCOUNTER_ENGAGE_UNIT = 0x0CDF, + SMSG_INSTANCE_ENCOUNTER_GAIN_COMBAT_RESURRECTION_CHARGE = 0x0ECC, + SMSG_INSTANCE_ENCOUNTER_IN_COMBAT_RESURRECTION = 0x0E07, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_COMPLETE = 0x084B, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_START = 0x0625, + SMSG_INSTANCE_ENCOUNTER_OBJECTIVE_UPDATE = 0x0B01, + SMSG_INSTANCE_ENCOUNTER_PHASE_SHIFT_CHANGED = 0x0447, + SMSG_INSTANCE_ENCOUNTER_START = 0x06CC, + SMSG_INSTANCE_ENCOUNTER_TIMER_START = 0x09A2, + SMSG_INSTANCE_GROUP_SIZE_CHANGED = 0x0B55, + SMSG_INSTANCE_INFO = 0x025F, + SMSG_INSTANCE_RESET = 0x0E31, + SMSG_INSTANCE_RESET_FAILED = 0x03D6, + SMSG_INSTANCE_SAVE_CREATED = 0x00DB, + SMSG_INVALIDATE_PLAYER = 0x07A1, + SMSG_INVALID_PROMOTION_CODE = 0x0AC3, + SMSG_INVENTORY_CHANGE_FAILURE = 0x0C4B, + SMSG_IS_QUEST_COMPLETE_RESPONSE = 0x0D0A, + SMSG_ITEM_CHANGED = 0x0A91, + SMSG_ITEM_COOLDOWN = 0x0A32, + SMSG_ITEM_ENCHANT_TIME_UPDATE = 0x0236, + SMSG_ITEM_EXPIRE_PURCHASE_REFUND = 0x0426, + SMSG_ITEM_PURCHASE_REFUND_RESULT = 0x0047, + SMSG_ITEM_PUSH_RESULT = 0x0690, + SMSG_ITEM_TIME_UPDATE = 0x0EB2, + SMSG_KICK_REASON = 0x02D4, + SMSG_LEARNED_SPELLS = 0x092A, + SMSG_LEARN_TALENT_FAILED = 0x0AA2, + SMSG_LEVEL_UP_INFO = 0x01D2, + SMSG_LFG_BOOT_PLAYER = 0x0611, + SMSG_LFG_DISABLED = 0x0C6C, + SMSG_LFG_JOIN_RESULT = 0x0363, + SMSG_LFG_LIST_JOIN_RESULT = 0x0252, + SMSG_LFG_LIST_SEARCH_RESULTS = 0x052C, + SMSG_LFG_LIST_SEARCH_STATUS = 0x012B, + SMSG_LFG_LIST_UPDATE_BLACKLIST = 0x086C, + SMSG_LFG_LIST_UPDATE_STATUS = 0x0241, + SMSG_LFG_OFFER_CONTINUE = 0x046B, + SMSG_LFG_PARTY_INFO = 0x0256, + SMSG_LFG_PLAYER_INFO = 0x0356, + SMSG_LFG_PLAYER_REWARD = 0x066B, + SMSG_LFG_PROPOSAL_UPDATE = 0x0D6B, + SMSG_LFG_QUEUE_STATUS = 0x0255, + SMSG_LFG_READY_CHECK_RESULT = 0x0770, + SMSG_LFG_READY_CHECK_UPDATE = 0x016B, + SMSG_LFG_ROLE_CHECK_UPDATE = 0x0368, + SMSG_LFG_SEARCH_RESULTS = 0x06D1, + SMSG_LFG_SLOT_INVALID = 0x0341, + SMSG_LFG_TELEPORT_DENIED = 0x0364, + SMSG_LFG_UPDATE_STATUS = 0x076B, + SMSG_LF_GUILD_APPLICANT_LIST_CHANGED = 0x00FC, + SMSG_LF_GUILD_APPLICATIONS = 0x04EB, + SMSG_LF_GUILD_APPLICATIONS_LIST_CHANGED = 0x0AB3, + SMSG_LF_GUILD_BROWSE = 0x08FC, + SMSG_LF_GUILD_COMMAND_RESULT = 0x06EC, + SMSG_LF_GUILD_POST = 0x02B4, + SMSG_LF_GUILD_RECRUITS = 0x08E4, + SMSG_LIVE_REGION_ACCOUNT_RESTORE_RESULT = 0x0A42, + SMSG_LIVE_REGION_CHARACTER_COPY_RESULT = 0x0E8F, + SMSG_LIVE_REGION_GET_ACCOUNT_CHARACTER_LIST_RESULT = 0x0135, + SMSG_LOAD_CUF_PROFILES = 0x0848, + SMSG_LOAD_EQUIPMENT_SET = 0x048B, + SMSG_LOAD_SELECTED_TROPHY_RESULT = 0x02A2, + SMSG_LOGIN_SET_TIME_SPEED = 0x0C47, + SMSG_LOGIN_VERIFY_WORLD = 0x0CD3, + SMSG_LOGOUT_CANCEL_ACK = 0x0817, + SMSG_LOGOUT_COMPLETE = 0x0618, + SMSG_LOGOUT_RESPONSE = 0x0535, + SMSG_LOG_XP_GAIN = 0x0C84, + SMSG_LOOT_ALL_PASSED = 0x089B, + SMSG_LOOT_CONTENTS = 0x0490, + SMSG_LOOT_ITEM_LIST = 0x0832, + SMSG_LOOT_LIST = 0x0AB6, + SMSG_LOOT_MONEY_NOTIFY = 0x0E94, + SMSG_LOOT_RELEASE = 0x0404, + SMSG_LOOT_RELEASE_ALL = 0x06A5, + SMSG_LOOT_REMOVED = 0x0FA6, + SMSG_LOOT_RESPONSE = 0x0DB1, + SMSG_LOOT_ROLL = 0x008F, + SMSG_LOOT_ROLLS_COMPLETE = 0x0C0C, + SMSG_LOOT_ROLL_WON = 0x0DB2, + SMSG_LOSS_OF_CONTROL_AURA_UPDATE = 0x0217, + SMSG_MAIL_COMMAND_RESULT = 0x04B1, + SMSG_MAIL_LIST_RESULT = 0x025C, + SMSG_MAIL_QUERY_NEXT_TIME_RESULT = 0x01A2, + SMSG_MAP_OBJECTIVES_INIT = 0x0E58, + SMSG_MAP_OBJ_EVENTS = 0x0694, + SMSG_MASTER_LOOT_CANDIDATE_LIST = 0x0EC8, + SMSG_MESSAGE_BOX = 0x0AC8, + SMSG_MINIMAP_PING = 0x0CA0, + SMSG_MIRROR_IMAGE_COMPONENTED_DATA = 0x092D, + SMSG_MIRROR_IMAGE_CREATURE_DATA = 0x097D, + SMSG_MISSILE_CANCEL = 0x00D1, + SMSG_MODIFY_COOLDOWN = 0x0892, + SMSG_MOTD = 0x1649, + SMSG_MOUNT_RESULT = 0x0AB1, + SMSG_MOVE_APPLY_MOVEMENT_FORCE = 0x1C53, + SMSG_MOVE_DISABLE_COLLISION = 0x02C6, + SMSG_MOVE_DISABLE_GRAVITY = 0x0A27, + SMSG_MOVE_DISABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x1D84, + SMSG_MOVE_ENABLE_COLLISION = 0x0564, + SMSG_MOVE_ENABLE_GRAVITY = 0x1453, + SMSG_MOVE_ENABLE_TRANSITION_BETWEEN_SWIM_AND_FLY = 0x1143, + SMSG_MOVE_KNOCK_BACK = 0x19D3, + SMSG_MOVE_REMOVE_MOVEMENT_FORCE = 0x19C3, + SMSG_MOVE_ROOT = 0x0AC6, + SMSG_MOVE_SET_ACTIVE_MOVER = 0x0ED1, + SMSG_MOVE_SET_CAN_FLY = 0x0824, + SMSG_MOVE_SET_CAN_TURN_WHILE_FALLING = 0x1488, + SMSG_MOVE_SET_COLLISION_HEIGHT = 0x1918, + SMSG_MOVE_SET_COMPOUND_STATE = 0x0C46, + SMSG_MOVE_SET_FEATHER_FALL = 0x1D04, + SMSG_MOVE_SET_FLIGHT_BACK_SPEED = 0x0ED6, + SMSG_MOVE_SET_FLIGHT_SPEED = 0x1C43, + SMSG_MOVE_SET_HOVERING = 0x1054, + SMSG_MOVE_SET_IGNORE_MOVEMENT_FORCES = 0x1884, + SMSG_MOVE_SET_LAND_WALK = 0x0C82, + SMSG_MOVE_SET_NORMAL_FALL = 0x1513, + SMSG_MOVE_SET_PITCH_RATE = 0x0F30, + SMSG_MOVE_SET_RUN_BACK_SPEED = 0x1CC8, + SMSG_MOVE_SET_RUN_SPEED = 0x1C04, + SMSG_MOVE_SET_SWIM_BACK_SPEED = 0x1227, + SMSG_MOVE_SET_SWIM_SPEED = 0x10D3, + SMSG_MOVE_SET_TURN_RATE = 0x032C, + SMSG_MOVE_SET_VEHICLE_REC_ID = 0x1276, + SMSG_MOVE_SET_WALK_SPEED = 0x1954, + SMSG_MOVE_SET_WATER_WALK = 0x1508, + SMSG_MOVE_SKIP_TIME = 0x0E06, + SMSG_MOVE_SPLINE_DISABLE_COLLISION = 0x0E28, + SMSG_MOVE_SPLINE_DISABLE_GRAVITY = 0x0827, + SMSG_MOVE_SPLINE_ENABLE_COLLISION = 0x1D57, + SMSG_MOVE_SPLINE_ENABLE_GRAVITY = 0x12F5, + SMSG_MOVE_SPLINE_ROOT = 0x12E3, + SMSG_MOVE_SPLINE_SET_FEATHER_FALL = 0x1335, + SMSG_MOVE_SPLINE_SET_FLIGHT_BACK_SPEED = 0x1264, + SMSG_MOVE_SPLINE_SET_FLIGHT_SPEED = 0x18C7, + SMSG_MOVE_SPLINE_SET_FLYING = 0x1048, + SMSG_MOVE_SPLINE_SET_HOVER = 0x0E91, + SMSG_MOVE_SPLINE_SET_LAND_WALK = 0x0B24, + SMSG_MOVE_SPLINE_SET_NORMAL_FALL = 0x0281, + SMSG_MOVE_SPLINE_SET_PITCH_RATE = 0x1908, + SMSG_MOVE_SPLINE_SET_RUN_BACK_SPEED = 0x1058, + SMSG_MOVE_SPLINE_SET_RUN_MODE = 0x0C91, + SMSG_MOVE_SPLINE_SET_RUN_SPEED = 0x12E1, + SMSG_MOVE_SPLINE_SET_SWIM_BACK_SPEED = 0x1D17, + SMSG_MOVE_SPLINE_SET_SWIM_SPEED = 0x1588, + SMSG_MOVE_SPLINE_SET_TURN_RATE = 0x1557, + SMSG_MOVE_SPLINE_SET_WALK_MODE = 0x12F1, + SMSG_MOVE_SPLINE_SET_WALK_SPEED = 0x062F, + SMSG_MOVE_SPLINE_SET_WATER_WALK = 0x0C45, + SMSG_MOVE_SPLINE_START_SWIM = 0x1044, + SMSG_MOVE_SPLINE_STOP_SWIM = 0x0CC1, + SMSG_MOVE_SPLINE_UNROOT = 0x0141, + SMSG_MOVE_SPLINE_UNSET_FLYING = 0x1483, + SMSG_MOVE_SPLINE_UNSET_HOVER = 0x0627, + SMSG_MOVE_TELEPORT = 0x1157, + SMSG_MOVE_UNROOT = 0x1271, + SMSG_MOVE_UNSET_CAN_FLY = 0x0A81, + SMSG_MOVE_UNSET_CAN_TURN_WHILE_FALLING = 0x0B2F, + SMSG_MOVE_UNSET_HOVERING = 0x0082, + SMSG_MOVE_UNSET_IGNORE_MOVEMENT_FORCES = 0x0468, + SMSG_MOVE_UPDATE = 0x1325, + SMSG_MOVE_UPDATE_APPLY_MOVEMENT_FORCE = 0x0C95, + SMSG_MOVE_UPDATE_COLLISION_HEIGHT = 0x1D44, + SMSG_MOVE_UPDATE_FLIGHT_BACK_SPEED = 0x0C51, + SMSG_MOVE_UPDATE_FLIGHT_SPEED = 0x1104, + SMSG_MOVE_UPDATE_KNOCK_BACK = 0x1D18, + SMSG_MOVE_UPDATE_PITCH_RATE = 0x0423, + SMSG_MOVE_UPDATE_REMOVE_MOVEMENT_FORCE = 0x02C2, + SMSG_MOVE_UPDATE_RUN_BACK_SPEED = 0x0623, + SMSG_MOVE_UPDATE_RUN_SPEED = 0x0630, + SMSG_MOVE_UPDATE_SWIM_BACK_SPEED = 0x0E92, + SMSG_MOVE_UPDATE_SWIM_SPEED = 0x0C64, + SMSG_MOVE_UPDATE_TELEPORT = 0x1958, + SMSG_MOVE_UPDATE_TURN_RATE = 0x0196, + SMSG_MOVE_UPDATE_WALK_SPEED = 0x1188, + SMSG_MULTIPLE_PACKETS = 0x1206, + SMSG_NEUTRAL_PLAYER_FACTION_SELECT_RESULT = 0x0C9F, + SMSG_NEW_TAXI_PATH = 0x02B5, + SMSG_NEW_WORLD = 0x0026, + SMSG_NOTIFY_DEST_LOC_SPELL_CAST = 0x0AAD, + SMSG_NOTIFY_MISSILE_TRAJECTORY_COLLISION = 0x0A03, + SMSG_NOTIFY_MONEY = 0x01D1, + SMSG_NOTIFY_RECEIVED_MAIL = 0x06B5, + SMSG_OFFER_PETITION_ERROR = 0x0C35, + SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA = 0x081C, + SMSG_ON_MONSTER_MOVE = 0x0C28, + SMSG_OPEN_CONTAINER = 0x09B1, + SMSG_OPEN_LFG_DUNGEON_FINDER = 0x0370, + SMSG_OPEN_SHIPMENT_NPC_FROM_GOSSIP = 0x0A97, + SMSG_OPEN_SHIPMENT_NPC_RESULT = 0x0121, + SMSG_OVERRIDE_LIGHT = 0x08DC, + SMSG_PAGE_TEXT = 0x0A4B, + SMSG_PARTY_COMMAND_RESULT = 0x045F, + SMSG_PARTY_INVITE = 0x0208, + SMSG_PARTY_KILL_LOG = 0x00A0, + SMSG_PARTY_MEMBER_STATE = 0x06CF, + SMSG_PARTY_UPDATE = 0x0736, + SMSG_PAUSE_MIRROR_TIMER = 0x00C3, + SMSG_PENDING_RAID_LOCK = 0x0802, + SMSG_PETITION_ALREADY_SIGNED = 0x0C60, + SMSG_PETITION_RENAME_GUILD_RESPONSE = 0x08AB, + SMSG_PETITION_SHOW_LIST = 0x0C08, + SMSG_PETITION_SHOW_SIGNATURES = 0x0222, + SMSG_PETITION_SIGN_RESULTS = 0x08A2, + SMSG_PET_ACTION_FEEDBACK = 0x0091, + SMSG_PET_ACTION_SOUND = 0x0050, + SMSG_PET_ADDED = 0x0493, + SMSG_PET_BATTLE_CHAT_RESTRICTED = 0x0894, + SMSG_PET_BATTLE_DEBUG_QUEUE_DUMP_RESPONSE = 0x0A02, + SMSG_PET_BATTLE_FINALIZE_LOCATION = 0x0EA6, + SMSG_PET_BATTLE_FINAL_ROUND = 0x0A1C, + SMSG_PET_BATTLE_FINISHED = 0x0B51, + SMSG_PET_BATTLE_FIRST_ROUND = 0x0522, + SMSG_PET_BATTLE_INITIAL_UPDATE = 0x0136, + SMSG_PET_BATTLE_MAX_GAME_LENGTH_WARNING = 0x0BA6, + SMSG_PET_BATTLE_PVP_CHALLENGE = 0x000B, + SMSG_PET_BATTLE_QUEUE_PROPOSE_MATCH = 0x069B, + SMSG_PET_BATTLE_QUEUE_STATUS = 0x0631, + SMSG_PET_BATTLE_REPLACEMENTS_MADE = 0x08C4, + SMSG_PET_BATTLE_REQUEST_FAILED = 0x04C4, + SMSG_PET_BATTLE_ROUND_RESULT = 0x029C, + SMSG_PET_BATTLE_SLOT_UPDATES = 0x0025, + SMSG_PET_CAST_FAILED = 0x07FE, + SMSG_PET_CLEAR_SPELLS = 0x09ED, + SMSG_PET_DISMISS_SOUND = 0x0BA2, + SMSG_PET_GOD_MODE = 0x04D3, + SMSG_PET_GUIDS = 0x06A0, + SMSG_PET_LEARNED_SPELLS = 0x08B9, + SMSG_PET_MODE = 0x049F, + SMSG_PET_NAME_INVALID = 0x0D25, + SMSG_PET_SLOT_UPDATED = 0x0CD8, + SMSG_PET_SPELLS_MESSAGE = 0x016A, + SMSG_PET_STABLE_LIST = 0x0A48, + SMSG_PET_STABLE_RESULT = 0x0054, + SMSG_PET_TAME_FAILURE = 0x09D1, + SMSG_PET_UNLEARNED_SPELLS = 0x06BE, + SMSG_PHASE_SHIFT_CHANGE = 0x0C36, + SMSG_PLAYED_TIME = 0x0842, + SMSG_PLAYER_BOUND = 0x08A0, + SMSG_PLAYER_SAVE_GUILD_EMBLEM = 0x02EB, + SMSG_PLAYER_SKINNED = 0x02B6, + SMSG_PLAYER_TABARD_VENDOR_ACTIVATE = 0x0E48, + SMSG_PLAY_MUSIC = 0x0942, + SMSG_PLAY_OBJECT_SOUND = 0x061B, + SMSG_PLAY_ONE_SHOT_ANIM_KIT = 0x0017, + SMSG_PLAY_ORPHAN_SPELL_VISUAL = 0x04FE, + SMSG_PLAY_SCENE = 0x0BD6, + SMSG_PLAY_SOUND = 0x0044, + SMSG_PLAY_SPEAKERBOT_SOUND = 0x0912, + SMSG_PLAY_SPELL_VISUAL = 0x002E, + SMSG_PLAY_SPELL_VISUAL_KIT = 0x0B3E, + SMSG_PLAY_TIME_WARNING = 0x0A50, + SMSG_PONG = 0x1805, + SMSG_POWER_UPDATE = 0x004F, + SMSG_PRE_RESSURECT = 0x01A5, + SMSG_PRINT_NOTIFICATION = 0x0E20, + SMSG_PROC_RESIST = 0x0951, + SMSG_PROPOSE_LEVEL_GRANT = 0x07B2, + SMSG_PVP_CREDIT = 0x0726, + SMSG_PVP_LOG_DATA = 0x01C1, + SMSG_PVP_OPTIONS_ENABLED = 0x0B56, + SMSG_PVP_SEASON = 0x0CB2, + SMSG_QUERY_BATTLE_PET_NAME_RESPONSE = 0x080C, + SMSG_QUERY_CREATURE_RESPONSE = 0x0EDB, + SMSG_QUERY_GAME_OBJECT_RESPONSE = 0x04CC, + SMSG_QUERY_GARRISON_CREATURE_NAME_RESPONSE = 0x0C76, + SMSG_QUERY_GUILD_INFO_RESPONSE = 0x04A4, + SMSG_QUERY_ITEM_TEXT_RESPONSE = 0x0CDB, + SMSG_QUERY_NPC_TEXT_RESPONSE = 0x049B, + SMSG_QUERY_PAGE_TEXT_RESPONSE = 0x0022, + SMSG_QUERY_PETITION_RESPONSE = 0x00A2, + SMSG_QUERY_PET_NAME_RESPONSE = 0x064F, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x0331, + SMSG_QUERY_QUEST_INFO_RESPONSE = 0x0C09, + SMSG_QUERY_TIME_RESPONSE = 0x05A6, + SMSG_QUEST_COMPLETION_NPC_RESPONSE = 0x0E8A, + SMSG_QUEST_CONFIRM_ACCEPT = 0x0589, + SMSG_QUEST_FORCE_REMOVED = 0x085A, + SMSG_QUEST_GIVER_INVALID_QUEST = 0x0689, + SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x0949, + SMSG_QUEST_GIVER_QUEST_COMPLETE = 0x021A, + SMSG_QUEST_GIVER_QUEST_DETAILS = 0x015D, + SMSG_QUEST_GIVER_QUEST_FAILED = 0x040E, + SMSG_QUEST_GIVER_QUEST_LIST_MESSAGE = 0x05C9, + SMSG_QUEST_GIVER_REQUEST_ITEMS = 0x06CA, + SMSG_QUEST_GIVER_STATUS = 0x084D, + SMSG_QUEST_GIVER_STATUS_MULTIPLE = 0x000D, + SMSG_QUEST_LOG_FULL = 0x06CE, + SMSG_QUEST_POI_QUERY_RESPONSE = 0x0409, + SMSG_QUEST_PUSH_RESULT = 0x035A, + SMSG_QUEST_UPDATE_ADD_CREDIT = 0x005E, + SMSG_QUEST_UPDATE_ADD_CREDIT_SIMPLE = 0x1218, + SMSG_QUEST_UPDATE_ADD_PVP_CREDIT = 0x1203, + SMSG_QUEST_UPDATE_COMPLETE = 0x1344, + SMSG_QUEST_UPDATE_FAILED = 0x044A, + SMSG_QUEST_UPDATE_FAILED_TIMER = 0x0919, + SMSG_RAF_EMAIL_ENABLED_RESPONSE = 0x0836, + SMSG_RAID_DIFFICULTY_SET = 0x0296, + SMSG_RAID_GROUP_ONLY = 0x0ED8, + SMSG_RAID_INSTANCE_MESSAGE = 0x171A, + SMSG_RAID_MARKERS_CHANGED = 0x0E5F, + SMSG_RANDOM_ROLL = 0x0844, + SMSG_RATED_BATTLEFIELD_INFO = 0x0621, + SMSG_READY_CHECK_COMPLETED = 0x0E84, + SMSG_READY_CHECK_RESPONSE = 0x029B, + SMSG_READY_CHECK_STARTED = 0x0010, + SMSG_READ_ITEM_RESULT_FAILED = 0x0283, + SMSG_READ_ITEM_RESULT_OK = 0x0826, + SMSG_REALM_QUERY_RESPONSE = 0x0E0F, + SMSG_REALM_SPLIT = 0x0CDC, + SMSG_RECRUIT_A_FRIEND_RESPONSE = 0x0815, + SMSG_REFER_A_FRIEND_EXPIRED = 0x021C, + SMSG_REFER_A_FRIEND_FAILURE = 0x0C44, + SMSG_REFRESH_COMPONENT = 0x045B, + SMSG_REFRESH_SPELL_HISTORY = 0x07AE, + SMSG_REMOVE_ITEM_PASSIVE = 0x02B1, + SMSG_REMOVE_LOSS_OF_CONTROL = 0x0097, + SMSG_REPLACE_TROPHY_RESPONSE = 0x04D0, + SMSG_REPORT_PVP_PLAYER_AFK_RESULT = 0x0225, + SMSG_REQUEST_CEMETERY_LIST_RESPONSE = 0x00A1, + SMSG_REQUEST_PVP_REWARDS_RESPONSE = 0x0820, + SMSG_RESEARCH_COMPLETE = 0x0297, + SMSG_RESET_COMPRESSION_CONTEXT = 0x1006, + SMSG_RESET_FAILED_NOTIFY = 0x088F, + SMSG_RESET_RANGED_COMBAT_TIMER = 0x0C8F, + SMSG_RESET_WEEKLY_CURRENCY = 0x0D26, + SMSG_RESPEC_WIPE_CONFIRM = 0x0E21, + SMSG_RESPOND_INSPECT_ACHIEVEMENTS = 0x0B32, + SMSG_RESUME_CAST_BAR = 0x0379, + SMSG_RESUME_COMMS = 0x1302, + SMSG_RESUME_TOKEN = 0x0E08, + SMSG_RESURRECT_REQUEST = 0x08A6, + SMSG_RESYNC_RUNES = 0x0806, + SMSG_ROLE_CHANGED_INFORM = 0x0E8C, + SMSG_ROLE_CHOSEN = 0x066F, + SMSG_ROLE_POLL_INFORM = 0x0731, + SMSG_RUNE_REGEN_DEBUG = 0x0EB1, + SMSG_SCENARIO_BOOT = 0x00B6, + SMSG_SCENARIO_COMPLETED = 0x0EA2, + SMSG_SCENARIO_OUT_OF_BOUNDS = 0x0410, + SMSG_SCENARIO_PO_IS = 0x00CC, + SMSG_SCENARIO_PROGRESS_UPDATE = 0x0AA5, + SMSG_SCENARIO_STATE = 0x0E35, + SMSG_SCENE_OBJECT_EVENT = 0x0644, + SMSG_SCENE_OBJECT_PET_BATTLE_FINAL_ROUND = 0x0C8B, + SMSG_SCENE_OBJECT_PET_BATTLE_FINISHED = 0x0DA2, + SMSG_SCENE_OBJECT_PET_BATTLE_FIRST_ROUND = 0x06B6, + SMSG_SCENE_OBJECT_PET_BATTLE_INITIAL_UPDATE = 0x0A36, + SMSG_SCENE_OBJECT_PET_BATTLE_REPLACEMENTS_MADE = 0x0417, + SMSG_SCENE_OBJECT_PET_BATTLE_ROUND_RESULT = 0x0896, + SMSG_SCRIPT_CAST = 0x00AE, + SMSG_SELL_RESPONSE = 0x08DB, + SMSG_SEND_ITEM_PASSIVES = 0x0E8B, + SMSG_SEND_KNOWN_SPELLS = 0x096E, + SMSG_SEND_RAID_TARGET_UPDATE_ALL = 0x001F, + SMSG_SEND_RAID_TARGET_UPDATE_SINGLE = 0x049C, + SMSG_SEND_SPELL_CHARGES = 0x0BF9, + SMSG_SEND_SPELL_HISTORY = 0x0629, + SMSG_SEND_UNLEARN_SPELLS = 0x03AA, + SMSG_SERVER_FIRST_ACHIEVEMENT = 0x154A, + SMSG_SERVER_FIRST_ACHIEVEMENTS = 0x0487, + SMSG_SERVER_TIME = 0x0658, + SMSG_SETUP_CURRENCY = 0x0B45, + SMSG_SETUP_RESEARCH_HISTORY = 0x0325, + SMSG_SET_AI_ANIM_KIT = 0x0E36, + SMSG_SET_ALL_TASK_PROGRESS = 0x0E04, + SMSG_SET_ANIM_TIER = 0x0F22, + SMSG_SET_CURRENCY = 0x0214, + SMSG_SET_DF_FAST_LAUNCH_RESULT = 0x026F, + SMSG_SET_DUNGEON_DIFFICULTY = 0x0A94, + SMSG_SET_FACTION_AT_WAR = 0x0EA5, + SMSG_SET_FACTION_NOT_VISIBLE = 0x0C4C, + SMSG_SET_FACTION_STANDING = 0x06DF, + SMSG_SET_FACTION_VISIBLE = 0x04DC, + SMSG_SET_FLAT_SPELL_MODIFIER = 0x0AE9, + SMSG_SET_FORCED_REACTIONS = 0x08D1, + SMSG_SET_ITEM_PURCHASE_DATA = 0x1085, + SMSG_SET_LOOT_METHOD_FAILED = 0x0536, + SMSG_SET_MAX_WEEKLY_QUANTITY = 0x0853, + SMSG_SET_MELEE_ANIM_KIT = 0x0C83, + SMSG_SET_MOVEMENT_ANIM_KIT = 0x0688, + SMSG_SET_PCT_SPELL_MODIFIER = 0x01BA, + SMSG_SET_PET_SPECIALIZATION = 0x0132, SMSG_SET_PLAYER_DECLINED_NAMES_RESULT = 0x0CA2, - SMSG_SET_PLAY_HOVER_ANIM = 0x0F9E, - SMSG_SET_PROFICIENCY = 0x0D75, - SMSG_SET_SPELL_CHARGES = 0x1909, - SMSG_SET_TASK_COMPLETE = 0x0865, - SMSG_SET_TIME_ZONE_INFORMATION = 0x073A, - SMSG_SET_VEHICLE_REC_ID = 0x0F1F, - SMSG_SHOW_BANK = 0x179F, - SMSG_SHOW_MAILBOX = 0x1871, - SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x0331, - SMSG_SHOW_TAXI_NODES = 0x0FB8, - SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x1E0D, - SMSG_SOCKET_GEMS = 0x1DF6, - SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x1640, - SMSG_SPECIAL_MOUNT_ANIM = 0x1319, - SMSG_SPELL_CHANNEL_START = 0x103E, - SMSG_SPELL_CHANNEL_UPDATE = 0x10D9, - SMSG_SPELL_COOLDOWN = 0x1D2A, - SMSG_SPELL_DAMAGE_SHIELD = 0x10FE, - SMSG_SPELL_DELAYED = 0x14FD, - SMSG_SPELL_DISPELL_LOG = 0x10FD, - SMSG_SPELL_ENERGIZE_LOG = 0x1C3D, - SMSG_SPELL_EXECUTE_LOG = 0x1D9A, - SMSG_SPELL_FAILED_OTHER = 0x10CE, - SMSG_SPELL_FAILURE = 0x1CAD, - SMSG_SPELL_GO = 0x1CB9, - SMSG_SPELL_HEAL_LOG = 0x155A, - SMSG_SPELL_INSTAKILL_LOG = 0x11FE, - SMSG_SPELL_INTERRUPT_LOG = 0x185E, - SMSG_SPELL_MISS_LOG = 0x147A, - SMSG_SPELL_MULTISTRIKE_EFFECT = 0x150A, - SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x141E, - SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x11B9, - SMSG_SPELL_PERIODIC_AURA_LOG = 0x14E9, - SMSG_SPELL_START = 0x14BA, - SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x1419, - SMSG_SPIRIT_HEALER_CONFIRM = 0x1737, - SMSG_STAND_STATE_UPDATE = 0x0B37, - SMSG_START_ELAPSED_TIMER = 0x0E98, - SMSG_START_ELAPSED_TIMERS = 0x063D, - SMSG_START_LOOT_ROLL = 0x0831, - SMSG_START_MIRROR_TIMER = 0x0861, - SMSG_START_TIMER = 0x1A2D, - SMSG_STOP_ELAPSED_TIMER = 0x0795, - SMSG_STOP_MIRROR_TIMER = 0x0BB6, - SMSG_STOP_SPEAKERBOT_SOUND = 0x1E81, - SMSG_STREAMING_MOVIES = 0x0DE6, - SMSG_SUMMON_CANCEL = 0x1926, - SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x08E5, - SMSG_SUMMON_REQUEST = 0x1CE1, - SMSG_SUPERCEDED_SPELLS = 0x15EA, - SMSG_SUPPRESS_NPC_GREETINGS = 0x07A0, - SMSG_SUSPEND_COMMS = 0x001E, - SMSG_SUSPEND_TOKEN = 0x07BF, - SMSG_TALENTS_INVOLUNTARILY_RESET = 0x1246, - SMSG_TAXI_NODE_STATUS = 0x0EBF, - SMSG_TEXT_EMOTE = 0x0696, - SMSG_THREAT_CLEAR = 0x0F1D, - SMSG_THREAT_REMOVE = 0x0BBE, - SMSG_THREAT_UPDATE = 0x0AC0, - SMSG_TIME_ADJUSTMENT = 0x06C8, - SMSG_TIME_SYNC_REQUEST = 0x1E23, - SMSG_TITLE_EARNED = 0x1E03, - SMSG_TITLE_LOST = 0x03B2, - SMSG_TOKEN_UNK1 = 0x1796, - SMSG_TOTEM_CREATED = 0x0BB7, - SMSG_TOTEM_MOVED = 0x040E, - SMSG_TRADE_STATUS = 0x071A, - SMSG_TRADE_UPDATED = 0x123F, - SMSG_TRAINER_BUY_FAILED = 0x0876, - SMSG_TRAINER_LIST = 0x17B2, - SMSG_TRANSFER_ABORTED = 0x1D31, - SMSG_TRANSFER_PENDING = 0x03B8, - SMSG_TRIGGER_CINEMATIC = 0x1CF6, - SMSG_TRIGGER_MOVIE = 0x163A, - SMSG_TURN_IN_PETITION_RESULT = 0x0A45, - SMSG_TUTORIAL_FLAGS = 0x0E82, - SMSG_TWITTER_STATUS = 0x0CBB, - SMSG_UI_TIME = 0x0DA1, - SMSG_UNDELETE_CHARACTER_RESPONSE = 0x0CA5, - SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x0B9F, - SMSG_UNLEARNED_SPELLS = 0x151E, - SMSG_UPDATE_ACCOUNT_DATA = 0x1698, - SMSG_UPDATE_ACTION_BUTTONS = 0x03C0, - SMSG_UPDATE_CHARACTER_FLAGS = 0x171E, - SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x0B3A, - SMSG_UPDATE_EXPANSION_LEVEL = 0x1236, - SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x12BF, - SMSG_UPDATE_LAST_INSTANCE = 0x0971, - SMSG_UPDATE_OBJECT = 0x1CB2, - SMSG_UPDATE_TALENT_DATA = 0x1862, - SMSG_UPDATE_TASK_PROGRESS = 0x1317, - SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x103A, - SMSG_UPDATE_WORLD_STATE = 0x1DF1, - SMSG_UPDATE_WOW_TOKEN_AUCTIONABLE_LIST_RESPONSE = 0x1836, - SMSG_USERLIST_ADD = 0x15F0, - SMSG_USERLIST_REMOVE = 0x10E4, - SMSG_USERLIST_UPDATE = 0x18EF, - SMSG_USE_EQUIPMENT_SET_RESULT = 0x07B2, - SMSG_VENDOR_INVENTORY = 0x0E40, - SMSG_VIGNETTE_UPDATE = 0x1691, - SMSG_VOICE_CHAT_STATUS = 0x10D0, - SMSG_VOICE_PARENTAL_CONTROLS = 0x18E4, - SMSG_VOICE_SESSION_LEAVE = 0x18EB, - SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x11C4, - SMSG_VOID_ITEM_SWAP_RESPONSE = 0x08A5, - SMSG_VOID_STORAGE_CONTENTS = 0x0F82, - SMSG_VOID_STORAGE_FAILED = 0x1962, - SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x162F, - SMSG_VOID_TRANSFER_RESULT = 0x0D66, - SMSG_WAIT_QUEUE_FINISH = 0x163E, - SMSG_WAIT_QUEUE_UPDATE = 0x0A18, - SMSG_WARDEN_DATA = 0x0E96, - SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x0965, - SMSG_WEATHER = 0x0397, - SMSG_WEEKLY_SPELL_USAGE = 0x1199, - SMSG_WHO = 0x11CC, - SMSG_WHO_IS = 0x0F20, - SMSG_WORLD_SERVER_INFO = 0x0FB5, - SMSG_WORLD_TEXT = 0x1CB6, - SMSG_XP_GAIN_ABORTED = 0x19F5, - SMSG_XP_GAIN_ENABLED = 0x0EB7, - SMSG_ZONE_UNDER_ATTACK = 0x14CF, + SMSG_SET_PLAY_HOVER_ANIM = 0x0F35, + SMSG_SET_PROFICIENCY = 0x0A53, + SMSG_SET_SPELL_CHARGES = 0x002D, + SMSG_SET_TASK_COMPLETE = 0x0C9B, + SMSG_SET_TIME_ZONE_INFORMATION = 0x0E9C, + SMSG_SET_VEHICLE_REC_ID = 0x0952, + SMSG_SHOW_BANK = 0x01C2, + SMSG_SHOW_MAILBOX = 0x02D2, + SMSG_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI = 0x068C, + SMSG_SHOW_TAXI_NODES = 0x1086, + SMSG_SHOW_TRADE_SKILL_RESPONSE = 0x0C97, + SMSG_SOCKET_GEMS = 0x061C, + SMSG_SOR_START_EXPERIENCE_INCOMPLETE = 0x0448, + SMSG_SPECIAL_MOUNT_ANIM = 0x0E13, + SMSG_SPELL_ABSORB_LOG = 0x0139, + SMSG_SPELL_CHANNEL_START = 0x07BD, + SMSG_SPELL_CHANNEL_UPDATE = 0x067E, + SMSG_SPELL_COOLDOWN = 0x0569, + SMSG_SPELL_DAMAGE_SHIELD = 0x07B9, + SMSG_SPELL_DELAYED = 0x012E, + SMSG_SPELL_DISPELL_LOG = 0x04AA, + SMSG_SPELL_ENERGIZE_LOG = 0x05EE, + SMSG_SPELL_EXECUTE_LOG = 0x0C39, + SMSG_SPELL_FAILED_OTHER = 0x0BAA, + SMSG_SPELL_FAILURE = 0x00EA, + SMSG_SPELL_GO = 0x046E, + SMSG_SPELL_HEAL_LOG = 0x02A9, + SMSG_SPELL_INSTAKILL_LOG = 0x02FA, + SMSG_SPELL_INTERRUPT_LOG = 0x05A9, + SMSG_SPELL_MISS_LOG = 0x07BE, + SMSG_SPELL_MULTISTRIKE_EFFECT = 0x02EE, + SMSG_SPELL_NON_MELEE_DAMAGE_LOG = 0x062E, + SMSG_SPELL_OR_DAMAGE_IMMUNE = 0x00BE, + SMSG_SPELL_PERIODIC_AURA_LOG = 0x06FA, + SMSG_SPELL_START = 0x007D, + SMSG_SPELL_UPDATE_CHAIN_TARGETS = 0x04A9, + SMSG_SPIRIT_HEALER_CONFIRM = 0x0E4C, + SMSG_STAND_STATE_UPDATE = 0x0A52, + SMSG_START_ELAPSED_TIMER = 0x0498, + SMSG_START_ELAPSED_TIMERS = 0x048F, + SMSG_START_LOOT_ROLL = 0x0B42, + SMSG_START_MIRROR_TIMER = 0x0E32, + SMSG_START_TIMER = 0x0F26, + SMSG_STOP_ELAPSED_TIMER = 0x0A8C, + SMSG_STOP_MIRROR_TIMER = 0x0293, + SMSG_STOP_SPEAKERBOT_SOUND = 0x0831, + SMSG_STREAMING_MOVIES = 0x0A35, + SMSG_SUMMON_CANCEL = 0x00B5, + SMSG_SUMMON_RAID_MEMBER_VALIDATE_FAILED = 0x0A10, + SMSG_SUMMON_REQUEST = 0x0053, + SMSG_SUPERCEDED_SPELLS = 0x023A, + SMSG_SUPPRESS_NPC_GREETINGS = 0x0B22, + SMSG_SUSPEND_COMMS = 0x1105, + SMSG_SUSPEND_TOKEN = 0x0FA5, + SMSG_TALENTS_INVOLUNTARILY_RESET = 0x00B1, + SMSG_TAXI_NODE_STATUS = 0x00DF, + SMSG_TEXT_EMOTE = 0x0C54, + SMSG_THREAT_CLEAR = 0x0C9C, + SMSG_THREAT_REMOVE = 0x0A83, + SMSG_THREAT_UPDATE = 0x0660, + SMSG_TIME_ADJUSTMENT = 0x1DC7, + SMSG_TIME_SYNC_REQUEST = 0x1097, + SMSG_TITLE_EARNED = 0x0A0C, + SMSG_TITLE_LOST = 0x0852, + SMSG_TOTEM_CREATED = 0x0851, + SMSG_TOTEM_MOVED = 0x03B2, + SMSG_TRADE_STATUS = 0x0A9C, + SMSG_TRADE_UPDATED = 0x0EA0, + SMSG_TRAINER_BUY_FAILED = 0x0C1F, + SMSG_TRAINER_LIST = 0x03C6, + SMSG_TRANSFER_ABORTED = 0x03C2, + SMSG_TRANSFER_PENDING = 0x05B5, + SMSG_TRIGGER_CINEMATIC = 0x0422, + SMSG_TRIGGER_MOVIE = 0x045C, + SMSG_TURN_IN_PETITION_RESULT = 0x0C88, + SMSG_TUTORIAL_FLAGS = 0x0C5C, + SMSG_TWITTER_STATUS = 0x04DA, + SMSG_UI_TIME = 0x0B52, + SMSG_UNDELETE_CHARACTER_RESPONSE = 0x0A47, + SMSG_UNDELETE_COOLDOWN_STATUS_RESPONSE = 0x0620, + SMSG_UNLEARNED_SPELLS = 0x04B9, + SMSG_UPDATE_ACCOUNT_DATA = 0x02C3, + SMSG_UPDATE_ACTION_BUTTONS = 0x0A0B, + SMSG_UPDATE_CHARACTER_FLAGS = 0x0CCF, + SMSG_UPDATE_DUNGEON_ENCOUNTER_FOR_LOOT = 0x0642, + SMSG_UPDATE_EXPANSION_LEVEL = 0x009C, + SMSG_UPDATE_INSTANCE_OWNERSHIP = 0x03D1, + SMSG_UPDATE_LAST_INSTANCE = 0x0C0F, + SMSG_UPDATE_OBJECT = 0x0D36, + SMSG_UPDATE_TALENT_DATA = 0x0057, + SMSG_UPDATE_TASK_PROGRESS = 0x0E98, + SMSG_UPDATE_WEEKLY_SPELL_USAGE = 0x09FE, + SMSG_UPDATE_WORLD_STATE = 0x0036, + SMSG_USERLIST_ADD = 0x1C59, + SMSG_USERLIST_REMOVE = 0x1D5A, + SMSG_USERLIST_UPDATE = 0x1489, + SMSG_USE_EQUIPMENT_SET_RESULT = 0x0897, + SMSG_VENDOR_INVENTORY = 0x0AD4, + SMSG_VIGNETTE_UPDATE = 0x08CC, + SMSG_VOICE_CHAT_STATUS = 0x168A, + SMSG_VOICE_PARENTAL_CONTROLS = 0x1DC9, + SMSG_VOICE_SESSION_LEAVE = 0x1D9A, + SMSG_VOICE_SESSION_ROSTER_UPDATE = 0x1409, + SMSG_VOID_ITEM_SWAP_RESPONSE = 0x0004, + SMSG_VOID_STORAGE_CONTENTS = 0x08D2, + SMSG_VOID_STORAGE_FAILED = 0x008B, + SMSG_VOID_STORAGE_TRANSFER_CHANGES = 0x00D5, + SMSG_VOID_TRANSFER_RESULT = 0x0D35, + SMSG_WAIT_QUEUE_FINISH = 0x0A84, + SMSG_WAIT_QUEUE_UPDATE = 0x0A56, + SMSG_WARDEN_DATA = 0x0EDC, + SMSG_WARGAME_REQUEST_SUCCESSFULLY_SENT_TO_OPPONENT = 0x0613, + SMSG_WEATHER = 0x0131, + SMSG_WEEKLY_SPELL_USAGE = 0x04E9, + SMSG_WHO = 0x16CA, + SMSG_WHO_IS = 0x0841, + SMSG_WORLD_SERVER_INFO = 0x0626, + SMSG_WORLD_TEXT = 0x0258, + SMSG_WOW_TOKEN_AUCTION_SOLD = 0x0007, + SMSG_WOW_TOKEN_BUY_REQUEST_CONFIRMATION = 0x0855, + SMSG_WOW_TOKEN_BUY_RESULT_CONFIRMATION = 0x024C, + SMSG_WOW_TOKEN_MARKET_PRICE_RESPONSE = 0x0BC5, + SMSG_WOW_TOKEN_REDEEM_GAME_TIME_UPDATED = 0x0420, + SMSG_WOW_TOKEN_REDEEM_REQUEST_CONFIRMATION = 0x0203, + SMSG_WOW_TOKEN_REDEEM_RESULT = 0x008C, + SMSG_WOW_TOKEN_SELL_REQUEST_CONFIRMATION = 0x0898, + SMSG_WOW_TOKEN_SELL_RESULT_CONFIRMATION = 0x06A6, + SMSG_WOW_TOKEN_UPDATE_AUCTIONABLE_LIST_RESPONSE = 0x028F, + SMSG_XP_GAIN_ABORTED = 0x01A6, + SMSG_XP_GAIN_ENABLED = 0x02DC, + SMSG_ZONE_UNDER_ATTACK = 0x1419, // Deleted opcodes, here only to allow compile SMSG_ARENA_TEAM_STATS = 0xBADD, - SMSG_BUY_BANK_SLOT_RESULT = 0xBADD, + SMSG_BUY_BANK_SLOT_RESULT = 0xBADD }; inline bool IsInstanceOnlyOpcode(uint32 opcode) diff --git a/src/server/game/Server/Protocol/PacketLog.cpp b/src/server/game/Server/Protocol/PacketLog.cpp index bc3e09ef3b7..35e02ab9d0c 100644 --- a/src/server/game/Server/Protocol/PacketLog.cpp +++ b/src/server/game/Server/Protocol/PacketLog.cpp @@ -86,7 +86,7 @@ void PacketLog::Initialize() header.Signature[0] = 'P'; header.Signature[1] = 'K'; header.Signature[2] = 'T'; header.FormatVersion = 0x0301; header.SnifferId = 'T'; - header.Build = 19802; // 6.1.2 + header.Build = 20173; // 6.2.0 header.Locale[0] = 'e'; header.Locale[1] = 'n'; header.Locale[2] = 'U'; header.Locale[3] = 'S'; std::memset(header.SessionKey, 0, sizeof(header.SessionKey)); header.SniffStartUnixtime = time(NULL); diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 650e100f514..ab7b0552ff2 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -104,7 +104,7 @@ bool WorldSessionFilter::Process(WorldPacket* packet) } /// WorldSession constructor -WorldSession::WorldSession(uint32 id, uint32 battlenetAccountId, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter): +WorldSession::WorldSession(uint32 id, std::string&& name, uint32 battlenetAccountId, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter): m_muteTime(mute_time), m_timeOutTime(0), AntiDOS(this), @@ -112,6 +112,7 @@ WorldSession::WorldSession(uint32 id, uint32 battlenetAccountId, std::shared_ptr _player(NULL), _security(sec), _accountId(id), + _accountName(std::move(name)), _battlenetAccountId(battlenetAccountId), m_expansion(expansion), _warden(NULL), @@ -184,13 +185,13 @@ std::string WorldSession::GetPlayerInfo() const { std::ostringstream ss; - ss << "[Player: " << GetPlayerName() << " ("; - if (_player) - ss << _player->GetGUID().ToString() << ", "; - else if (!m_playerLoading.IsEmpty()) + ss << "[Player: "; + if (!m_playerLoading.IsEmpty()) ss << "Logging in: " << m_playerLoading.ToString() << ", "; + else if (_player) + ss << _player->GetName() << ' ' << _player->GetGUID().ToString() << ", "; - ss << "Account: " << GetAccountId() << ")]"; + ss << "Account: " << GetAccountId() << "]"; return ss.str(); } @@ -711,13 +712,6 @@ void WorldSession::SendConnectToInstance(WorldPackets::Auth::ConnectToSerial ser SendPacket(connectTo.Write()); } -void WorldSession::LoadGlobalAccountData() -{ - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_DATA); - stmt->setUInt32(0, GetAccountId()); - LoadAccountData(CharacterDatabase.Query(stmt), GLOBAL_CACHE_MASK); -} - void WorldSession::LoadAccountData(PreparedQueryResult result, uint32 mask) { for (uint32 i = 0; i < NUM_ACCOUNT_DATA_TYPES; ++i) @@ -780,13 +774,11 @@ void WorldSession::SetAccountData(AccountDataType type, uint32 time, std::string _accountData[type].Data = data; } -void WorldSession::LoadTutorialsData() +void WorldSession::LoadTutorialsData(PreparedQueryResult result) { memset(_tutorials, 0, sizeof(uint32) * MAX_ACCOUNT_TUTORIAL_VALUES); - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_TUTORIALS); - stmt->setUInt32(0, GetAccountId()); - if (PreparedQueryResult result = CharacterDatabase.Query(stmt)) + if (result) for (uint8 i = 0; i < MAX_ACCOUNT_TUTORIAL_VALUES; ++i) _tutorials[i] = (*result)[i].GetUInt32(); @@ -959,6 +951,10 @@ void WorldSession::ProcessQueryCallbacks() { PreparedQueryResult result; + if (_realmAccountLoginCallback.valid() && _realmAccountLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready && + _accountLoginCallback.valid() && _accountLoginCallback.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + InitializeSessionCallback(_realmAccountLoginCallback.get(), _accountLoginCallback.get()); + //! HandleCharEnumOpcode and HandleCharUndeleteEnumOpcode if (_charEnumCallback.IsReady()) { @@ -1083,7 +1079,15 @@ void WorldSession::InitWarden(BigNumber* k, std::string const& os) _warden = new WardenWin(); _warden->Init(this, k); } - else if (os == "OSX") + else if (os == "Wn64") + { + // Not implemented + } + else if (os == "Mc64") + { + // Not implemented + } + else if (os == "Mac") { // Disabled as it is causing the client to crash // _warden = new WardenMac(); @@ -1094,15 +1098,118 @@ void WorldSession::InitWarden(BigNumber* k, std::string const& os) void WorldSession::LoadPermissions() { uint32 id = GetAccountId(); - std::string name; - AccountMgr::GetName(id, name); uint8 secLevel = GetSecurity(); - _RBACData = new rbac::RBACData(id, name, realmHandle.Index, secLevel); + TC_LOG_DEBUG("rbac", "WorldSession::LoadPermissions [AccountId: %u, Name: %s, realmId: %d, secLevel: %u]", + id, _accountName.c_str(), realmHandle.Index, secLevel); + + _RBACData = new rbac::RBACData(id, _accountName, realmHandle.Index, secLevel); _RBACData->LoadFromDB(); +} + +PreparedQueryResultFuture WorldSession::LoadPermissionsAsync() +{ + uint32 id = GetAccountId(); + uint8 secLevel = GetSecurity(); TC_LOG_DEBUG("rbac", "WorldSession::LoadPermissions [AccountId: %u, Name: %s, realmId: %d, secLevel: %u]", - id, name.c_str(), realmHandle.Index, secLevel); + id, _accountName.c_str(), realmHandle.Index, secLevel); + + _RBACData = new rbac::RBACData(id, _accountName, realmHandle.Index, secLevel); + return _RBACData->LoadFromDBAsync(); +} + +class AccountInfoQueryHolderPerRealm : public SQLQueryHolder +{ +public: + enum + { + GLOBAL_ACCOUNT_DATA = 0, + TUTORIALS, + + MAX_QUERIES + }; + + AccountInfoQueryHolderPerRealm() { SetSize(MAX_QUERIES); } + + bool Initialize(uint32 accountId, uint32 /*battlenetAccountId*/) + { + bool ok = true; + + PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_ACCOUNT_DATA); + stmt->setUInt32(0, accountId); + ok = SetPreparedQuery(GLOBAL_ACCOUNT_DATA, stmt) && ok; + + stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_TUTORIALS); + stmt->setUInt32(0, accountId); + ok = SetPreparedQuery(TUTORIALS, stmt) && ok; + + return ok; + } +}; + +class AccountInfoQueryHolder : public SQLQueryHolder +{ +public: + enum + { + MAX_QUERIES + }; + + AccountInfoQueryHolder() { SetSize(MAX_QUERIES); } + + bool Initialize(uint32 /*accountId*/, uint32 /*battlenetAccountId*/) + { + bool ok = true; + + return ok; + } +}; + +void WorldSession::InitializeSession() +{ + AccountInfoQueryHolderPerRealm* realmHolder = new AccountInfoQueryHolderPerRealm(); + if (!realmHolder->Initialize(GetAccountId(), GetBattlenetAccountId())) + { + delete realmHolder; + SendAuthResponse(AUTH_SYSTEM_ERROR, false); + return; + } + + AccountInfoQueryHolder* holder = new AccountInfoQueryHolder(); + if (!holder->Initialize(GetAccountId(), GetBattlenetAccountId())) + { + delete realmHolder; + delete holder; + SendAuthResponse(AUTH_SYSTEM_ERROR, false); + return; + } + + _realmAccountLoginCallback = CharacterDatabase.DelayQueryHolder(realmHolder); + _accountLoginCallback = LoginDatabase.DelayQueryHolder(holder); +} + +void WorldSession::InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQueryHolder* holder) +{ + LoadAccountData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::GLOBAL_ACCOUNT_DATA), GLOBAL_CACHE_MASK); + LoadTutorialsData(realmHolder->GetPreparedResult(AccountInfoQueryHolderPerRealm::TUTORIALS)); + + if (!m_inQueue) + SendAuthResponse(AUTH_OK, false); + else + SendAuthWaitQue(0); + + SetInQueue(false); + ResetTimeOutTime(); + + SendSetTimeZoneInformation(); + SendFeatureSystemStatusGlueScreen(); + SendAddonsInfo(); + SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION)); + SendTutorialsData(); + + delete realmHolder; + delete holder; } rbac::RBACData* WorldSession::GetRBACData() @@ -1314,7 +1421,6 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co break; } - case CMSG_GM_LAG_REPORT: // 1 3 1 async db query case CMSG_SPELL_CLICK: // not profiled case CMSG_MOVE_DISMISS_VEHICLE: // not profiled { @@ -1332,7 +1438,6 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co case CMSG_DEL_FRIEND: // 7 5 1 async db query case CMSG_ADD_FRIEND: // 6 4 1 async db query case CMSG_CHARACTER_RENAME_REQUEST: // 5 3 1 async db query - case CMSG_GM_SURVEY_SUBMIT: // 2 3 1 async db query case CMSG_BUG_REPORT: // 1 1 1 async db query case CMSG_SET_PARTY_LEADER: // 1 2 1 async db query case CMSG_CONVERT_RAID: // 1 5 1 async db query @@ -1357,10 +1462,6 @@ uint32 WorldSession::DosProtection::GetMaxPacketCounterAllowed(uint16 opcode) co case CMSG_CREATE_CHARACTER: // 7 5 3 async db queries case CMSG_ENUM_CHARACTERS: // 22 3 2 async db queries case CMSG_ENUM_CHARACTERS_DELETED_BY_CLIENT: // 22 3 2 async db queries - case CMSG_GM_TICKET_CREATE: // 1 25 1 async db query - case CMSG_GM_TICKET_UPDATE_TEXT: // 0 15 1 async db query - case CMSG_GM_TICKET_DELETE_TICKET: // 1 25 1 async db query - case CMSG_GM_TICKET_RESPONSE_RESOLVE: // 1 25 1 async db query case CMSG_SUPPORT_TICKET_SUBMIT_BUG: // not profiled 1 async db query case CMSG_SUPPORT_TICKET_SUBMIT_SUGGESTION: // not profiled 1 async db query case CMSG_SUPPORT_TICKET_SUBMIT_COMPLAINT: // not profiled 1 async db query diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 8f74a8900b0..2ff82e187bd 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -280,6 +280,7 @@ namespace WorldPackets namespace Instance { class InstanceInfo; + class ResetInstances; } namespace Item @@ -497,6 +498,7 @@ namespace WorldPackets class SetActionButton; class UnlearnSkill; class SelfRes; + class GetMirrorImageData; } namespace Talent @@ -507,15 +509,8 @@ namespace WorldPackets namespace Ticket { - class GMSurveySubmit; - class GMTicketAcknowledgeSurvey; - class GMTicketCreate; - class GMTicketDelete; class GMTicketGetSystemStatus; class GMTicketGetCaseStatus; - class GMTicketGetTicket; - class GMTicketResponseResolve; - class GMTicketUpdateText; class SupportTicketSubmitBug; class SupportTicketSubmitSuggestion; class SupportTicketSubmitComplaint; @@ -741,7 +736,7 @@ struct PacketCounter class WorldSession { public: - WorldSession(uint32 id, uint32 battlenetAccountId, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter); + WorldSession(uint32 id, std::string&& name, uint32 battlenetAccountId, std::shared_ptr<WorldSocket> sock, AccountTypes sec, uint8 expansion, time_t mute_time, LocaleConstant locale, uint32 recruiter, bool isARecruiter); ~WorldSession(); bool PlayerLoading() const { return !m_playerLoading.IsEmpty(); } @@ -766,9 +761,13 @@ class WorldSession void SendAuthResponse(uint8 code, bool queued, uint32 queuePos = 0); void SendClientCacheVersion(uint32 version); + void InitializeSession(); + void InitializeSessionCallback(SQLQueryHolder* realmHolder, SQLQueryHolder* holder); + rbac::RBACData* GetRBACData(); bool HasPermission(uint32 permissionId); void LoadPermissions(); + PreparedQueryResultFuture LoadPermissionsAsync(); void InvalidateRBACData(); // Used to force LoadPermissions at next HasPermission check AccountTypes GetSecurity() const { return _security; } @@ -851,10 +850,9 @@ class WorldSession // Account Data AccountData const* GetAccountData(AccountDataType type) const { return &_accountData[type]; } void SetAccountData(AccountDataType type, uint32 time, std::string const& data); - void LoadGlobalAccountData(); void LoadAccountData(PreparedQueryResult result, uint32 mask); - void LoadTutorialsData(); + void LoadTutorialsData(PreparedQueryResult result); void SendTutorialsData(); void SaveTutorialsData(SQLTransaction& trans); uint32 GetTutorialInt(uint8 index) const { return _tutorials[index]; } @@ -1029,14 +1027,8 @@ class WorldSession void HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCancel& logoutCancel); // GM Ticket opcodes - void HandleGMTicketCreateOpcode(WorldPackets::Ticket::GMTicketCreate& packet); - void HandleGMTicketUpdateTextOpcode(WorldPackets::Ticket::GMTicketUpdateText& packet); - void HandleGMTicketDeleteOpcode(WorldPackets::Ticket::GMTicketDelete& packet); void HandleGMTicketGetCaseStatusOpcode(WorldPackets::Ticket::GMTicketGetCaseStatus& packet); - void HandleGMTicketGetTicketOpcode(WorldPackets::Ticket::GMTicketGetTicket& packet); void HandleGMTicketSystemStatusOpcode(WorldPackets::Ticket::GMTicketGetSystemStatus& packet); - void HandleGMSurveySubmit(WorldPackets::Ticket::GMSurveySubmit& packet); - void HandleGMResponseResolve(WorldPackets::Ticket::GMTicketResponseResolve& packet); void HandleSupportTicketSubmitBug(WorldPackets::Ticket::SupportTicketSubmitBug& packet); void HandleSupportTicketSubmitSuggestion(WorldPackets::Ticket::SupportTicketSubmitSuggestion& packet); void HandleSupportTicketSubmitComplaint(WorldPackets::Ticket::SupportTicketSubmitComplaint& packet); @@ -1398,7 +1390,7 @@ class WorldSession void HandleRealmSplitOpcode(WorldPacket& recvData); void HandleTimeSyncResponse(WorldPackets::Misc::TimeSyncResponse& packet); void HandleWhoIsOpcode(WorldPackets::Who::WhoIsRequest& packet); - void HandleResetInstancesOpcode(WorldPacket& recvData); + void HandleResetInstancesOpcode(WorldPackets::Instance::ResetInstances& packet); void HandleInstanceLockResponse(WorldPacket& recvPacket); // Looking for Dungeon/Raid @@ -1495,7 +1487,7 @@ class WorldSession // Miscellaneous void HandleSpellClick(WorldPacket& recvData); - void HandleMirrorImageDataRequest(WorldPacket& recvData); + void HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& packet); void HandleRemoveGlyph(WorldPacket& recvData); void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement); void HandleEquipmentSetSave(WorldPackets::EquipmentSet::SaveEquipmentSet& packet); @@ -1535,6 +1527,8 @@ class WorldSession void InitializeQueryCallbackParameters(); void ProcessQueryCallbacks(); + QueryResultHolderFuture _realmAccountLoginCallback; + QueryResultHolderFuture _accountLoginCallback; PreparedQueryResultFuture _addIgnoreCallback; PreparedQueryResultFuture _stablePetCallback; QueryCallback<PreparedQueryResult, bool> _charEnumCallback; @@ -1608,6 +1602,7 @@ class WorldSession AccountTypes _security; uint32 _accountId; + std::string _accountName; uint32 _battlenetAccountId; uint8 m_expansion; diff --git a/src/server/game/Server/WorldSocket.cpp b/src/server/game/Server/WorldSocket.cpp index e4b98f1c54b..027c35dfd7f 100644 --- a/src/server/game/Server/WorldSocket.cpp +++ b/src/server/game/Server/WorldSocket.cpp @@ -44,8 +44,8 @@ struct CompressedWorldPacket using boost::asio::ip::tcp; std::string const WorldSocket::ServerConnectionInitialize("WORLD OF WARCRAFT CONNECTION - SERVER TO CLIENT"); - std::string const WorldSocket::ClientConnectionInitialize("WORLD OF WARCRAFT CONNECTION - CLIENT TO SERVER"); +uint32 const WorldSocket::MinSizeForCompression = 0x400; uint32 const SizeOfClientHeader[2][2] = { @@ -54,7 +54,6 @@ uint32 const SizeOfClientHeader[2][2] = }; uint32 const SizeOfServerHeader[2] = { sizeof(uint16) + sizeof(uint32), sizeof(uint32) }; - WorldSocket::WorldSocket(tcp::socket&& socket) : Socket(std::move(socket)), _type(CONNECTION_TYPE_REALM), _authSeed(rand32()), _OverSpeedPings(0), _worldSession(nullptr), _authed(false), _compressionStream(nullptr), _initialized(false) @@ -73,6 +72,43 @@ WorldSocket::~WorldSocket() void WorldSocket::Start() { + std::string ip_address = GetRemoteIpAddress().to_string(); + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_IP_INFO); + stmt->setString(0, ip_address); + stmt->setUInt32(1, inet_addr(ip_address.c_str())); + + { + std::lock_guard<std::mutex> guard(_queryLock); + _queryCallback = io_service().wrap(std::bind(&WorldSocket::CheckIpCallback, this, std::placeholders::_1)); + _queryFuture = LoginDatabase.AsyncQuery(stmt); + } +} + +void WorldSocket::CheckIpCallback(PreparedQueryResult result) +{ + if (result) + { + bool banned = false; + do + { + Field* fields = result->Fetch(); + if (fields[0].GetUInt64() != 0) + banned = true; + + if (!fields[1].GetString().empty()) + _ipCountry = fields[1].GetString(); + + } while (result->NextRow()); + + if (banned) + { + SendAuthResponseError(AUTH_REJECT); + TC_LOG_ERROR("network", "WorldSocket::CheckIpCallback: Sent Auth Response (IP %s banned).", GetRemoteIpAddress().to_string().c_str()); + DelayedCloseSocket(); + return; + } + } + AsyncRead(); MessageBuffer initializer; @@ -85,6 +121,23 @@ void WorldSocket::Start() QueuePacket(std::move(initializer), guard); } +bool WorldSocket::Update() +{ + if (!BaseSocket::Update()) + return false; + + { + std::lock_guard<std::mutex> guard(_queryLock); + if (_queryFuture.valid() && _queryFuture.wait_for(std::chrono::seconds(0)) == std::future_status::ready) + { + auto callback = std::move(_queryCallback); + callback(_queryFuture.get()); + } + } + + return true; +} + void WorldSocket::HandleSendAuthSession() { _encryptSeed.SetRand(16 * 8); @@ -247,8 +300,8 @@ bool WorldSocket::ReadDataHandler() return false; } - WorldPackets::Auth::AuthSession authSession(std::move(packet)); - authSession.Read(); + std::shared_ptr<WorldPackets::Auth::AuthSession> authSession = std::make_shared<WorldPackets::Auth::AuthSession>(std::move(packet)); + authSession->Read(); HandleAuthSession(authSession); break; } @@ -263,8 +316,8 @@ bool WorldSocket::ReadDataHandler() return false; } - WorldPackets::Auth::AuthContinuedSession authSession(std::move(packet)); - authSession.Read(); + std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession = std::make_shared<WorldPackets::Auth::AuthContinuedSession>(std::move(packet)); + authSession->Read(); HandleAuthContinuedSession(authSession); break; } @@ -375,7 +428,7 @@ void WorldSocket::SendPacket(WorldPacket const& packet) uint32 packetSize = packet.size(); uint32 sizeOfHeader = SizeOfServerHeader[_authCrypt.IsInitialized()]; - if (packetSize > 0x400) + if (packetSize > MinSizeForCompression && _authCrypt.IsInitialized()) packetSize = compressBound(packetSize) + sizeof(CompressedWorldPacket); std::unique_lock<std::mutex> guard(_writeLock); @@ -403,7 +456,7 @@ void WorldSocket::WritePacketToBuffer(WorldPacket const& packet, MessageBuffer& uint8* headerPos = buffer.GetWritePointer(); buffer.WriteCompleted(sizeOfHeader); - if (packetSize > 0x400) + if (packetSize > MinSizeForCompression && _authCrypt.IsInitialized()) { CompressedWorldPacket cmp; cmp.UncompressedSize = packetSize + 4; @@ -451,7 +504,7 @@ uint32 WorldSocket::CompressPacket(uint8* buffer, WorldPacket const& packet) _compressionStream->next_in = (Bytef*)&opcode; _compressionStream->avail_in = sizeof(uint32); - int32 z_res = deflate(_compressionStream, Z_BLOCK); + int32 z_res = deflate(_compressionStream, Z_NO_FLUSH); if (z_res != Z_OK) { TC_LOG_ERROR("network", "Can't compress packet opcode (zlib: deflate) Error code: %i (%s, msg: %s)", z_res, zError(z_res), _compressionStream->msg); @@ -471,23 +524,86 @@ uint32 WorldSocket::CompressPacket(uint8* buffer, WorldPacket const& packet) return bufferSize - _compressionStream->avail_out; } -void WorldSocket::HandleAuthSession(WorldPackets::Auth::AuthSession& authSession) +struct AccountInfo { - uint8 security; - uint32 id; - LocaleConstant locale; - SHA1Hash sha; - BigNumber k; - bool wardenActive = sWorld->getBoolConfig(CONFIG_WARDEN_ENABLED); + struct + { + uint32 Id; + bool IsLockedToIP; + std::string LastIP; + LocaleConstant Locale; + std::string OS; + bool IsBanned; + + std::string LockCountry; + } BattleNet; + + struct + { + uint32 Id; + BigNumber SessionKey; + uint8 Expansion; + int64 MuteTime; + uint32 Recruiter; + bool IsRectuiter; + AccountTypes Security; + bool IsBanned; + } Game; + + bool IsBanned() const { return BattleNet.IsBanned || Game.IsBanned; } + + explicit AccountInfo(Field* fields) + { + // 0 1 2 3 4 5 6 7 8 9 10 + // SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, a.expansion, a.mutetime, ba.locale, a.recruiter, ba.os, ba.id, aa.gmLevel, + // 11 12 13 + // bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, r.id + // FROM account a LEFT JOIN battlenet_accounts ba ON a.battlenet_account = ba.id LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID IN (-1, ?) + // LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account r ON a.id = r.recruiter + // WHERE a.username = ? ORDER BY aa.RealmID DESC LIMIT 1 + Game.Id = fields[0].GetUInt32(); + Game.SessionKey.SetHexStr(fields[1].GetCString()); + BattleNet.LastIP = fields[2].GetString(); + BattleNet.IsLockedToIP = fields[3].GetBool(); + Game.Expansion = fields[4].GetUInt8(); + Game.MuteTime = fields[5].GetInt64(); + BattleNet.Locale = LocaleConstant(fields[6].GetUInt8()); + Game.Recruiter = fields[7].GetUInt32(); + BattleNet.OS = fields[8].GetString(); + BattleNet.Id = fields[9].GetUInt32(); + Game.Security = AccountTypes(fields[10].GetUInt8()); + BattleNet.IsBanned = fields[11].GetUInt64() != 0; + Game.IsBanned = fields[12].GetUInt64() != 0; + Game.IsRectuiter = fields[13].GetUInt32() != 0; + + uint32 world_expansion = sWorld->getIntConfig(CONFIG_EXPANSION); + if (Game.Expansion > world_expansion) + Game.Expansion = world_expansion; + + if (BattleNet.Locale >= TOTAL_LOCALES) + BattleNet.Locale = LOCALE_enUS; + } +}; + +void WorldSocket::HandleAuthSession(std::shared_ptr<WorldPackets::Auth::AuthSession> authSession) +{ + // Client switches packet headers after sending CMSG_AUTH_SESSION + _headerBuffer.Resize(SizeOfClientHeader[1][1]); // Get the account information from the auth database - // 0 1 2 3 4 5 6 7 8 - // SELECT id, sessionkey, last_ip, locked, expansion, mutetime, locale, recruiter, os FROM account WHERE username = ? PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME); - stmt->setString(0, authSession.Account); + stmt->setInt32(0, int32(realmHandle.Index)); + stmt->setString(1, authSession->Account); - PreparedQueryResult result = LoginDatabase.Query(stmt); + { + std::lock_guard<std::mutex> guard(_queryLock); + _queryCallback = io_service().wrap(std::bind(&WorldSocket::HandleAuthSessionCallback, this, authSession, std::placeholders::_1)); + _queryFuture = LoginDatabase.AsyncQuery(stmt); + } +} +void WorldSocket::HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::AuthSession> authSession, PreparedQueryResult result) +{ // Stop if the account is not found if (!result) { @@ -498,33 +614,20 @@ void WorldSocket::HandleAuthSession(WorldPackets::Auth::AuthSession& authSession return; } - Field* fields = result->Fetch(); - - uint8 expansion = fields[4].GetUInt8(); - uint32 world_expansion = sWorld->getIntConfig(CONFIG_EXPANSION); - if (expansion > world_expansion) - expansion = world_expansion; + AccountInfo account(result->Fetch()); // For hook purposes, we get Remoteaddress at this point. std::string address = GetRemoteIpAddress().to_string(); // As we don't know if attempted login process by ip works, we update last_attempt_ip right away - stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_ATTEMPT_IP); - + PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_ATTEMPT_IP); stmt->setString(0, address); - stmt->setString(1, authSession.Account); - + stmt->setString(1, authSession->Account); LoginDatabase.Execute(stmt); // This also allows to check for possible "hack" attempts on account - // id has to be fetched at this point, so that first actual account response that fails can be logged - id = fields[0].GetUInt32(); - - k.SetHexStr(fields[1].GetCString()); - // even if auth credentials are bad, try using the session key we have - client cannot read auth response error without it - _authCrypt.Init(&k); - _headerBuffer.Resize(SizeOfClientHeader[1][1]); + _authCrypt.Init(&account.Game.SessionKey); // First reject the connection if packet contains invalid data or realm state doesn't allow logging in if (sWorld->IsClosed()) @@ -535,7 +638,7 @@ void WorldSocket::HandleAuthSession(WorldPackets::Auth::AuthSession& authSession return; } - if (authSession.RealmID != realmHandle.Index) + if (authSession->RealmID != realmHandle.Index) { SendAuthResponseError(REALM_LIST_REALM_NOT_FOUND); TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (bad realm)."); @@ -543,13 +646,20 @@ void WorldSocket::HandleAuthSession(WorldPackets::Auth::AuthSession& authSession return; } - std::string os = fields[8].GetString(); - // Must be done before WorldSession is created - if (wardenActive && os != "Win" && os != "OSX") + bool wardenActive = sWorld->getBoolConfig(CONFIG_WARDEN_ENABLED); + if (wardenActive && account.BattleNet.OS != "Win" && account.BattleNet.OS != "Wn64" && account.BattleNet.OS != "Mc64") + { + SendAuthResponseError(AUTH_REJECT); + TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s attempted to log in using invalid client OS (%s).", address.c_str(), account.BattleNet.OS.c_str()); + DelayedCloseSocket(); + return; + } + + if (!account.BattleNet.Id || authSession->LoginServerType != 1) { SendAuthResponseError(AUTH_REJECT); - TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s attempted to log in using invalid client OS (%s).", address.c_str(), os.c_str()); + TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Client %s (%s) attempted to log in using deprecated login method (GRUNT).", authSession->Account.c_str(), address.c_str()); DelayedCloseSocket(); return; } @@ -557,151 +667,141 @@ void WorldSocket::HandleAuthSession(WorldPackets::Auth::AuthSession& authSession // Check that Key and account name are the same on client and server uint32 t = 0; - sha.UpdateData(authSession.Account); + SHA1Hash sha; + sha.UpdateData(authSession->Account); sha.UpdateData((uint8*)&t, 4); - sha.UpdateData((uint8*)&authSession.LocalChallenge, 4); + sha.UpdateData((uint8*)&authSession->LocalChallenge, 4); sha.UpdateData((uint8*)&_authSeed, 4); - sha.UpdateBigNumbers(&k, NULL); + sha.UpdateBigNumbers(&account.Game.SessionKey, NULL); sha.Finalize(); - if (memcmp(sha.GetDigest(), authSession.Digest, SHA_DIGEST_LENGTH) != 0) + if (memcmp(sha.GetDigest(), authSession->Digest, SHA_DIGEST_LENGTH) != 0) { SendAuthResponseError(AUTH_FAILED); - TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", id, authSession.Account.c_str(), address.c_str()); + TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Authentication failed for account: %u ('%s') address: %s", account.Game.Id, authSession->Account.c_str(), address.c_str()); DelayedCloseSocket(); return; } ///- Re-check ip locking (same check as in auth). - if (fields[3].GetUInt8() == 1) // if ip is locked + if (account.BattleNet.IsLockedToIP) { - if (strcmp(fields[2].GetCString(), address.c_str()) != 0) + if (account.BattleNet.LastIP != address) { SendAuthResponseError(AUTH_FAILED); - TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs. Original IP: %s, new IP: %s).", fields[2].GetCString(), address.c_str()); + TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Sent Auth Response (Account IP differs. Original IP: %s, new IP: %s).", account.BattleNet.LastIP.c_str(), address.c_str()); // We could log on hook only instead of an additional db log, however action logger is config based. Better keep DB logging as well - sScriptMgr->OnFailedAccountLogin(id); + sScriptMgr->OnFailedAccountLogin(account.Game.Id); + DelayedCloseSocket(); + return; + } + } + else if (!account.BattleNet.LockCountry.empty() && !_ipCountry.empty()) + { + if (account.BattleNet.LockCountry != _ipCountry) + { + SendAuthResponseError(AUTH_FAILED); + TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Sent Auth Response (Account country differs. Original country: %s, new country: %s).", account.BattleNet.LockCountry.c_str(), _ipCountry.c_str()); + // We could log on hook only instead of an additional db log, however action logger is config based. Better keep DB logging as well + sScriptMgr->OnFailedAccountLogin(account.Game.Id); DelayedCloseSocket(); return; } } - int64 mutetime = fields[5].GetInt64(); + int64 mutetime = account.Game.MuteTime; //! Negative mutetime indicates amount of seconds to be muted effective on next login - which is now. if (mutetime < 0) { mutetime = time(NULL) + llabs(mutetime); stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_MUTE_TIME_LOGIN); - stmt->setInt64(0, mutetime); - stmt->setUInt32(1, id); - + stmt->setUInt32(1, account.Game.Id); LoginDatabase.Execute(stmt); } - locale = LocaleConstant(fields[6].GetUInt8()); - if (locale >= TOTAL_LOCALES) - locale = LOCALE_enUS; - - uint32 recruiter = fields[7].GetUInt32(); - - uint32 battlenetAccountId = 0; - if (authSession.LoginServerType == 1) - battlenetAccountId = Battlenet::AccountMgr::GetIdByGameAccount(id); - - // Checks gmlevel per Realm - stmt = LoginDatabase.GetPreparedStatement(LOGIN_GET_GMLEVEL_BY_REALMID); - - stmt->setUInt32(0, id); - stmt->setInt32(1, int32(realmHandle.Index)); - - result = LoginDatabase.Query(stmt); - - if (!result) - security = 0; - else - { - fields = result->Fetch(); - security = fields[0].GetUInt8(); - } - - // Re-check account ban (same check as in auth) - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_BANS); - - stmt->setUInt32(0, id); - stmt->setString(1, address); - - PreparedQueryResult banresult = LoginDatabase.Query(stmt); - - if (banresult) // if account banned + if (account.IsBanned()) { SendAuthResponseError(AUTH_BANNED); TC_LOG_ERROR("network", "WorldSocket::HandleAuthSession: Sent Auth Response (Account banned)."); - sScriptMgr->OnFailedAccountLogin(id); + sScriptMgr->OnFailedAccountLogin(account.Game.Id); DelayedCloseSocket(); return; } // Check locked state for server AccountTypes allowedAccountType = sWorld->GetPlayerSecurityLimit(); - TC_LOG_DEBUG("network", "Allowed Level: %u Player Level %u", allowedAccountType, AccountTypes(security)); - if (allowedAccountType > SEC_PLAYER && AccountTypes(security) < allowedAccountType) + TC_LOG_DEBUG("network", "Allowed Level: %u Player Level %u", allowedAccountType, account.Game.Security); + if (allowedAccountType > SEC_PLAYER && account.Game.Security < allowedAccountType) { SendAuthResponseError(AUTH_UNAVAILABLE); TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: User tries to login but his security level is not enough"); - sScriptMgr->OnFailedAccountLogin(id); + sScriptMgr->OnFailedAccountLogin(account.Game.Id); DelayedCloseSocket(); return; } - TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.", - authSession.Account.c_str(), address.c_str()); - - // Check if this user is by any chance a recruiter - stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_RECRUITER); - - stmt->setUInt32(0, id); - - result = LoginDatabase.Query(stmt); - - bool isRecruiter = false; - if (result) - isRecruiter = true; + TC_LOG_DEBUG("network", "WorldSocket::HandleAuthSession: Client '%s' authenticated successfully from %s.", authSession->Account.c_str(), address.c_str()); // Update the last_ip in the database as it was successful for login stmt = LoginDatabase.GetPreparedStatement(LOGIN_UPD_LAST_IP); stmt->setString(0, address); - stmt->setString(1, authSession.Account); + stmt->setString(1, authSession->Account); LoginDatabase.Execute(stmt); // At this point, we can safely hook a successful login - sScriptMgr->OnAccountLogin(id); + sScriptMgr->OnAccountLogin(account.Game.Id); _authed = true; - _worldSession = new WorldSession(id, battlenetAccountId, shared_from_this(), AccountTypes(security), expansion, mutetime, locale, recruiter, isRecruiter); - _worldSession->LoadGlobalAccountData(); - _worldSession->LoadTutorialsData(); - _worldSession->ReadAddonsInfo(authSession.AddonInfo); - _worldSession->LoadPermissions(); + _worldSession = new WorldSession(account.Game.Id, std::move(authSession->Account), account.BattleNet.Id, shared_from_this(), account.Game.Security, + account.Game.Expansion, mutetime, account.BattleNet.Locale, account.Game.Recruiter, account.Game.IsRectuiter); + _worldSession->ReadAddonsInfo(authSession->AddonInfo); // Initialize Warden system only if it is enabled by config if (wardenActive) - _worldSession->InitWarden(&k, os); + _worldSession->InitWarden(&account.Game.SessionKey, account.BattleNet.OS); + + _queryCallback = io_service().wrap(std::bind(&WorldSocket::LoadSessionPermissionsCallback, this, std::placeholders::_1)); + _queryFuture = _worldSession->LoadPermissionsAsync(); +} + +void WorldSocket::LoadSessionPermissionsCallback(PreparedQueryResult result) +{ + // RBAC must be loaded before adding session to check for skip queue permission + _worldSession->GetRBACData()->LoadFromDBCallback(result); sWorld->AddSession(_worldSession); } -void WorldSocket::HandleAuthContinuedSession(WorldPackets::Auth::AuthContinuedSession& authSession) +void WorldSocket::HandleAuthContinuedSession(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession) { - uint32 accountId = PAIR64_LOPART(authSession.Key); - _type = ConnectionType(PAIR64_HIPART(authSession.Key)); + _type = ConnectionType(PAIR64_HIPART(authSession->Key)); + if (_type != CONNECTION_TYPE_INSTANCE) + { + SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT); + DelayedCloseSocket(); + return; + } + // Client switches packet headers after sending CMSG_AUTH_CONTINUED_SESSION + _headerBuffer.Resize(SizeOfClientHeader[1][1]); + + uint32 accountId = PAIR64_LOPART(authSession->Key); PreparedStatement* stmt = LoginDatabase.GetPreparedStatement(LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION); stmt->setUInt32(0, accountId); - PreparedQueryResult result = LoginDatabase.Query(stmt); + + { + std::lock_guard<std::mutex> guard(_queryLock); + _queryCallback = io_service().wrap(std::bind(&WorldSocket::HandleAuthContinuedSessionCallback, this, authSession, std::placeholders::_1)); + _queryFuture = LoginDatabase.AsyncQuery(stmt); + } +} + +void WorldSocket::HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession, PreparedQueryResult result) +{ if (!result) { SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT); @@ -709,13 +809,13 @@ void WorldSocket::HandleAuthContinuedSession(WorldPackets::Auth::AuthContinuedSe return; } + uint32 accountId = PAIR64_LOPART(authSession->Key); Field* fields = result->Fetch(); std::string login = fields[0].GetString(); BigNumber k; k.SetHexStr(fields[1].GetCString()); _authCrypt.Init(&k, _encryptSeed.AsByteArray().get(), _decryptSeed.AsByteArray().get()); - _headerBuffer.Resize(SizeOfClientHeader[1][1]); SHA1Hash sha; sha.UpdateData(login); @@ -723,7 +823,7 @@ void WorldSocket::HandleAuthContinuedSession(WorldPackets::Auth::AuthContinuedSe sha.UpdateData((uint8*)&_authSeed, 4); sha.Finalize(); - if (memcmp(sha.GetDigest(), authSession.Digest, sha.GetLength())) + if (memcmp(sha.GetDigest(), authSession->Digest, sha.GetLength())) { SendAuthResponseError(AUTH_UNKNOWN_ACCOUNT); TC_LOG_ERROR("network", "WorldSocket::HandleAuthContinuedSession: Authentication failed for account: %u ('%s') address: %s", accountId, login.c_str(), GetRemoteIpAddress().to_string().c_str()); diff --git a/src/server/game/Server/WorldSocket.h b/src/server/game/Server/WorldSocket.h index e42a310f470..9b51b564c8e 100644 --- a/src/server/game/Server/WorldSocket.h +++ b/src/server/game/Server/WorldSocket.h @@ -69,8 +69,10 @@ union ClientPktHeader class WorldSocket : public Socket<WorldSocket> { static std::string const ServerConnectionInitialize; - static std::string const ClientConnectionInitialize; + static uint32 const MinSizeForCompression; + + typedef Socket<WorldSocket> BaseSocket; public: WorldSocket(tcp::socket&& socket); @@ -80,6 +82,7 @@ public: WorldSocket& operator=(WorldSocket const& right) = delete; void Start() override; + bool Update() override; void SendPacket(WorldPacket const& packet); @@ -94,6 +97,8 @@ protected: bool ReadHeaderHandler(); bool ReadDataHandler(); private: + void CheckIpCallback(PreparedQueryResult result); + /// writes network.opcode log /// accessing WorldSession is not threadsafe, only do it when holding _worldSessionLock void LogOpcodeText(OpcodeClient opcode, std::unique_lock<std::mutex> const& guard) const; @@ -103,8 +108,11 @@ private: uint32 CompressPacket(uint8* buffer, WorldPacket const& packet); void HandleSendAuthSession(); - void HandleAuthSession(WorldPackets::Auth::AuthSession& authSession); - void HandleAuthContinuedSession(WorldPackets::Auth::AuthContinuedSession& authSession); + void HandleAuthSession(std::shared_ptr<WorldPackets::Auth::AuthSession> authSession); + void HandleAuthSessionCallback(std::shared_ptr<WorldPackets::Auth::AuthSession> authSession, PreparedQueryResult result); + void HandleAuthContinuedSession(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession); + void HandleAuthContinuedSessionCallback(std::shared_ptr<WorldPackets::Auth::AuthContinuedSession> authSession, PreparedQueryResult result); + void LoadSessionPermissionsCallback(PreparedQueryResult result); void HandleConnectToFailed(WorldPackets::Auth::ConnectToFailed& connectToFailed); bool HandlePing(WorldPacket& recvPacket); @@ -131,6 +139,11 @@ private: z_stream_s* _compressionStream; bool _initialized; + + std::mutex _queryLock; + PreparedQueryResultFuture _queryFuture; + std::function<void(PreparedQueryResult&&)> _queryCallback; + std::string _ipCountry; }; #endif diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 669b90e6392..e47836c221c 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -460,8 +460,8 @@ enum AuraType SPELL_AURA_400 = 400, SPELL_AURA_401 = 401, SPELL_AURA_402 = 402, - SPELL_AURA_403 = 403, - SPELL_AURA_404 = 404, + SPELL_AURA_OVERRIDE_SPELL_VISUAL = 403, + SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT = 404, SPELL_AURA_405 = 405, SPELL_AURA_406 = 406, SPELL_AURA_MOD_FEAR_2 = 407, // NYI @@ -476,7 +476,7 @@ enum AuraType SPELL_AURA_416 = 416, SPELL_AURA_417 = 417, SPELL_AURA_418 = 418, - SPELL_AURA_419 = 419, + SPELL_AURA_MOD_BASE_MANA_PCT = 419, SPELL_AURA_MOD_BATTLE_PET_XP_PCT = 420, // NYI SPELL_AURA_421 = 421, SPELL_AURA_422 = 422, @@ -523,7 +523,7 @@ enum AuraType SPELL_AURA_CONVER_CRIT_RATING_PCT_TO_PARRY_RATING = 463, // NYI SPELL_AURA_464 = 464, SPELL_AURA_465 = 465, - SPELL_AURA_466 = 466, + SPELL_AURA_MOD_BONUS_ARMOR_PCT = 466, // Affects bonus armor gain from all sources except base stats SPELL_AURA_MOD_STAT_BONUS_PCT = 467, // Affects stat gain from all sources except base stats SPELL_AURA_468 = 468, SPELL_AURA_469 = 469, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 5abf9d10375..79971717305 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -426,7 +426,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //363 SPELL_AURA_MOD_NEXT_SPELL &AuraEffect::HandleUnused, //364 unused (4.3.4) &AuraEffect::HandleNULL, //365 SPELL_AURA_MAX_FAR_CLIP_PLANE - &AuraEffect::HandleNULL, //366 SPELL_AURA_OVERRIDE_SPELL_POWER_BY_AP_PCT + &AuraEffect::HandleOverrideSpellPowerByAttackPower, //366 SPELL_AURA_OVERRIDE_SPELL_POWER_BY_AP_PCT &AuraEffect::HandleNULL, //367 SPELL_AURA_367 &AuraEffect::HandleUnused, //368 unused (4.3.4) &AuraEffect::HandleNULL, //369 SPELL_AURA_ENABLE_POWER_BAR_TIMER @@ -464,7 +464,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //401 &AuraEffect::HandleNULL, //402 &AuraEffect::HandleNULL, //403 - &AuraEffect::HandleNULL, //404 + &AuraEffect::HandleOverrideAttackPowerBySpellPower, //404 SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT &AuraEffect::HandleNULL, //405 &AuraEffect::HandleNULL, //406 &AuraEffect::HandleNULL, //407 SPELL_AURA_MOD_FEAR_2 @@ -479,7 +479,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //416 &AuraEffect::HandleNULL, //417 &AuraEffect::HandleNULL, //418 - &AuraEffect::HandleNULL, //419 + &AuraEffect::HandleAuraModIncreaseBaseManaPercent, //419 SPELL_AURA_MOD_BASE_MANA_PCT &AuraEffect::HandleNULL, //420 SPELL_AURA_MOD_BATTLE_PET_XP_PCT &AuraEffect::HandleNULL, //421 &AuraEffect::HandleNULL, //422 @@ -526,7 +526,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, //463 SPELL_AURA_CRIT_RATING_AFFECTS_PARRY used by Riposte &AuraEffect::HandleNULL, //464 &AuraEffect::HandleNULL, //465 - &AuraEffect::HandleNULL, //466 + &AuraEffect::HandleNULL, //466 SPELL_AURA_MOD_BONUS_ARMOR_PCT &AuraEffect::HandleModStatBonusPercent, //467 SPELL_AURA_MOD_STAT_BONUS_PCT &AuraEffect::HandleNULL, //468 &AuraEffect::HandleNULL, //469 @@ -2185,12 +2185,6 @@ void AuraEffect::HandleAuraTransform(AuraApplication const* aurApp, uint8 mode, if (uint32 modelid = ci->GetRandomValidModelId()) model_id = modelid; // Will use the default model here - // Polymorph (sheep) - if (GetSpellInfo()->SpellFamilyName == SPELLFAMILY_MAGE && GetSpellInfo()->SpellIconID == 82 && GetSpellInfo()->SpellVisual[0] == 12978) - if (Unit* caster = GetCaster()) - if (caster->HasAura(52648)) // Glyph of the Penguin - model_id = 26452; - target->SetDisplayId(model_id); // Dragonmaw Illusion (set mount model also) @@ -4004,12 +3998,37 @@ void AuraEffect::HandleModStatBonusPercent(AuraApplication const* aurApp, uint8 if (GetMiscValue() == i || GetMiscValue() == -1) { target->HandleStatModifier(UnitMods(UNIT_MOD_STAT_START + i), BASE_PCT_EXCLUDE_CREATE, float(m_amount), apply); - if (target->GetTypeId() == TYPEID_PLAYER || target->ToCreature()->IsPet()) - target->ApplyStatPercentBuffMod(Stats(i), float(m_amount), apply); + target->ApplyStatPercentBuffMod(Stats(i), float(m_amount), apply); } } } +void AuraEffect::HandleOverrideSpellPowerByAttackPower(AuraApplication const* aurApp, uint8 mode, bool apply) const +{ + if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) + return; + + Player* target = aurApp->GetTarget()->ToPlayer(); + if (!target) + return; + + target->ApplyModSignedFloatValue(PLAYER_FIELD_OVERRIDE_SPELL_POWER_BY_AP_PCT, float(m_amount), apply); + target->UpdateSpellDamageAndHealingBonus(); +} + +void AuraEffect::HandleOverrideAttackPowerBySpellPower(AuraApplication const* aurApp, uint8 mode, bool apply) const +{ + if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) + return; + + Player* target = aurApp->GetTarget()->ToPlayer(); + if (!target) + return; + + target->ApplyModSignedFloatValue(PLAYER_FIELD_OVERRIDE_AP_BY_SPELL_POWER_PERCENT, float(m_amount), apply); + target->UpdateAttackPowerAndDamage(); +} + /********************************/ /*** HEAL & ENERGIZE ***/ /********************************/ @@ -4064,10 +4083,11 @@ void AuraEffect::HandleAuraModIncreaseHealth(AuraApplication const* aurApp, uint } else { - if (int32(target->GetHealth()) > GetAmount()) - target->ModifyHealth(-GetAmount()); - else - target->SetHealth(1); + if (target->GetHealth() > 0) + { + int32 value = std::min<int32>(target->GetHealth() - 1, GetAmount()); + target->ModifyHealth(-value); + } target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_VALUE, float(GetAmount()), apply); } } @@ -4079,19 +4099,15 @@ void AuraEffect::HandleAuraModIncreaseMaxHealth(AuraApplication const* aurApp, u Unit* target = aurApp->GetTarget(); - uint32 oldhealth = target->GetHealth(); - double healthPercentage = (double)oldhealth / (double)target->GetMaxHealth(); + float percent = target->GetHealthPct(); target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_VALUE, float(GetAmount()), apply); // refresh percentage - if (oldhealth > 0) + if (target->GetHealth() > 0) { - uint32 newhealth = uint32(ceil((double)target->GetMaxHealth() * healthPercentage)); - if (newhealth == 0) - newhealth = 1; - - target->SetHealth(newhealth); + uint32 newHealth = std::max<uint32>(target->CountPctFromMaxHealth(int32(percent)), 1); + target->SetHealth(newHealth); } } @@ -4155,8 +4171,12 @@ void AuraEffect::HandleAuraModIncreaseHealthPercent(AuraApplication const* aurAp // Unit will keep hp% after MaxHealth being modified if unit is alive. float percent = target->GetHealthPct(); target->HandleStatModifier(UNIT_MOD_HEALTH, TOTAL_PCT, float(GetAmount()), apply); - if (target->IsAlive()) - target->SetHealth(target->CountPctFromMaxHealth(int32(percent))); + + if (target->GetHealth() > 0) + { + uint32 newHealth = std::max<uint32>(target->CountPctFromMaxHealth(int32(percent)), 1); + target->SetHealth(newHealth); + } } void AuraEffect::HandleAuraIncreaseBaseHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -4169,6 +4189,14 @@ void AuraEffect::HandleAuraIncreaseBaseHealthPercent(AuraApplication const* aurA target->HandleStatModifier(UNIT_MOD_HEALTH, BASE_PCT, float(GetAmount()), apply); } +void AuraEffect::HandleAuraModIncreaseBaseManaPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const +{ + if (!(mode & (AURA_EFFECT_HANDLE_CHANGE_AMOUNT_MASK | AURA_EFFECT_HANDLE_STAT))) + return; + + aurApp->GetTarget()->HandleStatModifier(UNIT_MOD_MANA, BASE_PCT, float(GetAmount()), apply); +} + /********************************/ /*** FIGHT ***/ /********************************/ diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.h b/src/server/game/Spells/Auras/SpellAuraEffects.h index b2519b4b78a..91cf75dbe87 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.h +++ b/src/server/game/Spells/Auras/SpellAuraEffects.h @@ -235,6 +235,8 @@ class AuraEffect void HandleAuraModResistenceOfStatPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModExpertise(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModStatBonusPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleOverrideSpellPowerByAttackPower(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleOverrideAttackPowerBySpellPower(AuraApplication const* aurApp, uint8 mode, bool apply) const; // heal and energize void HandleModPowerRegen(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleModPowerRegenPCT(AuraApplication const* aurApp, uint8 mode, bool apply) const; @@ -245,6 +247,7 @@ class AuraEffect void HandleAuraModIncreaseEnergyPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModIncreaseHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraIncreaseBaseHealthPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; + void HandleAuraModIncreaseBaseManaPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; // fight void HandleAuraModParryPercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; void HandleAuraModDodgePercent(AuraApplication const* aurApp, uint8 mode, bool apply) const; diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index c3247b41b35..516de90d454 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1353,19 +1353,6 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b case SPELLFAMILY_MAGE: if (!caster) break; - /// @todo This should be moved to similar function in spell::hit - if (GetSpellInfo()->SpellFamilyFlags[0] & 0x01000000) - { - // Polymorph Sound - Sheep && Penguin - if (GetSpellInfo()->SpellIconID == 82 && GetSpellInfo()->SpellVisual[0] == 12978) - { - // Glyph of the Penguin - if (caster->HasAura(52648)) - caster->CastSpell(target, 61635, true); - else - caster->CastSpell(target, 61634, true); - } - } switch (GetId()) { case 12536: // Clearcasting @@ -1400,6 +1387,7 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_PRIEST, 3790, 0)) { uint32 damage = caster->SpellDamageBonusDone(target, GetSpellInfo(), GetEffect(0)->GetAmount(), DOT, GetEffect(0)->GetSpellEffectInfo()); + damage *= caster->SpellDamagePctDone(target, GetSpellInfo(), SPELL_DIRECT_DAMAGE); damage = target->SpellDamageBonusTaken(caster, GetSpellInfo(), damage, DOT, GetEffect(0)->GetSpellEffectInfo()); int32 basepoints0 = aurEff->GetAmount() * GetEffect(0)->GetTotalTicks() * int32(damage) / 100; int32 heal = int32(CalculatePct(basepoints0, 15)); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index fb40de60048..3b0da910b43 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -857,12 +857,14 @@ void Spell::SelectSpellTargets() // Do not check for selfcast if (!ihit->scaleAura && ihit->targetGUID != m_caster->GetGUID()) { - m_UniqueTargetInfo.erase(ihit++); - continue; + ihit = m_UniqueTargetInfo.erase(ihit); + continue; } } + ++ihit; } + if (checkLvl && m_UniqueTargetInfo.empty()) { SendCastResult(SPELL_FAILED_LOWLEVEL); @@ -2326,6 +2328,9 @@ void Spell::DoAllEffectOnTarget(TargetInfo* target) return; } + if (!unit) + return; + if (unit->IsAlive() != target->alive) return; @@ -2866,7 +2871,7 @@ bool Spell::UpdateChanneledTargetList() modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_RANGE, range, this); } - for (std::vector<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) + for (std::vector<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) { if (ihit->missCondition == SPELL_MISS_NONE && (channelTargetEffectMask & ihit->effectMask)) { @@ -3359,10 +3364,10 @@ void Spell::handle_immediate() // process immediate effects (items, ground, etc.) also initialize some variables _handle_immediate_phase(); - for (std::vector<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) + for (std::vector<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) DoAllEffectOnTarget(&(*ihit)); - for (std::vector<GOTargetInfo>::iterator ihit= m_UniqueGOTargetInfo.begin(); ihit != m_UniqueGOTargetInfo.end(); ++ihit) + for (std::vector<GOTargetInfo>::iterator ihit = m_UniqueGOTargetInfo.begin(); ihit != m_UniqueGOTargetInfo.end(); ++ihit) DoAllEffectOnTarget(&(*ihit)); FinishTargetProcessing(); @@ -3402,7 +3407,7 @@ uint64 Spell::handle_delayed(uint64 t_offset) bool single_missile = (m_targets.HasDst()); // now recheck units targeting correctness (need before any effects apply to prevent adding immunity at first effect not allow apply second spell effect and similar cases) - for (std::vector<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) + for (std::vector<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) { if (ihit->processed == false) { @@ -3417,7 +3422,7 @@ uint64 Spell::handle_delayed(uint64 t_offset) } // now recheck gameobject targeting correctness - for (std::vector<GOTargetInfo>::iterator ighit= m_UniqueGOTargetInfo.begin(); ighit != m_UniqueGOTargetInfo.end(); ++ighit) + for (std::vector<GOTargetInfo>::iterator ighit = m_UniqueGOTargetInfo.begin(); ighit != m_UniqueGOTargetInfo.end(); ++ighit) { if (ighit->processed == false) { @@ -3475,7 +3480,7 @@ void Spell::_handle_immediate_phase() } // process items - for (std::vector<ItemTargetInfo>::iterator ihit= m_UniqueItemInfo.begin(); ihit != m_UniqueItemInfo.end(); ++ihit) + for (std::vector<ItemTargetInfo>::iterator ihit = m_UniqueItemInfo.begin(); ihit != m_UniqueItemInfo.end(); ++ihit) DoAllEffectOnTarget(&(*ihit)); if (!m_originalCaster) @@ -4145,47 +4150,13 @@ void Spell::ExecuteLogEffectExtraAttacks(uint8 effIndex, Unit* victim, uint32 nu void Spell::ExecuteLogEffectInterruptCast(uint8 /*effIndex*/, Unit* victim, uint32 spellId) { - ObjectGuid casterGuid = m_caster->GetGUID(); - ObjectGuid targetGuid = victim->GetGUID(); - - WorldPacket data(SMSG_SPELL_INTERRUPT_LOG, 8 + 8 + 4 + 4); - data.WriteBit(targetGuid[4]); - data.WriteBit(casterGuid[5]); - data.WriteBit(casterGuid[6]); - data.WriteBit(casterGuid[1]); - data.WriteBit(casterGuid[3]); - data.WriteBit(casterGuid[0]); - data.WriteBit(targetGuid[3]); - data.WriteBit(targetGuid[5]); - data.WriteBit(targetGuid[1]); - data.WriteBit(casterGuid[4]); - data.WriteBit(casterGuid[7]); - data.WriteBit(targetGuid[7]); - data.WriteBit(targetGuid[6]); - data.WriteBit(targetGuid[2]); - data.WriteBit(casterGuid[2]); - data.WriteBit(targetGuid[0]); - - data.WriteByteSeq(casterGuid[7]); - data.WriteByteSeq(casterGuid[6]); - data.WriteByteSeq(casterGuid[3]); - data.WriteByteSeq(casterGuid[2]); - data.WriteByteSeq(targetGuid[3]); - data.WriteByteSeq(targetGuid[6]); - data.WriteByteSeq(targetGuid[2]); - data.WriteByteSeq(targetGuid[4]); - data.WriteByteSeq(targetGuid[7]); - data.WriteByteSeq(targetGuid[0]); - data.WriteByteSeq(casterGuid[4]); - data << uint32(m_spellInfo->Id); - data.WriteByteSeq(targetGuid[1]); - data.WriteByteSeq(casterGuid[0]); - data.WriteByteSeq(casterGuid[5]); - data.WriteByteSeq(casterGuid[1]); - data << uint32(spellId); - data.WriteByteSeq(targetGuid[5]); + WorldPackets::CombatLog::SpellInterruptLog data; + data.Caster = m_caster->GetGUID(); + data.Victim = victim->GetGUID(); + data.InterruptedSpellID = m_spellInfo->Id; + data.SpellID = spellId; - m_caster->SendMessageToSet(&data, true); + m_caster->SendMessageToSet(data.Write(), true); } void Spell::ExecuteLogEffectDurabilityDamage(uint8 effIndex, Unit* victim, int32 itemId, int32 amount) @@ -4305,6 +4276,7 @@ void Spell::SendChannelStart(uint32 duration) m_caster->SetChannelObjectGuid(channelTarget); m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL, m_spellInfo->Id); + m_caster->SetUInt32Value(UNIT_CHANNEL_SPELL_X_SPELL_VISUAL, m_spellInfo->GetSpellXSpellVisualId(m_caster->GetMap()->GetDifficultyID())); } void Spell::SendResurrectRequest(Player* target) @@ -4537,6 +4509,10 @@ void Spell::TakeRunePower(bool didHit) modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_COST, runeCost[i], this); } + // Let's say we use a skill that requires a Frost rune. This is the order: + // - Frost rune + // - Death rune, originally a Frost rune + // - Death rune, any kind for (uint32 i = 0; i < MAX_RUNES; ++i) { RuneType rune = player->GetCurrentRune(i); @@ -4548,8 +4524,32 @@ void Spell::TakeRunePower(bool didHit) } } + // Find a Death rune where the base rune matches the one we need runeCost[RUNE_DEATH] += runeCost[RUNE_BLOOD] + runeCost[RUNE_UNHOLY] + runeCost[RUNE_FROST]; + if (runeCost[RUNE_DEATH] > 0) + { + for (uint32 i = 0; i < MAX_RUNES; ++i) + { + RuneType rune = player->GetCurrentRune(i); + RuneType baseRune = player->GetBaseRune(i); + if (!player->GetRuneCooldown(i) && rune == RUNE_DEATH && runeCost[baseRune] > 0) + { + player->SetRuneCooldown(i, didHit ? player->GetRuneBaseCooldown(i) : uint32(RUNE_MISS_COOLDOWN), true); + player->SetLastUsedRune(rune); + runeCost[baseRune]--; + runeCost[rune]--; + + // keep Death Rune type if missed + if (didHit) + player->RestoreBaseRune(i); + + if (runeCost[RUNE_DEATH] == 0) + break; + } + } + } + // Grab any Death rune if (runeCost[RUNE_DEATH] > 0) { for (uint32 i = 0; i < MAX_RUNES; ++i) @@ -5163,12 +5163,12 @@ SpellCastResult Spell::CheckCast(bool strict) bool result = m_preGeneratedPath.CalculatePath(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + target->GetObjectSize(), false, true); if (m_preGeneratedPath.GetPathType() & PATHFIND_SHORT) return SPELL_FAILED_OUT_OF_RANGE; - else if (!result || m_preGeneratedPath.GetPathType() & PATHFIND_NOPATH) + else if (!result || m_preGeneratedPath.GetPathType() & (PATHFIND_NOPATH | PATHFIND_INCOMPLETE)) { result = m_preGeneratedPath.CalculatePath(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + target->GetObjectSize(), false, false); if (m_preGeneratedPath.GetPathType() & PATHFIND_SHORT) return SPELL_FAILED_OUT_OF_RANGE; - else if (!result || m_preGeneratedPath.GetPathType() & PATHFIND_NOPATH) + else if (!result || m_preGeneratedPath.GetPathType() & (PATHFIND_NOPATH | PATHFIND_INCOMPLETE)) return SPELL_FAILED_NOPATH; } @@ -5815,7 +5815,7 @@ bool Spell::CanAutoCast(Unit* target) { SelectSpellTargets(); //check if among target units, our WANTED target is as well (->only self cast spells return false) - for (std::vector<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) + for (std::vector<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) if (ihit->targetGUID == targetguid) return true; } @@ -6664,7 +6664,7 @@ bool Spell::IsAutoActionResetSpell() const bool Spell::IsNeedSendToClient() const { - return m_spellInfo->SpellVisual[0] || m_spellInfo->SpellVisual[1] || m_spellInfo->IsChanneled() || + return m_spellInfo->GetSpellXSpellVisualId(m_caster->GetMap()->GetDifficultyID()) || m_spellInfo->IsChanneled() || (m_spellInfo->HasAttribute(SPELL_ATTR8_AURA_SEND_AMOUNT)) || m_spellInfo->Speed > 0.0f || (!m_triggeredByAuraSpell && !IsTriggered()); } @@ -6832,7 +6832,7 @@ void Spell::HandleLaunchPhase() if (effect && (m_applyMultiplierMask & (1 << effect->EffectIndex))) multiplier[effect->EffectIndex] = effect->CalcDamageMultiplier(m_originalCaster, this); - for (std::vector<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) + for (std::vector<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) { TargetInfo& target = *ihit; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index ec716a0e03d..77abd3c78c2 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -409,6 +409,7 @@ class Spell void EffectLearnGarrisonBuilding(SpellEffIndex effIndex); void EffectCreateGarrison(SpellEffIndex effIndex); void EffectAddGarrisonFollower(SpellEffIndex effIndex); + void EffectActivateGarrisonBuilding(SpellEffIndex effIndex); typedef std::set<Aura*> UsedSpellMods; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index c6b026c05f8..3af8adabd7f 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -68,6 +68,7 @@ #include "ReputationMgr.h" #include "AreaTrigger.h" #include "Garrison.h" +#include "CombatLogPackets.h" #include "DuelPackets.h" #include "MiscPackets.h" #include "SpellPackets.h" @@ -298,7 +299,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //221 SPELL_EFFECT_221 &Spell::EffectNULL, //222 SPELL_EFFECT_CREATE_HEIRLOOM_ITEM &Spell::EffectNULL, //223 SPELL_EFFECT_CHANGE_ITEM_BONUSES - &Spell::EffectNULL, //224 SPELL_EFFECT_ACTIVATE_GARRISON_BUILDING + &Spell::EffectActivateGarrisonBuilding, //224 SPELL_EFFECT_ACTIVATE_GARRISON_BUILDING &Spell::EffectNULL, //225 SPELL_EFFECT_GRANT_BATTLEPET_LEVEL &Spell::EffectNULL, //226 SPELL_EFFECT_226 &Spell::EffectNULL, //227 SPELL_EFFECT_227 @@ -378,11 +379,12 @@ void Spell::EffectInstaKill(SpellEffIndex /*effIndex*/) if (m_caster == unitTarget) // prevent interrupt message finish(); - WorldPacket data(SMSG_SPELL_INSTAKILL_LOG, 8+8+4); - data << m_caster->GetGUID(); - data << unitTarget->GetGUID(); - data << uint32(m_spellInfo->Id); - m_caster->SendMessageToSet(&data, true); + WorldPackets::CombatLog::SpellInstakillLog data; + data.Target = unitTarget->GetGUID(); + data.Caster = m_caster->GetGUID(); + data.SpellID = m_spellInfo->Id; + + m_caster->SendMessageToSet(data.Write(), true); m_caster->DealDamage(unitTarget, unitTarget->GetHealth(), NULL, NODAMAGE, SPELL_SCHOOL_MASK_NORMAL, NULL, false); } @@ -421,7 +423,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) if (m_spellInfo->HasAttribute(SPELL_ATTR0_CU_SHARE_DAMAGE)) { uint32 count = 0; - for (std::vector<TargetInfo>::iterator ihit= m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) + for (std::vector<TargetInfo>::iterator ihit = m_UniqueTargetInfo.begin(); ihit != m_UniqueTargetInfo.end(); ++ihit) if (ihit->effectMask & (1<<effIndex)) ++count; @@ -497,7 +499,7 @@ void Spell::EffectSchoolDMG(SpellEffIndex effIndex) case SPELLFAMILY_DRUID: { // Ferocious Bite - if (m_caster->GetTypeId() == TYPEID_PLAYER && (m_spellInfo->SpellFamilyFlags[0] & 0x000800000) && m_spellInfo->SpellVisual[0] == 6587) + if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->SpellFamilyFlags[3] & 0x1000) { // converts each extra point of energy ( up to 25 energy ) into additional damage int32 energy = -(m_caster->ModifyPower(POWER_ENERGY, -25)); @@ -2483,7 +2485,7 @@ void Spell::EffectLearnSkill(SpellEffIndex /*effIndex*/) if (!rcEntry) return; - SkillTiersEntry const* tier = sSkillTiersStore.LookupEntry(rcEntry->SkillTierID); + SkillTiersEntry const* tier = sObjectMgr->GetSkillTier(rcEntry->SkillTierID); if (!tier) return; @@ -2684,16 +2686,13 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) duration = 3600; // 1 hour // shaman family enchantments else if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN) - duration = 1800; // 30 mins + duration = 3600; // 30 mins // other cases with this SpellVisual already selected - else if (m_spellInfo->SpellVisual[0] == 215) + else if (m_spellInfo->GetSpellVisual(DIFFICULTY_NONE) == 215) duration = 1800; // 30 mins // some fishing pole bonuses except Glow Worm which lasts full hour - else if (m_spellInfo->SpellVisual[0] == 563 && m_spellInfo->Id != 64401) + else if (m_spellInfo->GetSpellVisual(DIFFICULTY_NONE) == 563 && m_spellInfo->Id != 64401) duration = 600; // 10 mins - // shaman rockbiter enchantments - else if (m_spellInfo->SpellVisual[0] == 0) - duration = 1800; // 30 mins else if (m_spellInfo->Id == 29702) duration = 300; // 5 mins else if (m_spellInfo->Id == 37360) @@ -2905,19 +2904,18 @@ void Spell::EffectTaunt(SpellEffIndex /*effIndex*/) return; } - // Also use this effect to set the taunter's threat to the taunted creature's highest value - if (unitTarget->getThreatManager().getCurrentVictim()) + if (!unitTarget->getThreatManager().getOnlineContainer().empty()) { + // Also use this effect to set the taunter's threat to the taunted creature's highest value float myThreat = unitTarget->getThreatManager().getThreat(m_caster); - float itsThreat = unitTarget->getThreatManager().getCurrentVictim()->getThreat(); - if (itsThreat > myThreat) - unitTarget->getThreatManager().addThreat(m_caster, itsThreat - myThreat); - } + float topThreat = unitTarget->getThreatManager().getOnlineContainer().getMostHated()->getThreat(); + if (topThreat > myThreat) + unitTarget->getThreatManager().doAddThreat(m_caster, topThreat - myThreat); - //Set aggro victim to caster - if (!unitTarget->getThreatManager().getOnlineContainer().empty()) + //Set aggro victim to caster if (HostileReference* forcedVictim = unitTarget->getThreatManager().getOnlineContainer().getReferenceByTarget(m_caster)) unitTarget->getThreatManager().setCurrentVictim(forcedVictim); + } if (unitTarget->ToCreature()->IsAIEnabled && !unitTarget->ToCreature()->HasReactState(REACT_PASSIVE)) unitTarget->ToCreature()->AI()->AttackStart(m_caster); @@ -5482,10 +5480,10 @@ void Spell::SummonGuardian(uint32 i, uint32 entry, SummonPropertiesEntry const* if (summon->GetEntry() == 27893) { - if (uint32 weapon = m_caster->GetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (EQUIPMENT_SLOT_MAINHAND * 3))) + if (uint32 weapon = m_caster->GetUInt32Value(PLAYER_VISIBLE_ITEM + VISIBLE_ITEM_ENTRY_OFFSET + (EQUIPMENT_SLOT_MAINHAND * 2))) { summon->SetDisplayId(11686); // modelid2 - summon->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, weapon); + summon->SetVirtualItem(0, weapon); } else summon->SetDisplayId(1126); // modelid1 @@ -5857,3 +5855,15 @@ void Spell::EffectAddGarrisonFollower(SpellEffIndex effIndex) if (Garrison* garrison = unitTarget->ToPlayer()->GetGarrison()) garrison->AddFollower(GetEffect(effIndex)->MiscValue); } + +void Spell::EffectActivateGarrisonBuilding(SpellEffIndex effIndex) +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + if (Garrison* garrison = unitTarget->ToPlayer()->GetGarrison()) + garrison->ActivateBuilding(GetEffect(effIndex)->MiscValue); +} diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 0bdb36b988f..f9f777f22f3 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -947,7 +947,8 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 244 SPELL_EFFECT_244 }; -SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap) : _hasPowerDifficultyData(false) +SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals) + : _hasPowerDifficultyData(false) { Id = spellEntry->ID; @@ -1006,13 +1007,11 @@ SpellInfo::SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& ef Speed = _misc ? _misc->Speed : 0; SchoolMask = _misc ? _misc->SchoolMask : 0; AttributesCu = 0; - - for (uint8 i = 0; i < 2; ++i) - SpellVisual[i] = _misc ? _misc->SpellVisualID[i] : 0; - SpellIconID = _misc ? _misc->SpellIconID : 0; ActiveIconID = _misc ? _misc->ActiveIconID : 0; + _visuals = std::move(visuals); + // SpellScalingEntry SpellScalingEntry const* _scaling = GetSpellScaling(); Scaling.CastTimeMin = _scaling ? _scaling->CastTimeMin : 0; @@ -1822,6 +1821,7 @@ SpellCastResult SpellInfo::CheckLocation(uint32 map_id, uint32 zone_id, uint32 a if (!player->CanFlyInZone(map_id, zone_id)) return SPELL_FAILED_INCORRECT_AREA; } + break; } case SPELL_AURA_MOUNTED: { @@ -1900,7 +1900,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta if (!player->GetWeaponForAttack(BASE_ATTACK) || !player->IsUseEquipedWeapon(true)) return SPELL_FAILED_TARGET_NO_WEAPONS; } - else if (!unitTarget->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID)) + else if (!unitTarget->GetVirtualItemId(0)) return SPELL_FAILED_TARGET_NO_WEAPONS; } } @@ -1958,7 +1958,7 @@ SpellCastResult SpellInfo::CheckTarget(Unit const* caster, WorldObject const* ta } // not allow casting on flying player - if (unitTarget->HasUnitState(UNIT_STATE_IN_FLIGHT)) + if (unitTarget->HasUnitState(UNIT_STATE_IN_FLIGHT) && !(AttributesCu & SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET)) return SPELL_FAILED_BAD_TARGETS; /* TARGET_UNIT_MASTER gets blocked here for passengers, because the whole idea of this check is to @@ -2577,6 +2577,8 @@ std::vector<SpellInfo::CostData> SpellInfo::CalcPowerCost(Unit const* caster, Sp powerCost += int32(CalculatePct(caster->GetMaxHealth(), power->ManaCostPercentage)); break; case POWER_MANA: + powerCost += int32(CalculatePct(caster->GetCreateMana(), power->ManaCostPercentage)); + break; case POWER_RAGE: case POWER_FOCUS: case POWER_ENERGY: @@ -2635,7 +2637,7 @@ std::vector<SpellInfo::CostData> SpellInfo::CalcPowerCost(Unit const* caster, Sp modOwner->ApplySpellMod(Id, SPELLMOD_SPELL_COST2, powerCost); } - if (!caster->IsControlledByPlayer()) + if (!caster->IsControlledByPlayer() && G3D::fuzzyEq(power->ManaCostPercentage, 0.0f)) { if (Attributes & SPELL_ATTR0_LEVEL_DAMAGE_CALCULATION) { @@ -2693,7 +2695,7 @@ std::vector<SpellInfo::CostData> SpellInfo::CalcPowerCost(Unit const* caster, Sp } }; - if (_hasPowerDifficultyData) // optimization - use static data for 99.5% cases (4753 of 4772 in build 6.1.0.19702) + if (!_hasPowerDifficultyData) // optimization - use static data for 99.5% cases (4753 of 4772 in build 6.1.0.19702) collector(PowerCosts); else collector(sDB2Manager.GetSpellPowers(Id, caster->GetMap()->GetDifficultyID())); @@ -2798,6 +2800,42 @@ bool SpellInfo::IsHighRankOf(SpellInfo const* spellInfo) const return false; } +uint32 SpellInfo::GetSpellXSpellVisualId(Difficulty difficulty) const +{ + DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(difficulty); + while (difficultyEntry) + { + auto itr = _visuals.find(difficulty); + if (itr != _visuals.end()) + for (SpellXSpellVisualEntry const* visual : itr->second) + if (!visual->PlayerConditionID) + return visual->ID; + + difficultyEntry = sDifficultyStore.LookupEntry(difficultyEntry->FallbackDifficultyID); + } + + auto itr = _visuals.find(DIFFICULTY_NONE); + if (itr != _visuals.end()) + for (SpellXSpellVisualEntry const* visual : itr->second) + if (!visual->PlayerConditionID) + return visual->ID; + + return 0; +} + +uint32 SpellInfo::GetSpellVisual(Difficulty difficulty, Player* /*forPlayer*/ /*= nullptr*/) const +{ + if (SpellXSpellVisualEntry const* visual = sSpellXSpellVisualStore.LookupEntry(GetSpellXSpellVisualId(difficulty))) + { + //if (visual->SpellVisualID[1] && forPlayer->GetViolenceLevel() operator 2) + // return visual->SpellVisualID[1]; + + return visual->SpellVisualID[0]; + } + + return 0; +} + void SpellInfo::_InitializeExplicitTargetMask() { bool srcSet = false; @@ -3236,8 +3274,6 @@ void SpellInfo::_UnloadImplicitTargetConditionLists() SpellEffectInfoVector SpellInfo::GetEffectsForDifficulty(uint32 difficulty) const { - // 6.x todo: add first highest difficulty effect, resize list to max element, add lower diff effects without overwriting any higher diffed ones - SpellEffectInfoVector effList; // DIFFICULTY_NONE effects are the default effects, always active if current difficulty's effects don't overwrite @@ -3247,7 +3283,8 @@ SpellEffectInfoVector SpellInfo::GetEffectsForDifficulty(uint32 difficulty) cons // downscale difficulty if original was not found // DIFFICULTY_NONE is already in our list - for (; difficulty > DIFFICULTY_NONE; --difficulty) + DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(difficulty); + while (difficultyEntry) { SpellEffectInfoMap::const_iterator itr = _effects.find(difficulty); if (itr != _effects.end()) @@ -3260,23 +3297,35 @@ SpellEffectInfoVector SpellInfo::GetEffectsForDifficulty(uint32 difficulty) cons if (effect->EffectIndex >= effList.size()) effList.resize(effect->EffectIndex + 1); - effList[effect->EffectIndex] = effect; + if (!effList[effect->EffectIndex]) + effList[effect->EffectIndex] = effect; } } - // if we found any effect in our difficulty then stop searching - break; } + + difficultyEntry = sDifficultyStore.LookupEntry(difficultyEntry->FallbackDifficultyID); } - if (effList.empty()) - TC_LOG_ERROR("spells", "GetEffectsForDifficulty did not find any effects for spell %u in difficulty %u", Id, difficulty); + return effList; } SpellEffectInfo const* SpellInfo::GetEffect(uint32 difficulty, uint32 index) const { - SpellEffectInfoVector effects = GetEffectsForDifficulty(difficulty); - if (index >= effects.size()) - return nullptr; + DifficultyEntry const* difficultyEntry = sDifficultyStore.LookupEntry(difficulty); + while (difficultyEntry) + { + SpellEffectInfoMap::const_iterator itr = _effects.find(difficulty); + if (itr != _effects.end()) + if (itr->second.size() > index && itr->second[index]) + return itr->second[index]; + + difficultyEntry = sDifficultyStore.LookupEntry(difficultyEntry->FallbackDifficultyID); + } + + SpellEffectInfoMap::const_iterator itr = _effects.find(DIFFICULTY_NONE); + if (itr != _effects.end()) + if (itr->second.size() > index) + return itr->second[index]; - return effects[index]; + return nullptr; } diff --git a/src/server/game/Spells/SpellInfo.h b/src/server/game/Spells/SpellInfo.h index 62381372657..5fd960066f0 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -197,6 +197,7 @@ enum SpellCustomAttributes SPELL_ATTR0_CU_IGNORE_ARMOR = 0x00008000, SPELL_ATTR0_CU_REQ_TARGET_FACING_CASTER = 0x00010000, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET = 0x00020000, + SPELL_ATTR0_CU_ALLOW_INFLIGHT_TARGET = 0x00040000, SPELL_ATTR0_CU_NEGATIVE = SPELL_ATTR0_CU_NEGATIVE_EFF0 | SPELL_ATTR0_CU_NEGATIVE_EFF1 | SPELL_ATTR0_CU_NEGATIVE_EFF2 }; @@ -317,6 +318,9 @@ typedef std::unordered_map<uint32, SpellEffectInfoVector> SpellEffectInfoMap; typedef std::vector<SpellEffectEntry const*> SpellEffectEntryVector; typedef std::unordered_map<uint32, SpellEffectEntryVector> SpellEffectEntryMap; +typedef std::vector<SpellXSpellVisualEntry const*> SpellVisualVector; +typedef std::unordered_map<uint32, SpellVisualVector> SpellVisualMap; + typedef std::vector<AuraEffect*> AuraEffectVector; class SpellInfo @@ -445,7 +449,7 @@ public: SpellTotemsEntry const* GetSpellTotems() const; SpellMiscEntry const* GetSpellMisc() const; - SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap); + SpellInfo(SpellEntry const* spellEntry, SpellEffectEntryMap const& effectsMap, SpellVisualMap&& visuals); ~SpellInfo(); uint32 GetCategory() const; @@ -565,6 +569,9 @@ public: bool IsDifferentRankOf(SpellInfo const* spellInfo) const; bool IsHighRankOf(SpellInfo const* spellInfo) const; + uint32 GetSpellXSpellVisualId(Difficulty difficulty) const; + uint32 GetSpellVisual(Difficulty difficulty, Player* forPlayer = nullptr) const; + // loading helpers void _InitializeExplicitTargetMask(); bool _IsPositiveEffect(uint32 effIndex, bool deep) const; @@ -581,6 +588,7 @@ public: SpellEffectInfo const* GetEffect(WorldObject const* obj, uint32 index) const { return GetEffect(obj->GetMap()->GetDifficultyID(), index); } SpellEffectInfoMap _effects; + SpellVisualMap _visuals; bool _hasPowerDifficultyData; }; diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 70b820aed96..ac125950c24 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -71,24 +71,24 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) case SPELLFAMILY_GENERIC: { // Entrapment -- 135373 - if (spellproto->SpellIconID == 20 && spellproto->SpellVisual[0] == 39588) + if (spellproto->SpellIconID == 20 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39588) return DIMINISHING_ROOT; // Intimidation -- 24394 - if (spellproto->SpellIconID == 166 && spellproto->SpellVisual[0] == 2816) + if (spellproto->SpellIconID == 166 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 2816) return DIMINISHING_STUN; // Pulverize (Primal Earth Elemental) -- 118345 - if (spellproto->SpellIconID == 4507 && spellproto->SpellVisual[0] == 39877) + if (spellproto->SpellIconID == 4507 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39877) return DIMINISHING_STUN; // Static Charge (Capacitor Totem) -- 118905 - if (spellproto->SpellIconID == 54 && spellproto->SpellVisual[0] == 24442) + if (spellproto->SpellIconID == 54 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 24442) return DIMINISHING_STUN; // Remorseless Winter -- 115001 - if (spellproto->SpellIconID == 5744 && spellproto->SpellVisual[0] == 23514) + if (spellproto->SpellIconID == 5744 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 23514) return DIMINISHING_STUN; // Gorefiend's Grasp -- 108199 - if (spellproto->SpellIconID == 5743 && spellproto->SpellVisual[0] == 28937) + if (spellproto->SpellIconID == 5743 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 28937) return DIMINISHING_AOE_KNOCKBACK; break; } @@ -153,7 +153,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) if (spellproto->SpellFamilyFlags[1] & 0x8000000) return DIMINISHING_INCAPACITATE; // Blood Horror -- 137143, no flags (17986) - if (spellproto->SpellIconID == 6447 && spellproto->SpellVisual[0] == 26758) + if (spellproto->SpellIconID == 6447 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 26758) return DIMINISHING_INCAPACITATE; // Fear -- 118699 @@ -197,11 +197,11 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) if (spellproto->SpellFamilyFlags[0] & 0x2000) return DIMINISHING_STUN; // Rake -- 163505 -- no flags on the stun, 20490 - if (spellproto->SpellIconID == 494 && spellproto->SpellVisual[0] == 38283) + if (spellproto->SpellIconID == 494 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38283) return DIMINISHING_STUN; // Incapacitating Roar -- 99, no flags on the stun, 14 - if (spellproto->SpellIconID == 960 && spellproto->SpellVisual[0] == 38528) + if (spellproto->SpellIconID == 960 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38528) return DIMINISHING_INCAPACITATE; // Cyclone -- 33786 @@ -223,7 +223,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) if (spellproto->SpellFamilyFlags[0] & 0x200) return DIMINISHING_ROOT; // Mass Entanglement -- 102359, no flags on the root, 13535 - if (spellproto->SpellIconID == 5782 && spellproto->SpellVisual[0] == 38269) + if (spellproto->SpellIconID == 5782 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38269) return DIMINISHING_ROOT; // Faerie Fire -- 770, 20 seconds in PvP (6.0) @@ -262,14 +262,14 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) // return DIMINISHING_AOE_KNOCKBACK; // Charge (Tenacity pet) -- 53148, no flags (5526) - if (spellproto->SpellIconID == 1559 && spellproto->SpellVisual[0] == 39480) + if (spellproto->SpellIconID == 1559 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39480) return DIMINISHING_ROOT; // Narrow Escape -- 136634, no flags (17964) if (spellproto->SpellIconID == 3342 && spellproto->SchoolMask == 8) return DIMINISHING_ROOT; // Binding Shot -- 117526, no flags (15581) - if (spellproto->SpellIconID == 4612 && spellproto->SpellVisual[0] == 6859) + if (spellproto->SpellIconID == 4612 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 6859) return DIMINISHING_STUN; // Freezing Trap -- 3355 @@ -316,7 +316,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) if (spellproto->SpellFamilyFlags[2] & 0x4000) return DIMINISHING_ROOT; // Frost Shock (with Frozen Power) -- 63685, no flags (6918) - if (spellproto->SpellIconID == 193 && spellproto->SpellVisual[0] == 39876) + if (spellproto->SpellIconID == 193 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39876) return DIMINISHING_ROOT; break; } @@ -327,31 +327,31 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) return DIMINISHING_SILENCE; // Chains of Ice (with Chilblains) -- 96294, no flags (13020) - if (spellproto->SpellIconID == 180 && spellproto->SpellVisual[0] == 20135) + if (spellproto->SpellIconID == 180 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 20135) return DIMINISHING_ROOT; // Asphyxiate -- 108194 if (spellproto->SpellFamilyFlags[2] & 0x100000) return DIMINISHING_STUN; // Gnaw (Ghoul) -- 91800, no flags (12511) - if (spellproto->SpellIconID == 3010 && spellproto->SpellVisual[0] == 38760) + if (spellproto->SpellIconID == 3010 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38760) return DIMINISHING_STUN; // Monstrous Blow (Ghoul w/ Dark Transformation active) -- 91797, no flags (12510) - if (spellproto->SpellIconID == 15 && spellproto->SpellVisual[0] == 38761) + if (spellproto->SpellIconID == 15 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38761) return DIMINISHING_STUN; break; } case SPELLFAMILY_PRIEST: { // Glyph of Mind Blast -- 87194, no flags (10092) - if (spellproto->SpellIconID == 2114 && spellproto->SpellVisual[0] == 38927) + if (spellproto->SpellIconID == 2114 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 38927) return DIMINISHING_ROOT; // Void Tendrils -- 114404, no flags (15067) - if (spellproto->SpellIconID == 5816 && spellproto->SpellVisual[0] == 25199) + if (spellproto->SpellIconID == 5816 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 25199) return DIMINISHING_ROOT; // Dominate Mind -- 605 - if (spellproto->SpellFamilyFlags[0] & 0x20000 && spellproto->SpellVisual[0] == 39068) + if (spellproto->SpellFamilyFlags[0] & 0x20000 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39068) return DIMINISHING_INCAPACITATE; // Holy Word: Chastise -- 88625 if (spellproto->SpellFamilyFlags[2] & 0x20) @@ -372,7 +372,7 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) case SPELLFAMILY_MONK: { // Disable -- 116706, no flags (15483) - if (spellproto->SpellIconID == 23 && spellproto->SpellVisual[0] == 39984) + if (spellproto->SpellIconID == 23 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39984) return DIMINISHING_ROOT; // Charging Ox Wave -- 119392 @@ -386,13 +386,13 @@ DiminishingGroup GetDiminishingReturnsGroupForSpell(SpellInfo const* spellproto) return DIMINISHING_STUN; // Glyph of Breath of Fire -- 123393, no flags (16504) - if (spellproto->SpellIconID == 15 && spellproto->SpellVisual[0] == 25408) + if (spellproto->SpellIconID == 15 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 25408) return DIMINISHING_INCAPACITATE; // Paralysis -- 115078 if (spellproto->SpellFamilyFlags[2] & 0x800000) return DIMINISHING_INCAPACITATE; // Ring of Peace -- 137460, no flags (18006) - if (spellproto->SpellIconID == 7195 && spellproto->SpellVisual[0] == 39999) + if (spellproto->SpellIconID == 7195 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 39999) return DIMINISHING_INCAPACITATE; break; } @@ -446,7 +446,7 @@ int32 GetDiminishingReturnsLimitDuration(SpellInfo const* spellproto) case SPELLFAMILY_HUNTER: { // Binding Shot - 3 seconds in PvP (6.0) - if (spellproto->SpellIconID == 4612 && spellproto->SpellVisual[0] == 6859) + if (spellproto->SpellIconID == 4612 && spellproto->GetSpellVisual(DIFFICULTY_NONE) == 6859) return 3 * IN_MILLISECONDS; // Wyvern Sting - 6 seconds in PvP (6.0) if (spellproto->SpellFamilyFlags[1] & 0x1000) @@ -2507,33 +2507,6 @@ void SpellMgr::LoadPetDefaultSpells() mPetDefaultSpellsMap.clear(); uint32 countCreature = 0; - uint32 countData = 0; - - CreatureTemplateContainer const* ctc = sObjectMgr->GetCreatureTemplates(); - for (CreatureTemplateContainer::const_iterator itr = ctc->begin(); itr != ctc->end(); ++itr) - { - - if (!itr->second.PetSpellDataId) - continue; - - // for creature with PetSpellDataId get default pet spells from dbc - CreatureSpellDataEntry const* spellDataEntry = sCreatureSpellDataStore.LookupEntry(itr->second.PetSpellDataId); - if (!spellDataEntry) - continue; - - int32 petSpellsId = -int32(itr->second.PetSpellDataId); - PetDefaultSpellsEntry petDefSpells; - for (uint8 j = 0; j < MAX_CREATURE_SPELL_DATA_SLOT; ++j) - petDefSpells.spellid[j] = spellDataEntry->Spells[j]; - - if (LoadPetDefaultSpells_helper(&itr->second, petDefSpells)) - { - mPetDefaultSpellsMap[petSpellsId] = petDefSpells; - ++countData; - } - } - - TC_LOG_INFO("server.loading", ">> Loaded addition spells for %u pet spell data entries in %u ms", countData, GetMSTimeDiffToNow(oldMSTime)); TC_LOG_INFO("server.loading", "Loading summonable creature templates..."); oldMSTime = getMSTime(); @@ -2554,11 +2527,7 @@ void SpellMgr::LoadPetDefaultSpells() if (!cInfo) continue; - // already loaded - if (cInfo->PetSpellDataId) - continue; - - // for creature without PetSpellDataId get default pet spells from creature_template + // get default pet spells from creature_template int32 petSpellsId = cInfo->Entry; if (mPetDefaultSpellsMap.find(cInfo->Entry) != mPetDefaultSpellsMap.end()) continue; @@ -2776,16 +2745,13 @@ void SpellMgr::LoadSpellInfoStore() mSpellInfoMap.resize(sSpellStore.GetNumRows(), NULL); std::unordered_map<uint32, SpellEffectEntryMap> effectsBySpell; + std::unordered_map<uint32, SpellVisualMap> visualsBySpell; - for (uint32 i = 0; i < sSpellEffectStore.GetNumRows(); ++i) + for (SpellEffectEntry const* effect : sSpellEffectStore) { - SpellEffectEntry const* effect = sSpellEffectStore.LookupEntry(i); - if (!effect) - continue; - if (effect->EffectIndex >= MAX_SPELL_EFFECTS) { - TC_LOG_ERROR("server.loading", "Spell %u has invalid EffectIndex %u, max is %u, skipped", i, effect->EffectIndex, uint32(MAX_SPELL_EFFECTS)); + TC_LOG_ERROR("server.loading", "Spell %u has invalid EffectIndex %u, max is %u, skipped", effect->SpellID, effect->EffectIndex, uint32(MAX_SPELL_EFFECTS)); continue; } @@ -2796,9 +2762,12 @@ void SpellMgr::LoadSpellInfoStore() effectsForDifficulty[effect->EffectIndex] = effect; } + for (SpellXSpellVisualEntry const* visual : sSpellXSpellVisualStore) + visualsBySpell[visual->SpellID][visual->DifficultyID].push_back(visual); + for (uint32 i = 0; i < sSpellStore.GetNumRows(); ++i) if (SpellEntry const* spellEntry = sSpellStore.LookupEntry(i)) - mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i]); + mSpellInfoMap[i] = new SpellInfo(spellEntry, effectsBySpell[i], std::move(visualsBySpell[i])); TC_LOG_INFO("server.loading", ">> Loaded SpellInfo store in %u ms", GetMSTimeDiffToNow(oldMSTime)); } @@ -2969,7 +2938,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() if (!spellInfo->_IsPositiveEffect(EFFECT_2, false)) spellInfo->AttributesCu |= SPELL_ATTR0_CU_NEGATIVE_EFF2; - if (spellInfo->SpellVisual[0] == 3879) + if (spellInfo->GetSpellVisual(DIFFICULTY_NONE) == 3879) spellInfo->AttributesCu |= SPELL_ATTR0_CU_CONE_BACK; if (talentSpells.count(spellInfo->Id)) @@ -3030,8 +2999,8 @@ void SpellMgr::LoadSpellInfoCorrections() switch (spellInfo->Id) { - case 63026: // Force Cast (HACK: Target shouldn't be changed) - case 63171: // Force Cast (HACK: Target shouldn't be changed; summon position should be untied from spell destination) + case 63026: // Summon Aspirant Test NPC (HACK: Target shouldn't be changed) + case 63137: // Summon Valiant Test (HACK: Target shouldn't be changed; summon position should be untied from spell destination) const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetA = SpellImplicitTargetInfo(TARGET_DEST_DB); break; case 42436: // Drink! (Brewfest) diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index 9aafb508f86..cf501df98c2 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -552,6 +552,8 @@ typedef std::map<uint32, PetLevelupSpellSet> PetLevelupSpellMap; typedef std::map<uint32, uint32> SpellDifficultySearcherMap; +#define MAX_CREATURE_SPELL_DATA_SLOT 4 + struct PetDefaultSpellsEntry { uint32 spellid[MAX_CREATURE_SPELL_DATA_SLOT]; diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index 4fd8b5d8bf6..62aa5a52279 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -664,8 +664,8 @@ SpellEffectInfo const* SpellScript::GetEffectInfo(SpellEffIndex effIndex) const bool AuraScript::_Validate(SpellInfo const* entry) { for (std::list<CheckAreaTargetHandler>::iterator itr = DoCheckAreaTarget.begin(); itr != DoCheckAreaTarget.end(); ++itr) - if (!entry->HasAreaAuraEffect() && !entry->HasEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA)) - TC_LOG_ERROR("scripts", "Spell `%u` of script `%s` does not have area aura effect - handler bound to hook `DoCheckAreaTarget` of AuraScript won't be executed", entry->Id, m_scriptName->c_str()); + if (!entry->HasAreaAuraEffect() && !entry->HasEffect(SPELL_EFFECT_PERSISTENT_AREA_AURA) && !entry->HasEffect(SPELL_EFFECT_APPLY_AURA)) + TC_LOG_ERROR("scripts", "Spell `%u` of script `%s` does not have apply aura effect - handler bound to hook `DoCheckAreaTarget` of AuraScript won't be executed", entry->Id, m_scriptName->c_str()); for (std::list<AuraDispelHandler>::iterator itr = OnDispel.begin(); itr != OnDispel.end(); ++itr) if (!entry->HasEffect(SPELL_EFFECT_APPLY_AURA) && !entry->HasAreaAuraEffect()) diff --git a/src/server/game/Support/SupportMgr.cpp b/src/server/game/Support/SupportMgr.cpp index 90afcfd1511..43b754575ca 100644 --- a/src/server/game/Support/SupportMgr.cpp +++ b/src/server/game/Support/SupportMgr.cpp @@ -14,6 +14,7 @@ * 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 "Chat.h" #include "Language.h" #include "SupportMgr.h" @@ -34,11 +35,11 @@ void Ticket::TeleportTo(Player* player) const player->TeleportTo(_mapId, _pos.x, _pos.y, _pos.z, 0.0f, 0); } -std::string Ticket::FormatViewMessageString(ChatHandler& handler, char const* closedName, char const* assignedToName, char const* unassignedName, char const* deletedName, char const* /*completedName*/) const +std::string Ticket::FormatViewMessageString(ChatHandler& handler, char const* closedName, char const* assignedToName, char const* unassignedName, char const* deletedName) const { std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayer()->GetName().c_str()); + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayerName().c_str()); if (closedName) ss << handler.PGetParseString(LANG_COMMAND_TICKETCLOSED, closedName); if (assignedToName) @@ -50,166 +51,6 @@ std::string Ticket::FormatViewMessageString(ChatHandler& handler, char const* cl return ss.str(); } -GmTicket::GmTicket() : _lastModifiedTime(0), _completed(false), _assignedToStatus(GMTICKET_ASSIGNEDTOGM_STATUS_NOT_ASSIGNED), -_openedByGmStatus(GMTICKET_OPENEDBYGM_STATUS_NOT_OPENED), _needResponse(false), _needMoreHelp(false) { } - -GmTicket::GmTicket(Player* player) : Ticket(player), _lastModifiedTime(time(nullptr)), _completed(false), _assignedToStatus(GMTICKET_ASSIGNEDTOGM_STATUS_NOT_ASSIGNED), -_openedByGmStatus(GMTICKET_OPENEDBYGM_STATUS_NOT_OPENED), _needResponse(false), _needMoreHelp(false) -{ - _id = sSupportMgr->GenerateGmTicketId(); -} - -GmTicket::~GmTicket() { } - -void GmTicket::SetGmAction(bool needResponse, bool needMoreHelp) -{ - _needResponse = needResponse; // Requires GM response. 17 = true, 1 = false (17 is default) - _needMoreHelp = needMoreHelp; // Requests further GM interaction on a ticket to which a GM has already responded. Basically means "has a new ticket" -} - -void GmTicket::SetUnassigned() -{ - if (_assignedToStatus != GMTICKET_ASSIGNEDTOGM_STATUS_ESCALATED) - _assignedToStatus = GMTICKET_ASSIGNEDTOGM_STATUS_NOT_ASSIGNED; - - _assignedTo.Clear(); -} - -void GmTicket::SetChatLog(std::list<uint32> time, std::string const& log) -{ - std::stringstream ss(log); - std::stringstream newss; - std::string line; - while (std::getline(ss, line) && !time.empty()) - { - newss << secsToTimeString(time.front()) << ": " << line << "\n"; - time.pop_front(); - } - - _chatLog = newss.str(); -} - -void GmTicket::SendResponse(WorldSession* session) const -{ - WorldPackets::Ticket::GMTicketResponse resp; - resp.TicketID = GetId(); - resp.ResponseID = 2; //TODO : research - resp.Description = GetDescription(); - resp.ResponseText = GetResponse(); - - session->SendPacket(resp.Write()); -} - -void GmTicket::LoadFromDB(Field* fields) -{ - uint8 idx = 0; - _id = fields[ idx].GetUInt32(); - _playerGuid = ObjectGuid::Create<HighGuid::Player>(fields[++idx].GetUInt64()); - _description = fields[++idx].GetString(); - _createTime = fields[++idx].GetUInt32(); - _mapId = fields[++idx].GetUInt16(); - _pos.x = fields[++idx].GetFloat(); - _pos.y = fields[++idx].GetFloat(); - _pos.z = fields[++idx].GetFloat(); - _lastModifiedTime = fields[++idx].GetUInt32(); - - int64 closedBy = fields[++idx].GetInt64(); - if (closedBy == 0) - _closedBy = ObjectGuid::Empty; - else if (closedBy < 0) - _closedBy.SetRawValue(0, uint64(closedBy)); - else - _closedBy = ObjectGuid::Create<HighGuid::Player>(uint64(closedBy)); - - uint64 assignedTo = fields[++idx].GetUInt64(); - if (assignedTo == 0) - _assignedTo = ObjectGuid::Empty; - else - _assignedTo = ObjectGuid::Create<HighGuid::Player>(assignedTo); - - _comment = fields[++idx].GetString(); - _response = fields[++idx].GetString(); - _completed = fields[++idx].GetBool(); - _assignedToStatus = GMTicketAssignedToGMStatus(fields[++idx].GetUInt8()); - _openedByGmStatus = GMTicketOpenedByGMStatus(fields[++idx].GetUInt8()); - _needMoreHelp = fields[++idx].GetBool(); -} - -void GmTicket::SaveToDB(SQLTransaction& trans) const -{ - uint8 idx = 0; - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_TICKET); - stmt->setUInt32(idx, _id); - stmt->setUInt64(++idx, _playerGuid.GetCounter()); - stmt->setString(++idx, _description); - stmt->setUInt32(++idx, _createTime); - stmt->setUInt16(++idx, _mapId); - stmt->setFloat(++idx, _pos.x); - stmt->setFloat(++idx, _pos.y); - stmt->setFloat(++idx, _pos.z); - stmt->setUInt32(++idx, uint32(_lastModifiedTime)); - stmt->setInt64(++idx, int64(_closedBy.GetCounter())); - stmt->setUInt64(++idx, _assignedTo.GetCounter()); - stmt->setString(++idx, _comment); - stmt->setString(++idx, _response); - stmt->setBool(++idx, _completed); - stmt->setUInt8(++idx, uint8(_assignedToStatus)); - stmt->setUInt8(++idx, _openedByGmStatus); - stmt->setBool(++idx, _needMoreHelp); - - CharacterDatabase.ExecuteOrAppend(trans, stmt); -} - -void GmTicket::DeleteFromDB() -{ - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GM_TICKET); - stmt->setUInt32(0, _id); - CharacterDatabase.Execute(stmt); -} - -std::string GmTicket::FormatViewMessageString(ChatHandler& handler, bool detailed) const -{ - time_t curTime = time(nullptr); - - std::stringstream ss; - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayer()->GetName().c_str()); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGE, (secsToTimeString(curTime - _lastModifiedTime, true, false)).c_str()); - - std::string name; - if (ObjectMgr::GetPlayerNameByGUID(_assignedTo, name)) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, name.c_str()); - - if (detailed) - { - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTMESSAGE, _description.c_str()); - if (!_comment.empty()) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTCOMMENT, _comment.c_str()); - if (!_response.empty()) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTRESPONSE, _response.c_str()); - } - return ss.str(); -} - -std::string GmTicket::FormatViewMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const -{ - std::stringstream ss; - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayer()->GetName().c_str()); - if (szClosedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETCLOSED, szClosedName); - if (szAssignedToName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, szAssignedToName); - if (szUnassignedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTUNASSIGNED, szUnassignedName); - if (szDeletedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETDELETED, szDeletedName); - if (szCompletedName) - ss << handler.PGetParseString(LANG_COMMAND_TICKETCOMPLETED, szCompletedName); - return ss.str(); -} - BugTicket::BugTicket() : _facing(0.0f) { } BugTicket::BugTicket(Player* player) : Ticket(player), _facing(0.0f) @@ -249,7 +90,7 @@ void BugTicket::LoadFromDB(Field* fields) _comment = fields[++idx].GetString(); } -void BugTicket::SaveToDB(SQLTransaction& trans) const +void BugTicket::SaveToDB() const { uint8 idx = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_BUG); @@ -265,7 +106,7 @@ void BugTicket::SaveToDB(SQLTransaction& trans) const stmt->setUInt64(++idx, _assignedTo.GetCounter()); stmt->setString(++idx, _comment); - CharacterDatabase.ExecuteOrAppend(trans, stmt); + CharacterDatabase.Execute(stmt); } void BugTicket::DeleteFromDB() @@ -281,12 +122,11 @@ std::string BugTicket::FormatViewMessageString(ChatHandler& handler, bool detail std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayer()->GetName().c_str()); + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayerName().c_str()); ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); - std::string name; - if (ObjectMgr::GetPlayerNameByGUID(_assignedTo, name)) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, name.c_str()); + if (!_assignedTo.IsEmpty()) + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, GetAssignedToName().c_str()); if (detailed) { @@ -346,11 +186,9 @@ void ComplaintTicket::LoadChatLineFromDB(Field* fields) _chatLog.Lines.emplace_back(fields[0].GetUInt32(), fields[1].GetString()); } -void ComplaintTicket::SaveToDB(SQLTransaction& trans) const +void ComplaintTicket::SaveToDB() const { - bool isInTransaction = bool(trans); - if (!isInTransaction) - trans = CharacterDatabase.BeginTransaction(); + SQLTransaction trans = CharacterDatabase.BeginTransaction(); uint8 idx = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_COMPLAINT); @@ -387,8 +225,7 @@ void ComplaintTicket::SaveToDB(SQLTransaction& trans) const ++lineIndex; } - if (!isInTransaction) - CharacterDatabase.CommitTransaction(trans); + CharacterDatabase.CommitTransaction(trans); } void ComplaintTicket::DeleteFromDB() @@ -408,12 +245,11 @@ std::string ComplaintTicket::FormatViewMessageString(ChatHandler& handler, bool std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayer()->GetName().c_str()); + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayerName().c_str()); ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); - std::string name; - if (ObjectMgr::GetPlayerNameByGUID(_assignedTo, name)) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, name.c_str()); + if (!_assignedTo.IsEmpty()) + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, GetAssignedToName().c_str()); if (detailed) { @@ -463,7 +299,7 @@ void SuggestionTicket::LoadFromDB(Field* fields) _comment = fields[++idx].GetString(); } -void SuggestionTicket::SaveToDB(SQLTransaction& trans) const +void SuggestionTicket::SaveToDB() const { uint8 idx = 0; PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GM_SUGGESTION); @@ -479,7 +315,7 @@ void SuggestionTicket::SaveToDB(SQLTransaction& trans) const stmt->setUInt64(++idx, _assignedTo.GetCounter()); stmt->setString(++idx, _comment); - CharacterDatabase.ExecuteOrAppend(trans, stmt); + CharacterDatabase.Execute(stmt); } void SuggestionTicket::DeleteFromDB() @@ -495,12 +331,11 @@ std::string SuggestionTicket::FormatViewMessageString(ChatHandler& handler, bool std::stringstream ss; ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTGUID, _id); - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayer()->GetName().c_str()); + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTNAME, GetPlayerName().c_str()); ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTAGECREATE, (secsToTimeString(curTime - _createTime, true, false)).c_str()); - std::string name; - if (ObjectMgr::GetPlayerNameByGUID(_assignedTo, name)) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, name.c_str()); + if (!_assignedTo.IsEmpty()) + ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, GetAssignedToName().c_str()); if (detailed) { @@ -512,14 +347,11 @@ std::string SuggestionTicket::FormatViewMessageString(ChatHandler& handler, bool } SupportMgr::SupportMgr() : _supportSystemStatus(false), _ticketSystemStatus(false), _bugSystemStatus(false), _complaintSystemStatus(false), _suggestionSystemStatus(false), -_lastGmTicketId(0), _lastBugId(0), _lastComplaintId(0), _lastSuggestionId(0), _lastChange(0), -_openGmTicketCount(0), _openBugTicketCount(0), _openComplaintTicketCount(0), _openSuggestionTicketCount(0) { } +_lastBugId(0), _lastComplaintId(0), _lastSuggestionId(0), _lastChange(0), +_openBugTicketCount(0), _openComplaintTicketCount(0), _openSuggestionTicketCount(0) { } SupportMgr::~SupportMgr() { - for (auto const& t : _gmTicketList) - delete t.second; - for (auto const& b : _bugTicketList) delete b.second; @@ -540,17 +372,6 @@ void SupportMgr::Initialize() } template<> -GmTicket* SupportMgr::GetTicket<GmTicket>(uint32 ticketId) -{ - GmTicketList::const_iterator itr = _gmTicketList.find(ticketId); - if (itr != _gmTicketList.end()) - return itr->second; - - return nullptr; - -} - -template<> BugTicket* SupportMgr::GetTicket<BugTicket>(uint32 bugId) { BugTicketList::const_iterator itr = _bugTicketList.find(bugId); @@ -583,9 +404,6 @@ SuggestionTicket* SupportMgr::GetTicket<SuggestionTicket>(uint32 suggestionId) } template<> -uint32 SupportMgr::GetOpenTicketCount<GmTicket>() const { return _openGmTicketCount; } - -template<> uint32 SupportMgr::GetOpenTicketCount<BugTicket>() const { return _openBugTicketCount; } template<> @@ -594,46 +412,6 @@ uint32 SupportMgr::GetOpenTicketCount<ComplaintTicket>() const { return _openCom template<> uint32 SupportMgr::GetOpenTicketCount<SuggestionTicket>() const { return _openSuggestionTicketCount; } -void SupportMgr::LoadGmTickets() -{ - uint32 oldMSTime = getMSTime(); - - for (auto const& c : _gmTicketList) - delete c.second; - _gmTicketList.clear(); - - _lastGmTicketId = 0; - _openGmTicketCount = 0; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GM_TICKETS); - PreparedQueryResult result = CharacterDatabase.Query(stmt); - if (!result) - { - TC_LOG_INFO("server.loading", ">> Loaded 0 GM tickets. DB table `gm_ticket` is empty!"); - return; - } - - uint32 count = 0; - do - { - Field* fields = result->Fetch(); - GmTicket* ticket = new GmTicket(); - ticket->LoadFromDB(fields); - - if (!ticket->IsClosed()) - ++_openGmTicketCount; - - uint32 id = ticket->GetId(); - if (_lastGmTicketId < id) - _lastGmTicketId = id; - - _gmTicketList[id] = ticket; - ++count; - } while (result->NextRow()); - - TC_LOG_INFO("server.loading", ">> Loaded %u GM tickets in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); -} - void SupportMgr::LoadBugTickets() { uint32 oldMSTime = getMSTime(); @@ -769,24 +547,13 @@ void SupportMgr::LoadSuggestionTickets() TC_LOG_INFO("server.loading", ">> Loaded %u GM suggestions in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -void SupportMgr::AddTicket(GmTicket* ticket) -{ - _gmTicketList[ticket->GetId()] = ticket; - if (!ticket->IsClosed()) - ++_openGmTicketCount; - - SQLTransaction trans = SQLTransaction(nullptr); - ticket->SaveToDB(trans); -} - void SupportMgr::AddTicket(BugTicket* ticket) { _bugTicketList[ticket->GetId()] = ticket; if (!ticket->IsClosed()) ++_openBugTicketCount; - SQLTransaction trans = SQLTransaction(nullptr); - ticket->SaveToDB(trans); + ticket->SaveToDB(); } void SupportMgr::AddTicket(ComplaintTicket* ticket) @@ -795,8 +562,7 @@ void SupportMgr::AddTicket(ComplaintTicket* ticket) if (!ticket->IsClosed()) ++_openComplaintTicketCount; - SQLTransaction trans = SQLTransaction(nullptr); - ticket->SaveToDB(trans); + ticket->SaveToDB(); } void SupportMgr::AddTicket(SuggestionTicket* ticket) @@ -805,19 +571,7 @@ void SupportMgr::AddTicket(SuggestionTicket* ticket) if (!ticket->IsClosed()) ++_openSuggestionTicketCount; - SQLTransaction trans = SQLTransaction(nullptr); - ticket->SaveToDB(trans); -} - -template<> -void SupportMgr::RemoveTicket<GmTicket>(uint32 ticketId) -{ - if (GmTicket* ticket = GetTicket<GmTicket>(ticketId)) - { - ticket->DeleteFromDB(); - _gmTicketList.erase(ticketId); - delete ticket; - } + ticket->SaveToDB(); } template<> @@ -854,28 +608,14 @@ void SupportMgr::RemoveTicket<SuggestionTicket>(uint32 ticketId) } template<> -void SupportMgr::CloseTicket<GmTicket>(uint32 ticketId, ObjectGuid closedBy) -{ - if (GmTicket* ticket = GetTicket<GmTicket>(ticketId)) - { - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetClosedBy(closedBy); - if (!closedBy.IsEmpty()) - --_openGmTicketCount; - ticket->SaveToDB(trans); - } -} - -template<> void SupportMgr::CloseTicket<BugTicket>(uint32 ticketId, ObjectGuid closedBy) { if (BugTicket* ticket = GetTicket<BugTicket>(ticketId)) { - SQLTransaction trans = SQLTransaction(NULL); ticket->SetClosedBy(closedBy); if (!closedBy.IsEmpty()) --_openBugTicketCount; - ticket->SaveToDB(trans); + ticket->SaveToDB(); } } @@ -884,11 +624,10 @@ void SupportMgr::CloseTicket<ComplaintTicket>(uint32 ticketId, ObjectGuid closed { if (ComplaintTicket* ticket = GetTicket<ComplaintTicket>(ticketId)) { - SQLTransaction trans = SQLTransaction(NULL); ticket->SetClosedBy(closedBy); if (!closedBy.IsEmpty()) --_openComplaintTicketCount; - ticket->SaveToDB(trans); + ticket->SaveToDB(); } } @@ -897,28 +636,14 @@ void SupportMgr::CloseTicket<SuggestionTicket>(uint32 ticketId, ObjectGuid close { if (SuggestionTicket* ticket = GetTicket<SuggestionTicket>(ticketId)) { - SQLTransaction trans = SQLTransaction(NULL); ticket->SetClosedBy(closedBy); if (!closedBy.IsEmpty()) --_openSuggestionTicketCount; - ticket->SaveToDB(trans); + ticket->SaveToDB(); } } template<> -void SupportMgr::ResetTickets<GmTicket>() -{ - for (auto const& c : _gmTicketList) - delete c.second; - _gmTicketList.clear(); - - _lastGmTicketId = 0; - - PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_ALL_GM_TICKETS); - CharacterDatabase.Execute(stmt); -} - -template<> void SupportMgr::ResetTickets<BugTicket>() { for (auto const& c : _bugTicketList) @@ -960,25 +685,6 @@ void SupportMgr::ResetTickets<SuggestionTicket>() } template<> -void SupportMgr::ShowList<GmTicket>(ChatHandler& handler, bool onlineOnly) const -{ - handler.SendSysMessage(onlineOnly ? LANG_COMMAND_TICKETSHOWONLINELIST : LANG_COMMAND_TICKETSHOWLIST); - for (GmTicketList::const_iterator itr = _gmTicketList.begin(); itr != _gmTicketList.end(); ++itr) - if (!itr->second->IsClosed() && !itr->second->IsCompleted()) - if (!onlineOnly || itr->second->GetPlayer()) - handler.SendSysMessage(itr->second->FormatViewMessageString(handler).c_str()); -} - -template<> -void SupportMgr::ShowList<GmTicket>(ChatHandler& handler) const -{ - handler.SendSysMessage(LANG_COMMAND_TICKETSHOWLIST); - for (GmTicketList::const_iterator itr = _gmTicketList.begin(); itr != _gmTicketList.end(); ++itr) - if (!itr->second->IsClosed() && !itr->second->IsCompleted()) - handler.SendSysMessage(itr->second->FormatViewMessageString(handler).c_str()); -} - -template<> void SupportMgr::ShowList<BugTicket>(ChatHandler& handler) const { handler.SendSysMessage(LANG_COMMAND_TICKETSHOWLIST); @@ -1006,15 +712,6 @@ void SupportMgr::ShowList<SuggestionTicket>(ChatHandler& handler) const } template<> -void SupportMgr::ShowClosedList<GmTicket>(ChatHandler& handler) const -{ - handler.SendSysMessage(LANG_COMMAND_TICKETSHOWCLOSEDLIST); - for (GmTicketList::const_iterator itr = _gmTicketList.begin(); itr != _gmTicketList.end(); ++itr) - if (itr->second->IsClosed()) - handler.SendSysMessage(itr->second->FormatViewMessageString(handler).c_str()); -} - -template<> void SupportMgr::ShowClosedList<BugTicket>(ChatHandler& handler) const { handler.SendSysMessage(LANG_COMMAND_TICKETSHOWCLOSEDLIST); @@ -1040,45 +737,3 @@ void SupportMgr::ShowClosedList<SuggestionTicket>(ChatHandler& handler) const if (itr->second->IsClosed()) handler.SendSysMessage(itr->second->FormatViewMessageString(handler).c_str()); } - -void SupportMgr::ShowGmEscalatedList(ChatHandler& handler) const -{ - handler.SendSysMessage(LANG_COMMAND_TICKETSHOWESCALATEDLIST); - for (GmTicketList::const_iterator itr = _gmTicketList.begin(); itr != _gmTicketList.end(); ++itr) - if (!itr->second->IsClosed() && itr->second->GetAssigendToStatus() == GMTICKET_ASSIGNEDTOGM_STATUS_ESCALATED) - handler.SendSysMessage(itr->second->FormatViewMessageString(handler).c_str()); -} - -void SupportMgr::SendGmTicket(WorldSession* session, GmTicket* ticket) const -{ - WorldPackets::Ticket::GMTicketGetTicketResponse response; - - if (ticket) - { - response.Result = GMTICKET_STATUS_HASTEXT; - response.Info = boost::in_place(); - - response.Info->TicketID = ticket->GetId(); - response.Info->TicketDescription = ticket->GetDescription(); - response.Info->Category = 1; - response.Info->TicketOpenTime = GetAge(ticket->GetLastModifiedTime()); - response.Info->OldestTicketTime = sSupportMgr->GetOldestOpenTicket() ? GetAge(sSupportMgr->GetOldestOpenTicket()->GetLastModifiedTime()) : float(0); - response.Info->UpdateTime = GetAge(sSupportMgr->GetLastChange()); - response.Info->AssignedToGM = ticket->GetAssigendToStatus(); - response.Info->OpenedByGM = ticket->GetOpenedByGmStatus(); - response.Info->WaitTimeOverrideMessage = ""; - response.Info->WaitTimeOverrideMinutes = 0; - } - else - response.Result = GMTICKET_STATUS_DEFAULT; - - session->SendPacket(response.Write()); -} - -void SupportMgr::SendGmTicketUpdate(WorldSession* session, GMTicketResponse response) const -{ - WorldPackets::Ticket::GMTicketUpdate update; - update.Result = response; - - session->SendPacket(update.Write()); -} diff --git a/src/server/game/Support/SupportMgr.h b/src/server/game/Support/SupportMgr.h index e0adb411aa0..fd251f50110 100644 --- a/src/server/game/Support/SupportMgr.h +++ b/src/server/game/Support/SupportMgr.h @@ -31,41 +31,6 @@ enum GMTicketSystemStatus GMTICKET_QUEUE_STATUS_ENABLED = 1 }; -enum GMTicketStatus -{ - GMTICKET_STATUS_HASTEXT = 0x06, - GMTICKET_STATUS_DEFAULT = 0x0A -}; - -enum GMTicketResponse -{ - GMTICKET_RESPONSE_ALREADY_EXIST = 1, - GMTICKET_RESPONSE_CREATE_SUCCESS = 2, - GMTICKET_RESPONSE_CREATE_ERROR = 3, - GMTICKET_RESPONSE_UPDATE_SUCCESS = 4, - GMTICKET_RESPONSE_UPDATE_ERROR = 5, - GMTICKET_RESPONSE_TICKET_DELETED = 9 -}; - -// from blizzard lua -enum GMTicketOpenedByGMStatus -{ - GMTICKET_OPENEDBYGM_STATUS_NOT_OPENED = 0, // ticket has never been opened by a gm - GMTICKET_OPENEDBYGM_STATUS_OPENED = 1 // ticket has been opened by a gm -}; - -// from Blizzard LUA: -// GMTICKET_ASSIGNEDTOGM_STATUS_NOT_ASSIGNED = 0; -- ticket is not currently assigned to a gm -// GMTICKET_ASSIGNEDTOGM_STATUS_ASSIGNED = 1; -- ticket is assigned to a normal gm -// GMTICKET_ASSIGNEDTOGM_STATUS_ESCALATED = 2; -- ticket is in the escalation queue -// 3 is a custom value and should never actually be sent -enum GMTicketAssignedToGMStatus -{ - GMTICKET_ASSIGNEDTOGM_STATUS_NOT_ASSIGNED = 0, - GMTICKET_ASSIGNEDTOGM_STATUS_ASSIGNED = 1, - GMTICKET_ASSIGNEDTOGM_STATUS_ESCALATED = 2 -}; - enum GMSupportComplaintType { GMTICKET_SUPPORT_COMPLAINT_TYPE_NONE = 0, @@ -93,8 +58,16 @@ public: uint32 GetId() const { return _id; } ObjectGuid GetPlayerGuid() const { return _playerGuid; } - Player* GetPlayer() const { return ObjectAccessor::FindPlayer(_playerGuid); } - Player* GetAssignedPlayer() const { return ObjectAccessor::FindPlayer(_assignedTo); } + Player* GetPlayer() const { return ObjectAccessor::FindConnectedPlayer(_playerGuid); } + std::string GetPlayerName() const + { + std::string name; + if (!_playerGuid.IsEmpty()) + ObjectMgr::GetPlayerNameByGUID(_playerGuid, name); + + return name; + } + Player* GetAssignedPlayer() const { return ObjectAccessor::FindConnectedPlayer(_assignedTo); } ObjectGuid GetAssignedToGUID() const { return _assignedTo; } std::string GetAssignedToName() const { @@ -117,13 +90,13 @@ public: } virtual void LoadFromDB(Field* fields) = 0; - virtual void SaveToDB(SQLTransaction& trans) const = 0; + virtual void SaveToDB() const = 0; virtual void DeleteFromDB() = 0; void TeleportTo(Player* player) const; virtual std::string FormatViewMessageString(ChatHandler& handler, bool detailed = false) const = 0; - virtual std::string FormatViewMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const; + virtual std::string FormatViewMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName) const; protected: uint32 _id; @@ -136,70 +109,6 @@ protected: std::string _comment; }; - -class GmTicket : public Ticket -{ -public: - GmTicket(); - GmTicket(Player* player); - ~GmTicket(); - - bool IsCompleted() const { return _completed; } - GMTicketOpenedByGMStatus GetOpenedByGmStatus() const { return _openedByGmStatus; } - - bool GetNeedMoreHelp() const { return _needMoreHelp; } - std::string const& GetDescription() const { return _description; } - uint64 GetLastModifiedTime() const { return _lastModifiedTime; } - uint8 GetCategory() const { return _category; } - GMTicketAssignedToGMStatus GetAssigendToStatus() const { return _assignedToStatus; } - std::string const& GetResponse() const { return _response; } - - void SetAssignedTo(ObjectGuid guid, bool isAdmin = false) override - { - _assignedTo = guid; - if (isAdmin) - _assignedToStatus = GMTICKET_ASSIGNEDTOGM_STATUS_ESCALATED; - else if (_assignedToStatus == GMTICKET_ASSIGNEDTOGM_STATUS_NOT_ASSIGNED) - _assignedToStatus = GMTICKET_ASSIGNEDTOGM_STATUS_ASSIGNED; - } - void SetAssignedToStatus(GMTicketAssignedToGMStatus assignedToStatus) { _assignedToStatus = assignedToStatus; } - void SetCompleted() { _completed = true; } - void SetDescription(std::string const& description) - { - _description = description; - _lastModifiedTime = uint64(time(NULL)); - } - void SetViewed() { _openedByGmStatus = GMTICKET_OPENEDBYGM_STATUS_OPENED; } - void SetGmAction(bool needResponse, bool needMoreHelp); - void SetUnassigned() override; - - void AppendResponse(std::string const& response) { _response += response; } - - void SetChatLog(std::list<uint32> time, std::string const& log); - std::string const& GetChatLog() const { return _chatLog; } - - void SendResponse(WorldSession* session) const; - - void LoadFromDB(Field* fields) override; - void SaveToDB(SQLTransaction& trans) const override; - void DeleteFromDB() override; - - std::string FormatViewMessageString(ChatHandler& handler, bool detailed = false) const override; - std::string FormatViewMessageString(ChatHandler& handler, const char* szClosedName, const char* szAssignedToName, const char* szUnassignedName, const char* szDeletedName, const char* szCompletedName) const override; - -private: - std::string _description; - uint64 _lastModifiedTime; - bool _completed; - uint8 _category; - GMTicketAssignedToGMStatus _assignedToStatus; - GMTicketOpenedByGMStatus _openedByGmStatus; - bool _needResponse; ///< true if we want a GM to contact us when we open a new ticket (Note: This flag is always true right now) - bool _needMoreHelp; - std::string _response; - std::string _chatLog; // No need to store in db, will be refreshed every session client side -}; - class BugTicket : public Ticket { public: @@ -213,7 +122,7 @@ public: void SetNote(std::string const& note) { _note = note; } void LoadFromDB(Field* fields) override; - void SaveToDB(SQLTransaction& trans) const override; + void SaveToDB() const override; void DeleteFromDB() override; using Ticket::FormatViewMessageString; @@ -246,7 +155,7 @@ public: void LoadFromDB(Field* fields) override; void LoadChatLineFromDB(Field* fields); - void SaveToDB(SQLTransaction& trans) const override; + void SaveToDB() const override; void DeleteFromDB() override; using Ticket::FormatViewMessageString; @@ -273,7 +182,7 @@ public: void SetFacing(float facing) { _facing = facing; } void LoadFromDB(Field* fields) override; - void SaveToDB(SQLTransaction& trans) const override; + void SaveToDB() const override; void DeleteFromDB() override; using Ticket::FormatViewMessageString; @@ -287,7 +196,6 @@ private: typedef std::map<uint32, BugTicket*> BugTicketList; typedef std::map<uint32, ComplaintTicket*> ComplaintTicketList; typedef std::map<uint32, SuggestionTicket*> SuggestionTicketList; -typedef std::map<uint32, GmTicket*> GmTicketList; class SupportMgr { @@ -305,15 +213,6 @@ public: template<typename T> T* GetTicket(uint32 ticketId); - GmTicket* GetGmTicketByPlayerGuid(ObjectGuid playerGuid) const - { - for (auto const& c : _gmTicketList) - if (c.second->GetPlayerGuid() == playerGuid && !c.second->IsClosed()) - return c.second; - - return nullptr; - } - ComplaintTicketList GetComplaintsByPlayerGuid(ObjectGuid playerGuid) const { ComplaintTicketList ret; @@ -324,15 +223,6 @@ public: return ret; } - GmTicket* GetOldestOpenTicket() - { - for (GmTicketList::const_iterator itr = _gmTicketList.begin(); itr != _gmTicketList.end(); ++itr) - if (itr->second && !itr->second->IsClosed() && !itr->second->IsCompleted()) - return itr->second; - - return nullptr; - } - void Initialize(); bool GetSupportSystemStatus() { return _supportSystemStatus; } @@ -350,12 +240,10 @@ public: void SetComplaintSystemStatus(bool status) { _complaintSystemStatus = status; } void SetSuggestionSystemStatus(bool status) { _suggestionSystemStatus = status; } - void LoadGmTickets(); void LoadBugTickets(); void LoadComplaintTickets(); void LoadSuggestionTickets(); - void AddTicket(GmTicket* ticket); void AddTicket(BugTicket* ticket); void AddTicket(ComplaintTicket* ticket); void AddTicket(SuggestionTicket* ticket); @@ -378,14 +266,8 @@ public: template<typename T> void ShowClosedList(ChatHandler& handler) const; - void ShowGmEscalatedList(ChatHandler& handler) const; - void UpdateLastChange() { _lastChange = uint64(time(nullptr)); } - void SendGmTicket(WorldSession* session, GmTicket* ticket) const; - void SendGmTicketUpdate(WorldSession* session, GMTicketResponse response) const; - - uint32 GenerateGmTicketId() { return ++_lastGmTicketId; } uint32 GenerateBugId() { return ++_lastBugId; } uint32 GenerateComplaintId() { return ++_lastComplaintId; } uint32 GenerateSuggestionId() { return ++_lastSuggestionId; } @@ -396,16 +278,13 @@ private: bool _bugSystemStatus; bool _complaintSystemStatus; bool _suggestionSystemStatus; - GmTicketList _gmTicketList; BugTicketList _bugTicketList; ComplaintTicketList _complaintTicketList; SuggestionTicketList _suggestionTicketList; - uint32 _lastGmTicketId; uint32 _lastBugId; uint32 _lastComplaintId; uint32 _lastSuggestionId; uint64 _lastChange; - uint32 _openGmTicketCount; uint32 _openBugTicketCount; uint32 _openComplaintTicketCount; uint32 _openSuggestionTicketCount; diff --git a/src/server/game/Texts/ChatTextBuilder.h b/src/server/game/Texts/ChatTextBuilder.h index 167680f1cd2..68cd375edb6 100644 --- a/src/server/game/Texts/ChatTextBuilder.h +++ b/src/server/game/Texts/ChatTextBuilder.h @@ -30,13 +30,12 @@ namespace Trinity BroadcastTextBuilder(Unit const* obj, ChatMsg msgType, uint32 textId, WorldObject const* target = nullptr, uint32 achievementId = 0) : _source(obj), _msgType(msgType), _textId(textId), _target(target), _achievementId(achievementId) { } - void operator()(WorldPacket& data, LocaleConstant locale) + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { BroadcastTextEntry const* bct = sBroadcastTextStore.LookupEntry(_textId); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _source->getGender()) : "", _achievementId, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, bct ? Language(bct->Language) : LANG_UNIVERSAL, _source, _target, bct ? DB2Manager::GetBroadcastTextValue(bct, locale, _source->getGender()) : "", _achievementId, "", locale); + return chat; } private: @@ -53,12 +52,11 @@ namespace Trinity CustomChatTextBuilder(WorldObject const* obj, ChatMsg msgType, std::string const& text, Language language = LANG_UNIVERSAL, WorldObject const* target = nullptr) : _source(obj), _msgType(msgType), _text(text), _language(language), _target(target) { } - void operator()(WorldPacket& data, LocaleConstant locale) + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, _language, _source, _target, _text, 0, "", locale); + return chat; } private: diff --git a/src/server/game/Texts/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index c1ea235a3e2..9967f9f299b 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -33,13 +33,12 @@ class CreatureTextBuilder CreatureTextBuilder(WorldObject const* obj, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) : _source(obj), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - void operator()(WorldPacket& data, LocaleConstant locale) const + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, Language(_language), _source, _target, text, 0, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, Language(_language), _source, _target, text, 0, "", locale); + return chat; } private: @@ -58,13 +57,12 @@ class PlayerTextBuilder PlayerTextBuilder(WorldObject const* obj, WorldObject const* speaker, uint8 gender, ChatMsg msgtype, uint8 textGroup, uint32 id, uint32 language, WorldObject const* target) : _source(obj), _talker(speaker), _gender(gender), _msgType(msgtype), _textGroup(textGroup), _textId(id), _language(language), _target(target) { } - void operator()(WorldPacket& data, LocaleConstant locale) const + WorldPackets::Chat::Chat* operator()(LocaleConstant locale) const { std::string const& text = sCreatureTextMgr->GetLocalizedChatString(_source->GetEntry(), _gender, _textGroup, _textId, locale); - WorldPackets::Chat::Chat packet; - packet.Initialize(_msgType, Language(_language), _talker, _target, text, 0, "", locale); - packet.Write(); - data = packet.Move(); + WorldPackets::Chat::Chat* chat = new WorldPackets::Chat::Chat(); + chat->Initialize(_msgType, Language(_language), _talker, _target, text, 0, "", locale); + return chat; } private: @@ -83,7 +81,7 @@ void CreatureTextMgr::LoadCreatureTexts() uint32 oldMSTime = getMSTime(); mTextMap.clear(); // for reload case - mTextRepeatMap.clear(); //reset all currently used temp texts + //all currently used temp texts are NOT reset PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_SEL_CREATURE_TEXT); PreparedQueryResult result = WorldDatabase.Query(stmt); @@ -230,13 +228,7 @@ uint32 CreatureTextMgr::SendChat(Creature* source, uint8 textGroup, WorldObject if (tempGroup.empty()) { - CreatureTextRepeatMap::iterator mapItr = mTextRepeatMap.find(source->GetGUID()); - if (mapItr != mTextRepeatMap.end()) - { - CreatureTextRepeatGroup::iterator groupItr = mapItr->second.find(textGroup); - groupItr->second.clear(); - } - + source->ClearTextRepeatGroup(textGroup); tempGroup = textGroupContainer; } @@ -430,26 +422,14 @@ void CreatureTextMgr::SetRepeatId(Creature* source, uint8 textGroup, uint8 id) if (!source) return; - CreatureTextRepeatIds& repeats = mTextRepeatMap[source->GetGUID()][textGroup]; - if (std::find(repeats.begin(), repeats.end(), id) == repeats.end()) - repeats.push_back(id); - else - TC_LOG_ERROR("sql.sql", "CreatureTextMgr: TextGroup %u for Creature (%s) %s, id %u already added", uint32(textGroup), source->GetName().c_str(), source->GetGUID().ToString().c_str(), uint32(id)); + source->SetTextRepeatId(textGroup, id); } CreatureTextRepeatIds CreatureTextMgr::GetRepeatGroup(Creature* source, uint8 textGroup) const { ASSERT(source);//should never happen - CreatureTextRepeatIds ids; - CreatureTextRepeatMap::const_iterator mapItr = mTextRepeatMap.find(source->GetGUID()); - if (mapItr != mTextRepeatMap.end()) - { - CreatureTextRepeatGroup::const_iterator groupItr = (*mapItr).second.find(textGroup); - if (groupItr != mapItr->second.end()) - ids = groupItr->second; - } - return ids; + return source->GetTextRepeatGroup(textGroup); } bool CreatureTextMgr::TextExist(uint32 sourceEntry, uint8 textGroup) const diff --git a/src/server/game/Texts/CreatureTextMgr.h b/src/server/game/Texts/CreatureTextMgr.h index 307f6ece4f8..366ef22cc70 100644 --- a/src/server/game/Texts/CreatureTextMgr.h +++ b/src/server/game/Texts/CreatureTextMgr.h @@ -76,11 +76,6 @@ typedef std::unordered_map<uint32, CreatureTextHolder> CreatureTextMap; // a typedef std::map<CreatureTextId, CreatureTextLocale> LocaleCreatureTextMap; -//used for handling non-repeatable random texts -typedef std::vector<uint8> CreatureTextRepeatIds; -typedef std::unordered_map<uint8, CreatureTextRepeatIds> CreatureTextRepeatGroup; -typedef std::unordered_map<ObjectGuid, CreatureTextRepeatGroup> CreatureTextRepeatMap;//guid based - class CreatureTextMgr { private: @@ -116,7 +111,6 @@ class CreatureTextMgr static float GetRangeForChatType(ChatMsg msgType); CreatureTextMap mTextMap; - CreatureTextRepeatMap mTextRepeatMap; LocaleCreatureTextMap mLocaleTextMap; }; @@ -145,23 +139,25 @@ class CreatureTextLocalizer // create if not cached yet if (!_packetCache[loc_idx]) { - messageTemplate = new WorldPackets::Chat::Chat(); + messageTemplate = _builder(loc_idx); _packetCache[loc_idx] = messageTemplate; } else messageTemplate = _packetCache[loc_idx]; + WorldPackets::Chat::Chat message(*messageTemplate); + switch (_msgType) { case CHAT_MSG_MONSTER_WHISPER: case CHAT_MSG_RAID_BOSS_WHISPER: - messageTemplate->TargetGUID = player->GetGUID(); + message.SetReceiver(player, loc_idx); break; default: break; } - player->SendDirectMessage(messageTemplate->Write()); + player->SendDirectMessage(message.Write()); } private: diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index aed2d73c422..c6192c94fda 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -192,14 +192,14 @@ std::string Warden::Penalty(WardenCheck* check /*= NULL*/) switch (action) { - case WARDEN_ACTION_LOG: - return "None"; - break; - case WARDEN_ACTION_KICK: - _session->KickPlayer(); - return "Kick"; - break; - case WARDEN_ACTION_BAN: + case WARDEN_ACTION_LOG: + return "None"; + break; + case WARDEN_ACTION_KICK: + _session->KickPlayer(); + return "Kick"; + break; + case WARDEN_ACTION_BAN: { std::stringstream duration; duration << sWorld->getIntConfig(CONFIG_WARDEN_CLIENT_BAN_DURATION) << "s"; @@ -215,8 +215,8 @@ std::string Warden::Penalty(WardenCheck* check /*= NULL*/) return "Ban"; } - default: - break; + default: + break; } return "Undefined"; } diff --git a/src/server/game/Weather/Weather.cpp b/src/server/game/Weather/Weather.cpp index ecceb0b102f..348a98aa8b2 100644 --- a/src/server/game/Weather/Weather.cpp +++ b/src/server/game/Weather/Weather.cpp @@ -97,7 +97,7 @@ bool Weather::ReGenerate() time_t gtime = sWorld->GetGameTime(); struct tm ltime; localtime_r(>ime, <ime); - uint32 season = ((ltime.tm_yday - 78 + 365)/91)%4; + uint32 season = ((ltime.tm_yday - 78 + 365) / 91) % 4; static char const* seasonName[WEATHER_SEASONS] = { "spring", "summer", "fall", "winter" }; @@ -152,8 +152,8 @@ bool Weather::ReGenerate() // At this point, only weather that isn't doing anything remains but that have weather data uint32 chance1 = m_weatherChances->data[season].rainChance; - uint32 chance2 = chance1+ m_weatherChances->data[season].snowChance; - uint32 chance3 = chance2+ m_weatherChances->data[season].stormChance; + uint32 chance2 = chance1 + m_weatherChances->data[season].snowChance; + uint32 chance3 = chance2 + m_weatherChances->data[season].stormChance; uint32 rnd = urand(0, 99); if (rnd <= chance1) @@ -316,4 +316,3 @@ WeatherState Weather::GetWeatherState() const return WEATHER_STATE_FINE; } } - diff --git a/src/server/game/World/World.cpp b/src/server/game/World/World.cpp index d68da8fbc63..7746607d9e6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -282,14 +282,7 @@ void World::AddSession_(WorldSession* s) return; } - s->SendAuthResponse(AUTH_OK, false); - - s->SendSetTimeZoneInformation(); - s->SendFeatureSystemStatusGlueScreen(); - - s->SendAddonsInfo(); - s->SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION)); - s->SendTutorialsData(); + s->InitializeSession(); UpdateMaxSessionCounters(); @@ -394,18 +387,7 @@ bool World::RemoveQueuedPlayer(WorldSession* sess) if ((!m_playerLimit || sessions < m_playerLimit) && !m_QueuedPlayer.empty()) { WorldSession* pop_sess = m_QueuedPlayer.front(); - pop_sess->SetInQueue(false); - pop_sess->ResetTimeOutTime(); - pop_sess->SendAuthWaitQue(0); - - pop_sess->SendSetTimeZoneInformation(); - pop_sess->SendFeatureSystemStatusGlueScreen(); - - pop_sess->SendAddonsInfo(); - - pop_sess->SendClientCacheVersion(sWorld->getIntConfig(CONFIG_CLIENTCACHE_VERSION)); - pop_sess->SendTutorialsData(); - + pop_sess->InitializeSession(); m_QueuedPlayer.pop_front(); // update iter to point first queued socket or end() if queue is empty now @@ -463,7 +445,6 @@ void World::LoadConfigSettings(bool reload) sSupportMgr->SetComplaintSystemStatus(m_bool_configs[CONFIG_SUPPORT_COMPLAINTS_ENABLED]); sSupportMgr->SetSuggestionSystemStatus(m_bool_configs[CONFIG_SUPPORT_SUGGESTIONS_ENABLED]); } - m_float_configs[CONFIG_CHANCE_OF_GM_SURVEY] = sConfigMgr->GetFloatDefault("Support.ChanceOfGMSurvey", 50.0f); ///- Get string for new logins (newly created characters) @@ -646,7 +627,6 @@ void World::LoadConfigSettings(bool reload) m_int_configs[CONFIG_CHAT_WHISPER_LEVEL_REQ] = sConfigMgr->GetIntDefault("ChatLevelReq.Whisper", 1); m_int_configs[CONFIG_CHAT_SAY_LEVEL_REQ] = sConfigMgr->GetIntDefault("ChatLevelReq.Say", 1); m_int_configs[CONFIG_TRADE_LEVEL_REQ] = sConfigMgr->GetIntDefault("LevelReq.Trade", 1); - m_int_configs[CONFIG_TICKET_LEVEL_REQ] = sConfigMgr->GetIntDefault("LevelReq.Ticket", 1); m_int_configs[CONFIG_AUCTION_LEVEL_REQ] = sConfigMgr->GetIntDefault("LevelReq.Auction", 1); m_int_configs[CONFIG_MAIL_LEVEL_REQ] = sConfigMgr->GetIntDefault("LevelReq.Mail", 1); m_bool_configs[CONFIG_PRESERVE_CUSTOM_CHANNELS] = sConfigMgr->GetBoolDefault("PreserveCustomChannels", false); @@ -1477,16 +1457,17 @@ void World::SetInitialWorldSettings() LoginDatabase.PExecute("UPDATE realmlist SET icon = %u, timezone = %u WHERE id = '%d'", server_type, realm_zone, realmHandle.Index); // One-time query - ///- Load the DBC files TC_LOG_INFO("server.loading", "Initialize data stores..."); + ///- Load DBCs LoadDBCStores(m_dataPath); + ///- Load DB2s sDB2Manager.LoadStores(m_dataPath); - TC_LOG_INFO("misc", "Loading hotfix info..."); sDB2Manager.LoadHotfixData(); - - // Close hotfix database - it is only used during DB2 loading + ///- Close hotfix database - it is only used during DB2 loading HotfixDatabase.Close(); + ///- Load GameTables + LoadGameTables(m_dataPath); sSpellMgr->LoadPetFamilySpellsStore(); @@ -1752,6 +1733,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading Skill Fishing base level requirements..."); sObjectMgr->LoadFishingBaseSkillLevel(); + TC_LOG_INFO("server.loading", "Loading skill tier info..."); + sObjectMgr->LoadSkillTiers(); + TC_LOG_INFO("server.loading", "Loading Achievements..."); sAchievementMgr->LoadAchievementReferenceList(); TC_LOG_INFO("server.loading", "Loading Achievement Criteria Modifier trees..."); @@ -1845,6 +1829,9 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading faction change spell pairs..."); sObjectMgr->LoadFactionChangeSpells(); + TC_LOG_INFO("server.loading", "Loading faction change quest pairs..."); + sObjectMgr->LoadFactionChangeQuests(); + TC_LOG_INFO("server.loading", "Loading faction change item pairs..."); sObjectMgr->LoadFactionChangeItems(); @@ -1854,9 +1841,6 @@ void World::SetInitialWorldSettings() TC_LOG_INFO("server.loading", "Loading faction change title pairs..."); sObjectMgr->LoadFactionChangeTitles(); - TC_LOG_INFO("server.loading", "Loading GM tickets..."); - sSupportMgr->LoadGmTickets(); - TC_LOG_INFO("server.loading", "Loading GM bugs..."); sSupportMgr->LoadBugTickets(); @@ -2351,7 +2335,7 @@ namespace Trinity class WorldWorldTextBuilder { public: - typedef std::vector<WorldPacket*> WorldPacketList; + typedef std::vector<WorldPackets::Packet*> WorldPacketList; static size_t const BufferSize = 2048; explicit WorldWorldTextBuilder(uint32 textId, va_list* args = NULL) : i_textId(textId), i_args(args) { } @@ -2383,10 +2367,10 @@ namespace Trinity { while (char* line = ChatHandler::LineFromMessage(text)) { - WorldPackets::Chat::Chat packet; - packet.Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); - packet.Write(); - dataList.emplace_back(new WorldPacket(packet.Move())); + WorldPackets::Chat::Chat* packet = new WorldPackets::Chat::Chat(); + packet->Initialize(CHAT_MSG_SYSTEM, LANG_UNIVERSAL, nullptr, nullptr, line); + packet->Write(); + dataList.push_back(packet); } } diff --git a/src/server/game/World/World.h b/src/server/game/World/World.h index b169431f2fd..b72591e04fa 100644 --- a/src/server/game/World/World.h +++ b/src/server/game/World/World.h @@ -191,7 +191,6 @@ enum WorldFloatConfigs CONFIG_CREATURE_FAMILY_FLEE_ASSISTANCE_RADIUS, CONFIG_CREATURE_FAMILY_ASSISTANCE_RADIUS, CONFIG_THREAT_RADIUS, - CONFIG_CHANCE_OF_GM_SURVEY, CONFIG_STATS_LIMITS_DODGE, CONFIG_STATS_LIMITS_PARRY, CONFIG_STATS_LIMITS_BLOCK, @@ -252,7 +251,6 @@ enum WorldIntConfigs CONFIG_MIN_PETITION_SIGNS, CONFIG_GM_LOGIN_STATE, CONFIG_GM_VISIBLE_STATE, - CONFIG_GM_ACCEPT_TICKETS, CONFIG_GM_CHAT, CONFIG_GM_WHISPERING_TO, CONFIG_GM_FREEZE_DURATION, @@ -286,7 +284,6 @@ enum WorldIntConfigs CONFIG_CHAT_WHISPER_LEVEL_REQ, CONFIG_CHAT_SAY_LEVEL_REQ, CONFIG_TRADE_LEVEL_REQ, - CONFIG_TICKET_LEVEL_REQ, CONFIG_AUCTION_LEVEL_REQ, CONFIG_MAIL_LEVEL_REQ, CONFIG_CORPSE_DECAY_NORMAL, diff --git a/src/server/scripts/Commands/cs_debug.cpp b/src/server/scripts/Commands/cs_debug.cpp index 7f1a364fd57..aa0f1993621 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -1431,7 +1431,7 @@ public: handler->SendSysMessage("Target is not phased"); return true; } - + static bool HandleDebugSendPlaySceneCommand(ChatHandler* handler, char const* args) { if (!*args) @@ -1458,7 +1458,7 @@ public: sceneInstanceID = atoi(c); if (d) sceneScriptPackageID = atoi(d); - + Player* me = handler->GetSession()->GetPlayer(); WorldPackets::Scenes::PlayScene packet; diff --git a/src/server/scripts/Commands/cs_go.cpp b/src/server/scripts/Commands/cs_go.cpp index 53522736718..19b714f6e61 100644 --- a/src/server/scripts/Commands/cs_go.cpp +++ b/src/server/scripts/Commands/cs_go.cpp @@ -49,7 +49,6 @@ public: { "trigger", rbac::RBAC_PERM_COMMAND_GO_TRIGGER, false, &HandleGoTriggerCommand, "", NULL }, { "zonexy", rbac::RBAC_PERM_COMMAND_GO_ZONEXY, false, &HandleGoZoneXYCommand, "", NULL }, { "xyz", rbac::RBAC_PERM_COMMAND_GO_XYZ, false, &HandleGoXYZCommand, "", NULL }, - { "ticket", rbac::RBAC_PERM_COMMAND_GO_TICKET, false, &HandleGoTicketCommand<GmTicket>, "", NULL }, { "bugticket", rbac::RBAC_PERM_COMMAND_GO_BUG_TICKET, false, &HandleGoTicketCommand<BugTicket>, "", NULL }, { "complaintticket", rbac::RBAC_PERM_COMMAND_GO_COMPLAINT_TICKET, false, &HandleGoTicketCommand<ComplaintTicket>, "", NULL }, { "suggestionticket", rbac::RBAC_PERM_COMMAND_GO_SUGGESTION_TICKET, false, &HandleGoTicketCommand<SuggestionTicket>, "", NULL }, @@ -123,7 +122,7 @@ public: whereClause << "WHERE guid = '" << guid << '\''; } - QueryResult result = WorldDatabase.PQuery("SELECT position_x, position_y, position_z, orientation, map, guid, id FROM creature %s", whereClause.str().c_str()); + QueryResult result = WorldDatabase.PQuery("SELECT position_x, position_y, position_z, orientation, map FROM creature %s", whereClause.str().c_str()); if (!result) { handler->SendSysMessage(LANG_COMMAND_GOCREATNOTFOUND); @@ -139,10 +138,6 @@ public: float z = fields[2].GetFloat(); float o = fields[3].GetFloat(); uint32 mapId = fields[4].GetUInt16(); - ObjectGuid::LowType guid = fields[5].GetUInt64(); - uint32 id = fields[6].GetUInt32(); - - Transport* transport = NULL; if (!MapManager::IsValidMapCoord(mapId, x, y, z, o) || sObjectMgr->IsTransportMap(mapId)) { @@ -161,11 +156,8 @@ public: else player->SaveRecallPosition(); - if (player->TeleportTo(mapId, x, y, z, o)) - { - if (transport) - transport->AddPassenger(player); - } + player->TeleportTo(mapId, x, y, z, o); + return true; } diff --git a/src/server/scripts/Commands/cs_gobject.cpp b/src/server/scripts/Commands/cs_gobject.cpp index 1af687aef08..ad877bdefb4 100644 --- a/src/server/scripts/Commands/cs_gobject.cpp +++ b/src/server/scripts/Commands/cs_gobject.cpp @@ -433,14 +433,14 @@ public: } object->Relocate(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), o); + object->RelocateStationaryPosition(object->GetPositionX(), object->GetPositionY(), object->GetPositionZ(), o); object->UpdateRotationFields(); object->DestroyForNearbyPlayers(); object->UpdateObjectVisibility(); object->SaveToDB(); - object->Refresh(); - handler->PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, object->GetGUID().GetCounter(), object->GetGOInfo()->name.c_str(), object->GetGUID().ToString().c_str(), o); + handler->PSendSysMessage(LANG_COMMAND_TURNOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name.c_str(), object->GetGUID().ToString().c_str(), o); return true; } @@ -474,21 +474,20 @@ public: char* toY = strtok(NULL, " "); char* toZ = strtok(NULL, " "); + float x, y, z; if (!toX) { Player* player = handler->GetSession()->GetPlayer(); - object->Relocate(player->GetPositionX(), player->GetPositionY(), player->GetPositionZ(), object->GetOrientation()); - object->DestroyForNearbyPlayers(); - object->UpdateObjectVisibility(); + player->GetPosition(x, y, z); } else { if (!toY || !toZ) return false; - float x = (float)atof(toX); - float y = (float)atof(toY); - float z = (float)atof(toZ); + x = (float)atof(toX); + y = (float)atof(toY); + z = (float)atof(toZ); if (!MapManager::IsValidMapCoord(object->GetMapId(), x, y, z)) { @@ -496,16 +495,15 @@ public: handler->SetSentErrorMessage(true); return false; } - - object->Relocate(x, y, z, object->GetOrientation()); - object->DestroyForNearbyPlayers(); - object->UpdateObjectVisibility(); } + object->DestroyForNearbyPlayers(); + object->RelocateStationaryPosition(x, y, z, object->GetOrientation()); + object->GetMap()->GameObjectRelocation(object, x, y, z, object->GetOrientation()); + object->SaveToDB(); - object->Refresh(); - handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetGUID().GetCounter(), object->GetGOInfo()->name.c_str(), object->GetGUID().ToString().c_str()); + handler->PSendSysMessage(LANG_COMMAND_MOVEOBJMESSAGE, object->GetSpawnId(), object->GetGOInfo()->name.c_str(), object->GetGUID().ToString().c_str()); return true; } diff --git a/src/server/scripts/Commands/cs_lookup.cpp b/src/server/scripts/Commands/cs_lookup.cpp index 4d1d484cb2f..8fa5bd079e6 100644 --- a/src/server/scripts/Commands/cs_lookup.cpp +++ b/src/server/scripts/Commands/cs_lookup.cpp @@ -919,7 +919,7 @@ public: // Search in TaxiNodes.dbc for (TaxiNodesEntry const* nodeEntry : sTaxiNodesStore) { - std::string name = nodeEntry->Name_lang->Str[locale]; + std::string name = nodeEntry->Name->Str[locale]; if (name.empty()) continue; diff --git a/src/server/scripts/Commands/cs_npc.cpp b/src/server/scripts/Commands/cs_npc.cpp index 81cad2db188..2c91a9e6e3e 100644 --- a/src/server/scripts/Commands/cs_npc.cpp +++ b/src/server/scripts/Commands/cs_npc.cpp @@ -374,28 +374,13 @@ public: ObjectGuid::LowType lowGuid = strtoull(guidStr, nullptr, 10); - Creature* creature = NULL; - - /* FIXME: impossible without entry - if (lowguid) - creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), MAKE_GUID(lowguid, HIGHGUID_UNIT)); - */ - // attempt check creature existence by DB data - if (!creature) - { - CreatureData const* data = sObjectMgr->GetCreatureData(lowGuid); - if (!data) - { - handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowGuid); - handler->SetSentErrorMessage(true); - return false; - } - } - else + CreatureData const* data = sObjectMgr->GetCreatureData(lowGuid); + if (!data) { - // obtain real GUID for DB operations - lowGuid = creature->GetSpawnId(); + handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowGuid); + handler->SetSentErrorMessage(true); + return false; } int wait = waitStr ? atoi(waitStr) : 0; @@ -411,18 +396,6 @@ public: WorldDatabase.Execute(stmt); - if (creature && creature->GetWaypointPath()) - { - creature->SetDefaultMovementType(WAYPOINT_MOTION_TYPE); - creature->GetMotionMaster()->Initialize(); - if (creature->IsAlive()) // dead creature will reset movement generator at respawn - { - creature->setDeathState(JUST_DIED); - creature->Respawn(true); - } - creature->SaveToDB(); - } - handler->SendSysMessage(LANG_WAYPOINT_ADDED); return true; @@ -836,34 +809,22 @@ public: lowguid = strtoull(cId, nullptr, 10); - /* FIXME: impossible without entry - if (lowguid) - creature = ObjectAccessor::GetCreature(*handler->GetSession()->GetPlayer(), MAKE_GUID(lowguid, HIGHGUID_UNIT)); - */ - // Attempting creature load from DB data - if (!creature) + CreatureData const* data = sObjectMgr->GetCreatureData(lowguid); + if (!data) { - CreatureData const* data = sObjectMgr->GetCreatureData(lowguid); - if (!data) - { - handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid); - handler->SetSentErrorMessage(true); - return false; - } + handler->PSendSysMessage(LANG_COMMAND_CREATGUIDNOTFOUND, lowguid); + handler->SetSentErrorMessage(true); + return false; + } - uint32 map_id = data->mapid; + uint32 map_id = data->mapid; - if (handler->GetSession()->GetPlayer()->GetMapId() != map_id) - { - handler->PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid); - handler->SetSentErrorMessage(true); - return false; - } - } - else + if (handler->GetSession()->GetPlayer()->GetMapId() != map_id) { - lowguid = creature->GetSpawnId(); + handler->PSendSysMessage(LANG_COMMAND_CREATUREATSAMEMAP, lowguid); + handler->SetSentErrorMessage(true); + return false; } } else diff --git a/src/server/scripts/Commands/cs_reload.cpp b/src/server/scripts/Commands/cs_reload.cpp index 556589e281d..c3ba942ef1f 100644 --- a/src/server/scripts/Commands/cs_reload.cpp +++ b/src/server/scripts/Commands/cs_reload.cpp @@ -167,7 +167,6 @@ public: static bool HandleReloadSupportSystemCommand(ChatHandler* handler, const char* /*args*/) { TC_LOG_INFO("misc", "Re-Loading Support System Tables..."); - sSupportMgr->LoadGmTickets(); sSupportMgr->LoadBugTickets(); sSupportMgr->LoadComplaintTickets(); sSupportMgr->LoadSuggestionTickets(); diff --git a/src/server/scripts/Commands/cs_tele.cpp b/src/server/scripts/Commands/cs_tele.cpp index 55562a004ac..09930770f63 100644 --- a/src/server/scripts/Commands/cs_tele.cpp +++ b/src/server/scripts/Commands/cs_tele.cpp @@ -319,7 +319,7 @@ public: } MapEntry const* map = sMapStore.LookupEntry(tele->mapId); - if (!map || map->IsBattlegroundOrArena()) + if (!map || (map->IsBattlegroundOrArena() && (me->GetMapId() != tele->mapId || !me->IsGameMaster()))) { handler->SendSysMessage(LANG_CANNOT_TELE_TO_BG); handler->SetSentErrorMessage(true); diff --git a/src/server/scripts/Commands/cs_ticket.cpp b/src/server/scripts/Commands/cs_ticket.cpp index 3847a74bc34..7591cbf1712 100644 --- a/src/server/scripts/Commands/cs_ticket.cpp +++ b/src/server/scripts/Commands/cs_ticket.cpp @@ -64,79 +64,15 @@ public: template<typename T> static bool HandleTicketGetByIdCommand(ChatHandler* handler, char const* args); - static bool HandleGMTicketCompleteCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - if (Player* player = ticket->GetPlayer()) - ticket->SendResponse(player->GetSession()); - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetCompleted(); - ticket->SaveToDB(trans); - - std::string msg = ticket->FormatViewMessageString(*handler, NULL, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console"); - handler->SendGlobalGMSysMessage(msg.c_str()); - sSupportMgr->UpdateLastChange(); - return true; - } - - static bool HandleGMTicketEscalateCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket || ticket->IsClosed() || ticket->IsCompleted() || ticket->GetAssigendToStatus() != GMTICKET_ASSIGNEDTOGM_STATUS_NOT_ASSIGNED) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetAssignedToStatus(GMTICKET_ASSIGNEDTOGM_STATUS_ESCALATED); - ticket->SaveToDB(trans); - - if (Player* player = ticket->GetPlayer()) - sSupportMgr->SendGmTicket(player->GetSession(), ticket); - - sSupportMgr->UpdateLastChange(); - return true; - } - - static bool HandleGMTicketListEscalatedCommand(ChatHandler* handler, char const* /*args*/) - { - sSupportMgr->ShowGmEscalatedList(*handler); - return true; - } - - static bool HandleGMTicketListOnlineCommand(ChatHandler* handler, char const* /*args*/) - { - sSupportMgr->ShowList<GmTicket>(*handler, true); - return true; - } - static bool HandleTicketResetAllCommand(ChatHandler* handler, char const* /*args*/) { - if (sSupportMgr->GetOpenTicketCount<GmTicket>() || sSupportMgr->GetOpenTicketCount<BugTicket>() - || sSupportMgr->GetOpenTicketCount<ComplaintTicket>() || sSupportMgr->GetOpenTicketCount<SuggestionTicket>()) + if (sSupportMgr->GetOpenTicketCount<BugTicket>() || sSupportMgr->GetOpenTicketCount<ComplaintTicket>() || sSupportMgr->GetOpenTicketCount<SuggestionTicket>()) { handler->SendSysMessage(LANG_COMMAND_TICKETPENDING); return true; } else { - sSupportMgr->ResetTickets<GmTicket>(); sSupportMgr->ResetTickets<BugTicket>(); sSupportMgr->ResetTickets<ComplaintTicket>(); sSupportMgr->ResetTickets<SuggestionTicket>(); @@ -159,95 +95,6 @@ public: return true; } - static bool HandleGMTicketGetByNameCommand(ChatHandler* handler, char const* args) - { - if (!*args) - return false; - - std::string name(args); - if (!normalizePlayerName(name)) - return false; - - // Detect target's GUID - ObjectGuid guid; - if (Player* player = ObjectAccessor::FindPlayerByName(name)) - guid = player->GetGUID(); - else - guid = ObjectMgr::GetPlayerGUIDByName(name); - - // Target must exist - if (!guid) - { - handler->SendSysMessage(LANG_NO_PLAYERS_FOUND); - return true; - } - - // Ticket must exist - GmTicket* ticket = sSupportMgr->GetGmTicketByPlayerGuid(guid); - if (!ticket) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetViewed(); - ticket->SaveToDB(trans); - - if (Player* player = ticket->GetPlayer()) - sSupportMgr->SendGmTicket(player->GetSession(), ticket); - - handler->SendSysMessage(ticket->FormatViewMessageString(*handler, true).c_str()); - return true; - } - - static bool _HandleGMTicketResponseAppendCommand(char const* args, bool newLine, ChatHandler* handler) - { - if (!*args) - return false; - - char* ticketIdStr = strtok((char*)args, " "); - uint32 ticketId = atoi(ticketIdStr); - - char* response = strtok(NULL, "\n"); - if (!response) - return false; - - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket || ticket->IsClosed()) - { - handler->PSendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - // Cannot add response to ticket, assigned to someone else - //! Console excluded - Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : NULL; - if (player && ticket->IsAssignedNotTo(player->GetGUID())) - { - handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId()); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->AppendResponse(response); - if (newLine) - ticket->AppendResponse("\n"); - ticket->SaveToDB(trans); - - return true; - } - - static bool HandleGMTicketResponseAppendCommand(ChatHandler* handler, char const* args) - { - return _HandleGMTicketResponseAppendCommand(args, false, handler); - } - - static bool HandleGMTicketResponseAppendLnCommand(ChatHandler* handler, char const* args) - { - return _HandleGMTicketResponseAppendCommand(args, true, handler); - } - ChatCommand* GetCommands() const override; }; @@ -301,76 +148,16 @@ bool ticket_commandscript::HandleTicketAssignToCommand(ChatHandler* handler, cha } // Assign ticket - SQLTransaction trans = SQLTransaction(nullptr); ticket->SetAssignedTo(targetGuid); - ticket->SaveToDB(trans); + ticket->SaveToDB(); - std::string msg = ticket->FormatViewMessageString(*handler, NULL, target.c_str(), NULL, NULL, NULL); + std::string msg = ticket->FormatViewMessageString(*handler, NULL, target.c_str(), NULL, NULL); handler->SendGlobalGMSysMessage(msg.c_str()); return true; } -template<> -bool ticket_commandscript::HandleTicketAssignToCommand<GmTicket>(ChatHandler* handler, char const* args) -{ - if (!*args) - return false; - char* ticketIdStr = strtok((char*)args, " "); - uint32 ticketId = atoi(ticketIdStr); - - char* targetStr = strtok(NULL, " "); - if (!targetStr) - return false; - - std::string target(targetStr); - if (!normalizePlayerName(target)) - return false; - - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket || ticket->IsClosed()) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - ObjectGuid targetGuid = ObjectMgr::GetPlayerGUIDByName(target); - uint32 accountId = ObjectMgr::GetPlayerAccountIdByGUID(targetGuid); - // Target must exist and have administrative rights - if (!AccountMgr::HasPermission(accountId, rbac::RBAC_PERM_COMMANDS_BE_ASSIGNED_TICKET, realmHandle.Index)) - { - handler->SendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_A); - return true; - } - - // If already assigned, leave - if (ticket->IsAssignedTo(targetGuid)) - { - handler->PSendSysMessage(LANG_COMMAND_TICKETASSIGNERROR_B, ticket->GetId()); - return true; - } - - // If assigned to different player other than current, leave - //! Console can override though - Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr; - if (player && ticket->IsAssignedNotTo(player->GetGUID())) - { - handler->PSendSysMessage(LANG_COMMAND_TICKETALREADYASSIGNED, ticket->GetId(), target.c_str()); - return true; - } - - // Assign ticket - SQLTransaction trans = SQLTransaction(nullptr); - ticket->SetAssignedTo(targetGuid, AccountMgr::IsAdminAccount(AccountMgr::GetSecurity(accountId, realmHandle.Index))); - sSupportMgr->UpdateLastChange(); - - ticket->SaveToDB(trans); - - std::string msg = ticket->FormatViewMessageString(*handler, NULL, target.c_str(), NULL, NULL, NULL); - handler->SendGlobalGMSysMessage(msg.c_str()); - return true; -} template<typename T> bool ticket_commandscript::HandleTicketCloseByIdCommand(ChatHandler* handler, char const* args) @@ -403,52 +190,9 @@ bool ticket_commandscript::HandleTicketCloseByIdCommand(ChatHandler* handler, ch sSupportMgr->CloseTicket<T>(ticket->GetId(), closedByGuid); - std::string msg = ticket->FormatViewMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL, NULL); - handler->SendGlobalGMSysMessage(msg.c_str()); - - return true; -} - -template<> -bool ticket_commandscript::HandleTicketCloseByIdCommand<GmTicket>(ChatHandler* handler, char const* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - // Ticket should be assigned to the player who tries to close it. - // Console can override though - Player* player = handler->GetSession() ? handler->GetSession()->GetPlayer() : nullptr; - if (player && ticket->IsAssignedNotTo(player->GetGUID())) - { - handler->PSendSysMessage(LANG_COMMAND_TICKETCANNOTCLOSE, ticket->GetId()); - return true; - } - - ObjectGuid closedByGuid; - if (player) - closedByGuid = player->GetGUID(); - else - closedByGuid.SetRawValue(0, uint64(-1)); - - std::string msg = ticket->FormatViewMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL, NULL); + std::string msg = ticket->FormatViewMessageString(*handler, player ? player->GetName().c_str() : "Console", NULL, NULL, NULL); handler->SendGlobalGMSysMessage(msg.c_str()); - - sSupportMgr->CloseTicket<GmTicket>(ticket->GetId(), closedByGuid); - sSupportMgr->UpdateLastChange(); - - // Inform player, who submitted this ticket, that it is closed - if (Player* submitter = ticket->GetPlayer()) - sSupportMgr->SendGmTicketUpdate(submitter->GetSession(), GMTICKET_RESPONSE_TICKET_DELETED); - return true; } @@ -481,12 +225,11 @@ bool ticket_commandscript::HandleTicketCommentCommand(ChatHandler* handler, char return true; } - SQLTransaction trans = SQLTransaction(nullptr); ticket->SetComment(comment); - ticket->SaveToDB(trans); + ticket->SaveToDB(); sSupportMgr->UpdateLastChange(); - std::string msg = ticket->FormatViewMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL, NULL); + std::string msg = ticket->FormatViewMessageString(*handler, NULL, ticket->GetAssignedToName().c_str(), NULL, NULL); msg += handler->PGetParseString(LANG_COMMAND_TICKETLISTADDCOMMENT, player ? player->GetName().c_str() : "Console", comment); handler->SendGlobalGMSysMessage(msg.c_str()); @@ -527,7 +270,7 @@ bool ticket_commandscript::HandleTicketDeleteByIdCommand(ChatHandler* handler, c return true; } - std::string msg = ticket->FormatViewMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL); + std::string msg = ticket->FormatViewMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console"); handler->SendGlobalGMSysMessage(msg.c_str()); sSupportMgr->RemoveTicket<T>(ticket->GetId()); @@ -535,37 +278,6 @@ bool ticket_commandscript::HandleTicketDeleteByIdCommand(ChatHandler* handler, c return true; } -template<> -bool ticket_commandscript::HandleTicketDeleteByIdCommand<GmTicket>(ChatHandler* handler, char const* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - if (!ticket->IsClosed()) - { - handler->SendSysMessage(LANG_COMMAND_TICKETCLOSEFIRST); - return true; - } - - std::string msg = ticket->FormatViewMessageString(*handler, NULL, NULL, NULL, handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL); - handler->SendGlobalGMSysMessage(msg.c_str()); - - sSupportMgr->RemoveTicket<GmTicket>(ticket->GetId()); - sSupportMgr->UpdateLastChange(); - - if (Player* player = ticket->GetPlayer()) - sSupportMgr->SendGmTicketUpdate(player->GetSession(), GMTICKET_RESPONSE_TICKET_DELETED); - - return true; -} template<typename T> bool ticket_commandscript::HandleTicketResetCommand(ChatHandler* handler, char const* /*args*/) @@ -625,67 +337,10 @@ bool ticket_commandscript::HandleTicketUnAssignCommand(ChatHandler* handler, cha } std::string assignedTo = ticket->GetAssignedToName(); // copy assignedto name because we need it after the ticket has been unnassigned - SQLTransaction trans = SQLTransaction(NULL); ticket->SetUnassigned(); - ticket->SaveToDB(trans); + ticket->SaveToDB(); - std::string msg = ticket->FormatViewMessageString(*handler, NULL, assignedTo.c_str(), handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL, NULL); - handler->SendGlobalGMSysMessage(msg.c_str()); - - return true; -} - -template<> -bool ticket_commandscript::HandleTicketUnAssignCommand<GmTicket>(ChatHandler* handler, char const* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket || ticket->IsClosed()) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - // Ticket must be assigned - if (!ticket->IsAssigned()) - { - handler->PSendSysMessage(LANG_COMMAND_TICKETNOTASSIGNED, ticket->GetId()); - return true; - } - - // Get security level of player, whom this ticket is assigned to - uint32 security = SEC_PLAYER; - Player* assignedPlayer = ticket->GetAssignedPlayer(); - if (assignedPlayer) - security = assignedPlayer->GetSession()->GetSecurity(); - else - { - ObjectGuid guid = ticket->GetAssignedToGUID(); - uint32 accountId = ObjectMgr::GetPlayerAccountIdByGUID(guid); - security = AccountMgr::GetSecurity(accountId, realmHandle.Index); - } - - // Check security - //! If no m_session present it means we're issuing this command from the console - uint32 mySecurity = handler->GetSession() ? handler->GetSession()->GetSecurity() : SEC_CONSOLE; - if (security > mySecurity) - { - handler->SendSysMessage(LANG_COMMAND_TICKETUNASSIGNSECURITY); - return true; - } - - std::string assignedTo = ticket->GetAssignedToName(); // copy assignedto name because we need it after the ticket has been unnassigned - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetUnassigned(); - ticket->SaveToDB(trans); - sSupportMgr->UpdateLastChange(); - - if (Player* player = ticket->GetPlayer()) - sSupportMgr->SendGmTicket(player->GetSession(), ticket); - - std::string msg = ticket->FormatViewMessageString(*handler, NULL, assignedTo.c_str(), handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL, NULL); + std::string msg = ticket->FormatViewMessageString(*handler, NULL, assignedTo.c_str(), handler->GetSession() ? handler->GetSession()->GetPlayer()->GetName().c_str() : "Console", NULL); handler->SendGlobalGMSysMessage(msg.c_str()); return true; @@ -709,31 +364,6 @@ bool ticket_commandscript::HandleTicketGetByIdCommand(ChatHandler* handler, char return true; } -template<> -bool ticket_commandscript::HandleTicketGetByIdCommand<GmTicket>(ChatHandler* handler, char const* args) -{ - if (!*args) - return false; - - uint32 ticketId = atoi(args); - GmTicket* ticket = sSupportMgr->GetTicket<GmTicket>(ticketId); - if (!ticket || ticket->IsClosed() || ticket->IsCompleted()) - { - handler->SendSysMessage(LANG_COMMAND_TICKETNOTEXIST); - return true; - } - - SQLTransaction trans = SQLTransaction(NULL); - ticket->SetViewed(); - ticket->SaveToDB(trans); - - if (Player* player = ticket->GetPlayer()) - sSupportMgr->SendGmTicket(player->GetSession(), ticket); - - handler->SendSysMessage(ticket->FormatViewMessageString(*handler, true).c_str()); - return true; -} - ChatCommand* ticket_commandscript::GetCommands() const { static ChatCommand ticketBugCommandTable[] = @@ -775,39 +405,18 @@ ChatCommand* ticket_commandscript::GetCommands() const static ChatCommand ticketResetCommandTable[] = { { "all", rbac::RBAC_PERM_COMMAND_TICKET_RESET_ALL, true, &HandleTicketResetAllCommand, "", NULL }, - { "gm", rbac::RBAC_PERM_COMMAND_TICKET_RESET_GM, true, &HandleTicketResetCommand<GmTicket>, "", NULL }, { "bug", rbac::RBAC_PERM_COMMAND_TICKET_RESET_BUG, true, &HandleTicketResetCommand<BugTicket>, "", NULL }, { "complaint", rbac::RBAC_PERM_COMMAND_TICKET_RESET_COMPLAINT, true, &HandleTicketResetCommand<ComplaintTicket>, "", NULL }, { "suggestion", rbac::RBAC_PERM_COMMAND_TICKET_RESET_SUGGESTION, true, &HandleTicketResetCommand<SuggestionTicket>, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; - static ChatCommand ticketResponseCommandTable[] = - { - { "append", rbac::RBAC_PERM_COMMAND_TICKET_RESPONSE_APPEND, true, &HandleGMTicketResponseAppendCommand, "", NULL }, - { "appendln", rbac::RBAC_PERM_COMMAND_TICKET_RESPONSE_APPENDLN, true, &HandleGMTicketResponseAppendLnCommand, "", NULL }, - { NULL, 0, false, NULL, "", NULL } - }; static ChatCommand ticketCommandTable[] = { - { "assign", rbac::RBAC_PERM_COMMAND_TICKET_ASSIGN, true, &HandleTicketAssignToCommand<GmTicket>, "", NULL }, { "bug", rbac::RBAC_PERM_COMMAND_TICKET_BUG, true, NULL, "", ticketBugCommandTable }, - { "close", rbac::RBAC_PERM_COMMAND_TICKET_CLOSE, true, &HandleTicketCloseByIdCommand<GmTicket>, "", NULL }, - { "closedlist", rbac::RBAC_PERM_COMMAND_TICKET_CLOSEDLIST, true, &HandleTicketListClosedCommand<GmTicket>, "", NULL }, - { "comment", rbac::RBAC_PERM_COMMAND_TICKET_COMMENT, true, &HandleTicketCommentCommand<GmTicket>, "", NULL }, { "complaint", rbac::RBAC_PERM_COMMAND_TICKET_COMPLAINT, true, NULL, "", ticketComplaintCommandTable }, - { "complete", rbac::RBAC_PERM_COMMAND_TICKET_COMPLETE, true, &HandleGMTicketCompleteCommand, "", NULL }, - { "delete", rbac::RBAC_PERM_COMMAND_TICKET_DELETE, true, &HandleTicketDeleteByIdCommand<GmTicket>, "", NULL }, - { "escalate", rbac::RBAC_PERM_COMMAND_TICKET_ESCALATE, true, &HandleGMTicketEscalateCommand, "", NULL }, - { "escalatedlist", rbac::RBAC_PERM_COMMAND_TICKET_ESCALATEDLIST, true, &HandleGMTicketListEscalatedCommand, "", NULL }, - { "list", rbac::RBAC_PERM_COMMAND_TICKET_LIST, true, &HandleTicketListCommand<GmTicket>, "", NULL }, - { "onlinelist", rbac::RBAC_PERM_COMMAND_TICKET_ONLINELIST, true, &HandleGMTicketListOnlineCommand, "", NULL }, { "reset", rbac::RBAC_PERM_COMMAND_TICKET_RESET, true, NULL, "", ticketResetCommandTable }, - { "response", rbac::RBAC_PERM_COMMAND_TICKET_RESPONSE, true, NULL, "", ticketResponseCommandTable }, { "suggestion", rbac::RBAC_PERM_COMMAND_TICKET_SUGGESTION, true, NULL, "", ticketSuggestionCommandTable }, { "togglesystem", rbac::RBAC_PERM_COMMAND_TICKET_TOGGLESYSTEM, true, &HandleToggleGMTicketSystem, "", NULL }, - { "unassign", rbac::RBAC_PERM_COMMAND_TICKET_UNASSIGN, true, &HandleTicketUnAssignCommand<GmTicket>, "", NULL }, - { "viewid", rbac::RBAC_PERM_COMMAND_TICKET_VIEWID, true, &HandleTicketGetByIdCommand<GmTicket>, "", NULL }, - { "viewname", rbac::RBAC_PERM_COMMAND_TICKET_VIEWNAME, true, &HandleGMTicketGetByNameCommand, "", NULL }, { NULL, 0, false, NULL, "", NULL } }; static ChatCommand commandTable[] = diff --git a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp index 1275319d37a..9fd81b6a0f6 100644 --- a/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp +++ b/src/server/scripts/EasternKingdoms/BlackrockMountain/MoltenCore/boss_ragnaros.cpp @@ -225,7 +225,7 @@ class boss_ragnaros : public CreatureScript events.ScheduleEvent(EVENT_ELEMENTAL_FIRE, urand(10000, 14000)); break; case EVENT_MAGMA_BLAST: - if (me->IsWithinMeleeRange(me->GetVictim())) + if (!me->IsWithinMeleeRange(me->GetVictim())) { DoCastVictim(SPELL_MAGMA_BLAST); if (!_hasYelledMagmaBurst) diff --git a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp index 3df07562d50..0a46b03a6b3 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter5.cpp @@ -587,7 +587,7 @@ public: JumpToNextStep(2000); break; case 8: - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP)); + me->SetVirtualItem(0, uint32(EQUIP_UNEQUIP)); if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) me->CastSpell(temp, SPELL_ASHBRINGER, true); Talk(EMOTE_LIGHT_OF_DAWN14); @@ -1107,7 +1107,7 @@ public: if (Creature* temp = ObjectAccessor::GetCreature(*me, uiTirionGUID)) { temp->SetStandState(UNIT_STAND_STATE_STAND); - temp->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_HIGHLORD_TIRION_FORDRING)); + temp->SetVirtualItem(0, uint32(EQUIP_HIGHLORD_TIRION_FORDRING)); temp->CastSpell(temp, SPELL_REBIRTH_OF_THE_ASHBRINGER, false); } JumpToNextStep(1000); @@ -1399,7 +1399,7 @@ public: if (Creature* temp = me->SummonCreature(NPC_HIGHLORD_TIRION_FORDRING, LightofDawnLoc[0].GetPositionWithOffset({ 0.0f, 0.0f, 0.0f, 1.528f }), TEMPSUMMON_TIMED_OR_CORPSE_DESPAWN, 600000)) { temp->setFaction(me->getFaction()); - temp->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(EQUIP_UNEQUIP)); + temp->SetVirtualItem(0, uint32(EQUIP_UNEQUIP)); temp->AI()->Talk(SAY_LIGHT_OF_DAWN25); uiTirionGUID = temp->GetGUID(); } diff --git a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp index 8f780d1e2c3..4d4175d5022 100644 --- a/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp +++ b/src/server/scripts/EasternKingdoms/Scholomance/boss_kirtonos_the_herald.cpp @@ -176,7 +176,7 @@ class boss_kirtonos_the_herald : public CreatureScript break; case INTRO_5: me->HandleEmoteCommand(EMOTE_ONESHOT_ROAR); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); + me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE|UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); events.ScheduleEvent(INTRO_6, 5000); @@ -231,13 +231,13 @@ class boss_kirtonos_the_herald : public CreatureScript if (me->HasAura(SPELL_KIRTONOS_TRANSFORM)) { me->RemoveAura(SPELL_KIRTONOS_TRANSFORM); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(0)); + me->SetVirtualItem(0, uint32(0)); me->SetCanFly(false); } else { DoCast(me, SPELL_KIRTONOS_TRANSFORM); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 0, uint32(WEAPON_KIRTONOS_STAFF)); + me->SetVirtualItem(0, uint32(WEAPON_KIRTONOS_STAFF)); me->SetCanFly(true); } events.ScheduleEvent(EVENT_KIRTONOS_TRANSFORM, urand(16000, 18000)); diff --git a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp index 5af9fd8c800..0048920518b 100644 --- a/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp +++ b/src/server/scripts/EasternKingdoms/ZulAman/zulaman.cpp @@ -146,14 +146,14 @@ class npc_voljin_zulaman : public CreatureScript DoCast(me, SPELL_BANGING_THE_GONG); if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG))) strangeGong->RemoveFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(ITEM_VIRTUAL_ITEM)); + me->SetVirtualItem(0, uint32(ITEM_VIRTUAL_ITEM)); break; case EVENT_START_DOOR_OPENING_1: me->RemoveAura(SPELL_BANGING_THE_GONG); _events.ScheduleEvent(EVENT_START_DOOR_OPENING_2, 500); break; case EVENT_START_DOOR_OPENING_2: - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, uint32(0)); + me->SetVirtualItem(0, uint32(0)); if (GameObject* strangeGong = ObjectAccessor::GetGameObject(*me, _instance->GetGuidData(DATA_STRANGE_GONG))) strangeGong->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); _events.ScheduleEvent(EVENT_START_DOOR_OPENING_3, 500); diff --git a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp index 780cf6646a3..2505cef9d8c 100644 --- a/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp +++ b/src/server/scripts/Kalimdor/CavernsOfTime/EscapeFromDurnholdeKeep/old_hillsbrad.cpp @@ -302,10 +302,10 @@ public: break; case 9: Talk(SAY_TH_ARMORY); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, THRALL_WEAPON_ITEM); + me->SetVirtualItem(0, THRALL_WEAPON_ITEM); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO, THRALL_WEAPON_INFO); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+1, 781); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, THRALL_SHIELD_ITEM); + me->SetVirtualItem(1, THRALL_SHIELD_ITEM); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+2, THRALL_SHIELD_INFO); //me->SetUInt32Value(UNIT_VIRTUAL_ITEM_INFO+3, 1038); break; @@ -466,8 +466,8 @@ public: { DoUnmount(); HadMount = false; - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); + me->SetVirtualItem(0, 0); + me->SetVirtualItem(1, 0); me->SetDisplayId(THRALL_MODEL_UNEQUIPPED); } if (HasEscortState(STATE_ESCORT_ESCORTING)) diff --git a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp index 46e831b0f83..7bd197774bc 100644 --- a/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp +++ b/src/server/scripts/Kalimdor/ZulFarrak/instance_zulfarrak.cpp @@ -111,6 +111,7 @@ public: instance_zulfarrak_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); + GahzRillaEncounter = NOT_STARTED; PyramidPhase = 0; major_wave_Timer = 0; minor_wave_Timer = 0; diff --git a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp index d261b7a623a..a4a0b46ceb7 100644 --- a/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp +++ b/src/server/scripts/Northrend/ChamberOfAspects/RubySanctum/boss_halion.cpp @@ -1125,7 +1125,7 @@ class npc_meteor_strike_flame : public CreatureScript SetCombatMovement(false); } - void SetGUID(ObjectGuid guid, int32 /*id = 0 */) + void SetGUID(ObjectGuid guid, int32 /*id = 0 */) override { _rootOwnerGuid = guid; } diff --git a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp index 39c9fbe37a6..c56a49cb92c 100644 --- a/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp +++ b/src/server/scripts/Northrend/CrusadersColiseum/TrialOfTheCrusader/boss_northrend_beasts.cpp @@ -741,7 +741,7 @@ class boss_dreadscale : public CreatureScript switch (pointId) { case 0: - instance->DoUseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR)); + instance->DoCloseDoorOrButton(instance->GetGuidData(GO_MAIN_GATE_DOOR)); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); me->SetReactState(REACT_AGGRESSIVE); me->SetInCombatWithZone(); diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp index faa448ef539..51756834e77 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_professor_putricide.cpp @@ -1059,8 +1059,8 @@ class spell_putricide_ooze_eruption_searcher : public SpellScriptLoader { if (GetHitUnit()->HasAura(SPELL_VOLATILE_OOZE_ADHESIVE)) { - GetCaster()->CastSpell(GetHitUnit(), SPELL_OOZE_ERUPTION, true); GetHitUnit()->RemoveAurasDueToSpell(SPELL_VOLATILE_OOZE_ADHESIVE, GetCaster()->GetGUID(), 0, AURA_REMOVE_BY_ENEMY_SPELL); + GetCaster()->CastSpell(GetHitUnit(), SPELL_OOZE_ERUPTION, true); } } diff --git a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp index b939c40cabb..899dcc79a06 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/boss_malygos.cpp @@ -1530,15 +1530,14 @@ public: { npc_wyrmrest_skytalonAI(Creature* creature) : VehicleAI(creature) { - _summoner = NULL; } void IsSummonedBy(Unit* summoner) override { - _summoner = NULL; + _summoner.Clear(); if (Player* player = summoner->ToPlayer()) { - _summoner = player; + _summoner = player->GetGUID(); _events.ScheduleEvent(EVENT_CAST_RIDE_SPELL, 2*IN_MILLISECONDS); } } @@ -1553,7 +1552,8 @@ public: switch (eventId) { case EVENT_CAST_RIDE_SPELL: - me->CastSpell(_summoner, SPELL_RIDE_RED_DRAGON_TRIGGERED, true); + if (Player* player = ObjectAccessor::GetPlayer(*me, _summoner)) + me->CastSpell(player, SPELL_RIDE_RED_DRAGON_TRIGGERED, true); break; } } @@ -1575,7 +1575,7 @@ public: } private: - Player* _summoner; + ObjectGuid _summoner; EventMap _events; }; diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp index 134783ccf07..6a1ff6d4eea 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/boss_yogg_saron.cpp @@ -903,17 +903,15 @@ class boss_yogg_saron : public CreatureScript DoCast(me, SPELL_KNOCK_AWAY); me->ResetLootMode(); - switch (_instance->GetData(DATA_KEEPERS_COUNT)) - { - case 0: - me->AddLootMode(LOOT_MODE_HARD_MODE_4); - case 1: - me->AddLootMode(LOOT_MODE_HARD_MODE_3); - case 2: - me->AddLootMode(LOOT_MODE_HARD_MODE_2); - case 3: - me->AddLootMode(LOOT_MODE_HARD_MODE_1); - } + uint32 keepersCount = _instance->GetData(DATA_KEEPERS_COUNT); + if (keepersCount == 0) + me->AddLootMode(LOOT_MODE_HARD_MODE_4); + if (keepersCount <= 1) + me->AddLootMode(LOOT_MODE_HARD_MODE_3); + if (keepersCount <= 2) + me->AddLootMode(LOOT_MODE_HARD_MODE_2); + if (keepersCount <= 3) + me->AddLootMode(LOOT_MODE_HARD_MODE_1); } void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index ea50969ecb8..ef9ad806c89 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -794,9 +794,11 @@ public: trigger->CastSpell(trigger, spellInfoLightning, true, 0, 0, trigger->GetGUID()); // Kill all mobs registered with SetGuidData(ADD_TRASH_MOB) - for (GuidSet::const_iterator itr = trashMobs.begin(); itr != trashMobs.end(); ++itr) + for (GuidSet::const_iterator itr = trashMobs.begin(); itr != trashMobs.end();) { Creature* creature = instance->GetCreature(*itr); + // Increment the iterator before killing the creature because the kill will remove itr from trashMobs + ++itr; if (creature && creature->IsAlive()) trigger->Kill(creature); } diff --git a/src/server/scripts/Northrend/isle_of_conquest.cpp b/src/server/scripts/Northrend/isle_of_conquest.cpp index 7b851055f17..204c92c1789 100644 --- a/src/server/scripts/Northrend/isle_of_conquest.cpp +++ b/src/server/scripts/Northrend/isle_of_conquest.cpp @@ -161,19 +161,6 @@ class spell_ioc_gunship_portal : public SpellScriptLoader * Position: X: 7.305609 Y: -0.095246 Z: 34.51022 O: 0 */ caster->TeleportTo(GetHitCreature()->GetWorldLocation(), TELE_TO_NOT_LEAVE_TRANSPORT); - /* - * HACK: This aura should be added by 20212 and 20213 but can't find any SMSG_SPELL_GO. Could't find their position. - * ServerToClient: SMSG_AURA_UPDATE (0x0072) - * [0] CasterGUID: Full: xxxxx Type: Unit Entry: 20212 Low: xxx - * [0] Flags: None (0) - * [0] Caster Level: 60 - * [0] Spell ID: 66656 - * [0] Charges: 0 - * [0] Effect Mask: 1 - * [0] Slot: 37 - * Guid: Full: xxxxx Type: Player2 Low: xxxxx - */ - caster->AddAura(SPELL_PARACHUTE, caster); } void Register() override diff --git a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp index 662bad46162..263fd8340b9 100644 --- a/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp +++ b/src/server/scripts/Outland/Auchindoun/AuchenaiCrypts/boss_shirrak_the_dead_watcher.cpp @@ -113,7 +113,7 @@ public: Map::PlayerList const &PlayerList = map->GetPlayers(); for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) if (Player* i_pl = i->GetSource()) - if (i_pl->IsAlive() && (dist = i_pl->IsWithinDist(me, 45))) + if (i_pl->IsAlive() && (dist = i_pl->GetDistance(me)) < 45) { i_pl->RemoveAurasDueToSpell(SPELL_INHIBITMAGIC); me->AddAura(SPELL_INHIBITMAGIC, i_pl); diff --git a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp index ab97771374f..0227b60116d 100644 --- a/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp +++ b/src/server/scripts/Outland/BlackTemple/boss_illidan.cpp @@ -587,7 +587,7 @@ public: { if (spell->Id == SPELL_GLAIVE_RETURNS) // Re-equip our warblades! { - if (!me->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID)) + if (!me->GetVirtualItemId(0)) SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); else SetEquipmentSlots(false, EQUIP_UNEQUIP, EQUIP_ID_OFF_HAND, EQUIP_NO_CHANGE); @@ -1175,7 +1175,7 @@ public: { Initialize(); SetEquipmentSlots(false, EQUIP_ID_MAIN_HAND_MAIEV, EQUIP_UNEQUIP, EQUIP_NO_CHANGE); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, 45738); + me->SetVirtualItem(2, 45738); } void EnterCombat(Unit* /*who*/) override { } diff --git a/src/server/scripts/Outland/CMakeLists.txt b/src/server/scripts/Outland/CMakeLists.txt index 24658dbc21f..42621b76941 100644 --- a/src/server/scripts/Outland/CMakeLists.txt +++ b/src/server/scripts/Outland/CMakeLists.txt @@ -27,6 +27,7 @@ set(scripts_STAT_SRCS Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp Outland/HellfireCitadel/ShatteredHalls/boss_nethekurse.cpp + Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp Outland/HellfireCitadel/ShatteredHalls/boss_warbringer_omrogg.cpp Outland/CoilfangReservoir/SteamVault/boss_mekgineer_steamrigger.cpp diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index f30417534b4..72efbb23fda 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -246,8 +246,8 @@ public: me->SetCanDualWield(true); me->SetSpeed(MOVE_RUN, 2.0f, true); me->SetDisplayId(MODEL_NIGHTELF); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); + me->SetVirtualItem(0, 0); + me->SetVirtualItem(1, 0); DoCast(me, SPELL_DUAL_WIELD, true); me->SetCorpseDelay(1000*60*60); instance->SetData(DATA_LEOTHERASTHEBLINDEVENT, NOT_STARTED); @@ -345,8 +345,8 @@ public: me->SetDisplayId(MODEL_DEMON); // and removing weapons - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); + me->SetVirtualItem(0, 0); + me->SetVirtualItem(1, 0); } } @@ -490,8 +490,8 @@ public: me->RemoveAurasDueToSpell(SPELL_WHIRLWIND); me->SetDisplayId(MODEL_DEMON); Talk(SAY_SWITCH_TO_DEMON); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID , 0); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); + me->SetVirtualItem(0, 0); + me->SetVirtualItem(1, 0); DemonForm = true; NeedThreatReset = true; SwitchToDemon_Timer = 45000; diff --git a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp index 88dbeff09f5..16ebff7d402 100644 --- a/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp +++ b/src/server/scripts/Outland/GruulsLair/boss_high_king_maulgar.cpp @@ -169,8 +169,8 @@ public: Talk(SAY_ENRAGE); DoCast(me, SPELL_DUAL_WIELD, true); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, 0); - me->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID+1, 0); + me->SetVirtualItem(0, 0); + me->SetVirtualItem(1, 0); } if (Phase2) diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp index 21ed710f4d8..7f2e08b39ca 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/boss_warchief_kargath_bladefist.cpp @@ -87,11 +87,11 @@ class boss_warchief_kargath_bladefist : public CreatureScript resetcheck_timer = 5000; } - void SetData(uint32 type, uint32 data) override + void DoAction(int32 action) override { - if (type == 1) + if (action == ACTION_EXECUTIONER_TAUNT) { - switch (data) + switch (instance->GetData(DATA_TEAM_IN_INSTANCE)) { case ALLIANCE: Talk(SAY_CALL_EXECUTIONER_A); diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp index 49d4c9497ec..a781861d47f 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/instance_shattered_halls.cpp @@ -32,20 +32,11 @@ EndScriptData */ #include "ScriptedCreature.h" #include "SpellScript.h" -enum Spells -{ - SPELL_CLEAVE = 15284, - - SPELL_EXECUTE_1 = 39288, - SPELL_EXECUTE_2, - SPELL_EXECUTE_3 -}; - DoorData const doorData[] = { - {GO_GRAND_WARLOCK_CHAMBER_DOOR_1, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE, BOUNDARY_S }, - {GO_GRAND_WARLOCK_CHAMBER_DOOR_2, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE, BOUNDARY_N }, - {0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE} + { GO_GRAND_WARLOCK_CHAMBER_DOOR_1, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { GO_GRAND_WARLOCK_CHAMBER_DOOR_2, DATA_NETHEKURSE, DOOR_TYPE_PASSAGE, BOUNDARY_NONE }, + { 0, 0, DOOR_TYPE_ROOM, BOUNDARY_NONE } }; class instance_shattered_halls : public InstanceMapScript @@ -77,9 +68,7 @@ class instance_shattered_halls : public InstanceMapScript if (!_team) _team = player->GetTeam(); - player->RemoveAurasDueToSpell(SPELL_EXECUTE_1); - player->RemoveAurasDueToSpell(SPELL_EXECUTE_2); - player->RemoveAurasDueToSpell(SPELL_EXECUTE_3); + player->CastSpell(player, SPELL_REMOVE_KARGATH_EXECUTIONER, true); if (!executionTimer || executionerGUID.IsEmpty()) return; @@ -87,13 +76,13 @@ class instance_shattered_halls : public InstanceMapScript switch (executed) { case 0: - ex = player->AddAura(SPELL_EXECUTE_1, player); + ex = player->AddAura(SPELL_KARGATH_EXECUTIONER_1, player); break; case 1: - ex = player->AddAura(SPELL_EXECUTE_2, player); + ex = player->AddAura(SPELL_KARGATH_EXECUTIONER_2, player); break; case 2: - ex = player->AddAura(SPELL_EXECUTE_3, player); + ex = player->AddAura(SPELL_KARGATH_EXECUTIONER_3, player); break; default: break; @@ -151,10 +140,22 @@ class instance_shattered_halls : public InstanceMapScript break; case NPC_SHATTERED_EXECUTIONER: executionTimer = 55 * MINUTE * IN_MILLISECONDS; - DoCastSpellOnPlayers(SPELL_EXECUTE_1); + DoCastSpellOnPlayers(SPELL_KARGATH_EXECUTIONER_1); executionerGUID = creature->GetGUID(); SaveToDB(); break; + case NPC_CAPTAIN_ALINA: + case NPC_CAPTAIN_BONESHATTER: + victimsGUID[0] = creature->GetGUID(); + break; + case NPC_ALLIANCE_VICTIM_1: + case NPC_HORDE_VICTIM_1: + victimsGUID[1] = creature->GetGUID(); + break; + case NPC_ALLIANCE_VICTIM_2: + case NPC_HORDE_VICTIM_2: + victimsGUID[2] = creature->GetGUID(); + break; } } @@ -168,16 +169,14 @@ class instance_shattered_halls : public InstanceMapScript case DATA_SHATTERED_EXECUTIONER: if (state == DONE) { - DoRemoveAurasDueToSpellOnPlayers(SPELL_EXECUTE_1); - DoRemoveAurasDueToSpellOnPlayers(SPELL_EXECUTE_2); - DoRemoveAurasDueToSpellOnPlayers(SPELL_EXECUTE_3); + DoCastSpellOnPlayers(SPELL_REMOVE_KARGATH_EXECUTIONER); executionTimer = 0; SaveToDB(); } break; case DATA_KARGATH: if (Creature* executioner = instance->GetCreature(executionerGUID)) - executioner->AI()->Reset(); + executioner->AI()->Reset(); // trigger removal of IMMUNE_TO_PC flag break; case DATA_OMROGG: break; @@ -191,16 +190,16 @@ class instance_shattered_halls : public InstanceMapScript { case NPC_GRAND_WARLOCK_NETHEKURSE: return nethekurseGUID; - break; case NPC_KARGATH_BLADEFIST: return kargathGUID; - break; case NPC_SHATTERED_EXECUTIONER: return executionerGUID; - break; + case DATA_FIRST_PRISONER: + case DATA_SECOND_PRISONER: + case DATA_THIRD_PRISONER: + return victimsGUID[data - DATA_FIRST_PRISONER]; default: return ObjectGuid::Empty; - break; } } @@ -253,13 +252,10 @@ class instance_shattered_halls : public InstanceMapScript { case DATA_PRISONERS_EXECUTED: return executed; - break; case DATA_TEAM_IN_INSTANCE: return _team; - break; default: return 0; - break; } } @@ -269,27 +265,25 @@ class instance_shattered_halls : public InstanceMapScript return; if (executionTimer <= diff) - { + { + DoCastSpellOnPlayers(SPELL_REMOVE_KARGATH_EXECUTIONER); switch (++executed) { case 1: - DoRemoveAurasDueToSpellOnPlayers(SPELL_EXECUTE_1); - DoCastSpellOnPlayers(SPELL_EXECUTE_2); + DoCastSpellOnPlayers(SPELL_KARGATH_EXECUTIONER_2); executionTimer = 10 * MINUTE * IN_MILLISECONDS; break; case 2: - DoRemoveAurasDueToSpellOnPlayers(SPELL_EXECUTE_2); - DoCastSpellOnPlayers(SPELL_EXECUTE_3); + DoCastSpellOnPlayers(SPELL_KARGATH_EXECUTIONER_3); executionTimer = 15 * MINUTE * IN_MILLISECONDS; break; default: - DoRemoveAurasDueToSpellOnPlayers(SPELL_EXECUTE_3); executionTimer = 0; break; } if (Creature* executioner = instance->GetCreature(executionerGUID)) - executioner->AI()->SetData(1, executed); + executioner->AI()->SetData(DATA_PRISONERS_EXECUTED, executed); SaveToDB(); } @@ -297,10 +291,11 @@ class instance_shattered_halls : public InstanceMapScript executionTimer -= diff; } - protected: + private: ObjectGuid nethekurseGUID; ObjectGuid kargathGUID; ObjectGuid executionerGUID; + ObjectGuid victimsGUID[3]; uint8 executed; uint32 executionTimer; @@ -308,191 +303,8 @@ class instance_shattered_halls : public InstanceMapScript }; }; -class at_nethekurse_exit : public AreaTriggerScript -{ - public: - at_nethekurse_exit() : AreaTriggerScript("at_nethekurse_exit") { }; - - bool OnTrigger(Player* player, AreaTriggerEntry const*, bool /* entered */) override - { - if (InstanceScript* is = player->GetInstanceScript()) - { - if (is->instance->IsHeroic()) - { - Creature* executioner = nullptr; - - is->instance->LoadGrid(Executioner.GetPositionX(), Executioner.GetPositionY()); - if (Creature* kargath = ObjectAccessor::GetCreature(*player, is->GetGuidData(NPC_KARGATH_BLADEFIST))) - { - if (is->GetGuidData(NPC_SHATTERED_EXECUTIONER).IsEmpty()) - { - executioner = kargath->SummonCreature(NPC_SHATTERED_EXECUTIONER, Executioner); - kargath->AI()->SetData(1, is->GetData(DATA_TEAM_IN_INSTANCE)); - } - } - - if (executioner) - for (uint8 i = 0; i < VictimCount; ++i) - executioner->SummonCreature(executionerVictims[i](is->GetData(DATA_TEAM_IN_INSTANCE)), executionerVictims[i].GetPos()); - } - } - - return false; - } -}; - -class boss_shattered_executioner : public CreatureScript -{ - public: - boss_shattered_executioner() : CreatureScript("boss_shattered_executioner") { } - - struct boss_shattered_executionerAI : public BossAI - { - boss_shattered_executionerAI(Creature* creature) : BossAI(creature, DATA_SHATTERED_EXECUTIONER) - { - Initialize(); - }; - - void Initialize() - { - cleaveTimer = 500; - me->ResetLootMode(); - switch (instance->GetData(DATA_PRISONERS_EXECUTED)) - { - case 0: - me->AddLootMode(LOOT_MODE_HARD_MODE_3); - case 1: - me->AddLootMode(LOOT_MODE_HARD_MODE_2); - case 2: - me->AddLootMode(LOOT_MODE_HARD_MODE_1); - default: - break; - } - } - - void Reset() override - { - _Reset(); - if (instance->GetBossState(DATA_KARGATH) == DONE) - me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - else - me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); - - Initialize(); - } - - void JustSummoned(Creature*) override { } - - void JustDied(Unit*) override - { - _JustDied(); - Map::PlayerList const &players = instance->instance->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - Player* pl = itr->GetSource(); - uint32 qId = pl->GetTeam() == ALLIANCE ? QUEST_IMPRISONED_A : QUEST_IMPRISONED_H; - if (pl->GetQuestStatus(qId) != QUEST_STATUS_NONE && pl->GetQuestStatus(qId) != QUEST_STATUS_FAILED) - pl->CompleteQuest(qId); - } - } - - void SetData(uint32 type, uint32 data) override - { - if (type == 1) - { - uint32 entry = executionerVictims[data - 1](instance->GetData(DATA_TEAM_IN_INSTANCE)); - if (Creature* victim = me->FindNearestCreature(entry, 30.0f, true)) - me->Kill(victim); - - if (data == 1) - { - Map::PlayerList const &players = instance->instance->GetPlayers(); - for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) - { - Player* pl = itr->GetSource(); - uint32 qId = pl->GetTeam() == ALLIANCE ? QUEST_IMPRISONED_A : QUEST_IMPRISONED_H; - if (pl->GetQuestStatus(qId) == QUEST_STATUS_INCOMPLETE) - pl->FailQuest(qId); - } - } - - switch (data) - { - case 3: - me->RemoveLootMode(LOOT_MODE_HARD_MODE_1); - case 2: - me->RemoveLootMode(LOOT_MODE_HARD_MODE_2); - case 1: - me->RemoveLootMode(LOOT_MODE_HARD_MODE_3); - default: - break; - } - } - } - - void UpdateAI(uint32 diff) override - { - if (!UpdateVictim()) - return; - - if (cleaveTimer <= diff) - { - DoCast(SPELL_CLEAVE); - cleaveTimer = urand(5000, 7000); - } - else - cleaveTimer -= diff; - - DoMeleeAttackIfReady(); - } - private: - uint32 cleaveTimer; - }; - - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_shattered_executionerAI>(creature); - } -}; - -class spell_kargath_executioner : public SpellScriptLoader -{ - public: - spell_kargath_executioner() : SpellScriptLoader("spell_kargath_executioner") { } - - class spell_kargath_executioner_AuraScript : public AuraScript - { - PrepareAuraScript(spell_kargath_executioner_AuraScript); - - bool AreaCheck(Unit* target) - { - if (target->GetMap()->GetId() != 540) - return false; - - return true; - } - - bool Load() override - { - return GetCaster()->GetTypeId() == TYPEID_PLAYER; - } - - void Register() override - { - DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_kargath_executioner_AuraScript::AreaCheck); - } - }; - - AuraScript* GetAuraScript() const override - { - return new spell_kargath_executioner_AuraScript(); - } -}; void AddSC_instance_shattered_halls() { new instance_shattered_halls(); - new at_nethekurse_exit(); - new boss_shattered_executioner(); - new spell_kargath_executioner(); } diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp new file mode 100644 index 00000000000..3986e50877f --- /dev/null +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp @@ -0,0 +1,255 @@ +/* + * 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 "SpellScript.h" +#include "SpellAuraEffects.h" +#include "InstanceScript.h" +#include "Player.h" +#include "SpellAuras.h" +#include "shattered_halls.h" + +class at_nethekurse_exit : public AreaTriggerScript +{ + public: + at_nethekurse_exit() : AreaTriggerScript("at_nethekurse_exit") { }; + + bool OnTrigger(Player* player, AreaTriggerEntry const*, bool /*entered*/) override + { + if (InstanceScript* is = player->GetInstanceScript()) + { + if (is->instance->IsHeroic()) + { + Creature* executioner = nullptr; + + is->instance->LoadGrid(Executioner.GetPositionX(), Executioner.GetPositionY()); + if (Creature* kargath = ObjectAccessor::GetCreature(*player, is->GetGuidData(NPC_KARGATH_BLADEFIST))) + { + if (is->GetGuidData(NPC_SHATTERED_EXECUTIONER).IsEmpty()) + { + executioner = kargath->SummonCreature(NPC_SHATTERED_EXECUTIONER, Executioner); + kargath->AI()->DoAction(ACTION_EXECUTIONER_TAUNT); + } + } + + if (executioner) + for (uint8 i = 0; i < VictimCount; ++i) + executioner->SummonCreature(executionerVictims[i](is->GetData(DATA_TEAM_IN_INSTANCE)), executionerVictims[i].GetPos()); + } + } + + return false; + } +}; + +enum Spells +{ + SPELL_CLEAVE = 15284 +}; + +class boss_shattered_executioner : public CreatureScript +{ + public: + boss_shattered_executioner() : CreatureScript("boss_shattered_executioner") { } + + struct boss_shattered_executionerAI : public BossAI + { + boss_shattered_executionerAI(Creature* creature) : BossAI(creature, DATA_SHATTERED_EXECUTIONER) + { + Initialize(); + }; + + void Initialize() + { + cleaveTimer = 500; + } + + void Reset() override + { + _Reset(); + + // _Reset() resets the loot mode, so we add them again, if any + uint32 prisonersExecuted = instance->GetData(DATA_PRISONERS_EXECUTED); + if (prisonersExecuted == 0) + me->AddLootMode(LOOT_MODE_HARD_MODE_3); + if (prisonersExecuted <= 1) + me->AddLootMode(LOOT_MODE_HARD_MODE_2); + if (prisonersExecuted <= 2) + me->AddLootMode(LOOT_MODE_HARD_MODE_1); + + if (instance->GetBossState(DATA_KARGATH) == DONE) + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + else + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC); + + Initialize(); + } + + void JustSummoned(Creature*) override { } // avoid despawn of prisoners on death/reset + + void JustDied(Unit*) override + { + _JustDied(); + + if (instance->GetData(DATA_PRISONERS_EXECUTED) > 0) + return; + + Map::PlayerList const &players = instance->instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + Player* pl = itr->GetSource(); + uint32 qId = pl->GetTeam() == ALLIANCE ? QUEST_IMPRISONED_A : QUEST_IMPRISONED_H; + if (pl->GetQuestStatus(qId) == QUEST_STATUS_INCOMPLETE) + pl->CompleteQuest(qId); + } + } + + void SetData(uint32 type, uint32 data) override + { + if (type == DATA_PRISONERS_EXECUTED && data <= 3) + { + if (Creature* victim = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_FIRST_PRISONER + data - 1))) + me->Kill(victim); + + if (data == 1) + { + Map::PlayerList const &players = instance->instance->GetPlayers(); + for (Map::PlayerList::const_iterator itr = players.begin(); itr != players.end(); ++itr) + { + Player* pl = itr->GetSource(); + uint32 qId = pl->GetTeam() == ALLIANCE ? QUEST_IMPRISONED_A : QUEST_IMPRISONED_H; + if (pl->GetQuestStatus(qId) == QUEST_STATUS_INCOMPLETE) + pl->FailQuest(qId); + } + } + + switch (data) + { + case 3: + me->RemoveLootMode(LOOT_MODE_HARD_MODE_1); + case 2: + me->RemoveLootMode(LOOT_MODE_HARD_MODE_2); + case 1: + me->RemoveLootMode(LOOT_MODE_HARD_MODE_3); + default: + break; + } + } + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + if (cleaveTimer <= diff) + { + DoCast(SPELL_CLEAVE); + cleaveTimer = urand(5000, 7000); + } + else + cleaveTimer -= diff; + + DoMeleeAttackIfReady(); + } + private: + uint32 cleaveTimer; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_shattered_executionerAI>(creature); + } +}; + +class spell_kargath_executioner : public SpellScriptLoader +{ + public: + spell_kargath_executioner() : SpellScriptLoader("spell_kargath_executioner") { } + + class spell_kargath_executioner_AuraScript : public AuraScript + { + PrepareAuraScript(spell_kargath_executioner_AuraScript); + + bool AreaCheck(Unit* target) + { + if (target->GetMap()->GetId() != 540) + return false; + + return true; + } + + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void Register() override + { + DoCheckAreaTarget += AuraCheckAreaTargetFn(spell_kargath_executioner_AuraScript::AreaCheck); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_kargath_executioner_AuraScript(); + } +}; + +class spell_remove_kargath_executioner : public SpellScriptLoader +{ + public: + spell_remove_kargath_executioner() : SpellScriptLoader("spell_remove_kargath_executioner") { } + + class spell_remove_kargath_executioner_SpellScript : public SpellScript + { + PrepareSpellScript(spell_remove_kargath_executioner_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* target = GetCaster(); + + target->RemoveAurasDueToSpell(SPELL_KARGATH_EXECUTIONER_1); + target->RemoveAurasDueToSpell(SPELL_KARGATH_EXECUTIONER_2); + target->RemoveAurasDueToSpell(SPELL_KARGATH_EXECUTIONER_3); + } + + bool Load() override + { + return GetCaster()->GetTypeId() == TYPEID_PLAYER; + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_remove_kargath_executioner_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_remove_kargath_executioner_SpellScript(); + } +}; + +void AddSC_shattered_halls() +{ + new at_nethekurse_exit(); + new boss_shattered_executioner(); + new spell_kargath_executioner(); + new spell_remove_kargath_executioner(); +} diff --git a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h index adc07bec2ff..894cc9c40a6 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.h @@ -33,7 +33,11 @@ enum DataTypes DATA_SHATTERED_EXECUTIONER = 3, DATA_PRISONERS_EXECUTED = 4, - DATA_TEAM_IN_INSTANCE = 5 + DATA_TEAM_IN_INSTANCE = 5, + + DATA_FIRST_PRISONER, + DATA_SECOND_PRISONER, + DATA_THIRD_PRISONER }; enum CreatureIds @@ -70,6 +74,20 @@ enum QuestIds QUEST_IMPRISONED_H = 9525 }; +enum InstanceSpells +{ + SPELL_KARGATH_EXECUTIONER_1 = 39288, + SPELL_KARGATH_EXECUTIONER_2 = 39289, + SPELL_KARGATH_EXECUTIONER_3 = 39290, + + SPELL_REMOVE_KARGATH_EXECUTIONER = 39291 +}; + +enum Actions +{ + ACTION_EXECUTIONER_TAUNT = 1 +}; + const Position Executioner = { 152.8524f, -83.63912f, 2.021005f, 0.06981317f }; struct FactionSpawnerHelper @@ -77,7 +95,7 @@ struct FactionSpawnerHelper FactionSpawnerHelper(uint32 allianceEntry, uint32 hordeEntry, const Position& pos) : _allianceNPC(allianceEntry), _hordeNPC(hordeEntry), _spawnPos(pos) { } inline uint32 operator()(uint32 teamID) const { return teamID == ALLIANCE ? _allianceNPC : _hordeNPC; } - inline const Position GetPos() const { return _spawnPos; } + inline Position const& GetPos() const { return _spawnPos; } private: const uint32 _allianceNPC; diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp index cc825afd3a0..48508aa4790 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_alar.cpp @@ -77,12 +77,11 @@ class boss_alar : public CreatureScript public: boss_alar() : CreatureScript("boss_alar") { } - struct boss_alarAI : public ScriptedAI + struct boss_alarAI : public BossAI { - boss_alarAI(Creature* creature) : ScriptedAI(creature) + boss_alarAI(Creature* creature) : BossAI(creature, DATA_ALAR) { Initialize(); - instance = creature->GetInstanceScript(); DefaultMoveSpeedRate = creature->GetSpeedRate(MOVE_RUN); DiveBomb_Timer = 0; MeltArmor_Timer = 0; @@ -105,8 +104,6 @@ class boss_alar : public CreatureScript cur_wp = 4; } - InstanceScript* instance; - WaitEventType WaitEvent; uint32 WaitTimer; @@ -129,9 +126,8 @@ class boss_alar : public CreatureScript void Reset() override { - instance->SetData(DATA_ALAREVENT, NOT_STARTED); - Initialize(); + _Reset(); me->SetDisplayId(me->GetNativeDisplayId()); me->SetSpeed(MOVE_RUN, DefaultMoveSpeedRate); @@ -145,18 +141,11 @@ class boss_alar : public CreatureScript void EnterCombat(Unit* /*who*/) override { - instance->SetData(DATA_ALAREVENT, IN_PROGRESS); - + _EnterCombat(); me->SetDisableGravity(true); // after enterevademode will be set walk movement - DoZoneInCombat(); me->setActive(true); } - void JustDied(Unit* /*killer*/) override - { - instance->SetData(DATA_ALAREVENT, DONE); - } - void JustSummoned(Creature* summon) override { if (summon->GetEntry() == CREATURE_EMBER_OF_ALAR) @@ -508,7 +497,7 @@ class npc_ember_of_alar : public CreatureScript DoCast(me, SPELL_EMBER_BLAST, true); me->SetDisplayId(11686); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - if (instance->GetData(DATA_ALAREVENT) == 2) + if (instance->GetBossState(DATA_ALAR) == IN_PROGRESS) { if (Unit* Alar = ObjectAccessor::GetUnit(*me, instance->GetGuidData(DATA_ALAR))) { diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp index b3324980bd4..c8e3e57ac3b 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_astromancer.cpp @@ -92,17 +92,13 @@ class boss_high_astromancer_solarian : public CreatureScript { public: - boss_high_astromancer_solarian() - : CreatureScript("boss_high_astromancer_solarian") - { - } + boss_high_astromancer_solarian() : CreatureScript("boss_high_astromancer_solarian") { } - struct boss_high_astromancer_solarianAI : public ScriptedAI + struct boss_high_astromancer_solarianAI : public BossAI { - boss_high_astromancer_solarianAI(Creature* creature) : ScriptedAI(creature), Summons(me) + boss_high_astromancer_solarianAI(Creature* creature) : BossAI(creature, DATA_HIGH_ASTROMANCER_SOLARIAN) { Initialize(); - instance = creature->GetInstanceScript(); defaultarmor = creature->GetArmor(); defaultsize = creature->GetObjectScale(); @@ -126,9 +122,6 @@ class boss_high_astromancer_solarian : public CreatureScript Phase = 1; } - InstanceScript* instance; - SummonList Summons; - uint8 Phase; uint32 ArcaneMissiles_Timer; @@ -152,16 +145,13 @@ class boss_high_astromancer_solarian : public CreatureScript void Reset() override { Initialize(); - - instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, NOT_STARTED); - + _Reset(); me->SetArmor(defaultarmor); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetVisible(true); me->SetObjectScale(defaultsize); me->SetDisplayId(MODEL_HUMAN); - Summons.DespawnAll(); } void KilledUnit(Unit* /*victim*/) override @@ -174,15 +164,13 @@ class boss_high_astromancer_solarian : public CreatureScript me->SetObjectScale(defaultsize); me->SetDisplayId(MODEL_HUMAN); Talk(SAY_DEATH); - instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, DONE); + _JustDied(); } void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); - DoZoneInCombat(); - - instance->SetData(DATA_HIGHASTROMANCERSOLARIANEVENT, IN_PROGRESS); + _EnterCombat(); } void SummonMinion(uint32 entry, float x, float y, float z) @@ -193,7 +181,7 @@ class boss_high_astromancer_solarian : public CreatureScript if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) Summoned->AI()->AttackStart(target); - Summons.Summon(Summoned); + summons.Summon(Summoned); } } @@ -431,10 +419,7 @@ class npc_solarium_priest : public CreatureScript { public: - npc_solarium_priest() - : CreatureScript("npc_solarium_priest") - { - } + npc_solarium_priest() : CreatureScript("npc_solarium_priest") { } struct npc_solarium_priestAI : public ScriptedAI { @@ -462,9 +447,7 @@ class npc_solarium_priest : public CreatureScript Initialize(); } - void EnterCombat(Unit* /*who*/) override - { - } + void EnterCombat(Unit* /*who*/) override { } void UpdateAI(uint32 diff) override { diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp index 38ccf33a612..3eae867b86c 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_kaelthas.cpp @@ -286,17 +286,13 @@ class boss_kaelthas : public CreatureScript { public: - boss_kaelthas() - : CreatureScript("boss_kaelthas") - { - } - //Kael'thas AI - struct boss_kaelthasAI : public ScriptedAI + boss_kaelthas() : CreatureScript("boss_kaelthas") { } + + struct boss_kaelthasAI : public BossAI { - boss_kaelthasAI(Creature* creature) : ScriptedAI(creature), summons(me) + boss_kaelthasAI(Creature* creature) : BossAI(creature, DATA_KAELTHAS) { Initialize(); - instance = creature->GetInstanceScript(); PhaseSubphase = 0; Phase_Timer = 0; } @@ -320,8 +316,6 @@ class boss_kaelthas : public CreatureScript ChainPyros = false; } - InstanceScript* instance; - uint32 Fireball_Timer; uint32 ArcaneDisruption_Timer; uint32 Phoenix_Timer; @@ -341,8 +335,6 @@ class boss_kaelthas : public CreatureScript bool IsCastingFireball; bool ChainPyros; - SummonList summons; - ObjectGuid m_auiAdvisorGuid[MAX_ADVISORS]; void Reset() override @@ -352,7 +344,7 @@ class boss_kaelthas : public CreatureScript if (me->IsInCombat()) PrepareAdvisors(); - summons.DespawnAll(); + _Reset(); me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE); @@ -413,7 +405,6 @@ class boss_kaelthas : public CreatureScript } void MoveInLineOfSight(Unit* who) override - { if (!me->HasUnitState(UNIT_STATE_STUNNED) && me->CanCreatureAttack(who)) { @@ -444,6 +435,8 @@ class boss_kaelthas : public CreatureScript { if (!instance->GetData(DATA_KAELTHASEVENT) && !Phase) StartEvent(); + + instance->SetBossState(DATA_KAELTHAS, IN_PROGRESS); } void KilledUnit(Unit* /*victim*/) override @@ -463,11 +456,6 @@ class boss_kaelthas : public CreatureScript } } - void SummonedCreatureDespawn(Creature* summon) override - { - summons.Despawn(summon); - } - void JustDied(Unit* /*killer*/) override { me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); @@ -475,8 +463,6 @@ class boss_kaelthas : public CreatureScript Talk(SAY_DEATH); - summons.DespawnAll(); - instance->SetData(DATA_KAELTHASEVENT, 0); for (uint8 i = 0; i < MAX_ADVISORS; ++i) @@ -484,6 +470,7 @@ class boss_kaelthas : public CreatureScript if (Unit* pAdvisor = ObjectAccessor::GetUnit(*me, m_auiAdvisorGuid[i])) pAdvisor->Kill(pAdvisor); } + _JustDied(); } void UpdateAI(uint32 diff) override @@ -1024,10 +1011,8 @@ class boss_thaladred_the_darkener : public CreatureScript { public: - boss_thaladred_the_darkener() - : CreatureScript("boss_thaladred_the_darkener") - { - } + boss_thaladred_the_darkener() : CreatureScript("boss_thaladred_the_darkener") { } + struct boss_thaladred_the_darkenerAI : public advisorbase_ai { boss_thaladred_the_darkenerAI(Creature* creature) : advisorbase_ai(creature) @@ -1130,10 +1115,8 @@ class boss_lord_sanguinar : public CreatureScript { public: - boss_lord_sanguinar() - : CreatureScript("boss_lord_sanguinar") - { - } + boss_lord_sanguinar() : CreatureScript("boss_lord_sanguinar") { } + struct boss_lord_sanguinarAI : public advisorbase_ai { boss_lord_sanguinarAI(Creature* creature) : advisorbase_ai(creature) @@ -1205,10 +1188,8 @@ class boss_grand_astromancer_capernian : public CreatureScript { public: - boss_grand_astromancer_capernian() - : CreatureScript("boss_grand_astromancer_capernian") - { - } + boss_grand_astromancer_capernian() : CreatureScript("boss_grand_astromancer_capernian") { } + struct boss_grand_astromancer_capernianAI : public advisorbase_ai { boss_grand_astromancer_capernianAI(Creature* creature) : advisorbase_ai(creature) @@ -1358,10 +1339,8 @@ class boss_master_engineer_telonicus : public CreatureScript { public: - boss_master_engineer_telonicus() - : CreatureScript("boss_master_engineer_telonicus") - { - } + boss_master_engineer_telonicus() : CreatureScript("boss_master_engineer_telonicus") { } + struct boss_master_engineer_telonicusAI : public advisorbase_ai { boss_master_engineer_telonicusAI(Creature* creature) : advisorbase_ai(creature) @@ -1449,10 +1428,8 @@ class npc_kael_flamestrike : public CreatureScript { public: - npc_kael_flamestrike() - : CreatureScript("npc_kael_flamestrike") - { - } + npc_kael_flamestrike() : CreatureScript("npc_kael_flamestrike") { } + struct npc_kael_flamestrikeAI : public ScriptedAI { npc_kael_flamestrikeAI(Creature* creature) : ScriptedAI(creature) @@ -1482,7 +1459,6 @@ class npc_kael_flamestrike : public CreatureScript void MoveInLineOfSight(Unit* /*who*/) override { } - void EnterCombat(Unit* /*who*/) override { } void UpdateAI(uint32 diff) override @@ -1523,10 +1499,8 @@ class npc_phoenix_tk : public CreatureScript { public: - npc_phoenix_tk() - : CreatureScript("npc_phoenix_tk") - { - } + npc_phoenix_tk() : CreatureScript("npc_phoenix_tk") { } + struct npc_phoenix_tkAI : public ScriptedAI { npc_phoenix_tkAI(Creature* creature) : ScriptedAI(creature) @@ -1585,10 +1559,8 @@ class npc_phoenix_egg_tk : public CreatureScript { public: - npc_phoenix_egg_tk() - : CreatureScript("npc_phoenix_egg_tk") - { - } + npc_phoenix_egg_tk() : CreatureScript("npc_phoenix_egg_tk") { } + struct npc_phoenix_egg_tkAI : public ScriptedAI { npc_phoenix_egg_tkAI(Creature* creature) : ScriptedAI(creature) @@ -1611,7 +1583,6 @@ class npc_phoenix_egg_tk : public CreatureScript //ignore any void MoveInLineOfSight(Unit* /*who*/) override { } - void AttackStart(Unit* who) override { if (me->Attack(who, false)) diff --git a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp index 9186b491fa4..29504166846 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/boss_void_reaver.cpp @@ -1,6 +1,5 @@ /* * Copyright (C) 2008-2015 TrinityCore <http://www.trinitycore.org/> - * Copyright (C) 2006-2009 ScriptDev2 <https://scriptdev2.svn.sourceforge.net/> * * 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 @@ -16,13 +15,6 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ -/* ScriptData -SDName: Boss_Void_Reaver -SD%Complete: 90 -SDComment: Should reset if raid are out of room. -SDCategory: Tempest Keep, The Eye -EndScriptData */ - #include "ScriptMgr.h" #include "ScriptedCreature.h" #include "the_eye.h" @@ -43,48 +35,35 @@ enum Spells SPELL_BERSERK = 27680 }; +enum Events +{ + EVENT_POUNDING = 1, + EVENT_ARCANE_ORB, + EVENT_KNOCK_AWAY, + EVENT_BERSERK +}; + class boss_void_reaver : public CreatureScript { public: + boss_void_reaver() : CreatureScript("boss_void_reaver") { } - boss_void_reaver() - : CreatureScript("boss_void_reaver") - { - } - - struct boss_void_reaverAI : public ScriptedAI + struct boss_void_reaverAI : public BossAI { - boss_void_reaverAI(Creature* creature) : ScriptedAI(creature) + boss_void_reaverAI(Creature* creature) : BossAI(creature, DATA_VOID_REAVER) { Initialize(); - instance = creature->GetInstanceScript(); } void Initialize() { - Pounding_Timer = 15000; - ArcaneOrb_Timer = 3000; - KnockAway_Timer = 30000; - Berserk_Timer = 600000; - Enraged = false; } - InstanceScript* instance; - - uint32 Pounding_Timer; - uint32 ArcaneOrb_Timer; - uint32 KnockAway_Timer; - uint32 Berserk_Timer; - - bool Enraged; - void Reset() override { Initialize(); - - if (me->IsAlive()) - instance->SetData(DATA_VOIDREAVEREVENT, NOT_STARTED); + _Reset(); } void KilledUnit(Unit* /*victim*/) override @@ -96,82 +75,91 @@ class boss_void_reaver : public CreatureScript { Talk(SAY_DEATH); DoZoneInCombat(); - - instance->SetData(DATA_VOIDREAVEREVENT, DONE); + _JustDied(); } void EnterCombat(Unit* /*who*/) override { Talk(SAY_AGGRO); + _EnterCombat(); - instance->SetData(DATA_VOIDREAVEREVENT, IN_PROGRESS); + events.ScheduleEvent(EVENT_POUNDING, 15000); + events.ScheduleEvent(EVENT_ARCANE_ORB, 3000); + events.ScheduleEvent(EVENT_KNOCK_AWAY, 30000); + events.ScheduleEvent(EVENT_BERSERK, 600000); } void UpdateAI(uint32 diff) override { if (!UpdateVictim()) return; - // Pounding - if (Pounding_Timer <= diff) - { - DoCastVictim(SPELL_POUNDING); - Talk(SAY_POUNDING); - Pounding_Timer = 15000; //cast time(3000) + cooldown time(12000) - } - else - Pounding_Timer -= diff; - // Arcane Orb - if (ArcaneOrb_Timer <= diff) - { - Unit* target = NULL; - std::list<HostileReference*> t_list = me->getThreatManager().getThreatList(); - std::vector<Unit*> target_list; - for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr!= t_list.end(); ++itr) - { - target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); - if (!target) - continue; - // exclude pets & totems, 18 yard radius minimum - if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false)) - target_list.push_back(target); - target = NULL; - } - if (!target_list.empty()) - target = *(target_list.begin() + rand32() % target_list.size()); - else - target = me->GetVictim(); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (target) - me->CastSpell(target, SPELL_ARCANE_ORB, false, NULL, NULL); - ArcaneOrb_Timer = 3000; - } - else - ArcaneOrb_Timer -= diff; - // Single Target knock back, reduces aggro - if (KnockAway_Timer <= diff) + while (uint32 eventId = events.ExecuteEvent()) { - DoCastVictim(SPELL_KNOCK_AWAY); - //Drop 25% aggro - if (DoGetThreat(me->GetVictim())) - DoModifyThreatPercent(me->GetVictim(), -25); - KnockAway_Timer = 30000; - } - else - KnockAway_Timer -= diff; - //Berserk - if (Berserk_Timer < diff && !Enraged) - { - DoCast(me, SPELL_BERSERK); - Enraged = true; + switch (eventId) + { + case EVENT_POUNDING: + DoCastVictim(SPELL_POUNDING); + Talk(SAY_POUNDING); + events.ScheduleEvent(EVENT_POUNDING, 15000); + break; + case EVENT_ARCANE_ORB: + { + Unit* target = NULL; + std::list<HostileReference*> t_list = me->getThreatManager().getThreatList(); + std::vector<Unit*> target_list; + for (std::list<HostileReference*>::const_iterator itr = t_list.begin(); itr != t_list.end(); ++itr) + { + target = ObjectAccessor::GetUnit(*me, (*itr)->getUnitGuid()); + if (!target) + continue; + // exclude pets & totems, 18 yard radius minimum + if (target->GetTypeId() == TYPEID_PLAYER && target->IsAlive() && !target->IsWithinDist(me, 18, false)) + target_list.push_back(target); + target = NULL; + } + + if (!target_list.empty()) + target = *(target_list.begin() + rand32() % target_list.size()); + else + target = me->GetVictim(); + + if (target) + me->CastSpell(target, SPELL_ARCANE_ORB, false, NULL, NULL); + + events.ScheduleEvent(EVENT_ARCANE_ORB, 3000); + break; + } + case EVENT_KNOCK_AWAY: + DoCastVictim(SPELL_KNOCK_AWAY); + // Drop 25% aggro + if (DoGetThreat(me->GetVictim())) + DoModifyThreatPercent(me->GetVictim(), -25); + + events.ScheduleEvent(EVENT_KNOCK_AWAY, 30000); + break; + case EVENT_BERSERK: + if (!Enraged) + { + DoCast(me, SPELL_BERSERK); + Enraged = true; + } + break; + default: + break; + } } - else - Berserk_Timer -= diff; DoMeleeAttackIfReady(); EnterEvadeIfOutOfCombatArea(diff); } + + private: + bool Enraged; }; CreatureAI* GetAI(Creature* creature) const override diff --git a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp index 38c9cdd487c..c421b9974ce 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp +++ b/src/server/scripts/Outland/TempestKeep/Eye/instance_the_eye.cpp @@ -27,8 +27,6 @@ EndScriptData */ #include "InstanceScript.h" #include "the_eye.h" -#define MAX_ENCOUNTER 5 - /* The Eye encounters: 0 - Kael'thas event 1 - Al' ar event @@ -39,20 +37,16 @@ EndScriptData */ class instance_the_eye : public InstanceMapScript { public: - instance_the_eye() - : InstanceMapScript("instance_the_eye", 550) - { - } + instance_the_eye() : InstanceMapScript("instance_the_eye", 550) { } struct instance_the_eye_InstanceMapScript : public InstanceScript { instance_the_eye_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + SetBossNumber(EncounterCount); KaelthasEventPhase = 0; - AlarEventPhase = 0; } ObjectGuid ThaladredTheDarkener; @@ -63,44 +57,34 @@ class instance_the_eye : public InstanceMapScript ObjectGuid Astromancer; ObjectGuid Alar; uint8 KaelthasEventPhase; - uint8 AlarEventPhase; - - uint32 m_auiEncounter[MAX_ENCOUNTER]; - - bool IsEncounterInProgress() const override - { - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - return true; - - return false; - } void OnCreatureCreate(Creature* creature) override { switch (creature->GetEntry()) { - case 20064: - ThaladredTheDarkener = creature->GetGUID(); - break; - case 20063: - MasterEngineerTelonicus = creature->GetGUID(); - break; - case 20062: - GrandAstromancerCapernian = creature->GetGUID(); - break; - case 20060: - LordSanguinar = creature->GetGUID(); - break; - case 19622: - Kaelthas = creature->GetGUID(); - break; - case 18805: - Astromancer = creature->GetGUID(); - break; - case 19514: - Alar = creature->GetGUID(); - break; + case NPC_SANGUINAR: + LordSanguinar = creature->GetGUID(); + break; + case NPC_CAPERNIAN: + GrandAstromancerCapernian = creature->GetGUID(); + break; + case NPC_TELONICUS: + MasterEngineerTelonicus = creature->GetGUID(); + break; + case NPC_THALADRED: + ThaladredTheDarkener = creature->GetGUID(); + break; + case NPC_KAELTHAS: + Kaelthas = creature->GetGUID(); + break; + case NPC_HIGH_ASTROMANCER_SOLARIAN: + Astromancer = creature->GetGUID(); + break; + case NPC_ALAR: + Alar = creature->GetGUID(); + break; + default: + break; } } @@ -113,7 +97,7 @@ class instance_the_eye : public InstanceMapScript case DATA_GRANDASTROMANCERCAPERNIAN: return GrandAstromancerCapernian; case DATA_MASTERENGINEERTELONICUS: return MasterEngineerTelonicus; case DATA_KAELTHAS: return Kaelthas; - case DATA_ASTROMANCER: return Astromancer; + case DATA_HIGH_ASTROMANCER_SOLARIAN: return Astromancer; case DATA_ALAR: return Alar; } return ObjectGuid::Empty; @@ -123,64 +107,23 @@ class instance_the_eye : public InstanceMapScript { switch (type) { - case DATA_ALAREVENT: - AlarEventPhase = data; - m_auiEncounter[0] = data; - break; - case DATA_HIGHASTROMANCERSOLARIANEVENT: - m_auiEncounter[1] = data; - break; - case DATA_VOIDREAVEREVENT: - m_auiEncounter[2] = data; - break; - case DATA_KAELTHASEVENT: - KaelthasEventPhase = data; - m_auiEncounter[3] = data; - break; + case DATA_KAELTHASEVENT: + KaelthasEventPhase = data; + break; + default: + break; } - if (data == DONE) - SaveToDB(); } uint32 GetData(uint32 type) const override { switch (type) { - case DATA_ALAREVENT: return AlarEventPhase; - case DATA_HIGHASTROMANCERSOLARIANEVENT: return m_auiEncounter[1]; - case DATA_VOIDREAVEREVENT: return m_auiEncounter[2]; - case DATA_KAELTHASEVENT: return KaelthasEventPhase; + case DATA_KAELTHASEVENT: + return KaelthasEventPhase; } return 0; } - - std::string GetSaveData() override - { - OUT_SAVE_INST_DATA; - - std::ostringstream stream; - stream << m_auiEncounter[0] << ' ' << m_auiEncounter[1] << ' ' << m_auiEncounter[2] << ' ' << m_auiEncounter[3]; - - OUT_SAVE_INST_DATA_COMPLETE; - return stream.str(); - } - - void Load(const char* in) override - { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - OUT_LOAD_INST_DATA(in); - - std::istringstream stream(in); - stream >> m_auiEncounter[0] >> m_auiEncounter[1] >> m_auiEncounter[2] >> m_auiEncounter[3]; - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) // Do not load an encounter as "In Progress" - reset it instead. - m_auiEncounter[i] = NOT_STARTED; - OUT_LOAD_INST_DATA_COMPLETE; - } }; InstanceScript* GetInstanceScript(InstanceMap* map) const override diff --git a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h index 718f37861d9..c46fe408274 100644 --- a/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h +++ b/src/server/scripts/Outland/TempestKeep/Eye/the_eye.h @@ -21,19 +21,33 @@ #define DataHeader "TE" +uint32 const EncounterCount = 4; + enum DataTypes { - DATA_ALAREVENT = 1, - DATA_ASTROMANCER = 2, - DATA_GRANDASTROMANCERCAPERNIAN = 3, - DATA_HIGHASTROMANCERSOLARIANEVENT = 4, - DATA_KAELTHAS = 5, + // Encounter States/Boss GUIDs + DATA_KAELTHAS = 0, + DATA_ALAR = 1, + DATA_HIGH_ASTROMANCER_SOLARIAN = 2, + DATA_VOID_REAVER = 3, + + DATA_ASTROMANCER = 4, + DATA_GRANDASTROMANCERCAPERNIAN = 5, DATA_KAELTHASEVENT = 6, DATA_LORDSANGUINAR = 7, DATA_MASTERENGINEERTELONICUS = 8, - DATA_THALADREDTHEDARKENER = 10, - DATA_VOIDREAVEREVENT = 11, - DATA_ALAR = 12 + DATA_THALADREDTHEDARKENER = 9 +}; + +enum CreatureIds +{ + NPC_SANGUINAR = 20060, + NPC_CAPERNIAN = 20062, + NPC_TELONICUS = 20063, + NPC_THALADRED = 20064, + NPC_KAELTHAS = 19622, + NPC_HIGH_ASTROMANCER_SOLARIAN = 18805, + NPC_ALAR = 19514 }; #endif diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index d01883a019b..ff67575ae0d 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -890,42 +890,42 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader case SPELL_COPY_WEAPON_2_AURA: case SPELL_COPY_WEAPON_3_AURA: { - prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID); + prevItem = target->GetVirtualItemId(0); if (Player* player = caster->ToPlayer()) { if (Item* mainItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_MAINHAND)) - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, mainItem->GetEntry()); + target->SetVirtualItem(0, mainItem->GetEntry()); } else - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID)); + target->SetVirtualItem(0, caster->GetVirtualItemId(0)); break; } case SPELL_COPY_OFFHAND_AURA: case SPELL_COPY_OFFHAND_2_AURA: { - prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 1; + prevItem = target->GetVirtualItemId(1); if (Player* player = caster->ToPlayer()) { if (Item* offItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND)) - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, offItem->GetEntry()); + target->SetVirtualItem(1, offItem->GetEntry()); } else - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1)); + target->SetVirtualItem(1, caster->GetVirtualItemId(1)); break; } case SPELL_COPY_RANGED_AURA: { - prevItem = target->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID) + 2; + prevItem = target->GetVirtualItemId(2); if (Player* player = caster->ToPlayer()) { if (Item* rangedItem = player->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED)) - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, rangedItem->GetEntry()); + target->SetVirtualItem(2, rangedItem->GetEntry()); } else - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, caster->GetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2)); + target->SetVirtualItem(2, caster->GetVirtualItemId(2)); break; } default: @@ -942,14 +942,14 @@ class spell_gen_clone_weapon_aura : public SpellScriptLoader case SPELL_COPY_WEAPON_AURA: case SPELL_COPY_WEAPON_2_AURA: case SPELL_COPY_WEAPON_3_AURA: - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID, prevItem); + target->SetVirtualItem(0, prevItem); break; case SPELL_COPY_OFFHAND_AURA: case SPELL_COPY_OFFHAND_2_AURA: - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 1, prevItem); + target->SetVirtualItem(1, prevItem); break; case SPELL_COPY_RANGED_AURA: - target->SetUInt32Value(UNIT_VIRTUAL_ITEM_SLOT_ID + 2, prevItem); + target->SetVirtualItem(2, prevItem); break; default: break; diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 87bd5923c8f..98cc33a6f40 100644 --- a/src/server/scripts/Spells/spell_quest.cpp +++ b/src/server/scripts/Spells/spell_quest.cpp @@ -208,22 +208,23 @@ class spell_q6124_6129_apply_salve : public SpellScriptLoader if (GetCastItem()) if (Creature* creatureTarget = GetHitCreature()) { - uint32 uiNewEntry = 0; + uint32 newEntry = 0; switch (caster->GetTeam()) { case HORDE: if (creatureTarget->GetEntry() == NPC_SICKLY_GAZELLE) - uiNewEntry = NPC_CURED_GAZELLE; + newEntry = NPC_CURED_GAZELLE; break; case ALLIANCE: if (creatureTarget->GetEntry() == NPC_SICKLY_DEER) - uiNewEntry = NPC_CURED_DEER; + newEntry = NPC_CURED_DEER; break; } - if (uiNewEntry) + if (newEntry) { - creatureTarget->UpdateEntry(uiNewEntry); + creatureTarget->UpdateEntry(newEntry); creatureTarget->DespawnOrUnsummon(DESPAWN_TIME); + caster->KilledMonsterCredit(newEntry); } } } diff --git a/src/server/shared/DataStores/DB2StorageLoader.cpp b/src/server/shared/DataStores/DB2StorageLoader.cpp index 062cc251450..f4a1518a255 100644 --- a/src/server/shared/DataStores/DB2StorageLoader.cpp +++ b/src/server/shared/DataStores/DB2StorageLoader.cpp @@ -124,37 +124,38 @@ bool DB2FileLoader::Load(const char *filename, const char *fmt) EndianConvert(unk1); - if (build > 12880) + if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 { - if (fread(&minIndex, 4, 1, f) != 1) // MinIndex WDB2 - { - fclose(f); - return false; - } - EndianConvert(minIndex); + fclose(f); + return false; + } - if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 - { - fclose(f); - return false; - } - EndianConvert(maxIndex); + EndianConvert(minIndex); - if (fread(&locale, 4, 1, f) != 1) // Locales - { - fclose(f); - return false; - } - EndianConvert(locale); + if (fread(&maxIndex, 4, 1, f) != 1) // MaxIndex WDB2 + { + fclose(f); + return false; + } - if (fread(&unk5, 4, 1, f) != 1) // Unknown WDB2 - { - fclose(f); - return false; - } - EndianConvert(unk5); + EndianConvert(maxIndex); + + if (fread(&locale, 4, 1, f) != 1) // Locales + { + fclose(f); + return false; } + EndianConvert(locale); + + if (fread(&unk5, 4, 1, f) != 1) // Unknown WDB2 + { + fclose(f); + return false; + } + + EndianConvert(unk5); + if (maxIndex != 0) { int32 diff = maxIndex - minIndex + 1; diff --git a/src/server/shared/Database/DatabaseLoader.cpp b/src/server/shared/Database/DatabaseLoader.cpp index 25c400fdfa8..1d704100d93 100644 --- a/src/server/shared/Database/DatabaseLoader.cpp +++ b/src/server/shared/Database/DatabaseLoader.cpp @@ -117,6 +117,9 @@ DatabaseLoader& DatabaseLoader::AddDatabase(DatabaseWorkerPool<T>& pool, std::st bool DatabaseLoader::Load() { + if (!_updateFlags) + TC_LOG_INFO("sql.updates", "Automatic database updates are disabled for all databases!"); + if (!OpenDatabases()) return false; diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 277ccd4569a..7ceb0931ecf 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -276,7 +276,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_PLAYER_CURRENCY, "DELETE FROM character_currency WHERE CharacterGuid = ?", CONNECTION_ASYNC); // Account data - PrepareStatement(CHAR_SEL_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE accountId = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_ACCOUNT_DATA, "SELECT type, time, data FROM account_data WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_REP_ACCOUNT_DATA, "REPLACE INTO account_data (accountId, type, time, data) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_ACCOUNT_DATA, "DELETE FROM account_data WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_PLAYER_ACCOUNT_DATA, "SELECT type, time, data FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC); @@ -284,7 +284,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_PLAYER_ACCOUNT_DATA, "DELETE FROM character_account_data WHERE guid = ?", CONNECTION_ASYNC); // Tutorials - PrepareStatement(CHAR_SEL_TUTORIALS, "SELECT tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH); + PrepareStatement(CHAR_SEL_TUTORIALS, "SELECT tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7 FROM account_tutorial WHERE accountId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_HAS_TUTORIALS, "SELECT 1 FROM account_tutorial WHERE accountId = ?", CONNECTION_SYNCH); PrepareStatement(CHAR_INS_TUTORIALS, "INSERT INTO account_tutorial(tut0, tut1, tut2, tut3, tut4, tut5, tut6, tut7, accountId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_TUTORIALS, "UPDATE account_tutorial SET tut0 = ?, tut1 = ?, tut2 = ?, tut3 = ?, tut4 = ?, tut5 = ?, tut6 = ?, tut7 = ? WHERE accountId = ?", CONNECTION_ASYNC); @@ -359,17 +359,6 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC); - // GM Tickets - PrepareStatement(CHAR_SEL_GM_TICKETS, "SELECT id, playerGuid, description, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, needMoreHelp FROM gm_ticket", CONNECTION_SYNCH); - PrepareStatement(CHAR_REP_GM_TICKET, "REPLACE INTO gm_ticket (id, playerGuid, description, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, response, completed, escalated, viewed, needMoreHelp) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_GM_TICKET, "DELETE FROM gm_ticket WHERE id = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_PLAYER_GM_TICKETS, "DELETE FROM gm_ticket WHERE playerGuid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_DEL_ALL_GM_TICKETS, "TRUNCATE TABLE gm_ticket", CONNECTION_ASYNC); - - // GM Survey/subsurvey - PrepareStatement(CHAR_INS_GM_SURVEY, "INSERT INTO gm_survey (guid, surveyId, mainSurvey, comment, createTime) VALUES (?, ?, ?, ?, UNIX_TIMESTAMP(NOW()))", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_GM_SUBSURVEY, "INSERT INTO gm_subsurvey (surveyId, questionID, answer, answerComment) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); - // GM Bug PrepareStatement(CHAR_SEL_GM_BUGS, "SELECT id, playerGuid, note, createTime, mapId, posX, posY, posZ, facing, closedBy, assignedTo, comment FROM gm_bug", CONNECTION_SYNCH); PrepareStatement(CHAR_REP_GM_BUG, "REPLACE INTO gm_bug (id, playerGuid, note, createTime, mapId, posX, posY, posZ, facing, closedBy, assignedTo, comment) VALUES (?, ?, ?, UNIX_TIMESTAMP(NOW()), ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.h b/src/server/shared/Database/Implementation/CharacterDatabase.h index fc9c930e6b1..5fd73b6c494 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.h +++ b/src/server/shared/Database/Implementation/CharacterDatabase.h @@ -310,15 +310,6 @@ enum CharacterDatabaseStatements CHAR_DEL_GO_RESPAWN, CHAR_DEL_GO_RESPAWN_BY_INSTANCE, - CHAR_SEL_GM_TICKETS, - CHAR_REP_GM_TICKET, - CHAR_DEL_GM_TICKET, - CHAR_DEL_ALL_GM_TICKETS, - CHAR_DEL_PLAYER_GM_TICKETS, - - CHAR_INS_GM_SURVEY, - CHAR_INS_GM_SUBSURVEY, - CHAR_SEL_GM_BUGS, CHAR_REP_GM_BUG, CHAR_DEL_GM_BUG, diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.cpp b/src/server/shared/Database/Implementation/HotfixDatabase.cpp index a7043b1d5ff..be2ff140fd8 100644 --- a/src/server/shared/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/shared/Database/Implementation/HotfixDatabase.cpp @@ -33,55 +33,106 @@ void HotfixDatabaseConnection::DoPrepareStatements() // AreaGroupMember.db2 PrepareStatement(HOTFIX_SEL_AREA_GROUP_MEMBER, "SELECT ID, AreaGroupID, AreaID FROM area_group_member ORDER BY ID DESC", CONNECTION_SYNCH); + // AuctionHouse.db2 + PrepareStatement(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, FactionID, DepositRate, ConsignmentRate, Name FROM auction_house ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_AUCTION_HOUSE, "SELECT ID, Name_lang FROM auction_house_locale WHERE locale = ?", CONNECTION_SYNCH); + + // BarberShopStyle.db2 + PrepareStatement(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, Type, DisplayName, Description, CostModifier, Race, Sex, Data FROM barber_shop_style" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_BARBER_SHOP_STYLE, "SELECT ID, DisplayName_lang, Description_lang FROM barber_shop_style_locale WHERE locale = ?", CONNECTION_SYNCH); + // BroadcastText.db2 - PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, " - "EmoteDelay1, EmoteDelay2, EmoteDelay3, SoundID, UnkEmoteID, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, Language, MaleText, FemaleText, EmoteID1, EmoteID2, EmoteID3, EmoteDelay1, EmoteDelay2, " + "EmoteDelay3, SoundID, UnkEmoteID, Type FROM broadcast_text ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_BROADCAST_TEXT, "SELECT ID, MaleText_lang, FemaleText_lang FROM broadcast_text_locale WHERE locale = ?", CONNECTION_SYNCH); + // CharStartOutfit.db2 + PrepareStatement(HOTFIX_SEL_CHAR_START_OUTFIT, "SELECT ID, RaceID, ClassID, GenderID, OutfitID, ItemID1, ItemID2, ItemID3, ItemID4, ItemID5, " + "ItemID6, ItemID7, ItemID8, ItemID9, ItemID10, ItemID11, ItemID12, ItemID13, ItemID14, ItemID15, ItemID16, ItemID17, ItemID18, ItemID19, " + "ItemID20, ItemID21, ItemID22, ItemID23, ItemID24, PetDisplayID, PetFamilyID FROM char_start_outfit ORDER BY ID DESC", CONNECTION_SYNCH); + + // ChrClassesXPowerTypes.db2 + PrepareStatement(HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, "SELECT ID, ClassID, PowerType FROM chr_classes_x_power_types ORDER BY ID DESC", CONNECTION_SYNCH); + + // CinematicSequences.db2 + PrepareStatement(HOTFIX_SEL_CINEMATIC_SEQUENCES, "SELECT ID, SoundID, Camera1, Camera2, Camera3, Camera4, Camera5, Camera6, Camera7, Camera8" + " FROM cinematic_sequences ORDER BY ID DESC", CONNECTION_SYNCH); + + // CreatureDisplayInfo.db2 + PrepareStatement(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, ModelID, SoundID, ExtendedDisplayInfoID, CreatureModelScale, Unknown620, " + "CreatureModelAlpha, TextureVariation1, TextureVariation2, TextureVariation3, PortraitTextureName, PortraitCreatureDisplayInfoID, SizeClass, " + "BloodID, NPCSoundID, ParticleColorID, CreatureGeosetData, ObjectEffectPackageID, AnimReplacementSetID, Flags, Gender, StateSpellVisualKitID" + " FROM creature_display_info ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_DISPLAY_INFO, "SELECT ID, TextureVariation_lang1, TextureVariation_lang2, TextureVariation_lang3, " + "PortraitTextureName_lang FROM creature_display_info_locale WHERE locale = ?", CONNECTION_SYNCH); + + // CreatureType.db2 + PrepareStatement(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name, Flags FROM creature_type ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CREATURE_TYPE, "SELECT ID, Name_lang FROM creature_type_locale WHERE locale = ?", CONNECTION_SYNCH); + // CurrencyTypes.db2 - PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, CategoryID, Name, InventoryIcon1, InventoryIcon2, SpellWeight, SpellCategory, " - "MaxQty, MaxEarnablePerWeek, Flags, Quality, Description FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, InventoryIcon1_lang, InventoryIcon2_lang, " - "Description_lang FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, CategoryID, Name, InventoryIcon1, InventoryIcon2, SpellWeight, SpellCategory, MaxQty, " + "MaxEarnablePerWeek, Flags, Quality, Description FROM currency_types ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_CURRENCY_TYPES, "SELECT ID, Name_lang, InventoryIcon1_lang, InventoryIcon2_lang, Description_lang" + " FROM currency_types_locale WHERE locale = ?", CONNECTION_SYNCH); // CurvePoint.db2 PrepareStatement(HOTFIX_SEL_CURVE_POINT, "SELECT ID, CurveID, `Index`, X, Y FROM curve_point ORDER BY ID DESC", CONNECTION_SYNCH); + // DestructibleModelData.db2 + PrepareStatement(HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, "SELECT ID, StateDamagedDisplayID, StateDamagedImpactEffectDoodadSet, StateDamagedAmbientDoodadSet, " + "StateDamagedNameSet, StateDestroyedDisplayID, StateDestroyedDestructionDoodadSet, StateDestroyedImpactEffectDoodadSet, StateDestroyedAmbientDoodadSet, " + "StateDestroyedNameSet, StateRebuildingDisplayID, StateRebuildingDestructionDoodadSet, StateRebuildingImpactEffectDoodadSet, " + "StateRebuildingAmbientDoodadSet, StateRebuildingNameSet, StateSmokeDisplayID, StateSmokeInitDoodadSet, StateSmokeAmbientDoodadSet, StateSmokeNameSet, " + "EjectDirection, RepairGroundFx, DoNotHighlight, HealEffect, HealEffectSpeed FROM destructible_model_data ORDER BY ID DESC", CONNECTION_SYNCH); + + // DurabilityQuality.db2 + PrepareStatement(HOTFIX_SEL_DURABILITY_QUALITY, "SELECT ID, QualityMod FROM durability_quality ORDER BY ID DESC", CONNECTION_SYNCH); + // GameObjects.db2 - PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, MapID, DisplayID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, RotationW, Size, " - "PhaseUseFlags, PhaseID, PhaseGroupID, Type, Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Name FROM gameobjects ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, MapID, DisplayID, PositionX, PositionY, PositionZ, RotationX, RotationY, RotationZ, " + "RotationW, Size, PhaseUseFlags, PhaseID, PhaseGroupID, Type, Data0, Data1, Data2, Data3, Data4, Data5, Data6, Data7, Name FROM gameobjects" + " ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GAMEOBJECTS, "SELECT ID, Name_lang FROM gameobjects_locale WHERE locale = ?", CONNECTION_SYNCH); + // GameTables.db2 + PrepareStatement(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name, NumRows, NumColumns FROM game_tables ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_GAME_TABLES, "SELECT ID, Name_lang FROM game_tables_locale WHERE locale = ?", CONNECTION_SYNCH); + // GarrAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Flags, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, " - "GarrAbilityCategoryID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Flags, Name, Description, IconFileDataID, OtherFactionGarrAbilityID, GarrAbilityCategoryID, " + "FollowerTypeID FROM garr_ability ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_ABILITY, "SELECT ID, Name_lang, Description_lang FROM garr_ability_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuilding.db2 - PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeGameObjectID, AllianceGameObjectID, Unknown, Type, Level, NameAlliance, NameHorde, Description, " - "Tooltip, BuildDuration, CostCurrencyID, CostCurrencyAmount, HordeTexPrefixKitID, AllianceTexPrefixKitID, IconFileDataID, BonusAmount, Flags, " - "AllianceActivationScenePackageID, HordeActivationScenePackageID, MaxShipments, FollowerRequiredGarrAbilityID, FollowerGarrAbilityEffectID, CostMoney " - "FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, NameAlliance_lang, NameHorde_lang, Description_lang, Tooltip_lang " - "FROM garr_building_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, HordeGameObjectID, AllianceGameObjectID, Unknown, Type, Level, NameAlliance, NameHorde, " + "Description, Tooltip, BuildDuration, CostCurrencyID, CostCurrencyAmount, HordeTexPrefixKitID, AllianceTexPrefixKitID, IconFileDataID, " + "BonusAmount, Flags, AllianceActivationScenePackageID, HordeActivationScenePackageID, MaxShipments, FollowerRequiredGarrAbilityID, " + "FollowerGarrAbilityEffectID, CostMoney FROM garr_building ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_BUILDING, "SELECT ID, NameAlliance_lang, NameHorde_lang, Description_lang, Tooltip_lang" + " FROM garr_building_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrBuildingPlotInst.db2 PrepareStatement(HOTFIX_SEL_GARR_BUILDING_PLOT_INST, "SELECT ID, GarrBuildingID, UiTextureAtlasMemberID, GarrSiteLevelPlotInstID, " "LandmarkOffsetX, LandmarkOffsetY FROM garr_building_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); // GarrClassSpec.db2 - PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID " - "FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale_lang, NameFemale_lang, NameGenderless_lang FROM garr_class_spec_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale, NameFemale, NameGenderless, ClassAtlasID, GarrFollItemSetID" + " FROM garr_class_spec ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_CLASS_SPEC, "SELECT ID, NameMale_lang, NameFemale_lang, NameGenderless_lang FROM garr_class_spec_locale" + " WHERE locale = ?", CONNECTION_SYNCH); // GarrFollower.db2 - PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeCreatureID, AllianceCreatureID, HordeUiAnimRaceInfoID, AllianceUiAnimRaceInfoID, Quality, " - "HordeGarrClassSpecID, AllianceGarrClassSpecID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, Level, ItemLevelWeapon, ItemLevelArmor, Unknown1, Flags, " - "HordeSourceText, AllianceSourceText, Unknown2, Unknown3, HordePortraitIconID, AlliancePortraitIconID FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, FollowerTypeID, HordeCreatureID, AllianceCreatureID, HordeUiAnimRaceInfoID, AllianceUiAnimRaceInfoID, " + "Quality, HordeGarrClassSpecID, AllianceGarrClassSpecID, HordeGarrFollItemSetID, AllianceGarrFollItemSetID, Level, ItemLevelWeapon, " + "ItemLevelArmor, Unknown1, Flags, HordeSourceText, AllianceSourceText, Unknown2, Unknown3, HordePortraitIconID, AlliancePortraitIconID, " + "HordeListPortraitTextureKitID, AllianceListPortraitTextureKitID FROM garr_follower ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_GARR_FOLLOWER, "SELECT ID, HordeSourceText_lang, AllianceSourceText_lang FROM garr_follower_locale WHERE locale = ?", CONNECTION_SYNCH); // GarrFollowerXAbility.db2 - PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY, "SELECT ID, GarrFollowerID, GarrAbilityID, FactionIndex FROM garr_follower_x_ability ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_FOLLOWER_X_ABILITY, "SELECT ID, GarrFollowerID, GarrAbilityID, FactionIndex FROM garr_follower_x_ability" + " ORDER BY ID DESC", CONNECTION_SYNCH); // GarrPlot.db2 PrepareStatement(HOTFIX_SEL_GARR_PLOT, "SELECT ID, GarrPlotUICategoryID, PlotType, Flags, Name, MinCount, MaxCount, " @@ -100,16 +151,36 @@ void HotfixDatabaseConnection::DoPrepareStatements() "UpgradeResourceCost, UpgradeMoneyCost FROM garr_site_level ORDER BY ID DESC", CONNECTION_SYNCH); // GarrSiteLevelPlotInst.db2 - PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, GarrSiteLevelID, GarrPlotInstanceID, LandmarkX, LandmarkY, " - "Unknown FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, "SELECT ID, GarrSiteLevelID, GarrPlotInstanceID, LandmarkX, LandmarkY, Unknown" + " FROM garr_site_level_plot_inst ORDER BY ID DESC", CONNECTION_SYNCH); + + // GlyphSlot.db2 + PrepareStatement(HOTFIX_SEL_GLYPH_SLOT, "SELECT ID, Type, Tooltip FROM glyph_slot ORDER BY ID DESC", CONNECTION_SYNCH); + + // GuildPerkSpells.db2 + PrepareStatement(HOTFIX_SEL_GUILD_PERK_SPELLS, "SELECT ID, GuildLevel, SpellID FROM guild_perk_spells ORDER BY ID DESC", CONNECTION_SYNCH); // Holidays.db2 - PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, Duration9, Duration10, " - "Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, Date16, Region, Looping, " - "CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, CalendarFlags8, CalendarFlags9, CalendarFlags10, " - "HolidayNameID, HolidayDescriptionID, TextureFilename, Priority, CalendarFilterType, Flags FROM holidays ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_HOLIDAYS, "SELECT ID, Duration1, Duration2, Duration3, Duration4, Duration5, Duration6, Duration7, Duration8, " + "Duration9, Duration10, Date1, Date2, Date3, Date4, Date5, Date6, Date7, Date8, Date9, Date10, Date11, Date12, Date13, Date14, Date15, " + "Date16, Region, Looping, CalendarFlags1, CalendarFlags2, CalendarFlags3, CalendarFlags4, CalendarFlags5, CalendarFlags6, CalendarFlags7, " + "CalendarFlags8, CalendarFlags9, CalendarFlags10, HolidayNameID, HolidayDescriptionID, TextureFilename, Priority, CalendarFilterType, Flags" + " FROM holidays ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_HOLIDAYS, "SELECT ID, TextureFilename_lang FROM holidays_locale WHERE locale = ?", CONNECTION_SYNCH); + // ImportPriceArmor.db2 + PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_ARMOR, "SELECT ID, ClothFactor, LeatherFactor, MailFactor, PlateFactor FROM import_price_armor" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ImportPriceQuality.db2 + PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_QUALITY, "SELECT ID, Factor FROM import_price_quality ORDER BY ID DESC", CONNECTION_SYNCH); + + // ImportPriceShield.db2 + PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_SHIELD, "SELECT ID, Factor FROM import_price_shield ORDER BY ID DESC", CONNECTION_SYNCH); + + // ImportPriceWeapon.db2 + PrepareStatement(HOTFIX_SEL_IMPORT_PRICE_WEAPON, "SELECT ID, Factor FROM import_price_weapon ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemAppearance.db2 PrepareStatement(HOTFIX_SEL_ITEM_APPEARANCE, "SELECT ID, DisplayID, IconFileDataID FROM item_appearance ORDER BY ID DESC", CONNECTION_SYNCH); @@ -117,115 +188,218 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_ITEM_BONUS, "SELECT ID, BonusListID, Type, Value1, Value2, `Index` FROM item_bonus ORDER BY ID DESC", CONNECTION_SYNCH); // ItemBonusTreeNode.db2 - PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, BonusTreeModID, SubTreeID, BonusListID FROM item_bonus_tree_node ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_BONUS_TREE_NODE, "SELECT ID, BonusTreeID, BonusTreeModID, SubTreeID, BonusListID FROM item_bonus_tree_node" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemClass.db2 + PrepareStatement(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, Flags, PriceMod, Name FROM item_class ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_CLASS, "SELECT ID, Name_lang FROM item_class_locale WHERE locale = ?", CONNECTION_SYNCH); // ItemCurrencyCost.db2 - PrepareStatement(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemID FROM item_currency_cost ORDER BY ItemID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_CURRENCY_COST, "SELECT ID, ItemId FROM item_currency_cost ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemDisenchantLoot.db2 + PrepareStatement(HOTFIX_SEL_ITEM_DISENCHANT_LOOT, "SELECT ID, ItemClass, ItemSubClass, ItemQuality, MinItemLevel, MaxItemLevel, " + "RequiredDisenchantSkill FROM item_disenchant_loot ORDER BY ID DESC", CONNECTION_SYNCH); // ItemEffect.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, ItemID, OrderIndex, SpellID, `Trigger`, Charges, Cooldown, " - "Category, CategoryCooldown FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_EFFECT, "SELECT ID, ItemID, OrderIndex, SpellID, `Trigger`, Charges, Cooldown, Category, CategoryCooldown, " + "ChrSpecializationID FROM item_effect ORDER BY ID DESC", CONNECTION_SYNCH); // Item.db2 - PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, Class, SubClass, SoundOverrideSubclass, Material, InventoryType, Sheath, " - "FileDataID, GroupSoundsID FROM item ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM, "SELECT ID, Class, SubClass, SoundOverrideSubclass, Material, InventoryType, Sheath, FileDataID, GroupSoundsID" + " FROM item ORDER BY ID DESC", CONNECTION_SYNCH); // ItemExtendedCost.db2 - PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaSlot, RequiredItem1, RequiredItem2, RequiredItem3, RequiredItem4, RequiredItem5, " - "RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, RequiredPersonalArenaRating, ItemPurchaseGroup, " - "RequiredCurrency1, RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, RequiredCurrency5, " - "RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, " + PrepareStatement(HOTFIX_SEL_ITEM_EXTENDED_COST, "SELECT ID, RequiredArenaSlot, RequiredItem1, RequiredItem2, RequiredItem3, RequiredItem4, " + "RequiredItem5, RequiredItemCount1, RequiredItemCount2, RequiredItemCount3, RequiredItemCount4, RequiredItemCount5, " + "RequiredPersonalArenaRating, ItemPurchaseGroup, RequiredCurrency1, RequiredCurrency2, RequiredCurrency3, RequiredCurrency4, " + "RequiredCurrency5, RequiredCurrencyCount1, RequiredCurrencyCount2, RequiredCurrencyCount3, RequiredCurrencyCount4, RequiredCurrencyCount5, " "RequiredFactionId, RequiredFactionStanding, RequirementFlags, RequiredAchievement, RequiredMoney FROM item_extended_cost ORDER BY ID DESC", CONNECTION_SYNCH); + // ItemLimitCategory.db2 + PrepareStatement(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name, Quantity, Flags FROM item_limit_category ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_LIMIT_CATEGORY, "SELECT ID, Name_lang FROM item_limit_category_locale WHERE locale = ?", CONNECTION_SYNCH); + // ItemModifiedAppearance.db2 - PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceModID, AppearanceID, " - "IconFileDataID, `Index` FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, "SELECT ID, ItemID, AppearanceModID, AppearanceID, IconFileDataID, `Index`" + " FROM item_modified_appearance ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemPriceBase.db2 + PrepareStatement(HOTFIX_SEL_ITEM_PRICE_BASE, "SELECT ID, ItemLevel, ArmorFactor, WeaponFactor FROM item_price_base ORDER BY ID DESC", CONNECTION_SYNCH); - // Item-sparse.db2 + // ItemRandomProperties.db2 + PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, InternalName, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " + "Enchantment5, Name FROM item_random_properties ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, "SELECT ID, InternalName_lang, Name_lang FROM item_random_properties_locale" + " WHERE locale = ?", CONNECTION_SYNCH); + + // ItemRandomSuffix.db2 + PrepareStatement(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name, InternalName, Enchantment1, Enchantment2, Enchantment3, Enchantment4, " + "Enchantment5, AllocationPct1, AllocationPct2, AllocationPct3, AllocationPct4, AllocationPct5 FROM item_random_suffix ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_RANDOM_SUFFIX, "SELECT ID, Name_lang, InternalName_lang FROM item_random_suffix_locale WHERE locale = ?", CONNECTION_SYNCH); + + // ItemSparse.db2 PrepareStatement(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Quality, Flags1, Flags2, Flags3, Unk1, Unk2, BuyCount, BuyPrice, SellPrice, InventoryType, " - "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredSpell, RequiredHonorRank, RequiredCityRank, " - "RequiredReputationFaction, RequiredReputationRank, MaxCount, Stackable, ContainerSlots, " - "ItemStatType1, ItemStatType2, ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, " - "ItemStatValue1, ItemStatValue2, ItemStatValue3, ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, ItemStatValue10, " - "ItemStatAllocation1, ItemStatAllocation2, ItemStatAllocation3, ItemStatAllocation4, ItemStatAllocation5, " - "ItemStatAllocation6, ItemStatAllocation7, ItemStatAllocation8, ItemStatAllocation9, ItemStatAllocation10, " - "ItemStatSocketCostMultiplier1, ItemStatSocketCostMultiplier2, ItemStatSocketCostMultiplier3, ItemStatSocketCostMultiplier4, ItemStatSocketCostMultiplier5, " - "ItemStatSocketCostMultiplier6, ItemStatSocketCostMultiplier7, ItemStatSocketCostMultiplier8, ItemStatSocketCostMultiplier9, ItemStatSocketCostMultiplier10, " - "ScalingStatDistribution, DamageType, Delay, RangedModRange, Bonding, Name, Name2, Name3, Name4, Description, PageText, LanguageID, PageMaterial, " - "StartQuest, LockID, Material, Sheath, RandomProperty, RandomSuffix, ItemSet, Area, Map, BagFamily, TotemCategory, " - "SocketColor1, SocketColor2, SocketColor3, SocketBonus, GemProperties, ArmorDamageModifier, Duration, ItemLimitCategory, " + "AllowableClass, AllowableRace, ItemLevel, RequiredLevel, RequiredSkill, RequiredSkillRank, RequiredSpell, RequiredHonorRank, " + "RequiredCityRank, RequiredReputationFaction, RequiredReputationRank, MaxCount, Stackable, ContainerSlots, ItemStatType1, ItemStatType2, " + "ItemStatType3, ItemStatType4, ItemStatType5, ItemStatType6, ItemStatType7, ItemStatType8, ItemStatType9, ItemStatType10, ItemStatValue1, " + "ItemStatValue2, ItemStatValue3, ItemStatValue4, ItemStatValue5, ItemStatValue6, ItemStatValue7, ItemStatValue8, ItemStatValue9, " + "ItemStatValue10, ItemStatAllocation1, ItemStatAllocation2, ItemStatAllocation3, ItemStatAllocation4, ItemStatAllocation5, " + "ItemStatAllocation6, ItemStatAllocation7, ItemStatAllocation8, ItemStatAllocation9, ItemStatAllocation10, ItemStatSocketCostMultiplier1, " + "ItemStatSocketCostMultiplier2, ItemStatSocketCostMultiplier3, ItemStatSocketCostMultiplier4, ItemStatSocketCostMultiplier5, " + "ItemStatSocketCostMultiplier6, ItemStatSocketCostMultiplier7, ItemStatSocketCostMultiplier8, ItemStatSocketCostMultiplier9, " + "ItemStatSocketCostMultiplier10, ScalingStatDistribution, DamageType, Delay, RangedModRange, Bonding, Name, Name2, Name3, Name4, Description, " + "PageText, LanguageID, PageMaterial, StartQuest, LockID, Material, Sheath, RandomProperty, RandomSuffix, ItemSet, Area, Map, BagFamily, " + "TotemCategory, SocketColor1, SocketColor2, SocketColor3, SocketBonus, GemProperties, ArmorDamageModifier, Duration, ItemLimitCategory, " "HolidayID, StatScalingFactor, CurrencySubstitutionID, CurrencySubstitutionCount, ItemNameDescriptionID FROM item_sparse ORDER BY ID DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Name_lang, Name2_lang, Name3_lang, Name4_lang, Description_lang FROM item_sparse_locale WHERE locale = ?", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Name_lang, Name2_lang, Name3_lang, Name4_lang, Description_lang FROM item_sparse_locale" + " WHERE locale = ?", CONNECTION_SYNCH); + + // ItemSpec.db2 + PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecID FROM item_spec" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // ItemSpecOverride.db2 + PrepareStatement(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, ItemID, SpecID FROM item_spec_override ORDER BY ID DESC", CONNECTION_SYNCH); // ItemXBonusTree.db2 PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemID, BonusTreeID FROM item_x_bonus_tree ORDER BY ID DESC", CONNECTION_SYNCH); // KeyChain.db2 - PrepareStatement(HOTFIX_SEL_KEY_CHAIN, "SELECT Id, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, Key15, Key16, " - "Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM key_chain ORDER BY Id DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_KEY_CHAIN, "SELECT Id, Key1, Key2, Key3, Key4, Key5, Key6, Key7, Key8, Key9, Key10, Key11, Key12, Key13, Key14, " + "Key15, Key16, Key17, Key18, Key19, Key20, Key21, Key22, Key23, Key24, Key25, Key26, Key27, Key28, Key29, Key30, Key31, Key32 FROM key_chain" + " ORDER BY Id DESC", CONNECTION_SYNCH); + + // MailTemplate.db2 + PrepareStatement(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body FROM mail_template ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_MAIL_TEMPLATE, "SELECT ID, Body_lang FROM mail_template_locale WHERE locale = ?", CONNECTION_SYNCH); // Mount.db2 - PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Id, MountTypeId, DisplayId, Flags, Name, Description, SourceDescription, " - "Source, SpellId, PlayerConditionId FROM mount ORDER BY Id DESC", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT ID, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_MOUNT, "SELECT Id, MountTypeId, DisplayId, Flags, Name, Description, SourceDescription, Source, SpellId, " + "PlayerConditionId FROM mount ORDER BY Id DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_MOUNT, "SELECT Id, Name_lang, Description_lang, SourceDescription_lang FROM mount_locale WHERE locale = ?", CONNECTION_SYNCH); + + // MountCapability.db2 + PrepareStatement(HOTFIX_SEL_MOUNT_CAPABILITY, "SELECT ID, Flags, RequiredRidingSkill, RequiredArea, RequiredAura, RequiredSpell, SpeedModSpell, " + "RequiredMap FROM mount_capability ORDER BY ID DESC", CONNECTION_SYNCH); + + // MountType.db2 + PrepareStatement(HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, "SELECT ID, MountTypeID, OrderIndex, MountCapabilityID FROM mount_type_x_capability ORDER BY ID DESC", CONNECTION_SYNCH); + + // NameGen.db2 + PrepareStatement(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name, Race, Sex FROM name_gen ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_NAME_GEN, "SELECT ID, Name_lang FROM name_gen_locale WHERE locale = ?", CONNECTION_SYNCH); // OverrideSpellData.db2 - PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, SpellID1, SpellID2, SpellID3, SpellID4, SpellID5, " - "SpellID6, SpellID7, SpellID8, SpellID9, SpellID10, Flags, PlayerActionbarFileDataID FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_OVERRIDE_SPELL_DATA, "SELECT ID, SpellID1, SpellID2, SpellID3, SpellID4, SpellID5, SpellID6, SpellID7, SpellID8, " + "SpellID9, SpellID10, Flags, PlayerActionbarFileDataID FROM override_spell_data ORDER BY ID DESC", CONNECTION_SYNCH); - // PhaseGroup.db2 - PrepareStatement(HOTFIX_SEL_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_group ORDER BY ID DESC", CONNECTION_SYNCH); + // PhaseXPhaseGroup.db2 + PrepareStatement(HOTFIX_SEL_PHASE_X_PHASE_GROUP, "SELECT ID, PhaseID, PhaseGroupID FROM phase_group ORDER BY ID DESC", CONNECTION_SYNCH); + + // QuestMoneyReward.db2 + PrepareStatement(HOTFIX_SEL_QUEST_MONEY_REWARD, "SELECT Level, Money1, Money2, Money3, Money4, Money5, Money6, Money7, Money8, Money9, Money10" + " FROM quest_money_reward ORDER BY Level DESC", CONNECTION_SYNCH); // QuestPackageItem.db2 PrepareStatement(HOTFIX_SEL_QUEST_PACKAGE_ITEM, "SELECT ID, QuestPackageID, ItemID, ItemCount, FilterType FROM quest_package_item ORDER BY ID DESC", CONNECTION_SYNCH); + // QuestSort.db2 + PrepareStatement(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName FROM quest_sort ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_QUEST_SORT, "SELECT ID, SortName_lang FROM quest_sort_locale WHERE locale = ?", CONNECTION_SYNCH); + + // QuestV2.db2 + PrepareStatement(HOTFIX_SEL_QUEST_V2, "SELECT ID, UniqueBitFlag FROM quest_v2 ORDER BY ID DESC", CONNECTION_SYNCH); + + // QuestXP.db2 + PrepareStatement(HOTFIX_SEL_QUEST_XP, "SELECT ID, Exp1, Exp2, Exp3, Exp4, Exp5, Exp6, Exp7, Exp8, Exp9, Exp10 FROM quest_xp ORDER BY ID DESC", CONNECTION_SYNCH); + + // ScalingStatDistribution.db2 + PrepareStatement(HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, "SELECT ID, MinLevel, MaxLevel, ItemLevelCurveID FROM scaling_stat_distribution" + " ORDER BY ID DESC", CONNECTION_SYNCH); + // SoundEntries.db2 PrepareStatement(HOTFIX_SEL_SOUND_ENTRIES, "SELECT ID, SoundType, Name, FileDataID1, FileDataID2, FileDataID3, FileDataID4, FileDataID5, " "FileDataID6, FileDataID7, FileDataID8, FileDataID9, FileDataID10, FileDataID11, FileDataID12, FileDataID13, FileDataID14, FileDataID15, " "FileDataID16, FileDataID17, FileDataID18, FileDataID19, FileDataID20, Freq1, Freq2, Freq3, Freq4, Freq5, Freq6, Freq7, Freq8, Freq9, Freq10, " - "Freq11, Freq12, Freq13, Freq14, Freq15, Freq16, Freq17, Freq18, Freq19, Freq20, VolumeFloat, Flags, MinDistance, DistanceCutoff, " - "EAXDef, SoundEntriesAdvancedID, VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, " - "PitchVariationMinus, PitchAdjust, DialogType, BusOverwriteID FROM sound_entries ORDER BY ID DESC", CONNECTION_SYNCH); + "Freq11, Freq12, Freq13, Freq14, Freq15, Freq16, Freq17, Freq18, Freq19, Freq20, VolumeFloat, Flags, MinDistance, DistanceCutoff, EAXDef, " + "SoundEntriesAdvancedID, VolumeVariationPlus, VolumeVariationMinus, PitchVariationPlus, PitchVariationMinus, PitchAdjust, DialogType, " + "BusOverwriteID FROM sound_entries ORDER BY ID DESC", CONNECTION_SYNCH); PREPARE_LOCALE_STMT(HOTFIX_SEL_SOUND_ENTRIES, "SELECT ID, Name_lang FROM sound_entries_locale WHERE locale = ?", CONNECTION_SYNCH); + // SpecializationSpells.db2 + PrepareStatement(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, SpecID, OrderIndex, SpellID, OverridesSpellID, Description" + " FROM specialization_spells ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPECIALIZATION_SPELLS, "SELECT ID, Description_lang FROM specialization_spells_locale WHERE locale = ?", CONNECTION_SYNCH); + // SpellAuraRestrictions.db2 - PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, ExcludeTargetAuraState, " - "CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell FROM spell_aura_restrictions ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, "SELECT ID, CasterAuraState, TargetAuraState, ExcludeCasterAuraState, " + "ExcludeTargetAuraState, CasterAuraSpell, TargetAuraSpell, ExcludeCasterAuraSpell, ExcludeTargetAuraSpell FROM spell_aura_restrictions" + " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellCastingRequirements.db2 - PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, FacingCasterFlags, MinFactionID, MinReputation, " - "RequiredAreasID, RequiredAuraVision, RequiresSpellFocus FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, "SELECT ID, FacingCasterFlags, MinFactionID, MinReputation, RequiredAreasID, " + "RequiredAuraVision, RequiresSpellFocus FROM spell_casting_requirements ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellCastTimes.db2 + PrepareStatement(HOTFIX_SEL_SPELL_CAST_TIMES, "SELECT ID, CastTime, CastTimePerLevel, MinCastTime FROM spell_cast_times ORDER BY ID DESC", CONNECTION_SYNCH); // SpellClassOptions.db2 PrepareStatement(HOTFIX_SEL_SPELL_CLASS_OPTIONS, "SELECT ID, ModalNextSpell, SpellClassMask1, SpellClassMask2, SpellClassMask3, SpellClassMask4, " "SpellClassSet FROM spell_class_options ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellDuration.db2 + PrepareStatement(HOTFIX_SEL_SPELL_DURATION, "SELECT ID, Duration1, Duration2, Duration3 FROM spell_duration ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellItemEnchantmentCondition.db2 + PrepareStatement(HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, "SELECT ID, LTOperandType1, LTOperandType2, LTOperandType3, LTOperandType4, " + "LTOperandType5, LTOperand1, LTOperand2, LTOperand3, LTOperand4, LTOperand5, Operator1, Operator2, Operator3, Operator4, Operator5, " + "RTOperandType1, RTOperandType2, RTOperandType3, RTOperandType4, RTOperandType5, RTOperand1, RTOperand2, RTOperand3, RTOperand4, RTOperand5, " + "Logic1, Logic2, Logic3, Logic4, Logic5 FROM spell_item_enchantment_condition ORDER BY ID DESC", CONNECTION_SYNCH); + // SpellLearnSpell.db2 PrepareStatement(HOTFIX_SEL_SPELL_LEARN_SPELL, "SELECT ID, LearnSpellID, SpellID, OverridesSpellID FROM spell_learn_spell ORDER BY ID DESC", CONNECTION_SYNCH); // SpellMisc.db2 PrepareStatement(HOTFIX_SEL_SPELL_MISC, "SELECT ID, Attributes, AttributesEx, AttributesExB, AttributesExC, AttributesExD, AttributesExE, " - "AttributesExF, AttributesExG, AttributesExH, AttributesExI, AttributesExJ, AttributesExK, AttributesExL, AttributesExM, " - "CastingTimeIndex, DurationIndex, RangeIndex, Speed, SpellVisualID1, SpellVisualID2, SpellIconID, ActiveIconID, " - "SchoolMask, MultistrikeSpeedMod FROM spell_misc ORDER BY ID DESC", CONNECTION_SYNCH); + "AttributesExF, AttributesExG, AttributesExH, AttributesExI, AttributesExJ, AttributesExK, AttributesExL, AttributesExM, CastingTimeIndex, " + "DurationIndex, RangeIndex, Speed, SpellIconID, ActiveIconID, SchoolMask, MultistrikeSpeedMod FROM spell_misc" + " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPower.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, SpellID, PowerIndex, PowerType, ManaCost, ManaCostPerLevel, ManaCostPerSecond, ManaCostAdditional, " - "PowerDisplayID, UnitPowerBarID, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, HealthCostPercentage FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER, "SELECT ID, SpellID, PowerIndex, PowerType, ManaCost, ManaCostPerLevel, ManaCostPerSecond, " + "ManaCostAdditional, PowerDisplayID, UnitPowerBarID, ManaCostPercentage, ManaCostPercentagePerSecond, RequiredAura, HealthCostPercentage" + " FROM spell_power ORDER BY ID DESC", CONNECTION_SYNCH); // SpellPowerDifficulty.db2 - PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty ORDER BY SpellPowerID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_POWER_DIFFICULTY, "SELECT SpellPowerID, DifficultyID, PowerIndex FROM spell_power_difficulty" + " ORDER BY SpellPowerID DESC", CONNECTION_SYNCH); + + // SpellRadius.db2 + PrepareStatement(HOTFIX_SEL_SPELL_RADIUS, "SELECT ID, Radius, RadiusPerLevel, RadiusMin, RadiusMax FROM spell_radius ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellRange.db2 + PrepareStatement(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, MinRangeHostile, MinRangeFriend, MaxRangeHostile, MaxRangeFriend, Flags, DisplayName, " + "DisplayNameShort FROM spell_range ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_SPELL_RANGE, "SELECT ID, DisplayName_lang, DisplayNameShort_lang FROM spell_range_locale WHERE locale = ?", CONNECTION_SYNCH); // SpellReagents.db2 PrepareStatement(HOTFIX_SEL_SPELL_REAGENTS, "SELECT ID, Reagent1, Reagent2, Reagent3, Reagent4, Reagent5, Reagent6, Reagent7, Reagent8, " - "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8, " - "CurrencyID, CurrencyCount FROM spell_reagents ORDER BY ID DESC", CONNECTION_SYNCH); + "ReagentCount1, ReagentCount2, ReagentCount3, ReagentCount4, ReagentCount5, ReagentCount6, ReagentCount7, ReagentCount8 " + " FROM spell_reagents ORDER BY ID DESC", CONNECTION_SYNCH); // SpellRuneCost.db2 - PrepareStatement(HOTFIX_SEL_SPELL_RUNE_COST, "SELECT ID, Blood, Unholy, Frost, Chromatic, RunicPower FROM spell_rune_cost ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_RUNE_COST, "SELECT ID, Blood, Unholy, Frost, Chromatic, RunicPower FROM spell_rune_cost" + " ORDER BY ID DESC", CONNECTION_SYNCH); // SpellTotems.db2 - PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, RequiredTotemCategoryID1, RequiredTotemCategoryID2, Totem1, Totem2 FROM spell_totems ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_SPELL_TOTEMS, "SELECT ID, RequiredTotemCategoryID1, RequiredTotemCategoryID2, Totem1, Totem2 FROM spell_totems" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // SpellXSpellVisual.db2 + PrepareStatement(HOTFIX_SEL_SPELL_X_SPELL_VISUAL, "SELECT ID, SpellID, DifficultyID, SpellVisualID1, SpellVisualID2, Unk620, PlayerConditionID, " + "Flags FROM spell_x_spell_visual ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiNodes.db2 PrepareStatement(HOTFIX_SEL_TAXI_NODES, "SELECT ID, MapID, PosX, PosY, PosZ, Name, MountCreatureID1, MountCreatureID2, ConditionID, " @@ -236,6 +410,30 @@ void HotfixDatabaseConnection::DoPrepareStatements() PrepareStatement(HOTFIX_SEL_TAXI_PATH, "SELECT ID, `From`, `To`, Cost FROM taxi_path ORDER BY ID DESC", CONNECTION_SYNCH); // TaxiPathNode.db2 - PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT ID, PathID, NodeIndex, MapID, LocX, LocY, LocZ, Flags, Delay, " - "ArrivalEventID, DepartureEventID FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); + PrepareStatement(HOTFIX_SEL_TAXI_PATH_NODE, "SELECT ID, PathID, NodeIndex, MapID, LocX, LocY, LocZ, Flags, Delay, ArrivalEventID, " + "DepartureEventID FROM taxi_path_node ORDER BY ID DESC", CONNECTION_SYNCH); + + // TotemCategory.db2 + PrepareStatement(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name, CategoryType, CategoryMask FROM totem_category ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_TOTEM_CATEGORY, "SELECT ID, Name_lang FROM totem_category_locale WHERE locale = ?", CONNECTION_SYNCH); + + // TransportAnimation.db2 + PrepareStatement(HOTFIX_SEL_TRANSPORT_ANIMATION, "SELECT ID, TransportID, TimeIndex, PosX, PosY, PosZ, SequenceID FROM transport_animation" + " ORDER BY ID DESC", CONNECTION_SYNCH); + + // TransportRotation.db2 + PrepareStatement(HOTFIX_SEL_TRANSPORT_ROTATION, "SELECT ID, TransportID, TimeIndex, X, Y, Z, W FROM transport_rotation ORDER BY ID DESC", CONNECTION_SYNCH); + + // UnitPowerBar.db2 + PrepareStatement(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, MinPower, MaxPower, StartPower, CenterPower, RegenerationPeace, RegenerationCombat, " + "BarType, FileDataID1, FileDataID2, FileDataID3, FileDataID4, FileDataID5, FileDataID6, Color1, Color2, Color3, Color4, Color5, Color6, " + "Flags, Name, Cost, OutOfError, ToolTip, StartInset, EndInset FROM unit_power_bar ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_UNIT_POWER_BAR, "SELECT ID, Name_lang, Cost_lang, OutOfError_lang, ToolTip_lang FROM unit_power_bar_locale" + " WHERE locale = ?", CONNECTION_SYNCH); + + // WorldMapOverlay.db2 + PrepareStatement(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, MapAreaID, AreaID1, AreaID2, AreaID3, AreaID4, TextureName, TextureWidth, " + "TextureHeight, OffsetX, OffsetY, HitRectTop, HitRectLeft, HitRectBottom, HitRectRight, PlayerConditionID FROM world_map_overlay" + " ORDER BY ID DESC", CONNECTION_SYNCH); + PREPARE_LOCALE_STMT(HOTFIX_SEL_WORLD_MAP_OVERLAY, "SELECT ID, TextureName_lang FROM world_map_overlay_locale WHERE locale = ?", CONNECTION_SYNCH); } diff --git a/src/server/shared/Database/Implementation/HotfixDatabase.h b/src/server/shared/Database/Implementation/HotfixDatabase.h index 4adf555dc2f..c92b7b23499 100644 --- a/src/server/shared/Database/Implementation/HotfixDatabase.h +++ b/src/server/shared/Database/Implementation/HotfixDatabase.h @@ -46,17 +46,42 @@ enum HotfixDatabaseStatements HOTFIX_SEL_AREA_GROUP_MEMBER, + HOTFIX_SEL_AUCTION_HOUSE, + HOTFIX_SEL_AUCTION_HOUSE_LOCALE, + + HOTFIX_SEL_BARBER_SHOP_STYLE, + HOTFIX_SEL_BARBER_SHOP_STYLE_LOCALE, + HOTFIX_SEL_BROADCAST_TEXT, HOTFIX_SEL_BROADCAST_TEXT_LOCALE, + HOTFIX_SEL_CHAR_START_OUTFIT, + + HOTFIX_SEL_CHR_CLASSES_X_POWER_TYPES, + + HOTFIX_SEL_CINEMATIC_SEQUENCES, + + HOTFIX_SEL_CREATURE_DISPLAY_INFO, + HOTFIX_SEL_CREATURE_DISPLAY_INFO_LOCALE, + + HOTFIX_SEL_CREATURE_TYPE, + HOTFIX_SEL_CREATURE_TYPE_LOCALE, + HOTFIX_SEL_CURRENCY_TYPES, HOTFIX_SEL_CURRENCY_TYPES_LOCALE, HOTFIX_SEL_CURVE_POINT, + HOTFIX_SEL_DESTRUCTIBLE_MODEL_DATA, + + HOTFIX_SEL_DURABILITY_QUALITY, + HOTFIX_SEL_GAMEOBJECTS, HOTFIX_SEL_GAMEOBJECTS_LOCALE, + HOTFIX_SEL_GAME_TABLES, + HOTFIX_SEL_GAME_TABLES_LOCALE, + HOTFIX_SEL_GARR_ABILITY, HOTFIX_SEL_GARR_ABILITY_LOCALE, @@ -85,50 +110,112 @@ enum HotfixDatabaseStatements HOTFIX_SEL_GARR_SITE_LEVEL_PLOT_INST, + HOTFIX_SEL_GLYPH_SLOT, + + HOTFIX_SEL_GUILD_PERK_SPELLS, + HOTFIX_SEL_HOLIDAYS, HOTFIX_SEL_HOLIDAYS_LOCALE, + HOTFIX_SEL_IMPORT_PRICE_ARMOR, + + HOTFIX_SEL_IMPORT_PRICE_QUALITY, + + HOTFIX_SEL_IMPORT_PRICE_SHIELD, + + HOTFIX_SEL_IMPORT_PRICE_WEAPON, + HOTFIX_SEL_ITEM_APPEARANCE, HOTFIX_SEL_ITEM_BONUS, HOTFIX_SEL_ITEM_BONUS_TREE_NODE, + HOTFIX_SEL_ITEM_CLASS, + HOTFIX_SEL_ITEM_CLASS_LOCALE, + HOTFIX_SEL_ITEM_CURRENCY_COST, + HOTFIX_SEL_ITEM_DISENCHANT_LOOT, + HOTFIX_SEL_ITEM_EFFECT, HOTFIX_SEL_ITEM, HOTFIX_SEL_ITEM_EXTENDED_COST, + HOTFIX_SEL_ITEM_LIMIT_CATEGORY, + HOTFIX_SEL_ITEM_LIMIT_CATEGORY_LOCALE, + HOTFIX_SEL_ITEM_MODIFIED_APPEARANCE, + HOTFIX_SEL_ITEM_PRICE_BASE, + + HOTFIX_SEL_ITEM_RANDOM_PROPERTIES, + HOTFIX_SEL_ITEM_RANDOM_PROPERTIES_LOCALE, + + HOTFIX_SEL_ITEM_RANDOM_SUFFIX, + HOTFIX_SEL_ITEM_RANDOM_SUFFIX_LOCALE, + HOTFIX_SEL_ITEM_SPARSE, HOTFIX_SEL_ITEM_SPARSE_LOCALE, + HOTFIX_SEL_ITEM_SPEC, + + HOTFIX_SEL_ITEM_SPEC_OVERRIDE, + HOTFIX_SEL_ITEM_X_BONUS_TREE, HOTFIX_SEL_KEY_CHAIN, + HOTFIX_SEL_MAIL_TEMPLATE, + HOTFIX_SEL_MAIL_TEMPLATE_LOCALE, + HOTFIX_SEL_MOUNT, HOTFIX_SEL_MOUNT_LOCALE, + HOTFIX_SEL_MOUNT_CAPABILITY, + + HOTFIX_SEL_MOUNT_TYPE_X_CAPABILITY, + + HOTFIX_SEL_NAME_GEN, + HOTFIX_SEL_NAME_GEN_LOCALE, + HOTFIX_SEL_OVERRIDE_SPELL_DATA, - HOTFIX_SEL_PHASE_GROUP, + HOTFIX_SEL_PHASE_X_PHASE_GROUP, + + HOTFIX_SEL_QUEST_MONEY_REWARD, HOTFIX_SEL_QUEST_PACKAGE_ITEM, + HOTFIX_SEL_QUEST_SORT, + HOTFIX_SEL_QUEST_SORT_LOCALE, + + HOTFIX_SEL_QUEST_V2, + + HOTFIX_SEL_QUEST_XP, + + HOTFIX_SEL_SCALING_STAT_DISTRIBUTION, + HOTFIX_SEL_SOUND_ENTRIES, HOTFIX_SEL_SOUND_ENTRIES_LOCALE, + HOTFIX_SEL_SPECIALIZATION_SPELLS, + HOTFIX_SEL_SPECIALIZATION_SPELLS_LOCALE, + HOTFIX_SEL_SPELL_AURA_RESTRICTIONS, HOTFIX_SEL_SPELL_CASTING_REQUIREMENTS, + HOTFIX_SEL_SPELL_CAST_TIMES, + HOTFIX_SEL_SPELL_CLASS_OPTIONS, + HOTFIX_SEL_SPELL_DURATION, + + HOTFIX_SEL_SPELL_ITEM_ENCHANTMENT_CONDITION, + HOTFIX_SEL_SPELL_LEARN_SPELL, HOTFIX_SEL_SPELL_MISC, @@ -137,12 +224,19 @@ enum HotfixDatabaseStatements HOTFIX_SEL_SPELL_POWER_DIFFICULTY, + HOTFIX_SEL_SPELL_RADIUS, + + HOTFIX_SEL_SPELL_RANGE, + HOTFIX_SEL_SPELL_RANGE_LOCALE, + HOTFIX_SEL_SPELL_REAGENTS, HOTFIX_SEL_SPELL_RUNE_COST, HOTFIX_SEL_SPELL_TOTEMS, + HOTFIX_SEL_SPELL_X_SPELL_VISUAL, + HOTFIX_SEL_TAXI_NODES, HOTFIX_SEL_TAXI_NODES_LOCALE, @@ -150,6 +244,19 @@ enum HotfixDatabaseStatements HOTFIX_SEL_TAXI_PATH_NODE, + HOTFIX_SEL_TOTEM_CATEGORY, + HOTFIX_SEL_TOTEM_CATEGORY_LOCALE, + + HOTFIX_SEL_TRANSPORT_ANIMATION, + + HOTFIX_SEL_TRANSPORT_ROTATION, + + HOTFIX_SEL_UNIT_POWER_BAR, + HOTFIX_SEL_UNIT_POWER_BAR_LOCALE, + + HOTFIX_SEL_WORLD_MAP_OVERLAY, + HOTFIX_SEL_WORLD_MAP_OVERLAY_LOCALE, + MAX_HOTFIXDATABASE_STATEMENTS }; diff --git a/src/server/shared/Database/Implementation/LoginDatabase.cpp b/src/server/shared/Database/Implementation/LoginDatabase.cpp index 99d6cb7af50..51a0217ac17 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.cpp +++ b/src/server/shared/Database/Implementation/LoginDatabase.cpp @@ -34,12 +34,17 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_ALL, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 GROUP BY account.id", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_BANNED_BY_USERNAME, "SELECT account.id, username FROM account, account_banned WHERE account.id = account_banned.id AND active = 1 AND username LIKE CONCAT('%%', ?, '%%') GROUP BY account.id", CONNECTION_SYNCH); PrepareStatement(LOGIN_DEL_ACCOUNT_BANNED, "DELETE FROM account_banned WHERE id = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION, "SELECT username, sessionkey FROM account WHERE id = ?", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_CONTINUED_SESSION, "SELECT username, sessionkey FROM account WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_VS, "UPDATE account SET v = ?, s = ? WHERE username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_LOGON_COUNTRY, "SELECT country FROM ip2nation WHERE ip < ? ORDER BY ip DESC LIMIT 0,1", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_ID_BY_NAME, "SELECT id FROM account WHERE username = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_NAME, "SELECT id, username FROM account WHERE username = ?", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT id, sessionkey, last_ip, locked, expansion, mutetime, locale, recruiter, os FROM account WHERE username = ?", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_ACCOUNT_INFO_BY_NAME, "SELECT a.id, a.sessionkey, ba.last_ip, ba.locked, a.expansion, a.mutetime, ba.locale, a.recruiter, ba.os, ba.id, aa.gmLevel, " + "bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, r.id " + "FROM account a LEFT JOIN battlenet_accounts ba ON a.battlenet_account = ba.id LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID IN (-1, ?) " + "LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account r ON a.id = r.recruiter " + "WHERE a.username = ? ORDER BY aa.RealmID DESC LIMIT 1", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_ACCOUNT_LIST_BY_EMAIL, "SELECT id, username FROM account WHERE email = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_BY_IP, "SELECT id, username FROM account WHERE last_ip = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_BY_ID, "SELECT 1 FROM account WHERE id = ?", CONNECTION_SYNCH); @@ -83,8 +88,6 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_ACCOUNT_INFO, "SELECT a.username, a.last_ip, aa.gmlevel, a.expansion FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, "SELECT 1 FROM account_access WHERE id = ? AND gmlevel > ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS, "SELECT a.id, aa.gmlevel, aa.RealmID FROM account a LEFT JOIN account_access aa ON (a.id = aa.id) WHERE a.username = ?", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_ACCOUNT_RECRUITER, "SELECT 1 FROM account WHERE recruiter = ?", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_BANS, "SELECT 1 FROM account_banned WHERE id = ? AND active = 1 UNION SELECT 1 FROM ip_banned WHERE ip = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_ACCOUNT_WHOIS, "SELECT username, email, last_ip FROM account WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_LAST_ATTEMPT_IP, "SELECT last_attempt_ip FROM account WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_LAST_IP, "SELECT last_ip FROM account WHERE id = ?", CONNECTION_SYNCH); @@ -103,7 +106,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_INS_FALP_IP_LOGGING, "INSERT INTO logs_ip_actions (account_id,character_guid,type,ip,systemnote,unixtime,time) VALUES ((SELECT id FROM account WHERE username = ?), 0, 1, ?, ?, unix_timestamp(NOW()), NOW())", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_ACCOUNT_ACCESS_BY_ID, "SELECT gmlevel, RealmID FROM account_access WHERE id = ? and (RealmID = ? OR RealmID = -1) ORDER BY gmlevel desc", CONNECTION_SYNCH); - PrepareStatement(LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS, "SELECT permissionId, granted FROM rbac_account_permissions WHERE accountId = ? AND (realmId = ? OR realmId = -1) ORDER BY permissionId, realmId", CONNECTION_SYNCH); + PrepareStatement(LOGIN_SEL_RBAC_ACCOUNT_PERMISSIONS, "SELECT permissionId, granted FROM rbac_account_permissions WHERE accountId = ? AND (realmId = ? OR realmId = -1) ORDER BY permissionId, realmId", CONNECTION_BOTH); PrepareStatement(LOGIN_INS_RBAC_ACCOUNT_PERMISSION, "INSERT INTO rbac_account_permissions (accountId, permissionId, granted, realmId) VALUES (?, ?, ?, ?) ON DUPLICATE KEY UPDATE granted = VALUES(granted)", CONNECTION_ASYNC); PrepareStatement(LOGIN_DEL_RBAC_ACCOUNT_PERMISSION, "DELETE FROM rbac_account_permissions WHERE accountId = ? AND permissionId = ? AND (realmId = ? OR realmId = -1)", CONNECTION_ASYNC); @@ -113,10 +116,14 @@ void LoginDatabaseConnection::DoPrepareStatements() #define BnetAccountInfo "ba.id, UPPER(ba.email), ba.locked, ba.lock_country, ba.last_ip, ba.failed_logins, bab.unbandate > UNIX_TIMESTAMP() OR bab.unbandate = bab.bandate, bab.unbandate = bab.bandate" #define BnetGameAccountInfo "a.id, a.username, ab.unbandate > UNIX_TIMESTAMP() OR ab.unbandate = ab.bandate, ab.unbandate = ab.bandate, aa.gmlevel" - PrepareStatement(LOGIN_SEL_BNET_ACCOUNT_INFO, "SELECT " BnetAccountInfo ", ba.sha_pass_hash, ba.v, ba.s, " BnetGameAccountInfo " FROM battlenet_accounts ba LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account a ON ba.id = a.battlenet_account LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID = -1 WHERE ba.email = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_BNET_ACCOUNT_INFO, "SELECT " BnetAccountInfo ", ba.sha_pass_hash, ba.v, ba.s, " BnetGameAccountInfo + " FROM battlenet_accounts ba LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account a ON ba.id = a.battlenet_account" + " LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID = -1 WHERE ba.email = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_BNET_VS_FIELDS, "UPDATE battlenet_accounts SET v = ?, s = ? WHERE email = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_BNET_SESSION_KEY, "UPDATE battlenet_accounts SET sessionKey = ?, online = ? WHERE id = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_SEL_BNET_RECONNECT_INFO, "SELECT " BnetAccountInfo ", ba.sessionKey, " BnetGameAccountInfo " FROM battlenet_accounts ba LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account a ON ba.id = a.battlenet_account LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID = -1 WHERE ba.email = ? AND a.username = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_BNET_RECONNECT_INFO, "SELECT " BnetAccountInfo ", ba.sessionKey, " BnetGameAccountInfo + " FROM battlenet_accounts ba LEFT JOIN battlenet_account_bans bab ON ba.id = bab.id LEFT JOIN account a ON ba.id = a.battlenet_account" + " LEFT JOIN account_banned ab ON a.id = ab.id LEFT JOIN account_access aa ON a.id = aa.id AND aa.RealmID = -1 WHERE ba.email = ? AND a.username = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_BNET_FAILED_LOGINS, "UPDATE battlenet_accounts SET failed_logins = failed_logins + 1 WHERE email = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_BNET_LAST_LOGIN_INFO, "UPDATE battlenet_accounts SET last_ip = ?, last_login = NOW(), locale = ?, failed_logins = 0, os = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_BNET_CHARACTER_COUNTS, "SELECT rc.numchars, r.id, r.Region, r.Battlegroup, r.gamebuild FROM realmcharacters rc INNER JOIN realmlist r ON rc.realmid = r.id WHERE rc.acctid = ?", CONNECTION_ASYNC); @@ -124,7 +131,7 @@ void LoginDatabaseConnection::DoPrepareStatements() PrepareStatement(LOGIN_SEL_BNET_ACCOUNT_EMAIL_BY_ID, "SELECT email FROM battlenet_accounts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_SEL_BNET_ACCOUNT_ID_BY_EMAIL, "SELECT id FROM battlenet_accounts WHERE email = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_UPD_BNET_PASSWORD, "UPDATE battlenet_accounts SET v = '', s = '', sha_pass_hash = ? WHERE id = ?", CONNECTION_ASYNC); - PrepareStatement(LOGIN_SEL_BNET_CHECK_PASSWORD, "SELECT 1 FROM battlenet_accounts WHERE id = ? AND sha_pass_hash = ?", CONNECTION_ASYNC); + PrepareStatement(LOGIN_SEL_BNET_CHECK_PASSWORD, "SELECT 1 FROM battlenet_accounts WHERE id = ? AND sha_pass_hash = ?", CONNECTION_SYNCH); PrepareStatement(LOGIN_UPD_BNET_ACCOUNT_LOCK, "UPDATE battlenet_accounts SET locked = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_UPD_BNET_ACCOUNT_LOCK_CONTRY, "UPDATE battlenet_accounts SET lock_country = ? WHERE id = ?", CONNECTION_ASYNC); PrepareStatement(LOGIN_SEL_BNET_ACCOUNT_ID_BY_GAME_ACCOUNT, "SELECT battlenet_account FROM account WHERE id = ?", CONNECTION_SYNCH); diff --git a/src/server/shared/Database/Implementation/LoginDatabase.h b/src/server/shared/Database/Implementation/LoginDatabase.h index c0aa178f199..06d13f29da3 100644 --- a/src/server/shared/Database/Implementation/LoginDatabase.h +++ b/src/server/shared/Database/Implementation/LoginDatabase.h @@ -101,8 +101,6 @@ enum LoginDatabaseStatements LOGIN_SEL_ACCOUNT_INFO, LOGIN_SEL_ACCOUNT_ACCESS_GMLEVEL_TEST, LOGIN_SEL_ACCOUNT_ACCESS, - LOGIN_SEL_ACCOUNT_RECRUITER, - LOGIN_SEL_BANS, LOGIN_SEL_ACCOUNT_WHOIS, LOGIN_SEL_REALMLIST_SECURITY_LEVEL, LOGIN_DEL_ACCOUNT, diff --git a/src/server/shared/Database/Implementation/WorldDatabase.cpp b/src/server/shared/Database/Implementation/WorldDatabase.cpp index 28c4f43b1ea..4650f43ee0a 100644 --- a/src/server/shared/Database/Implementation/WorldDatabase.cpp +++ b/src/server/shared/Database/Implementation/WorldDatabase.cpp @@ -76,7 +76,7 @@ void WorldDatabaseConnection::DoPrepareStatements() PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_ID_BY_GUID, "SELECT id FROM waypoint_scripts WHERE guid = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_DEL_CREATURE, "DELETE FROM creature WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(WORLD_SEL_COMMANDS, "SELECT name, permission, help FROM command", CONNECTION_SYNCH); - PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, femaleName, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, PetSpellDataId, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); + PrepareStatement(WORLD_SEL_CREATURE_TEMPLATE, "SELECT entry, difficulty_entry_1, difficulty_entry_2, difficulty_entry_3, KillCredit1, KillCredit2, modelid1, modelid2, modelid3, modelid4, name, femaleName, subname, IconName, gossip_menu_id, minlevel, maxlevel, exp, exp_unk, faction, npcflag, speed_walk, speed_run, scale, rank, dmgschool, BaseAttackTime, RangeAttackTime, BaseVariance, RangeVariance, unit_class, unit_flags, unit_flags2, dynamicflags, family, trainer_type, trainer_class, trainer_race, type, type_flags, type_flags2, lootid, pickpocketloot, skinloot, resistance1, resistance2, resistance3, resistance4, resistance5, resistance6, spell1, spell2, spell3, spell4, spell5, spell6, spell7, spell8, VehicleId, mingold, maxgold, AIName, MovementType, InhabitType, HoverHeight, HealthModifier, HealthModifierExtra, ManaModifier, ManaModifierExtra, ArmorModifier, DamageModifier, ExperienceModifier, RacialLeader, movementId, RegenHealth, mechanic_immune_mask, flags_extra, ScriptName FROM creature_template WHERE entry = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_WAYPOINT_SCRIPT_BY_ID, "SELECT guid, delay, command, datalong, datalong2, dataint, x, y, z, o FROM waypoint_scripts WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_CREATURE_BY_ID, "SELECT guid FROM creature WHERE id = ?", CONNECTION_SYNCH); PrepareStatement(WORLD_SEL_GAMEOBJECT_NEAREST, "SELECT guid, id, position_x, position_y, position_z, map, (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) AS order_ FROM gameobject WHERE map = ? AND (POW(position_x - ?, 2) + POW(position_y - ?, 2) + POW(position_z - ?, 2)) <= ? ORDER BY order_", CONNECTION_SYNCH); diff --git a/src/server/shared/Debugging/WheatyExceptionReport.cpp b/src/server/shared/Debugging/WheatyExceptionReport.cpp index f8f641a9ea7..e9f888f280d 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.cpp +++ b/src/server/shared/Debugging/WheatyExceptionReport.cpp @@ -61,6 +61,9 @@ HANDLE WheatyExceptionReport::m_hDumpFile; HANDLE WheatyExceptionReport::m_hProcess; SymbolPairs WheatyExceptionReport::symbols; std::stack<SymbolDetail> WheatyExceptionReport::symbolDetails; +bool WheatyExceptionReport::stackOverflowException; +bool WheatyExceptionReport::alreadyCrashed; +std::mutex WheatyExceptionReport::alreadyCrashedLock; // Declare global instance of class WheatyExceptionReport g_WheatyExceptionReport; @@ -72,6 +75,8 @@ WheatyExceptionReport::WheatyExceptionReport() // Constructor // Install the unhandled exception filter function m_previousFilter = SetUnhandledExceptionFilter(WheatyUnhandledExceptionFilter); m_hProcess = GetCurrentProcess(); + stackOverflowException = false; + alreadyCrashed = false; if (!IsDebuggerPresent()) { _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); @@ -97,6 +102,16 @@ WheatyExceptionReport::~WheatyExceptionReport() LONG WINAPI WheatyExceptionReport::WheatyUnhandledExceptionFilter( PEXCEPTION_POINTERS pExceptionInfo) { + std::unique_lock<std::mutex> guard(alreadyCrashedLock); + // Handle only 1 exception in the whole process lifetime + if (alreadyCrashed) + return EXCEPTION_EXECUTE_HANDLER; + + alreadyCrashed = true; + + if (pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW) + stackOverflowException = true; + TCHAR module_folder_name[MAX_PATH]; GetModuleFileName(0, module_folder_name, MAX_PATH); TCHAR* pos = _tcsrchr(module_folder_name, '\\'); @@ -419,107 +434,114 @@ void WheatyExceptionReport::printTracesForAllThreads(bool bWriteVariables) void WheatyExceptionReport::GenerateExceptionReport( PEXCEPTION_POINTERS pExceptionInfo) { - SYSTEMTIME systime; - GetLocalTime(&systime); - - // Start out with a banner - _tprintf(_T("Revision: %s\r\n"), _FULLVERSION); - _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute); - PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord; - - PrintSystemInfo(); - // First print information about the type of fault - _tprintf(_T("\r\n//=====================================================\r\n")); - _tprintf(_T("Exception code: %08X %s\r\n"), - pExceptionRecord->ExceptionCode, - GetExceptionString(pExceptionRecord->ExceptionCode)); - - // Now print information about where the fault occured - TCHAR szFaultingModule[MAX_PATH]; - DWORD section; - DWORD_PTR offset; - GetLogicalAddress(pExceptionRecord->ExceptionAddress, - szFaultingModule, - sizeof(szFaultingModule), - section, offset); + __try + { + SYSTEMTIME systime; + GetLocalTime(&systime); + + // Start out with a banner + _tprintf(_T("Revision: %s\r\n"), _FULLVERSION); + _tprintf(_T("Date %u:%u:%u. Time %u:%u \r\n"), systime.wDay, systime.wMonth, systime.wYear, systime.wHour, systime.wMinute); + PEXCEPTION_RECORD pExceptionRecord = pExceptionInfo->ExceptionRecord; + + PrintSystemInfo(); + // First print information about the type of fault + _tprintf(_T("\r\n//=====================================================\r\n")); + _tprintf(_T("Exception code: %08X %s\r\n"), + pExceptionRecord->ExceptionCode, + GetExceptionString(pExceptionRecord->ExceptionCode)); + + // Now print information about where the fault occured + TCHAR szFaultingModule[MAX_PATH]; + DWORD section; + DWORD_PTR offset; + GetLogicalAddress(pExceptionRecord->ExceptionAddress, + szFaultingModule, + sizeof(szFaultingModule), + section, offset); #ifdef _M_IX86 - _tprintf(_T("Fault address: %08X %02X:%08X %s\r\n"), - pExceptionRecord->ExceptionAddress, - section, offset, szFaultingModule); + _tprintf(_T("Fault address: %08X %02X:%08X %s\r\n"), + pExceptionRecord->ExceptionAddress, + section, offset, szFaultingModule); #endif #ifdef _M_X64 - _tprintf(_T("Fault address: %016I64X %02X:%016I64X %s\r\n"), - pExceptionRecord->ExceptionAddress, - section, offset, szFaultingModule); + _tprintf(_T("Fault address: %016I64X %02X:%016I64X %s\r\n"), + pExceptionRecord->ExceptionAddress, + section, offset, szFaultingModule); #endif - PCONTEXT pCtx = pExceptionInfo->ContextRecord; + PCONTEXT pCtx = pExceptionInfo->ContextRecord; - // Show the registers - #ifdef _M_IX86 // X86 Only! - _tprintf(_T("\r\nRegisters:\r\n")); + // Show the registers +#ifdef _M_IX86 // X86 Only! + _tprintf(_T("\r\nRegisters:\r\n")); - _tprintf(_T("EAX:%08X\r\nEBX:%08X\r\nECX:%08X\r\nEDX:%08X\r\nESI:%08X\r\nEDI:%08X\r\n") - , pCtx->Eax, pCtx->Ebx, pCtx->Ecx, pCtx->Edx, - pCtx->Esi, pCtx->Edi); + _tprintf(_T("EAX:%08X\r\nEBX:%08X\r\nECX:%08X\r\nEDX:%08X\r\nESI:%08X\r\nEDI:%08X\r\n") + , pCtx->Eax, pCtx->Ebx, pCtx->Ecx, pCtx->Edx, + pCtx->Esi, pCtx->Edi); - _tprintf(_T("CS:EIP:%04X:%08X\r\n"), pCtx->SegCs, pCtx->Eip); - _tprintf(_T("SS:ESP:%04X:%08X EBP:%08X\r\n"), - pCtx->SegSs, pCtx->Esp, pCtx->Ebp); - _tprintf(_T("DS:%04X ES:%04X FS:%04X GS:%04X\r\n"), - pCtx->SegDs, pCtx->SegEs, pCtx->SegFs, pCtx->SegGs); - _tprintf(_T("Flags:%08X\r\n"), pCtx->EFlags); - #endif + _tprintf(_T("CS:EIP:%04X:%08X\r\n"), pCtx->SegCs, pCtx->Eip); + _tprintf(_T("SS:ESP:%04X:%08X EBP:%08X\r\n"), + pCtx->SegSs, pCtx->Esp, pCtx->Ebp); + _tprintf(_T("DS:%04X ES:%04X FS:%04X GS:%04X\r\n"), + pCtx->SegDs, pCtx->SegEs, pCtx->SegFs, pCtx->SegGs); + _tprintf(_T("Flags:%08X\r\n"), pCtx->EFlags); +#endif - #ifdef _M_X64 - _tprintf(_T("\r\nRegisters:\r\n")); - _tprintf(_T("RAX:%016I64X\r\nRBX:%016I64X\r\nRCX:%016I64X\r\nRDX:%016I64X\r\nRSI:%016I64X\r\nRDI:%016I64X\r\n") - _T("R8: %016I64X\r\nR9: %016I64X\r\nR10:%016I64X\r\nR11:%016I64X\r\nR12:%016I64X\r\nR13:%016I64X\r\nR14:%016I64X\r\nR15:%016I64X\r\n") - , pCtx->Rax, pCtx->Rbx, pCtx->Rcx, pCtx->Rdx, - pCtx->Rsi, pCtx->Rdi, pCtx->R9, pCtx->R10, pCtx->R11, pCtx->R12, pCtx->R13, pCtx->R14, pCtx->R15); - _tprintf(_T("CS:RIP:%04X:%016I64X\r\n"), pCtx->SegCs, pCtx->Rip); - _tprintf(_T("SS:RSP:%04X:%016X RBP:%08X\r\n"), - pCtx->SegSs, pCtx->Rsp, pCtx->Rbp); - _tprintf(_T("DS:%04X ES:%04X FS:%04X GS:%04X\r\n"), - pCtx->SegDs, pCtx->SegEs, pCtx->SegFs, pCtx->SegGs); - _tprintf(_T("Flags:%08X\r\n"), pCtx->EFlags); - #endif +#ifdef _M_X64 + _tprintf(_T("\r\nRegisters:\r\n")); + _tprintf(_T("RAX:%016I64X\r\nRBX:%016I64X\r\nRCX:%016I64X\r\nRDX:%016I64X\r\nRSI:%016I64X\r\nRDI:%016I64X\r\n") + _T("R8: %016I64X\r\nR9: %016I64X\r\nR10:%016I64X\r\nR11:%016I64X\r\nR12:%016I64X\r\nR13:%016I64X\r\nR14:%016I64X\r\nR15:%016I64X\r\n") + , pCtx->Rax, pCtx->Rbx, pCtx->Rcx, pCtx->Rdx, + pCtx->Rsi, pCtx->Rdi, pCtx->R9, pCtx->R10, pCtx->R11, pCtx->R12, pCtx->R13, pCtx->R14, pCtx->R15); + _tprintf(_T("CS:RIP:%04X:%016I64X\r\n"), pCtx->SegCs, pCtx->Rip); + _tprintf(_T("SS:RSP:%04X:%016X RBP:%08X\r\n"), + pCtx->SegSs, pCtx->Rsp, pCtx->Rbp); + _tprintf(_T("DS:%04X ES:%04X FS:%04X GS:%04X\r\n"), + pCtx->SegDs, pCtx->SegEs, pCtx->SegFs, pCtx->SegGs); + _tprintf(_T("Flags:%08X\r\n"), pCtx->EFlags); +#endif - SymSetOptions(SYMOPT_DEFERRED_LOADS); + SymSetOptions(SYMOPT_DEFERRED_LOADS); - // Initialize DbgHelp - if (!SymInitialize(GetCurrentProcess(), 0, TRUE)) - { - _tprintf(_T("\n\rCRITICAL ERROR.\n\r Couldn't initialize the symbol handler for process.\n\rError [%s].\n\r\n\r"), - ErrorMessage(GetLastError())); - } + // Initialize DbgHelp + if (!SymInitialize(GetCurrentProcess(), 0, TRUE)) + { + _tprintf(_T("\n\rCRITICAL ERROR.\n\r Couldn't initialize the symbol handler for process.\n\rError [%s].\n\r\n\r"), + ErrorMessage(GetLastError())); + } - CONTEXT trashableContext = *pCtx; + CONTEXT trashableContext = *pCtx; - WriteStackDetails(&trashableContext, false, NULL); - printTracesForAllThreads(false); + WriteStackDetails(&trashableContext, false, NULL); + printTracesForAllThreads(false); -// #ifdef _M_IX86 // X86 Only! + // #ifdef _M_IX86 // X86 Only! - _tprintf(_T("========================\r\n")); - _tprintf(_T("Local Variables And Parameters\r\n")); + _tprintf(_T("========================\r\n")); + _tprintf(_T("Local Variables And Parameters\r\n")); - trashableContext = *pCtx; - WriteStackDetails(&trashableContext, true, NULL); - printTracesForAllThreads(true); + trashableContext = *pCtx; + WriteStackDetails(&trashableContext, true, NULL); + printTracesForAllThreads(true); - /*_tprintf(_T("========================\r\n")); - _tprintf(_T("Global Variables\r\n")); + /*_tprintf(_T("========================\r\n")); + _tprintf(_T("Global Variables\r\n")); - SymEnumSymbols(GetCurrentProcess(), + SymEnumSymbols(GetCurrentProcess(), (UINT_PTR)GetModuleHandle(szFaultingModule), 0, EnumerateSymbolsCallback, 0);*/ - // #endif // X86 Only! + // #endif // X86 Only! - SymCleanup(GetCurrentProcess()); + SymCleanup(GetCurrentProcess()); - _tprintf(_T("\r\n")); + _tprintf(_T("\r\n")); + } + __except (EXCEPTION_EXECUTE_HANDLER) + { + _tprintf(_T("Error writing the crash log\r\n")); + } } //====================================================================== @@ -1313,16 +1335,43 @@ DWORD_PTR WheatyExceptionReport::DereferenceUnsafePointer(DWORD_PTR address) //============================================================================ int __cdecl WheatyExceptionReport::_tprintf(const TCHAR * format, ...) { - TCHAR szBuff[WER_LARGE_BUFFER_SIZE]; int retValue; - DWORD cbWritten; va_list argptr; - va_start(argptr, format); + if (stackOverflowException) + { + retValue = heapprintf(format, argptr); + va_end(argptr); + } + else + { + retValue = stackprintf(format, argptr); + va_end(argptr); + } + + return retValue; +} + +int __cdecl WheatyExceptionReport::stackprintf(const TCHAR * format, va_list argptr) +{ + int retValue; + DWORD cbWritten; + + TCHAR szBuff[WER_LARGE_BUFFER_SIZE]; retValue = vsprintf(szBuff, format, argptr); - va_end(argptr); + WriteFile(m_hReportFile, szBuff, retValue * sizeof(TCHAR), &cbWritten, 0); + return retValue; +} + +int __cdecl WheatyExceptionReport::heapprintf(const TCHAR * format, va_list argptr) +{ + int retValue; + DWORD cbWritten; + TCHAR* szBuff = (TCHAR*)malloc(sizeof(TCHAR) * WER_LARGE_BUFFER_SIZE); + retValue = vsprintf(szBuff, format, argptr); WriteFile(m_hReportFile, szBuff, retValue * sizeof(TCHAR), &cbWritten, 0); + free(szBuff); return retValue; } diff --git a/src/server/shared/Debugging/WheatyExceptionReport.h b/src/server/shared/Debugging/WheatyExceptionReport.h index b7731daaa2b..ef6334add16 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.h +++ b/src/server/shared/Debugging/WheatyExceptionReport.h @@ -178,6 +178,8 @@ class WheatyExceptionReport static DWORD_PTR DereferenceUnsafePointer(DWORD_PTR address); static int __cdecl _tprintf(const TCHAR * format, ...); + static int __cdecl stackprintf(const TCHAR * format, va_list argptr); + static int __cdecl heapprintf(const TCHAR * format, va_list argptr); static bool StoreSymbol(DWORD type , DWORD_PTR offset); static void ClearSymbols(); @@ -191,6 +193,9 @@ class WheatyExceptionReport static HANDLE m_hProcess; static SymbolPairs symbols; static std::stack<SymbolDetail> symbolDetails; + static bool stackOverflowException; + static bool alreadyCrashed; + static std::mutex alreadyCrashedLock; static char* PushSymbolDetail(char* pszCurrBuffer); static char* PopSymbolDetail(char* pszCurrBuffer); diff --git a/src/server/shared/Networking/Socket.h b/src/server/shared/Networking/Socket.h index d337e07ff52..23c4f25b742 100644 --- a/src/server/shared/Networking/Socket.h +++ b/src/server/shared/Networking/Socket.h @@ -169,6 +169,8 @@ protected: MessageBuffer _writeBuffer; #endif + boost::asio::io_service& io_service() { return _socket.get_io_service(); } + private: void ReadHandlerInternal(boost::system::error_code error, size_t transferredBytes) { diff --git a/src/server/shared/PrecompiledHeaders/sharedPCH.h b/src/server/shared/PrecompiledHeaders/sharedPCH.h index d0c15b17f0c..87af9f44eb7 100644 --- a/src/server/shared/PrecompiledHeaders/sharedPCH.h +++ b/src/server/shared/PrecompiledHeaders/sharedPCH.h @@ -6,3 +6,4 @@ #include "SQLOperation.h" #include "Errors.h" #include "TypeList.h" +#include "TaskScheduler.h" diff --git a/src/server/shared/Threading/Callback.h b/src/server/shared/Threading/Callback.h index 16ebc5dbc06..23f2807b253 100644 --- a/src/server/shared/Threading/Callback.h +++ b/src/server/shared/Threading/Callback.h @@ -97,7 +97,7 @@ class QueryCallback //! Resets all underlying variables (param, result and stage) void Reset() { - SetParam(NULL); + SetParam(ParamType()); FreeResult(); ResetStage(); } diff --git a/src/server/shared/Updater/DBUpdater.cpp b/src/server/shared/Updater/DBUpdater.cpp index 10c8c163ec4..9e3bae11610 100644 --- a/src/server/shared/Updater/DBUpdater.cpp +++ b/src/server/shared/Updater/DBUpdater.cpp @@ -271,10 +271,10 @@ bool DBUpdater<T>::Update(DatabaseWorkerPool<T>& pool) [&](Path const& file) { DBUpdater<T>::ApplyFile(pool, file); }, [&](std::string const& query) -> QueryResult { return DBUpdater<T>::Retrieve(pool, query); }); - uint32 count; + UpdateResult result; try { - count = updateFetcher.Update( + result = updateFetcher.Update( sConfigMgr->GetBoolDefault("Updates.Redundancy", true), sConfigMgr->GetBoolDefault("Updates.AllowRehash", true), sConfigMgr->GetBoolDefault("Updates.ArchivedRedundancy", false), @@ -285,10 +285,13 @@ bool DBUpdater<T>::Update(DatabaseWorkerPool<T>& pool) return false; } - if (!count) - TC_LOG_INFO("sql.updates", ">> %s database is up-to-date!", DBUpdater<T>::GetTableName().c_str()); + std::string const info = Trinity::StringFormat("Containing " SZFMTD " new and " SZFMTD " archived updates.", + result.recent, result.archived); + + if (!result.updated) + TC_LOG_INFO("sql.updates", ">> %s database is up-to-date! %s", DBUpdater<T>::GetTableName().c_str(), info.c_str()); else - TC_LOG_INFO("sql.updates", ">> Applied %d %s.", count, count == 1 ? "query" : "queries"); + TC_LOG_INFO("sql.updates", ">> Applied " SZFMTD " %s. %s", result.updated, result.updated == 1 ? "query" : "queries", info.c_str()); return true; } @@ -380,7 +383,9 @@ void DBUpdater<T>::ApplyFile(DatabaseWorkerPool<T>& pool, std::string const& hos // CLI Client connection info args.push_back("-h" + host); args.push_back("-u" + user); - args.push_back("-p" + password); + + if (!password.empty()) + args.push_back("-p" + password); // Check if we want to connect through ip or socket (Unix only) #ifdef _WIN32 diff --git a/src/server/shared/Updater/DBUpdater.h b/src/server/shared/Updater/DBUpdater.h index 0caf8a438fb..a2b12bed235 100644 --- a/src/server/shared/Updater/DBUpdater.h +++ b/src/server/shared/Updater/DBUpdater.h @@ -41,6 +41,19 @@ enum BaseLocation LOCATION_DOWNLOAD }; +struct UpdateResult +{ + UpdateResult() + : updated(0), recent(0), archived(0) { } + + UpdateResult(size_t const updated_, size_t const recent_, size_t const archived_) + : updated(updated_), recent(recent_), archived(archived_) { } + + size_t updated; + size_t recent; + size_t archived; +}; + template <class T> class DBUpdater { diff --git a/src/server/shared/Updater/UpdateFetcher.cpp b/src/server/shared/Updater/UpdateFetcher.cpp index a4bdd193743..ec023928b99 100644 --- a/src/server/shared/Updater/UpdateFetcher.cpp +++ b/src/server/shared/Updater/UpdateFetcher.cpp @@ -154,17 +154,27 @@ UpdateFetcher::SQLUpdate UpdateFetcher::ReadSQLUpdate(boost::filesystem::path co return update; } -uint32 UpdateFetcher::Update(bool const redundancyChecks, bool const allowRehash, bool const archivedRedundancy, int32 const cleanDeadReferencesMaxCount) const +UpdateResult UpdateFetcher::Update(bool const redundancyChecks, bool const allowRehash, bool const archivedRedundancy, int32 const cleanDeadReferencesMaxCount) const { LocaleFileStorage const available = GetFileList(); AppliedFileStorage applied = ReceiveAppliedFiles(); + size_t countRecentUpdates = 0; + size_t countArchivedUpdates = 0; + + // Count updates + for (auto const& entry : applied) + if (entry.second.state == RELEASED) + ++countRecentUpdates; + else + ++countArchivedUpdates; + // Fill hash to name cache HashToFileNameStorage hashToName; for (auto entry : applied) hashToName.insert(std::make_pair(entry.second.hash, entry.first)); - uint32 importedUpdates = 0; + size_t importedUpdates = 0; for (auto const& availableQuery : available) { @@ -314,7 +324,7 @@ uint32 UpdateFetcher::Update(bool const redundancyChecks, bool const allowRehash } } - return importedUpdates; + return UpdateResult(importedUpdates, countRecentUpdates, countArchivedUpdates); } std::string UpdateFetcher::CalculateHash(SQLUpdate const& query) const @@ -329,7 +339,6 @@ std::string UpdateFetcher::CalculateHash(SQLUpdate const& query) const uint32 UpdateFetcher::Apply(Path const& path) const { using Time = std::chrono::high_resolution_clock; - using ms = std::chrono::milliseconds; // Benchmark query speed auto const begin = Time::now(); @@ -338,7 +347,7 @@ uint32 UpdateFetcher::Apply(Path const& path) const _applyFile(path); // Return time the query took to apply - return std::chrono::duration_cast<ms>(Time::now() - begin).count(); + return std::chrono::duration_cast<std::chrono::milliseconds>(Time::now() - begin).count(); } void UpdateFetcher::UpdateEntry(AppliedFileEntry const& entry, uint32 const speed) const diff --git a/src/server/shared/Updater/UpdateFetcher.h b/src/server/shared/Updater/UpdateFetcher.h index fa142547873..4ff8c93bc76 100644 --- a/src/server/shared/Updater/UpdateFetcher.h +++ b/src/server/shared/Updater/UpdateFetcher.h @@ -35,7 +35,7 @@ public: std::function<void(Path const& path)> const& applyFile, std::function<QueryResult(std::string const&)> const& retrieve); - uint32 Update(bool const redundancyChecks, bool const allowRehash, + UpdateResult Update(bool const redundancyChecks, bool const allowRehash, bool const archivedRedundancy, int32 const cleanDeadReferencesMaxCount) const; private: diff --git a/src/server/shared/Utilities/TaskScheduler.cpp b/src/server/shared/Utilities/TaskScheduler.cpp new file mode 100644 index 00000000000..801cc96cf77 --- /dev/null +++ b/src/server/shared/Utilities/TaskScheduler.cpp @@ -0,0 +1,229 @@ +/* + * 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 "TaskScheduler.h" + +TaskScheduler& TaskScheduler::ClearValidator() +{ + _predicate = EmptyValidator; + return *this; +} + +TaskScheduler& TaskScheduler::Update(success_t const& callback) +{ + _now = clock_t::now(); + Dispatch(callback); + return *this; +} + +TaskScheduler& TaskScheduler::Update(size_t const milliseconds, success_t const& callback) +{ + return Update(std::chrono::milliseconds(milliseconds), callback); +} + +TaskScheduler& TaskScheduler::Async(std::function<void()> const& callable) +{ + _asyncHolder.push(callable); + return *this; +} + +TaskScheduler& TaskScheduler::CancelAll() +{ + /// Clear the task holder + _task_holder.Clear(); + _asyncHolder = AsyncHolder(); + return *this; +} + +TaskScheduler& TaskScheduler::CancelGroup(group_t const group) +{ + _task_holder.RemoveIf([group](TaskContainer const& task) -> bool + { + return task->IsInGroup(group); + }); + return *this; +} + +TaskScheduler& TaskScheduler::CancelGroupsOf(std::vector<group_t> const& groups) +{ + std::for_each(groups.begin(), groups.end(), + std::bind(&TaskScheduler::CancelGroup, this, std::placeholders::_1)); + + return *this; +} + +TaskScheduler& TaskScheduler::InsertTask(TaskContainer task) +{ + _task_holder.Push(std::move(task)); + return *this; +} + +void TaskScheduler::Dispatch(success_t const& callback) +{ + // If the validation failed abort the dispatching here. + if (!_predicate()) + return; + + // Process all asyncs + while (!_asyncHolder.empty()) + { + _asyncHolder.front()(); + _asyncHolder.pop(); + + // If the validation failed abort the dispatching here. + if (!_predicate()) + return; + } + + while (!_task_holder.IsEmpty()) + { + if (_task_holder.First()->_end > _now) + break; + + // Perfect forward the context to the handler + // Use weak references to catch destruction before callbacks. + TaskContext context(_task_holder.Pop(), std::weak_ptr<TaskScheduler>(self_reference)); + + // Invoke the context + context.Invoke(); + + // If the validation failed abort the dispatching here. + if (!_predicate()) + return; + } + + // On finish call the final callback + callback(); +} + +void TaskScheduler::TaskQueue::Push(TaskContainer&& task) +{ + container.insert(task); +} + +auto TaskScheduler::TaskQueue::Pop() -> TaskContainer +{ + TaskContainer result = *container.begin(); + container.erase(container.begin()); + return result; +} + +auto TaskScheduler::TaskQueue::First() const -> TaskContainer const& +{ + return *container.begin(); +} + +void TaskScheduler::TaskQueue::Clear() +{ + container.clear(); +} + +void TaskScheduler::TaskQueue::RemoveIf(std::function<bool(TaskContainer const&)> const& filter) +{ + for (auto itr = container.begin(); itr != container.end();) + if (filter(*itr)) + itr = container.erase(itr); + else + ++itr; +} + +void TaskScheduler::TaskQueue::ModifyIf(std::function<bool(TaskContainer const&)> const& filter) +{ + std::vector<TaskContainer> cache; + for (auto itr = container.begin(); itr != container.end();) + if (filter(*itr)) + { + cache.push_back(*itr); + itr = container.erase(itr); + } + else + ++itr; + + container.insert(cache.begin(), cache.end()); +} + +bool TaskScheduler::TaskQueue::IsEmpty() const +{ + return container.empty(); +} + +TaskContext& TaskContext::Dispatch(std::function<TaskScheduler&(TaskScheduler&)> const& apply) +{ + if (auto const owner = _owner.lock()) + apply(*owner); + + return *this; +} + +bool TaskContext::IsExpired() const +{ + return _owner.expired(); +} + +bool TaskContext::IsInGroup(TaskScheduler::group_t const group) const +{ + return _task->IsInGroup(group); +} + +TaskContext& TaskContext::SetGroup(TaskScheduler::group_t const group) +{ + _task->_group = group; + return *this; +} + +TaskContext& TaskContext::ClearGroup() +{ + _task->_group = boost::none; + return *this; +} + +TaskScheduler::repeated_t TaskContext::GetRepeatCounter() const +{ + return _task->_repeated; +} + +TaskContext& TaskContext::Async(std::function<void()> const& callable) +{ + return Dispatch(std::bind(&TaskScheduler::Async, std::placeholders::_1, callable)); +} + +TaskContext& TaskContext::CancelAll() +{ + return Dispatch(std::mem_fn(&TaskScheduler::CancelAll)); +} + +TaskContext& TaskContext::CancelGroup(TaskScheduler::group_t const group) +{ + return Dispatch(std::bind(&TaskScheduler::CancelGroup, std::placeholders::_1, group)); +} + +TaskContext& TaskContext::CancelGroupsOf(std::vector<TaskScheduler::group_t> const& groups) +{ + return Dispatch(std::bind(&TaskScheduler::CancelGroupsOf, std::placeholders::_1, std::cref(groups))); +} + +void TaskContext::AssertOnConsumed() const +{ + // This was adapted to TC to prevent static analysis tools from complaining. + // If you encounter this assertion check if you repeat a TaskContext more then 1 time! + ASSERT(!(*_consumed) && "Bad task logic, task context was consumed already!"); +} + +void TaskContext::Invoke() +{ + _task->_task(*this); +} diff --git a/src/server/shared/Utilities/TaskScheduler.h b/src/server/shared/Utilities/TaskScheduler.h new file mode 100644 index 00000000000..d45835b5f17 --- /dev/null +++ b/src/server/shared/Utilities/TaskScheduler.h @@ -0,0 +1,661 @@ +/* + * 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 _TASK_SCHEDULER_H_ +#define _TASK_SCHEDULER_H_ + +#include <algorithm> +#include <chrono> +#include <vector> +#include <queue> +#include <memory> +#include <utility> +#include <set> + +#include <boost/optional.hpp> + +#include "Util.h" + +class TaskContext; + +/// The TaskScheduler class provides the ability to schedule std::function's in the near future. +/// Use TaskScheduler::Update to update the scheduler. +/// Popular methods are: +/// * Schedule (Schedules a std::function which will be executed in the near future). +/// * Schedules an asynchronous function which will be executed at the next update tick. +/// * Cancel, Delay & Reschedule (Methods to manipulate already scheduled tasks). +/// Tasks are organized in groups (uint), multiple tasks can have the same group id, +/// you can provide a group or not, but keep in mind that you can only manipulate specific tasks through its group id! +/// Tasks callbacks use the function signature void(TaskContext) where TaskContext provides +/// access to the function schedule plan which makes it possible to repeat the task +/// with the same duration or a new one. +/// It also provides access to the repeat counter which is useful for task that repeat itself often +/// but behave different every time (spoken event dialogs for example). +class TaskScheduler +{ + friend class TaskContext; + + // Time definitions (use steady clock) + typedef std::chrono::steady_clock clock_t; + typedef clock_t::time_point timepoint_t; + typedef clock_t::duration duration_t; + + // Task group type + typedef uint32 group_t; + // Task repeated type + typedef uint32 repeated_t; + // Task handle type + typedef std::function<void(TaskContext)> task_handler_t; + // Predicate type + typedef std::function<bool()> predicate_t; + // Success handle type + typedef std::function<void()> success_t; + + class Task + { + friend class TaskContext; + friend class TaskScheduler; + + timepoint_t _end; + duration_t _duration; + boost::optional<group_t> _group; + repeated_t _repeated; + task_handler_t _task; + + public: + // All Argument construct + Task(timepoint_t const& end, duration_t const& duration, boost::optional<group_t> const& group, + repeated_t const repeated, task_handler_t const& task) + : _end(end), _duration(duration), _group(group), _repeated(repeated), _task(task) { } + + // Minimal Argument construct + Task(timepoint_t const& end, duration_t const& duration, task_handler_t const& task) + : _end(end), _duration(duration), _group(boost::none), _repeated(0), _task(task) { } + + // Copy construct + Task(Task const&) = delete; + // Move construct + Task(Task&&) = delete; + // Copy Assign + Task& operator= (Task const&) = default; + // Move Assign + Task& operator= (Task&& right) = delete; + + // Order tasks by its end + inline bool operator< (Task const& other) const + { + return _end < other._end; + } + + inline bool operator> (Task const& other) const + { + return _end > other._end; + } + + // Compare tasks with its end + inline bool operator== (Task const& other) + { + return _end == other._end; + } + + // Returns true if the task is in the given group + inline bool IsInGroup(group_t const group) const + { + return _group == group; + } + }; + + typedef std::shared_ptr<Task> TaskContainer; + + /// Container which provides Task order, insert and reschedule operations. + struct Compare + { + bool operator() (TaskContainer const& left, TaskContainer const& right) + { + return (*left.get()) < (*right.get()); + }; + }; + + class TaskQueue + { + std::multiset<TaskContainer, Compare> container; + + public: + // Pushes the task in the container + void Push(TaskContainer&& task); + + /// Pops the task out of the container + TaskContainer Pop(); + + TaskContainer const& First() const; + + void Clear(); + + void RemoveIf(std::function<bool(TaskContainer const&)> const& filter); + + void ModifyIf(std::function<bool(TaskContainer const&)> const& filter); + + bool IsEmpty() const; + }; + + /// Contains a self reference to track if this object was deleted or not. + std::shared_ptr<TaskScheduler> self_reference; + + /// The current time point (now) + timepoint_t _now; + + /// The Task Queue which contains all task objects. + TaskQueue _task_holder; + + typedef std::queue<std::function<void()>> AsyncHolder; + + /// Contains all asynchronous tasks which will be invoked at + /// the next update tick. + AsyncHolder _asyncHolder; + + predicate_t _predicate; + + static bool EmptyValidator() + { + return true; + } + + static void EmptyCallback() + { + } + +public: + TaskScheduler() + : self_reference(this, [](TaskScheduler const*) { }), _now(clock_t::now()), _predicate(EmptyValidator) { } + + template<typename P> + TaskScheduler(P&& predicate) + : self_reference(this, [](TaskScheduler const*) { }), _now(clock_t::now()), _predicate(std::forward<P>(predicate)) { } + + TaskScheduler(TaskScheduler const&) = delete; + TaskScheduler(TaskScheduler&&) = delete; + TaskScheduler& operator= (TaskScheduler const&) = delete; + TaskScheduler& operator= (TaskScheduler&&) = delete; + + /// Sets a validator which is asked if tasks are allowed to be executed. + template<typename P> + TaskScheduler& SetValidator(P&& predicate) + { + _predicate = std::forward<P>(predicate); + return *this; + } + + /// Clears the validator which is asked if tasks are allowed to be executed. + TaskScheduler& ClearValidator(); + + /// Update the scheduler to the current time. + /// Calls the optional callback on successfully finish. + TaskScheduler& Update(success_t const& callback = EmptyCallback); + + /// Update the scheduler with a difftime in ms. + /// Calls the optional callback on successfully finish. + TaskScheduler& Update(size_t const milliseconds, success_t const& callback = EmptyCallback); + + /// Update the scheduler with a difftime. + /// Calls the optional callback on successfully finish. + template<class _Rep, class _Period> + TaskScheduler& Update(std::chrono::duration<_Rep, _Period> const& difftime, + success_t const& callback = EmptyCallback) + { + _now += difftime; + Dispatch(callback); + return *this; + } + + /// Schedule an callable function that is executed at the next update tick. + /// Its safe to modify the TaskScheduler from within the callable. + TaskScheduler& Async(std::function<void()> const& callable); + + /// Schedule an event with a fixed rate. + /// Never call this from within a task context! Use TaskContext::Schedule instead! + template<class _Rep, class _Period> + TaskScheduler& Schedule(std::chrono::duration<_Rep, _Period> const& time, + task_handler_t const& task) + { + return ScheduleAt(_now, time, task); + } + + /// Schedule an event with a fixed rate. + /// Never call this from within a task context! Use TaskContext::Schedule instead! + template<class _Rep, class _Period> + TaskScheduler& Schedule(std::chrono::duration<_Rep, _Period> const& time, + group_t const group, task_handler_t const& task) + { + return ScheduleAt(_now, time, group, task); + } + + /// Schedule an event with a randomized rate between min and max rate. + /// Never call this from within a task context! Use TaskContext::Schedule instead! + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskScheduler& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max, task_handler_t const& task) + { + return Schedule(RandomDurationBetween(min, max), task); + } + + /// Schedule an event with a fixed rate. + /// Never call this from within a task context! Use TaskContext::Schedule instead! + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskScheduler& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max, group_t const group, + task_handler_t const& task) + { + return Schedule(RandomDurationBetween(min, max), group, task); + } + + /// Cancels all tasks. + /// Never call this from within a task context! Use TaskContext::CancelAll instead! + TaskScheduler& CancelAll(); + + /// Cancel all tasks of a single group. + /// Never call this from within a task context! Use TaskContext::CancelGroup instead! + TaskScheduler& CancelGroup(group_t const group); + + /// Cancels all groups in the given std::vector. + /// Hint: Use std::initializer_list for this: "{1, 2, 3, 4}" + TaskScheduler& CancelGroupsOf(std::vector<group_t> const& groups); + + /// Delays all tasks with the given duration. + template<class _Rep, class _Period> + TaskScheduler& DelayAll(std::chrono::duration<_Rep, _Period> const& duration) + { + _task_holder.ModifyIf([&duration](TaskContainer const& task) -> bool + { + task->_end += duration; + return true; + }); + return *this; + } + + /// Delays all tasks with a random duration between min and max. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskScheduler& DelayAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return DelayAll(RandomDurationBetween(min, max)); + } + + /// Delays all tasks of a group with the given duration. + template<class _Rep, class _Period> + TaskScheduler& DelayGroup(group_t const group, std::chrono::duration<_Rep, _Period> const& duration) + { + _task_holder.ModifyIf([&duration, group](TaskContainer const& task) -> bool + { + if (task->IsInGroup(group)) + { + task->_end += duration; + return true; + } + else + return false; + }); + return *this; + } + + /// Delays all tasks of a group with a random duration between min and max. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskScheduler& DelayGroup(group_t const group, + std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return DelayGroup(group, RandomDurationBetween(min, max)); + } + + /// Reschedule all tasks with a given duration. + template<class _Rep, class _Period> + TaskScheduler& RescheduleAll(std::chrono::duration<_Rep, _Period> const& duration) + { + auto const end = _now + duration; + _task_holder.ModifyIf([end](TaskContainer const& task) -> bool + { + task->_end = end; + return true; + }); + return *this; + } + + /// Reschedule all tasks with a random duration between min and max. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskScheduler& RescheduleAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return RescheduleAll(RandomDurationBetween(min, max)); + } + + /// Reschedule all tasks of a group with the given duration. + template<class _Rep, class _Period> + TaskScheduler& RescheduleGroup(group_t const group, std::chrono::duration<_Rep, _Period> const& duration) + { + auto const end = _now + duration; + _task_holder.ModifyIf([end, group](TaskContainer const& task) -> bool + { + if (task->IsInGroup(group)) + { + task->_end = end; + return true; + } + else + return false; + }); + return *this; + } + + /// Reschedule all tasks of a group with a random duration between min and max. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskScheduler& RescheduleGroup(group_t const group, + std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return RescheduleGroup(group, RandomDurationBetween(min, max)); + } + +private: + /// Insert a new task to the enqueued tasks. + TaskScheduler& InsertTask(TaskContainer task); + + template<class _Rep, class _Period> + TaskScheduler& ScheduleAt(timepoint_t const& end, + std::chrono::duration<_Rep, _Period> const& time, task_handler_t const& task) + { + return InsertTask(TaskContainer(new Task(end + time, time, task))); + } + + /// Schedule an event with a fixed rate. + /// Never call this from within a task context! Use TaskContext::schedule instead! + template<class _Rep, class _Period> + TaskScheduler& ScheduleAt(timepoint_t const& end, + std::chrono::duration<_Rep, _Period> const& time, + group_t const group, task_handler_t const& task) + { + static repeated_t const DEFAULT_REPEATED = 0; + return InsertTask(TaskContainer(new Task(end + time, time, group, DEFAULT_REPEATED, task))); + } + + // Returns a random duration between min and max + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + static std::chrono::milliseconds + RandomDurationBetween(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + auto const milli_min = std::chrono::duration_cast<std::chrono::milliseconds>(min); + auto const milli_max = std::chrono::duration_cast<std::chrono::milliseconds>(max); + + // TC specific: use SFMT URandom + return std::chrono::milliseconds(urand(milli_min.count(), milli_max.count())); + } + + /// Dispatch remaining tasks + void Dispatch(success_t const& callback); +}; + +class TaskContext +{ + friend class TaskScheduler; + + /// Associated task + TaskScheduler::TaskContainer _task; + + /// Owner + std::weak_ptr<TaskScheduler> _owner; + + /// Marks the task as consumed + std::shared_ptr<bool> _consumed; + + /// Dispatches an action safe on the TaskScheduler + TaskContext& Dispatch(std::function<TaskScheduler&(TaskScheduler&)> const& apply); + +public: + // Empty constructor + TaskContext() + : _task(), _owner(), _consumed(std::make_shared<bool>(true)) { } + + // Construct from task and owner + explicit TaskContext(TaskScheduler::TaskContainer&& task, std::weak_ptr<TaskScheduler>&& owner) + : _task(task), _owner(owner), _consumed(std::make_shared<bool>(false)) { } + + // Copy construct + TaskContext(TaskContext const& right) + : _task(right._task), _owner(right._owner), _consumed(right._consumed) { } + + // Move construct + TaskContext(TaskContext&& right) + : _task(std::move(right._task)), _owner(std::move(right._owner)), _consumed(std::move(right._consumed)) { } + + // Copy assign + TaskContext& operator= (TaskContext const& right) + { + _task = right._task; + _owner = right._owner; + _consumed = right._consumed; + return *this; + } + + // Move assign + TaskContext& operator= (TaskContext&& right) + { + _task = std::move(right._task); + _owner = std::move(right._owner); + _consumed = std::move(right._consumed); + return *this; + } + + /// Returns true if the owner was deallocated and this context has expired. + bool IsExpired() const; + + /// Returns true if the event is in the given group + bool IsInGroup(TaskScheduler::group_t const group) const; + + /// Sets the event in the given group + TaskContext& SetGroup(TaskScheduler::group_t const group); + + /// Removes the group from the event + TaskContext& ClearGroup(); + + /// Returns the repeat counter which increases every time the task is repeated. + TaskScheduler::repeated_t GetRepeatCounter() const; + + /// Repeats the event and sets a new duration. + /// std::chrono::seconds(5) for example. + /// This will consume the task context, its not possible to repeat the task again + /// from the same task context! + template<class _Rep, class _Period> + TaskContext& Repeat(std::chrono::duration<_Rep, _Period> const& duration) + { + AssertOnConsumed(); + + // Set new duration, in-context timing and increment repeat counter + _task->_duration = duration; + _task->_end += duration; + _task->_repeated += 1; + (*_consumed) = true; + return Dispatch(std::bind(&TaskScheduler::InsertTask, std::placeholders::_1, _task)); + } + + /// Repeats the event with the same duration. + /// This will consume the task context, its not possible to repeat the task again + /// from the same task context! + TaskContext& Repeat() + { + return Repeat(_task->_duration); + } + + /// Repeats the event and set a new duration that is randomized between min and max. + /// std::chrono::seconds(5) for example. + /// This will consume the task context, its not possible to repeat the task again + /// from the same task context! + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskContext& Repeat(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return Repeat(TaskScheduler::RandomDurationBetween(min, max)); + } + + /// Schedule a callable function that is executed at the next update tick from within the context. + /// Its safe to modify the TaskScheduler from within the callable. + TaskContext& Async(std::function<void()> const& callable); + + /// Schedule an event with a fixed rate from within the context. + /// Its possible that the new event is executed immediately! + /// Use TaskScheduler::Async to create a task + /// which will be called at the next update tick. + template<class _Rep, class _Period> + TaskContext& Schedule(std::chrono::duration<_Rep, _Period> const& time, + TaskScheduler::task_handler_t const& task) + { + auto const end = _task->_end; + return Dispatch([end, time, task](TaskScheduler& scheduler) -> TaskScheduler& + { + return scheduler.ScheduleAt<_Rep, _Period>(end, time, task); + }); + } + + /// Schedule an event with a fixed rate from within the context. + /// Its possible that the new event is executed immediately! + /// Use TaskScheduler::Async to create a task + /// which will be called at the next update tick. + template<class _Rep, class _Period> + TaskContext& Schedule(std::chrono::duration<_Rep, _Period> const& time, + TaskScheduler::group_t const group, TaskScheduler::task_handler_t const& task) + { + auto const end = _task->_end; + return Dispatch([end, time, group, task](TaskScheduler& scheduler) -> TaskScheduler& + { + return scheduler.ScheduleAt<_Rep, _Period>(end, time, group, task); + }); + } + + /// Schedule an event with a randomized rate between min and max rate from within the context. + /// Its possible that the new event is executed immediately! + /// Use TaskScheduler::Async to create a task + /// which will be called at the next update tick. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskContext& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max, TaskScheduler::task_handler_t const& task) + { + return Schedule(TaskScheduler::RandomDurationBetween(min, max), task); + } + + /// Schedule an event with a randomized rate between min and max rate from within the context. + /// Its possible that the new event is executed immediately! + /// Use TaskScheduler::Async to create a task + /// which will be called at the next update tick. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskContext& Schedule(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max, TaskScheduler::group_t const group, + TaskScheduler::task_handler_t const& task) + { + return Schedule(TaskScheduler::RandomDurationBetween(min, max), group, task); + } + + /// Cancels all tasks from within the context. + TaskContext& CancelAll(); + + /// Cancel all tasks of a single group from within the context. + TaskContext& CancelGroup(TaskScheduler::group_t const group); + + /// Cancels all groups in the given std::vector from within the context. + /// Hint: Use std::initializer_list for this: "{1, 2, 3, 4}" + TaskContext& CancelGroupsOf(std::vector<TaskScheduler::group_t> const& groups); + + /// Delays all tasks with the given duration from within the context. + template<class _Rep, class _Period> + TaskContext& DelayAll(std::chrono::duration<_Rep, _Period> const& duration) + { + return Dispatch(std::bind(&TaskScheduler::DelayAll<_Rep, _Period>, std::placeholders::_1, duration)); + } + + /// Delays all tasks with a random duration between min and max from within the context. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskContext& DelayAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return DelayAll(TaskScheduler::RandomDurationBetween(min, max)); + } + + /// Delays all tasks of a group with the given duration from within the context. + template<class _Rep, class _Period> + TaskContext& DelayGroup(TaskScheduler::group_t const group, std::chrono::duration<_Rep, _Period> const& duration) + { + return Dispatch(std::bind(&TaskScheduler::DelayGroup<_Rep, _Period>, std::placeholders::_1, group, duration)); + } + + /// Delays all tasks of a group with a random duration between min and max from within the context. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskContext& DelayGroup(TaskScheduler::group_t const group, + std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return DelayGroup(group, TaskScheduler::RandomDurationBetween(min, max)); + } + + /// Reschedule all tasks with the given duration. + template<class _Rep, class _Period> + TaskContext& RescheduleAll(std::chrono::duration<_Rep, _Period> const& duration) + { + return Dispatch(std::bind(&TaskScheduler::RescheduleAll, std::placeholders::_1, duration)); + } + + /// Reschedule all tasks with a random duration between min and max. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskContext& RescheduleAll(std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return RescheduleAll(TaskScheduler::RandomDurationBetween(min, max)); + } + + /// Reschedule all tasks of a group with the given duration. + template<class _Rep, class _Period> + TaskContext& RescheduleGroup(TaskScheduler::group_t const group, std::chrono::duration<_Rep, _Period> const& duration) + { + return Dispatch(std::bind(&TaskScheduler::RescheduleGroup<_Rep, _Period>, std::placeholders::_1, group, duration)); + } + + /// Reschedule all tasks of a group with a random duration between min and max. + template<class _RepLeft, class _PeriodLeft, class _RepRight, class _PeriodRight> + TaskContext& RescheduleGroup(TaskScheduler::group_t const group, + std::chrono::duration<_RepLeft, _PeriodLeft> const& min, + std::chrono::duration<_RepRight, _PeriodRight> const& max) + { + return RescheduleGroup(group, TaskScheduler::RandomDurationBetween(min, max)); + } + +private: + /// Asserts if the task was consumed already. + void AssertOnConsumed() const; + + /// Invokes the associated hook of the task. + void Invoke(); +}; + +/// Milliseconds shorthand typedef. +typedef std::chrono::milliseconds Milliseconds; + +/// Seconds shorthand typedef. +typedef std::chrono::seconds Seconds; + +/// Minutes shorthand typedef. +typedef std::chrono::minutes Minutes; + +/// Hours shorthand typedef. +typedef std::chrono::hours Hours; + +#endif /// _TASK_SCHEDULER_H_ diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index d4a6915894d..e09f28d416f 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -105,17 +105,17 @@ extern int main(int argc, char** argv) std::string configService; auto vm = GetConsoleArguments(argc, argv, configFile, configService); - // exit if help is enabled - if (vm.count("help")) + // exit if help or version is enabled + if (vm.count("help") || vm.count("version")) return 0; #ifdef _WIN32 if (configService.compare("install") == 0) - return WinServiceInstall() == true ? 0 : 1; + return WinServiceInstall() ? 0 : 1; else if (configService.compare("uninstall") == 0) - return WinServiceUninstall() == true ? 0 : 1; + return WinServiceUninstall() ? 0 : 1; else if (configService.compare("run") == 0) - WinServiceRun(); + return WinServiceRun() ? 0 : 0; #endif std::string configError; @@ -597,6 +597,7 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile options_description all("Allowed options"); all.add_options() ("help,h", "print usage message") + ("version,v", "print version build info") ("config,c", value<std::string>(&configFile)->default_value(_TRINITY_CORE_CONFIG), "use <arg> as configuration file") ; #ifdef _WIN32 @@ -613,13 +614,19 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile store(command_line_parser(argc, argv).options(all).allow_unregistered().run(), vm); notify(vm); } - catch (std::exception& e) { + catch (std::exception& e) + { std::cerr << e.what() << "\n"; } - if (vm.count("help")) { + if (vm.count("help")) + { std::cout << all << "\n"; } + else if (vm.count("version")) + { + std::cout << _FULLVERSION << "\n"; + } return vm; } diff --git a/src/server/worldserver/worldserver.conf.dist b/src/server/worldserver/worldserver.conf.dist index 668cec43aca..3053c069bf1 100644 --- a/src/server/worldserver/worldserver.conf.dist +++ b/src/server/worldserver/worldserver.conf.dist @@ -1773,14 +1773,6 @@ Support.ComplaintsEnabled = 0 Support.SuggestionsEnabled = 0 # -# Support.ChanceOfGMSurvey -# Description: Chance of sending a GM survey after ticket completion. -# Default: 50 - (Enabled) -# 0 - (Disabled) - -Support.ChanceOfGMSurvey = 50 - -# ################################################################################################### ################################################################################################### @@ -2774,13 +2766,6 @@ PlayerStart.String = "" LevelReq.Trade = 1 # -# LevelReq.Ticket -# Description: Level requirement for characters to be able to write tickets. -# Default: 1 - -LevelReq.Ticket = 1 - -# # LevelReq.Auction # Description: Level requirement for characters to be able to use the auction house. # Default: 1 diff --git a/src/tools/connection_patcher/Helper.cpp b/src/tools/connection_patcher/Helper.cpp index 6407560f093..5489b54a338 100644 --- a/src/tools/connection_patcher/Helper.cpp +++ b/src/tools/connection_patcher/Helper.cpp @@ -18,15 +18,97 @@ #include "Helper.hpp" -#include <SHA256.h> -#include <Util.h> - -#include <stdexcept> - namespace Connection_Patcher { namespace Helper { + // adapted from http://stackoverflow.com/questions/8593608/how-can-i-copy-a-directory-using-boost-filesystem + void CopyDir(boost::filesystem::path const & source, boost::filesystem::path const & destination) + { + namespace fs = boost::filesystem; + if (!fs::exists(source) || !fs::is_directory(source)) + throw std::invalid_argument("Source directory " + source.string() + " does not exist or is not a directory."); + + if (fs::exists(destination)) + throw std::invalid_argument("Destination directory " + destination.string() + " already exists."); + + if (!fs::create_directory(destination)) + throw std::runtime_error("Unable to create destination directory" + destination.string()); + + for (fs::directory_iterator file(source); file != fs::directory_iterator(); ++file) + { + fs::path current(file->path()); + if (fs::is_directory(current)) + CopyDir(current, destination / current.filename()); + else + fs::copy_file(current, destination / current.filename()); + } + } + + // adapted from http://stackoverflow.com/questions/21422094/boostasio-download-image-file-from-server + void DownloadFile(const std::string& serverName, int port, const std::string& getCommand, std::ostream& out) + { + using namespace boost::asio; + using boost::asio::ip::tcp; + + io_service io_service; + + // Get a list of endpoints corresponding to the server name. + tcp::resolver resolver(io_service); + tcp::resolver::query query(serverName, std::to_string(port)); + tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); + tcp::resolver::iterator end; + + // Try each endpoint until we successfully establish a connection. + tcp::socket socket(io_service); + boost::system::error_code error = boost::asio::error::host_not_found; + while (error && endpoint_iterator != end) + { + socket.close(); + socket.connect(*endpoint_iterator++, error); + } + + boost::asio::streambuf request; + std::ostream request_stream(&request); + + request_stream << "GET " << getCommand << " HTTP/1.0\r\n"; + request_stream << "Host: " << serverName << ':' << port << "\r\n"; + request_stream << "Accept: */*\r\n"; + request_stream << "Connection: close\r\n\r\n"; + + // Send the request. + boost::asio::write(socket, request); + + // Read the response status line. + boost::asio::streambuf response; + boost::asio::read_until(socket, response, "\r\n"); + + // Check that response is OK. + std::istream response_stream(&response); + std::string http_version; + response_stream >> http_version; + unsigned int status_code; + response_stream >> status_code; + std::string status_message; + std::getline(response_stream, status_message); + + // Read the response headers, which are terminated by a blank line. + boost::asio::read_until(socket, response, "\r\n\r\n"); + + // Process the response headers. + std::string header; + while (std::getline(response_stream, header) && header != "\r") + { } + + // Write whatever content we already have to output. + if (response.size() > 0) + out << &response; + + // Read until EOF, writing data to output as we go. + while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error)) + out << &response; + } + Constants::BinaryTypes GetBinaryType(std::vector<unsigned char> const& data) { // Check MS-DOS magic @@ -41,9 +123,7 @@ namespace Connection_Patcher return Constants::BinaryTypes(*reinterpret_cast<uint16_t const*>(data.data() + peOffset + 4)); } else - { return Constants::BinaryTypes(*reinterpret_cast<uint32_t const*>(data.data())); - } } std::string GetFileChecksum(std::vector<unsigned char> const& data) @@ -54,5 +134,50 @@ namespace Connection_Patcher return ByteArrayToHexStr(h.GetDigest(), h.GetLength()); } + + std::set<size_t> SearchOffset(std::vector<unsigned char> const& binary, std::vector<unsigned char> const& pattern) + { + std::set<size_t> offsets; + for (size_t i = 0; (i + pattern.size()) < binary.size(); i++) + { + size_t matches = 0; + + for (size_t j = 0; j < pattern.size(); j++) + { + if (pattern[j] == 0) + { + matches++; + continue; + } + + if (binary[i + j] != pattern[j]) + break; + + matches++; + } + + if (matches == pattern.size()) + { + offsets.insert(i); + i += matches; + } + } + + return offsets.empty() ? throw std::runtime_error("unable to find pattern") : offsets; + } + + uint32_t GetBuildNumber(std::vector<unsigned char> const& binary) + { + std::set<size_t> offsets = SearchOffset(binary, Patterns::Common::BinaryVersion()); + + if (!offsets.empty()) + { + size_t const verOffset = (*offsets.begin()); + std::string ver(&binary[verOffset + 16], &binary[verOffset + 21]); + + return std::stoi(ver); + } + return 0; + } } } diff --git a/src/tools/connection_patcher/Helper.hpp b/src/tools/connection_patcher/Helper.hpp index 4458617708f..e0c4e8dd2de 100644 --- a/src/tools/connection_patcher/Helper.hpp +++ b/src/tools/connection_patcher/Helper.hpp @@ -20,16 +20,27 @@ #define CONNECTION_PATCHER_HELPER_HPP #include "Constants/BinaryTypes.hpp" +#include "Patterns/Common.hpp" +#include <boost/filesystem.hpp> +#include <boost/asio.hpp> #include <vector> +#include <set> #include <string> +#include <stdexcept> +#include <SHA256.h> +#include <Util.h> namespace Connection_Patcher { namespace Helper { + void CopyDir(boost::filesystem::path const & source, boost::filesystem::path const & destination); + void DownloadFile(const std::string& serverName, int port, const std::string& getCommand, std::ostream& out); Constants::BinaryTypes GetBinaryType(std::vector<unsigned char> const& data); std::string GetFileChecksum(std::vector<unsigned char> const& data); + std::set<size_t> SearchOffset(std::vector<unsigned char> const& binary, std::vector<unsigned char> const& pattern); + uint32_t GetBuildNumber(std::vector<unsigned char> const& binary); } } diff --git a/src/tools/connection_patcher/Patcher.cpp b/src/tools/connection_patcher/Patcher.cpp index ba7db70ec12..58adbbdd220 100644 --- a/src/tools/connection_patcher/Patcher.cpp +++ b/src/tools/connection_patcher/Patcher.cpp @@ -17,36 +17,32 @@ */ #include "Patcher.hpp" -#include "Helper.hpp" -#include <boost/filesystem.hpp> - -#include <fstream> -#include <iostream> -#include <iterator> -#include <set> -#include <stdexcept> - -namespace +namespace Connection_Patcher { - std::vector<unsigned char> read_file(boost::filesystem::path const& path) + Patcher::Patcher(boost::filesystem::path file) + : filePath(file) + { + ReadFile(); + binaryType = Helper::GetBinaryType(binary); + } + + void Patcher::ReadFile() { - std::ifstream ifs(path.string(), std::ifstream::binary); + std::ifstream ifs(filePath.string(), std::ifstream::binary); if (!ifs) - throw std::runtime_error("could not open " + path.string()); + throw std::runtime_error("could not open " + filePath.string()); - std::vector<unsigned char> binary; + binary.clear(); ifs >> std::noskipws; ifs.seekg(0, std::ios_base::end); binary.reserve(ifs.tellg()); ifs.seekg(0, std::ios_base::beg); std::copy(std::istream_iterator<unsigned char>(ifs), std::istream_iterator<unsigned char>(), std::back_inserter(binary)); - - return binary; } - void write_file(boost::filesystem::path const& path, std::vector<unsigned char> const& data) + void Patcher::WriteFile(boost::filesystem::path const& path) { std::ofstream ofs(path.string(), std::ofstream::binary); if (!ofs) @@ -54,47 +50,8 @@ namespace ofs << std::noskipws; - std::copy(data.begin(), data.end(), std::ostream_iterator<unsigned char>(ofs)); - } - - std::set<size_t> SearchOffset(std::vector<unsigned char> const& binary, std::vector<unsigned char> const& pattern) - { - std::set<size_t> offsets; - for (size_t i = 0; (i + pattern.size()) < binary.size(); i++) - { - size_t matches = 0; - - for (size_t j = 0; j < pattern.size(); j++) - { - if (pattern[j] == 0) - { - matches++; - continue; - } - - if (binary[i + j] != pattern[j]) - break; - - matches++; - } - - if (matches == pattern.size()) - { - offsets.insert(i); - i += matches; - } - } - - return offsets.empty() ? throw std::runtime_error("unable to find pattern") : offsets; + std::copy(binary.begin(), binary.end(), std::ostream_iterator<unsigned char>(ofs)); } -} - -namespace Connection_Patcher -{ - Patcher::Patcher(boost::filesystem::path file) - : binary(read_file(file)) - , Type(Helper::GetBinaryType(binary)) - {} void Patcher::Patch(std::vector<unsigned char> const& bytes, std::vector<unsigned char> const& pattern) { @@ -104,7 +61,7 @@ namespace Connection_Patcher if (pattern.empty()) return; - for (size_t const offset : SearchOffset(binary, pattern)) + for (size_t const offset : Helper::SearchOffset(binary, pattern)) { std::cout << "Found offset " << offset << std::endl; @@ -119,6 +76,6 @@ namespace Connection_Patcher if (boost::filesystem::exists(out)) boost::filesystem::remove(out); - write_file(out, binary); + WriteFile(out); } } diff --git a/src/tools/connection_patcher/Patcher.hpp b/src/tools/connection_patcher/Patcher.hpp index 7bf29b30ca7..3ce0fdc94b0 100644 --- a/src/tools/connection_patcher/Patcher.hpp +++ b/src/tools/connection_patcher/Patcher.hpp @@ -19,24 +19,33 @@ #ifndef CONNECTION_PATCHER_PATCHER_HPP #define CONNECTION_PATCHER_PATCHER_HPP -#include "Constants/BinaryTypes.hpp" +#include "Helper.hpp" -#include <boost/filesystem.hpp> - -#include <vector> -#include <string> +#include <fstream> +#include <iostream> +#include <iterator> namespace Connection_Patcher { - struct Patcher + class Patcher { + public: + Patcher(boost::filesystem::path file); + + void Patch(std::vector<unsigned char> const& bytes, std::vector<unsigned char> const& pattern); + void Finish(boost::filesystem::path out); + Constants::BinaryTypes GetType() const { return binaryType; } + std::vector<unsigned char> const& GetBinary() const { return binary; } + + private: + void ReadFile(); + void WriteFile(boost::filesystem::path const& path); + + boost::filesystem::path filePath; std::vector<unsigned char> binary; - Constants::BinaryTypes Type; + Constants::BinaryTypes binaryType; - Patcher (boost::filesystem::path file); - void Patch(std::vector<unsigned char> const& bytes, std::vector<unsigned char> const& pattern); - void Finish (boost::filesystem::path out); }; } diff --git a/src/tools/connection_patcher/Patches/Common.hpp b/src/tools/connection_patcher/Patches/Common.hpp index 32e84b1503f..7b721830a26 100644 --- a/src/tools/connection_patcher/Patches/Common.hpp +++ b/src/tools/connection_patcher/Patches/Common.hpp @@ -50,6 +50,7 @@ namespace Connection_Patcher 0xF0, 0xB8, 0x32, 0xCB, 0x5B, 0x66, 0xCE, 0x51, 0x54, 0xB4, 0xC3, 0xD3, 0xD4, 0xDC, 0xB3, 0xEE }; } + static const std::string VersionsFile() { return "trinity6.github.io/%s/%s/build/versi"; }; }; } } diff --git a/src/tools/connection_patcher/Patterns/Common.hpp b/src/tools/connection_patcher/Patterns/Common.hpp index b5ff0343c65..8943e4fd1b1 100644 --- a/src/tools/connection_patcher/Patterns/Common.hpp +++ b/src/tools/connection_patcher/Patterns/Common.hpp @@ -29,6 +29,8 @@ namespace Connection_Patcher { static const std::vector<unsigned char> Portal() { return { '.', 'l', 'o', 'g', 'o', 'n', '.', 'b', 'a', 't', 't', 'l', 'e', '.', 'n', 'e', 't', 0x00 }; } static const std::vector<unsigned char> Modulus() { return { 0x91, 0xD5, 0x9B, 0xB7, 0xD4, 0xE1, 0x83, 0xA5 }; } + static const std::vector<unsigned char> BinaryVersion() { return{ 0x3C, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6F, 0x6E, 0x3E }; } + static const std::vector<unsigned char> VersionsFile() { return { '%', 's', '.', 'p', 'a', 't', 'c', 'h', '.', 'b', 'a', 't', 't', 'l', 'e', '.', 'n', 'e', 't', ':', '1', '1', '1', '9', '/', '%', 's', '/', 'v', 'e', 'r', 's', 'i', 'o', 'n', 's' }; } }; } } diff --git a/src/tools/connection_patcher/Program.cpp b/src/tools/connection_patcher/Program.cpp index 400bafbf6ba..7321871b5ba 100644 --- a/src/tools/connection_patcher/Program.cpp +++ b/src/tools/connection_patcher/Program.cpp @@ -28,23 +28,17 @@ #include <CompilerDefs.h> #include <boost/algorithm/string/replace.hpp> -#include <boost/filesystem.hpp> - -#include <iostream> -#include <fstream> -#include <boost/asio.hpp> +#include <boost/program_options.hpp> #if PLATFORM == PLATFORM_WINDOWS #include <Shlobj.h> #endif -using namespace boost::asio; -using boost::asio::ip::tcp; +namespace po = boost::program_options; namespace Connection_Patcher { - void copyDir(boost::filesystem::path const & source, boost::filesystem::path const & destination); - void GetFile(const std::string& serverName, int port, const std::string& getCommand, std::ostream& out); + po::variables_map GetConsoleArguments(int argc, char** argv); namespace { @@ -61,7 +55,7 @@ namespace Connection_Patcher // if (Authentication::ServerSignature::ClientValidateProof(x)) to if (true) patcher.Patch(PATCH::Password(), PATTERN::Password()); - std::string const moduleName(Helper::GetFileChecksum(patcher.binary) + ".auth"); + std::string const moduleName(Helper::GetFileChecksum(patcher.GetBinary()) + ".auth"); fs::path const modulePath (path / std::string(&moduleName[0], 2) / std::string(&moduleName[2], 2)); @@ -91,7 +85,7 @@ namespace Connection_Patcher boost::filesystem::create_directories(modulePath); std::ofstream outFile(module.string(), std::ofstream::out | std::ofstream::binary); - GetFile("xx.depot.battle.net", 1119, "/" + moduleName, outFile); + Helper::DownloadFile("xx.depot.battle.net", 1119, "/" + moduleName, outFile); outFile.close(); std::cout << "Done.\n"; } @@ -100,7 +94,7 @@ namespace Connection_Patcher } template<typename PATCH, typename PATTERN> - void do_patches(Patcher* patcher, boost::filesystem::path output) + void do_patches(Patcher* patcher, boost::filesystem::path output, bool patchVersionPath, uint32_t buildNumber) { std::cout << "patching Portal\n"; // '.logon.battle.net' -> '' to allow for set portal 'host' @@ -121,100 +115,55 @@ namespace Connection_Patcher // Creep::Instance::LoadModule() to allow for unsigned auth module patcher->Patch(PATCH::Signature(), PATTERN::Signature()); + if (patchVersionPath) + { + std::cout << "patching Versions\n"; + // sever the connection to blizzard's versions file to stop it from updating and replace with custom version + // hardcode %s.patch.battle.net:1119/%s/versions to trinity6.github.io/%s/%s/build/versi + std::string verPatch(Patches::Common::VersionsFile()); + std::string buildPattern = "build"; + + boost::algorithm::replace_all(verPatch, buildPattern, std::to_string(buildNumber)); + std::vector<unsigned char> verVec(verPatch.begin(), verPatch.end()); + patcher->Patch(verVec, Patterns::Common::VersionsFile()); + } + patcher->Finish(output); std::cout << "Patching done.\n"; } } - // adapted from http://stackoverflow.com/questions/8593608/how-can-i-copy-a-directory-using-boost-filesystem - void copyDir(boost::filesystem::path const & source, boost::filesystem::path const & destination) + po::variables_map GetConsoleArguments(int argc, char** argv) { - namespace fs = boost::filesystem; - if (!fs::exists(source) || !fs::is_directory(source)) - throw std::invalid_argument("Source directory " + source.string() + " does not exist or is not a directory."); - - if (fs::exists(destination)) - throw std::invalid_argument("Destination directory " + destination.string() + " already exists."); - - if (!fs::create_directory(destination)) - throw std::runtime_error("Unable to create destination directory" + destination.string()); - - for (fs::directory_iterator file(source); file != fs::directory_iterator(); ++file) + po::options_description all("Allowed options"); + all.add_options() + ("help,h", "print usage message") + ("path", po::value<std::string>()->required(), "Path to the Wow.exe") + ("extra,e", po::value<uint32_t>()->implicit_value(0), "Enable patching of versions file download path. Version can be specified explicitly.") + ; + + po::positional_options_description pos; + pos.add("path", 1); + + po::variables_map vm; + try { - fs::path current(file->path()); - if (fs::is_directory(current)) - copyDir(current, destination / current.filename()); - else - fs::copy_file(current, destination / current.filename()); + po::store(po::command_line_parser(argc, argv).options(all).positional(pos).run(), vm); + po::notify(vm); } - } - - // adapted from http://stackoverflow.com/questions/21422094/boostasio-download-image-file-from-server - void GetFile(const std::string& serverName, int port, const std::string& getCommand, std::ostream& out) - { - boost::asio::io_service io_service; - - // Get a list of endpoints corresponding to the server name. - tcp::resolver resolver(io_service); - tcp::resolver::query query(serverName, std::to_string(port)); - tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); - tcp::resolver::iterator end; - - // Try each endpoint until we successfully establish a connection. - tcp::socket socket(io_service); - boost::system::error_code error = boost::asio::error::host_not_found; - while (error && endpoint_iterator != end) + catch (std::exception& e) { - socket.close(); - socket.connect(*endpoint_iterator++, error); + std::cerr << e.what() << "\n"; } - boost::asio::streambuf request; - std::ostream request_stream(&request); - - request_stream << "GET " << getCommand << " HTTP/1.0\r\n"; - request_stream << "Host: " << serverName << ':' << port << "\r\n"; - request_stream << "Accept: */*\r\n"; - request_stream << "Connection: close\r\n\r\n"; - - // Send the request. - boost::asio::write(socket, request); - - // Read the response status line. - boost::asio::streambuf response; - boost::asio::read_until(socket, response, "\r\n"); - - // Check that response is OK. - std::istream response_stream(&response); - std::string http_version; - response_stream >> http_version; - unsigned int status_code; - response_stream >> status_code; - std::string status_message; - std::getline(response_stream, status_message); - - - // Read the response headers, which are terminated by a blank line. - boost::asio::read_until(socket, response, "\r\n\r\n"); - - // Process the response headers. - std::string header; - while (std::getline(response_stream, header) && header != "\r") - { - } + if (vm.count("help")) + std::cout << all << "\n"; - // Write whatever content we already have to output. - if (response.size() > 0) - { - out << &response; - } + if (!vm.count("path")) + throw std::invalid_argument("Wrong number of arguments: Missing client file."); - // Read until EOF, writing data to output as we go. - while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error)) - { - out << &response; - } + return vm; } } @@ -224,11 +173,19 @@ int main(int argc, char** argv) try { - if (argc != 2) - throw std::invalid_argument("Wrong number of arguments: Missing client file."); + bool patchVersionPath = false; + int wowBuild = 0; - std::string const binary_path(argv[1]); + auto vm = GetConsoleArguments(argc, argv); + // exit if help is enabled + if (vm.count("help")) + { + std::cin.get(); + return 0; + } + + std::string const binary_path(std::move(vm["path"].as<std::string>())); std::string renamed_binary_path(binary_path); wchar_t* commonAppData(nullptr); @@ -236,18 +193,32 @@ int main(int argc, char** argv) SHGetKnownFolderPath(FOLDERID_ProgramData, 0, NULL, &commonAppData); #endif - std::cout << "Creating patched binaries for "; + std::cout << "Creating patched binary..." << std::endl; Patcher patcher(binary_path); - switch (patcher.Type) + if (vm.count("extra")) + { + patchVersionPath = true; + wowBuild = vm["extra"].as<uint32_t>(); + + if (wowBuild == 0) + wowBuild = Helper::GetBuildNumber(patcher.GetBinary()); + + if (wowBuild == 0 || wowBuild < 10000 || wowBuild > 65535) // Build number has to be exactly 5 characters long + throw std::runtime_error("Could not retrieve build number or it was out of range. Build: " + std::to_string(wowBuild)); + + std::cout << "Determined build number: " << std::to_string(wowBuild) << std::endl; + } + + switch (patcher.GetType()) { case Constants::BinaryTypes::Pe32: std::cout << "Win32 client...\n"; boost::algorithm::replace_all(renamed_binary_path, ".exe", "_Patched.exe"); do_patches<Patches::Windows::x86, Patterns::Windows::x86> - (&patcher, renamed_binary_path); + (&patcher, renamed_binary_path, patchVersionPath, wowBuild); do_module<Patches::Windows::x86, Patterns::Windows::x86> ( "8f52906a2c85b416a595702251570f96d3522f39237603115f2f1ab24962043c.auth" @@ -260,7 +231,7 @@ int main(int argc, char** argv) boost::algorithm::replace_all(renamed_binary_path, ".exe", "_Patched.exe"); do_patches<Patches::Windows::x64, Patterns::Windows::x64> - (&patcher, renamed_binary_path); + (&patcher, renamed_binary_path, patchVersionPath, wowBuild); do_module<Patches::Windows::x64, Patterns::Windows::x64> ( "0a3afee2cade3a0e8b458c4b4660104cac7fc50e2ca9bef0d708942e77f15c1d.auth" @@ -272,12 +243,12 @@ int main(int argc, char** argv) std::cout << "Mac client...\n"; boost::algorithm::replace_all (renamed_binary_path, ".app", " Patched.app"); - copyDir ( boost::filesystem::path(binary_path).parent_path()/*MacOS*/.parent_path()/*Contents*/.parent_path() + Helper::CopyDir(boost::filesystem::path(binary_path).parent_path()/*MacOS*/.parent_path()/*Contents*/.parent_path() , boost::filesystem::path(renamed_binary_path).parent_path()/*MacOS*/.parent_path()/*Contents*/.parent_path() ); do_patches<Patches::Mac::x64, Patterns::Mac::x64> - (&patcher, renamed_binary_path); + (&patcher, renamed_binary_path, patchVersionPath, wowBuild); { namespace fs = boost::filesystem; @@ -291,7 +262,7 @@ int main(int argc, char** argv) break; default: - throw std::runtime_error("Type: " + std::to_string(static_cast<uint32_t>(patcher.Type)) + " not supported!"); + throw std::runtime_error("Type: " + std::to_string(static_cast<uint32_t>(patcher.GetType())) + " not supported!"); } std::cout << "Successfully created your patched binaries.\n"; diff --git a/src/tools/map_extractor/loadlib/DBFilesClientList.h b/src/tools/map_extractor/loadlib/DBFilesClientList.h index eeb4789cac0..8effbd03e4a 100644 --- a/src/tools/map_extractor/loadlib/DBFilesClientList.h +++ b/src/tools/map_extractor/loadlib/DBFilesClientList.h @@ -22,6 +22,7 @@ char const* DBFilesClientList[] = { "DBFilesClient\\Achievement", "DBFilesClient\\Achievement_Category", + "DBFilesClient\\AdventureJournal", "DBFilesClient\\AnimKit", "DBFilesClient\\AnimKitBoneSet", "DBFilesClient\\AnimKitBoneSetAlias", @@ -32,7 +33,6 @@ char const* DBFilesClientList[] = "DBFilesClient\\AnimReplacement", "DBFilesClient\\AnimReplacementSet", "DBFilesClient\\AnimationData", - "DBFilesClient\\AreaAssignment", "DBFilesClient\\AreaGroup", "DBFilesClient\\AreaGroupMember", "DBFilesClient\\AreaPOI", @@ -99,12 +99,12 @@ char const* DBFilesClientList[] = "DBFilesClient\\CreatureDifficulty", "DBFilesClient\\CreatureDisplayInfo", "DBFilesClient\\CreatureDisplayInfoExtra", + "DBFilesClient\\CreatureDisplayInfoTrn", "DBFilesClient\\CreatureFamily", "DBFilesClient\\CreatureImmunities", "DBFilesClient\\CreatureModelData", "DBFilesClient\\CreatureMovementInfo", "DBFilesClient\\CreatureSoundData", - "DBFilesClient\\CreatureSpellData", "DBFilesClient\\CreatureType", "DBFilesClient\\Criteria", "DBFilesClient\\CriteriaTree", @@ -166,13 +166,16 @@ char const* DBFilesClientList[] = "DBFilesClient\\GarrFollower", "DBFilesClient\\GarrFollowerLevelXP", "DBFilesClient\\GarrFollowerQuality", + "DBFilesClient\\GarrFollowerType", "DBFilesClient\\GarrFollowerXAbility", "DBFilesClient\\GarrMechanic", "DBFilesClient\\GarrMechanicType", "DBFilesClient\\GarrMission", "DBFilesClient\\GarrMissionReward", + "DBFilesClient\\GarrMissionTexture", "DBFilesClient\\GarrMissionType", "DBFilesClient\\GarrMissionXEncounter", + "DBFilesClient\\GarrMssnBonusAbility", "DBFilesClient\\GarrPlot", "DBFilesClient\\GarrPlotBuilding", "DBFilesClient\\GarrPlotInstance", @@ -208,8 +211,8 @@ char const* DBFilesClientList[] = "DBFilesClient\\ImportPriceQuality", "DBFilesClient\\ImportPriceShield", "DBFilesClient\\ImportPriceWeapon", - "DBFilesClient\\Item", "DBFilesClient\\Item-sparse", + "DBFilesClient\\Item", "DBFilesClient\\ItemAppearance", "DBFilesClient\\ItemArmorQuality", "DBFilesClient\\ItemArmorShield", @@ -304,6 +307,7 @@ char const* DBFilesClientList[] = "DBFilesClient\\Mount", "DBFilesClient\\MountCapability", "DBFilesClient\\MountType", + "DBFilesClient\\MountTypeXCapability", "DBFilesClient\\Movie", "DBFilesClient\\MovieFileData", "DBFilesClient\\MovieOverlays", @@ -319,7 +323,6 @@ char const* DBFilesClientList[] = "DBFilesClient\\ObjectEffectPackage", "DBFilesClient\\ObjectEffectPackageElem", "DBFilesClient\\OverrideSpellData", - "DBFilesClient\\Package", "DBFilesClient\\PageTextMaterial", "DBFilesClient\\PaperDollItemFrame", "DBFilesClient\\ParticleColor", @@ -373,7 +376,6 @@ char const* DBFilesClientList[] = "DBFilesClient\\SkillLineAbility", "DBFilesClient\\SkillLineAbilitySortedSpell", "DBFilesClient\\SkillRaceClassInfo", - "DBFilesClient\\SkillTiers", "DBFilesClient\\SoundAmbience", "DBFilesClient\\SoundAmbienceFlavor", "DBFilesClient\\SoundBus", @@ -434,6 +436,7 @@ char const* DBFilesClientList[] = "DBFilesClient\\SpellRadius", "DBFilesClient\\SpellRange", "DBFilesClient\\SpellReagents", + "DBFilesClient\\SpellReagentsCurrency", "DBFilesClient\\SpellRuneCost", "DBFilesClient\\SpellScaling", "DBFilesClient\\SpellShapeshift", |