diff options
Diffstat (limited to 'src')
209 files changed, 8158 insertions, 7506 deletions
diff --git a/src/server/bnetserver/Main.cpp b/src/server/bnetserver/Main.cpp index 86590bfa3f5..68e647d8b15 100644 --- a/src/server/bnetserver/Main.cpp +++ b/src/server/bnetserver/Main.cpp @@ -84,8 +84,8 @@ int main(int argc, char** argv) std::string configFile = _TRINITY_BNET_CONFIG; 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; #if PLATFORM == PLATFORM_WINDOWS @@ -275,6 +275,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_BNET_CONFIG), "use <arg> as configuration file") ; #if PLATFORM == PLATFORM_WINDOWS @@ -300,6 +301,10 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile { 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 822a90b5222..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); } diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 96a25588120..d76d106e81a 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -140,6 +140,30 @@ void CreatureAI::MoveInLineOfSight(Unit* who) // me->GetMotionMaster()->MoveChase(who->GetVictim()); } +// Distract creature, if player gets too close while stealthed/prowling +void CreatureAI::TriggerAlert(Unit const* who) const +{ + // If there's no target, or target isn't a player do nothing + if (!who || who->GetTypeId() != TYPEID_PLAYER) + return; + + // If this unit isn't an NPC, is already distracted, is in combat, is confused, stunned or fleeing, do nothing + if (me->GetTypeId() != TYPEID_UNIT || me->IsInCombat() || me->HasUnitState(UNIT_STATE_CONFUSED | UNIT_STATE_STUNNED | UNIT_STATE_FLEEING | UNIT_STATE_DISTRACTED)) + return; + + // Only alert for hostiles! + if (me->IsCivilian() || me->HasReactState(REACT_PASSIVE) || !me->IsHostileTo(who) || !me->_IsTargetAcceptable(who)) + return; + + // Send alert sound (if any) for this creature + me->SendAIReaction(AI_REACTION_ALERT); + + // Face the unit (stealthed player) and set distracted state for 5 seconds + me->SetFacingTo(me->GetAngle(who->GetPositionX(), who->GetPositionY())); + me->StopMoving(); + me->GetMotionMaster()->MoveDistract(5 * IN_MILLISECONDS); +} + void CreatureAI::EnterEvadeMode() { if (!_EnterEvadeMode()) diff --git a/src/server/game/AI/CreatureAI.h b/src/server/game/AI/CreatureAI.h index 2e862c37c0e..33616d076e7 100644 --- a/src/server/game/AI/CreatureAI.h +++ b/src/server/game/AI/CreatureAI.h @@ -89,6 +89,9 @@ class CreatureAI : public UnitAI // Called if IsVisible(Unit* who) is true at each who move, reaction at visibility zone enter void MoveInLineOfSight_Safe(Unit* who); + // Trigger Creature "Alert" state (creature can see stealthed unit) + void TriggerAlert(Unit const* who) const; + // Called in Creature::Update when deathstate = DEAD. Inherited classes may maniuplate the ability to respawn based on scripted events. virtual bool CanRespawn() { return true; } 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/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp index 66164730219..7ea77341567 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp @@ -120,7 +120,13 @@ void npc_escortAI::MoveInLineOfSight(Unit* who) { if (!me->GetVictim()) { - who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); + // Clear distracted state on combat + if (me->HasUnitState(UNIT_STATE_DISTRACTED)) + { + me->ClearUnitState(UNIT_STATE_DISTRACTED); + me->GetMotionMaster()->Clear(); + } + AttackStart(who); } else if (me->GetMap()->IsDungeon()) diff --git a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp index ab91b0b5b27..856ca1d9e16 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedFollowerAI.cpp @@ -117,7 +117,13 @@ void FollowerAI::MoveInLineOfSight(Unit* who) { if (!me->GetVictim()) { - who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); + // Clear distracted state on combat + if (me->HasUnitState(UNIT_STATE_DISTRACTED)) + { + me->ClearUnitState(UNIT_STATE_DISTRACTED); + me->GetMotionMaster()->Clear(); + } + AttackStart(who); } else if (me->GetMap()->IsDungeon()) diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 74d9e5b4a9c..3157ea4ecd4 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -473,7 +473,13 @@ void SmartAI::MoveInLineOfSight(Unit* who) { if (!me->GetVictim()) { - who->RemoveAurasByType(SPELL_AURA_MOD_STEALTH); + // Clear distracted state on combat + if (me->HasUnitState(UNIT_STATE_DISTRACTED)) + { + me->ClearUnitState(UNIT_STATE_DISTRACTED); + me->GetMotionMaster()->Clear(); + } + AttackStart(who); } else/* if (me->GetMap()->IsDungeon())*/ @@ -585,7 +591,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) @@ -763,6 +773,9 @@ void SmartAI::SetCombatMove(bool on) } else { + if (me->HasUnitState(UNIT_STATE_CONFUSED_MOVE | UNIT_STATE_FLEEING_MOVE)) + return; + me->GetMotionMaster()->MovementExpired(); me->GetMotionMaster()->Clear(true); me->StopMoving(); 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 c5cc5aedb43..6f584821988 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -246,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/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index a665b9e09ae..d6db543d4d8 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -1270,11 +1270,11 @@ bool SmartAIMgr::IsTextValid(SmartScriptHolder const& e, uint32 id) default: if (e.entryOrGuid < 0) { - uint64 entry = uint64(-e.entryOrGuid); - CreatureData const* data = sObjectMgr->GetCreatureData(entry); + ObjectGuid::LowType guid = ObjectGuid::LowType(-e.entryOrGuid); + CreatureData const* data = sObjectMgr->GetCreatureData(guid); if (!data) { - TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u using non-existent Creature guid " UI64FMTD ", skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), entry); + TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u using non-existent Creature guid " UI64FMTD ", skipped.", e.entryOrGuid, e.GetScriptType(), e.event_id, e.GetActionType(), guid); return false; } else diff --git a/src/server/game/Accounts/RBAC.h b/src/server/game/Accounts/RBAC.h index db0fc711fc2..fb5927e9e91 100644 --- a/src/server/game/Accounts/RBAC.h +++ b/src/server/game/Accounts/RBAC.h @@ -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, 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/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/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp index 2c11bd149fd..be9ca9352de 100644 --- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp +++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp @@ -159,7 +159,7 @@ void BattlegroundWS::PostUpdateImpl(uint32 diff) player->CastSpell(player, WS_SPELL_FOCUSED_ASSAULT, true); _flagDebuffState = 1; } - else if (_flagDebuffState == 1 && _flagSpellForceTimer >= 900000) //15 minutes + else if (_flagDebuffState == 1 && _flagSpellForceTimer >= 15*MINUTE*IN_MILLISECONDS) //15 minutes { if (Player* player = ObjectAccessor::FindPlayer(m_FlagKeepers[0])) { 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/Chat.cpp b/src/server/game/Chat/Chat.cpp index 52c52726b73..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); diff --git a/src/server/game/Chat/ChatLink.cpp b/src/server/game/Chat/ChatLink.cpp index 89a7d64c432..301b0076dd3 100644 --- a/src/server/game/Chat/ChatLink.cpp +++ b/src/server/game/Chat/ChatLink.cpp @@ -102,8 +102,8 @@ bool ChatLink::ValidateName(char* buffer, const char* /*context*/) return true; } -// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:0:reporter_level|h[name]|h|r -// |cffa335ee|Hitem:812:0:0:0:0:0:0:0:70|h[Glowing Brightwood Staff]|h|r +// |color|Hitem:item_id:perm_ench_id:gem1:gem2:gem3:0:random_property:property_seed:reporter_level:upgrade_id:context:numBonusListIDs|h[name]|h|r +// |cffa335ee|Hitem:124382:0:0:0:0:0:0:0:0:0:0:0:4:42:562:565:567|h[Edict of Argus]|h|r"); bool ItemChatLink::Initialize(std::istringstream& iss) { // Read item entry @@ -113,6 +113,7 @@ bool ItemChatLink::Initialize(std::istringstream& iss) TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading item entry", iss.str().c_str()); return false; } + // Validate item _item = sObjectMgr->GetItemTemplate(itemEntry); if (!_item) @@ -120,15 +121,23 @@ bool ItemChatLink::Initialize(std::istringstream& iss) TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): got invalid itemEntry %u in |item command", iss.str().c_str(), itemEntry); return false; } + // Validate item's color - if (_color != ItemQualityColors[_item->GetQuality()]) + uint32 colorQuality = _item->GetQuality(); + if (_item->GetFlags3() & ITEM_FLAG3_HEIRLOOM_QUALITY) + colorQuality = ITEM_QUALITY_HEIRLOOM; + + if (_color != ItemQualityColors[colorQuality]) { - TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): linked item has color %u, but user claims %u", iss.str().c_str(), ItemQualityColors[_item->GetQuality()], _color); + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): linked item has color %u, but user claims %u", iss.str().c_str(), ItemQualityColors[colorQuality], _color); return false; } + // Number of various item properties after item entry - const uint8 propsCount = 8; - const uint8 randomPropertyPosition = 5; + uint8 const propsCount = 11; + uint8 const randomPropertyPosition = 5; + uint8 const numBonusListIDsPosition = 10; + uint8 const maxBonusListIDs = 100; for (uint8 index = 0; index < propsCount; ++index) { if (!CheckDelimiter(iss, DELIMITER, "item")) @@ -162,18 +171,51 @@ bool ItemChatLink::Initialize(std::istringstream& iss) } } } + if (index == numBonusListIDsPosition) + { + if (id > maxBonusListIDs) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): too many item bonus list IDs %u in |item command", iss.str().c_str(), id); + return false; + } + + _bonusListIDs.resize(id); + } + _data[index] = id; } + + for (uint32 index = 0; index < _bonusListIDs.size(); ++index) + { + if (!CheckDelimiter(iss, DELIMITER, "item")) + return false; + + int32 id = 0; + if (!ReadInt32(iss, id)) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): sequence finished unexpectedly while reading item bonus list id (%u)", iss.str().c_str(), index); + return false; + } + + if (!sDB2Manager.GetItemBonusList(id)) + { + TC_LOG_TRACE("chat.system", "ChatHandler::isValidChatMessage('%s'): got invalid item bonus list id %d in |item command", iss.str().c_str(), id); + return false; + } + + _bonusListIDs[index] = id; + } + 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 +223,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..2a463e36e39 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,10 +66,11 @@ 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]; + int32 _data[11]; + std::vector<int32> _bonusListIDs; ItemRandomSuffixEntry const* _suffix; ItemRandomPropertiesEntry const* _property; }; 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..59249b02612 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,99 @@ 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; + + sChrClassesXPowerTypesStore.Sort(&ChrClassesXPowerTypesEntryComparator::Compare); + for (uint32 i = 0; i < MAX_CLASSES; ++i) + for (uint32 j = 0; j < MAX_POWERS; ++j) + _powersByClass[i][j] = MAX_POWERS; + + for (ChrClassesXPowerTypesEntry const* power : sChrClassesXPowerTypesStore) + { + 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 (GlyphSlotEntry const* glyphSlot : sGlyphSlotStore) + if (glyphSlot->Type == GLYPH_SLOT_MAJOR || glyphSlot->Type == GLYPH_SLOT_MINOR) + _glyphSlots.insert(glyphSlot); + for (ItemBonusEntry const* bonus : sItemBonusStore) _itemBonusLists[bonus->BonusListID].push_back(bonus); @@ -209,6 +323,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 +342,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 +355,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 +461,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 +484,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 +578,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 @@ -465,13 +611,13 @@ uint32 DB2Manager::GetHeirloomItemLevel(uint32 curveId, uint32 level) const return uint32(previousItr->second->Y); // Lowest scaling point } -DB2Manager::ItemBonusList DB2Manager::GetItemBonusList(uint32 bonusListId) const +DB2Manager::ItemBonusList const* DB2Manager::GetItemBonusList(uint32 bonusListId) const { auto itr = _itemBonusLists.find(bonusListId); if (itr != _itemBonusLists.end()) - return itr->second; + return &itr->second; - return ItemBonusList(); + return nullptr; } std::set<uint32> DB2Manager::GetItemBonusTree(uint32 itemId, uint32 itemBonusTreeMod) const @@ -512,6 +658,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 +698,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 +716,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 +734,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; @@ -585,3 +784,24 @@ std::vector<SpellPowerEntry const*> DB2Manager::GetSpellPowers(uint32 spellId, D return powers; } + +bool DB2Manager::ChrClassesXPowerTypesEntryComparator::Compare(ChrClassesXPowerTypesEntry const* left, ChrClassesXPowerTypesEntry const* right) +{ + if (left->ClassID != right->ClassID) + return left->ClassID < right->ClassID; + return left->PowerType < right->PowerType; +} + +bool DB2Manager::GlyphSlotEntryComparator::Compare(GlyphSlotEntry const* left, GlyphSlotEntry const* right) +{ + if (left->Tooltip != right->Tooltip) + return left->Tooltip < right->Tooltip; + return left->Type > right->Type; +} + +bool DB2Manager::MountTypeXCapabilityEntryComparator::Compare(MountTypeXCapabilityEntry const* left, MountTypeXCapabilityEntry const* right) +{ + if (left->MountTypeID == right->MountTypeID) + return left->OrderIndex > right->OrderIndex; + return left->ID < right->ID; +} diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index a79b3d1c1fa..59931769c4a 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 { @@ -73,20 +112,38 @@ struct HotfixNotify typedef std::vector<HotfixNotify> HotfixData; +#define DEFINE_DB2_SET_COMPARATOR(structure) \ + struct structure ## Comparator : public std::binary_function<structure const*, structure const*, bool> \ + { \ + bool operator()(structure const* left, structure const* right) const { return Compare(left, right); } \ + static bool Compare(structure const* left, structure const* right); \ + }; + class DB2Manager { public: + DEFINE_DB2_SET_COMPARATOR(ChrClassesXPowerTypesEntry); + DEFINE_DB2_SET_COMPARATOR(GlyphSlotEntry); + DEFINE_DB2_SET_COMPARATOR(MountTypeXCapabilityEntry); + 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::set<GlyphSlotEntry const*, GlyphSlotEntryComparator> GlyphSlotContainer; 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*, MountTypeXCapabilityEntryComparator> 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 +162,22 @@ 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; + GlyphSlotContainer const& GetGlyphSlots() const { return _glyphSlots; } uint32 GetHeirloomItemLevel(uint32 curveId, uint32 level) const; - ItemBonusList GetItemBonusList(uint32 bonusListId) const; + ItemBonusList const* 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 +185,21 @@ private: HotfixData _hotfixData; AreaGroupMemberContainer _areaGroupMembers; + CharStartOutfitContainer _charStartOutfits; + uint32 _powersByClass[MAX_CLASSES][MAX_POWERS]; + GlyphSlotContainer _glyphSlots; 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..b7f3356176e 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[] = "iii"; +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/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index 719e539a9c4..d7125293671 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -494,6 +494,13 @@ enum AbilytyLearnType SKILL_LINE_ABILITY_LEARNED_ON_SKILL_LEARN = 2 // Spell will be learned/removed together with entire skill }; +enum GlyphSlotType +{ + GLYPH_SLOT_MAJOR = 0, + GLYPH_SLOT_MINOR = 1, + GLYPH_SLOT_PRIME = 2 +}; + enum ItemEnchantmentType { ITEM_ENCHANTMENT_TYPE_NONE = 0, diff --git a/src/server/game/DataStores/DBCStores.cpp b/src/server/game/DataStores/DBCStores.cpp index fcc6a23ddf3..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,20 +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); @@ -154,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. @@ -180,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); @@ -221,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); @@ -236,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) @@ -308,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 { @@ -356,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 @@ -372,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); @@ -447,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)) @@ -462,116 +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, sGuildColorBackgroundStore, dbcPath, "GuildColorBackground.dbc");//19865 - LoadDBC(availableDbcLocales, bad_dbc_files, sGuildColorBorderStore, dbcPath, "GuildColorBorder.dbc"); //19865 - LoadDBC(availableDbcLocales, bad_dbc_files, sGuildColorEmblemStore, dbcPath, "GuildColorEmblem.dbc");//19865 - - 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); @@ -582,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); @@ -612,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)) @@ -625,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) @@ -698,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); @@ -711,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) @@ -997,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)); @@ -1069,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 03eda581f28..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, @@ -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,19 +165,12 @@ extern GameTable <GtRegenMPPerSptEntry> sGtRegenMPPerSptStore; extern GameTable <GtSpellScalingEntry> sGtSpellScalingStore; extern GameTable <GtOCTBaseHPByClassEntry> sGtOCTBaseHPByClassStore; extern GameTable <GtOCTBaseMPByClassEntry> sGtOCTBaseMPByClassStore; -extern DBCStorage <GuildPerkSpellsEntry> sGuildPerkSpellsStore; extern DBCStorage <GuildColorBackgroundEntry> sGuildColorBackgroundStore; extern DBCStorage <GuildColorBorderEntry> sGuildColorBorderStore; extern DBCStorage <GuildColorEmblemEntry> sGuildColorEmblemStore; -extern DBCStorage <ImportPriceArmorEntry> sImportPriceArmorStore; -extern DBCStorage <ImportPriceQualityEntry> sImportPriceQualityStore; -extern DBCStorage <ImportPriceShieldEntry> sImportPriceShieldStore; -extern DBCStorage <ImportPriceWeaponEntry> sImportPriceWeaponStore; -extern DBCStorage <ItemPriceBaseEntry> sItemPriceBaseStore; 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; @@ -206,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; @@ -267,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 aac3cbd2193..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,13 +798,6 @@ struct GtOCTBaseMPByClassEntry float ratio; }; -struct GuildPerkSpellsEntry -{ - //uint32 ID; // 0 - uint32 GuildLevel; // 1 - uint32 SpellID; // 2 -}; - // GuildColorBackground.dbc struct GuildColorBackgroundEntry { @@ -980,45 +825,6 @@ struct GuildColorEmblemEntry //uint8 Blue; }; -// 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 -}; - -// ImportPriceWeapon.dbc -struct ImportPriceWeaponEntry -{ - uint32 ID; // 1 Unk id (mainhand - 0, offhand - 1, weapon - 2, 2hweapon - 3, ranged/rangedright/relic - 4) - float Factor; // 2 Price factor -}; - -// ItemPriceBase.dbc -struct ItemPriceBaseEntry -{ - uint32 ItemLevel; // 2 Item level (1 - 1000) - float ArmorFactor; // 3 Price factor for armor - float WeaponFactor; // 4 Price factor for weapons -}; - // common struct for: // ItemDamageAmmo.dbc // ItemDamageOneHand.dbc @@ -1056,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 @@ -1085,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 @@ -1147,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 @@ -1188,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); } @@ -1230,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 }; @@ -1252,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 @@ -1346,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 @@ -1375,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 @@ -1405,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 @@ -1437,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 @@ -1494,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 { @@ -1621,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 @@ -1646,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 { @@ -1765,12 +1392,6 @@ struct SpellScalingEntry uint32 ScalesFromItemLevel; // 8 }; -struct SpellDurationEntry -{ - uint32 ID; - int32 Duration[3]; -}; - #define MAX_ITEM_ENCHANTMENT_EFFECTS 3 struct SpellItemEnchantmentEntry @@ -1795,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; @@ -1839,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 @@ -2034,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 @@ -2100,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 c7aa00286e1..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,62 +75,36 @@ char const GtRegenMPPerSptfmt[] = "xf"; char const GtSpellScalingfmt[] = "df"; char const GtOCTBaseHPByClassfmt[] = "df"; char const GtOCTBaseMPByClassfmt[] = "df"; -char const GuildPerkSpellsfmt[] = "dii"; char const GuildColorBackgroundfmt[] = "nXXX"; char const GuildColorBorderfmt[] = "nXXX"; char const GuildColorEmblemfmt[] = "nXXX"; -char const ImportPriceArmorfmt[] = "nffff"; -char const ImportPriceQualityfmt[] = "nf"; -char const ImportPriceShieldfmt[] = "nf"; -char const ImportPriceWeaponfmt[] = "nf"; -char const ItemPriceBasefmt[] = "diff"; 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"; @@ -152,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"; @@ -167,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 3e2f1874147..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 @@ -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 948579cd419..dc00a7ead69 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -1786,13 +1786,13 @@ void GameObject::Use(Unit* user) Player* player = user->ToPlayer(); - // fallback, will always work - player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET); - WorldPackets::Misc::EnableBarberShop packet; player->SendDirectMessage(packet.Write()); - player->SetStandState(UnitStandStateType(UNIT_STAND_STATE_SIT_LOW_CHAIR + info->barberChair.chairheight)); + // fallback, will always work + player->TeleportTo(GetMapId(), GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation(), TELE_TO_NOT_LEAVE_TRANSPORT | TELE_TO_NOT_LEAVE_COMBAT | TELE_TO_NOT_UNSUMMON_PET); + + player->SetStandState(UnitStandStateType(UNIT_STAND_STATE_SIT_LOW_CHAIR + info->barberChair.chairheight), info->barberChair.SitAnimKit); return; } default: @@ -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 diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index c61f1ba87c4..efd2eba2d00 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]; @@ -793,6 +804,7 @@ struct GameObjectLocale { StringVector Name; StringVector CastBarCaption; + StringVector Unk1; }; // `gameobject_addon` table diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index 7250c0cff23..70d63a853e7 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -1792,10 +1792,12 @@ uint32 Item::GetVisibleAppearanceModId() const void Item::AddBonuses(uint32 bonusListID) { - DB2Manager::ItemBonusList bonuses = sDB2Manager.GetItemBonusList(bonusListID); - AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID); - for (ItemBonusEntry const* bonus : bonuses) - _bonusData.AddBonus(bonus->Type, bonus->Value); + if (DB2Manager::ItemBonusList const* bonuses = sDB2Manager.GetItemBonusList(bonusListID)) + { + AddDynamicValue(ITEM_DYNAMIC_FIELD_BONUSLIST_IDS, bonusListID); + for (ItemBonusEntry const* bonus : *bonuses) + _bonusData.AddBonus(bonus->Type, bonus->Value); + } } void BonusData::Initialize(ItemTemplate const* proto) diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 92597cf66ae..4a819a892b5 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; @@ -1940,7 +1944,7 @@ float WorldObject::GetSightRange(const WorldObject* target) const return 0.0f; } -bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, bool distanceCheck) const +bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, bool distanceCheck, bool checkAlert) const { if (this == obj) return true; @@ -2012,7 +2016,7 @@ bool WorldObject::CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth, boo if (obj->IsInvisibleDueToDespawn()) return false; - if (!CanDetect(obj, ignoreStealth)) + if (!CanDetect(obj, ignoreStealth, checkAlert)) return false; return true; @@ -2023,7 +2027,7 @@ bool WorldObject::CanNeverSee(WorldObject const* obj) const return GetMap() != obj->GetMap() || !IsInPhase(obj); } -bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth) const +bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkAlert) const { const WorldObject* seer = this; @@ -2038,7 +2042,7 @@ bool WorldObject::CanDetect(WorldObject const* obj, bool ignoreStealth) const if (!ignoreStealth && !seer->CanDetectInvisibilityOf(obj)) return false; - if (!ignoreStealth && !seer->CanDetectStealthOf(obj)) + if (!ignoreStealth && !seer->CanDetectStealthOf(obj, checkAlert)) return false; return true; @@ -2068,7 +2072,7 @@ bool WorldObject::CanDetectInvisibilityOf(WorldObject const* obj) const return true; } -bool WorldObject::CanDetectStealthOf(WorldObject const* obj) const +bool WorldObject::CanDetectStealthOf(WorldObject const* obj, bool checkAlert) const { // Combat reach is the minimal distance (both in front and behind), // and it is also used in the range calculation. @@ -2118,9 +2122,19 @@ bool WorldObject::CanDetectStealthOf(WorldObject const* obj) const // Calculate max distance float visibilityRange = float(detectionValue) * 0.3f + combatReach; - if (visibilityRange > MAX_PLAYER_STEALTH_DETECT_RANGE) + // If this unit is an NPC then player detect range doesn't apply + if (unit && unit->GetTypeId() == TYPEID_PLAYER && visibilityRange > MAX_PLAYER_STEALTH_DETECT_RANGE) visibilityRange = MAX_PLAYER_STEALTH_DETECT_RANGE; + // When checking for alert state, look 8% further, and then 1.5 yards more than that. + if (checkAlert) + visibilityRange += (visibilityRange * 0.08f) + 1.5f; + + // If checking for alert, and creature's visibility range is greater than aggro distance, No alert + Unit const* tunit = obj->ToUnit(); + if (checkAlert && unit && unit->ToCreature() && visibilityRange >= unit->ToCreature()->GetAttackDistance(tunit) + unit->ToCreature()->m_CombatDistance) + return false; + if (distance > visibilityRange) return false; } diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index b9a6320a835..ff5ab997385 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -560,7 +560,7 @@ class WorldObject : public Object, public WorldLocation float GetGridActivationRange() const; float GetVisibilityRange() const; float GetSightRange(WorldObject const* target = NULL) const; - bool CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth = false, bool distanceCheck = false) const; + bool CanSeeOrDetect(WorldObject const* obj, bool ignoreStealth = false, bool distanceCheck = false, bool checkAlert = false) const; FlaggedValuesArray32<int32, uint32, StealthType, TOTAL_STEALTH_TYPES> m_stealth; FlaggedValuesArray32<int32, uint32, StealthType, TOTAL_STEALTH_TYPES> m_stealthDetect; @@ -693,9 +693,9 @@ class WorldObject : public Object, public WorldLocation bool CanNeverSee(WorldObject const* obj) const; virtual bool CanAlwaysSee(WorldObject const* /*obj*/) const { return false; } - bool CanDetect(WorldObject const* obj, bool ignoreStealth) const; + bool CanDetect(WorldObject const* obj, bool ignoreStealth, bool checkAlert = false) const; bool CanDetectInvisibilityOf(WorldObject const* obj) const; - bool CanDetectStealthOf(WorldObject const* obj) const; + bool CanDetectStealthOf(WorldObject const* obj, bool checkAlert = false) const; uint16 m_aiAnimKitId; uint16 m_movementAnimKitId; 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 b6430a8dd26..6055402d45a 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -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) { @@ -1911,14 +1909,8 @@ void Pet::SynchronizeLevelWithOwner() { // always same level case SUMMON_PET: - GivePetLevel(owner->getLevel()); - break; - // can't be greater owner level case HUNTER_PET: - if (getLevel() > owner->getLevel()) - GivePetLevel(owner->getLevel()); - else if (getLevel() + 5 < owner->getLevel()) - GivePetLevel(owner->getLevel() - 5); + GivePetLevel(owner->getLevel()); break; default: break; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 59d2b0e064c..68c50d46267 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -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) { @@ -2414,7 +2414,7 @@ void Player::Regenerate(Powers power) // Skip regeneration for power type we cannot have uint32 powerIndex = GetPowerIndex(power); - if (powerIndex == MAX_POWERS) + if (powerIndex == MAX_POWERS || powerIndex >= MAX_POWERS_PER_CLASS) return; float addvalue = 0.0f; @@ -3093,6 +3093,7 @@ void Player::InitStatsForLevel(bool reapplyMods) SetUInt32Value(PLAYER_FIELD_MOD_HEALING_DONE_POS, 0); SetFloatValue(PLAYER_FIELD_MOD_HEALING_PCT, 1.0f); SetFloatValue(PLAYER_FIELD_MOD_HEALING_DONE_PCT, 1.0f); + SetFloatValue(PLAYER_FIELD_MOD_PERIODIC_HEALING_DONE_PERCENT, 1.0f); for (uint8 i = 0; i < 7; ++i) { SetUInt32Value(PLAYER_FIELD_MOD_DAMAGE_DONE_NEG+i, 0); @@ -3113,7 +3114,11 @@ void Player::InitStatsForLevel(bool reapplyMods) SetFloatValue(UNIT_FIELD_MAXOFFHANDDAMAGE, 0.0f); SetFloatValue(UNIT_FIELD_MINRANGEDDAMAGE, 0.0f); SetFloatValue(UNIT_FIELD_MAXRANGEDDAMAGE, 0.0f); - SetFloatValue(PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS, 1.0f); + for (uint16 i = 0; i < 3; ++i) + { + SetFloatValue(PLAYER_FIELD_WEAPON_DMG_MULTIPLIERS + i, 1.0f); + SetFloatValue(PLAYER_FIELD_WEAPON_ATK_SPEED_MULTIPLIERS + i, 1.0f); + } SetInt32Value(UNIT_FIELD_ATTACK_POWER, 0); SetFloatValue(UNIT_FIELD_ATTACK_POWER_MULTIPLIER, 0.0f); @@ -4478,10 +4483,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); @@ -4722,7 +4723,7 @@ void Player::ResurrectPlayer(float restore_percent, bool applySickness) setDeathState(ALIVE); - SetWaterWalking(false); + SetWaterWalking(false, true); if (!HasUnitState(UNIT_STATE_STUNNED)) SetRooted(false); @@ -8279,7 +8280,7 @@ void Player::CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 } } -void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 castCount, uint32 misc) +void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 castCount, int32* misc) { ItemTemplate const* proto = item->GetTemplate(); // special learning case @@ -8329,7 +8330,8 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); spell->m_CastItem = item; spell->m_cast_count = castCount; // set count of casts - spell->m_misc.Data = misc; + spell->m_misc.Raw.Data[0] = misc[0]; + spell->m_misc.Raw.Data[1] = misc[1]; spell->prepare(&targets); ++count; @@ -8357,7 +8359,8 @@ void Player::CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 Spell* spell = new Spell(this, spellInfo, (count > 0) ? TRIGGERED_FULL_MASK : TRIGGERED_NONE); spell->m_CastItem = item; spell->m_cast_count = castCount; // set count of casts - spell->m_misc.Data = misc; // glyph index + spell->m_misc.Raw.Data[0] = misc[0]; + spell->m_misc.Raw.Data[1] = misc[1]; spell->prepare(&targets); ++count; @@ -9511,13 +9514,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)); } } } @@ -11897,14 +11896,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); } } @@ -13598,10 +13597,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) { @@ -14661,6 +14660,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()); @@ -14796,7 +14800,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) { @@ -14883,7 +14887,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)) @@ -15515,7 +15519,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) @@ -16345,12 +16349,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; @@ -16667,9 +16671,9 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) //"resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " // 40 41 42 43 44 45 //"totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - // 46 47 48 49 50 51 52 53 54 55 56 - //"health, power1, power2, power3, power4, power5, instance_id, speccount, activespec, exploredZones, equipmentCache, " - // 57 58 59 60 61 + // 46 47 48 49 50 51 52 53 54 55 56 57 + //"health, power1, power2, power3, power4, power5, power6, instance_id, speccount, activespec, exploredZones, equipmentCache, " + // 58 59 60 61 62 //"knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty FROM characters WHERE guid = '%u'", guid); PreparedQueryResult result = holder->GetPreparedResult(PLAYER_LOGIN_QUERY_LOAD_FROM); if (!result) @@ -16739,8 +16743,8 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) SetUInt32Value(UNIT_FIELD_LEVEL, fields[6].GetUInt8()); SetUInt32Value(PLAYER_XP, fields[7].GetUInt32()); - _LoadIntoDataField(fields[55].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); - _LoadIntoDataField(fields[57].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); + _LoadIntoDataField(fields[56].GetCString(), PLAYER_EXPLORED_ZONES_1, PLAYER_EXPLORED_ZONES_SIZE); + _LoadIntoDataField(fields[58].GetCString(), PLAYER__FIELD_KNOWN_TITLES, KNOWN_TITLES_SIZE*2); SetObjectScale(1.0f); SetFloatValue(UNIT_FIELD_HOVERHEIGHT, 1.0f); @@ -16774,7 +16778,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) } // set which actionbars the client has active - DO NOT REMOVE EVER AGAIN (can be changed though, if it does change fieldwise) - SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[58].GetUInt8()); + SetByteValue(PLAYER_FIELD_BYTES, PLAYER_FIELD_BYTES_OFFSET_ACTION_BAR_TOGGLES, fields[59].GetUInt8()); InitDisplayIds(); @@ -16807,11 +16811,11 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) Relocate(fields[12].GetFloat(), fields[13].GetFloat(), fields[14].GetFloat(), fields[16].GetFloat()); uint32 mapId = fields[15].GetUInt16(); - uint32 instanceId = fields[52].GetUInt32(); + uint32 instanceId = fields[53].GetUInt32(); SetDungeonDifficultyID(CheckLoadedDungeonDifficultyID(Difficulty(fields[39].GetUInt8()))); - SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[60].GetUInt8()))); - SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[61].GetUInt8()))); + SetRaidDifficultyID(CheckLoadedRaidDifficultyID(Difficulty(fields[61].GetUInt8()))); + SetLegacyRaidDifficultyID(CheckLoadedLegacyRaidDifficultyID(Difficulty(fields[62].GetUInt8()))); std::string taxi_nodes = fields[38].GetString(); @@ -18202,7 +18206,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); } @@ -18242,7 +18246,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()); @@ -18268,7 +18272,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()); @@ -18295,7 +18299,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()); @@ -18321,7 +18325,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()); @@ -22577,6 +22581,7 @@ void Player::SendInitialPacketsBeforeAddToMap() // worldServerInfo.RestrictedAccountMaxLevel; /// @todo // worldServerInfo.RestrictedAccountMaxMoney; /// @todo worldServerInfo.DifficultyID = GetMap()->GetDifficultyID(); + // worldServerInfo.XRealmPvpAlert; /// @todo SendDirectMessage(worldServerInfo.Write()); // SMSG_ACCOUNT_MOUNT_UPDATE @@ -22674,15 +22679,17 @@ void Player::SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 GetSession()->SendPacket(transferAborted.Write()); } -void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time) +void Player::SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool welcome) { // type of warning, based on the time remaining until reset uint32 type; - if (time > 3600) + if (welcome) + type = RAID_INSTANCE_WELCOME; + else if (time > 21600) type = RAID_INSTANCE_WELCOME; - else if (time > 900 && time <= 3600) + else if (time > 3600) type = RAID_INSTANCE_WARNING_HOURS; - else if (time > 300 && time <= 900) + else if (time > 300) type = RAID_INSTANCE_WARNING_MIN; else type = RAID_INSTANCE_WARNING_MIN_SOON; @@ -22847,7 +22854,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) @@ -23095,7 +23102,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); @@ -23116,7 +23123,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(); @@ -23134,7 +23141,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); @@ -23148,7 +23155,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(); @@ -23621,22 +23628,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) @@ -23759,6 +23753,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); } @@ -24310,20 +24307,16 @@ uint32 Player::GetBarberShopCost(BarberShopStyleEntry const* newHairStyle, uint8 void Player::InitGlyphsForLevel() { - uint32 slot = 0; - for (uint32 i = 0; i < sGlyphSlotStore.GetNumRows() && slot < MAX_GLYPH_SLOT_INDEX; ++i) - if (GlyphSlotEntry const* gs = sGlyphSlotStore.LookupEntry(i)) - SetGlyphSlot(slot++, gs->ID); - - uint8 level = getLevel(); uint32 slotMask = 0; + uint8 slot = 0; + uint8 level = getLevel(); + for (GlyphSlotEntry const* gs : sDB2Manager.GetGlyphSlots()) + { + if (level >= ((gs->Tooltip + 1) * 25)) + slotMask |= 1 << slot; - if (level >= 25) - slotMask |= 0x01 | 0x02 | 0x40; - if (level >= 50) - slotMask |= 0x04 | 0x08 | 0x80; - if (level >= 75) - slotMask |= 0x10 | 0x20 | 0x100; + SetGlyphSlot(slot++, gs->ID); + } SetUInt32Value(PLAYER_GLYPHS_ENABLED, slotMask); } @@ -25437,7 +25430,6 @@ void Player::_SaveGlyphs(SQLTransaction& trans) stmt->setUInt64(0, GetGUID().GetCounter()); trans->Append(stmt); - for (uint8 group = 0; group < GetTalentGroupsCount(); ++group) { uint8 index = 0; @@ -26620,7 +26612,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) { @@ -26642,7 +26634,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 2c3e7d38c31..2455fc54646 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 { @@ -1366,7 +1366,7 @@ class Player : public Unit, public GridObject<Player> void SendInitialPacketsAfterAddToMap(); void SendSupercededSpell(uint32 oldSpell, uint32 newSpell); void SendTransferAborted(uint32 mapid, TransferAbortReason reason, uint8 arg = 0); - void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time); + void SendInstanceResetWarning(uint32 mapid, Difficulty difficulty, uint32 time, bool welcome); bool CanInteractWithQuestGiver(Object* questGiver); Creature* GetNPCIfCanInteractWith(ObjectGuid guid, uint64 npcflagmask); @@ -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; } @@ -2291,7 +2292,7 @@ class Player : public Unit, public GridObject<Player> void UpdateItemSetAuras(bool formChange = false); void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx); - void CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 castCount, uint32 misc); + void CastItemUseSpell(Item* item, SpellCastTargets const& targets, uint8 castCount, int32* misc); void CastItemCombatSpell(Unit* target, WeaponAttackType attType, uint32 procVictim, uint32 procEx, Item* item, ItemTemplate const* proto); void SendEquipmentSetList(); diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index e61c23c8c37..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()) { diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index e94ab61265c..54a79f3e1fd 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -318,6 +318,28 @@ Unit::~Unit() ASSERT(m_dynObj.empty()); } +// Check if unit in combat with specific unit +bool Unit::IsInCombatWith(Unit const* who) const +{ + // Check target exists + if (!who) + return false; + + // Search in threat list + ObjectGuid guid = who->GetGUID(); + for (ThreatContainer::StorageType::const_iterator i = m_ThreatManager.getThreatList().begin(); i != m_ThreatManager.getThreatList().end(); ++i) + { + HostileReference* ref = (*i); + + // Return true if the unit matches + if (ref && ref->getUnitGuid() == guid) + return true; + } + + // Nothing found, false. + return false; +} + void Unit::Update(uint32 p_time) { // WARNING! Order of execution here is important, do not change. @@ -1741,6 +1763,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 +5647,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 +5729,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; @@ -6798,7 +6828,7 @@ bool Unit::HandleProcTriggerSpell(Unit* victim, uint32 damage, AuraEffect* trigg // Item - Shaman T10 Enhancement 4P Bonus if (AuraEffect const* aurEff = GetAuraEffect(70832, 0)) if (Aura const* maelstrom = GetAura(53817)) - if ((maelstrom->GetStackAmount() == maelstrom->GetSpellInfo()->StackAmount - 1) && roll_chance_i(aurEff->GetAmount())) + if ((maelstrom->GetStackAmount() == maelstrom->GetSpellInfo()->StackAmount) && roll_chance_i(aurEff->GetAmount())) CastSpell(this, 70831, true, castItem, triggeredByAura); break; } @@ -9256,6 +9286,26 @@ bool Unit::IsImmunedToSpell(SpellInfo const* spellInfo) const return false; } +uint32 Unit::GetSchoolImmunityMask() const +{ + uint32 mask = 0; + SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_SCHOOL]; + for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr) + mask |= itr->type; + + return mask; +} + +uint32 Unit::GetMechanicImmunityMask() const +{ + uint32 mask = 0; + SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC]; + for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr) + mask |= (1 << itr->type); + + return mask; +} + bool Unit::IsImmunedToSpellEffect(SpellInfo const* spellInfo, uint32 index) const { if (!spellInfo) @@ -9693,11 +9743,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); @@ -9705,9 +9755,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; @@ -9745,7 +9795,7 @@ MountCapabilityEntry const* Unit::GetMountCapability(uint32 mountType) const return mountCapability; } - return NULL; + return nullptr; } bool Unit::IsServiceProvider() const @@ -9943,8 +9993,8 @@ bool Unit::_IsValidAttackTarget(Unit const* target, SpellInfo const* bySpell, Wo if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target)) return false; - // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit. - if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea(GetMap()->GetDifficultyID())) : !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea(GetMap()->GetDifficultyID())))) + // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit. Ignore stealth if target is player and unit in combat with same player + if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_INVISIBLE)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea(GetMap()->GetDifficultyID())) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea(GetMap()->GetDifficultyID())) || (target->GetTypeId() == TYPEID_PLAYER && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target))))) return false; // can't attack dead @@ -10403,6 +10453,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) @@ -10984,7 +11041,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; } @@ -11490,7 +11547,7 @@ void Unit::SetMaxHealth(uint32 val) int32 Unit::GetPower(Powers power) const { uint32 powerIndex = GetPowerIndex(power); - if (powerIndex == MAX_POWERS) + if (powerIndex == MAX_POWERS || powerIndex >= MAX_POWERS_PER_CLASS) return 0; return GetUInt32Value(UNIT_FIELD_POWER + powerIndex); @@ -11499,7 +11556,7 @@ int32 Unit::GetPower(Powers power) const int32 Unit::GetMaxPower(Powers power) const { uint32 powerIndex = GetPowerIndex(power); - if (powerIndex == MAX_POWERS) + if (powerIndex == MAX_POWERS || powerIndex >= MAX_POWERS_PER_CLASS) return 0; return GetInt32Value(UNIT_FIELD_MAXPOWER + powerIndex); @@ -11508,7 +11565,7 @@ int32 Unit::GetMaxPower(Powers power) const void Unit::SetPower(Powers power, int32 val) { uint32 powerIndex = GetPowerIndex(power); - if (powerIndex == MAX_POWERS) + if (powerIndex == MAX_POWERS || powerIndex >= MAX_POWERS_PER_CLASS) return; int32 maxPower = int32(GetMaxPower(power)); @@ -11542,7 +11599,7 @@ void Unit::SetPower(Powers power, int32 val) void Unit::SetMaxPower(Powers power, int32 val) { uint32 powerIndex = GetPowerIndex(power); - if (powerIndex == MAX_POWERS) + if (powerIndex == MAX_POWERS || powerIndex >= MAX_POWERS_PER_CLASS) return; int32 cur_power = GetPower(power); @@ -11574,7 +11631,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 @@ -12672,7 +12729,7 @@ bool Unit::IsStandState() const return !IsSitState() && s != UNIT_STAND_STATE_SLEEP && s != UNIT_STAND_STATE_KNEEL; } -void Unit::SetStandState(UnitStandStateType state) +void Unit::SetStandState(UnitStandStateType state, uint32 animKitID /* = 0*/) { SetByteValue(UNIT_FIELD_BYTES_1, 0, uint8(state)); @@ -12681,7 +12738,7 @@ void Unit::SetStandState(UnitStandStateType state) if (GetTypeId() == TYPEID_PLAYER) { - WorldPackets::Misc::StandStateUpdate packet(state); + WorldPackets::Misc::StandStateUpdate packet(state, animKitID); ToPlayer()->GetSession()->SendPacket(packet.Write()); } } @@ -13680,18 +13737,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)) @@ -13775,10 +13825,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); @@ -13811,6 +13860,7 @@ void Unit::SetRooted(bool apply, bool packetOnly /*= false*/) // setting MOVEMENTFLAG_ROOT RemoveUnitMovementFlag(MOVEMENTFLAG_MASK_MOVING); AddUnitMovementFlag(MOVEMENTFLAG_ROOT); + StopMoving(); } else RemoveUnitMovementFlag(MOVEMENTFLAG_ROOT); @@ -16312,6 +16362,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)) @@ -16367,9 +16434,12 @@ SpellInfo const* Unit::GetCastSpellInfo(SpellInfo const* spellInfo) const swaps.insert(swaps.end(), swaps2.begin(), swaps2.end()); for (AuraEffect const* auraEffect : swaps) - if (auraEffect->IsAffectingSpell(spellInfo)) - if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(auraEffect->GetAmount())) - return newInfo; + { + if ((!auraEffect->GetSpellEffectInfo()->SpellClassMask && uint32(auraEffect->GetMiscValue()) == spellInfo->Id) || + (auraEffect->GetSpellEffectInfo()->SpellClassMask && auraEffect->IsAffectingSpell(spellInfo))) + if (SpellInfo const* newInfo = sSpellMgr->GetSpellInfo(auraEffect->GetAmount())) + return newInfo; + } return spellInfo; } diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index fb05c7ff9fa..fe7fd3c306a 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; @@ -1281,6 +1282,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 @@ -1469,7 +1472,7 @@ class Unit : public WorldObject UnitStandStateType GetStandState() const { return UnitStandStateType(GetByteValue(UNIT_FIELD_BYTES_1, 0)); } bool IsSitState() const; bool IsStandState() const; - void SetStandState(UnitStandStateType state); + void SetStandState(UnitStandStateType state, uint32 animKitID = 0); void SetStandFlags(uint8 flags) { SetByteFlag(UNIT_FIELD_BYTES_1, 2, flags); } void RemoveStandFlags(uint8 flags) { RemoveByteFlag(UNIT_FIELD_BYTES_1, 2, flags); } @@ -1559,6 +1562,7 @@ class Unit : public WorldObject bool IsInFlight() const { return HasUnitState(UNIT_STATE_IN_FLIGHT); } bool IsInCombat() const { return HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IN_COMBAT); } + bool IsInCombatWith(Unit const* who) const; void CombatStart(Unit* target, bool initialAggro = true); void SetInCombatState(bool PvP, Unit* enemy = NULL); void SetInCombatWith(Unit* enemy); @@ -2045,6 +2049,8 @@ class Unit : public WorldObject void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply); void ApplySpellDispelImmunity(const SpellInfo* spellProto, DispelType type, bool apply); virtual bool IsImmunedToSpell(SpellInfo const* spellInfo) const; // redefined in Creature + uint32 GetSchoolImmunityMask() const; + uint32 GetMechanicImmunityMask() const; bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const; bool IsImmunedToDamage(SpellInfo const* spellInfo) const; @@ -2207,6 +2213,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 47cefda447c..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) { @@ -395,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()); @@ -645,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; @@ -653,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)) @@ -697,6 +734,20 @@ GameObject* Garrison::Plot::CreateGameObject(Map* map, GarrisonFactionIndex fact } } + 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; } @@ -706,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 e6e44d5f83a..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; }; diff --git a/src/server/game/Garrison/GarrisonMgr.cpp b/src/server/game/Garrison/GarrisonMgr.cpp index a27574f4df4..86392a26d36 100644 --- a/src/server/game/Garrison/GarrisonMgr.cpp +++ b/src/server/game/Garrison/GarrisonMgr.cpp @@ -46,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); @@ -161,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); @@ -270,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)); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index bdfd66429cb..c8565e4d454 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])) @@ -1946,7 +1942,7 @@ ObjectGuid::LowType ObjectMgr::AddGOData(uint32 entry, uint32 mapId, float x, fl return guid; } -ObjectGuid::LowType ObjectMgr::AddCreData(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay /*= 0*/) +ObjectGuid::LowType ObjectMgr::AddCreatureData(uint32 entry, uint32 mapId, float x, float y, float z, float o, uint32 spawntimedelay /*= 0*/) { CreatureTemplate const* cInfo = GetCreatureTemplate(entry); if (!cInfo) @@ -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 @@ -6396,13 +6388,10 @@ void ObjectMgr::LoadGameObjectLocales() { uint32 oldMSTime = getMSTime(); - _gameObjectLocaleStore.clear(); // need for reload case - - QueryResult result = WorldDatabase.Query("SELECT entry, " - "name_loc1, name_loc2, name_loc3, name_loc4, name_loc5, name_loc6, name_loc7, name_loc8, " - "castbarcaption_loc1, castbarcaption_loc2, castbarcaption_loc3, castbarcaption_loc4, " - "castbarcaption_loc5, castbarcaption_loc6, castbarcaption_loc7, castbarcaption_loc8 FROM locales_gameobject"); + _gameObjectLocaleStore.clear(); // need for reload case + // 0 1 2 3 4 + QueryResult result = WorldDatabase.Query("SELECT entry, locale, name, castBarCaption, unk1 FROM gameobject_template_locale"); if (!result) return; @@ -6410,18 +6399,23 @@ void ObjectMgr::LoadGameObjectLocales() { Field* fields = result->Fetch(); - uint32 entry = fields[0].GetUInt32(); + uint32 id = fields[0].GetUInt32(); + std::string localeName = fields[1].GetString(); - GameObjectLocale& data = _gameObjectLocaleStore[entry]; + std::string name = fields[2].GetString(); + std::string castBarCaption = fields[3].GetString(); + std::string unk1 = fields[4].GetString(); + + GameObjectLocale& data = _gameObjectLocaleStore[id]; + LocaleConstant locale = GetLocaleByName(localeName); + + AddLocaleString(name, locale, data.Name); + AddLocaleString(castBarCaption, locale, data.CastBarCaption); + AddLocaleString(unk1, locale, data.Unk1); - for (uint8 i = OLD_TOTAL_LOCALES - 1; i > 0; --i) - { - AddLocaleString(fields[i].GetString(), LocaleConstant(i), data.Name); - AddLocaleString(fields[i + (OLD_TOTAL_LOCALES - 1)].GetString(), LocaleConstant(i), data.CastBarCaption); - } } while (result->NextRow()); - TC_LOG_INFO("server.loading", ">> Loaded %u gameobject locale strings in %u ms", uint32(_gameObjectLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); + TC_LOG_INFO("server.loading", ">> Loaded %u gameobject_template_locale strings in %u ms", uint32(_gameObjectLocaleStore.size()), GetMSTimeDiffToNow(oldMSTime)); } inline void CheckGOLockId(GameObjectTemplate const* goInfo, uint32 dataN, uint32 N) @@ -6677,6 +6671,17 @@ void ObjectMgr::LoadGameObjectTemplate() } case GAMEOBJECT_TYPE_BARBER_CHAIR: //32 CheckAndFixGOChairHeightId(&got, got.barberChair.chairheight, 0); + + if (got.barberChair.SitAnimKit && !sAnimKitStore.LookupEntry(got.barberChair.SitAnimKit)) + { + TC_LOG_ERROR("sql.sql", "GameObject (Entry: %u GoType: %u) have data2 = %u but AnimKit.dbc (Id: %u) not exist, set to 0.", + entry, got.type, got.barberChair.SitAnimKit, got.barberChair.SitAnimKit); + got.barberChair.SitAnimKit = 0; + } + break; + case GAMEOBJECT_TYPE_GARRISON_BUILDING: + if (uint32 transportMap = got.garrisonBuilding.mapID) + _transportMaps.insert(transportMap); break; } @@ -7709,6 +7714,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 @@ -7773,7 +7804,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) @@ -9238,8 +9269,8 @@ void ObjectMgr::LoadGameObjectQuestItems() { uint32 oldMSTime = getMSTime(); - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId FROM gameobject_questitem ORDER BY Idx ASC"); + // 0 1 2 + QueryResult result = WorldDatabase.Query("SELECT GameObjectEntry, ItemId, Idx FROM gameobject_questitem ORDER BY Idx ASC"); if (!result) { @@ -9253,7 +9284,22 @@ void ObjectMgr::LoadGameObjectQuestItems() Field* fields = result->Fetch(); uint32 entry = fields[0].GetUInt32(); - uint32 item = fields[1].GetUInt32(); + uint32 item = fields[1].GetUInt32(); + uint32 idx = fields[2].GetUInt32(); + + GameObjectTemplate const* goInfo = GetGameObjectTemplate(entry); + if (!goInfo) + { + TC_LOG_ERROR("sql.sql", "Table `gameobject_questitem` has data for nonexistent gameobject (entry: %u, idx: %u), skipped", entry, idx); + continue; + }; + + ItemEntry const* db2Data = sItemStore.LookupEntry(item); + if (!db2Data) + { + TC_LOG_ERROR("sql.sql", "Table `gameobject_questitem` has nonexistent item (ID: %u) in gameobject (entry: %u, idx: %u), skipped", item, entry, idx); + continue; + }; _gameObjectQuestItemStore[entry].push_back(item); @@ -9268,8 +9314,8 @@ void ObjectMgr::LoadCreatureQuestItems() { uint32 oldMSTime = getMSTime(); - // 0 1 - QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId FROM creature_questitem ORDER BY Idx ASC"); + // 0 1 2 + QueryResult result = WorldDatabase.Query("SELECT CreatureEntry, ItemId, Idx FROM creature_questitem ORDER BY Idx ASC"); if (!result) { @@ -9283,7 +9329,22 @@ void ObjectMgr::LoadCreatureQuestItems() Field* fields = result->Fetch(); uint32 entry = fields[0].GetUInt32(); - uint32 item = fields[1].GetUInt32(); + uint32 item = fields[1].GetUInt32(); + uint32 idx = fields[2].GetUInt32(); + + CreatureTemplate const* creatureInfo = GetCreatureTemplate(entry); + if (!creatureInfo) + { + TC_LOG_ERROR("sql.sql", "Table `creature_questitem` has data for nonexistent creature (entry: %u, idx: %u), skipped", entry, idx); + continue; + }; + + ItemEntry const* db2Data = sItemStore.LookupEntry(item); + if (!db2Data) + { + TC_LOG_ERROR("sql.sql", "Table `creature_questitem` has nonexistent item (ID: %u) in creature (entry: %u, idx: %u), skipped", item, entry, idx); + continue; + }; _creatureQuestItemStore[entry].push_back(item); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index 4277ab74048..3262477982d 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); @@ -1206,7 +1222,7 @@ class ObjectMgr void AddGameobjectToGrid(ObjectGuid::LowType guid, GameObjectData const* data); void RemoveGameobjectFromGrid(ObjectGuid::LowType guid, GameObjectData const* data); ObjectGuid::LowType AddGOData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0, float rotation0 = 0, float rotation1 = 0, float rotation2 = 0, float rotation3 = 0); - ObjectGuid::LowType AddCreData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0); + ObjectGuid::LowType AddCreatureData(uint32 entry, uint32 map, float x, float y, float z, float o, uint32 spawntimedelay = 0); // reserved names void LoadReservedPlayersNames(); @@ -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.cpp b/src/server/game/Grids/Notifiers/GridNotifiers.cpp index d5562a9a3c7..8f0090b6ec1 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.cpp +++ b/src/server/game/Grids/Notifiers/GridNotifiers.cpp @@ -135,8 +135,13 @@ inline void CreatureUnitRelocationWorker(Creature* c, Unit* u) return; if (c->HasReactState(REACT_AGGRESSIVE) && !c->HasUnitState(UNIT_STATE_SIGHTLESS)) + { if (c->IsAIEnabled && c->CanSeeOrDetect(u, false, true)) c->AI()->MoveInLineOfSight_Safe(u); + else + if (u->GetTypeId() == TYPEID_PLAYER && u->HasStealthAura() && c->IsAIEnabled && c->CanSeeOrDetect(u, false, true, true)) + c->AI()->TriggerAlert(u); + } } void PlayerRelocationNotifier::Visit(PlayerMapType &m) 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 d4ba420d44d..4083a07523c 100644 --- a/src/server/game/Guilds/Guild.cpp +++ b/src/server/game/Guilds/Guild.cpp @@ -683,7 +683,7 @@ bool EmblemInfo::ValidateEmblemColors() return sGuildColorBackgroundStore.LookupEntry(m_backgroundColor) && sGuildColorBorderStore.LookupEntry(m_borderColor) && sGuildColorEmblemStore.LookupEntry(m_color); - + } bool EmblemInfo::LoadFromDB(Field* fields) @@ -693,7 +693,7 @@ bool EmblemInfo::LoadFromDB(Field* fields) m_borderStyle = fields[5].GetUInt8(); m_borderColor = fields[6].GetUInt8(); m_backgroundColor = fields[7].GetUInt8(); - + return ValidateEmblemColors(); } @@ -2157,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); @@ -2257,7 +2256,7 @@ bool Guild::LoadFromDB(Field* fields) if (!m_emblemInfo.LoadFromDB(fields)) { - TC_LOG_ERROR("guild", "Guild " UI64FMTD " has invalid emblem colors (Background: %u, Border: %u, Emblem: %u), skipped.", + 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; } @@ -2704,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/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 7b22d46d67b..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()); } 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..8375483ff2a 100644 --- a/src/server/game/Handlers/MailHandler.cpp +++ b/src/server/game/Handlers/MailHandler.cpp @@ -87,9 +87,9 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& packet) if (!receiverGuid) { TC_LOG_INFO("network", "Player %s is sending mail to %s (GUID: not existed!) with subject %s " - "and body %s includes " SZFMTD " items, " SI64FMTD " copper and " SI64FMTD " COD copper with StationeryID = %d, PackageID = %d", + "and body %s includes " SZFMTD " items, " SI64FMTD " copper and " SI64FMTD " COD copper with StationeryID = %d", GetPlayerInfo().c_str(), packet.Info.Target.c_str(), packet.Info.Subject.c_str(), packet.Info.Body.c_str(), - packet.Info.Attachments.size(), packet.Info.SendMoney, packet.Info.Cod, packet.Info.StationeryID, packet.Info.PackageID); + packet.Info.Attachments.size(), packet.Info.SendMoney, packet.Info.Cod, packet.Info.StationeryID); player->SendMailResult(0, MAIL_SEND, MAIL_ERR_RECIPIENT_NOT_FOUND); return; } @@ -111,9 +111,9 @@ void WorldSession::HandleSendMail(WorldPackets::Mail::SendMail& packet) } TC_LOG_INFO("network", "Player %s is sending mail to %s (%s) with subject %s and body %s " - "includes " SZFMTD " items, " SI64FMTD " copper and " SI64FMTD " COD copper with StationeryID = %d, PackageID = %d", + "includes " SZFMTD " items, " SI64FMTD " copper and " SI64FMTD " COD copper with StationeryID = %d", GetPlayerInfo().c_str(), packet.Info.Target.c_str(), receiverGuid.ToString().c_str(), packet.Info.Subject.c_str(), - packet.Info.Body.c_str(), packet.Info.Attachments.size(), packet.Info.SendMoney, packet.Info.Cod, packet.Info.StationeryID, packet.Info.PackageID); + packet.Info.Body.c_str(), packet.Info.Attachments.size(), packet.Info.SendMoney, packet.Info.Cod, packet.Info.StationeryID); if (player->GetGUID() == receiverGuid) { @@ -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/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 240825faade..597ddc296cd 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -179,7 +179,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() if (time_t timeReset = sInstanceSaveMgr->GetResetTimeFor(mEntry->ID, diff)) { uint32 timeleft = uint32(timeReset - time(NULL)); - GetPlayer()->SendInstanceResetWarning(mEntry->ID, diff, timeleft); + GetPlayer()->SendInstanceResetWarning(mEntry->ID, diff, timeleft, true); } } } @@ -511,17 +511,12 @@ void WorldSession::HandleMovementAckMessage(WorldPackets::Movement::MovementAckM GetPlayer()->ValidateMovementInfo(&movementAck.Ack.movementInfo); } -void WorldSession::HandleSummonResponseOpcode(WorldPacket& recvData) +void WorldSession::HandleSummonResponseOpcode(WorldPackets::Movement::SummonResponse& packet) { if (!_player->IsAlive() || _player->IsInCombat()) return; - ObjectGuid summoner_guid; - bool agree; - recvData >> summoner_guid; - recvData >> agree; - - _player->SummonIfPossible(agree); + _player->SummonIfPossible(packet.Accept); } void WorldSession::HandleSetCollisionHeightAck(WorldPackets::Movement::MoveSetCollisionHeightAck& setCollisionHeightAck) diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 429d3565052..d6d199a7119 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; @@ -764,7 +764,8 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE); spell->m_cast_count = petCastSpell.Cast.CastID; - spell->m_misc.Data = petCastSpell.Cast.Misc; + spell->m_misc.Raw.Data[0] = petCastSpell.Cast.Misc[0]; + spell->m_misc.Raw.Data[1] = petCastSpell.Cast.Misc[1]; spell->m_targets = targets; SpellCastResult result = spell->CheckPetCast(NULL); diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index eec80888559..fdbe74fd123 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); @@ -126,26 +126,32 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj response.Allow = true; WorldPackets::Query::GameObjectStats& stats = response.Stats; - stats.CastBarCaption = gameObjectInfo->castBarCaption; + stats.Type = gameObjectInfo->type; stats.DisplayID = gameObjectInfo->displayId; - stats.IconName = gameObjectInfo->IconName; + stats.Name[0] = gameObjectInfo->name; + stats.IconName = gameObjectInfo->IconName; + stats.CastBarCaption = gameObjectInfo->castBarCaption; + stats.UnkString = gameObjectInfo->unk1; - GameObjectQuestItemList* items = sObjectMgr->GetGameObjectQuestItemList(packet.GameObjectID); - if (items) + LocaleConstant localeConstant = GetSessionDbLocaleIndex(); + if (localeConstant >= LOCALE_enUS) + if (GameObjectLocale const* gameObjectLocale = sObjectMgr->GetGameObjectLocale(packet.GameObjectID)) + { + ObjectMgr::GetLocaleString(gameObjectLocale->Name, localeConstant, stats.Name[0]); + ObjectMgr::GetLocaleString(gameObjectLocale->CastBarCaption, localeConstant, stats.CastBarCaption); + ObjectMgr::GetLocaleString(gameObjectLocale->Unk1, localeConstant, stats.UnkString); + } + + stats.Size = gameObjectInfo->size; + + if (GameObjectQuestItemList const* items = sObjectMgr->GetGameObjectQuestItemList(packet.GameObjectID)) for (uint32 item : *items) stats.QuestItems.push_back(item); for (uint32 i = 0; i < MAX_GAMEOBJECT_DATA; i++) stats.Data[i] = gameObjectInfo->raw.data[i]; - - stats.Size = gameObjectInfo->size; - stats.Type = gameObjectInfo->type; - stats.UnkString = gameObjectInfo->unk1; - stats.Expansion = 0; } - else - response.Allow = false; SendPacket(response.Write()); } @@ -397,17 +403,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 6d3f35d407d..1860e4667be 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -313,7 +313,8 @@ void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE, ObjectGuid::Empty, false); spell->m_cast_count = cast.Cast.CastID; // set count of casts - spell->m_misc.Data = cast.Cast.Misc; // 6.x Misc is just a guess + spell->m_misc.Raw.Data[0] = cast.Cast.Misc[0]; + spell->m_misc.Raw.Data[1] = cast.Cast.Misc[1]; spell->prepare(&targets); } @@ -483,13 +484,10 @@ void WorldSession::HandleSelfResOpcode(WorldPackets::Spells::SelfRes& /*packet*/ } } -void WorldSession::HandleSpellClick(WorldPacket& recvData) +void WorldSession::HandleSpellClick(WorldPackets::Spells::SpellClick& packet) { - ObjectGuid guid; - recvData >> guid; - // this will get something not in world. crash - Creature* unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); + Creature* unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, packet.SpellClickUnitGuid); if (!unit) return; 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/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index c729057468b..91dc817e717 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -652,10 +652,10 @@ void InstanceSaveManager::_ResetOrWarnAll(uint32 mapid, Difficulty difficulty, b if (warn) { - if (now <= resetTime) + if (now >= resetTime) timeLeft = 0; else - timeLeft = uint32(now - resetTime); + timeLeft = uint32(resetTime - now); ((InstanceMap*)map2)->SendResetWarnings(timeLeft); } 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/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index 26a3d38635d..008bb89ff4c 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -3234,7 +3234,7 @@ void InstanceMap::UnloadAll() void InstanceMap::SendResetWarnings(uint32 timeLeft) const { for (MapRefManager::const_iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr) - itr->GetSource()->SendInstanceResetWarning(GetId(), itr->GetSource()->GetDifficultyID(GetEntry()), timeLeft); + itr->GetSource()->SendInstanceResetWarning(GetId(), itr->GetSource()->GetDifficultyID(GetEntry()), timeLeft, true); } void InstanceMap::SetResetSchedule(bool on) 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 6546a6198c6..625ad8cda49 100644 --- a/src/server/game/Miscellaneous/Language.h +++ b/src/server/game/Miscellaneous/Language.h @@ -1032,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, @@ -1054,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 848ca1409a2..7456e55f5f1 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -267,7 +267,7 @@ enum Powers // (6.0) POWER_HEALTH = 0xFFFFFFFE // (-2 as signed value) }; -#define MAX_POWERS_PER_CLASS 5 +#define MAX_POWERS_PER_CLASS 6 enum SpellSchools : uint16 { @@ -617,7 +617,7 @@ enum SpellAttr7 SPELL_ATTR7_ALLIANCE_ONLY = 0x00000200, // 9 Teleports, mounts and other spells. SPELL_ATTR7_DISPEL_CHARGES = 0x00000400, // 10 Dispel and Spellsteal individual charges instead of whole aura. SPELL_ATTR7_INTERRUPT_ONLY_NONPLAYER = 0x00000800, // 11 Only non-player casts interrupt, though Feral Charge - Bear has it. - SPELL_ATTR7_UNK12 = 0x00001000, // 12 Not set in 3.2.2a. + SPELL_ATTR7_SILENCE_ONLY_NONPLAYER = 0x00001000, // 12 Not set in 3.2.2a. SPELL_ATTR7_UNK13 = 0x00002000, // 13 Not set in 3.2.2a. SPELL_ATTR7_UNK14 = 0x00004000, // 14 Only 52150 (Raise Dead - Pet) spell. SPELL_ATTR7_UNK15 = 0x00008000, // 15 Exorcism. Usable on players? 100% crit chance on undead and demons? @@ -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 @@ -812,7 +812,7 @@ enum SpellAttr12 SPELL_ATTR12_UNK24 = 0x01000000, // 24 SPELL_ATTR12_UNK25 = 0x02000000, // 25 SPELL_ATTR12_UNK26 = 0x04000000, // 26 - SPELL_ATTR12_UNK27 = 0x08000000, // 27 + SPELL_ATTR12_IS_READINESS_SPELL = 0x08000000, // 27 SPELL_ATTR12_UNK28 = 0x10000000, // 28 SPELL_ATTR12_UNK29 = 0x20000000, // 29 SPELL_ATTR12_UNK30 = 0x40000000, // 30 @@ -1258,281 +1258,282 @@ enum SpellEffectName SPELL_EFFECT_FINISH_SHIPMENT = 248, SPELL_EFFECT_249 = 249, SPELL_EFFECT_TAKE_SCREENSHOT = 250, // Serverside marker for selfie screenshot - achievement check - TOTAL_SPELL_EFFECTS = 251, + SPELL_EFFECT_SET_GARRISON_CACHE_SIZE = 251, + TOTAL_SPELL_EFFECTS = 252, }; -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 +2104,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 +4494,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 +4520,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/MovementGenerators/IdleMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp index cdbc1a8919f..3f91032dde6 100644 --- a/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp +++ b/src/server/game/Movement/MovementGenerators/IdleMovementGenerator.cpp @@ -74,12 +74,23 @@ void RotateMovementGenerator::Finalize(Unit* unit) void DistractMovementGenerator::Initialize(Unit* owner) { + // Distracted creatures stand up if not standing + if (!owner->IsStandState()) + owner->SetStandState(UNIT_STAND_STATE_STAND); + owner->AddUnitState(UNIT_STATE_DISTRACTED); } void DistractMovementGenerator::Finalize(Unit* owner) { owner->ClearUnitState(UNIT_STATE_DISTRACTED); + + // If this is a creature, then return orientation to original position (for idle movement creatures) + if (owner->GetTypeId() == TYPEID_UNIT && owner->ToCreature()) + { + float angle = owner->ToCreature()->GetHomePosition().GetOrientation(); + owner->SetFacingTo(angle); + } } bool DistractMovementGenerator::Update(Unit* /*owner*/, uint32 time_diff) diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp index 0e436715622..f8cb6afa7b6 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; @@ -925,6 +925,7 @@ void PathGenerator::ReducePathLenghtByDist(float dist) float step = dist / len; // same as nextVec _pathPoints[i + 1] -= diffVec * step; + _sourceUnit->UpdateAllowedPositionZ(_pathPoints[i + 1].x, _pathPoints[i + 1].y, _pathPoints[i + 1].z); _pathPoints.resize(i + 2); break; } diff --git a/src/server/game/OutdoorPvP/OutdoorPvP.cpp b/src/server/game/OutdoorPvP/OutdoorPvP.cpp index d91dc2bc469..57fced33988 100644 --- a/src/server/game/OutdoorPvP/OutdoorPvP.cpp +++ b/src/server/game/OutdoorPvP/OutdoorPvP.cpp @@ -119,7 +119,7 @@ bool OPvPCapturePoint::AddObject(uint32 type, uint32 entry, uint32 map, float x, bool OPvPCapturePoint::AddCreature(uint32 type, uint32 entry, uint32 map, float x, float y, float z, float o, TeamId /*teamId = TEAM_NEUTRAL*/, uint32 spawntimedelay /*= 0*/) { - if (ObjectGuid::LowType guid = sObjectMgr->AddCreData(entry, map, x, y, z, o, spawntimedelay)) + if (ObjectGuid::LowType guid = sObjectMgr->AddCreatureData(entry, map, x, y, z, o, spawntimedelay)) { AddCre(type, guid); return true; 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/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/GarrisonPackets.cpp b/src/server/game/Server/Packets/GarrisonPackets.cpp index 041655aa4c6..8b2a8570212 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.cpp +++ b/src/server/game/Server/Packets/GarrisonPackets.cpp @@ -71,6 +71,10 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonFollowe for (GarrAbilityEntry const* ability : follower.AbilityID) data << uint32(ability->ID); + data.WriteBits(follower.CustomName.length(), 7); + data.FlushBits(); + data.WriteString(follower.CustomName); + return data; } @@ -88,6 +92,14 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMission return data; } +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Garrison::GarrisonMissionAreaBonus const& areaBonus) +{ + data << uint32(areaBonus.GarrMssnBonusAbilityID); + data << uint32(areaBonus.StartTime); + + return data; +} + WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() { _worldPacket.reserve(4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + @@ -95,7 +107,9 @@ WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() Plots.size() * sizeof(GarrisonPlotInfo) + Followers.size() * (sizeof(GarrisonFollower) + 5 * 4) + Missions.size() * sizeof(GarrisonMission) + - ArchivedMissions.size() * 4); + MissionAreaBonuses.size() * sizeof(GarrisonMissionAreaBonus) + + ArchivedMissions.size() * 4 + + CanStartMission.size()); _worldPacket << int32(GarrSiteID); _worldPacket << int32(GarrSiteLevelID); @@ -104,6 +118,8 @@ WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() _worldPacket << uint32(Plots.size()); _worldPacket << uint32(Followers.size()); _worldPacket << uint32(Missions.size()); + _worldPacket << uint32(CanStartMission.size()); + _worldPacket << uint32(MissionAreaBonuses.size()); _worldPacket << uint32(ArchivedMissions.size()); _worldPacket << int32(NumFollowerActivationsRemaining); @@ -119,9 +135,17 @@ WorldPacket const* WorldPackets::Garrison::GetGarrisonInfoResult::Write() for (GarrisonMission const* mission : Missions) _worldPacket << *mission; + for (GarrisonMissionAreaBonus const* areaBonus : MissionAreaBonuses) + _worldPacket << *areaBonus; + if (!ArchivedMissions.empty()) _worldPacket.append(ArchivedMissions.data(), ArchivedMissions.size()); + for (bool canStartMission : CanStartMission) + _worldPacket.WriteBit(canStartMission); + + _worldPacket.FlushBits(); + return &_worldPacket; } @@ -254,6 +278,15 @@ WorldPacket const* WorldPackets::Garrison::GarrisonAddFollowerResult::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Garrison::GarrisonRemoveFollowerResult::Write() +{ + _worldPacket << uint64(FollowerDBID); + _worldPacket << uint32(Result); + _worldPacket << uint32(Destroyed); + + return &_worldPacket; +} + WorldPacket const* WorldPackets::Garrison::GarrisonBuildingActivated::Write() { _worldPacket << uint32(GarrPlotInstanceID); diff --git a/src/server/game/Server/Packets/GarrisonPackets.h b/src/server/game/Server/Packets/GarrisonPackets.h index a783b1bc1af..7f5c4da424b 100644 --- a/src/server/game/Server/Packets/GarrisonPackets.h +++ b/src/server/game/Server/Packets/GarrisonPackets.h @@ -88,6 +88,7 @@ namespace WorldPackets uint32 CurrentMissionID = 0; std::list<GarrAbilityEntry const*> AbilityID; uint32 FollowerStatus; + std::string CustomName; }; struct GarrisonMission @@ -102,6 +103,12 @@ namespace WorldPackets uint32 MissionState = 0; }; + struct GarrisonMissionAreaBonus + { + uint32 GarrMssnBonusAbilityID; + time_t StartTime; + }; + class GetGarrisonInfoResult final : public ServerPacket { public: @@ -117,6 +124,8 @@ namespace WorldPackets std::vector<GarrisonBuildingInfo const*> Buildings; std::vector<GarrisonFollower const*> Followers; std::vector<GarrisonMission const*> Missions; + std::vector<GarrisonMissionAreaBonus const*> MissionAreaBonuses; + std::vector<bool> CanStartMission; std::vector<int32> ArchivedMissions; }; @@ -291,6 +300,18 @@ namespace WorldPackets uint32 Result = 0; }; + class GarrisonRemoveFollowerResult final : public ServerPacket + { + public: + GarrisonRemoveFollowerResult() : ServerPacket(SMSG_GARRISON_REMOVE_FOLLOWER_RESULT, 8 + 4) { } + + WorldPacket const* Write() override; + + uint64 FollowerDBID = 0; + uint32 Result = 0; + uint32 Destroyed = 0; + }; + class GarrisonBuildingActivated final : public ServerPacket { public: diff --git a/src/server/game/Server/Packets/MailPackets.cpp b/src/server/game/Server/Packets/MailPackets.cpp index 7ff189bbe2e..390cf67d3ec 100644 --- a/src/server/game/Server/Packets/MailPackets.cpp +++ b/src/server/game/Server/Packets/MailPackets.cpp @@ -81,7 +81,6 @@ WorldPackets::Mail::MailListEntry::MailListEntry(::Mail const* mail, ::Player* p } Cod = mail->COD; - PackageID = 0; StationeryID = mail->stationery; SentMoney = mail->money; Flags = mail->checked; @@ -103,7 +102,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Mail::MailListEntry const data << int8(entry.SenderType); data << int64(entry.Cod); - data << int32(entry.PackageID); data << int32(entry.StationeryID); data << int64(entry.SentMoney); data << int32(entry.Flags); @@ -164,7 +162,6 @@ void WorldPackets::Mail::SendMail::Read() { _worldPacket >> Info.Mailbox; _worldPacket >> Info.StationeryID; - _worldPacket >> Info.PackageID; _worldPacket >> Info.SendMoney; _worldPacket >> Info.Cod; diff --git a/src/server/game/Server/Packets/MailPackets.h b/src/server/game/Server/Packets/MailPackets.h index 2486d65fe5b..31eb15abb8d 100644 --- a/src/server/game/Server/Packets/MailPackets.h +++ b/src/server/game/Server/Packets/MailPackets.h @@ -60,7 +60,6 @@ namespace WorldPackets Optional<ObjectGuid> SenderCharacter; Optional<uint32> AltSenderID; int64 Cod = 0; - int32 PackageID = 0; int32 StationeryID = 0; int64 SentMoney = 0; int32 Flags = 0; @@ -117,7 +116,6 @@ namespace WorldPackets ObjectGuid Mailbox; int32 StationeryID = 0; - int32 PackageID = 0; int64 SendMoney = 0; int64 Cod = 0; std::string Target; diff --git a/src/server/game/Server/Packets/MiscPackets.cpp b/src/server/game/Server/Packets/MiscPackets.cpp index 346f7e0e568..448a1f2b790 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()); @@ -282,7 +283,7 @@ void WorldPackets::Misc::StandStateChange::Read() WorldPacket const* WorldPackets::Misc::StandStateUpdate::Write() { - _worldPacket << uint32(UnkWoD1); + _worldPacket << uint32(AnimKitID); _worldPacket << uint8(State); return &_worldPacket; diff --git a/src/server/game/Server/Packets/MiscPackets.h b/src/server/game/Server/Packets/MiscPackets.h index 858b2962ea9..caffb0afa11 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 @@ -422,11 +423,11 @@ namespace WorldPackets { public: StandStateUpdate() : ServerPacket(SMSG_STAND_STATE_UPDATE, 4 + 1) { } - StandStateUpdate(UnitStandStateType state) : ServerPacket(SMSG_STAND_STATE_UPDATE, 4 + 1), State(state) { } + StandStateUpdate(UnitStandStateType state, uint32 animKitID) : ServerPacket(SMSG_STAND_STATE_UPDATE, 4 + 1), AnimKitID(animKitID), State(state) { } WorldPacket const* Write() override; - uint32 UnkWoD1 = 0; /// @todo 6.1.0 resarch new value + uint32 AnimKitID = 0; UnitStandStateType State = UNIT_STAND_STATE_STAND; }; diff --git a/src/server/game/Server/Packets/MovementPackets.cpp b/src/server/game/Server/Packets/MovementPackets.cpp index 14fb2ecb33c..65847ccfa6e 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); @@ -673,3 +674,9 @@ void WorldPackets::Movement::MoveTimeSkipped::Read() _worldPacket >> MoverGUID; _worldPacket >> TimeSkipped; } + +void WorldPackets::Movement::SummonResponse::Read() +{ + _worldPacket >> SummonerGUID; + Accept = _worldPacket.ReadBit(); +} diff --git a/src/server/game/Server/Packets/MovementPackets.h b/src/server/game/Server/Packets/MovementPackets.h index d4fb41cf330..22d1b62a08c 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; @@ -400,6 +401,17 @@ namespace WorldPackets ObjectGuid MoverGUID; uint32 TimeSkipped = 0; }; + + class SummonResponse final : public ClientPacket + { + public: + SummonResponse(WorldPacket&& packet) : ClientPacket(CMSG_SUMMON_RESPONSE, std::move(packet)) { } + + void Read() override; + + bool Accept = false; + ObjectGuid SummonerGUID; + }; } ByteBuffer& operator<<(ByteBuffer& data, Movement::MonsterSplineFilterKey const& monsterSplineFilterKey); 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..2edf3f79026 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); @@ -380,7 +381,6 @@ WorldPacket const* WorldPackets::Query::QuestPOIQueryResponse::Write() _worldPacket << int32(questPOIData.QuestID); _worldPacket << int32(questPOIData.QuestPOIBlobDataStats.size()); - _worldPacket << int32(questPOIData.QuestPOIBlobDataStats.size()); for (QuestPOIBlobData const& questPOIBlobData : questPOIData.QuestPOIBlobDataStats) { @@ -395,7 +395,6 @@ WorldPacket const* WorldPackets::Query::QuestPOIQueryResponse::Write() _worldPacket << int32(questPOIBlobData.Flags); _worldPacket << int32(questPOIBlobData.WorldEffectID); _worldPacket << int32(questPOIBlobData.PlayerConditionID); - _worldPacket << int32(questPOIBlobData.QuestPOIBlobPointStats.size()); _worldPacket << int32(questPOIBlobData.UnkWoD1); _worldPacket << int32(questPOIBlobData.QuestPOIBlobPointStats.size()); 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 832dfc82b06..00ce2593287 100644 --- a/src/server/game/Server/Packets/SpellPackets.cpp +++ b/src/server/game/Server/Packets/SpellPackets.cpp @@ -108,6 +108,7 @@ WorldPacket const* WorldPackets::Spells::AuraUpdate::Write() { AuraDataInfo const& data = *aura.AuraData; _worldPacket << uint32(data.SpellID); + _worldPacket << uint32(data.SpellXSpellVisualID); _worldPacket << uint8(data.Flags); _worldPacket << uint32(data.ActiveFlags); _worldPacket << uint16(data.CastLevel); @@ -188,8 +189,10 @@ ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::MissileTrajecto ByteBuffer& operator>>(ByteBuffer& buffer, WorldPackets::Spells::SpellCastRequest& request) { buffer >> request.CastID; + buffer >> request.Misc[0]; + buffer >> request.Misc[1]; buffer >> request.SpellID; - buffer >> request.Misc; + buffer >> request.SpellXSpellVisualID; buffer >> request.Target; buffer >> request.MissileTrajectory; buffer >> request.Charmer; @@ -228,7 +231,6 @@ void WorldPackets::Spells::PetCastSpell::Read() _worldPacket >> Cast; } - void WorldPackets::Spells::UseItem::Read() { _worldPacket >> PackSlot; @@ -315,13 +317,6 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellAmmo const& return data; } -ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::ProjectileVisualData const& projectileVisual) -{ - data << int32(projectileVisual.ID[0]); - data << int32(projectileVisual.ID[1]); - return data; -} - ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::CreatureImmunities const& immunities) { data << int32(immunities.School); @@ -343,6 +338,7 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con data << spellCastData.CasterUnit; data << uint8(spellCastData.CastID); data << int32(spellCastData.SpellID); + data << uint32(spellCastData.SpellXSpellVisualID); data << uint32(spellCastData.CastFlags); data << uint32(spellCastData.CastTime); data << uint32(spellCastData.HitTargets.size()); @@ -372,17 +368,13 @@ ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Spells::SpellCastData con for (WorldPackets::Spells::TargetLocation const& targetLoc : spellCastData.TargetPoints) data << targetLoc; - data.WriteBits(spellCastData.CastFlagsEx, 18); + data.WriteBits(spellCastData.CastFlagsEx, 20); data.WriteBit(spellCastData.RemainingRunes.is_initialized()); - data.WriteBit(spellCastData.ProjectileVisual.is_initialized()); data.FlushBits(); if (spellCastData.RemainingRunes) data << *spellCastData.RemainingRunes; - if (spellCastData.ProjectileVisual) - data << *spellCastData.ProjectileVisual; - return data; } @@ -423,6 +415,7 @@ WorldPacket const* WorldPackets::Spells::SpellFailure::Write() _worldPacket << CasterUnit; _worldPacket << uint8(CastID); _worldPacket << int32(SpellID); + _worldPacket << uint32(SpelXSpellVisualID); _worldPacket << uint16(Reason); return &_worldPacket; @@ -482,6 +475,9 @@ WorldPacket const* WorldPackets::Spells::UnlearnedSpells::Write() for (uint32 spellId : SpellID) _worldPacket << uint32(spellId); + _worldPacket.WriteBit(SuppressMessaging); + _worldPacket.FlushBits(); + return &_worldPacket; } @@ -586,7 +582,8 @@ WorldPacket const* WorldPackets::Spells::ClearSpellCharges::Write() WorldPacket const* WorldPackets::Spells::SetSpellCharges::Write() { _worldPacket << int32(Category); - _worldPacket << float(Count); + _worldPacket << uint32(NextRecoveryTime); + _worldPacket << uint8(ConsumedCharges); _worldPacket.WriteBit(IsPet); _worldPacket.FlushBits(); @@ -742,3 +739,9 @@ WorldPacket const* WorldPackets::Spells::MirrorImageCreatureData::Write() return &_worldPacket; } + +void WorldPackets::Spells::SpellClick::Read() +{ + _worldPacket >> SpellClickUnitGuid; + TryAutoDismount = _worldPacket.ReadBit(); +} diff --git a/src/server/game/Server/Packets/SpellPackets.h b/src/server/game/Server/Packets/SpellPackets.h index a3fa6c10925..b9388c02116 100644 --- a/src/server/game/Server/Packets/SpellPackets.h +++ b/src/server/game/Server/Packets/SpellPackets.h @@ -150,6 +150,7 @@ namespace WorldPackets struct AuraDataInfo { int32 SpellID = 0; + uint32 SpellXSpellVisualID = 0; uint8 Flags = 0; uint32 ActiveFlags = 0; uint16 CastLevel = 1; @@ -213,13 +214,14 @@ namespace WorldPackets { uint8 CastID = 0; int32 SpellID = 0; - int32 Misc = 0; + uint32 SpellXSpellVisualID = 0; uint8 SendCastFlags = 0; SpellTargetData Target; MissileTrajectoryRequest MissileTrajectory; Optional<MovementInfo> MoveUpdate; std::vector<SpellWeight> Weight; ObjectGuid Charmer; + int32 Misc[2] = { }; }; class CastSpell final : public ClientPacket @@ -287,11 +289,6 @@ namespace WorldPackets int8 InventoryType = 0; }; - struct ProjectileVisualData - { - int32 ID[2]; - }; - struct CreatureImmunities { uint32 School = 0; @@ -311,6 +308,7 @@ namespace WorldPackets ObjectGuid CasterUnit; uint8 CastID = 0; int32 SpellID = 0; + uint32 SpellXSpellVisualID = 0; uint32 CastFlags = 0; uint32 CastFlagsEx = 0; uint32 CastTime = 0; @@ -322,7 +320,6 @@ namespace WorldPackets Optional<RuneData> RemainingRunes; MissileTrajectoryResult MissileTrajectory; SpellAmmo Ammo; - Optional<ProjectileVisualData> ProjectileVisual; uint8 DestLocSpellCastIndex = 0; std::vector<TargetLocation> TargetPoints; CreatureImmunities Immunities; @@ -370,6 +367,7 @@ namespace WorldPackets ObjectGuid CasterUnit; uint32 SpellID = 0; + uint32 SpelXSpellVisualID = 0; uint16 Reason = 0; uint8 CastID = 0; }; @@ -431,6 +429,7 @@ namespace WorldPackets WorldPacket const* Write() override; std::vector<uint32> SpellID; + bool SuppressMessaging = false; }; class CooldownEvent final : public ServerPacket @@ -550,8 +549,9 @@ namespace WorldPackets WorldPacket const* Write() override; bool IsPet = false; - float Count = 0.0f; - int32 Category = 0; + uint32 Category = 0; + uint32 NextRecoveryTime = 0; + uint8 ConsumedCharges = 0; }; struct SpellChargeEntry @@ -738,6 +738,17 @@ namespace WorldPackets ObjectGuid UnitGUID; uint32 DisplayID = 0; }; + + class SpellClick final : public ClientPacket + { + public: + SpellClick(WorldPacket&& packet) : ClientPacket(CMSG_SPELL_CLICK, std::move(packet)) { } + + void Read() override; + + ObjectGuid SpellClickUnitGuid; + bool TryAutoDismount = false; + }; } } 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..c25c02b7619 100644 --- a/src/server/game/Server/Packets/TicketPackets.h +++ b/src/server/game/Server/Packets/TicketPackets.h @@ -83,153 +83,6 @@ namespace WorldPackets 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 { public: @@ -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 c9b9bf3a284..cd4a382042e 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -154,8 +154,8 @@ void OpcodeTable::Initialize() 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_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); @@ -179,19 +179,19 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_AUCTION_SELL_ITEM, STATUS_LOGGEDIN, 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_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_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_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,17 +211,17 @@ 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_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_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); @@ -252,15 +253,15 @@ void OpcodeTable::Initialize() 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_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_CAN_DUEL, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Duel::CanDuel, &WorldSession::HandleCanDuel); DEFINE_HANDLER(CMSG_CAST_SPELL, STATUS_LOGGEDIN, 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,12 +328,11 @@ 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); @@ -342,7 +342,7 @@ void OpcodeTable::Initialize() 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,16 +358,16 @@ 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_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_LOGGEDIN, 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_FAR_SIGHT, STATUS_UNHANDLED, 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_GARRISON_ASSIGN_FOLLOWER_TO_BUILDING, STATUS_UNHANDLED, PROCESS_INPLACE, WorldPackets::Null, &WorldSession::Handle_NULL); @@ -393,24 +393,17 @@ void OpcodeTable::Initialize() 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_HANDLER(CMSG_GET_ITEM_PURCHASE_DATA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, WorldPackets::Item::GetItemPurchaseData, &WorldSession::HandleGetItemPurchaseData); DEFINE_HANDLER(CMSG_GET_MIRROR_IMAGE_DATA, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::GetMirrorImageData, &WorldSession::HandleMirrorImageDataRequest); - DEFINE_HANDLER(CMSG_GET_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, WorldPackets::Battleground::GetPVPOptionsEnabled, &WorldSession::HandleGetPVPOptionsEnabled); + 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_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_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_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); @@ -456,23 +449,23 @@ void OpcodeTable::Initialize() 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_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); @@ -500,11 +493,11 @@ 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); @@ -582,19 +575,19 @@ void OpcodeTable::Initialize() 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_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_NEXT_CINEMATIC_CAMERA, STATUS_UNHANDLED, 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_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_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_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_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); @@ -620,7 +613,7 @@ 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); @@ -641,7 +634,7 @@ void OpcodeTable::Initialize() 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_QUERY_VOID_STORAGE, STATUS_UNHANDLED, 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); @@ -655,9 +648,9 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, 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_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_LOGGEDIN, 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); @@ -666,47 +659,47 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REPAIR_ITEM, STATUS_LOGGEDIN, 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_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_BATTLEFIELD_STATUS, STATUS_UNHANDLED, 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_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_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_HANDLER(CMSG_RESET_INSTANCES, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Instance::ResetInstances, &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_RIDE_VEHICLE_INTERACT, STATUS_UNHANDLED, 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_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_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_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_CONTACT_LIST, STATUS_UNHANDLED, 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_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); @@ -717,24 +710,24 @@ void OpcodeTable::Initialize() 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_EVERYONE_IS_ASSISTANT, STATUS_UNHANDLED, 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_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); @@ -745,12 +738,12 @@ void OpcodeTable::Initialize() 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_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_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); @@ -762,22 +755,22 @@ void OpcodeTable::Initialize() 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_SPELL_CLICK, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Spells::SpellClick, &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_SPLIT_ITEM, STATUS_UNHANDLED, 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_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_SUMMON_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Movement::SummonResponse, &WorldSession::HandleSummonResponseOpcode); + 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_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_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleTabardVendorActivateOpcode); DEFINE_HANDLER(CMSG_TALK_TO_GOSSIP, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::NPC::Hello, &WorldSession::HandleGossipHelloOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_TAXI_NODE_STATUS_QUERY, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleTaxiNodeStatusQueryOpcode ); @@ -792,8 +785,8 @@ 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); @@ -802,16 +795,17 @@ void OpcodeTable::Initialize() 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_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); @@ -820,17 +814,17 @@ void OpcodeTable::Initialize() 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_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); @@ -862,7 +857,7 @@ void OpcodeTable::Initialize() 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); @@ -889,19 +884,19 @@ void OpcodeTable::Initialize() 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_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); @@ -974,11 +969,11 @@ void OpcodeTable::Initialize() 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_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_CAN_DUEL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CATEGORY_COOLDOWN, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHALLEGE_MODE_REWARDS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1025,19 +1020,19 @@ void OpcodeTable::Initialize() 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_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_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); @@ -1061,7 +1056,7 @@ void OpcodeTable::Initialize() 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,12 +1066,12 @@ 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_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_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); @@ -1084,7 +1079,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_END, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENCOUNTER_START, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENUM_CHARACTERS_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ENVIRONMENTAL_DAMAGE_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); + 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); @@ -1100,10 +1095,10 @@ 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); @@ -1131,7 +1126,9 @@ void OpcodeTable::Initialize() 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); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_AREA_BONUS_ADDED, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_BONUS_ROLL_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_MISSION_UPDATE_CAN_START, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); 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); @@ -1146,7 +1143,7 @@ void OpcodeTable::Initialize() 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_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_REMOVE_FOLLOWER_RESULT, STATUS_NEVER, 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_START_MISSION_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GARRISON_UNLEARN_BLUEPRINT_RESULT, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); @@ -1160,23 +1157,17 @@ void OpcodeTable::Initialize() 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_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_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_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_EARNED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_GUILD_ACHIEVEMENT_MEMBERS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1231,7 +1222,7 @@ void OpcodeTable::Initialize() 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_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); @@ -1261,12 +1252,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_INVENTORY_CHANGE_FAILURE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_IS_QUEST_COMPLETE_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_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); @@ -1315,11 +1306,11 @@ void OpcodeTable::Initialize() 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); @@ -1401,7 +1392,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); @@ -1427,7 +1418,7 @@ void OpcodeTable::Initialize() 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_OFFER_PETITION_ERROR, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_ON_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); @@ -1435,12 +1426,12 @@ void OpcodeTable::Initialize() 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_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_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PETITION_RENAME_GUILD_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1465,7 +1456,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_REQUEST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_ROUND_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_BATTLE_SLOT_UPDATES, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CAST_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CAST_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_CLEAR_SPELLS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_DISMISS_SOUND, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PET_GOD_MODE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1500,17 +1491,17 @@ void OpcodeTable::Initialize() 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_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_PVP_CREDIT, STATUS_NEVER, 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_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_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_ITEM_TEXT_RESPONSE, STATUS_UNHANDLED, 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); @@ -1543,31 +1534,30 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_DIFFICULTY_SET, STATUS_NEVER, 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_REPORT_PVP_PLAYER_AFK_RESULT, STATUS_UNHANDLED, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_CEMETERY_LIST_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_REQUEST_PVP_REWARDS_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_FAILED_NOTIFY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_RANGED_COMBAT_TIMER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESET_WEEKLY_CURRENCY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RESPEC_WIPE_CONFIRM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1577,9 +1567,9 @@ void OpcodeTable::Initialize() 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_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); @@ -1598,8 +1588,8 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SELL_RESPONSE, STATUS_NEVER, 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_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_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); @@ -1608,10 +1598,10 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SERVER_TIME, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_RESEARCH_HISTORY, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_AI_ANIM_KIT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ALL_TASK_PROGRESS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_ANIM_TIER, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_CURRENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_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_FACTION_AT_WAR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1621,7 +1611,6 @@ void OpcodeTable::Initialize() 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_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); @@ -1629,12 +1618,12 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PCT_SPELL_MODIFIER, STATUS_NEVER, 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_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PLAY_HOVER_ANIM, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_PROFICIENCY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SET_SPELL_CHARGES, STATUS_NEVER, 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_SET_VEHICLE_REC_ID, STATUS_UNHANDLED, 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_SHOW_NEUTRAL_PLAYER_FACTION_SELECT_UI, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1650,19 +1639,19 @@ void OpcodeTable::Initialize() 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_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_ENERGIZE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_EXECUTE_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILED_OTHER, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_FAILURE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_GO, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_HEAL_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INSTAKILL_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_INTERRUPT_LOG, STATUS_NEVER, CONNECTION_TYPE_REALM); + 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_PERIODIC_AURA_LOG, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_START, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPELL_UPDATE_CHAIN_TARGETS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_SPIRIT_HEALER_CONFIRM, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1670,10 +1659,10 @@ void OpcodeTable::Initialize() 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); @@ -1693,20 +1682,19 @@ void OpcodeTable::Initialize() 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_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_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_NEVER, 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); @@ -1716,14 +1704,13 @@ void OpcodeTable::Initialize() 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); @@ -1734,21 +1721,31 @@ void OpcodeTable::Initialize() 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 39befe6fd9a..2852afe44db 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -43,1609 +43,1604 @@ 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 = 0x0479, + CMSG_CHAT_MESSAGE_DND = 0x093D, + CMSG_CHAT_MESSAGE_EMOTE = 0x01BA, + CMSG_CHAT_MESSAGE_GUILD = 0x06FA, + CMSG_CHAT_MESSAGE_INSTANCE_CHAT = 0x012E, + CMSG_CHAT_MESSAGE_OFFICER = 0x02A9, + CMSG_CHAT_MESSAGE_PARTY = 0x007D, + CMSG_CHAT_MESSAGE_RAID = 0x0BB9, + CMSG_CHAT_MESSAGE_RAID_WARNING = 0x07BE, + CMSG_CHAT_MESSAGE_SAY = 0x0AE9, + CMSG_CHAT_MESSAGE_WHISPER = 0x09FE, + CMSG_CHAT_MESSAGE_YELL = 0x046E, + 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_CLEAR_ALL_FOLLOWERS_EXHAUSTION = 0x0883, - SMSG_GARRISON_COMPLETE_MISSION_RESULT = 0x00F7, - SMSG_GARRISON_CREATE_RESULT = 0x01BB, - SMSG_GARRISON_DELETE_RESULT = 0x01FC, - SMSG_GARRISON_FOLLOWER_CHANGED_ABILITIES = 0x0093, - SMSG_GARRISON_FOLLOWER_CHANGED_ITEM_LEVEL = 0x01B4, - SMSG_GARRISON_FOLLOWER_CHANGED_STATUS = 0x01E8, - SMSG_GARRISON_FOLLOWER_CHANGED_XP = 0x00AC, - SMSG_GARRISON_IS_UPGRADEABLE_RESULT = 0x01A8, - SMSG_GARRISON_LANDING_PAGE_SHIPMENT_INFO = 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_RECRUITMENT_NPC = 0x01D7, - 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 = 0x0436, + 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_MISSION_UPDATE_CAN_START = 0x0BE2, + 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_ABSORB_LOG = 0x1C8D, - 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 f551d111744..ab7b0552ff2 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -1421,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 { @@ -1439,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 @@ -1464,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 4ea97367d4b..d2db5378e65 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -360,6 +360,7 @@ namespace WorldPackets class SetActiveMover; class MoveSetCollisionHeightAck; class MoveTimeSkipped; + class SummonResponse; } namespace NPC @@ -499,6 +500,7 @@ namespace WorldPackets class UnlearnSkill; class SelfRes; class GetMirrorImageData; + class SpellClick; } namespace Talent @@ -509,15 +511,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; @@ -1034,14 +1029,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); @@ -1326,7 +1315,7 @@ class WorldSession void HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& packet); void HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& packet); void HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse& packet); - void HandleSummonResponseOpcode(WorldPacket& recvData); + void HandleSummonResponseOpcode(WorldPackets::Movement::SummonResponse& packet); void HandleJoinChannel(WorldPackets::Channel::JoinChannel& packet); void HandleLeaveChannel(WorldPackets::Channel::LeaveChannel& packet); @@ -1499,7 +1488,7 @@ class WorldSession void HandleTransmogrifyItems(WorldPacket& recvData); // Miscellaneous - void HandleSpellClick(WorldPacket& recvData); + void HandleSpellClick(WorldPackets::Spells::SpellClick& packet); void HandleMirrorImageDataRequest(WorldPackets::Spells::GetMirrorImageData& packet); void HandleRemoveGlyph(WorldPacket& recvData); void HandleGuildSetFocusedAchievement(WorldPackets::Achievement::GuildSetFocusedAchievement& setFocusedAchievement); diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index 497b416ded1..e47836c221c 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -460,7 +460,7 @@ enum AuraType SPELL_AURA_400 = 400, SPELL_AURA_401 = 401, SPELL_AURA_402 = 402, - SPELL_AURA_403 = 403, + SPELL_AURA_OVERRIDE_SPELL_VISUAL = 403, SPELL_AURA_OVERRIDE_ATTACK_POWER_BY_SP_PCT = 404, SPELL_AURA_405 = 405, SPELL_AURA_406 = 406, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index b5f154e6fe1..92a29dd5c73 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -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) @@ -3211,6 +3205,10 @@ void AuraEffect::HandleModStateImmunityMask(AuraApplication const* aurApp, uint8 switch (miscVal) { + case 27: + target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_SILENCE, apply); + aura_immunity_list.push_back(SPELL_AURA_MOD_SILENCE); + break; case 96: case 1615: { @@ -4089,10 +4087,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); } } @@ -4104,19 +4103,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); } } @@ -4180,8 +4175,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 diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index c3247b41b35..8098c8db3d5 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -202,6 +202,7 @@ void AuraApplication::BuildUpdatePacket(WorldPackets::Spells::AuraInfo& auraInfo WorldPackets::Spells::AuraDataInfo auraData; auraData.SpellID = aura->GetId(); + auraData.SpellXSpellVisualID = aura->GetSpellInfo()->GetSpellXSpellVisualId(_target->GetMap()->GetDifficultyID()); auraData.Flags = GetFlags(); if (aura->GetMaxDuration() > 0 && !(aura->GetSpellInfo()->AttributesEx5 & SPELL_ATTR5_HIDE_DURATION)) auraData.Flags |= AFLAG_DURATION; @@ -1353,19 +1354,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 +1388,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 cb0f34c162b..ae9fd1bee0d 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -643,7 +643,8 @@ m_spellValue(new SpellValue(caster->GetMap()->GetDifficultyID(), m_spellInfo)), m_procEx = 0; focusObject = NULL; m_cast_count = 0; - m_misc.Data = 0; + memset(m_misc.Raw.Data, 0, sizeof(m_misc.Raw.Data)); + m_SpellVisual = m_spellInfo->GetSpellXSpellVisualId(caster->GetMap()->GetDifficultyID()); m_preCastSpell = 0; m_triggeredByAuraSpell = NULL; m_spellAura = NULL; @@ -2996,6 +2997,14 @@ void Spell::prepare(SpellCastTargets const* targets, AuraEffect const* triggered triggeredByAura->GetBase()->SetDuration(0); } + if (m_caster->GetTypeId() == TYPEID_PLAYER) + { + m_caster->ToPlayer()->RestoreSpellMods(this); + // cleanup after mod system + // triggered spell pointer can be not removed in some cases + m_caster->ToPlayer()->SetSpellModTakingSpell(this, false); + } + SendCastResult(result); finish(false); @@ -3704,7 +3713,7 @@ void Spell::SendCastResult(SpellCastResult result) if (m_caster->ToPlayer()->GetSession()->PlayerLoading()) // don't send cast results at loading time return; - SendCastResult(m_caster->ToPlayer(), m_spellInfo, m_cast_count, result, m_customError, SMSG_CAST_FAILED, m_misc.Data); + SendCastResult(m_caster->ToPlayer(), m_spellInfo, m_cast_count, result, m_customError, SMSG_CAST_FAILED, m_misc.Raw.Data); } void Spell::SendPetCastResult(SpellCastResult result) @@ -3716,10 +3725,10 @@ void Spell::SendPetCastResult(SpellCastResult result) if (!owner || owner->GetTypeId() != TYPEID_PLAYER) return; - SendCastResult(owner->ToPlayer(), m_spellInfo, m_cast_count, result, SPELL_CUSTOM_ERROR_NONE, SMSG_PET_CAST_FAILED, m_misc.Data); + SendCastResult(owner->ToPlayer(), m_spellInfo, m_cast_count, result, SPELL_CUSTOM_ERROR_NONE, SMSG_PET_CAST_FAILED, m_misc.Raw.Data); } -void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError /*= SPELL_CUSTOM_ERROR_NONE*/, OpcodeServer opcode /*= SMSG_CAST_FAILED*/, uint32 misc /*= 0*/) +void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError /*= SPELL_CUSTOM_ERROR_NONE*/, OpcodeServer opcode /*= SMSG_CAST_FAILED*/, uint32* misc /*= nullptr*/) { if (result == SPELL_CAST_OK) return; @@ -3830,10 +3839,11 @@ void Spell::SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cas packet.FailedArg1 = missingItem; // first missing item break; } - case SPELL_FAILED_CANT_UNTALENT: + case SPELL_FAILED_CANT_UNTALENT: { - if (TalentEntry const* talent = sTalentStore.LookupEntry(misc)) - packet.FailedArg1 = talent->SpellID; + if (misc) + if (TalentEntry const* talent = sTalentStore.LookupEntry(misc[0])) + packet.FailedArg1 = talent->SpellID; break; } // TODO: SPELL_FAILED_NOT_STANDING @@ -3852,6 +3862,10 @@ void Spell::SendSpellStart() TC_LOG_DEBUG("spells", "Sending SMSG_SPELL_START id=%u", m_spellInfo->Id); uint32 castFlags = CAST_FLAG_HAS_TRAJECTORY; + uint32 schoolImmunityMask = m_caster->GetSchoolImmunityMask(); + uint32 mechanicImmunityMask = m_caster->GetMechanicImmunityMask(); + if (schoolImmunityMask || mechanicImmunityMask) + castFlags |= CAST_FLAG_IMMUNITY; if ((IsTriggered() && !m_spellInfo->IsAutoRepeatRangedSpell()) || m_triggeredByAuraSpell) castFlags |= CAST_FLAG_PENDING; @@ -3876,6 +3890,7 @@ void Spell::SendSpellStart() castData.CasterUnit = m_caster->GetGUID(); castData.CastID = m_cast_count; // pending spell cast? castData.SpellID = m_spellInfo->Id; + castData.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; castData.CastTime = m_casttime; @@ -3925,12 +3940,11 @@ void Spell::SendSpellStart() castData.Ammo.InventoryType = 0; }**/ - /** @todo implement spell immunity packet data if (castFlags & CAST_FLAG_IMMUNITY) { - castData.Immunities.School = 0; - castData.Immunities.Value = 0; - }**/ + castData.Immunities.School = schoolImmunityMask; + castData.Immunities.Value = mechanicImmunityMask; + } /** @todo implement heal prediction packet data if (castFlags & CAST_FLAG_HEAL_PREDICTION) @@ -3992,6 +4006,7 @@ void Spell::SendSpellGo() castData.CasterUnit = m_caster->GetGUID(); castData.CastID = m_cast_count; // pending spell cast? castData.SpellID = m_spellInfo->Id; + castData.SpellXSpellVisualID = m_SpellVisual; castData.CastFlags = castFlags; castData.CastTime = getMSTime(); @@ -4233,6 +4248,7 @@ void Spell::SendInterrupted(uint8 result) failurePacket.CasterUnit = m_caster->GetGUID(); failurePacket.CastID = m_cast_count; failurePacket.SpellID = m_spellInfo->Id; + failurePacket.SpelXSpellVisualID = m_SpellVisual; failurePacket.Reason = result; m_caster->SendMessageToSet(failurePacket.Write(), true); @@ -4271,11 +4287,22 @@ void Spell::SendChannelStart(uint32 duration) spellChannelStart.ChannelDuration = duration; m_caster->SendMessageToSet(spellChannelStart.Write(), true); + uint32 schoolImmunityMask = m_caster->GetSchoolImmunityMask(); + uint32 mechanicImmunityMask = m_caster->GetMechanicImmunityMask(); + + if (schoolImmunityMask || mechanicImmunityMask) + { + spellChannelStart.InterruptImmunities = boost::in_place(); + spellChannelStart.InterruptImmunities->SchoolImmunities = schoolImmunityMask; + spellChannelStart.InterruptImmunities->Immunities = mechanicImmunityMask; + } + m_timer = duration; if (!channelTarget.IsEmpty()) 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) @@ -4508,6 +4535,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); @@ -4519,8 +4550,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) @@ -5131,15 +5186,15 @@ SpellCastResult Spell::CheckCast(bool strict) m_preGeneratedPath.SetPathLengthLimit(range); // first try with raycast, if it fails fall back to normal path - bool result = m_preGeneratedPath.CalculatePath(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + target->GetObjectSize(), false, true); + bool result = m_preGeneratedPath.CalculatePath(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + target->GetObjectSize() / 2.f, 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); + result = m_preGeneratedPath.CalculatePath(target->GetPositionX(), target->GetPositionY(), target->GetPositionZ() + target->GetObjectSize() / 2.f, 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; } @@ -6635,7 +6690,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()); } diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 77abd3c78c2..1b370c8fa28 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -489,7 +489,7 @@ class Spell void CheckSrc() { if (!m_targets.HasSrc()) m_targets.SetSrc(*m_caster); } void CheckDst() { if (!m_targets.HasDst()) m_targets.SetDst(*m_caster); } - static void SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, OpcodeServer opcode = SMSG_CAST_FAILED, uint32 misc = 0); + static void SendCastResult(Player* caster, SpellInfo const* spellInfo, uint8 cast_count, SpellCastResult result, SpellCustomErrors customError = SPELL_CUSTOM_ERROR_NONE, OpcodeServer opcode = SMSG_CAST_FAILED, uint32* misc = nullptr); void SendCastResult(SpellCastResult result); void SendPetCastResult(SpellCastResult result); void SendSpellStart(); @@ -526,8 +526,29 @@ class Spell uint32 TalentId; uint32 GlyphSlot; - uint32 Data; + // SPELL_EFFECT_SET_FOLLOWER_QUALITY + // SPELL_EFFECT_INCREASE_FOLLOWER_ITEM_LEVEL + // SPELL_EFFECT_INCREASE_FOLLOWER_EXPERIENCE + // SPELL_EFFECT_RANDOMIZE_FOLLOWER_ABILITIES + // SPELL_EFFECT_LEARN_FOLLOWER_ABILITY + struct + { + uint32 Id; + uint32 AbilityId; // only SPELL_EFFECT_LEARN_FOLLOWER_ABILITY + } GarrFollower; + + // SPELL_EFFECT_FINISH_GARRISON_MISSION + uint32 GarrMissionId; + + // SPELL_EFFECT_UPGRADE_HEIRLOOM + uint32 ItemId; + + struct + { + uint32 Data[2]; + } Raw; } m_misc; + uint32 m_SpellVisual; uint32 m_preCastSpell; SpellCastTargets m_targets; int8 m_comboPointGain; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index e4bef46b3bb..474ce4361e8 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -326,6 +326,7 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectNULL, //248 SPELL_EFFECT_FINISH_SHIPMENT &Spell::EffectNULL, //249 SPELL_EFFECT_249 &Spell::EffectNULL, //250 SPELL_EFFECT_TAKE_SCREENSHOT + &Spell::EffectNULL, //251 SPELL_EFFECT_SET_GARRISON_CACHE_SIZE }; void Spell::EffectNULL(SpellEffIndex /*effIndex*/) @@ -499,7 +500,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)); @@ -2485,7 +2486,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; @@ -2686,16 +2687,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) @@ -2907,19 +2905,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); @@ -5484,10 +5481,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 diff --git a/src/server/game/Spells/SpellHistory.cpp b/src/server/game/Spells/SpellHistory.cpp index 54e33078622..64902febc77 100644 --- a/src/server/game/Spells/SpellHistory.cpp +++ b/src/server/game/Spells/SpellHistory.cpp @@ -720,21 +720,13 @@ void SpellHistory::RestoreCharge(SpellCategoryEntry const* chargeCategoryEntry) if (Player* player = GetPlayerOwner()) { - int32 maxCharges = GetMaxCharges(chargeCategoryEntry); - int32 usedCharges = itr->second.size(); - float count = float(maxCharges - usedCharges); - if (usedCharges) - { - ChargeEntry& charge = itr->second.front(); - std::chrono::milliseconds remaining = std::chrono::duration_cast<std::chrono::milliseconds>(charge.RechargeEnd - Clock::now()); - std::chrono::milliseconds recharge = std::chrono::duration_cast<std::chrono::milliseconds>(charge.RechargeEnd - charge.RechargeStart); - count += 1.0f - float(remaining.count()) / float(recharge.count()); - } - WorldPackets::Spells::SetSpellCharges setSpellCharges; - setSpellCharges.IsPet = player == _owner; - setSpellCharges.Count = count; setSpellCharges.Category = chargeCategoryEntry->ID; + if (!itr->second.empty()) + setSpellCharges.NextRecoveryTime = uint32(std::chrono::duration_cast<std::chrono::milliseconds>(itr->second.front().RechargeEnd - Clock::now()).count()); + setSpellCharges.ConsumedCharges = itr->second.size(); + setSpellCharges.IsPet = player == _owner; + player->SendDirectMessage(setSpellCharges.Write()); } } diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index 6560309527c..55b0d1cdebf 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -327,16 +327,36 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_ {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 115 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 116 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 117 - {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 118 + {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 118 {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_RAID, TARGET_DIR_NONE}, // 119 - {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 120 - {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 121 + {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_AREA, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 120 + {TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 121 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 122 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 123 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 124 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 125 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 126 {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 127 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 128 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 129 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 130 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 131 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 132 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 133 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 134 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 135 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 136 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 137 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 138 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 139 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 140 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 141 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 142 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 143 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 144 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 145 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 146 + {TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 147 }; SpellEffectInfo::SpellEffectInfo(SpellEntry const* /*spellEntry*/, SpellInfo const* spellInfo, uint8 effIndex, SpellEffectEntry const* _effect) @@ -945,9 +965,17 @@ SpellEffectInfo::StaticData SpellEffectInfo::_data[TOTAL_SPELL_EFFECTS] = {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 242 SPELL_EFFECT_242 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 243 SPELL_EFFECT_243 {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 244 SPELL_EFFECT_244 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 245 SPELL_EFFECT_235 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 246 SPELL_EFFECT_236 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 247 SPELL_EFFECT_237 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 248 SPELL_EFFECT_238 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 249 SPELL_EFFECT_239 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 250 SPELL_EFFECT_240 + {EFFECT_IMPLICIT_TARGET_NONE, TARGET_OBJECT_TYPE_NONE}, // 251 SPELL_EFFECT_241 }; -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 +1034,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; @@ -1901,7 +1927,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; } } @@ -2801,6 +2827,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; @@ -3239,8 +3301,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 @@ -3250,7 +3310,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()) @@ -3263,23 +3324,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 6d1d787e303..5fd960066f0 100644 --- a/src/server/game/Spells/SpellInfo.h +++ b/src/server/game/Spells/SpellInfo.h @@ -318,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 @@ -446,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; @@ -566,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; @@ -582,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 4f73eee601f..0c79c966826 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) @@ -498,7 +498,7 @@ bool SpellMgr::IsSpellValid(SpellInfo const* spellInfo, Player* player, bool msg case SPELL_EFFECT_CREATE_ITEM: case SPELL_EFFECT_CREATE_ITEM_2: { - if (effect->ItemType == 0) + if (effect->ItemType == 0) { // skip auto-loot crafting spells, its not need explicit item info (but have special fake items sometime) if (!spellInfo->IsLootCrafting()) @@ -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)) @@ -3215,6 +3184,9 @@ void SpellMgr::LoadSpellInfoCorrections() const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_0))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); const_cast<SpellEffectInfo*>(spellInfo->GetEffect(EFFECT_1))->TargetB = SpellImplicitTargetInfo(TARGET_UNIT_SRC_AREA_ALLY); break; + case 15290: // Vampiric Embrace + spellInfo->AttributesEx3 |= SPELL_ATTR3_NO_INITIAL_AGGRO; + break; case 8145: // Tremor Totem (instant pulse) case 6474: // Earthbind Totem (instant pulse) spellInfo->AttributesEx5 |= SPELL_ATTR5_START_PERIODIC_AT_APPLY; 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 5afd6fc1d81..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,7 +35,7 @@ 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); @@ -50,165 +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, GetPlayerName().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()); - - if (!_assignedTo.IsEmpty()) - ss << handler.PGetParseString(LANG_COMMAND_TICKETLISTASSIGNEDTO, GetAssignedToName().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, GetPlayerName().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) @@ -248,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); @@ -264,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() @@ -344,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); @@ -385,8 +225,7 @@ void ComplaintTicket::SaveToDB(SQLTransaction& trans) const ++lineIndex; } - if (!isInTransaction) - CharacterDatabase.CommitTransaction(trans); + CharacterDatabase.CommitTransaction(trans); } void ComplaintTicket::DeleteFromDB() @@ -460,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); @@ -476,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() @@ -508,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; @@ -536,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); @@ -579,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<> @@ -590,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(); @@ -765,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) @@ -791,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) @@ -801,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<> @@ -850,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(); } } @@ -880,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(); } } @@ -893,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) @@ -956,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); @@ -1002,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); @@ -1036,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 10bd90d4f80..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, @@ -125,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; @@ -144,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: @@ -221,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; @@ -254,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; @@ -281,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; @@ -295,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 { @@ -313,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; @@ -332,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; } @@ -358,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); @@ -386,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; } @@ -404,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/CreatureTextMgr.cpp b/src/server/game/Texts/CreatureTextMgr.cpp index 4d61e2ec5d2..9967f9f299b 100644 --- a/src/server/game/Texts/CreatureTextMgr.cpp +++ b/src/server/game/Texts/CreatureTextMgr.cpp @@ -81,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); @@ -228,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; } @@ -428,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 f2963006599..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; }; 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 54c926eea71..7746607d9e6 100644 --- a/src/server/game/World/World.cpp +++ b/src/server/game/World/World.cpp @@ -445,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) @@ -628,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); @@ -1459,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(); @@ -1734,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..."); @@ -1827,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(); @@ -1836,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(); 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..b9a22162e2e 100644 --- a/src/server/scripts/Commands/cs_debug.cpp +++ b/src/server/scripts/Commands/cs_debug.cpp @@ -34,6 +34,7 @@ EndScriptData */ #include "Transport.h" #include "Language.h" #include "MovementPackets.h" +#include "SpellPackets.h" #include "ScenePackets.h" #include <fstream> @@ -213,16 +214,13 @@ public: char* fail2 = strtok(NULL, " "); uint8 failArg2 = fail2 ? (uint8)atoi(fail2) : 0; - WorldPacket data(SMSG_CAST_FAILED, 5); - data << uint8(0); - data << uint32(133); - data << uint8(failNum); - if (fail1 || fail2) - data << uint32(failArg1); - if (fail2) - data << uint32(failArg2); - - handler->GetSession()->SendPacket(&data); + WorldPackets::Spells::CastFailed castFailed(SMSG_CAST_FAILED); + castFailed.CastID = 0; + castFailed.SpellID = 133; + castFailed.Reason = failNum; + castFailed.FailedArg1 = failArg1; + castFailed.FailedArg2 = failArg2; + handler->GetSession()->SendPacket(castFailed.Write()); return true; } @@ -1431,7 +1429,7 @@ public: handler->SendSysMessage("Target is not phased"); return true; } - + static bool HandleDebugSendPlaySceneCommand(ChatHandler* handler, char const* args) { if (!*args) @@ -1458,7 +1456,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_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_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp index b9765223add..83c8d55aec3 100644 --- a/src/server/scripts/Commands/cs_misc.cpp +++ b/src/server/scripts/Commands/cs_misc.cpp @@ -1350,8 +1350,8 @@ public: static bool HandleMaxSkillCommand(ChatHandler* handler, char const* /*args*/) { - Player* SelectedPlayer = handler->getSelectedPlayer(); - if (!SelectedPlayer) + Player* player = handler->getSelectedPlayerOrSelf(); + if (!player) { handler->SendSysMessage(LANG_NO_CHAR_SELECTED); handler->SetSentErrorMessage(true); @@ -1359,7 +1359,7 @@ public: } // each skills that have max skill value dependent from level seted to current level max skill value - SelectedPlayer->UpdateSkillsToMaxSkillsForLevel(); + player->UpdateSkillsToMaxSkillsForLevel(); return true; } diff --git a/src/server/scripts/Commands/cs_mmaps.cpp b/src/server/scripts/Commands/cs_mmaps.cpp index db3063fc693..a21fe324de3 100644 --- a/src/server/scripts/Commands/cs_mmaps.cpp +++ b/src/server/scripts/Commands/cs_mmaps.cpp @@ -87,6 +87,10 @@ public: if (para && strcmp(para, "true") == 0) useStraightPath = true; + bool useStraightLine = false; + if (para && strcmp(para, "line") == 0) + useStraightLine = true; + // unit locations float x, y, z; player->GetPosition(x, y, z); @@ -94,11 +98,11 @@ public: // path PathGenerator path(target); path.SetUseStraightPath(useStraightPath); - bool result = path.CalculatePath(x, y, z); + bool result = path.CalculatePath(x, y, z, false, useStraightLine); Movement::PointsArray const& pointPath = path.GetPath(); handler->PSendSysMessage("%s's path to %s:", target->GetName().c_str(), player->GetName().c_str()); - handler->PSendSysMessage("Building: %s", useStraightPath ? "StraightPath" : "SmoothPath"); + handler->PSendSysMessage("Building: %s", useStraightPath ? "StraightPath" : useStraightLine ? "Raycast" : "SmoothPath"); handler->PSendSysMessage("Result: %s - Length: %zu - Type: %u", (result ? "true" : "false"), pointPath.size(), path.GetPathType()); G3D::Vector3 const &start = path.GetStartPosition(); diff --git a/src/server/scripts/Commands/cs_modify.cpp b/src/server/scripts/Commands/cs_modify.cpp index 3bcb6862b7f..9b4f78722c3 100644 --- a/src/server/scripts/Commands/cs_modify.cpp +++ b/src/server/scripts/Commands/cs_modify.cpp @@ -23,14 +23,13 @@ Category: commandscripts EndScriptData */ #include "Chat.h" -#include <stdlib.h> #include "ObjectMgr.h" #include "Opcodes.h" #include "Pet.h" #include "Player.h" #include "ReputationMgr.h" #include "ScriptMgr.h" - +#include "SpellPackets.h" class modify_commandscript : public CommandScript { @@ -407,12 +406,15 @@ public: if (handler->needReportToTarget(target)) ChatHandler(target->GetSession()).PSendSysMessage(LANG_YOURS_SPELLFLATID_CHANGED, handler->GetNameLink().c_str(), spellflatid, val, mark); - WorldPacket data(SMSG_SET_FLAT_SPELL_MODIFIER, (1+1+2+2)); - data << uint8(spellflatid); - data << uint8(op); - data << uint16(val); - data << uint16(mark); - target->GetSession()->SendPacket(&data); + WorldPackets::Spells::SetSpellModifier packet(SMSG_SET_FLAT_SPELL_MODIFIER); + WorldPackets::Spells::SpellModifier spellMod; + spellMod.ModIndex = op; + WorldPackets::Spells::SpellModifierData modData; + modData.ClassIndex = spellflatid; + modData.ModifierValue = float(val); + spellMod.ModifierData.push_back(modData); + packet.Modifiers.push_back(spellMod); + target->GetSession()->SendPacket(packet.Write()); return true; } 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/chapter1.cpp b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp index ba2f1505127..9b290852dc2 100644 --- a/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp +++ b/src/server/scripts/EasternKingdoms/ScarletEnclave/chapter1.cpp @@ -152,6 +152,7 @@ public: if (id == 1) { wait_timer = 5000; + me->LoadEquipment(1); me->CastSpell(me, SPELL_DK_INITIATE_VISUAL, true); if (Player* starter = ObjectAccessor::GetPlayer(*me, playerGUID)) 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/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/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp index 0b829c2c6dd..620eb54ffa9 100644 --- a/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp +++ b/src/server/scripts/Northrend/FrozenHalls/ForgeOfSouls/boss_bronjahm.cpp @@ -123,11 +123,13 @@ class boss_bronjahm : public CreatureScript void JustSummoned(Creature* summon) override { - summons.Summon(summon); - summon->SetReactState(REACT_PASSIVE); - summon->GetMotionMaster()->Clear(); - summon->GetMotionMaster()->MoveFollow(me, me->GetObjectSize(), 0.0f); - summon->CastSpell(summon, SPELL_PURPLE_BANISH_VISUAL, true); + if (summon->GetEntry() == NPC_CORRUPTED_SOUL_FRAGMENT) + { + summons.Summon(summon); + summon->SetReactState(REACT_PASSIVE); + summon->GetMotionMaster()->MoveFollow(me, me->GetObjectSize(), 0.0f); + summon->CastSpell(summon, SPELL_PURPLE_BANISH_VISUAL, true); + } } uint32 GetData(uint32 type) const override @@ -223,9 +225,15 @@ class npc_corrupted_soul_fragment : public CreatureScript instance = me->GetInstanceScript(); } + void IsSummonedBy(Unit* /*summoner*/) override + { + if (Creature* bronjahm = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_BRONJAHM))) + bronjahm->AI()->JustSummoned(me); + } + void MovementInform(uint32 type, uint32 id) override { - if (type != CHASE_MOTION_TYPE) + if (type != FOLLOW_MOTION_TYPE) return; if (instance->GetGuidData(DATA_BRONJAHM).GetCounter() != id) 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/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp index 11d19d76d80..9a9d1b1f6e0 100644 --- a/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp +++ b/src/server/scripts/Northrend/Nexus/EyeOfEternity/instance_eye_of_eternity.cpp @@ -77,9 +77,9 @@ public: /// @todo this should be handled in map, maybe add a summon function in map // There is no other way afaik... - void SpawnGameObject(uint32 entry, Position& pos) + void SpawnGameObject(uint32 entry, Position const& pos) { - GameObject* go = new GameObject; + GameObject* go = new GameObject(); if (!go->Create(instance->GenerateLowGuid<HighGuid::GameObject>(), entry, instance, PHASEMASK_NORMAL, pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), 0, 0, 0, 0, 120, GO_STATE_READY)) @@ -98,30 +98,19 @@ public: platformGUID = go->GetGUID(); break; case GO_FOCUSING_IRIS_10: - if (instance->GetDifficultyID() == DIFFICULTY_10_N) - { - irisGUID = go->GetGUID(); - focusingIrisPosition = go->GetPosition(); - } - break; case GO_FOCUSING_IRIS_25: - if (instance->GetDifficultyID() == DIFFICULTY_25_N) - { - irisGUID = go->GetGUID(); - focusingIrisPosition = go->GetPosition(); - } + irisGUID = go->GetGUID(); + focusingIrisPosition = go->GetPosition(); break; case GO_EXIT_PORTAL: exitPortalGUID = go->GetGUID(); exitPortalPosition = go->GetPosition(); break; case GO_HEART_OF_MAGIC_10: - if (instance->GetDifficultyID() == DIFFICULTY_10_N) - heartOfMagicGUID = go->GetGUID(); - break; case GO_HEART_OF_MAGIC_25: - if (instance->GetDifficultyID() == DIFFICULTY_25_N) - heartOfMagicGUID = go->GetGUID(); + heartOfMagicGUID = go->GetGUID(); + break; + default: break; } } @@ -166,10 +155,10 @@ public: if (eventId == EVENT_FOCUSING_IRIS) { if (Creature* alexstraszaBunny = instance->GetCreature(alexstraszaBunnyGUID)) - { alexstraszaBunny->CastSpell(alexstraszaBunny, SPELL_IRIS_OPENED); - instance->GetGameObject(irisGUID)->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); - } + + if (GameObject* iris = instance->GetGameObject(irisGUID)) + iris->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_IN_USE); if (Creature* malygos = instance->GetCreature(malygosGUID)) malygos->AI()->DoAction(0); // ACTION_LAND_ENCOUNTER_START @@ -183,17 +172,17 @@ public: { if (Creature* malygos = instance->GetCreature(malygosGUID)) { - std::list<HostileReference*> m_threatlist = malygos->getThreatManager().getThreatList(); + ThreatContainer::StorageType const& threatList = malygos->getThreatManager().getThreatList(); for (GuidList::const_iterator itr_vortex = vortexTriggers.begin(); itr_vortex != vortexTriggers.end(); ++itr_vortex) { - if (m_threatlist.empty()) + if (threatList.empty()) return; uint8 counter = 0; if (Creature* trigger = instance->GetCreature(*itr_vortex)) { // each trigger have to cast the spell to 5 players. - for (std::list<HostileReference*>::const_iterator itr = m_threatlist.begin(); itr!= m_threatlist.end(); ++itr) + for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr) { if (counter >= 5) break; diff --git a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp index 5ed644fd8cc..e0a4e06e287 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/instance_oculus.cpp @@ -229,6 +229,21 @@ class instance_oculus : public InstanceMapScript return true; } + uint32 GetData(uint32 type) const override + { + if (type == DATA_CONSTRUCTS) + { + if (CentrifugueConstructCounter == 0) + return KILL_NO_CONSTRUCT; + else if (CentrifugueConstructCounter == 1) + return KILL_ONE_CONSTRUCT; + else if (CentrifugueConstructCounter > 1) + return KILL_MORE_CONSTRUCT; + } + + return KILL_NO_CONSTRUCT; + } + ObjectGuid GetGuidData(uint32 type) const override { switch (type) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp index 34039fa7ce6..94693936831 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.cpp @@ -20,6 +20,7 @@ #include "ScriptedGossip.h" #include "SpellScript.h" #include "SpellAuraEffects.h" +#include "SpellInfo.h" #include "CombatAI.h" #include "Player.h" #include "Vehicle.h" @@ -76,6 +77,11 @@ enum Drakes SPELL_EMERALD_TOUCH_THE_NIGHTMARE = 50341, // (60 yds) - Instant - Consumes 30% of the caster's max health to inflict 25, 000 nature damage to an enemy dragon and reduce the damage it deals by 25% for 30 sec. // you do not have access to until you kill the Mage-Lord Urom SPELL_EMERALD_DREAM_FUNNEL = 50344, // (60 yds) - Channeled - Transfers 5% of the caster's max health to a friendly drake every second for 10 seconds as long as the caster channels. +/* + * All Drakes + * GPS System + */ + SPELL_GPS = 53389, // Misc POINT_LAND = 2, @@ -101,7 +107,13 @@ enum Says WHISPER_DRAKES_WELCOME = 1, WHISPER_DRAKES_ABILITIES = 2, WHISPER_DRAKES_SPECIAL = 3, - WHISPER_DRAKES_LOWHEALTH = 4 + WHISPER_DRAKES_LOWHEALTH = 4, + WHISPER_GPS_10_CONSTRUCTS = 5, + WHISPER_GPS_1_CONSTRUCT = 6, + WHISPER_GPS_VAROS = 7, + WHISPER_GPS_UROM = 8, + WHISPER_GPS_EREGOS = 9, + WHISPER_GPS_END = 10 }; class npc_verdisa_beglaristrasz_eternos : public CreatureScript @@ -250,6 +262,26 @@ class npc_ruby_emerald_amber_drake : public CreatureScript Initialize(); } + void SpellHit(Unit* /*caster*/, const SpellInfo* spell) override + { + if (Unit* creator = ObjectAccessor::GetUnit(*me, me->GetCreatorGUID())) + if (spell->Id == SPELL_GPS) + { + if (_instance->GetBossState(DATA_EREGOS) == DONE) + Talk(WHISPER_GPS_END, creator); + else if (_instance->GetBossState(DATA_UROM) == DONE) + Talk(WHISPER_GPS_EREGOS, creator); + else if (_instance->GetBossState(DATA_VAROS) == DONE) + Talk(WHISPER_GPS_UROM, creator); + else if (_instance->GetData(DATA_CONSTRUCTS) == KILL_NO_CONSTRUCT) + Talk(WHISPER_GPS_VAROS, creator); + else if (_instance->GetData(DATA_CONSTRUCTS) == KILL_ONE_CONSTRUCT) + Talk(WHISPER_GPS_1_CONSTRUCT, creator); + else if (_instance->GetData(DATA_CONSTRUCTS) == KILL_MORE_CONSTRUCT) + Talk(WHISPER_GPS_10_CONSTRUCTS, creator); + } + } + void IsSummonedBy(Unit* summoner) override { if (_instance->GetBossState(DATA_EREGOS) == IN_PROGRESS) diff --git a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h index fd46f0a6bcc..08fc15c5752 100644 --- a/src/server/scripts/Northrend/Nexus/Oculus/oculus.h +++ b/src/server/scripts/Northrend/Nexus/Oculus/oculus.h @@ -29,7 +29,9 @@ enum DataTypes DATA_DRAKOS = 0, DATA_VAROS = 1, DATA_UROM = 2, - DATA_EREGOS = 3 + DATA_EREGOS = 3, + // GPS System + DATA_CONSTRUCTS = 4 }; enum CreatureIds @@ -91,6 +93,13 @@ enum InstanceEvents EVENT_EREGOS_INTRO }; +enum ConstructKillState +{ + KILL_NO_CONSTRUCT = 0, + KILL_ONE_CONSTRUCT = 1, + KILL_MORE_CONSTRUCT = 2 +}; + enum Misc { POINT_MOVE_OUT = 1 diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp index a8cad32333b..18cf9e07304 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/instance_ulduar.cpp @@ -690,22 +690,7 @@ class instance_ulduar : public InstanceMapScript { case BOSS_LEVIATHAN: if (state == DONE) - { - // Eject all players from vehicles and make them untargetable. - // They will be despawned after a while - for (auto const& vehicleGuid : LeviathanVehicleGUIDs) - { - if (Creature* vehicleCreature = instance->GetCreature(vehicleGuid)) - { - if (Vehicle* vehicle = vehicleCreature->GetVehicleKit()) - { - vehicle->RemoveAllPassengers(); - vehicleCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); - vehicleCreature->DespawnOrUnsummon(5 * MINUTE * IN_MILLISECONDS); - } - } - } - } + _events.ScheduleEvent(EVENT_DESPAWN_LEVIATHAN_VEHICLES, 5 * IN_MILLISECONDS); break; case BOSS_IGNIS: case BOSS_RAZORSCALE: @@ -1164,6 +1149,22 @@ class instance_ulduar : public InstanceMapScript algalon->AI()->DoAction(EVENT_DESPAWN_ALGALON); } break; + case EVENT_DESPAWN_LEVIATHAN_VEHICLES: + // Eject all players from vehicles and make them untargetable. + // They will be despawned after a while + for (auto const& vehicleGuid : LeviathanVehicleGUIDs) + { + if (Creature* vehicleCreature = instance->GetCreature(vehicleGuid)) + { + if (Vehicle* vehicle = vehicleCreature->GetVehicleKit()) + { + vehicle->RemoveAllPassengers(); + vehicleCreature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + vehicleCreature->DespawnOrUnsummon(5 * MINUTE * IN_MILLISECONDS); + } + } + } + break; } } } diff --git a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h index d40fb698658..2d10ffc01bc 100644 --- a/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h +++ b/src/server/scripts/Northrend/Ulduar/Ulduar/ulduar.h @@ -404,6 +404,7 @@ enum UlduarEvents EVENT_DESPAWN_ALGALON = 1, EVENT_UPDATE_ALGALON_TIMER = 2, ACTION_INIT_ALGALON = 6, + EVENT_DESPAWN_LEVIATHAN_VEHICLES = 7 }; enum YoggSaronIllusions diff --git a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp index 36d2c5f8ed3..dc923e534b0 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_cyanigosa.cpp @@ -23,12 +23,9 @@ enum Spells { SPELL_ARCANE_VACUUM = 58694, SPELL_BLIZZARD = 58693, - H_SPELL_BLIZZARD = 59369, SPELL_MANA_DESTRUCTION = 59374, SPELL_TAIL_SWEEP = 58690, - H_SPELL_TAIL_SWEEP = 59283, SPELL_UNCONTROLLABLE_ENERGY = 58688, - H_SPELL_UNCONTROLLABLE_ENERGY = 59281, SPELL_TRANSFORM = 58668 }; @@ -48,17 +45,11 @@ class boss_cyanigosa : public CreatureScript public: boss_cyanigosa() : CreatureScript("boss_cyanigosa") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_cyanigosaAI>(creature); - } - - struct boss_cyanigosaAI : public ScriptedAI + struct boss_cyanigosaAI : public BossAI { - boss_cyanigosaAI(Creature* creature) : ScriptedAI(creature) + boss_cyanigosaAI(Creature* creature) : BossAI(creature, DATA_CYANIGOSA) { Initialize(); - instance = creature->GetInstanceScript(); } void Initialize() @@ -76,24 +67,20 @@ public: uint32 uiTailSweepTimer; uint32 uiUncontrollableEnergyTimer; - InstanceScript* instance; - void Reset() override { Initialize(); - instance->SetData(DATA_CYANIGOSA_EVENT, NOT_STARTED); + BossAI::Reset(); } - void EnterCombat(Unit* /*who*/) override + void EnterCombat(Unit* who) override { + BossAI::EnterCombat(who); Talk(SAY_AGGRO); - - instance->SetData(DATA_CYANIGOSA_EVENT, IN_PROGRESS); } void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { if (instance->GetData(DATA_REMOVE_NPC) == 1) @@ -102,13 +89,12 @@ public: instance->SetData(DATA_REMOVE_NPC, 0); } - //Return since we have no target if (!UpdateVictim()) return; if (uiArcaneVacuumTimer <= diff) { - DoCast(SPELL_ARCANE_VACUUM); + DoCastAOE(SPELL_ARCANE_VACUUM); uiArcaneVacuumTimer = 10000; } else uiArcaneVacuumTimer -= diff; @@ -121,7 +107,7 @@ public: if (uiTailSweepTimer <= diff) { - DoCast(SPELL_TAIL_SWEEP); + DoCastVictim(SPELL_TAIL_SWEEP); uiTailSweepTimer = 20000; } else uiTailSweepTimer -= diff; @@ -144,22 +130,23 @@ public: DoMeleeAttackIfReady(); } - void JustDied(Unit* /*killer*/) override + void JustDied(Unit* killer) override { + BossAI::JustDied(killer); Talk(SAY_DEATH); - - instance->SetData(DATA_CYANIGOSA_EVENT, DONE); } void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - - Talk(SAY_SLAY); + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_cyanigosaAI>(creature); + } }; class achievement_defenseless : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp index 2fd98bd48cf..b1dffee1a2c 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_erekem.cpp @@ -24,12 +24,11 @@ enum Spells SPELL_BLOODLUST = 54516, SPELL_BREAK_BONDS = 59463, SPELL_CHAIN_HEAL = 54481, - H_SPELL_CHAIN_HEAL = 59473, SPELL_EARTH_SHIELD = 54479, - H_SPELL_EARTH_SHIELD = 59471, SPELL_EARTH_SHOCK = 54511, SPELL_LIGHTNING_BOLT = 53044, - SPELL_STORMSTRIKE = 51876 + SPELL_STORMSTRIKE = 51876, + SPELL_WINDFURY = 54493 }; enum Yells @@ -42,6 +41,17 @@ enum Yells SAY_BOTH_ADDS_KILLED = 5 }; +enum ErekemEvents +{ + EVENT_EARTH_SHIELD = 1, + EVENT_CHAIN_HEAL, + EVENT_BLOODLUST, + EVENT_LIGHTNING_BOLT, + EVENT_EARTH_SHOCK, + EVENT_WINDFURY, + EVENT_STORMSTRIKE +}; + class boss_erekem : public CreatureScript { public: @@ -62,39 +72,50 @@ public: void Initialize() { - uiBloodlustTimer = 15000; - uiChainHealTimer = 0; - uiEarthShockTimer = urand(2000, 8000); - uiLightningBoltTimer = urand(5000, 10000); - uiEarthShieldTimer = 20000; + phase = 0; + breakBondsCd = 0; } - uint32 uiBloodlustTimer; - uint32 uiChainHealTimer; - uint32 uiEarthShockTimer; - uint32 uiLightningBoltTimer; - uint32 uiEarthShieldTimer; - - InstanceScript* instance; - void Reset() override { Initialize(); + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) { - if (!pGuard1->IsAlive()) - pGuard1->Respawn(); + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + pGuard1->DespawnOrUnsummon(); + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + pGuard2->DespawnOrUnsummon(); } - if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + else { - if (!pGuard2->IsAlive()) - pGuard2->Respawn(); + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + { + if (!pGuard1->IsAlive()) + pGuard1->Respawn(); + } + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + { + if (!pGuard2->IsAlive()) + pGuard2->Respawn(); + } } + + events.Reset(); + } + + void JustReachedHome() override + { + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) + pGuard1->Respawn(); + + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + pGuard2->Respawn(); } void AttackStart(Unit* who) override @@ -111,13 +132,13 @@ public: if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) { - pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); + pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); if (!pGuard1->GetVictim() && pGuard1->AI()) pGuard1->AI()->AttackStart(who); } if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) { - pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); + pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); if (!pGuard2->GetVictim() && pGuard2->AI()) pGuard2->AI()->AttackStart(who); } @@ -129,125 +150,160 @@ public: Talk(SAY_AGGRO); DoCast(me, SPELL_EARTH_SHIELD); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_EREKEM_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_EREKEM_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_IMMUNE_TO_NPC); + + events.ScheduleEvent(EVENT_EARTH_SHIELD, 20000); + events.ScheduleEvent(EVENT_BLOODLUST, 15000); + events.ScheduleEvent(EVENT_CHAIN_HEAL, 10000); + events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2000); } - void MoveInLineOfSight(Unit* /*who*/) override { } + void JustDied(Unit* /*killer*/) override + { + Talk(SAY_DEATH); + if (instance->GetData(DATA_WAVE_COUNT) == 6) + { + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 7); + } + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + { + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); + instance->SetData(DATA_WAVE_COUNT, 13); + } + } + + void KilledUnit(Unit* victim) override + { + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - //spam stormstrike in hc mode if spawns are dead - if (IsHeroic()) - { + if (phase == 0) if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) { if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) { if (!pGuard1->IsAlive() && !pGuard2->IsAlive()) + { + phase = 1; DoCastVictim(SPELL_STORMSTRIKE); + DoCast(SPELL_WINDFURY); + events.Reset(); + events.ScheduleEvent(EVENT_EARTH_SHOCK, urand(2000, 8000)); + events.ScheduleEvent(EVENT_WINDFURY, urand(1500, 2000)); + events.ScheduleEvent(EVENT_STORMSTRIKE, urand(1500, 2000)); + } } } - } - if (uiEarthShieldTimer <= diff) - { - DoCast(me, SPELL_EARTH_SHIELD); - uiEarthShieldTimer = 20000; - } else uiEarthShieldTimer -= diff; + events.Update(diff); - if (uiChainHealTimer <= diff) + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + if (breakBondsCd <= 0) { - ObjectGuid TargetGUID = GetChainHealTargetGUID(); - if (!TargetGUID.IsEmpty()) + if (Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1))) { - if (Creature* target = ObjectAccessor::GetCreature(*me, TargetGUID)) - DoCast(target, SPELL_CHAIN_HEAL); - - //If one of the adds is dead spawn heals faster - Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1)); - Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2)); - uiChainHealTimer = ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive()) ? 3000 : 8000) + rand32() % 3000; + if (Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2))) + { + if (pGuard1->IsAlive()) + { + if (pGuard1->HasAuraType(SPELL_AURA_MOD_STUN) || pGuard1->HasAuraType(SPELL_AURA_MOD_ROOT) + || pGuard1->HasAuraType(SPELL_AURA_MOD_CONFUSE) || pGuard1->HasAuraType(SPELL_AURA_MOD_PACIFY) + || pGuard1->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED)) + { + DoCast(SPELL_BREAK_BONDS); + breakBondsCd = 10000; + return; + } + } + if (pGuard2->IsAlive()) + { + if (pGuard2->HasAuraType(SPELL_AURA_MOD_STUN) || pGuard2->HasAuraType(SPELL_AURA_MOD_ROOT) + || pGuard2->HasAuraType(SPELL_AURA_MOD_CONFUSE) || pGuard2->HasAuraType(SPELL_AURA_MOD_PACIFY) + || pGuard2->HasAuraType(SPELL_AURA_MOD_DECREASE_SPEED)) + { + DoCast(SPELL_BREAK_BONDS); + breakBondsCd = 10000; + return; + } + } + } } - } else uiChainHealTimer -= diff; - - if (uiBloodlustTimer <= diff) - { - DoCast(me, SPELL_BLOODLUST); - uiBloodlustTimer = urand(35000, 45000); - } else uiBloodlustTimer -= diff; - - if (uiEarthShockTimer <= diff) - { - DoCastVictim(SPELL_EARTH_SHOCK); - uiEarthShockTimer = urand(8000, 13000); - } else uiEarthShockTimer -= diff; - - if (uiLightningBoltTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_LIGHTNING_BOLT); - uiLightningBoltTimer = urand(18000, 24000); - } else uiLightningBoltTimer -= diff; - - DoMeleeAttackIfReady(); - } - - void JustDied(Unit* /*killer*/) override - { - Talk(SAY_DEATH); - - if (instance->GetData(DATA_WAVE_COUNT) == 6) - { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 7); } - else if (instance->GetData(DATA_WAVE_COUNT) == 12) + else + breakBondsCd -= diff; + + switch (uint32 eventId = events.ExecuteEvent()) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); - instance->SetData(DATA_WAVE_COUNT, 13); + case EVENT_EARTH_SHIELD: + if (Unit* ally = DoSelectLowestHpFriendly(30.0f)) + DoCast(ally, SPELL_EARTH_SHIELD); + events.ScheduleEvent(EVENT_EARTH_SHIELD, 20000); + break; + case EVENT_BLOODLUST: + DoCast(SPELL_BLOODLUST); + events.ScheduleEvent(EVENT_BLOODLUST, urand(35000, 45000)); + break; + case EVENT_LIGHTNING_BOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_LIGHTNING_BOLT); + events.ScheduleEvent(EVENT_LIGHTNING_BOLT, 2500); + break; + case EVENT_CHAIN_HEAL: + if (Unit* ally = DoSelectLowestHpFriendly(40.0f)) + DoCast(ally, SPELL_CHAIN_HEAL); + { + Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1)); + Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2)); + events.ScheduleEvent(EVENT_CHAIN_HEAL, ((pGuard1 && !pGuard1->IsAlive()) || (pGuard2 && !pGuard2->IsAlive()) ? 3000 : 8000 + rand() % 3000)); + } + break; + case EVENT_EARTH_SHOCK: + DoCastVictim(SPELL_EARTH_SHOCK); + events.ScheduleEvent(EVENT_EARTH_SHOCK, urand(8000, 13000)); + break; + case EVENT_WINDFURY: + DoCast(SPELL_WINDFURY); + events.ScheduleEvent(EVENT_WINDFURY, urand(1500, 2000)); + break; + case EVENT_STORMSTRIKE: + DoCastVictim(SPELL_STORMSTRIKE); + events.ScheduleEvent(EVENT_STORMSTRIKE, urand(1500, 2000)); + break; + default: + break; } - } - - void KilledUnit(Unit* victim) override - { - if (victim->GetTypeId() != TYPEID_PLAYER) - return; - Talk(SAY_SLAY); + DoMeleeAttackIfReady(); } - ObjectGuid GetChainHealTargetGUID() - { - if (HealthBelowPct(85)) - return me->GetGUID(); - - Creature* pGuard1 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_1)); - if (pGuard1 && pGuard1->IsAlive() && !pGuard1->HealthAbovePct(75)) - return pGuard1->GetGUID(); - - Creature* pGuard2 = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_EREKEM_GUARD_2)); - if (pGuard2 && pGuard2->IsAlive() && !pGuard2->HealthAbovePct(75)) - return pGuard2->GetGUID(); - - return ObjectGuid::Empty; - } + private: + EventMap events; + InstanceScript* instance; + uint8 phase; + int32 breakBondsCd; }; - }; enum GuardSpells @@ -291,6 +347,9 @@ public: void Reset() override { Initialize(); + + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + me->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_NPC); } void AttackStart(Unit* who) override @@ -309,7 +368,6 @@ public: void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { if (!UpdateVictim()) @@ -336,7 +394,6 @@ public: } else uiGushingWoundTimer -= diff; } }; - }; void AddSC_boss_erekem() diff --git a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp index 48fe8049d19..acda21f0013 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_ichoron.cpp @@ -23,19 +23,20 @@ enum Spells { SPELL_DRAINED = 59820, SPELL_FRENZY = 54312, - SPELL_FRENZY_H = 59522, SPELL_PROTECTIVE_BUBBLE = 54306, SPELL_WATER_BLAST = 54237, - SPELL_WATER_BLAST_H = 59520, SPELL_WATER_BOLT_VOLLEY = 54241, - SPELL_WATER_BOLT_VOLLEY_H = 59521, SPELL_SPLASH = 59516, - SPELL_WATER_GLOBULE = 54268 + SPELL_BURST = 54379, + SPELL_WATER_GLOBULE = 54268, + SPELL_MERGE = 54269, + SPELL_WATER_GLOBULE_VISUAL = 54260 }; enum IchoronCreatures { NPC_ICHOR_GLOBULE = 29321, + NPC_ICHORON_SUMMON_TARGET = 29326 }; enum Yells @@ -51,75 +52,83 @@ enum Yells enum Actions { - ACTION_WATER_ELEMENT_HIT = 1, - ACTION_WATER_ELEMENT_KILLED = 2, + ACTION_WATER_ELEMENT_HIT = 1 }; -/// @todo get those positions from spawn of creature 29326 -#define MAX_SPAWN_LOC 5 -static Position SpawnLoc[MAX_SPAWN_LOC]= +enum IchoronEvents { - {1840.64f, 795.407f, 44.079f, 1.676f}, - {1886.24f, 757.733f, 47.750f, 5.201f}, - {1877.91f, 845.915f, 43.417f, 3.560f}, - {1918.97f, 850.645f, 47.225f, 4.136f}, - {1935.50f, 796.224f, 52.492f, 4.224f}, + EVENT_WATER_BLAST = 1, + EVENT_WATER_BOLT_VOLLEY +}; + +enum GlobuleEvents +{ + EVENT_GLOBULE_MOVE = 1 }; enum Misc { + DATA_GLOBULE_PATH = 0, DATA_DEHYDRATION = 1 }; + +#define MAX_GLOBULE_PATHS 10 + +Position const globulePaths[MAX_GLOBULE_PATHS] = +{ + // first target + { 1861.357f, 804.039f, 44.008f, 6.268f }, + { 1869.375f, 803.976f, 38.781f, 0.009f }, + // second target + { 1888.063f, 763.488f, 47.667f, 1.744f }, + { 1882.865f, 776.385f, 38.824f, 1.882f }, + // third target + { 1935.140f, 817.752f, 52.181f, 1.885f }, + { 1916.642f, 826.337f, 39.139f, 2.851f }, + // fourth target + { 1930.257f, 833.053f, 46.906f, 4.579f }, + { 1916.642f, 826.337f, 39.139f, 2.851f }, + // fifth target + { 1878.248f, 841.883f, 43.334f, 4.717f }, + { 1879.438f, 834.443f, 38.699f, 4.831f } +}; + class boss_ichoron : public CreatureScript { public: boss_ichoron() : CreatureScript("boss_ichoron") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_ichoronAI>(creature); - } - struct boss_ichoronAI : public ScriptedAI { boss_ichoronAI(Creature* creature) : ScriptedAI(creature), m_waterElements(creature) { Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Initialize() { bIsExploded = false; bIsFrenzy = false; + bIsDrained = false; dehydration = true; - uiBubbleCheckerTimer = 1000; - uiWaterBoltVolleyTimer = urand(10000, 15000); + drainedTimer = 50; + burstTimer = 15000; } - bool bIsExploded; - bool bIsFrenzy; - bool dehydration; - - uint32 uiBubbleCheckerTimer; - uint32 uiWaterBoltVolleyTimer; - - InstanceScript* instance; - - SummonList m_waterElements; - void Reset() override { Initialize(); + events.Reset(); me->SetVisible(true); DespawnWaterElements(); if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) override @@ -128,16 +137,20 @@ public: DoCast(me, SPELL_PROTECTIVE_BUBBLE); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_ICHORON_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_ICHORON_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + + events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); + events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); } void AttackStart(Unit* who) override @@ -162,18 +175,14 @@ public: switch (param) { case ACTION_WATER_ELEMENT_HIT: - me->ModifyHealth(int32(me->CountPctFromMaxHealth(1))); - + { if (bIsExploded) DoExplodeCompleted(); + me->SetHealth(me->GetHealth() + me->CountPctFromMaxHealth(3)); dehydration = false; - break; - case ACTION_WATER_ELEMENT_KILLED: - uint32 damage = me->CountPctFromMaxHealth(3); - me->ModifyHealth(-int32(damage)); - me->LowerPlayerDamageReq(damage); - break; + } + break; } } @@ -187,6 +196,7 @@ public: void DoExplodeCompleted() { bIsExploded = false; + bIsDrained = false; if (!HealthBelowPct(25)) { @@ -206,75 +216,24 @@ public: return 0; } - void MoveInLineOfSight(Unit* /*who*/) override { } - - - void UpdateAI(uint32 uiDiff) override + void MoveInLineOfSight(Unit* who) override { - if (!UpdateVictim()) + if (!who->ToCreature()) return; - if (!bIsFrenzy && HealthBelowPct(25) && !bIsExploded) - { - Talk(SAY_ENRAGE); - DoCast(me, SPELL_FRENZY, true); - bIsFrenzy = true; - } - - if (!bIsFrenzy) - { - if (uiBubbleCheckerTimer <= uiDiff) - { - if (!bIsExploded) - { - if (!me->HasAura(SPELL_PROTECTIVE_BUBBLE)) - { - Talk(SAY_SHATTER); - DoCast(me, SPELL_WATER_BLAST); - DoCast(me, SPELL_DRAINED); - bIsExploded = true; - me->AttackStop(); - me->SetVisible(false); - for (uint8 i = 0; i < 10; i++) - { - int tmp = urand(0, MAX_SPAWN_LOC-1); - me->SummonCreature(NPC_ICHOR_GLOBULE, SpawnLoc[tmp], TEMPSUMMON_CORPSE_DESPAWN); - } - } - } - else - { - bool bIsWaterElementsAlive = false; - if (!m_waterElements.empty()) - { - for (SummonList::const_iterator itr = m_waterElements.begin(); itr != m_waterElements.end(); ++itr) - if (Creature* temp = ObjectAccessor::GetCreature(*me, *itr)) - if (temp->IsAlive()) - { - bIsWaterElementsAlive = true; - break; - } - } + if (who->GetEntry() != NPC_ICHOR_GLOBULE) + return; - if (!bIsWaterElementsAlive) - DoExplodeCompleted(); - } - uiBubbleCheckerTimer = 1000; - } - else uiBubbleCheckerTimer -= uiDiff; - } + if (!me->IsWithinDist(who, 4.0f, false)) + return; - if (!bIsExploded) - { - if (uiWaterBoltVolleyTimer <= uiDiff) - { - DoCast(me, SPELL_WATER_BOLT_VOLLEY); - uiWaterBoltVolleyTimer = urand(10000, 15000); - } - else uiWaterBoltVolleyTimer -= uiDiff; + if (who->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE)) + return; - DoMeleeAttackIfReady(); - } + who->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + who->CastSpell(who, SPELL_MERGE); + DoAction(ACTION_WATER_ELEMENT_HIT); + who->ToCreature()->DespawnOrUnsummon(1000); } void JustDied(Unit* /*killer*/) override @@ -291,45 +250,187 @@ public: if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } void JustSummoned(Creature* summoned) override { - if (summoned) - { - summoned->SetSpeed(MOVE_RUN, 0.3f); - summoned->GetMotionMaster()->MoveFollow(me, 0, 0); - m_waterElements.Summon(summoned); - instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); - } + summoned->SetSpeed(MOVE_RUN, 0.3f); + m_waterElements.Summon(summoned); + + instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); } void SummonedCreatureDespawn(Creature* summoned) override { - if (summoned) + m_waterElements.Despawn(summoned); + + if (m_waterElements.empty() && bIsExploded) { - m_waterElements.Despawn(summoned); - instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); + me->RemoveAllAuras(); + DoExplodeCompleted(); } + + instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); } void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - Talk(SAY_SLAY); + if (!bIsFrenzy && HealthBelowPct(25) && !bIsExploded) + { + Talk(SAY_ENRAGE); + DoCast(me, SPELL_FRENZY, true); + bIsFrenzy = true; + } + + if (!bIsFrenzy) + { + if (!bIsExploded) + { + if (!me->HasAura(SPELL_PROTECTIVE_BUBBLE)) + { + bIsExploded = true; + Talk(SAY_SHATTER); + DoCast(SPELL_BURST); + me->RemoveAllAuras(); + burstTimer = 15000; + + std::list<Creature*> summonTargets; + GetCreatureListWithEntryInGrid(summonTargets, me, NPC_ICHORON_SUMMON_TARGET, 200.0f); + std::list<Creature*>::iterator itr = summonTargets.begin(); + + for (uint8 i = 0; i < MAX_GLOBULE_PATHS; i++) + { + std::advance(itr, urand(0, summonTargets.size() - 1)); // I take a random minion in the list + Position targetPos = (*itr)->GetRandomNearPosition(10.0f); + itr = summonTargets.begin(); + TempSummon* globule = me->SummonCreature(NPC_ICHOR_GLOBULE, targetPos, TEMPSUMMON_CORPSE_DESPAWN); + DoCast(globule, SPELL_WATER_GLOBULE_VISUAL); + + float minDistance = 1000.0f; + uint8 nextPath = 0; + // I move the globules to next position. the 10 positions are in couples, defined in globulePaths, so i have to increase by 2. + for (uint8 gpath = 0; gpath < MAX_GLOBULE_PATHS; gpath += 2) + { + if (globule->GetDistance(globulePaths[gpath]) < minDistance) + { + minDistance = globule->GetDistance(globulePaths[gpath]); + nextPath = gpath; + } + } + + globule->GetAI()->SetData(DATA_GLOBULE_PATH, nextPath); + } + return; + } + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + events.Update(diff); + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_WATER_BLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_WATER_BLAST); + events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); + break; + case EVENT_WATER_BOLT_VOLLEY: + DoCast(SPELL_WATER_BOLT_VOLLEY); + events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); + break; + } + + DoMeleeAttackIfReady(); + } + else if (!bIsDrained) + { + if (drainedTimer <= 0) + { + bIsDrained = true; + drainedTimer = 50; + uint32 damage = me->CountPctFromMaxHealth(30); + if (me->GetHealth() < damage) + me->SetHealth(me->CountPctFromMaxHealth(1)); + else + { + me->SetHealth(me->GetHealth() - damage); + me->LowerPlayerDamageReq(damage); + } + DoCast(SPELL_DRAINED); + me->SetVisible(false); + me->AttackStop(); + } + else + drainedTimer -= diff; + } + else if (bIsDrained) + { + if (burstTimer <= 0) + { + DoExplodeCompleted(); + } + else + burstTimer -= diff; + } + } + else + { + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + events.Update(diff); + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_WATER_BLAST: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_WATER_BLAST); + events.ScheduleEvent(EVENT_WATER_BLAST, urand(6000, 9000)); + break; + case EVENT_WATER_BOLT_VOLLEY: + DoCast(SPELL_WATER_BOLT_VOLLEY); + events.ScheduleEvent(EVENT_WATER_BOLT_VOLLEY, urand(10000, 15000)); + break; + } + + DoMeleeAttackIfReady(); + } } + + private: + InstanceScript* instance; + SummonList m_waterElements; + EventMap events; + bool bIsExploded; + bool bIsFrenzy; + bool bIsDrained; + bool dehydration; + int32 drainedTimer; + int32 burstTimer; }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_ichoronAI>(creature); + } }; class npc_ichor_globule : public CreatureScript @@ -337,11 +438,6 @@ class npc_ichor_globule : public CreatureScript public: npc_ichor_globule() : CreatureScript("npc_ichor_globule") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_ichor_globuleAI>(creature); - } - struct npc_ichor_globuleAI : public ScriptedAI { npc_ichor_globuleAI(Creature* creature) : ScriptedAI(creature) @@ -352,51 +448,74 @@ public: void Initialize() { - uiRangeCheck_Timer = 1000; + pathId = 0; } - InstanceScript* instance; - - uint32 uiRangeCheck_Timer; - void Reset() override { Initialize(); - DoCast(me, SPELL_WATER_GLOBULE); + events.Reset(); + DoCast(SPELL_WATER_GLOBULE); + me->SetReactState(REACT_PASSIVE); } - void AttackStart(Unit* /*who*/) override + void SetData(uint32 id, uint32 data) override { - return; + if (id == DATA_GLOBULE_PATH) + { + pathId = data; + me->GetMotionMaster()->MovePoint(0, globulePaths[pathId]); + } } - void UpdateAI(uint32 uiDiff) override + void MovementInform(uint32 type, uint32 id) override { - if (uiRangeCheck_Timer < uiDiff) + if (type != POINT_MOTION_TYPE) + return; + + switch (id) { - if (Creature* pIchoron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ICHORON))) - { - if (me->IsWithinDist(pIchoron, 2.0f, false)) - { - if (pIchoron->AI()) - pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_HIT); - me->DespawnOrUnsummon(); - } - } - uiRangeCheck_Timer = 1000; + case 0: + me->GetMotionMaster()->Clear(); + events.ScheduleEvent(EVENT_GLOBULE_MOVE, 500); + break; + case 1: + me->GetMotionMaster()->Clear(); + if (Creature* ichoron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ICHORON))) + me->GetMotionMaster()->MoveFollow(ichoron, 0.0f, 0.0f); + break; } - else uiRangeCheck_Timer -= uiDiff; } - void JustDied(Unit* /*killer*/) override + // on retail spell casted on a creature's death are not casted after death but keeping mob at 1 health, casting it and then letting the mob die. + // this feature should be still implemented + void DamageTaken(Unit* /*attacker*/, uint32 &damage) override + { + int32 actualHp = me->GetHealth(); + actualHp -= damage; + + if (actualHp <= 0) + DoCast(SPELL_SPLASH); + } + + void UpdateAI(uint32 diff) override { - DoCast(me, SPELL_SPLASH); - if (Creature* pIchoron = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_ICHORON))) - if (pIchoron->AI()) - pIchoron->AI()->DoAction(ACTION_WATER_ELEMENT_KILLED); + events.Update(diff); + + if (events.ExecuteEvent() == EVENT_GLOBULE_MOVE) + me->GetMotionMaster()->MovePoint(1, globulePaths[pathId + 1]); } + + private: + InstanceScript* instance; + EventMap events; + uint8 pathId; }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_ichor_globuleAI>(creature); + } }; class achievement_dehydration : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp index c3df7b71b83..8dc0e32fb31 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_lavanthor.cpp @@ -21,13 +21,18 @@ enum Spells { - SPELL_CAUTERIZING_FLAMES = 59466, //Only in heroic - SPELL_FIREBOLT = 54235, - H_SPELL_FIREBOLT = 59468, - SPELL_FLAME_BREATH = 54282, - H_SPELL_FLAME_BREATH = 59469, - SPELL_LAVA_BURN = 54249, - H_SPELL_LAVA_BURN = 59594 + SPELL_CAUTERIZING_FLAMES = 59466, // Only in heroic + SPELL_FIREBOLT = 54235, + SPELL_FLAME_BREATH = 54282, + SPELL_LAVA_BURN = 54249 +}; + +enum LavanthorEvents +{ + EVENT_CAUTERIZING_FLAMES = 1, + EVENT_FIREBOLT, + EVENT_FLAME_BREATH, + EVENT_LAVA_BURN }; class boss_lavanthor : public CreatureScript @@ -44,46 +49,37 @@ public: { boss_lavanthorAI(Creature* creature) : ScriptedAI(creature) { - Initialize(); instance = creature->GetInstanceScript(); } - void Initialize() - { - uiFireboltTimer = 1000; - uiFlameBreathTimer = 5000; - uiLavaBurnTimer = 10000; - uiCauterizingFlamesTimer = 3000; - } - - uint32 uiFireboltTimer; - uint32 uiFlameBreathTimer; - uint32 uiLavaBurnTimer; - uint32 uiCauterizingFlamesTimer; - - InstanceScript* instance; - void Reset() override { - Initialize(); if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); + + events.Reset(); } void EnterCombat(Unit* /*who*/) override { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_LAVANTHOR_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) - { - EnterEvadeMode(); - return; - } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + if (GameObject* door = instance->GetGameObject(DATA_LAVANTHOR_CELL)) + if (door->GetGoState() == GO_STATE_READY) + { + EnterEvadeMode(); + return; + } + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + + events.ScheduleEvent(EVENT_FIREBOLT, 1000); + events.ScheduleEvent(EVENT_FLAME_BREATH, 5000); + events.ScheduleEvent(EVENT_LAVA_BURN, 10000); + if (IsHeroic()) + events.ScheduleEvent(EVENT_CAUTERIZING_FLAMES, 3000); } void AttackStart(Unit* who) override @@ -100,40 +96,38 @@ public: } } - void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - if (uiFireboltTimer <= diff) - { - DoCastVictim(SPELL_FIREBOLT); - uiFireboltTimer = urand(5000, 13000); - } else uiFireboltTimer -= diff; + events.Update(diff); - if (uiFlameBreathTimer <= diff) - { - DoCastVictim(SPELL_FLAME_BREATH); - uiFlameBreathTimer = urand(10000, 15000); - } else uiFlameBreathTimer -= diff; - - if (uiLavaBurnTimer <= diff) - { - DoCastVictim(SPELL_LAVA_BURN); - uiLavaBurnTimer = urand(15000, 23000); - } + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (IsHeroic()) + switch (uint32 eventId = events.ExecuteEvent()) { - if (uiCauterizingFlamesTimer <= diff) - { - DoCastVictim(SPELL_CAUTERIZING_FLAMES); - uiCauterizingFlamesTimer = urand(10000, 16000); - } else uiCauterizingFlamesTimer -= diff; + case EVENT_FIREBOLT: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_FIREBOLT); + events.ScheduleEvent(EVENT_FIREBOLT, urand(5000, 13000)); + break; + case EVENT_FLAME_BREATH: + DoCast(SPELL_FLAME_BREATH); + events.ScheduleEvent(EVENT_FLAME_BREATH, urand(10000, 15000)); + break; + case EVENT_LAVA_BURN: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_LAVA_BURN); + events.ScheduleEvent(EVENT_LAVA_BURN, urand(15000, 23000)); + break; + case EVENT_CAUTERIZING_FLAMES: + DoCast(SPELL_CAUTERIZING_FLAMES); + events.ScheduleEvent(EVENT_CAUTERIZING_FLAMES, urand(10000, 16000)); + break; + default: + break; } DoMeleeAttackIfReady(); @@ -143,17 +137,20 @@ public: { if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } - }; + private: + EventMap events; + InstanceScript* instance; + }; }; void AddSC_boss_lavanthor() diff --git a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp index 9a6422dec32..0b655a60e27 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_moragg.cpp @@ -17,13 +17,27 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" +#include "SpellScript.h" +#include "SpellAuraEffects.h" #include "violet_hold.h" -//Spells enum Spells { SPELL_CORROSIVE_SALIVA = 54527, - SPELL_OPTIC_LINK = 54396 + SPELL_OPTIC_LINK = 54396, + SPELL_RAY_OF_PAIN = 54438, // NYI missing spelldifficulty + SPELL_RAY_OF_SUFFERING = 54442, // NYI missing spelldifficulty + + // Visual + SPELL_OPTIC_LINK_LEVEL_1 = 54393, + SPELL_OPTIC_LINK_LEVEL_2 = 54394, + SPELL_OPTIC_LINK_LEVEL_3 = 54395 +}; + +enum MoraggEvents +{ + EVENT_CORROSIVE_SALIVA = 1, + EVENT_OPTIC_LINK }; class boss_moragg : public CreatureScript @@ -31,52 +45,43 @@ class boss_moragg : public CreatureScript public: boss_moragg() : CreatureScript("boss_moragg") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_moraggAI>(creature); - } - struct boss_moraggAI : public ScriptedAI { boss_moraggAI(Creature* creature) : ScriptedAI(creature) { - Initialize(); instance = creature->GetInstanceScript(); } - void Initialize() - { - uiOpticLinkTimer = 10000; - uiCorrosiveSalivaTimer = 5000; - } - - uint32 uiOpticLinkTimer; - uint32 uiCorrosiveSalivaTimer; - - InstanceScript* instance; - void Reset() override { - Initialize(); + events.Reset(); if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); } void EnterCombat(Unit* /*who*/) override { - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_MORAGG_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_MORAGG_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); + + me->SetInCombatWithZone(); + + DoCast(SPELL_RAY_OF_PAIN); + DoCast(SPELL_RAY_OF_SUFFERING); + events.ScheduleEvent(EVENT_OPTIC_LINK, 15000); + events.ScheduleEvent(EVENT_CORROSIVE_SALIVA, 5000); } void AttackStart(Unit* who) override @@ -93,48 +98,202 @@ public: } } - void MoveInLineOfSight(Unit* /*who*/) override { } - - void UpdateAI(uint32 diff) override { - //Return since we have no target if (!UpdateVictim()) return; - if (uiOpticLinkTimer <= diff) - { - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) - DoCast(target, SPELL_OPTIC_LINK); - uiOpticLinkTimer = 15000; - } else uiOpticLinkTimer -= diff; + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (uiCorrosiveSalivaTimer <= diff) + switch (uint32 eventId = events.ExecuteEvent()) { - DoCastVictim(SPELL_CORROSIVE_SALIVA); - uiCorrosiveSalivaTimer = 10000; - } else uiCorrosiveSalivaTimer -= diff; + case EVENT_OPTIC_LINK: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_OPTIC_LINK); + events.ScheduleEvent(EVENT_OPTIC_LINK, 25000); + break; + case EVENT_CORROSIVE_SALIVA: + DoCastVictim(SPELL_CORROSIVE_SALIVA); + events.ScheduleEvent(EVENT_CORROSIVE_SALIVA, 10000); + break; + default: + break; + } DoMeleeAttackIfReady(); } + void JustDied(Unit* /*killer*/) override { if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } + + private: + EventMap events; + InstanceScript* instance; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_moraggAI>(creature); + } +}; + +class spell_moragg_ray_of_suffering : public SpellScriptLoader +{ +public: + spell_moragg_ray_of_suffering() : SpellScriptLoader("spell_moragg_ray_of_suffering") { } + + class spell_moragg_ray_of_suffering_AuraScript : public AuraScript + { + PrepareAuraScript(spell_moragg_ray_of_suffering_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + std::list<HostileReference*> players = GetTarget()->getThreatManager().getThreatList(); + if (!players.empty()) + { + std::list<HostileReference*>::iterator itr = players.begin(); + std::advance(itr, urand(0, players.size() - 1)); + + uint32 triggerSpell = GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell; + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_MAX_TARGETS, 1, (*itr)->getTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_ray_of_suffering_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_moragg_ray_of_suffering_AuraScript(); + } +}; + +class spell_moragg_ray_of_pain : public SpellScriptLoader +{ +public: + spell_moragg_ray_of_pain() : SpellScriptLoader("spell_moragg_ray_of_pain") { } + + class spell_moragg_ray_of_pain_AuraScript : public AuraScript + { + PrepareAuraScript(spell_moragg_ray_of_pain_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) + { + PreventDefaultAction(); + std::list<HostileReference*> players = GetTarget()->getThreatManager().getThreatList(); + if (!players.empty()) + { + std::list<HostileReference*>::iterator itr = players.begin(); + std::advance(itr, urand(0, players.size() - 1)); + + uint32 triggerSpell = GetSpellInfo()->GetEffect(aurEff->GetEffIndex())->TriggerSpell; + GetTarget()->CastCustomSpell(triggerSpell, SPELLVALUE_MAX_TARGETS, 1, (*itr)->getTarget(), TRIGGERED_FULL_MASK, NULL, aurEff); + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_ray_of_pain_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_TRIGGER_SPELL); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_moragg_ray_of_pain_AuraScript(); + } +}; + +class spell_moragg_optic_link : public SpellScriptLoader +{ +public: + spell_moragg_optic_link() : SpellScriptLoader("spell_moragg_optic_link") { } + + class spell_moragg_optic_link_AuraScript : public AuraScript + { + PrepareAuraScript(spell_moragg_optic_link_AuraScript); + + void OnPeriodic(AuraEffect const* aurEff) + { + switch (aurEff->GetTickNumber()) // Different visual based on tick + { + case 1: + case 2: + case 3: + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + break; + case 4: + case 5: + case 6: + case 7: + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_2, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + break; + case 8: + case 9: + case 10: + case 11: + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_1, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_2, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + GetTarget()->CastCustomSpell(SPELL_OPTIC_LINK_LEVEL_3, SPELLVALUE_MAX_TARGETS, 1, (Unit*)NULL, TRIGGERED_FULL_MASK, NULL, aurEff); + break; + default: + break; + } + } + + void OnUpdate(AuraEffect* aurEff) + { + switch (aurEff->GetTickNumber()) + { + case 1: + aurEff->SetAmount(aurEff->GetAmount() + 250); // base amount is 500 + break; + case 4: + aurEff->SetAmount(aurEff->GetAmount() * 2); // goes to 1500 + break; + case 8: + aurEff->SetAmount(aurEff->GetAmount() * 2); // goes to 3000 + break; + default: + break; + } + } + + void Register() override + { + OnEffectPeriodic += AuraEffectPeriodicFn(spell_moragg_optic_link_AuraScript::OnPeriodic, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + OnEffectUpdatePeriodic += AuraEffectUpdatePeriodicFn(spell_moragg_optic_link_AuraScript::OnUpdate, EFFECT_0, SPELL_AURA_PERIODIC_DAMAGE); + } }; + AuraScript* GetAuraScript() const override + { + return new spell_moragg_optic_link_AuraScript(); + } }; void AddSC_boss_moragg() { new boss_moragg(); + new spell_moragg_ray_of_suffering(); + new spell_moragg_ray_of_pain(); + new spell_moragg_optic_link(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp index 833b06cfbff..590fb9f5e6f 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_xevozz.cpp @@ -17,24 +17,24 @@ #include "ScriptMgr.h" #include "ScriptedCreature.h" -#include "violet_hold.h" +#include "SpellInfo.h" +#include "SpellScript.h" #include "Player.h" +#include "violet_hold.h" enum Spells { SPELL_ARCANE_BARRAGE_VOLLEY = 54202, - SPELL_ARCANE_BARRAGE_VOLLEY_H = 59483, SPELL_ARCANE_BUFFET = 54226, - SPELL_ARCANE_BUFFET_H = 59485, SPELL_SUMMON_ETHEREAL_SPHERE_1 = 54102, - SPELL_SUMMON_ETHEREAL_SPHERE_2 = 54137, + SPELL_SUMMON_ETHEREAL_SPHERE_2 = 61337, SPELL_SUMMON_ETHEREAL_SPHERE_3 = 54138 }; enum NPCs { NPC_ETHEREAL_SPHERE = 29271, - //NPC_ETHEREAL_SPHERE2 = 32582, // heroic only? + NPC_ETHEREAL_SPHERE2 = 32582 }; enum CreatureSpells @@ -42,7 +42,8 @@ enum CreatureSpells SPELL_ARCANE_POWER = 54160, H_SPELL_ARCANE_POWER = 59474, SPELL_SUMMON_PLAYERS = 54164, - SPELL_POWER_BALL_VISUAL = 54141 + SPELL_POWER_BALL_VISUAL = 54141, + SPELL_POWER_BALL_DAMAGE_TRIGGER = 54207 }; enum Yells @@ -56,52 +57,50 @@ enum Yells SAY_SUMMON_ENERGY = 6 }; +enum XevozzEvents +{ + EVENT_ARCANE_BARRAGE = 1, + EVENT_ARCANE_BUFFET, + EVENT_SUMMON_SPHERE, + EVENT_SUMMON_SPHERE_2, + EVENT_RANGE_CHECK, + EVENT_SUMMON_PLAYERS, + EVENT_DESPAWN_SPHERE +}; + +enum SphereActions +{ + ACTION_SUMMON = 1, +}; + class boss_xevozz : public CreatureScript { public: boss_xevozz() : CreatureScript("boss_xevozz") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_xevozzAI>(creature); - } - struct boss_xevozzAI : public ScriptedAI { boss_xevozzAI(Creature* creature) : ScriptedAI(creature) { - Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } - void Initialize() - { - uiSummonEtherealSphere_Timer = urand(10000, 12000); - uiArcaneBarrageVolley_Timer = urand(20000, 22000); - uiArcaneBuffet_Timer = uiSummonEtherealSphere_Timer + urand(5000, 6000); - } - - InstanceScript* instance; - - uint32 uiSummonEtherealSphere_Timer; - uint32 uiArcaneBarrageVolley_Timer; - uint32 uiArcaneBuffet_Timer; - void Reset() override { if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_1ST_BOSS_EVENT, NOT_STARTED); else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); - Initialize(); DespawnSphere(); + events.Reset(); } void DespawnSphere() { std::list<Creature*> assistList; GetCreatureListWithEntryInGrid(assistList, me, NPC_ETHEREAL_SPHERE, 150.0f); + GetCreatureListWithEntryInGrid(assistList, me, NPC_ETHEREAL_SPHERE2, 150.0f); if (assistList.empty()) return; @@ -116,11 +115,7 @@ public: void JustSummoned(Creature* summoned) override { summoned->SetSpeed(MOVE_RUN, 0.5f); - if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) - { - summoned->AddThreat(target, 0.00f); - summoned->AI()->AttackStart(target); - } + summoned->GetMotionMaster()->MoveFollow(me, 0.0f, 0.0f); } void AttackStart(Unit* who) override @@ -139,58 +134,23 @@ public: void EnterCombat(Unit* /*who*/) override { - Talk(SAY_AGGRO); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_XEVOZZ_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_XEVOZZ_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } - if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); - else if (instance->GetData(DATA_WAVE_COUNT) == 12) - instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } - - void MoveInLineOfSight(Unit* /*who*/) override { } + Talk(SAY_AGGRO); - void UpdateAI(uint32 uiDiff) override - { - //Return since we have no target - if (!UpdateVictim()) - return; - - if (uiArcaneBarrageVolley_Timer < uiDiff) - { - DoCast(me, SPELL_ARCANE_BARRAGE_VOLLEY); - uiArcaneBarrageVolley_Timer = urand(20000, 22000); - } - else uiArcaneBarrageVolley_Timer -= uiDiff; - - if (uiArcaneBuffet_Timer) - { - if (uiArcaneBuffet_Timer < uiDiff) - { - DoCastVictim(SPELL_ARCANE_BUFFET); - uiArcaneBuffet_Timer = 0; - } - else uiArcaneBuffet_Timer -= uiDiff; - } - - if (uiSummonEtherealSphere_Timer < uiDiff) - { - Talk(SAY_SPAWN); - DoCast(me, SPELL_SUMMON_ETHEREAL_SPHERE_1); - if (IsHeroic()) // extra one for heroic - me->SummonCreature(NPC_ETHEREAL_SPHERE, me->GetPositionX() - 5 + rand32() % 10, me->GetPositionY() - 5 + rand32() % 10, me->GetPositionZ(), 0, TEMPSUMMON_TIMED_DESPAWN, 40000); - - uiSummonEtherealSphere_Timer = urand(45000, 47000); - uiArcaneBuffet_Timer = urand(5000, 6000); - } - else uiSummonEtherealSphere_Timer -= uiDiff; + if (instance->GetData(DATA_WAVE_COUNT) == 6) + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + else if (instance->GetData(DATA_WAVE_COUNT) == 12) + instance->SetBossState(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - DoMeleeAttackIfReady(); + events.ScheduleEvent(EVENT_SUMMON_SPHERE, 5000); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(8000, 10000)); + events.ScheduleEvent(EVENT_ARCANE_BUFFET, urand(10000, 11000)); } void JustDied(Unit* /*killer*/) override @@ -201,24 +161,86 @@ public: if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); + instance->SetBossState(DATA_2ND_BOSS_EVENT, NOT_STARTED); instance->SetData(DATA_WAVE_COUNT, 13); } } + void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void SpellHit(Unit* who, const SpellInfo* spell) override + { + if (!who->ToCreature()) + return; + + if ((spell->Id == SPELL_ARCANE_POWER) || (spell->Id == H_SPELL_ARCANE_POWER)) + Talk(SAY_SUMMON_ENERGY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) + return; + + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) return; - Talk(SAY_SLAY); + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_ARCANE_BARRAGE: + DoCast(SPELL_ARCANE_BARRAGE_VOLLEY); + events.ScheduleEvent(EVENT_ARCANE_BARRAGE, urand(8000, 10000)); + break; + case EVENT_ARCANE_BUFFET: + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(target, SPELL_ARCANE_BUFFET); + events.ScheduleEvent(EVENT_ARCANE_BUFFET, urand(15000, 20000)); + break; + case EVENT_SUMMON_SPHERE: + Talk(SAY_REPEAT_SUMMON); + DoCast(SPELL_SUMMON_ETHEREAL_SPHERE_1); + if (IsHeroic()) + events.ScheduleEvent(EVENT_SUMMON_SPHERE_2, 2500); + events.ScheduleEvent(EVENT_SUMMON_PLAYERS, urand(33000, 35000)); + events.ScheduleEvent(EVENT_SUMMON_SPHERE, urand(45000, 47000)); + break; + case EVENT_SUMMON_SPHERE_2: + Talk(SAY_REPEAT_SUMMON); + DoCast(SPELL_SUMMON_ETHEREAL_SPHERE_2); + break; + case EVENT_SUMMON_PLAYERS: + if (Creature* sphere = me->FindNearestCreature(NPC_ETHEREAL_SPHERE, 150.0f)) + sphere->GetAI()->DoAction(ACTION_SUMMON); + else if (Creature* sphere = me->FindNearestCreature(NPC_ETHEREAL_SPHERE2, 150.0f)) + sphere->GetAI()->DoAction(ACTION_SUMMON); + break; + default: + break; + } + + DoMeleeAttackIfReady(); } + + private: + InstanceScript* instance; + EventMap events; }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_xevozzAI>(creature); + } }; class npc_ethereal_sphere : public CreatureScript @@ -226,83 +248,149 @@ class npc_ethereal_sphere : public CreatureScript public: npc_ethereal_sphere() : CreatureScript("npc_ethereal_sphere") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_ethereal_sphereAI>(creature); - } - struct npc_ethereal_sphereAI : public ScriptedAI { npc_ethereal_sphereAI(Creature* creature) : ScriptedAI(creature) { Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Initialize() { - uiSummonPlayers_Timer = urand(33000, 35000); - uiRangeCheck_Timer = 1000; + arcanePower = false; } - InstanceScript* instance; - - uint32 uiSummonPlayers_Timer; - uint32 uiRangeCheck_Timer; - void Reset() override { Initialize(); + events.Reset(); + DoCast(SPELL_POWER_BALL_VISUAL); + DoCast(SPELL_POWER_BALL_DAMAGE_TRIGGER); + me->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE); + me->setFaction(16); + events.ScheduleEvent(EVENT_DESPAWN_SPHERE, 40000); + events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); } - void UpdateAI(uint32 uiDiff) override + void DoAction(int32 action) override { - //Return since we have no target - if (!UpdateVictim()) - return; + if (action == ACTION_SUMMON) + DoCast(SPELL_SUMMON_PLAYERS); + } + + void UpdateAI(uint32 diff) override + { + events.Update(diff); - if (!me->HasAura(SPELL_POWER_BALL_VISUAL)) - DoCast(me, SPELL_POWER_BALL_VISUAL); + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; - if (uiRangeCheck_Timer < uiDiff) + switch (uint32 eventId = events.ExecuteEvent()) { - if (Creature* pXevozz = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_XEVOZZ))) - { - float fDistance = me->GetDistance2d(pXevozz); - if (fDistance <= 3) - DoCast(pXevozz, SPELL_ARCANE_POWER); - else - DoCast(me, 35845); //Is it blizzlike? - } - uiRangeCheck_Timer = 1000; + case EVENT_RANGE_CHECK: + if (Creature* xevozz = ObjectAccessor::GetCreature(*me, instance->GetGuidData(DATA_XEVOZZ))) + { + if (me->IsWithinDist(xevozz, 3.0f) && !arcanePower) + { + DoCast(SPELL_ARCANE_POWER); + arcanePower = true; + events.ScheduleEvent(EVENT_DESPAWN_SPHERE, 8000); + } + } + events.ScheduleEvent(EVENT_RANGE_CHECK, 1000); + break; + case EVENT_DESPAWN_SPHERE: + me->DespawnOrUnsummon(); + break; } - else uiRangeCheck_Timer -= uiDiff; + } + + private: + InstanceScript* instance; + EventMap events; + bool arcanePower; + }; + + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_ethereal_sphereAI>(creature); + } +}; - if (uiSummonPlayers_Timer < uiDiff) +class spell_xevozz_summon_players : public SpellScriptLoader +{ +public: + spell_xevozz_summon_players() : SpellScriptLoader("spell_xevozz_summon_players") { } + + class spell_xevozz_summon_players_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xevozz_summon_players_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit(); + + if (target) { - DoCast(me, SPELL_SUMMON_PLAYERS); // not working right + Position pos = GetOriginalCaster()->GetPosition(); - Map* map = me->GetMap(); - if (map && map->IsDungeon()) - { - Map::PlayerList const &PlayerList = map->GetPlayers(); + target->NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation()); + } + } - if (!PlayerList.isEmpty()) - for (Map::PlayerList::const_iterator i = PlayerList.begin(); i != PlayerList.end(); ++i) - if (i->GetSource()->IsAlive()) - DoTeleportPlayer(i->GetSource(), me->GetPositionX(), me->GetPositionY(), me->GetPositionZ(), i->GetSource()->GetOrientation()); - } + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_xevozz_summon_players_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_DUMMY); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_xevozz_summon_players_SpellScript(); + } +}; + +class spell_xevozz_summon_ethereal_sphere : public SpellScriptLoader +{ +public: + spell_xevozz_summon_ethereal_sphere() : SpellScriptLoader("spell_xevozz_summon_ethereal_sphere") { } + + class spell_xevozz_summon_ethereal_sphere_SpellScript : public SpellScript + { + PrepareSpellScript(spell_xevozz_summon_ethereal_sphere_SpellScript); + + void HandleScript(SpellDestination& target) + { + Unit* caster = GetOriginalCaster(); + Position pos; + float distance = 0.0f; - uiSummonPlayers_Timer = urand(33000, 35000); + while (distance < 20.0f) + { + pos = caster->GetRandomNearPosition(60.0f); + distance = caster->GetDistance(pos); } - else uiSummonPlayers_Timer -= uiDiff; + + target.Relocate(pos); + } + + void Register() override + { + OnDestinationTargetSelect += SpellDestinationTargetSelectFn(spell_xevozz_summon_ethereal_sphere_SpellScript::HandleScript, EFFECT_0, TARGET_DEST_DB); } }; + SpellScript* GetSpellScript() const override + { + return new spell_xevozz_summon_ethereal_sphere_SpellScript(); + } }; void AddSC_boss_xevozz() { new boss_xevozz(); new npc_ethereal_sphere(); + new spell_xevozz_summon_players(); + new spell_xevozz_summon_ethereal_sphere(); } diff --git a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp index 1043c1db29a..02e479a22f4 100644 --- a/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp +++ b/src/server/scripts/Northrend/VioletHold/boss_zuramat.cpp @@ -22,15 +22,9 @@ enum Spells { SPELL_SHROUD_OF_DARKNESS = 54524, - H_SPELL_SHROUD_OF_DARKNESS = 59745, SPELL_SUMMON_VOID_SENTRY = 54369, SPELL_VOID_SHIFT = 54361, - H_SPELL_VOID_SHIFT = 59743, -}; - -enum Creatures -{ - NPC_VOID_SENTRY = 29364 + SPELL_VOID_SHIFTED = 54343, }; enum Yells @@ -48,19 +42,21 @@ enum Misc DATA_VOID_DANCE = 2153 }; +enum ZuramatEvents +{ + EVENT_VOID_SHIFT = 1, + EVENT_SUMMON_VOID, + EVENT_SHROUD_OF_DARKNESS +}; + class boss_zuramat : public CreatureScript { public: boss_zuramat() : CreatureScript("boss_zuramat") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<boss_zuramatAI>(creature); - } - struct boss_zuramatAI : public ScriptedAI { - boss_zuramatAI(Creature* creature) : ScriptedAI(creature) + boss_zuramatAI(Creature* creature) : ScriptedAI(creature), sentries(me) { Initialize(); instance = creature->GetInstanceScript(); @@ -68,18 +64,18 @@ public: void Initialize() { - SpellShroudOfDarknessTimer = 22000; - SpellVoidShiftTimer = 15000; - SpellSummonVoidTimer = 12000; voidDance = true; } - InstanceScript* instance; - - uint32 SpellVoidShiftTimer; - uint32 SpellSummonVoidTimer; - uint32 SpellShroudOfDarknessTimer; - bool voidDance; + void DespawnSentries() + { + sentries.DespawnAll(); + std::list<Creature*> sentrylist; + GetCreatureListWithEntryInGrid(sentrylist, me, NPC_VOID_SENTRY_BALL, 200.0f); + if (!sentrylist.empty()) + for (std::list<Creature*>::const_iterator itr = sentrylist.begin(); itr != sentrylist.end(); ++itr) + (*itr)->DespawnOrUnsummon(); + } void Reset() override { @@ -89,6 +85,8 @@ public: instance->SetData(DATA_2ND_BOSS_EVENT, NOT_STARTED); Initialize(); + events.Reset(); + DespawnSentries(); } void AttackStart(Unit* who) override @@ -107,48 +105,29 @@ public: void EnterCombat(Unit* /*who*/) override { - Talk(SAY_AGGRO); - if (GameObject* pDoor = instance->instance->GetGameObject(instance->GetGuidData(DATA_ZURAMAT_CELL))) - if (pDoor->GetGoState() == GO_STATE_READY) + if (GameObject* door = instance->GetGameObject(DATA_ZURAMAT_CELL)) + if (door->GetGoState() == GO_STATE_READY) { EnterEvadeMode(); return; } + + Talk(SAY_AGGRO); + if (instance->GetData(DATA_WAVE_COUNT) == 6) - instance->SetData(DATA_1ST_BOSS_EVENT, IN_PROGRESS); + instance->SetBossState(DATA_1ST_BOSS_EVENT, IN_PROGRESS); else if (instance->GetData(DATA_WAVE_COUNT) == 12) instance->SetData(DATA_2ND_BOSS_EVENT, IN_PROGRESS); - } - - void MoveInLineOfSight(Unit* /*who*/) override { } + me->SetInCombatWithZone(); + events.ScheduleEvent(EVENT_SHROUD_OF_DARKNESS, urand(18000, 20000)); + events.ScheduleEvent(EVENT_VOID_SHIFT, 9000); + events.ScheduleEvent(EVENT_SUMMON_VOID, 4000); + } - void UpdateAI(uint32 diff) override + void JustSummoned(Creature* summon) override { - //Return since we have no target - if (!UpdateVictim()) - return; - - if (SpellSummonVoidTimer <= diff) - { - DoCastVictim(SPELL_SUMMON_VOID_SENTRY, false); - SpellSummonVoidTimer = 20000; - } else SpellSummonVoidTimer -=diff; - - if (SpellVoidShiftTimer <= diff) - { - if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) - DoCast(unit, SPELL_VOID_SHIFT); - SpellVoidShiftTimer = 20000; - } else SpellVoidShiftTimer -=diff; - - if (SpellShroudOfDarknessTimer <= diff) - { - DoCastVictim(SPELL_SHROUD_OF_DARKNESS); - SpellShroudOfDarknessTimer = 20000; - } else SpellShroudOfDarknessTimer -=diff; - - DoMeleeAttackIfReady(); + sentries.Summon(summon); } void SummonedCreatureDies(Creature* summoned, Unit* /*who*/) override @@ -167,29 +146,73 @@ public: void JustDied(Unit* /*killer*/) override { + instance->SetData(DATA_ZURAMAT, 1); + Talk(SAY_DEATH); + DespawnSentries(); + if (instance->GetData(DATA_WAVE_COUNT) == 6) { - instance->SetData(DATA_1ST_BOSS_EVENT, DONE); + instance->SetBossState(DATA_1ST_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 7); } else if (instance->GetData(DATA_WAVE_COUNT) == 12) { - instance->SetData(DATA_2ND_BOSS_EVENT, DONE); + instance->SetBossState(DATA_2ND_BOSS_EVENT, DONE); instance->SetData(DATA_WAVE_COUNT, 13); } } void KilledUnit(Unit* victim) override { - if (victim->GetTypeId() != TYPEID_PLAYER) + if (victim->GetTypeId() == TYPEID_PLAYER) + Talk(SAY_SLAY); + } + + void UpdateAI(uint32 diff) override + { + if (!UpdateVictim()) return; - Talk(SAY_SLAY); + events.Update(diff); + + if (me->HasUnitState(UNIT_STATE_CASTING)) + return; + + switch (uint32 eventId = events.ExecuteEvent()) + { + case EVENT_SUMMON_VOID: + DoCast(SPELL_SUMMON_VOID_SENTRY); + events.ScheduleEvent(EVENT_SUMMON_VOID, urand(7000, 10000)); + break; + case EVENT_VOID_SHIFT: + if (Unit* unit = SelectTarget(SELECT_TARGET_RANDOM, 0)) + DoCast(unit, SPELL_VOID_SHIFT); + events.ScheduleEvent(EVENT_VOID_SHIFT, 15000); + break; + case EVENT_SHROUD_OF_DARKNESS: + DoCast(SPELL_SHROUD_OF_DARKNESS); + events.ScheduleEvent(EVENT_SHROUD_OF_DARKNESS, urand(18000, 20000)); + break; + default: + break; + } + + DoMeleeAttackIfReady(); } + + private: + InstanceScript* instance; + EventMap events; + SummonList sentries; + bool voidDance; }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<boss_zuramatAI>(creature); + } }; class achievement_void_dance : public AchievementCriteriaScript diff --git a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp index ea50969ecb8..e9c526df42e 100644 --- a/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/instance_violet_hold.cpp @@ -22,8 +22,6 @@ #include "Player.h" #include "TemporarySummon.h" -#define MAX_ENCOUNTER 3 - /* Violet Hold encounters: 0 - First boss 1 - Second boss @@ -38,21 +36,6 @@ 6 - Zuramat 7 - Cyanigosa */ -enum GameObjects -{ - GO_MAIN_DOOR = 191723, - GO_XEVOZZ_DOOR = 191556, - GO_LAVANTHOR_DOOR = 191566, - GO_ICHORON_DOOR = 191722, - GO_ZURAMAT_DOOR = 191565, - GO_EREKEM_DOOR = 191564, - GO_EREKEM_GUARD_1_DOOR = 191563, - GO_EREKEM_GUARD_2_DOOR = 191562, - GO_MORAGG_DOOR = 191606, - GO_INTRO_ACTIVATION_CRYSTAL = 193615, - GO_ACTIVATION_CRYSTAL = 193611 -}; - enum AzureSaboteurSpells { SABOTEUR_SHIELD_DISRUPTION = 58291, @@ -64,7 +47,7 @@ enum CrystalSpells SPELL_ARCANE_LIGHTNING = 57930 }; -const Position PortalLocation[] = +Position const PortalLocation[] = { {1877.51f, 850.104f, 44.6599f, 4.7822f }, // WP 1 {1918.37f, 853.437f, 47.1624f, 4.12294f}, // WP 2 @@ -74,21 +57,21 @@ const Position PortalLocation[] = {1908.31f, 809.657f, 38.7037f, 3.08701f} // WP 6 }; -const Position ArcaneSphere = {1887.060059f, 806.151001f, 61.321602f, 0.0f}; -const Position BossStartMove1 = {1894.684448f, 739.390503f, 47.668003f, 0.0f}; -const Position BossStartMove2 = {1875.173950f, 860.832703f, 43.333565f, 0.0f}; -const Position BossStartMove21 = {1858.854614f, 855.071411f, 43.333565f, 0.0f}; -const Position BossStartMove22 = {1891.926636f, 863.388977f, 43.333565f, 0.0f}; -const Position BossStartMove3 = {1916.138062f, 778.152222f, 35.772308f, 0.0f}; -const Position BossStartMove4 = {1853.618286f, 758.557617f, 38.657505f, 0.0f}; -const Position BossStartMove5 = {1906.683960f, 842.348022f, 38.637459f, 0.0f}; -const Position BossStartMove6 = {1928.207031f, 852.864441f, 47.200813f, 0.0f}; - -const Position CyanigosasSpawnLocation = {1930.281250f, 804.407715f, 52.410946f, 3.139621f}; -const Position MiddleRoomLocation = {1892.291260f, 805.696838f, 38.438862f, 3.139621f}; -const Position MiddleRoomPortalSaboLocation = {1896.622925f, 804.854126f, 38.504772f, 3.139621f}; - -//Cyanigosa's prefight event data +Position const ArcaneSphere = {1887.060059f, 806.151001f, 61.321602f, 0.0f}; +Position const BossStartMove1 = {1894.684448f, 739.390503f, 47.668003f, 0.0f}; +Position const BossStartMove2 = {1875.173950f, 860.832703f, 43.333565f, 0.0f}; +Position const BossStartMove21 = {1858.854614f, 855.071411f, 43.333565f, 0.0f}; +Position const BossStartMove22 = {1891.926636f, 863.388977f, 43.333565f, 0.0f}; +Position const BossStartMove3 = {1916.138062f, 778.152222f, 35.772308f, 0.0f}; +Position const BossStartMove4 = {1853.618286f, 758.557617f, 38.657505f, 0.0f}; +Position const BossStartMove5 = {1906.683960f, 842.348022f, 38.637459f, 0.0f}; +Position const BossStartMove6 = {1928.207031f, 852.864441f, 47.200813f, 0.0f}; + +Position const CyanigosasSpawnLocation = {1930.281250f, 804.407715f, 52.410946f, 3.139621f}; +Position const MiddleRoomLocation = {1892.291260f, 805.696838f, 38.438862f, 3.139621f}; +Position const MiddleRoomPortalSaboLocation = {1896.622925f, 804.854126f, 38.504772f, 3.139621f}; + +// Cyanigosa's prefight event data enum Yells { CYANIGOSA_SAY_SPAWN = 0 @@ -100,21 +83,45 @@ enum Spells CYANIGOSA_BLUE_AURA = 47759, }; +ObjectData const creatureData[] = +{ + { NPC_XEVOZZ, DATA_XEVOZZ }, + { NPC_LAVANTHOR, DATA_LAVANTHOR }, + { NPC_ICHORON, DATA_ICHORON }, + { NPC_ZURAMAT, DATA_ZURAMAT }, + { NPC_EREKEM, DATA_EREKEM }, + { NPC_MORAGG, DATA_MORAGG }, + { NPC_CYANIGOSA, DATA_CYANIGOSA }, + { NPC_SINCLARI, DATA_SINCLARI }, + { 0, 0 } // END +}; + +ObjectData const gameObjectData[] = +{ + { GO_EREKEM_GUARD_1_DOOR, DATA_EREKEM_LEFT_GUARD_CELL }, + { GO_EREKEM_GUARD_2_DOOR, DATA_EREKEM_RIGHT_GUARD_CELL }, + { GO_EREKEM_DOOR, DATA_EREKEM_CELL }, + { GO_ZURAMAT_DOOR, DATA_ZURAMAT_CELL }, + { GO_LAVANTHOR_DOOR, DATA_LAVANTHOR_CELL }, + { GO_MORAGG_DOOR, DATA_MORAGG_CELL }, + { GO_ICHORON_DOOR, DATA_ICHORON_CELL }, + { GO_XEVOZZ_DOOR, DATA_XEVOZZ_CELL }, + { GO_MAIN_DOOR, DATA_MAIN_DOOR }, + { 0, 0 } // END +}; + class instance_violet_hold : public InstanceMapScript { public: instance_violet_hold() : InstanceMapScript("instance_violet_hold", 608) { } - InstanceScript* GetInstanceScript(InstanceMap* map) const override - { - return new instance_violet_hold_InstanceMapScript(map); - } - struct instance_violet_hold_InstanceMapScript : public InstanceScript { instance_violet_hold_InstanceMapScript(Map* map) : InstanceScript(map) { SetHeaders(DataHeader); + SetBossNumber(EncounterCount); + LoadObjectData(creatureData, gameObjectData); uiRemoveNpc = 0; @@ -138,29 +145,11 @@ public: bCrystalActivated = false; defenseless = true; uiMainEventPhase = NOT_STARTED; - - memset(&m_auiEncounter, 0, sizeof(m_auiEncounter)); + zuramatDead = false; } - ObjectGuid uiMoragg; - ObjectGuid uiErekem; ObjectGuid uiErekemGuard[2]; - ObjectGuid uiIchoron; - ObjectGuid uiLavanthor; - ObjectGuid uiXevozz; - ObjectGuid uiZuramat; - ObjectGuid uiCyanigosa; - ObjectGuid uiSinclari; - - ObjectGuid uiMoraggCell; - ObjectGuid uiErekemCell; - ObjectGuid uiErekemLeftGuardCell; - ObjectGuid uiErekemRightGuardCell; - ObjectGuid uiIchoronCell; - ObjectGuid uiLavanthorCell; - ObjectGuid uiXevozzCell; - ObjectGuid uiZuramatCell; - ObjectGuid uiMainDoor; + ObjectGuid uiTeleportationPortal; ObjectGuid uiSaboteurPortal; @@ -180,7 +169,6 @@ public: uint8 uiDoorIntegrity; - uint16 m_auiEncounter[MAX_ENCOUNTER]; uint8 uiCountErekemGuards; uint8 uiCountActivationCrystals; uint8 uiCyanigosaEventPhase; @@ -191,132 +179,93 @@ public: bool bIsDoorSpellCast; bool bCrystalActivated; bool defenseless; + bool zuramatDead; std::list<uint8> NpcAtDoorCastingList; - std::string str_data; - - 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 { + InstanceScript::OnCreatureCreate(creature); + switch (creature->GetEntry()) { - case CREATURE_XEVOZZ: - uiXevozz = creature->GetGUID(); - break; - case CREATURE_LAVANTHOR: - uiLavanthor = creature->GetGUID(); - break; - case CREATURE_ICHORON: - uiIchoron = creature->GetGUID(); - break; - case CREATURE_ZURAMAT: - uiZuramat = creature->GetGUID(); - break; - case CREATURE_EREKEM: - uiErekem = creature->GetGUID(); - break; - case CREATURE_EREKEM_GUARD: + case NPC_EREKEM_GUARD: if (uiCountErekemGuards < 2) { uiErekemGuard[uiCountErekemGuards++] = creature->GetGUID(); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); } break; - case CREATURE_MORAGG: - uiMoragg = creature->GetGUID(); + case NPC_CYANIGOSA: + creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); break; - case CREATURE_CYANIGOSA: - uiCyanigosa = creature->GetGUID(); - creature->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + default: break; - case CREATURE_SINCLARI: - uiSinclari = creature->GetGUID(); + case NPC_VOID_SENTRY: + if (zuramatDead) + { + creature->DespawnOrUnsummon(); + zuramatDead = false; + } break; } - /* - BEWARE - SHIT. - if (creature->GetGUID() == uiFirstBoss || creature->GetGUID() == uiSecondBoss) + /*if (creature->GetGUID() == uiFirstBoss || creature->GetGUID() == uiSecondBoss) { creature->AllLootRemovedFromCorpse(); creature->RemoveLootMode(1); - } - */ + }*/ } void OnGameObjectCreate(GameObject* go) override { + InstanceScript::OnGameObjectCreate(go); + switch (go->GetEntry()) { - case GO_EREKEM_GUARD_1_DOOR: - uiErekemLeftGuardCell = go->GetGUID(); - break; - case GO_EREKEM_GUARD_2_DOOR: - uiErekemRightGuardCell = go->GetGUID(); - break; - case GO_EREKEM_DOOR: - uiErekemCell = go->GetGUID(); - break; - case GO_ZURAMAT_DOOR: - uiZuramatCell = go->GetGUID(); - break; - case GO_LAVANTHOR_DOOR: - uiLavanthorCell = go->GetGUID(); - break; - case GO_MORAGG_DOOR: - uiMoraggCell = go->GetGUID(); - break; - case GO_ICHORON_DOOR: - uiIchoronCell = go->GetGUID(); - break; - case GO_XEVOZZ_DOOR: - uiXevozzCell = go->GetGUID(); - break; - case GO_MAIN_DOOR: - uiMainDoor = go->GetGUID(); - break; case GO_ACTIVATION_CRYSTAL: if (uiCountActivationCrystals < 4) uiActivationCrystal[uiCountActivationCrystals++] = go->GetGUID(); break; + default: + break; } } - void SetData(uint32 type, uint32 data) override + bool SetBossState(uint32 type, EncounterState state) override { + if (!InstanceScript::SetBossState(type, state)) + return false; + switch (type) { case DATA_1ST_BOSS_EVENT: - UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, CREATURE_EREKEM, NULL); - m_auiEncounter[0] = data; - if (data == DONE) - SaveToDB(); + if (state == DONE) + UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_EREKEM, nullptr); break; case DATA_2ND_BOSS_EVENT: - UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, CREATURE_MORAGG, NULL); - m_auiEncounter[1] = data; - if (data == DONE) - SaveToDB(); - break; - case DATA_CYANIGOSA_EVENT: - m_auiEncounter[2] = data; - if (data == DONE) + if (state == DONE) + UpdateEncounterState(ENCOUNTER_CREDIT_KILL_CREATURE, NPC_MORAGG, nullptr); + break; + case DATA_CYANIGOSA: + if (state == DONE) { - SaveToDB(); uiMainEventPhase = DONE; - if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor)) - pMainDoor->SetGoState(GO_STATE_ACTIVE); + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) + mainDoor->SetGoState(GO_STATE_ACTIVE); } break; + default: + break; + } + + return true; + } + + void SetData(uint32 type, uint32 data) override + { + switch (type) + { case DATA_WAVE_COUNT: uiWaveCount = data; bActive = true; @@ -340,21 +289,8 @@ public: NpcAtDoorCastingList.pop_back(); break; case DATA_MAIN_DOOR: - if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor)) - { - switch (data) - { - case GO_STATE_ACTIVE: - pMainDoor->SetGoState(GO_STATE_ACTIVE); - break; - case GO_STATE_READY: - pMainDoor->SetGoState(GO_STATE_READY); - break; - case GO_STATE_ACTIVE_ALTERNATIVE: - pMainDoor->SetGoState(GO_STATE_ACTIVE_ALTERNATIVE); - break; - } - } + if (GameObject* mainDoor = GetGameObject(type)) + mainDoor->SetGoState(GOState(data)); break; case DATA_START_BOSS_ENCOUNTER: switch (uiWaveCount) @@ -374,7 +310,7 @@ public: uiMainEventPhase = data; if (data == IN_PROGRESS) // Start event { - if (GameObject* mainDoor = instance->GetGameObject(uiMainDoor)) + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) mainDoor->SetGoState(GO_STATE_READY); uiWaveCount = 1; bActive = true; @@ -384,6 +320,9 @@ public: uiRemoveNpc = 0; // might not have been reset after a wipe on a boss. } break; + case DATA_ZURAMAT: + zuramatDead = true; + break; } } @@ -404,9 +343,6 @@ public: { switch (type) { - case DATA_1ST_BOSS_EVENT: return m_auiEncounter[0]; - case DATA_2ND_BOSS_EVENT: return m_auiEncounter[1]; - case DATA_CYANIGOSA_EVENT: return m_auiEncounter[2]; case DATA_WAVE_COUNT: return uiWaveCount; case DATA_REMOVE_NPC: return uiRemoveNpc; case DATA_PORTAL_LOCATION: return uiLocation; @@ -421,125 +357,114 @@ public: return 0; } - ObjectGuid GetGuidData(uint32 identifier) const override + ObjectGuid GetGuidData(uint32 type) const override { - switch (identifier) + switch (type) { - case DATA_MORAGG: return uiMoragg; - case DATA_EREKEM: return uiErekem; case DATA_EREKEM_GUARD_1: return uiErekemGuard[0]; case DATA_EREKEM_GUARD_2: return uiErekemGuard[1]; - case DATA_ICHORON: return uiIchoron; - case DATA_LAVANTHOR: return uiLavanthor; - case DATA_XEVOZZ: return uiXevozz; - case DATA_ZURAMAT: return uiZuramat; - case DATA_CYANIGOSA: return uiCyanigosa; - case DATA_MORAGG_CELL: return uiMoraggCell; - case DATA_EREKEM_CELL: return uiErekemCell; - case DATA_EREKEM_RIGHT_GUARD_CELL: return uiErekemRightGuardCell; - case DATA_EREKEM_LEFT_GUARD_CELL: return uiErekemLeftGuardCell; - case DATA_ICHORON_CELL: return uiIchoronCell; - case DATA_LAVANTHOR_CELL: return uiLavanthorCell; - case DATA_XEVOZZ_CELL: return uiXevozzCell; - case DATA_ZURAMAT_CELL: return uiZuramatCell; - case DATA_MAIN_DOOR: return uiMainDoor; - case DATA_SINCLARI: return uiSinclari; case DATA_TELEPORTATION_PORTAL: return uiTeleportationPortal; case DATA_SABOTEUR_PORTAL: return uiSaboteurPortal; } - return ObjectGuid::Empty; + return InstanceScript::GetGuidData(type); } void SpawnPortal() { SetData(DATA_PORTAL_LOCATION, (GetData(DATA_PORTAL_LOCATION) + urand(1, 5))%6); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) - if (Creature* portal = pSinclari->SummonCreature(CREATURE_TELEPORTATION_PORTAL, PortalLocation[GetData(DATA_PORTAL_LOCATION)], TEMPSUMMON_CORPSE_DESPAWN)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalLocation[GetData(DATA_PORTAL_LOCATION)], TEMPSUMMON_CORPSE_DESPAWN)) uiTeleportationPortal = portal->GetGUID(); } void StartBossEncounter(uint8 uiBoss, bool bForceRespawn = true) { - Creature* pBoss = NULL; + Creature* boss = nullptr; switch (uiBoss) { case BOSS_MORAGG: - HandleGameObject(uiMoraggCell, bForceRespawn); - pBoss = instance->GetCreature(uiMoragg); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove1); + HandleGameObject(GetObjectGuid(DATA_MORAGG_CELL), bForceRespawn); + boss = GetCreature(DATA_MORAGG); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove1); break; case BOSS_EREKEM: - HandleGameObject(uiErekemCell, bForceRespawn); - HandleGameObject(uiErekemRightGuardCell, bForceRespawn); - HandleGameObject(uiErekemLeftGuardCell, bForceRespawn); - - pBoss = instance->GetCreature(uiErekem); + HandleGameObject(GetObjectGuid(DATA_EREKEM_CELL), bForceRespawn); + HandleGameObject(GetObjectGuid(DATA_EREKEM_LEFT_GUARD_CELL), bForceRespawn); + HandleGameObject(GetObjectGuid(DATA_EREKEM_RIGHT_GUARD_CELL), bForceRespawn); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove2); + boss = GetCreature(DATA_EREKEM); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove2); if (Creature* pGuard1 = instance->GetCreature(uiErekemGuard[0])) { if (bForceRespawn) - pGuard1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + { + pGuard1->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC | UNIT_FLAG_NON_ATTACKABLE); + pGuard1->GetMotionMaster()->MovePoint(0, BossStartMove21); + } else pGuard1->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - pGuard1->GetMotionMaster()->MovePoint(0, BossStartMove21); } if (Creature* pGuard2 = instance->GetCreature(uiErekemGuard[1])) { if (bForceRespawn) + { pGuard2->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + pGuard2->GetMotionMaster()->MovePoint(0, BossStartMove22); + } else pGuard2->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - pGuard2->GetMotionMaster()->MovePoint(0, BossStartMove22); } break; case BOSS_ICHORON: - HandleGameObject(uiIchoronCell, bForceRespawn); - pBoss = instance->GetCreature(uiIchoron); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove3); + HandleGameObject(GetObjectGuid(DATA_ICHORON_CELL), bForceRespawn); + boss = GetCreature(DATA_ICHORON); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove3); break; case BOSS_LAVANTHOR: - HandleGameObject(uiLavanthorCell, bForceRespawn); - pBoss = instance->GetCreature(uiLavanthor); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove4); + HandleGameObject(GetObjectGuid(DATA_LAVANTHOR_CELL), bForceRespawn); + boss = GetCreature(DATA_LAVANTHOR); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove4); break; case BOSS_XEVOZZ: - HandleGameObject(uiXevozzCell, bForceRespawn); - pBoss = instance->GetCreature(uiXevozz); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove5); + HandleGameObject(GetObjectGuid(DATA_XEVOZZ_CELL), bForceRespawn); + boss = GetCreature(DATA_XEVOZZ); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove5); break; case BOSS_ZURAMAT: - HandleGameObject(uiZuramatCell, bForceRespawn); - pBoss = instance->GetCreature(uiZuramat); - if (pBoss) - pBoss->GetMotionMaster()->MovePoint(0, BossStartMove6); + HandleGameObject(GetObjectGuid(DATA_ZURAMAT_CELL), bForceRespawn); + boss = GetCreature(DATA_ZURAMAT); + if (boss) + boss->GetMotionMaster()->MovePoint(0, BossStartMove6); break; } // generic boss state changes - if (pBoss) + if (boss) { - pBoss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - pBoss->SetReactState(REACT_AGGRESSIVE); + boss->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + boss->SetReactState(REACT_AGGRESSIVE); if (!bForceRespawn) { - if (pBoss->isDead()) + if (boss->isDead()) { // respawn but avoid to be looted again - pBoss->Respawn(); - pBoss->RemoveLootMode(1); + boss->Respawn(); + boss->RemoveLootMode(1); } - pBoss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + else + boss->GetMotionMaster()->MoveTargetedHome(); + + boss->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); uiWaveCount = 0; } } @@ -555,12 +480,12 @@ public: case 6: if (uiFirstBoss == 0) uiFirstBoss = urand(1, 6); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) { - if (Creature* pPortal = pSinclari->SummonCreature(CREATURE_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) - uiSaboteurPortal = pPortal->GetGUID(); - if (Creature* pAzureSaboteur = pSinclari->SummonCreature(CREATURE_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) - pAzureSaboteur->CastSpell(pAzureSaboteur, SABOTEUR_SHIELD_EFFECT, false); + if (Creature* portal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) + uiSaboteurPortal = portal->GetGUID(); + if (Creature* azureSaboteur = sinclari->SummonCreature(NPC_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) + azureSaboteur->CastSpell(azureSaboteur, SABOTEUR_SHIELD_EFFECT, false); } break; case 12: @@ -569,25 +494,22 @@ public: { uiSecondBoss = urand(1, 6); } while (uiSecondBoss == uiFirstBoss); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) { - if (Creature* pPortal = pSinclari->SummonCreature(CREATURE_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) + if (Creature* pPortal = sinclari->SummonCreature(NPC_TELEPORTATION_PORTAL, MiddleRoomPortalSaboLocation, TEMPSUMMON_CORPSE_DESPAWN)) uiSaboteurPortal = pPortal->GetGUID(); - if (Creature* pAzureSaboteur = pSinclari->SummonCreature(CREATURE_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) + if (Creature* pAzureSaboteur = sinclari->SummonCreature(NPC_SABOTEOUR, MiddleRoomLocation, TEMPSUMMON_DEAD_DESPAWN)) pAzureSaboteur->CastSpell(pAzureSaboteur, SABOTEUR_SHIELD_EFFECT, false); } break; case 18: - { - Creature* pSinclari = instance->GetCreature(uiSinclari); - if (pSinclari) - pSinclari->SummonCreature(CREATURE_CYANIGOSA, CyanigosasSpawnLocation, TEMPSUMMON_DEAD_DESPAWN); + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) + sinclari->SummonCreature(NPC_CYANIGOSA, CyanigosasSpawnLocation, TEMPSUMMON_DEAD_DESPAWN); break; - } case 1: { - if (GameObject* pMainDoor = instance->GetGameObject(uiMainDoor)) - pMainDoor->SetGoState(GO_STATE_READY); + if (GameObject* mainDoor = GetGameObject(DATA_MAIN_DOOR)) + mainDoor->SetGoState(GO_STATE_READY); DoUpdateWorldState(WORLD_STATE_VH_PRISON_STATE, 100); // no break } @@ -597,54 +519,15 @@ public: } } - std::string GetSaveData() override + void WriteSaveDataMore(std::ostringstream& data) override { - OUT_SAVE_INST_DATA; - - std::ostringstream saveStream; - saveStream << "V H " << (uint16)m_auiEncounter[0] - << ' ' << (uint16)m_auiEncounter[1] - << ' ' << (uint16)m_auiEncounter[2] - << ' ' << (uint16)uiFirstBoss - << ' ' << (uint16)uiSecondBoss; - - str_data = saveStream.str(); - - OUT_SAVE_INST_DATA_COMPLETE; - return str_data; + data << uiFirstBoss << ' ' << uiSecondBoss; } - void Load(const char* in) override + void ReadSaveDataMore(std::istringstream& data) override { - if (!in) - { - OUT_LOAD_INST_DATA_FAIL; - return; - } - - OUT_LOAD_INST_DATA(in); - - char dataHead1, dataHead2; - uint16 data0, data1, data2, data3, data4; - - std::istringstream loadStream(in); - loadStream >> dataHead1 >> dataHead2 >> data0 >> data1 >> data2 >> data3 >> data4; - - if (dataHead1 == 'V' && dataHead2 == 'H') - { - m_auiEncounter[0] = data0; - m_auiEncounter[1] = data1; - m_auiEncounter[2] = data2; - - for (uint8 i = 0; i < MAX_ENCOUNTER; ++i) - if (m_auiEncounter[i] == IN_PROGRESS) - m_auiEncounter[i] = NOT_STARTED; - - uiFirstBoss = uint8(data3); - uiSecondBoss = uint8(data4); - } else OUT_LOAD_INST_DATA_FAIL; - - OUT_LOAD_INST_DATA_COMPLETE; + data >> uiFirstBoss; + data >> uiSecondBoss; } bool CheckWipe() @@ -660,6 +543,7 @@ public: return false; } + zuramatDead = false; return true; } @@ -690,59 +574,57 @@ public: SetData(DATA_MAIN_DOOR, GO_STATE_ACTIVE); SetData(DATA_WAVE_COUNT, 0); uiMainEventPhase = NOT_STARTED; + uiActivationTimer = 5000; for (int i = 0; i < 4; ++i) if (GameObject* crystal = instance->GetGameObject(uiActivationCrystal[i])) crystal->SetFlag(GAMEOBJECT_FLAGS, GO_FLAG_NOT_SELECTABLE); - if (Creature* pSinclari = instance->GetCreature(uiSinclari)) + if (Creature* sinclari = GetCreature(DATA_SINCLARI)) { - pSinclari->SetVisible(true); + sinclari->SetVisible(true); std::list<Creature*> GuardList; - pSinclari->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); + sinclari->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); if (!GuardList.empty()) { - for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) + for (Creature* guard : GuardList) { - if (Creature* pGuard = *itr) - { - pGuard->SetVisible(true); - pGuard->SetReactState(REACT_AGGRESSIVE); - pGuard->GetMotionMaster()->MovePoint(1, pGuard->GetHomePosition()); - } + guard->SetVisible(true); + guard->SetReactState(REACT_AGGRESSIVE); + guard->GetMotionMaster()->MovePoint(1, guard->GetHomePosition()); } } - pSinclari->GetMotionMaster()->MovePoint(1, pSinclari->GetHomePosition()); - pSinclari->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); + sinclari->GetMotionMaster()->MovePoint(1, sinclari->GetHomePosition()); + sinclari->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NOT_SELECTABLE); } } // Cyanigosa is spawned but not tranformed, prefight event - Creature* pCyanigosa = instance->GetCreature(uiCyanigosa); - if (pCyanigosa && !pCyanigosa->HasAura(CYANIGOSA_SPELL_TRANSFORM)) + Creature* cyanigosa = GetCreature(DATA_CYANIGOSA); + if (cyanigosa && !cyanigosa->HasAura(CYANIGOSA_SPELL_TRANSFORM)) { if (uiCyanigosaEventTimer <= diff) { switch (uiCyanigosaEventPhase) { case 1: - pCyanigosa->CastSpell(pCyanigosa, CYANIGOSA_BLUE_AURA, false); - pCyanigosa->AI()->Talk(CYANIGOSA_SAY_SPAWN); + cyanigosa->CastSpell(cyanigosa, CYANIGOSA_BLUE_AURA, false); + cyanigosa->AI()->Talk(CYANIGOSA_SAY_SPAWN); uiCyanigosaEventTimer = 7*IN_MILLISECONDS; ++uiCyanigosaEventPhase; break; case 2: - pCyanigosa->GetMotionMaster()->MoveJump(MiddleRoomLocation.GetPositionX(), MiddleRoomLocation.GetPositionY(), MiddleRoomLocation.GetPositionZ(), 10.0f, 20.0f); - pCyanigosa->CastSpell(pCyanigosa, CYANIGOSA_BLUE_AURA, false); + cyanigosa->GetMotionMaster()->MoveJump(MiddleRoomLocation.GetPositionX(), MiddleRoomLocation.GetPositionY(), MiddleRoomLocation.GetPositionZ(), 10.0f, 20.0f); + cyanigosa->CastSpell(cyanigosa, CYANIGOSA_BLUE_AURA, false); uiCyanigosaEventTimer = 7*IN_MILLISECONDS; ++uiCyanigosaEventPhase; break; case 3: - pCyanigosa->RemoveAurasDueToSpell(CYANIGOSA_BLUE_AURA); - pCyanigosa->CastSpell(pCyanigosa, CYANIGOSA_SPELL_TRANSFORM, 0); - pCyanigosa->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); - pCyanigosa->SetReactState(REACT_AGGRESSIVE); + cyanigosa->RemoveAurasDueToSpell(CYANIGOSA_BLUE_AURA); + cyanigosa->CastSpell(cyanigosa, CYANIGOSA_SPELL_TRANSFORM, 0); + cyanigosa->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_IMMUNE_TO_PC|UNIT_FLAG_NON_ATTACKABLE); + cyanigosa->SetReactState(REACT_AGGRESSIVE); uiCyanigosaEventTimer = 2*IN_MILLISECONDS; ++uiCyanigosaEventPhase; break; @@ -794,9 +676,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); } @@ -813,6 +697,11 @@ public: } } }; + + InstanceScript* GetInstanceScript(InstanceMap* map) const override + { + return new instance_violet_hold_InstanceMapScript(map); + } }; void AddSC_instance_violet_hold() diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp index 645a9da4764..b05da4b994c 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.cpp +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.cpp @@ -28,22 +28,23 @@ #define GOSSIP_START_EVENT "Get your people to safety, we'll keep the Blue Dragonflight's forces at bay." #define GOSSIP_ITEM_1 "Activate the crystals when we get in trouble, right" #define GOSSIP_I_WANT_IN "I'm not fighting, so send me in now!" +#define SAY_EVENT_LOCK "I'm locking the door. Good luck, and thank you for doing this." #define SPAWN_TIME 20000 enum PortalCreatures { - CREATURE_AZURE_INVADER_1 = 30661, - CREATURE_AZURE_INVADER_2 = 30961, - CREATURE_AZURE_SPELLBREAKER_1 = 30662, - CREATURE_AZURE_SPELLBREAKER_2 = 30962, - CREATURE_AZURE_BINDER_1 = 30663, - CREATURE_AZURE_BINDER_2 = 30918, - CREATURE_AZURE_MAGE_SLAYER_1 = 30664, - CREATURE_AZURE_MAGE_SLAYER_2 = 30963, - CREATURE_AZURE_CAPTAIN = 30666, - CREATURE_AZURE_SORCEROR = 30667, - CREATURE_AZURE_RAIDER = 30668, - CREATURE_AZURE_STALKER = 32191 + NPC_AZURE_INVADER_1 = 30661, + NPC_AZURE_INVADER_2 = 30961, + NPC_AZURE_SPELLBREAKER_1 = 30662, + NPC_AZURE_SPELLBREAKER_2 = 30962, + NPC_AZURE_BINDER_1 = 30663, + NPC_AZURE_BINDER_2 = 30918, + NPC_AZURE_MAGE_SLAYER_1 = 30664, + NPC_AZURE_MAGE_SLAYER_2 = 30963, + NPC_AZURE_CAPTAIN = 30666, + NPC_AZURE_SORCEROR = 30667, + NPC_AZURE_RAIDER = 30668, + NPC_AZURE_STALKER = 32191 }; enum AzureInvaderSpells @@ -59,7 +60,7 @@ enum AzureSellbreakerSpells SPELL_ARCANE_BLAST = 58462, SPELL_SLOW = 25603, SPELL_CHAINS_OF_ICE = 58464, - SPELL_CONE_OF_COLD = 58463 + SPELL_CONE_OF_COLD = 58463, }; enum AzureBinderSpells @@ -67,7 +68,7 @@ enum AzureBinderSpells SPELL_ARCANE_BARRAGE = 58456, SPELL_ARCANE_EXPLOSION = 58455, SPELL_FROST_NOVA = 58458, - SPELL_FROSTBOLT = 58457 + SPELL_FROSTBOLT = 58457, }; enum AzureMageSlayerSpells @@ -85,7 +86,7 @@ enum AzureCaptainSpells enum AzureSorcerorSpells { SPELL_ARCANE_STREAM = 60181, - SPELL_MANA_DETONATION = 60182 + SPELL_MANA_DETONATION = 60182, }; enum AzureRaiderSpells @@ -114,7 +115,7 @@ enum TrashDoorSpell enum Spells { SPELL_PORTAL_CHANNEL = 58012, - SPELL_CRYSTAL_ACTIVATION = 57804, + SPELL_CRYSTAL_ACTIVATION = 57804, // visual effect SPELL_ARCANE_SPHERE_PASSIVE = 44263 }; @@ -242,9 +243,21 @@ const float SaboteurFinalPos6[5][3] = {1931.063354f, 848.468445f, 47.190434f} }; -const Position MovePosition = {1806.955566f, 803.851807f, 44.363323f, 0.0f}; -const Position playerTeleportPosition = {1830.531006f, 803.939758f, 44.340508f, 6.281611f}; -const Position sinclariOutsidePosition = {1817.315674f, 804.060608f, 44.363998f, 0.0f}; +const Position PortalLocation[] = +{ + { 1877.51f, 850.104f, 44.6599f, 4.7822f }, // WP 1 + { 1936.07f, 803.198f, 53.3749f, 3.12414f }, // WP 3 + { 1890.64f, 753.471f, 48.7224f, 1.71042f }, // WP 5 +}; + +#define MAX_PRE_EVENT_PORTAL 3 + +ObjectGuid preEventPortalGUID[MAX_PRE_EVENT_PORTAL] = { ObjectGuid::Empty }; + +const Position MovePosition = { 1806.955566f, 803.851807f, 44.363323f, 0.0f }; +const Position playerTeleportPosition = { 1830.531006f, 803.939758f, 44.340508f, 6.281611f }; +const Position sinclariOutsidePosition = { 1820.429810f, 804.066040f, 44.363998f, 0.0f }; +const Position sinclariCrystalPosition = { 1828.868286f, 798.468811f, 44.363998f, 3.890467f }; class npc_sinclari_vh : public CreatureScript { @@ -258,7 +271,7 @@ public: { case GOSSIP_ACTION_INFO_DEF+1: player->CLOSE_GOSSIP_MENU(); - ENSURE_AI(npc_sinclari_vh::npc_sinclariAI, (creature->AI()))->uiPhase = 1; + ENSURE_AI(npc_sinclari_vh::npc_sinclariAI, creature->AI())->uiPhase = 1; if (InstanceScript* instance = creature->GetInstanceScript()) instance->SetData(DATA_MAIN_EVENT_PHASE, SPECIAL); break; @@ -296,17 +309,12 @@ public: return true; } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_sinclariAI>(creature); - } - struct npc_sinclariAI : public ScriptedAI { npc_sinclariAI(Creature* creature) : ScriptedAI(creature) { Initialize(); - instance = creature->GetInstanceScript(); + instance = creature->GetInstanceScript(); } void Initialize() @@ -325,6 +333,9 @@ public: Initialize(); me->SetReactState(REACT_AGGRESSIVE); + for (uint8 i = 0; i < MAX_PRE_EVENT_PORTAL; i++) + if (TempSummon* summon = me->SummonCreature(NPC_TELEPORTATION_PORTAL, PortalLocation[i], TEMPSUMMON_MANUAL_DESPAWN)) + preEventPortalGUID[i] = summon->GetGUID(); std::list<Creature*> GuardList; me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); @@ -345,8 +356,6 @@ public: void UpdateAI(uint32 uiDiff) override { - ScriptedAI::UpdateAI(uiDiff); - if (uiPhase) { if (uiTimer <= uiDiff) @@ -354,25 +363,17 @@ public: switch (uiPhase) { case 1: - Talk(SAY_SINCLARI_1); - uiTimer = 4000; - uiPhase = 2; + me->SetWalk(true); + me->GetMotionMaster()->MovePoint(0, sinclariCrystalPosition); + uiTimer = 1000; + uiPhase = 6; break; case 2: { - std::list<Creature*> GuardList; - me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); - if (!GuardList.empty()) - for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) - { - if (Creature* pGuard = *itr) - { - pGuard->SetWalk(false); - pGuard->GetMotionMaster()->MovePoint(0, MovePosition); - } - } - uiTimer = 6000; - uiPhase = 3; + me->SetFacingTo(me->GetOrientation() - 3.14f); + Talk(SAY_SINCLARI_1); + uiTimer = 1500; + uiPhase = 7; break; } case 3: @@ -385,7 +386,6 @@ public: if (Creature* pGuard = *itr) { pGuard->SetVisible(false); - pGuard->SetReactState(REACT_PASSIVE); } } uiTimer = 2000; @@ -398,11 +398,58 @@ public: uiPhase = 5; break; case 5: - instance->SetData(DATA_MAIN_EVENT_PHASE, IN_PROGRESS); + me->SetFacingTo(0.006673f); + me->Say(SAY_EVENT_LOCK, LANG_UNIVERSAL, me); // need to change to db say me->SetReactState(REACT_PASSIVE); + uiTimer = 3000; + uiPhase = 8; + break; + case 6: + me->GetMotionMaster()->MovementExpired(); + me->HandleEmoteCommand(EMOTE_STATE_USE_STANDING); + uiTimer = 2000; + uiPhase = 2; + break; + case 7: + { + std::list<Creature*> creatures; + GetCreatureListWithEntryInGrid(creatures, me, NPC_TELEPORTATION_PORTAL, 200.0f); + GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_BINDER_1, 200.0f); + GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_MAGE_SLAYER_1, 200.0f); + GetCreatureListWithEntryInGrid(creatures, me, NPC_AZURE_INVADER_1, 200.0f); + DoCast(SPELL_CRYSTAL_ACTIVATION); + if (!creatures.empty()) + { + for (std::list<Creature*>::iterator itr = creatures.begin(); itr != creatures.end(); ++itr) + (*itr)->DisappearAndDie(); + } + uiTimer = 500; + uiPhase = 9; + } + break; + case 8: + instance->SetData(DATA_MAIN_EVENT_PHASE, IN_PROGRESS); uiTimer = 0; uiPhase = 0; break; + case 9: + { + std::list<Creature*> GuardList; + me->GetCreatureListWithEntryInGrid(GuardList, NPC_VIOLET_HOLD_GUARD, 40.0f); + if (!GuardList.empty()) + for (std::list<Creature*>::const_iterator itr = GuardList.begin(); itr != GuardList.end(); ++itr) + { + if (Creature* pGuard = *itr) + { + pGuard->SetReactState(REACT_PASSIVE); + pGuard->SetWalk(false); + pGuard->GetMotionMaster()->MovePoint(0, MovePosition); + } + } + uiTimer = 4000; + uiPhase = 3; + } + break; } } else uiTimer -= uiDiff; @@ -415,6 +462,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_sinclariAI>(creature); + } }; class npc_azure_saboteur : public CreatureScript @@ -422,14 +473,9 @@ class npc_azure_saboteur : public CreatureScript public: npc_azure_saboteur() : CreatureScript("npc_azure_saboteur") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_saboteurAI>(creature); - } - struct npc_azure_saboteurAI : public npc_escortAI { - npc_azure_saboteurAI(Creature* creature):npc_escortAI(creature) + npc_azure_saboteurAI(Creature* creature) : npc_escortAI(creature) { instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; @@ -532,13 +578,16 @@ public: { me->CastSpell(me, SABOTEUR_SHIELD_DISRUPTION, false); me->DisappearAndDie(); - Creature* pSaboPort = ObjectAccessor::GetCreature((*me), instance->GetGuidData(DATA_SABOTEUR_PORTAL)); - if (pSaboPort) + if (Creature* pSaboPort = ObjectAccessor::GetCreature((*me), instance->GetGuidData(DATA_SABOTEUR_PORTAL))) pSaboPort->DisappearAndDie(); instance->SetData(DATA_START_BOSS_ENCOUNTER, 1); } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_saboteurAI>(creature); + } }; class npc_teleportation_portal_vh : public CreatureScript @@ -546,11 +595,6 @@ class npc_teleportation_portal_vh : public CreatureScript public: npc_teleportation_portal_vh() : CreatureScript("npc_teleportation_portal_vh") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_teleportation_portalAI>(creature); - } - struct npc_teleportation_portalAI : public ScriptedAI { npc_teleportation_portalAI(Creature* creature) : ScriptedAI(creature), listOfMobs(me) @@ -558,6 +602,9 @@ public: Initialize(); instance = creature->GetInstanceScript(); uiTypeOfMobsPortal = urand(0, 1); // 0 - elite mobs 1 - portal guardian or portal keeper with regular mobs + + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == NOT_STARTED) + uiTypeOfMobsPortal = 2; } void Initialize() @@ -583,13 +630,15 @@ public: void MoveInLineOfSight(Unit* /*who*/) override { } - void UpdateAI(uint32 diff) override { - if (instance->GetData(DATA_REMOVE_NPC) == 1) + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) { - me->DespawnOrUnsummon(); - instance->SetData(DATA_REMOVE_NPC, 0); + if (instance->GetData(DATA_REMOVE_NPC) == 1) + { + me->DespawnOrUnsummon(); + instance->SetData(DATA_REMOVE_NPC, 0); + } } uint8 uiWaveCount = instance->GetData(DATA_WAVE_COUNT); @@ -608,7 +657,7 @@ public: uint8 k = uiWaveCount < 12 ? 2 : 3; for (uint8 i = 0; i < k; ++i) { - uint32 entry = RAND(CREATURE_AZURE_CAPTAIN, CREATURE_AZURE_RAIDER, CREATURE_AZURE_STALKER, CREATURE_AZURE_SORCEROR); + uint32 entry = RAND(NPC_AZURE_CAPTAIN, NPC_AZURE_RAIDER, NPC_AZURE_STALKER, NPC_AZURE_SORCEROR); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); } me->SetVisible(false); @@ -633,14 +682,14 @@ public: uint8 k = instance->GetData(DATA_WAVE_COUNT) < 12 ? 3 : 4; for (uint8 i = 0; i < k; ++i) { - uint32 entry = RAND(CREATURE_AZURE_INVADER_1, CREATURE_AZURE_INVADER_2, CREATURE_AZURE_SPELLBREAKER_1, CREATURE_AZURE_SPELLBREAKER_2, CREATURE_AZURE_MAGE_SLAYER_1, CREATURE_AZURE_MAGE_SLAYER_2, CREATURE_AZURE_BINDER_1, CREATURE_AZURE_BINDER_2); + uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_INVADER_2, NPC_AZURE_SPELLBREAKER_1, NPC_AZURE_SPELLBREAKER_2, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_MAGE_SLAYER_2, NPC_AZURE_BINDER_1, NPC_AZURE_BINDER_2); DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); } } else { bPortalGuardianOrKeeperOrEliteSpawn = true; - uint32 entry = RAND(CREATURE_PORTAL_GUARDIAN, CREATURE_PORTAL_KEEPER); + uint32 entry = RAND(NPC_PORTAL_GUARDIAN, NPC_PORTAL_KEEPER); if (Creature* pPortalKeeper = DoSummon(entry, me, 2.0f, 0, TEMPSUMMON_DEAD_DESPAWN)) me->CastSpell(pPortalKeeper, SPELL_PORTAL_CHANNEL, false); } @@ -653,37 +702,71 @@ public: me->RemoveCorpse(); } break; + case 2: // Pre-event + if (uiSpawnTimer <= diff) + { + uint32 entry = RAND(NPC_AZURE_INVADER_1, NPC_AZURE_MAGE_SLAYER_1, NPC_AZURE_BINDER_1); + DoSummon(entry, me, 2.0f, 20000, TEMPSUMMON_DEAD_DESPAWN); + uiSpawnTimer = SPAWN_TIME; + } else uiSpawnTimer -= diff; + break; } } void JustDied(Unit* /*killer*/) override { - instance->SetData(DATA_WAVE_COUNT, instance->GetData(DATA_WAVE_COUNT)+1); + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + instance->SetData(DATA_WAVE_COUNT, instance->GetData(DATA_WAVE_COUNT) + 1); } void JustSummoned(Creature* summoned) override { - listOfMobs.Summon(summoned); - instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + { + listOfMobs.Summon(summoned); + instance->SetGuidData(DATA_ADD_TRASH_MOB, summoned->GetGUID()); + } } void SummonedCreatureDies(Creature* summoned, Unit* /*killer*/) override { - listOfMobs.Despawn(summoned); - instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == IN_PROGRESS) + { + listOfMobs.Despawn(summoned); + instance->SetGuidData(DATA_DEL_TRASH_MOB, summoned->GetGUID()); + } } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_teleportation_portalAI>(creature); + } }; struct violet_hold_trashAI : public npc_escortAI { - violet_hold_trashAI(Creature* creature):npc_escortAI(creature) + violet_hold_trashAI(Creature* creature) : npc_escortAI(creature) { instance = creature->GetInstanceScript(); bHasGotMovingPoints = false; - portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); - secondPortalRouteID = 0; + + + if (instance->GetData(DATA_MAIN_EVENT_PHASE) == NOT_STARTED) + { + if (Creature* portal = me->FindNearestCreature(NPC_TELEPORTATION_PORTAL, 10.0f)) + { + ObjectGuid portalGUID = portal->GetGUID(); + for (uint8 i = 0; i < MAX_PRE_EVENT_PORTAL; i++) + if (portalGUID == preEventPortalGUID[i]) + portalLocationID = i * 2; + } + } + else + { + portalLocationID = instance->GetData(DATA_PORTAL_LOCATION); + Reset(); + } } public: @@ -698,7 +781,7 @@ struct violet_hold_trashAI : public npc_escortAI { case 0: if (waypointId == 5) - CreatureStartAttackDoor(); + CreatureStartAttackDoor(); break; case 1: if ((waypointId == 8 && secondPortalRouteID == 0) || (waypointId == 7 && secondPortalRouteID == 1)) @@ -706,7 +789,7 @@ struct violet_hold_trashAI : public npc_escortAI break; case 2: if (waypointId == 7) - CreatureStartAttackDoor(); + CreatureStartAttackDoor(); break; case 3: if (waypointId == 8) @@ -723,7 +806,7 @@ struct violet_hold_trashAI : public npc_escortAI } } - void UpdateAI(uint32) override + void UpdateAI(uint32 diff) override { if (instance->GetData(DATA_MAIN_EVENT_PHASE) != IN_PROGRESS) me->CastStop(); @@ -778,6 +861,8 @@ struct violet_hold_trashAI : public npc_escortAI SetDespawnAtEnd(false); Start(true, true); } + + npc_escortAI::UpdateAI(diff); } void JustDied(Unit* /*killer*/) override @@ -791,7 +876,6 @@ struct violet_hold_trashAI : public npc_escortAI DoCast(SPELL_DESTROY_DOOR_SEAL); instance->SetData(DATA_NPC_PRESENCE_AT_DOOR_ADD, 1); } - }; class npc_azure_invader : public CreatureScript @@ -799,11 +883,6 @@ class npc_azure_invader : public CreatureScript public: npc_azure_invader() : CreatureScript("npc_azure_invader") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_invaderAI>(creature); - } - struct npc_azure_invaderAI : public violet_hold_trashAI { npc_azure_invaderAI(Creature* creature) : violet_hold_trashAI(creature) @@ -833,12 +912,11 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_INVADER_1) + if (me->GetEntry() == NPC_AZURE_INVADER_1) { if (uiCleaveTimer <= diff) { @@ -848,14 +926,13 @@ public: if (uiImpaleTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_IMPALE); uiImpaleTimer = 4000; } else uiImpaleTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_INVADER_2) + if (me->GetEntry() == NPC_AZURE_INVADER_2) { if (uiBrutalStrikeTimer <= diff) { @@ -876,6 +953,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_invaderAI>(creature); + } }; class npc_azure_binder : public CreatureScript @@ -883,11 +964,6 @@ class npc_azure_binder : public CreatureScript public: npc_azure_binder() : CreatureScript("npc_azure_binder") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_binderAI>(creature); - } - struct npc_azure_binderAI : public violet_hold_trashAI { npc_azure_binderAI(Creature* creature) : violet_hold_trashAI(creature) @@ -917,12 +993,11 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_BINDER_1) + if (me->GetEntry() == NPC_AZURE_BINDER_1) { if (uiArcaneExplosionTimer <= diff) { @@ -930,16 +1005,15 @@ public: uiArcaneExplosionTimer = 5000; } else uiArcaneExplosionTimer -= diff; - if (uiArcainBarrageTimer <= diff) + if (uiArcainBarrageTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) - DoCast(target, SPELL_ARCANE_BARRAGE); + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) + DoCast(target, SPELL_ARCANE_BARRAGE); uiArcainBarrageTimer = 6000; } else uiArcainBarrageTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_BINDER_2) + if (me->GetEntry() == NPC_AZURE_BINDER_2) { if (uiFrostNovaTimer <= diff) { @@ -949,8 +1023,7 @@ public: if (uiFrostboltTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_FROSTBOLT); uiFrostboltTimer = 6000; } else uiFrostboltTimer -= diff; @@ -960,6 +1033,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_binderAI>(creature); + } }; class npc_azure_mage_slayer : public CreatureScript @@ -967,11 +1044,6 @@ class npc_azure_mage_slayer : public CreatureScript public: npc_azure_mage_slayer() : CreatureScript("npc_azure_mage_slayer") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_mage_slayerAI>(creature); - } - struct npc_azure_mage_slayerAI : public violet_hold_trashAI { npc_azure_mage_slayerAI(Creature* creature) : violet_hold_trashAI(creature) @@ -997,12 +1069,11 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_MAGE_SLAYER_1) + if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_1) { if (uiArcaneEmpowermentTimer <= diff) { @@ -1011,12 +1082,11 @@ public: } else uiArcaneEmpowermentTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_MAGE_SLAYER_2) + if (me->GetEntry() == NPC_AZURE_MAGE_SLAYER_2) { if (uiSpellLockTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SPELL_LOCK); uiSpellLockTimer = 9000; } else uiSpellLockTimer -= diff; @@ -1026,6 +1096,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_mage_slayerAI>(creature); + } }; class npc_azure_raider : public CreatureScript @@ -1033,11 +1107,6 @@ class npc_azure_raider : public CreatureScript public: npc_azure_raider() : CreatureScript("npc_azure_raider") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_raiderAI>(creature); - } - struct npc_azure_raiderAI : public violet_hold_trashAI { npc_azure_raiderAI(Creature* creature) : violet_hold_trashAI(creature) @@ -1063,7 +1132,6 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; @@ -1084,6 +1152,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_raiderAI>(creature); + } }; class npc_azure_stalker : public CreatureScript @@ -1114,7 +1186,6 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; @@ -1123,8 +1194,7 @@ public: { if (_tacticalBlinkTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 40, true)) DoCast(target, SPELL_TACTICAL_BLINK); _tacticalBlinkTimer = 6000; _tacticalBlinkCast = true; @@ -1135,8 +1205,8 @@ public: { if (_backstabTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 10, true); - DoCast(target, SPELL_BACKSTAB); + if (Unit* target = SelectTarget(SELECT_TARGET_NEAREST, 0, 10, true)) + DoCast(target, SPELL_BACKSTAB); _tacticalBlinkCast = false; _backstabTimer =1300; } else _backstabTimer -= diff; @@ -1191,43 +1261,39 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; - if (me->GetEntry() == CREATURE_AZURE_SPELLBREAKER_1) + if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_1) { if (uiArcaneBlastTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_ARCANE_BLAST); uiArcaneBlastTimer = 6000; } else uiArcaneBlastTimer -= diff; if (uiSlowTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_SLOW); uiSlowTimer = 5000; } else uiSlowTimer -= diff; } - if (me->GetEntry() == CREATURE_AZURE_SPELLBREAKER_2) + if (me->GetEntry() == NPC_AZURE_SPELLBREAKER_2) { if (uiChainsOfIceTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_CHAINS_OF_ICE); uiChainsOfIceTimer = 7000; } else uiChainsOfIceTimer -= diff; if (uiConeOfColdTimer <= diff) { - DoCast(SPELL_CONE_OF_COLD); + DoCast(SPELL_CONE_OF_COLD); uiConeOfColdTimer = 5000; } else uiConeOfColdTimer -= diff; } @@ -1247,11 +1313,6 @@ class npc_azure_captain : public CreatureScript public: npc_azure_captain() : CreatureScript("npc_azure_captain") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_captainAI>(creature); - } - struct npc_azure_captainAI : public violet_hold_trashAI { npc_azure_captainAI(Creature* creature) : violet_hold_trashAI(creature) @@ -1277,7 +1338,6 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; @@ -1298,6 +1358,10 @@ public: } }; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_captainAI>(creature); + } }; class npc_azure_sorceror : public CreatureScript @@ -1305,11 +1369,6 @@ class npc_azure_sorceror : public CreatureScript public: npc_azure_sorceror() : CreatureScript("npc_azure_sorceror") { } - CreatureAI* GetAI(Creature* creature) const override - { - return GetInstanceAI<npc_azure_sorcerorAI>(creature); - } - struct npc_azure_sorcerorAI : public violet_hold_trashAI { npc_azure_sorcerorAI(Creature* creature) : violet_hold_trashAI(creature) @@ -1337,15 +1396,13 @@ public: void UpdateAI(uint32 diff) override { violet_hold_trashAI::UpdateAI(diff); - npc_escortAI::UpdateAI(diff); if (!UpdateVictim()) return; if (uiArcaneStreamTimer <= diff) { - Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true); - if (target) + if (Unit* target = SelectTarget(SELECT_TARGET_RANDOM, 0, 100, true)) DoCast(target, SPELL_ARCANE_STREAM); uiArcaneStreamTimer = urand(0, 5000)+5000; uiArcaneStreamTimerStartingValueHolder = uiArcaneStreamTimer; @@ -1360,8 +1417,12 @@ public: DoMeleeAttackIfReady(); } }; -}; + CreatureAI* GetAI(Creature* creature) const override + { + return GetInstanceAI<npc_azure_sorcerorAI>(creature); + } +}; class npc_violet_hold_arcane_sphere : public CreatureScript { @@ -1419,6 +1480,33 @@ public: } }; +class spell_crystal_activation : public SpellScriptLoader +{ +public: + spell_crystal_activation() : SpellScriptLoader("spell_crystal_activation") { } + + class spell_crystal_activation_SpellScript : public SpellScript + { + PrepareSpellScript(spell_crystal_activation_SpellScript); + + void HandleSendEvent(SpellEffIndex effIndex) + { + if (GetHitUnit()->GetEntry() == NPC_VIOLET_HOLD_GUARD) + PreventHitDefaultEffect(effIndex); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_crystal_activation_SpellScript::HandleSendEvent, EFFECT_0, SPELL_EFFECT_SEND_EVENT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_crystal_activation_SpellScript(); + } +}; + void AddSC_violet_hold() { new npc_sinclari_vh(); @@ -1434,4 +1522,5 @@ void AddSC_violet_hold() new npc_azure_saboteur(); new npc_violet_hold_arcane_sphere(); new go_activation_crystal(); + new spell_crystal_activation(); } diff --git a/src/server/scripts/Northrend/VioletHold/violet_hold.h b/src/server/scripts/Northrend/VioletHold/violet_hold.h index 404d1f493e6..2bd90672024 100644 --- a/src/server/scripts/Northrend/VioletHold/violet_hold.h +++ b/src/server/scripts/Northrend/VioletHold/violet_hold.h @@ -18,13 +18,18 @@ #ifndef DEF_VIOLET_HOLD_H #define DEF_VIOLET_HOLD_H -#define DataHeader "VIO" +#define DataHeader "VH" + +uint32 const EncounterCount = 3; enum Data { + // Main encounters DATA_1ST_BOSS_EVENT, DATA_2ND_BOSS_EVENT, - DATA_CYANIGOSA_EVENT, + DATA_CYANIGOSA, + + // Misc DATA_WAVE_COUNT, DATA_REMOVE_NPC, DATA_PORTAL_LOCATION, @@ -38,10 +43,8 @@ enum Data DATA_ACTIVATE_CRYSTAL, DATA_MAIN_EVENT_PHASE, DATA_DEFENSELESS, -}; -enum Data64 -{ + // Bosses DATA_MORAGG, DATA_EREKEM, DATA_EREKEM_GUARD_1, @@ -50,7 +53,8 @@ enum Data64 DATA_LAVANTHOR, DATA_XEVOZZ, DATA_ZURAMAT, - DATA_CYANIGOSA, + + // Cells DATA_MORAGG_CELL, DATA_EREKEM_CELL, DATA_EREKEM_LEFT_GUARD_CELL, @@ -59,6 +63,8 @@ enum Data64 DATA_LAVANTHOR_CELL, DATA_XEVOZZ_CELL, DATA_ZURAMAT_CELL, + + // Misc DATA_MAIN_DOOR, DATA_SINCLARI, DATA_TELEPORTATION_PORTAL, @@ -81,33 +87,50 @@ enum Bosses enum CreaturesIds { - CREATURE_TELEPORTATION_PORTAL = 31011, - CREATURE_PORTAL_GUARDIAN = 30660, - CREATURE_PORTAL_KEEPER = 30695, - CREATURE_XEVOZZ = 29266, - CREATURE_LAVANTHOR = 29312, - CREATURE_ICHORON = 29313, - CREATURE_ZURAMAT = 29314, - CREATURE_EREKEM = 29315, - CREATURE_EREKEM_GUARD = 29395, - CREATURE_MORAGG = 29316, - CREATURE_CYANIGOSA = 31134, - CREATURE_SINCLARI = 30658, - CREATURE_SABOTEOUR = 31079, - NPC_VIOLET_HOLD_GUARD = 30659, - NPC_DEFENSE_SYSTEM = 30837 + NPC_TELEPORTATION_PORTAL = 31011, + NPC_PORTAL_GUARDIAN = 30660, + NPC_PORTAL_KEEPER = 30695, + NPC_XEVOZZ = 29266, + NPC_LAVANTHOR = 29312, + NPC_ICHORON = 29313, + NPC_ZURAMAT = 29314, + NPC_EREKEM = 29315, + NPC_EREKEM_GUARD = 29395, + NPC_MORAGG = 29316, + NPC_CYANIGOSA = 31134, + NPC_SINCLARI = 30658, + NPC_SABOTEOUR = 31079, + NPC_VIOLET_HOLD_GUARD = 30659, + NPC_DEFENSE_SYSTEM = 30837, + NPC_VOID_SENTRY = 29364, + NPC_VOID_SENTRY_BALL = 29365 +}; + +enum GameObjectIds +{ + GO_MAIN_DOOR = 191723, + GO_XEVOZZ_DOOR = 191556, + GO_LAVANTHOR_DOOR = 191566, + GO_ICHORON_DOOR = 191722, + GO_ZURAMAT_DOOR = 191565, + GO_EREKEM_DOOR = 191564, + GO_EREKEM_GUARD_1_DOOR = 191563, + GO_EREKEM_GUARD_2_DOOR = 191562, + GO_MORAGG_DOOR = 191606, + GO_INTRO_ACTIVATION_CRYSTAL = 193615, + GO_ACTIVATION_CRYSTAL = 193611 }; enum WorldStateIds { - WORLD_STATE_VH = 3816, - WORLD_STATE_VH_PRISON_STATE = 3815, - WORLD_STATE_VH_WAVE_COUNT = 3810, + WORLD_STATE_VH = 3816, + WORLD_STATE_VH_PRISON_STATE = 3815, + WORLD_STATE_VH_WAVE_COUNT = 3810, }; enum Events { - EVENT_ACTIVATE_CRYSTAL = 20001 + EVENT_ACTIVATE_CRYSTAL = 20001 }; #endif 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/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/shattered_halls.cpp b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp index d31fa4c4f09..3986e50877f 100644 --- a/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp +++ b/src/server/scripts/Outland/HellfireCitadel/ShatteredHalls/shattered_halls.cpp @@ -82,7 +82,7 @@ class boss_shattered_executioner : public CreatureScript 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) 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_holiday.cpp b/src/server/scripts/Spells/spell_holiday.cpp index e6e97a9d04a..44db7605296 100644 --- a/src/server/scripts/Spells/spell_holiday.cpp +++ b/src/server/scripts/Spells/spell_holiday.cpp @@ -824,6 +824,60 @@ class spell_brewfest_barker_bunny : public SpellScriptLoader } }; +enum TorchSpells +{ + SPELL_TORCH_TOSSING_TRAINING = 45716, + SPELL_TORCH_TOSSING_PRACTICE = 46630, + SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE = 45719, + SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE = 46651, + SPELL_BRAZIERS_HIT = 45724 +}; + +// 45724 - Braziers Hit! +class spell_midsummer_braziers_hit : public SpellScriptLoader +{ + public: + spell_midsummer_braziers_hit() : SpellScriptLoader("spell_midsummer_braziers_hit") { } + + class spell_midsummer_braziers_hit_AuraScript : public AuraScript + { + PrepareAuraScript(spell_midsummer_braziers_hit_AuraScript); + + bool Validate(SpellInfo const* /*spellInfo*/) override + { + if (!sSpellMgr->GetSpellInfo(SPELL_TORCH_TOSSING_TRAINING) || !sSpellMgr->GetSpellInfo(SPELL_TORCH_TOSSING_PRACTICE)) + return false; + return true; + } + + void HandleEffectApply(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) + { + Player* player = GetTarget()->ToPlayer(); + if (!player) + return; + + if ((player->HasAura(SPELL_TORCH_TOSSING_TRAINING) && GetStackAmount() == 8) || (player->HasAura(SPELL_TORCH_TOSSING_PRACTICE) && GetStackAmount() == 20)) + { + if (player->GetTeam() == ALLIANCE) + player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_ALLIANCE, true); + else if (player->GetTeam() == HORDE) + player->CastSpell(player, SPELL_TORCH_TOSSING_TRAINING_SUCCESS_HORDE, true); + Remove(); + } + } + + void Register() override + { + AfterEffectApply += AuraEffectApplyFn(spell_midsummer_braziers_hit_AuraScript::HandleEffectApply, EFFECT_0, SPELL_AURA_DUMMY, AuraEffectHandleModes(AURA_EFFECT_HANDLE_REAPPLY)); + } + }; + + AuraScript* GetAuraScript() const override + { + return new spell_midsummer_braziers_hit_AuraScript(); + } +}; + void AddSC_holiday_spell_scripts() { // Love is in the Air @@ -850,4 +904,6 @@ void AddSC_holiday_spell_scripts() new spell_brewfest_relay_race_intro_force_player_to_throw(); new spell_brewfest_dismount_ram(); new spell_brewfest_barker_bunny(); + // Midsummer Fire Festival + new spell_midsummer_braziers_hit(); } diff --git a/src/server/scripts/Spells/spell_quest.cpp b/src/server/scripts/Spells/spell_quest.cpp index 87bd5923c8f..95a8bc8ed05 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); } } } @@ -2525,6 +2526,35 @@ class spell_q12414_hand_over_reins : public SpellScriptLoader } }; +// 13790 13793 13811 13814 - Among the Champions +// 13665 13745 13750 13756 13761 13767 13772 13777 13782 13787 - The Grand Melee +class spell_q13665_q13790_bested_trigger : public SpellScriptLoader +{ + public: + spell_q13665_q13790_bested_trigger() : SpellScriptLoader("spell_q13665_q13790_bested_trigger") { } + + class spell_q13665_q13790_bested_trigger_SpellScript : public SpellScript + { + PrepareSpellScript(spell_q13665_q13790_bested_trigger_SpellScript); + + void HandleScript(SpellEffIndex /*effIndex*/) + { + Unit* target = GetHitUnit()->GetCharmerOrOwnerOrSelf(); + target->CastSpell(target, uint32(GetEffectValue())); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_q13665_q13790_bested_trigger_SpellScript::HandleScript, EFFECT_0, SPELL_EFFECT_SCRIPT_EFFECT); + } + }; + + SpellScript* GetSpellScript() const override + { + return new spell_q13665_q13790_bested_trigger_SpellScript(); + } +}; + void AddSC_quest_spell_scripts() { new spell_q55_sacred_cleansing(); @@ -2586,4 +2616,5 @@ void AddSC_quest_spell_scripts() new spell_q28813_get_our_boys_back_dummy(); new spell_q28813_set_health_random(); new spell_q12414_hand_over_reins(); + new spell_q13665_q13790_bested_trigger(); } 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/DataStores/DB2Store.h b/src/server/shared/DataStores/DB2Store.h index c541a6651a3..b4ae20ce1da 100644 --- a/src/server/shared/DataStores/DB2Store.h +++ b/src/server/shared/DataStores/DB2Store.h @@ -181,6 +181,14 @@ public: DB2DatabaseLoader(_fileName).LoadStrings(_format, _hotfixStatement + 1, locale, _indexTable.AsChar, _stringPoolList); } + typedef bool(*SortFunc)(T const* left, T const* right); + + void Sort(SortFunc pred) + { + ASSERT(strpbrk(_format, "nd") == nullptr, "Only non-indexed storages can be sorted"); + std::sort(_indexTable.AsT, _indexTable.AsT + _indexTableSize, pred); + } + iterator begin() { return iterator(_indexTable.AsT, _indexTableSize); } iterator end() { return iterator(_indexTable.AsT, _indexTableSize, _indexTableSize); } diff --git a/src/server/shared/DataStores/DBStorageIterator.h b/src/server/shared/DataStores/DBStorageIterator.h index a34cd6677c2..767900a123e 100644 --- a/src/server/shared/DataStores/DBStorageIterator.h +++ b/src/server/shared/DataStores/DBStorageIterator.h @@ -30,9 +30,8 @@ public: { if (_pos < _end) { - do + while (_pos < _end && !_index[_pos]) ++_pos; - while (_pos < _end && !_index[_pos]); } } diff --git a/src/server/shared/Database/Implementation/CharacterDatabase.cpp b/src/server/shared/Database/Implementation/CharacterDatabase.cpp index 53fc0bba831..233ec96bab8 100644 --- a/src/server/shared/Database/Implementation/CharacterDatabase.cpp +++ b/src/server/shared/Database/Implementation/CharacterDatabase.cpp @@ -79,7 +79,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() "position_x, position_y, position_z, map, orientation, taximask, cinematic, totaltime, leveltime, rest_bonus, logout_time, is_logout_resting, resettalents_cost, " "resettalents_time, talentTree, trans_x, trans_y, trans_z, trans_o, transguid, extra_flags, stable_slots, at_login, zone, online, death_expire_time, taxi_path, dungeonDifficulty, " "totalKills, todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, " - "health, power1, power2, power3, power4, power5, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " + "health, power1, power2, power3, power4, power5, power6, instance_id, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels, raidDifficulty, legacyRaidDifficulty " "FROM characters WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_GROUP_MEMBER, "SELECT guid FROM group_member WHERE memberGuid = ?", CONNECTION_BOTH); @@ -127,7 +127,7 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_SEL_CHARACTER_EQUIPMENTSETS, "SELECT setguid, setindex, name, iconname, ignore_mask, item0, item1, item2, item3, item4, item5, item6, item7, item8, " "item9, item10, item11, item12, item13, item14, item15, item16, item17, item18 FROM character_equipmentsets WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6, glyph7, glyph8, glyph9 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); + PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6 FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT spell, talentGroup FROM character_talent WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_SKILLS, "SELECT skill, value, max FROM character_skills WHERE guid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_SEL_CHARACTER_RANDOMBG, "SELECT guid FROM character_battleground_random WHERE guid = ?", 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); @@ -404,13 +393,13 @@ void CharacterDatabaseConnection::DoPrepareStatements() "extra_flags, stable_slots, at_login, zone, " "death_expire_time, taxi_path, totalKills, " "todayKills, yesterdayKills, chosenTitle, watchedFaction, drunk, health, power1, power2, power3, " - "power4, power5, latency, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " - "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); + "power4, power5, power6, latency, talentGroupsCount, activeTalentGroup, exploredZones, equipmentCache, knownTitles, actionBars, grantableLevels) VALUES " + "(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_CHARACTER, "UPDATE characters SET name=?,race=?,class=?,gender=?,level=?,xp=?,money=?,playerBytes=?,playerBytes2=?,playerFlags=?," "map=?,instance_id=?,dungeonDifficulty=?,raidDifficulty=?,legacyRaidDifficulty=?,position_x=?,position_y=?,position_z=?,orientation=?,trans_x=?,trans_y=?,trans_z=?,trans_o=?,transguid=?,taximask=?,cinematic=?,totaltime=?,leveltime=?,rest_bonus=?," "logout_time=?,is_logout_resting=?,resettalents_cost=?,resettalents_time=?,talentTree=?,extra_flags=?,stable_slots=?,at_login=?,zone=?,death_expire_time=?,taxi_path=?," "totalKills=?,todayKills=?,yesterdayKills=?,chosenTitle=?," - "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,latency=?,talentGroupsCount=?,activeTalentGroup=?,exploredZones=?," + "watchedFaction=?,drunk=?,health=?,power1=?,power2=?,power3=?,power4=?,power5=?,power6=?,latency=?,talentGroupsCount=?,activeTalentGroup=?,exploredZones=?," "equipmentCache=?,knownTitles=?,actionBars=?,grantableLevels=?,online=? WHERE guid=?", CONNECTION_ASYNC); PrepareStatement(CHAR_UPD_ADD_AT_LOGIN_FLAG, "UPDATE characters SET at_login = at_login | ? WHERE guid = ?", CONNECTION_ASYNC); @@ -584,12 +573,12 @@ void CharacterDatabaseConnection::DoPrepareStatements() PrepareStatement(CHAR_UPD_CHAR_SKILLS, "UPDATE character_skills SET value = ?, max = ? WHERE guid = ? AND skill = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_SPELL, "INSERT INTO character_spell (guid, spell, active, disabled) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_STATS, "DELETE FROM character_stats WHERE guid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, strength, agility, stamina, intellect, spirit, " + PrepareStatement(CHAR_INS_CHAR_STATS, "INSERT INTO character_stats (guid, maxhealth, maxpower1, maxpower2, maxpower3, maxpower4, maxpower5, maxpower6, strength, agility, stamina, intellect, spirit, " "armor, resHoly, resFire, resNature, resFrost, resShadow, resArcane, blockPct, dodgePct, parryPct, critPct, rangedCritPct, spellCritPct, attackPower, rangedAttackPower, " - "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + "spellPower, resilience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_BY_OWNER, "DELETE FROM petition WHERE ownerguid = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_PETITION_SIGNATURE_BY_OWNER, "DELETE FROM petition_sign WHERE ownerguid = ?", CONNECTION_ASYNC); - PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs (guid, talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6, glyph7, glyph8, glyph9) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); + PrepareStatement(CHAR_INS_CHAR_GLYPHS, "INSERT INTO character_glyphs (guid, talentGroup, glyph1, glyph2, glyph3, glyph4, glyph5, glyph6) VALUES(?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_TALENT_BY_SPELL_SPEC, "DELETE FROM character_talent WHERE guid = ? and spell = ? and talentGroup = ?", CONNECTION_ASYNC); PrepareStatement(CHAR_INS_CHAR_TALENT, "INSERT INTO character_talent (guid, spell, talentGroup) VALUES (?, ?, ?)", CONNECTION_ASYNC); PrepareStatement(CHAR_DEL_CHAR_ACTION_EXCEPT_SPEC, "DELETE FROM character_action WHERE spec<>? AND guid = ?", 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/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 e50cf42e439..e9f888f280d 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.cpp +++ b/src/server/shared/Debugging/WheatyExceptionReport.cpp @@ -62,6 +62,8 @@ 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; @@ -74,6 +76,7 @@ WheatyExceptionReport::WheatyExceptionReport() // Constructor m_previousFilter = SetUnhandledExceptionFilter(WheatyUnhandledExceptionFilter); m_hProcess = GetCurrentProcess(); stackOverflowException = false; + alreadyCrashed = false; if (!IsDebuggerPresent()) { _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE); @@ -99,6 +102,13 @@ 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; diff --git a/src/server/shared/Debugging/WheatyExceptionReport.h b/src/server/shared/Debugging/WheatyExceptionReport.h index 101b6187f2b..ef6334add16 100644 --- a/src/server/shared/Debugging/WheatyExceptionReport.h +++ b/src/server/shared/Debugging/WheatyExceptionReport.h @@ -194,6 +194,8 @@ class WheatyExceptionReport 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/Threading/ProducerConsumerQueue.h b/src/server/shared/Threading/ProducerConsumerQueue.h index 3158e3deb24..223f5109545 100644 --- a/src/server/shared/Threading/ProducerConsumerQueue.h +++ b/src/server/shared/Threading/ProducerConsumerQueue.h @@ -70,7 +70,8 @@ public: { std::unique_lock<std::mutex> lock(_queueLock); - // we could be using .wait(lock, predicate) overload here but some threading error analysis tools produce false positives + // we could be using .wait(lock, predicate) overload here but it is broken + // https://connect.microsoft.com/VisualStudio/feedback/details/1098841 while (_queue.empty() && !_shutdown) _condition.wait(lock); diff --git a/src/server/shared/Updater/DBUpdater.cpp b/src/server/shared/Updater/DBUpdater.cpp index c74b8ef868e..9e3bae11610 100644 --- a/src/server/shared/Updater/DBUpdater.cpp +++ b/src/server/shared/Updater/DBUpdater.cpp @@ -383,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/Utilities/TaskScheduler.cpp b/src/server/shared/Utilities/TaskScheduler.cpp index 04a4071d1f5..801cc96cf77 100644 --- a/src/server/shared/Utilities/TaskScheduler.cpp +++ b/src/server/shared/Utilities/TaskScheduler.cpp @@ -89,9 +89,6 @@ void TaskScheduler::Dispatch(success_t const& callback) return; } - if (_task_holder.IsEmpty()) - return; - while (!_task_holder.IsEmpty()) { if (_task_holder.First()->_end > _now) diff --git a/src/server/worldserver/Main.cpp b/src/server/worldserver/Main.cpp index e39ccb3c98f..e09f28d416f 100644 --- a/src/server/worldserver/Main.cpp +++ b/src/server/worldserver/Main.cpp @@ -105,8 +105,8 @@ 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 @@ -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 @@ -622,6 +623,10 @@ variables_map GetConsoleArguments(int argc, char** argv, std::string& configFile { 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", |