diff options
author | Ovahlord <dreadkiller@gmx.de> | 2024-09-01 06:52:54 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-09-01 06:52:54 +0200 |
commit | b5e681e682de50edaa98a3c619675477cf28b8d3 (patch) | |
tree | f7b8257d8456d469a532e5835e1c5ced8d262453 /src | |
parent | b0f12aeceb33799fb934bb42eb58374dc8642479 (diff) |
Core/Misc: removed most retail specialization code and restored legacy functionality for Classic
Diffstat (limited to 'src')
43 files changed, 346 insertions, 982 deletions
diff --git a/src/server/database/Database/Implementation/HotfixDatabase.cpp b/src/server/database/Database/Implementation/HotfixDatabase.cpp index 12d7043f343..d8659e8b827 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.cpp +++ b/src/server/database/Database/Implementation/HotfixDatabase.cpp @@ -276,14 +276,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() "LoreNameFemale_lang, LoreNameLower_lang, LoreNameLowerFemale_lang, LoreDescription_lang, ShortName_lang, ShortNameFemale_lang, " "ShortNameLower_lang, ShortNameLowerFemale_lang FROM chr_races_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); - // ChrSpecialization.db2 - PrepareStatement(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT Name, FemaleName, Description, ID, ClassID, OrderIndex, PetTalentType, Role, Flags, " - "SpellIconFileID, PrimaryStatPriority, AnimReplacements, MasterySpellID1, MasterySpellID2 FROM chr_specialization" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT MAX(ID) + 1 FROM chr_specialization", CONNECTION_SYNCH); - PREPARE_LOCALE_STMT(HOTFIX_SEL_CHR_SPECIALIZATION, "SELECT ID, Name_lang, FemaleName_lang, Description_lang FROM chr_specialization_locale" - " WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); - // CinematicCamera.db2 PrepareStatement(HOTFIX_SEL_CINEMATIC_CAMERA, "SELECT ID, OriginX, OriginY, OriginZ, SoundID, OriginFacing, FileDataID FROM cinematic_camera" " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); @@ -773,15 +765,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() PREPARE_LOCALE_STMT(HOTFIX_SEL_ITEM_SPARSE, "SELECT ID, Description_lang, Display3_lang, Display2_lang, Display1_lang, Display_lang" " FROM item_sparse_locale WHERE (`VerifiedBuild` > 0) = ? AND locale = ?", CONNECTION_SYNCH); - // ItemSpec.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPEC, "SELECT ID, MinLevel, MaxLevel, ItemType, PrimaryStat, SecondaryStat, SpecializationID FROM item_spec" - " WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_SPEC, "SELECT MAX(ID) + 1 FROM item_spec", CONNECTION_SYNCH); - - // ItemSpecOverride.db2 - PrepareStatement(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT ID, SpecID, ItemID FROM item_spec_override WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_SPEC_OVERRIDE, "SELECT MAX(ID) + 1 FROM item_spec_override", CONNECTION_SYNCH); - // ItemXBonusTree.db2 PrepareStatement(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT ID, ItemBonusTreeID, ItemID FROM item_x_bonus_tree WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_ITEM_X_BONUS_TREE, "SELECT MAX(ID) + 1 FROM item_x_bonus_tree", CONNECTION_SYNCH); @@ -1172,10 +1155,6 @@ void HotfixDatabaseConnection::DoPrepareStatements() "SoundMixGroupID FROM sound_kit WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); PREPARE_MAX_ID_STMT(HOTFIX_SEL_SOUND_KIT, "SELECT MAX(ID) + 1 FROM sound_kit", CONNECTION_SYNCH); - // SpecSetMember.db2 - PrepareStatement(HOTFIX_SEL_SPEC_SET_MEMBER, "SELECT ID, ChrSpecializationID, SpecSetID FROM spec_set_member WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); - PREPARE_MAX_ID_STMT(HOTFIX_SEL_SPEC_SET_MEMBER, "SELECT MAX(ID) + 1 FROM spec_set_member", CONNECTION_SYNCH); - // SpellAuraOptions.db2 PrepareStatement(HOTFIX_SEL_SPELL_AURA_OPTIONS, "SELECT ID, DifficultyID, CumulativeAura, ProcCategoryRecovery, ProcChance, ProcCharges, " "SpellProcsPerMinuteID, ProcTypeMask1, ProcTypeMask2, SpellID FROM spell_aura_options WHERE (`VerifiedBuild` > 0) = ?", CONNECTION_SYNCH); diff --git a/src/server/database/Database/Implementation/HotfixDatabase.h b/src/server/database/Database/Implementation/HotfixDatabase.h index 6522333411d..333e192d9af 100644 --- a/src/server/database/Database/Implementation/HotfixDatabase.h +++ b/src/server/database/Database/Implementation/HotfixDatabase.h @@ -163,10 +163,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_CHR_RACES_MAX_ID, HOTFIX_SEL_CHR_RACES_LOCALE, - HOTFIX_SEL_CHR_SPECIALIZATION, - HOTFIX_SEL_CHR_SPECIALIZATION_MAX_ID, - HOTFIX_SEL_CHR_SPECIALIZATION_LOCALE, - HOTFIX_SEL_CINEMATIC_CAMERA, HOTFIX_SEL_CINEMATIC_CAMERA_MAX_ID, @@ -441,12 +437,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_ITEM_SPARSE_MAX_ID, HOTFIX_SEL_ITEM_SPARSE_LOCALE, - HOTFIX_SEL_ITEM_SPEC, - HOTFIX_SEL_ITEM_SPEC_MAX_ID, - - HOTFIX_SEL_ITEM_SPEC_OVERRIDE, - HOTFIX_SEL_ITEM_SPEC_OVERRIDE_MAX_ID, - HOTFIX_SEL_ITEM_X_BONUS_TREE, HOTFIX_SEL_ITEM_X_BONUS_TREE_MAX_ID, @@ -679,9 +669,6 @@ enum HotfixDatabaseStatements : uint32 HOTFIX_SEL_SOUND_KIT, HOTFIX_SEL_SOUND_KIT_MAX_ID, - HOTFIX_SEL_SPEC_SET_MEMBER, - HOTFIX_SEL_SPEC_SET_MEMBER_MAX_ID, - HOTFIX_SEL_SPELL_AURA_OPTIONS, HOTFIX_SEL_SPELL_AURA_OPTIONS_MAX_ID, diff --git a/src/server/game/AI/PlayerAI/PlayerAI.cpp b/src/server/game/AI/PlayerAI/PlayerAI.cpp index bfa4ea84f96..d4aa01e1a54 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.cpp +++ b/src/server/game/AI/PlayerAI/PlayerAI.cpp @@ -16,6 +16,7 @@ */ #include "PlayerAI.h" +#include "CommonHelpers.h" #include "Creature.h" #include "Item.h" #include "Map.h" @@ -393,9 +394,9 @@ enum Spells }; PlayerAI::PlayerAI(Player* player) : UnitAI(player), me(player), - _selfSpec(player->GetPrimarySpecialization()), - _isSelfHealer(PlayerAI::IsPlayerHealer(player)), - _isSelfRangedAttacker(PlayerAI::IsPlayerRangedAttacker(player)) + _selfSpec(Trinity::Helpers::Entity::GetPlayerSpecialization(player)), + _isSelfHealer(Trinity::Helpers::Entity::IsPlayerHealer(player)), + _isSelfRangedAttacker(Trinity::Helpers::Entity::IsPlayerRangedAttacker(player)) { } @@ -406,27 +407,19 @@ Creature* PlayerAI::GetCharmer() const return nullptr; } -ChrSpecialization PlayerAI::GetSpec(Player const* who /*= nullptr*/) const +uint8 PlayerAI::GetSpec(Player const* who) const { - return (!who || who == me) ? _selfSpec : who->GetPrimarySpecialization(); + return (!who || who == me) ? _selfSpec : Trinity::Helpers::Entity::GetPlayerSpecialization(who); } -bool PlayerAI::IsPlayerHealer(Player const* who) +bool PlayerAI::IsHealer(Player const* who) const { - if (!who) - return false; - - ChrSpecializationEntry const* chrSpec = who->GetPrimarySpecializationEntry(); - return chrSpec && chrSpec->GetRole() == ChrSpecializationRole::Healer; + return (!who || who == me) ? _isSelfHealer : Trinity::Helpers::Entity::IsPlayerHealer(who); } -bool PlayerAI::IsPlayerRangedAttacker(Player const* who) +bool PlayerAI::IsRangedAttacker(Player const* who) const { - if (!who) - return false; - - ChrSpecializationEntry const* chrSpec = who->GetPrimarySpecializationEntry(); - return chrSpec && chrSpec->GetFlags().HasFlag(ChrSpecializationFlag::Ranged); + return (!who || who == me) ? _isSelfRangedAttacker : Trinity::Helpers::Entity::IsPlayerRangedAttacker(who); } PlayerAI::TargetedSpell PlayerAI::VerifySpellCast(uint32 spellId, Unit* target) @@ -655,8 +648,8 @@ Unit* SimpleCharmedPlayerAI::SelectAttackTarget() const PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() { PossibleSpellVector spells; - /* - switch (me->getClass()) + + switch (me->GetClass()) { case CLASS_WARRIOR: if (!me->IsWithinMeleeRange(me->GetVictim())) @@ -674,7 +667,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_BLOODRAGE, TARGET_NONE, 5); switch (GetSpec()) { - case TALENT_SPEC_WARRIOR_PROTECTION: + case SPEC_WARRIOR_PROTECTION: VerifyAndPushSpellCast(spells, SPELL_SHOCKWAVE, TARGET_VICTIM, 3); VerifyAndPushSpellCast(spells, SPELL_CONCUSSION_BLOW, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_DISARM, TARGET_VICTIM, 2); @@ -688,7 +681,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_THUNDER_CLAP, TARGET_VICTIM, 2); VerifyAndPushSpellCast(spells, SPELL_DEMO_SHOUT, TARGET_VICTIM, 1); break; - case TALENT_SPEC_WARRIOR_ARMS: + case SPEC_WARRIOR_ARMS: VerifyAndPushSpellCast(spells, SPELL_SWEEPING_STRIKES, TARGET_NONE, 2); VerifyAndPushSpellCast(spells, SPELL_MORTAL_STRIKE, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_BLADESTORM, TARGET_NONE, 10); @@ -699,7 +692,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_THUNDER_CLAP, TARGET_VICTIM, 1); VerifyAndPushSpellCast(spells, SPELL_EXECUTE, TARGET_VICTIM, 15); break; - case TALENT_SPEC_WARRIOR_FURY: + case SPEC_WARRIOR_FURY: VerifyAndPushSpellCast(spells, SPELL_DEATH_WISH, TARGET_NONE, 10); VerifyAndPushSpellCast(spells, SPELL_BLOODTHIRST, TARGET_VICTIM, 4); VerifyAndPushSpellCast(spells, SPELL_DEMO_SHOUT, TARGET_VICTIM, 2); @@ -711,7 +704,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() } break; case CLASS_PALADIN: - VerifyAndPushSpellCast(spells, SPELL_AURA_MASTERY, TARGET_NONE, 3); + //VerifyAndPushSpellCast(spells, SPELL_AURA_MASTERY_PALADIN, TARGET_NONE, 3); VerifyAndPushSpellCast(spells, SPELL_LAY_ON_HANDS, TARGET_CHARMER, 8); VerifyAndPushSpellCast(spells, SPELL_BLESSING_OF_MIGHT, TARGET_CHARMER, 8); VerifyAndPushSpellCast(spells, SPELL_AVENGING_WRATH, TARGET_NONE, 5); @@ -730,7 +723,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() switch (GetSpec()) { - case TALENT_SPEC_PALADIN_PROTECTION: + case SPEC_PALADIN_PROTECTION: VerifyAndPushSpellCast(spells, SPELL_HAMMER_OF_RIGHTEOUS, TARGET_VICTIM, 3); VerifyAndPushSpellCast(spells, SPELL_DIVINE_SACRIFICE, TARGET_NONE, 2); VerifyAndPushSpellCast(spells, SPELL_SHIELD_OF_RIGHTEOUS, TARGET_VICTIM, 4); @@ -738,7 +731,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_CONSECRATION, TARGET_VICTIM, 2); VerifyAndPushSpellCast(spells, SPELL_HOLY_SHIELD, TARGET_NONE, 1); break; - case TALENT_SPEC_PALADIN_HOLY: + case SPEC_PALADIN_HOLY: VerifyAndPushSpellCast(spells, SPELL_HOLY_SHOCK, TARGET_CHARMER, 3); VerifyAndPushSpellCast(spells, SPELL_HOLY_SHOCK, TARGET_VICTIM, 1); VerifyAndPushSpellCast(spells, SPELL_FLASH_OF_LIGHT, TARGET_CHARMER, 4); @@ -746,7 +739,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_DIVINE_FAVOR, TARGET_NONE, 5); VerifyAndPushSpellCast(spells, SPELL_DIVINE_ILLUMINATION, TARGET_NONE, 3); break; - case TALENT_SPEC_PALADIN_RETRIBUTION: + case SPEC_PALADIN_RETRIBUTION: VerifyAndPushSpellCast(spells, SPELL_CRUSADER_STRIKE, TARGET_VICTIM, 4); VerifyAndPushSpellCast(spells, SPELL_DIVINE_STORM, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_JUDGEMENT, TARGET_VICTIM, 3); @@ -766,13 +759,13 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() switch (GetSpec()) { - case TALENT_SPEC_HUNTER_BEASTMASTER: + case SPEC_HUNTER_BEAST_MASTERY: VerifyAndPushSpellCast(spells, SPELL_AIMED_SHOT, TARGET_VICTIM, 2); VerifyAndPushSpellCast(spells, SPELL_ARCANE_SHOT, TARGET_VICTIM, 3); VerifyAndPushSpellCast(spells, SPELL_STEADY_SHOT, TARGET_VICTIM, 2); VerifyAndPushSpellCast(spells, SPELL_MULTI_SHOT, TARGET_VICTIM, 2); break; - case TALENT_SPEC_HUNTER_MARKSMAN: + case SPEC_HUNTER_MARKSMANSHIP: VerifyAndPushSpellCast(spells, SPELL_AIMED_SHOT, TARGET_VICTIM, 2); VerifyAndPushSpellCast(spells, SPELL_CHIMERA_SHOT, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_ARCANE_SHOT, TARGET_VICTIM, 3); @@ -780,7 +773,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_READINESS, TARGET_NONE, 10); VerifyAndPushSpellCast(spells, SPELL_SILENCING_SHOT, TARGET_VICTIM, 5); break; - case TALENT_SPEC_HUNTER_SURVIVAL: + case SPEC_HUNTER_SURVIVAL: VerifyAndPushSpellCast(spells, SPELL_EXPLOSIVE_SHOT, TARGET_VICTIM, 8); VerifyAndPushSpellCast(spells, SPELL_BLACK_ARROW, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_MULTI_SHOT, TARGET_VICTIM, 3); @@ -799,17 +792,17 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() uint32 builder = 0, finisher = 0; switch (GetSpec()) { - case TALENT_SPEC_ROGUE_ASSASSINATION: + case SPEC_ROGUE_ASSASSINATION: builder = SPELL_MUTILATE, finisher = SPELL_ENVENOM; VerifyAndPushSpellCast(spells, SPELL_COLD_BLOOD, TARGET_NONE, 20); break; - case TALENT_SPEC_ROGUE_COMBAT: + case SPEC_ROGUE_COMBAT: builder = SPELL_SINISTER_STRIKE, finisher = SPELL_EVISCERATE; VerifyAndPushSpellCast(spells, SPELL_ADRENALINE_RUSH, TARGET_NONE, 6); VerifyAndPushSpellCast(spells, SPELL_BLADE_FLURRY, TARGET_NONE, 5); VerifyAndPushSpellCast(spells, SPELL_KILLING_SPREE, TARGET_NONE, 25); break; - case TALENT_SPEC_ROGUE_SUBTLETY: + case SPEC_ROGUE_SUBLETY: builder = SPELL_HEMORRHAGE, finisher = SPELL_EVISCERATE; VerifyAndPushSpellCast(spells, SPELL_PREPARATION, TARGET_NONE, 10); if (!me->IsWithinMeleeRange(me->GetVictim())) @@ -823,7 +816,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() if (victim->HasUnitState(UNIT_STATE_CASTING)) VerifyAndPushSpellCast(spells, SPELL_KICK, TARGET_VICTIM, 25); - uint8 const cp = me->GetPower(POWER_COMBO_POINTS); + uint8 const cp = (me->GetComboTarget() == victim->GetGUID()) ? me->GetPower(POWER_COMBO_POINTS) : 0; if (cp >= 4) VerifyAndPushSpellCast(spells, finisher, TARGET_VICTIM, 10); if (cp <= 4) @@ -842,7 +835,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_PSYCHIC_SCREAM, TARGET_VICTIM, 3); switch (GetSpec()) { - case TALENT_SPEC_PRIEST_DISCIPLINE: + case SPEC_PRIEST_DISCIPLINE: VerifyAndPushSpellCast(spells, SPELL_POWER_WORD_SHIELD, TARGET_CHARMER, 3); VerifyAndPushSpellCast(spells, SPELL_INNER_FOCUS, TARGET_NONE, 3); VerifyAndPushSpellCast(spells, SPELL_PAIN_SUPPRESSION, TARGET_CHARMER, 15); @@ -850,13 +843,13 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_PENANCE, TARGET_CHARMER, 3); VerifyAndPushSpellCast(spells, SPELL_FLASH_HEAL, TARGET_CHARMER, 1); break; - case TALENT_SPEC_PRIEST_HOLY: + case SPEC_PRIEST_HOLY: VerifyAndPushSpellCast(spells, SPELL_DESPERATE_PRAYER, TARGET_NONE, 3); VerifyAndPushSpellCast(spells, SPELL_GUARDIAN_SPIRIT, TARGET_CHARMER, 5); VerifyAndPushSpellCast(spells, SPELL_FLASH_HEAL, TARGET_CHARMER, 1); VerifyAndPushSpellCast(spells, SPELL_RENEW, TARGET_CHARMER, 3); break; - case TALENT_SPEC_PRIEST_SHADOW: + case SPEC_PRIEST_SHADOW: if (!me->HasAura(SPELL_SHADOWFORM)) { VerifyAndPushSpellCast(spells, SPELL_SHADOWFORM, TARGET_NONE, 100); @@ -902,7 +895,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() } switch (GetSpec()) { - case TALENT_SPEC_DEATHKNIGHT_BLOOD: + case SPEC_DEATH_KNIGHT_BLOOD: VerifyAndPushSpellCast(spells, SPELL_RUNE_TAP, TARGET_NONE, 2); VerifyAndPushSpellCast(spells, SPELL_HYSTERIA, TARGET_SELF, 5); if (Creature* creatureCharmer = GetCharmer()) @@ -915,7 +908,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_MARK_OF_BLOOD, TARGET_VICTIM, 20); VerifyAndPushSpellCast(spells, SPELL_VAMPIRIC_BLOOD, TARGET_NONE, 10); break; - case TALENT_SPEC_DEATHKNIGHT_FROST: + case SPEC_DEATH_KNIGHT_FROST: if (hasFF && hasBP) VerifyAndPushSpellCast(spells, SPELL_OBLITERATE, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_HOWLING_BLAST, TARGET_VICTIM, 2); @@ -924,7 +917,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_FROST_STRIKE, TARGET_VICTIM, 3); VerifyAndPushSpellCast(spells, SPELL_BLOOD_STRIKE, TARGET_VICTIM, 1); break; - case TALENT_SPEC_DEATHKNIGHT_UNHOLY: + case SPEC_DEATH_KNIGHT_UNHOLY: if (hasFF && hasBP) VerifyAndPushSpellCast(spells, SPELL_SCOURGE_STRIKE, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_DEATH_AND_DECAY, TARGET_VICTIM, 2); @@ -942,7 +935,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_GROUNDING_TOTEM, TARGET_NONE, 2); switch (GetSpec()) { - case TALENT_SPEC_SHAMAN_RESTORATION: + case SPEC_SHAMAN_RESTORATION: if (Unit* charmer = me->GetCharmer()) if (!charmer->GetAuraApplicationOfRankedSpell(SPELL_EARTH_SHIELD, me->GetGUID())) VerifyAndPushSpellCast(spells, SPELL_EARTH_SHIELD, charmer, 2); @@ -954,7 +947,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_SHA_NATURE_SWIFT, TARGET_NONE, 4); VerifyAndPushSpellCast(spells, SPELL_MANA_TIDE_TOTEM, TARGET_NONE, 3); break; - case TALENT_SPEC_SHAMAN_ELEMENTAL: + case SPEC_SHAMAN_ELEMENTAL: if (Unit* victim = me->GetVictim()) { if (victim->GetAuraOfRankedSpell(SPELL_FLAME_SHOCK, GetGUID())) @@ -967,7 +960,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_ELEMENTAL_MASTERY, TARGET_VICTIM, 5); VerifyAndPushSpellCast(spells, SPELL_THUNDERSTORM, TARGET_NONE, 3); break; - case TALENT_SPEC_SHAMAN_ENHANCEMENT: + case SPEC_SHAMAN_ENHANCEMENT: if (Aura const* maelstrom = me->GetAura(AURA_MAELSTROM_WEAPON)) if (maelstrom->GetStackAmount() == 5) VerifyAndPushSpellCast(spells, SPELL_LIGHTNING_BOLT, TARGET_VICTIM, 5); @@ -990,7 +983,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_ICY_VEINS, TARGET_NONE, 3); switch (GetSpec()) { - case TALENT_SPEC_MAGE_ARCANE: + case SPEC_MAGE_ARCANE: if (Aura* abAura = me->GetAura(AURA_ARCANE_BLAST)) if (abAura->GetStackAmount() >= 3) VerifyAndPushSpellCast(spells, SPELL_ARCANE_MISSILES, TARGET_VICTIM, 7); @@ -999,7 +992,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_ARCANE_POWER, TARGET_NONE, 8); VerifyAndPushSpellCast(spells, SPELL_PRESENCE_OF_MIND, TARGET_NONE, 7); break; - case TALENT_SPEC_MAGE_FIRE: + case SPEC_MAGE_FIRE: if (me->GetVictim() && !me->GetVictim()->GetAuraApplicationOfRankedSpell(SPELL_LIVING_BOMB)) VerifyAndPushSpellCast(spells, SPELL_LIVING_BOMB, TARGET_VICTIM, 3); VerifyAndPushSpellCast(spells, SPELL_COMBUSTION, TARGET_VICTIM, 3); @@ -1008,7 +1001,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_DRAGONS_BREATH, TARGET_VICTIM, 2); VerifyAndPushSpellCast(spells, SPELL_BLAST_WAVE, TARGET_VICTIM, 1); break; - case TALENT_SPEC_MAGE_FROST: + case SPEC_MAGE_FROST: VerifyAndPushSpellCast(spells, SPELL_DEEP_FREEZE, TARGET_VICTIM, 10); VerifyAndPushSpellCast(spells, SPELL_FROST_NOVA, TARGET_VICTIM, 3); VerifyAndPushSpellCast(spells, SPELL_FROSTBOLT, TARGET_VICTIM, 3); @@ -1027,7 +1020,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_CORRUPTION, TARGET_VICTIM, 10); switch (GetSpec()) { - case TALENT_SPEC_WARLOCK_AFFLICTION: + case SPEC_WARLOCK_AFFLICTION: if (Unit* victim = me->GetVictim()) { VerifyAndPushSpellCast(spells, SPELL_SHADOW_BOLT, TARGET_VICTIM, 7); @@ -1041,7 +1034,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_DRAIN_SOUL, TARGET_VICTIM, 100); } break; - case TALENT_SPEC_WARLOCK_DEMONOLOGY: + case SPEC_WARLOCK_DEMONOLOGY: VerifyAndPushSpellCast(spells, SPELL_METAMORPHOSIS, TARGET_NONE, 15); VerifyAndPushSpellCast(spells, SPELL_SHADOW_BOLT, TARGET_VICTIM, 7); if (me->HasAura(AURA_DECIMATION)) @@ -1057,7 +1050,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() if (me->HasAura(AURA_MOLTEN_CORE)) VerifyAndPushSpellCast(spells, SPELL_INCINERATE, TARGET_VICTIM, 10); break; - case TALENT_SPEC_WARLOCK_DESTRUCTION: + case SPEC_WARLOCK_DESTRUCTION: if (me->GetVictim() && !me->GetVictim()->GetAuraApplicationOfRankedSpell(SPELL_IMMOLATE, me->GetGUID())) VerifyAndPushSpellCast(spells, SPELL_IMMOLATE, TARGET_VICTIM, 8); if (me->GetVictim() && me->GetVictim()->GetAuraApplicationOfRankedSpell(SPELL_IMMOLATE, me->GetGUID())) @@ -1069,21 +1062,12 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() break; } break; - case CLASS_MONK: - switch (GetSpec()) - { - case TALENT_SPEC_MONK_BREWMASTER: - case TALENT_SPEC_MONK_BATTLEDANCER: - case TALENT_SPEC_MONK_MISTWEAVER: - break; - } - break; case CLASS_DRUID: VerifyAndPushSpellCast(spells, SPELL_INNERVATE, TARGET_CHARMER, 5); VerifyAndPushSpellCast(spells, SPELL_BARKSKIN, TARGET_NONE, 5); switch (GetSpec()) { - case TALENT_SPEC_DRUID_RESTORATION: + case SPEC_DRUID_RESTORATION: if (!me->HasAura(SPELL_TREE_OF_LIFE)) { CancelAllShapeshifts(); @@ -1112,7 +1096,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_HEALING_TOUCH, creatureCharmer, 100); } break; - case TALENT_SPEC_DRUID_BALANCE: + case SPEC_DRUID_BALANCE: { if (!me->HasAura(SPELL_MOONKIN_FORM)) { @@ -1131,8 +1115,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_TYPHOON, TARGET_NONE, 15); break; } - case TALENT_SPEC_DRUID_CAT: - case TALENT_SPEC_DRUID_BEAR: + case SPEC_DRUID_FERAL: if (!me->HasAura(SPELL_CAT_FORM)) { CancelAllShapeshifts(); @@ -1145,7 +1128,7 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() VerifyAndPushSpellCast(spells, SPELL_DASH, TARGET_NONE, 5); if (Unit* victim = me->GetVictim()) { - uint8 const cp = me->GetPower(POWER_COMBO_POINTS); + uint8 const cp = (me->GetComboTarget() == victim->GetGUID()) ? me->GetPower(POWER_COMBO_POINTS) : 0; if (victim->HasUnitState(UNIT_STATE_CASTING) && cp >= 1) VerifyAndPushSpellCast(spells, SPELL_MAIM, TARGET_VICTIM, 25); if (!me->IsWithinMeleeRange(victim)) @@ -1165,16 +1148,8 @@ PlayerAI::TargetedSpell SimpleCharmedPlayerAI::SelectAppropriateCastForSpec() break; } break; - case CLASS_DEMON_HUNTER: - switch (GetSpec()) - { - case TALENT_SPEC_DEMON_HUNTER_HAVOC: - case TALENT_SPEC_DEMON_HUNTER_VENGEANCE: - break; - } - break; } - */ + return SelectSpellCast(spells); } diff --git a/src/server/game/AI/PlayerAI/PlayerAI.h b/src/server/game/AI/PlayerAI/PlayerAI.h index 39d53727303..4b393fc8727 100644 --- a/src/server/game/AI/PlayerAI/PlayerAI.h +++ b/src/server/game/AI/PlayerAI/PlayerAI.h @@ -18,11 +18,13 @@ #ifndef TRINITY_PLAYERAI_H #define TRINITY_PLAYERAI_H +#include "Common.h" #include "UnitAI.h" class Creature; +class Player; class Spell; -enum class ChrSpecialization : uint32; +class Unit; class TC_GAME_API PlayerAI : public UnitAI { @@ -32,11 +34,10 @@ class TC_GAME_API PlayerAI : public UnitAI Creature* GetCharmer() const; // helper functions to determine player info - ChrSpecialization GetSpec(Player const* who = nullptr) const; - static bool IsPlayerHealer(Player const* who); - bool IsHealer(Player const* who = nullptr) const { return (!who || who == me) ? _isSelfHealer : IsPlayerHealer(who); } - static bool IsPlayerRangedAttacker(Player const* who); - bool IsRangedAttacker(Player const* who = nullptr) const { return (!who || who == me) ? _isSelfRangedAttacker : IsPlayerRangedAttacker(who); } + // Return values range from 0 (left-most spec) to 2 (right-most spec). If two specs have the same number of talent points, the left-most of those specs is returned. + uint8 GetSpec(Player const* who = nullptr) const; + bool IsHealer(Player const* who = nullptr) const; + bool IsRangedAttacker(Player const* who = nullptr) const; protected: struct TargetedSpell : public std::pair<Spell*, Unit*> @@ -86,7 +87,7 @@ class TC_GAME_API PlayerAI : public UnitAI void CancelAllShapeshifts(); private: - ChrSpecialization const _selfSpec; + uint8 const _selfSpec; bool const _isSelfHealer; bool _isSelfRangedAttacker; }; diff --git a/src/server/game/Achievements/CriteriaHandler.cpp b/src/server/game/Achievements/CriteriaHandler.cpp index 72b1c2419d3..9b661b6409d 100644 --- a/src/server/game/Achievements/CriteriaHandler.cpp +++ b/src/server/game/Achievements/CriteriaHandler.cpp @@ -2927,12 +2927,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; break; case ModifierTreeType::PlayerLootSpecializationMatchesRole: // 263 - { - ChrSpecializationEntry const* spec = referencePlayer->GetPrimarySpecializationEntry(); - if (!spec || spec->Role != int32(reqValue)) - return false; - break; - } + return false; case ModifierTreeType::PlayerIsAtMaxExpansionLevel: // 264 if (!referencePlayer->IsMaxLevel()) return false; @@ -3023,9 +3018,7 @@ bool CriteriaHandler::ModifierSatisfied(ModifierTreeEntry const* modifier, uint6 return false; } case ModifierTreeType::PlayerSpecialization: // 279 - if (referencePlayer->GetPrimarySpecialization() != ChrSpecialization(reqValue)) - return false; - break; + return false; case ModifierTreeType::PlayerMapOrCosmeticChildMap: // 280 { MapEntry const* map = referencePlayer->GetMap()->GetEntry(); diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp index fd145cab934..17f3abefdd5 100644 --- a/src/server/game/Battlegrounds/Battleground.cpp +++ b/src/server/game/Battlegrounds/Battleground.cpp @@ -1263,7 +1263,7 @@ void Battleground::BuildPvPLogDataPacket(WorldPackets::Battleground::PVPMatchSta score.second->BuildPvPLogPlayerDataPacket(playerData); playerData.IsInWorld = true; - playerData.PrimaryTalentTree = AsUnderlyingType(player->GetPrimarySpecialization()); + playerData.PrimaryTalentTree = player->GetPrimaryTalentTree(); playerData.Sex = player->GetGender(); playerData.Race = player->GetRace(); playerData.Class = player->GetClass(); diff --git a/src/server/game/Chat/HyperlinkTags.cpp b/src/server/game/Chat/HyperlinkTags.cpp index 43727f98d61..2459d9ba6e6 100644 --- a/src/server/game/Chat/HyperlinkTags.cpp +++ b/src/server/game/Chat/HyperlinkTags.cpp @@ -368,19 +368,6 @@ bool Trinity::Hyperlinks::LinkTags::talent::StoreTo(TalentEntry const*& val, std return true; } -bool Trinity::Hyperlinks::LinkTags::talentbuild::StoreTo(TalentBuildLinkData& val, std::string_view text) -{ - HyperlinkDataTokenizer t(text); - uint32 chrSpecializationId; - if (!t.TryConsumeTo(chrSpecializationId)) - return false; - if (!(val.Spec = sChrSpecializationStore.LookupEntry(chrSpecializationId))) - return false; - if (!t.TryConsumeTo(val.Level) || !t.TryConsumeTo(val.ImportString)) - return false; - return true; -} - bool Trinity::Hyperlinks::LinkTags::trade::StoreTo(TradeskillLinkData& val, std::string_view text) { HyperlinkDataTokenizer t(text); diff --git a/src/server/game/Chat/Hyperlinks.cpp b/src/server/game/Chat/Hyperlinks.cpp index 88a2374740e..30359d25b00 100644 --- a/src/server/game/Chat/Hyperlinks.cpp +++ b/src/server/game/Chat/Hyperlinks.cpp @@ -566,7 +566,6 @@ static bool ValidateLinkInfo(HyperlinkInfo const& info) TryValidateAs(skill); TryValidateAs(spell); TryValidateAs(talent); - TryValidateAs(talentbuild); TryValidateAs(taxinode); TryValidateAs(tele); TryValidateAs(title); diff --git a/src/server/game/Chat/Hyperlinks.h b/src/server/game/Chat/Hyperlinks.h index e66211ced1f..0701b330a0b 100644 --- a/src/server/game/Chat/Hyperlinks.h +++ b/src/server/game/Chat/Hyperlinks.h @@ -27,7 +27,6 @@ struct AchievementEntry; struct BattlePetAbilityEntry; struct BattlePetSpeciesEntry; -struct ChrSpecializationEntry; struct CurrencyContainerEntry; struct CurrencyTypesEntry; struct GlyphPropertiesEntry; @@ -191,13 +190,6 @@ namespace Trinity::Hyperlinks GlyphPropertiesEntry const* Glyph = nullptr; }; - struct TalentBuildLinkData - { - ChrSpecializationEntry const* Spec = nullptr; - uint32 Level = 0; - std::string_view ImportString; - }; - struct TradeskillLinkData { ObjectGuid Owner; @@ -393,13 +385,6 @@ namespace Trinity::Hyperlinks static bool StoreTo(TalentEntry const*& val, std::string_view text); }; - struct TC_GAME_API talentbuild - { - using value_type = TalentBuildLinkData const&; - static constexpr std::string_view tag() { return "talentbuild"; } - static bool StoreTo(TalentBuildLinkData& val, std::string_view text); - }; - struct TC_GAME_API trade { using value_type = TradeskillLinkData const&; diff --git a/src/server/game/Conditions/ConditionMgr.cpp b/src/server/game/Conditions/ConditionMgr.cpp index 0f08790bac1..7cd75eb0f0c 100644 --- a/src/server/game/Conditions/ConditionMgr.cpp +++ b/src/server/game/Conditions/ConditionMgr.cpp @@ -2811,18 +2811,6 @@ bool ConditionMgr::IsPlayerMeetingCondition(Player const* player, PlayerConditio return false; } - if (condition->ChrSpecializationIndex >= 0 || condition->ChrSpecializationRole >= 0) - { - if (ChrSpecializationEntry const* spec = sChrSpecializationStore.LookupEntry(AsUnderlyingType(player->GetPrimarySpecialization()))) - { - if (condition->ChrSpecializationIndex >= 0 && spec->OrderIndex != condition->ChrSpecializationIndex) - return false; - - if (condition->ChrSpecializationRole >= 0 && spec->Role != condition->ChrSpecializationRole) - return false; - } - } - if (condition->SkillID[0] || condition->SkillID[1] || condition->SkillID[2] || condition->SkillID[3]) { std::array<bool, std::tuple_size_v<decltype(condition->SkillID)>> results; @@ -3789,17 +3777,10 @@ int32 GetUnitConditionVariable(Unit const* unit, Unit const* otherUnit, UnitCond case UnitConditionVariable::IsEnemy: return otherUnit && unit->GetReactionTo(otherUnit) <= REP_HOSTILE; case UnitConditionVariable::IsSpecMelee: - return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry() - && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetFlags().HasFlag(ChrSpecializationFlag::Melee); case UnitConditionVariable::IsSpecTank: - return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry() - && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetRole() == ChrSpecializationRole::Tank; case UnitConditionVariable::IsSpecRanged: - return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry() - && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetFlags().HasFlag(ChrSpecializationFlag::Ranged); case UnitConditionVariable::IsSpecHealer: - return unit->IsPlayer() && unit->ToPlayer()->GetPrimarySpecializationEntry() - && unit->ToPlayer()->GetPrimarySpecializationEntry()->GetRole() == ChrSpecializationRole::Healer; + break; case UnitConditionVariable::IsPlayerControlledNPC: return unit->IsCreature() && unit->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED); case UnitConditionVariable::IsDying: diff --git a/src/server/game/DataStores/DB2LoadInfo.h b/src/server/game/DataStores/DB2LoadInfo.h index 81caa13ca9b..1b6011a2038 100644 --- a/src/server/game/DataStores/DB2LoadInfo.h +++ b/src/server/game/DataStores/DB2LoadInfo.h @@ -769,29 +769,6 @@ struct ChrRacesLoadInfo static constexpr DB2LoadInfo Instance{ Fields, 68, &ChrRacesMeta::Instance, HOTFIX_SEL_CHR_RACES }; }; -struct ChrSpecializationLoadInfo -{ - static constexpr DB2FieldMeta Fields[14] = - { - { false, FT_STRING, "Name" }, - { false, FT_STRING, "FemaleName" }, - { false, FT_STRING, "Description" }, - { false, FT_INT, "ID" }, - { false, FT_BYTE, "ClassID" }, - { true, FT_BYTE, "OrderIndex" }, - { true, FT_BYTE, "PetTalentType" }, - { true, FT_BYTE, "Role" }, - { false, FT_INT, "Flags" }, - { true, FT_INT, "SpellIconFileID" }, - { true, FT_BYTE, "PrimaryStatPriority" }, - { true, FT_INT, "AnimReplacements" }, - { true, FT_INT, "MasterySpellID1" }, - { true, FT_INT, "MasterySpellID2" }, - }; - - static constexpr DB2LoadInfo Instance{ Fields, 14, &ChrSpecializationMeta::Instance, HOTFIX_SEL_CHR_SPECIALIZATION }; -}; - struct CinematicCameraLoadInfo { static constexpr DB2FieldMeta Fields[7] = @@ -2521,34 +2498,6 @@ struct ItemSparseLoadInfo static constexpr DB2LoadInfo Instance{ Fields, 140, &ItemSparseMeta::Instance, HOTFIX_SEL_ITEM_SPARSE }; }; -struct ItemSpecLoadInfo -{ - static constexpr DB2FieldMeta Fields[7] = - { - { false, FT_INT, "ID" }, - { false, FT_BYTE, "MinLevel" }, - { false, FT_BYTE, "MaxLevel" }, - { false, FT_BYTE, "ItemType" }, - { false, FT_BYTE, "PrimaryStat" }, - { false, FT_BYTE, "SecondaryStat" }, - { false, FT_SHORT, "SpecializationID" }, - }; - - static constexpr DB2LoadInfo Instance{ Fields, 7, &ItemSpecMeta::Instance, HOTFIX_SEL_ITEM_SPEC }; -}; - -struct ItemSpecOverrideLoadInfo -{ - static constexpr DB2FieldMeta Fields[3] = - { - { false, FT_INT, "ID" }, - { false, FT_SHORT, "SpecID" }, - { false, FT_INT, "ItemID" }, - }; - - static constexpr DB2LoadInfo Instance{ Fields, 3, &ItemSpecOverrideMeta::Instance, HOTFIX_SEL_ITEM_SPEC_OVERRIDE }; -}; - struct ItemXBonusTreeLoadInfo { static constexpr DB2FieldMeta Fields[3] = @@ -3935,18 +3884,6 @@ struct SoundKitLoadInfo static constexpr DB2LoadInfo Instance{ Fields, 17, &SoundKitMeta::Instance, HOTFIX_SEL_SOUND_KIT }; }; -struct SpecSetMemberLoadInfo -{ - static constexpr DB2FieldMeta Fields[3] = - { - { false, FT_INT, "ID" }, - { true, FT_INT, "ChrSpecializationID" }, - { false, FT_INT, "SpecSetID" }, - }; - - static constexpr DB2LoadInfo Instance{ Fields, 3, &SpecSetMemberMeta::Instance, HOTFIX_SEL_SPEC_SET_MEMBER }; -}; - struct SpellAuraOptionsLoadInfo { static constexpr DB2FieldMeta Fields[10] = diff --git a/src/server/game/DataStores/DB2Stores.cpp b/src/server/game/DataStores/DB2Stores.cpp index a85d7c7a851..49bdc688635 100644 --- a/src/server/game/DataStores/DB2Stores.cpp +++ b/src/server/game/DataStores/DB2Stores.cpp @@ -79,7 +79,6 @@ DB2Storage<ChrCustomizationReqChoiceEntry> sChrCustomizationReqChoiceStore( DB2Storage<ChrModelEntry> sChrModelStore("ChrModel.db2", &ChrModelLoadInfo::Instance); DB2Storage<ChrRaceXChrModelEntry> sChrRaceXChrModelStore("ChrRaceXChrModel.db2", &ChrRaceXChrModelLoadInfo::Instance); DB2Storage<ChrRacesEntry> sChrRacesStore("ChrRaces.db2", &ChrRacesLoadInfo::Instance); -DB2Storage<ChrSpecializationEntry> sChrSpecializationStore("ChrSpecialization.db2", &ChrSpecializationLoadInfo::Instance); DB2Storage<CinematicCameraEntry> sCinematicCameraStore("CinematicCamera.db2", &CinematicCameraLoadInfo::Instance); DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore("CinematicSequences.db2", &CinematicSequencesLoadInfo::Instance); DB2Storage<ConditionalChrModelEntry> sConditionalChrModelStore("ConditionalChrModel.db2", &ConditionalChrModelLoadInfo::Instance); @@ -165,8 +164,6 @@ DB2Storage<ItemSearchNameEntry> sItemSearchNameStore("ItemSearch DB2Storage<ItemSetEntry> sItemSetStore("ItemSet.db2", &ItemSetLoadInfo::Instance); DB2Storage<ItemSetSpellEntry> sItemSetSpellStore("ItemSetSpell.db2", &ItemSetSpellLoadInfo::Instance); DB2Storage<ItemSparseEntry> sItemSparseStore("ItemSparse.db2", &ItemSparseLoadInfo::Instance); -DB2Storage<ItemSpecEntry> sItemSpecStore("ItemSpec.db2", &ItemSpecLoadInfo::Instance); -DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore("ItemSpecOverride.db2", &ItemSpecOverrideLoadInfo::Instance); DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore("ItemXBonusTree.db2", &ItemXBonusTreeLoadInfo::Instance); DB2Storage<JournalEncounterEntry> sJournalEncounterStore("JournalEncounter.db2", &JournalEncounterLoadInfo::Instance); DB2Storage<JournalEncounterSectionEntry> sJournalEncounterSectionStore("JournalEncounterSection.db2", &JournalEncounterSectionLoadInfo::Instance); @@ -237,7 +234,6 @@ DB2Storage<SkillLineAbilityEntry> sSkillLineAbilityStore("SkillLin DB2Storage<SkillLineXTraitTreeEntry> sSkillLineXTraitTreeStore("SkillLineXTraitTree.db2", &SkillLineXTraitTreeLoadInfo::Instance); DB2Storage<SkillRaceClassInfoEntry> sSkillRaceClassInfoStore("SkillRaceClassInfo.db2", &SkillRaceClassInfoLoadInfo::Instance); DB2Storage<SoundKitEntry> sSoundKitStore("SoundKit.db2", &SoundKitLoadInfo::Instance); -DB2Storage<SpecSetMemberEntry> sSpecSetMemberStore("SpecSetMember.db2", &SpecSetMemberLoadInfo::Instance); DB2Storage<SpellAuraOptionsEntry> sSpellAuraOptionsStore("SpellAuraOptions.db2", &SpellAuraOptionsLoadInfo::Instance); DB2Storage<SpellAuraRestrictionsEntry> sSpellAuraRestrictionsStore("SpellAuraRestrictions.db2", &SpellAuraRestrictionsLoadInfo::Instance); DB2Storage<SpellCastTimesEntry> sSpellCastTimesStore("SpellCastTimes.db2", &SpellCastTimesLoadInfo::Instance); @@ -340,19 +336,16 @@ DEFINE_DB2_SET_COMPARATOR(ChrClassesXPowerTypesEntry) typedef std::map<uint32 /*hash*/, DB2StorageBase*> StorageMap; typedef std::unordered_map<uint32 /*areaGroupId*/, std::vector<uint32/*areaId*/>> AreaGroupMemberContainer; -typedef ChrSpecializationEntry const* ChrSpecializationByIndexContainer[MAX_CLASSES + 1][MAX_SPECIALIZATIONS]; typedef std::unordered_map<uint32 /*curveID*/, std::vector<DBCPosition2D>> CurvePointsContainer; typedef std::map<std::tuple<uint32, uint8, uint8, uint8>, EmotesTextSoundEntry const*> EmotesTextSoundContainer; typedef std::unordered_map<uint32, std::vector<uint32>> FactionTeamContainer; typedef std::unordered_map<uint32, HeirloomEntry const*> HeirloomItemsContainer; typedef std::unordered_map<uint32 /*glyphPropertiesId*/, std::vector<uint32>> GlyphBindableSpellsContainer; -typedef std::unordered_map<uint32 /*glyphPropertiesId*/, std::vector<ChrSpecialization>> GlyphRequiredSpecsContainer; typedef std::unordered_map<uint32 /*itemId*/, ItemChildEquipmentEntry const*> ItemChildEquipmentContainer; typedef std::array<ItemClassEntry const*, 20> ItemClassByOldEnumContainer; typedef std::unordered_map<uint32, std::vector<ItemLimitCategoryConditionEntry const*>> ItemLimitCategoryConditionContainer; typedef std::unordered_map<uint32 /*itemId | appearanceMod << 24*/, ItemModifiedAppearanceEntry const*> ItemModifiedAppearanceByItemContainer; typedef std::unordered_map<uint32, std::vector<ItemSetSpellEntry const*>> ItemSetSpellContainer; -typedef std::unordered_map<uint32, std::vector<ItemSpecOverrideEntry const*>> ItemSpecOverridesContainer; typedef std::unordered_map<uint32, std::unordered_map<uint32, MapDifficultyEntry const*>> MapDifficultyContainer; typedef std::unordered_map<uint32, DB2Manager::MountTypeXCapabilitySet> MountCapabilitiesByTypeContainer; typedef std::unordered_map<uint32, DB2Manager::MountXDisplayContainer> MountDisplaysCointainer; @@ -397,7 +390,6 @@ namespace std::map<std::tuple<uint8 /*race*/, uint8/*gender*/, uint8/*shapeshift*/>, ShapeshiftFormModelData> _chrCustomizationChoicesForShapeshifts; std::unordered_map<std::pair<uint8 /*race*/, uint8/*gender*/>, std::vector<ChrCustomizationOptionEntry const*>> _chrCustomizationOptionsByRaceAndGender; std::unordered_map<uint32 /*chrCustomizationReqId*/, std::vector<std::pair<uint32 /*chrCustomizationOptionId*/, std::vector<uint32>>>> _chrCustomizationRequiredChoices; - ChrSpecializationByIndexContainer _chrSpecializationsByIndex; std::unordered_map<int32, ConditionalChrModelEntry const*> _conditionalChrModelsByChrModelId; std::unordered_multimap<uint32, ConditionalContentTuningEntry const*> _conditionalContentTuning; std::unordered_multimap<uint32, CurrencyContainerEntry const*> _currencyContainers; @@ -407,14 +399,12 @@ namespace std::unordered_map<uint32, std::set<FriendshipRepReactionEntry const*, DB2Manager::FriendshipRepReactionEntryComparator>> _friendshipRepReactions; HeirloomItemsContainer _heirlooms; GlyphBindableSpellsContainer _glyphBindableSpells; - GlyphRequiredSpecsContainer _glyphRequiredSpecs; ItemChildEquipmentContainer _itemChildEquipment; ItemClassByOldEnumContainer _itemClassByOldEnum; std::unordered_set<uint32> _itemsWithCurrencyCost; ItemLimitCategoryConditionContainer _itemCategoryConditions; ItemModifiedAppearanceByItemContainer _itemModifiedAppearancesByItem; ItemSetSpellContainer _itemSetSpells; - ItemSpecOverridesContainer _itemSpecOverrides; std::unordered_map<uint32 /*itemId*/, std::vector<ItemEffectEntry const*>> _itemEffectsByItemId; std::vector<JournalTierEntry const*> _journalTiersByIndex; MapDifficultyContainer _mapDifficulties; @@ -436,7 +426,6 @@ namespace std::unordered_map<uint32, std::vector<SkillLineEntry const*>> _skillLinesByParentSkillLine; std::unordered_map<uint32, std::vector<SkillLineAbilityEntry const*>> _skillLineAbilitiesBySkillupSkill; SkillRaceClassInfoContainer _skillRaceClassInfoBySkill; - std::unordered_set<std::pair<int32, uint32>> _specsBySpecSet; std::unordered_set<uint8> _spellFamilyNames; SpellProcsPerMinuteModContainer _spellProcsPerMinuteMods; std::unordered_map<int32, std::vector<SpellVisualMissileEntry const*>> _spellVisualMissilesBySet; @@ -615,7 +604,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sChrModelStore); LOAD_DB2(sChrRaceXChrModelStore); LOAD_DB2(sChrRacesStore); - LOAD_DB2(sChrSpecializationStore); LOAD_DB2(sCinematicCameraStore); LOAD_DB2(sCinematicSequencesStore); LOAD_DB2(sConditionalChrModelStore); @@ -701,8 +689,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sItemSetStore); LOAD_DB2(sItemSetSpellStore); LOAD_DB2(sItemSparseStore); - LOAD_DB2(sItemSpecStore); - LOAD_DB2(sItemSpecOverrideStore); LOAD_DB2(sItemXBonusTreeStore); LOAD_DB2(sJournalEncounterStore); LOAD_DB2(sJournalEncounterSectionStore); @@ -773,7 +759,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul LOAD_DB2(sSkillLineXTraitTreeStore); LOAD_DB2(sSkillRaceClassInfoStore); LOAD_DB2(sSoundKitStore); - LOAD_DB2(sSpecSetMemberStore); LOAD_DB2(sSpellAuraOptionsStore); LOAD_DB2(sSpellAuraRestrictionsStore); LOAD_DB2(sSpellCastTimesStore); @@ -1029,22 +1014,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul } } - memset(_chrSpecializationsByIndex, 0, sizeof(_chrSpecializationsByIndex)); - for (ChrSpecializationEntry const* chrSpec : sChrSpecializationStore) - { - ASSERT(chrSpec->ClassID < MAX_CLASSES); - ASSERT(chrSpec->OrderIndex < MAX_SPECIALIZATIONS); - - uint32 storageIndex = chrSpec->ClassID; - if (chrSpec->GetFlags().HasFlag(ChrSpecializationFlag::PetOverrideSpec)) - { - ASSERT(!chrSpec->ClassID); - storageIndex = PET_SPEC_OVERRIDE_CLASS_INDEX; - } - - _chrSpecializationsByIndex[storageIndex][chrSpec->OrderIndex] = chrSpec; - } - for (ConditionalChrModelEntry const* conditionalChrModel : sConditionalChrModelStore) _conditionalChrModelsByChrModelId[conditionalChrModel->ChrModelID] = conditionalChrModel; @@ -1095,9 +1064,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul for (GlyphBindableSpellEntry const* glyphBindableSpell : sGlyphBindableSpellStore) _glyphBindableSpells[glyphBindableSpell->GlyphPropertiesID].push_back(glyphBindableSpell->SpellID); - for (GlyphRequiredSpecEntry const* glyphRequiredSpec : sGlyphRequiredSpecStore) - _glyphRequiredSpecs[glyphRequiredSpec->GlyphPropertiesID].push_back(ChrSpecialization(glyphRequiredSpec->ChrSpecializationID)); - for (ItemChildEquipmentEntry const* itemChildEquipment : sItemChildEquipmentStore) { ASSERT(_itemChildEquipment.find(itemChildEquipment->ParentItemID) == _itemChildEquipment.end(), "Item must have max 1 child item."); @@ -1129,9 +1095,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul for (ItemSetSpellEntry const* itemSetSpell : sItemSetSpellStore) _itemSetSpells[itemSetSpell->ItemSetID].push_back(itemSetSpell); - for (ItemSpecOverrideEntry const* itemSpecOverride : sItemSpecOverrideStore) - _itemSpecOverrides[itemSpecOverride->ItemID].push_back(itemSpecOverride); - for (JournalTierEntry const* journalTier : sJournalTierStore) _journalTiersByIndex.push_back(journalTier); @@ -1283,9 +1246,6 @@ uint32 DB2Manager::LoadStores(std::string const& dataPath, LocaleConstant defaul if (sSkillLineStore.LookupEntry(entry->SkillID)) _skillRaceClassInfoBySkill.insert(SkillRaceClassInfoContainer::value_type(entry->SkillID, entry)); - for (SpecSetMemberEntry const* specSetMember : sSpecSetMemberStore) - _specsBySpecSet.insert(std::make_pair(specSetMember->SpecSetID, uint32(specSetMember->ChrSpecializationID))); - for (SpellClassOptionsEntry const* classOption : sSpellClassOptionsStore) _spellFamilyNames.insert(classOption->SpellClassSet); @@ -1844,16 +1804,6 @@ char const* DB2Manager::GetChrRaceName(uint8 race, LocaleConstant locale /*= DEF return raceEntry->Name[DEFAULT_LOCALE]; } -ChrSpecializationEntry const* DB2Manager::GetChrSpecializationByIndex(uint32 class_, uint32 index) const -{ - return _chrSpecializationsByIndex[class_][index]; -} - -ChrSpecializationEntry const* DB2Manager::GetDefaultChrSpecializationForClass(uint32 class_) const -{ - return GetChrSpecializationByIndex(class_, INITIAL_SPECIALIZATION_INDEX); -} - uint32 DB2Manager::GetRedirectedContentTuningId(uint32 contentTuningId, uint32 redirectFlag) const { for (auto [_, conditionalContentTuning] : Trinity::Containers::MapEqualRange(_conditionalContentTuning, contentTuningId)) @@ -2088,11 +2038,6 @@ std::vector<uint32> const* DB2Manager::GetGlyphBindableSpells(uint32 glyphProper return Trinity::Containers::MapGetValuePtr(_glyphBindableSpells, glyphPropertiesId); } -std::vector<ChrSpecialization> const* DB2Manager::GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const -{ - return Trinity::Containers::MapGetValuePtr(_glyphRequiredSpecs, glyphPropertiesId); -} - HeirloomEntry const* DB2Manager::GetHeirloomByItemId(uint32 itemId) const { return Trinity::Containers::MapGetValuePtr(_heirlooms, itemId); @@ -2154,11 +2099,6 @@ std::vector<ItemSetSpellEntry const*> const* DB2Manager::GetItemSetSpells(uint32 return Trinity::Containers::MapGetValuePtr(_itemSetSpells, itemSetId); } -std::vector<ItemSpecOverrideEntry const*> const* DB2Manager::GetItemSpecOverrides(uint32 itemId) const -{ - return Trinity::Containers::MapGetValuePtr(_itemSpecOverrides, itemId); -} - JournalTierEntry const* DB2Manager::GetJournalTier(uint32 index) const { if (index < _journalTiersByIndex.size()) @@ -2496,11 +2436,6 @@ std::vector<SkillRaceClassInfoEntry const*> DB2Manager::GetSkillRaceClassInfo(ui return result; } -bool DB2Manager::IsSpecSetMember(int32 specSetId, uint32 specId) const -{ - return _specsBySpecSet.count(std::make_pair(specSetId, specId)) > 0; -} - bool DB2Manager::IsValidSpellFamiliyName(SpellFamilyNames family) { return _spellFamilyNames.count(family) > 0; diff --git a/src/server/game/DataStores/DB2Stores.h b/src/server/game/DataStores/DB2Stores.h index fa1b5a6d807..11d94c30b04 100644 --- a/src/server/game/DataStores/DB2Stores.h +++ b/src/server/game/DataStores/DB2Stores.h @@ -65,7 +65,6 @@ TC_GAME_API extern DB2Storage<ChrClassesEntry> sChrClassesS TC_GAME_API extern DB2Storage<ChrCustomizationReqEntry> sChrCustomizationReqStore; TC_GAME_API extern DB2Storage<ChrCustomizationOptionEntry> sChrCustomizationOptionStore; TC_GAME_API extern DB2Storage<ChrRacesEntry> sChrRacesStore; -TC_GAME_API extern DB2Storage<ChrSpecializationEntry> sChrSpecializationStore; TC_GAME_API extern DB2Storage<CinematicCameraEntry> sCinematicCameraStore; TC_GAME_API extern DB2Storage<CinematicSequencesEntry> sCinematicSequencesStore; TC_GAME_API extern DB2Storage<ConditionalChrModelEntry> sConditionalChrModelStore; @@ -138,8 +137,6 @@ TC_GAME_API extern DB2Storage<ItemSearchNameEntry> sItemSearchN TC_GAME_API extern DB2Storage<ItemSetEntry> sItemSetStore; TC_GAME_API extern DB2Storage<ItemSetSpellEntry> sItemSetSpellStore; TC_GAME_API extern DB2Storage<ItemSparseEntry> sItemSparseStore; -TC_GAME_API extern DB2Storage<ItemSpecEntry> sItemSpecStore; -TC_GAME_API extern DB2Storage<ItemSpecOverrideEntry> sItemSpecOverrideStore; TC_GAME_API extern DB2Storage<ItemXBonusTreeEntry> sItemXBonusTreeStore; TC_GAME_API extern DB2Storage<JournalEncounterEntry> sJournalEncounterStore; TC_GAME_API extern DB2Storage<JournalEncounterSectionEntry> sJournalEncounterSectionStore; @@ -408,8 +405,6 @@ public: ChrModelEntry const* GetChrModel(uint8 race, uint8 gender) const; static ConditionalChrModelEntry const* GetConditionalChrModel(int32 chrModelId); static char const* GetChrRaceName(uint8 race, LocaleConstant locale = DEFAULT_LOCALE); - ChrSpecializationEntry const* GetChrSpecializationByIndex(uint32 class_, uint32 index) const; - ChrSpecializationEntry const* GetDefaultChrSpecializationForClass(uint32 class_) const; uint32 GetRedirectedContentTuningId(uint32 contentTuningId, uint32 redirectFlag) const; Optional<ContentTuningLevels> GetContentTuningData(uint32 contentTuningId, uint32 redirectFlag, bool forItem = false) const; bool HasContentTuningLabel(uint32 contentTuningId, int32 label) const; @@ -424,7 +419,6 @@ public: FriendshipRepReactionSet const* GetFriendshipRepReactions(uint32 friendshipRepID) const; uint32 GetGlobalCurveId(GlobalCurve globalCurveType) const; std::vector<uint32> const* GetGlyphBindableSpells(uint32 glyphPropertiesId) const; - std::vector<ChrSpecialization> const* GetGlyphRequiredSpecs(uint32 glyphPropertiesId) const; HeirloomEntry const* GetHeirloomByItemId(uint32 itemId) const; ItemChildEquipmentEntry const* GetItemChildEquipment(uint32 itemId) const; ItemClassEntry const* GetItemClassByOldEnum(uint32 itemClass) const; @@ -434,7 +428,6 @@ public: ItemModifiedAppearanceEntry const* GetItemModifiedAppearance(uint32 itemId, uint32 appearanceModId) const; ItemModifiedAppearanceEntry const* GetDefaultItemModifiedAppearance(uint32 itemId) const; std::vector<ItemSetSpellEntry const*> const* GetItemSetSpells(uint32 itemSetId) const; - std::vector<ItemSpecOverrideEntry const*> const* GetItemSpecOverrides(uint32 itemId) const; JournalTierEntry const* GetJournalTier(uint32 index) const; static LFGDungeonsEntry const* GetLfgDungeon(uint32 mapId, Difficulty difficulty); static uint32 GetDefaultMapLight(uint32 mapId); @@ -469,7 +462,6 @@ public: std::vector<SkillLineAbilityEntry const*> const* GetSkillLineAbilitiesBySkill(uint32 skillId) const; SkillRaceClassInfoEntry const* GetSkillRaceClassInfo(uint32 skill, uint8 race, uint8 class_) const; std::vector<SkillRaceClassInfoEntry const*> GetSkillRaceClassInfo(uint32 skill) const; - bool IsSpecSetMember(int32 specSetId, uint32 specId) const; static bool IsValidSpellFamiliyName(SpellFamilyNames family); std::vector<SpellProcsPerMinuteModEntry const*> GetSpellProcsPerMinuteMods(uint32 spellprocsPerMinuteId) const; std::vector<SpellVisualMissileEntry const*> const* GetSpellVisualMissiles(int32 spellVisualMissileSetId) const; diff --git a/src/server/game/DataStores/DB2Structure.h b/src/server/game/DataStores/DB2Structure.h index fbe56c5899e..24d9b103270 100644 --- a/src/server/game/DataStores/DB2Structure.h +++ b/src/server/game/DataStores/DB2Structure.h @@ -571,33 +571,6 @@ struct ChrRacesEntry EnumFlag<ChrRacesFlag> GetFlags() const { return static_cast<ChrRacesFlag>(Flags); } }; -#define MAX_MASTERY_SPELLS 2 - -struct ChrSpecializationEntry -{ - LocalizedString Name; - LocalizedString FemaleName; - LocalizedString Description; - uint32 ID; - uint8 ClassID; - int8 OrderIndex; - int8 PetTalentType; - int8 Role; - uint32 Flags; - int32 SpellIconFileID; - int8 PrimaryStatPriority; - int32 AnimReplacements; - std::array<int32, MAX_MASTERY_SPELLS> MasterySpellID; - - EnumFlag<ChrSpecializationFlag> GetFlags() const { return static_cast<ChrSpecializationFlag>(Flags); } - ChrSpecializationRole GetRole() const { return static_cast<ChrSpecializationRole>(Role); } - - bool IsPetSpecialization() const - { - return ClassID == 0; - } -}; - struct CinematicCameraEntry { uint32 ID; @@ -1938,24 +1911,6 @@ struct ItemSparseEntry int8 RequiredLevel; }; -struct ItemSpecEntry -{ - uint32 ID; - uint8 MinLevel; - uint8 MaxLevel; - uint8 ItemType; - uint8 PrimaryStat; - uint8 SecondaryStat; - uint16 SpecializationID; -}; - -struct ItemSpecOverrideEntry -{ - uint32 ID; - uint16 SpecID; - uint32 ItemID; -}; - struct ItemXBonusTreeEntry { uint32 ID; @@ -2874,13 +2829,6 @@ struct SoundKitEntry uint32 SoundMixGroupID; }; -struct SpecSetMemberEntry -{ - uint32 ID; - int32 ChrSpecializationID; - uint32 SpecSetID; -}; - struct SpellAuraOptionsEntry { uint32 ID; @@ -3419,6 +3367,8 @@ struct TalentEntry std::array<int32, 3> PrereqRank; }; +#define MAX_MASTERY_SPELLS 2 + struct TalentTabEntry { uint32 ID; @@ -3431,7 +3381,7 @@ struct TalentTabEntry int32 CategoryEnumID; int32 SpellIconID; int32 RoleMask; - std::array<int32, 2> MasterySpellID; + std::array<int32, MAX_MASTERY_SPELLS> MasterySpellID; }; struct TalentTreePrimarySpellsEntry diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h index f690f716038..56a11b6382c 100644 --- a/src/server/game/DataStores/DBCEnums.h +++ b/src/server/game/DataStores/DBCEnums.h @@ -330,69 +330,6 @@ enum class ChrRacesFlag : int32 DEFINE_ENUM_FLAG(ChrRacesFlag); -enum class ChrSpecializationFlag : uint32 -{ - Caster = 0x01, - Ranged = 0x02, - Melee = 0x04, - DualWieldTwoHanded = 0x10, // used for CUnitDisplay::SetSheatheInvertedForDualWield - PetOverrideSpec = 0x20, - Recommended = 0x40, -}; - -DEFINE_ENUM_FLAG(ChrSpecializationFlag); - -enum class ChrSpecializationRole : int8 -{ - Tank = 0, - Healer = 1, - Dps = 2 -}; - -enum class ChrSpecialization : uint32 -{ - None = 0, - MageArcane = 62, - MageFire = 63, - MageFrost = 64, - PaladinHoly = 65, - PaladinProtection = 66, - PaladinRetribution = 70, - WarriorArms = 71, - WarriorFury = 72, - WarriorProtection = 73, - DruidBalance = 102, - DruidFeral = 103, - DruidGuardian = 104, - DruidRestoration = 105, - DeathKnightBlood = 250, - DeathKnightFrost = 251, - DeathKnightUnholy = 252, - HunterBeastMastery = 253, - HunterMarksmanship = 254, - HunterSurvival = 255, - PriestDiscipline = 256, - PriestHoly = 257, - PriestShadow = 258, - RogueAssassination = 259, - RogueOutlaw = 260, - RogueSubtely = 261, - ShamanElemental = 262, - ShamanEnhancement = 263, - ShamanRestoration = 264, - WarlockAffliction = 265, - WarlockDemonology = 266, - WarlockDestruction = 267, - MonkBrewmaster = 268, - MonkWindwalker = 269, - MonkMistweaver = 270, - DemonHunterHavoc = 577, - DemonHunterVengeance = 581, - EvokerDevastation = 1467, - EvokerPreservation = 1468, - EvokerAugmentation = 1473 -}; - enum class ContentTuningCalcType : int32 { Base = 0, @@ -1186,52 +1123,6 @@ enum ItemSetFlags ITEM_SET_FLAG_LEGACY_INACTIVE = 0x01, }; -enum ItemSpecStat -{ - ITEM_SPEC_STAT_INTELLECT = 0, - ITEM_SPEC_STAT_AGILITY = 1, - ITEM_SPEC_STAT_STRENGTH = 2, - ITEM_SPEC_STAT_SPIRIT = 3, - ITEM_SPEC_STAT_HIT = 4, - ITEM_SPEC_STAT_DODGE = 5, - ITEM_SPEC_STAT_PARRY = 6, - ITEM_SPEC_STAT_ONE_HANDED_AXE = 7, - ITEM_SPEC_STAT_TWO_HANDED_AXE = 8, - ITEM_SPEC_STAT_ONE_HANDED_SWORD = 9, - ITEM_SPEC_STAT_TWO_HANDED_SWORD = 10, - ITEM_SPEC_STAT_ONE_HANDED_MACE = 11, - ITEM_SPEC_STAT_TWO_HANDED_MACE = 12, - ITEM_SPEC_STAT_DAGGER = 13, - ITEM_SPEC_STAT_FIST_WEAPON = 14, - ITEM_SPEC_STAT_GUN = 15, - ITEM_SPEC_STAT_BOW = 16, - ITEM_SPEC_STAT_CROSSBOW = 17, - ITEM_SPEC_STAT_STAFF = 18, - ITEM_SPEC_STAT_POLEARM = 19, - ITEM_SPEC_STAT_THROWN = 20, - ITEM_SPEC_STAT_WAND = 21, - ITEM_SPEC_STAT_SHIELD = 22, - ITEM_SPEC_STAT_RELIC = 23, - ITEM_SPEC_STAT_CRIT = 24, - ITEM_SPEC_STAT_HASTE = 25, - ITEM_SPEC_STAT_BONUS_ARMOR = 26, - ITEM_SPEC_STAT_CLOAK = 27, - ITEM_SPEC_STAT_WARGLAIVES = 28, - ITEM_SPEC_STAT_RELIC_IRON = 29, - ITEM_SPEC_STAT_RELIC_BLOOD = 30, - ITEM_SPEC_STAT_RELIC_SHADOW = 31, - ITEM_SPEC_STAT_RELIC_FEL = 32, - ITEM_SPEC_STAT_RELIC_ARCANE = 33, - ITEM_SPEC_STAT_RELIC_FROST = 34, - ITEM_SPEC_STAT_RELIC_FIRE = 35, - ITEM_SPEC_STAT_RELIC_WATER = 36, - ITEM_SPEC_STAT_RELIC_LIFE = 37, - ITEM_SPEC_STAT_RELIC_WIND = 38, - ITEM_SPEC_STAT_RELIC_HOLY = 39, - - ITEM_SPEC_STAT_NONE = 40 -}; - enum MapTypes // Lua_IsInInstance { MAP_COMMON = 0, // none diff --git a/src/server/game/DungeonFinding/LFGMgr.cpp b/src/server/game/DungeonFinding/LFGMgr.cpp index ff2a50d8af5..34134bc4fae 100644 --- a/src/server/game/DungeonFinding/LFGMgr.cpp +++ b/src/server/game/DungeonFinding/LFGMgr.cpp @@ -1941,10 +1941,12 @@ uint8 LFGMgr::GetTeam(ObjectGuid guid) uint8 LFGMgr::FilterClassRoles(Player* player, uint8 roles) { - uint8 allowedRoles = PLAYER_ROLE_LEADER; - for (uint32 i = 0; i < MAX_SPECIALIZATIONS; ++i) - if (ChrSpecializationEntry const* specialization = sDB2Manager.GetChrSpecializationByIndex(player->GetClass(), i)) - allowedRoles |= 1 << (specialization->Role + 1); + uint8 allowedRoles = PLAYER_ROLE_LEADER | PLAYER_ROLE_DAMAGE; + if (player->GetClass() == CLASS_DEATH_KNIGHT || player->GetClass() == CLASS_DRUID || player->GetClass() == CLASS_PALADIN || player->GetClass() == CLASS_WARRIOR) + allowedRoles |= PLAYER_ROLE_TANK; + + if (player->GetClass() == CLASS_PALADIN || player->GetClass() == CLASS_PRIEST || player->GetClass() == CLASS_DRUID || player->GetClass() == CLASS_SHAMAN) + allowedRoles |= PLAYER_ROLE_HEALER; return roles & allowedRoles; } diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index b6e25d224a2..b10f8ffb81e 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -137,8 +137,7 @@ void AddItemsSetItem(Player* player, Item const* item) eff->SetBonuses.insert(itemSetSpell); // spell cast only if fit form requirement, in other case will cast at form change - if (!itemSetSpell->ChrSpecID || ChrSpecialization(itemSetSpell->ChrSpecID) == player->GetPrimarySpecialization()) - player->ApplyEquipSpell(spellInfo, nullptr, true); + player->ApplyEquipSpell(spellInfo, nullptr, true); } } } diff --git a/src/server/game/Entities/Item/ItemTemplate.cpp b/src/server/game/Entities/Item/ItemTemplate.cpp index c0997b727eb..e7de792cb95 100644 --- a/src/server/game/Entities/Item/ItemTemplate.cpp +++ b/src/server/game/Entities/Item/ItemTemplate.cpp @@ -203,32 +203,3 @@ void ItemTemplate::GetDamage(uint32 itemLevel, float& minDamage, float& maxDamag maxDamage = floor(float(avgDamage * (GetDmgVariance() * 0.5f + 1.0f) + 0.5f)); } } - -bool ItemTemplate::IsUsableByLootSpecialization(Player const* player, bool alwaysAllowBoundToAccount) const -{ - if (HasFlag(ITEM_FLAG_IS_BOUND_TO_ACCOUNT) && alwaysAllowBoundToAccount) - return true; - - uint32 spec = player->GetLootSpecId(); - if (!spec) - spec = AsUnderlyingType(player->GetPrimarySpecialization()); - if (!spec) - spec = player->GetDefaultSpecId(); - - ChrSpecializationEntry const* chrSpecialization = sChrSpecializationStore.LookupEntry(spec); - if (!chrSpecialization) - return false; - - std::size_t levelIndex = 0; - if (player->GetLevel() >= 110) - levelIndex = 2; - else if (player->GetLevel() > 40) - levelIndex = 1; - - return Specializations[levelIndex].test(CalculateItemSpecBit(chrSpecialization)); -} - -std::size_t ItemTemplate::CalculateItemSpecBit(ChrSpecializationEntry const* spec) -{ - return (spec->ClassID - 1) * MAX_SPECIALIZATIONS + spec->OrderIndex; -} diff --git a/src/server/game/Entities/Item/ItemTemplate.h b/src/server/game/Entities/Item/ItemTemplate.h index e770e9830c8..90b5ae0705d 100644 --- a/src/server/game/Entities/Item/ItemTemplate.h +++ b/src/server/game/Entities/Item/ItemTemplate.h @@ -919,8 +919,6 @@ struct TC_GAME_API ItemTemplate char const* GetDefaultLocaleName() const; float GetDPS(uint32 itemLevel) const; void GetDamage(uint32 itemLevel, float& minDamage, float& maxDamage) const; - bool IsUsableByLootSpecialization(Player const* player, bool alwaysAllowBoundToAccount) const; - static std::size_t CalculateItemSpecBit(ChrSpecializationEntry const* spec); }; #endif diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 3c0f5e7a1e8..5955f81f9b8 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -410,8 +410,6 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c TC_LOG_DEBUG("entities.pet", "New Pet has {}", GetGUID().ToString()); uint16 specId = specializationId; - if (ChrSpecializationEntry const* petSpec = sChrSpecializationStore.LookupEntry(specId)) - specId = sDB2Manager.GetChrSpecializationByIndex(owner->HasAuraType(SPELL_AURA_OVERRIDE_PET_SPECS) ? PET_SPEC_OVERRIDE_CLASS_INDEX : 0, petSpec->OrderIndex)->ID; SetSpecialization(specId); @@ -1879,7 +1877,7 @@ void Pet::SetSpecialization(uint16 spec) // remove all the old spec's specalization spells, set the new spec, then add the new spec's spells // clearActionBars is false because we'll be updating the pet actionbar later so we don't have to do it now RemoveSpecializationSpells(false); - if (!sChrSpecializationStore.LookupEntry(spec)) + //if (!sChrSpecializationStore.LookupEntry(spec)) { m_petSpecialization = 0; return; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 18116e0ef99..0a3f64ad199 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -7697,9 +7697,6 @@ void Player::ApplyItemEquipSpell(Item* item, bool apply, bool formChange /*= fal if (!spellproto) continue; - if (effectData->ChrSpecializationID && ChrSpecialization(effectData->ChrSpecializationID) != GetPrimarySpecialization()) - continue; - ApplyEquipSpell(spellproto, item, apply, formChange); } } @@ -7789,14 +7786,8 @@ void Player::UpdateItemSetAuras(bool formChange /*= false*/) for (ItemSetSpellEntry const* itemSetSpell : eff->SetBonuses) { SpellInfo const* spellInfo = sSpellMgr->AssertSpellInfo(itemSetSpell->SpellID, DIFFICULTY_NONE); - - if (itemSetSpell->ChrSpecID && ChrSpecialization(itemSetSpell->ChrSpecID) != GetPrimarySpecialization()) - ApplyEquipSpell(spellInfo, nullptr, false, false); // item set aura is not for current spec - else - { - ApplyEquipSpell(spellInfo, nullptr, false, formChange); // remove spells that not fit to form - removal is skipped if shapeshift condition is satisfied - ApplyEquipSpell(spellInfo, nullptr, true, formChange); // add spells that fit form but not active - } + ApplyEquipSpell(spellInfo, nullptr, false, formChange); // remove spells that not fit to form - removal is skipped if shapeshift condition is satisfied + ApplyEquipSpell(spellInfo, nullptr, true, formChange); // add spells that fit form but not active } } } @@ -14151,8 +14142,8 @@ bool Player::CanSelectQuestPackageItem(QuestPackageItemEntry const* questPackage switch (questPackageItem->DisplayType) { - case QUEST_PACKAGE_FILTER_LOOT_SPECIALIZATION: - return rewardProto->IsUsableByLootSpecialization(this, true); + //case QUEST_PACKAGE_FILTER_LOOT_SPECIALIZATION: + // return rewardProto->IsUsableByLootSpecialization(this, true); case QUEST_PACKAGE_FILTER_CLASS: return !rewardProto->ItemSpecClassMask || (rewardProto->ItemSpecClassMask & GetClassMask()) != 0; case QUEST_PACKAGE_FILTER_EVERYONE: @@ -17296,10 +17287,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol SetNumRespecs(fields.numRespecs); - uint32 lootSpecId = fields.lootSpecId; - if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(lootSpecId)) - if (chrSpec->ClassID == GetClass()) - SetLootSpecId(lootSpecId); + //uint32 lootSpecId = fields.lootSpecId; RegisterPowerTypes(); UpdateDisplayPower(); @@ -19006,7 +18994,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba //save, but in tavern/city stmt->setUInt32(index++, GetTalentResetCost()); stmt->setInt64(index++, GetTalentResetTime()); - stmt->setUInt32(index++, AsUnderlyingType(GetPrimarySpecialization())); + stmt->setUInt32(index++, 0); // GetPrimarySpecialization stmt->setUInt16(index++, (uint16)m_ExtraFlags); stmt->setUInt32(index++, 0); // summonedPetNumber stmt->setUInt16(index++, (uint16)m_atLoginFlags); @@ -19142,7 +19130,7 @@ void Player::SaveToDB(LoginDatabaseTransaction loginTransaction, CharacterDataba stmt->setUInt32(index++, GetTalentResetCost()); stmt->setInt64(index++, GetTalentResetTime()); stmt->setUInt8(index++, GetNumRespecs()); - stmt->setUInt32(index++, AsUnderlyingType(GetPrimarySpecialization())); + stmt->setUInt32(index++, 0); // GetPrimarySpecialization stmt->setUInt16(index++, (uint16)m_ExtraFlags); if (PetStable const* petStable = GetPetStable()) stmt->setUInt32(index++, petStable->GetCurrentPet() && petStable->GetCurrentPet()->Health > 0 ? petStable->GetCurrentPet()->PetNumber : 0); // summonedPetNumber @@ -26451,6 +26439,7 @@ void Player::_LoadTalents(PreparedQueryResult talentGroupResult, PreparedQueryRe void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult entriesResult) { + /* std::unordered_multimap<int32, WorldPackets::Traits::TraitEntry> traitEntriesByConfig; if (entriesResult) { @@ -26541,7 +26530,7 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult return index; }; - for (uint32 i = 0; i < MAX_SPECIALIZATIONS - 1 /*initial spec doesnt get a config*/; ++i) + for (uint32 i = 0; i < MAX_SPECIALIZATIONS - 1 /*initial spec doesnt get a config; ++i) { if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(GetClass(), i)) { @@ -26587,6 +26576,7 @@ void Player::_LoadTraits(PreparedQueryResult configsResult, PreparedQueryResult ApplyTraitConfig(traitConfig.ID, true); } + */ } void Player::_SaveTalents(CharacterDatabaseTransaction trans) @@ -28342,16 +28332,6 @@ void Player::RemoveSocial() m_social = nullptr; } -uint32 Player::GetDefaultSpecId() const -{ - return ASSERT_NOTNULL(sDB2Manager.GetDefaultChrSpecializationForClass(GetClass()))->ID; -} - -ChrSpecializationEntry const* Player::GetPrimarySpecializationEntry() const -{ - return sChrSpecializationStore.LookupEntry(AsUnderlyingType(GetPrimarySpecialization())); -} - bool Player::HasTalentGroupUnlocked(uint8 group) const { return _talentGroups.size() >= uint8(group + 1); @@ -28994,7 +28974,7 @@ bool TraitMgr::PlayerDataAccessor::HasAchieved(int32 achievementId) const uint32 TraitMgr::PlayerDataAccessor::GetPrimarySpecialization() const { - return AsUnderlyingType(_player->GetPrimarySpecialization()); + return 0; } void Player::RequestSpellCast(std::unique_ptr<SpellCastRequest> castRequest) diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 56f42fc6c98..2fe9a2dabbe 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -42,7 +42,6 @@ struct BarberShopStyleEntry; struct BattlegroundTemplate; struct CharTitlesEntry; struct ChatChannelsEntry; -struct ChrSpecializationEntry; struct CreatureTemplate; struct CurrencyTypesEntry; struct FactionEntry; @@ -89,7 +88,6 @@ class RestMgr; class SpellCastTargets; class TradeData; -enum class ChrSpecialization : uint32; enum GroupCategory : uint8; enum class InstanceResetMethod : uint8; enum class InstanceResetResult : uint8; @@ -1829,10 +1827,6 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void SetOverrideZonePVPType(ZonePVPTypeOverride type) { SetUpdateFieldValue(m_values.ModifyValue(&Player::m_activePlayerData).ModifyValue(&UF::ActivePlayerData::OverrideZonePVPType), uint32(type)); } // Talents - ChrSpecialization GetPrimarySpecialization() const { return ChrSpecialization(*m_playerData->CurrentSpecID); } - uint32 GetDefaultSpecId() const; - ChrSpecializationEntry const* GetPrimarySpecializationEntry() const; - uint8 GetActiveTalentGroup() const { return _activeTalentGroup; } bool HasTalentGroupUnlocked(uint8 group) const; void SetTalentGroupCount(uint8 count); diff --git a/src/server/game/Entities/Unit/StatSystem.cpp b/src/server/game/Entities/Unit/StatSystem.cpp index cdd4777d6ce..9f0870ef94f 100644 --- a/src/server/game/Entities/Unit/StatSystem.cpp +++ b/src/server/game/Entities/Unit/StatSystem.cpp @@ -399,9 +399,6 @@ Stats Player::GetPrimaryStat() const { uint8 primaryStatPriority = [&]() -> uint8 { - if (ChrSpecializationEntry const* specialization = GetPrimarySpecializationEntry()) - return specialization->PrimaryStatPriority; - return sChrClassesStore.AssertEntry(GetClass())->PrimaryStatPriority; }(); diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index d13f4ace139..dd16bfe6839 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -3063,216 +3063,6 @@ uint32 FillMaxDurability(uint32 itemClass, uint32 itemSubClass, uint32 inventory return 5 * uint32(round(18.0f * qualityMultipliers[quality] * weaponMultipliers[itemSubClass] * levelPenalty)); }; -struct ItemSpecStats -{ - uint32 ItemType; - uint32 ItemSpecStatTypes[MAX_ITEM_PROTO_STATS]; - uint32 ItemSpecStatCount; - - ItemSpecStats(ItemEntry const* item, ItemSparseEntry const* sparse) : ItemType(0), ItemSpecStatCount(0) - { - memset(ItemSpecStatTypes, -1, sizeof(ItemSpecStatTypes)); - - if (item->ClassID == ITEM_CLASS_WEAPON) - { - ItemType = 5; - switch (item->SubclassID) - { - case ITEM_SUBCLASS_WEAPON_AXE: - AddStat(ITEM_SPEC_STAT_ONE_HANDED_AXE); - break; - case ITEM_SUBCLASS_WEAPON_AXE2: - AddStat(ITEM_SPEC_STAT_TWO_HANDED_AXE); - break; - case ITEM_SUBCLASS_WEAPON_BOW: - AddStat(ITEM_SPEC_STAT_BOW); - break; - case ITEM_SUBCLASS_WEAPON_GUN: - AddStat(ITEM_SPEC_STAT_GUN); - break; - case ITEM_SUBCLASS_WEAPON_MACE: - AddStat(ITEM_SPEC_STAT_ONE_HANDED_MACE); - break; - case ITEM_SUBCLASS_WEAPON_MACE2: - AddStat(ITEM_SPEC_STAT_TWO_HANDED_MACE); - break; - case ITEM_SUBCLASS_WEAPON_POLEARM: - AddStat(ITEM_SPEC_STAT_POLEARM); - break; - case ITEM_SUBCLASS_WEAPON_SWORD: - AddStat(ITEM_SPEC_STAT_ONE_HANDED_SWORD); - break; - case ITEM_SUBCLASS_WEAPON_SWORD2: - AddStat(ITEM_SPEC_STAT_TWO_HANDED_SWORD); - break; - case ITEM_SUBCLASS_WEAPON_WARGLAIVES: - AddStat(ITEM_SPEC_STAT_WARGLAIVES); - break; - case ITEM_SUBCLASS_WEAPON_STAFF: - AddStat(ITEM_SPEC_STAT_STAFF); - break; - case ITEM_SUBCLASS_WEAPON_FIST_WEAPON: - AddStat(ITEM_SPEC_STAT_FIST_WEAPON); - break; - case ITEM_SUBCLASS_WEAPON_DAGGER: - AddStat(ITEM_SPEC_STAT_DAGGER); - break; - case ITEM_SUBCLASS_WEAPON_THROWN: - AddStat(ITEM_SPEC_STAT_THROWN); - break; - case ITEM_SUBCLASS_WEAPON_CROSSBOW: - AddStat(ITEM_SPEC_STAT_CROSSBOW); - break; - case ITEM_SUBCLASS_WEAPON_WAND: - AddStat(ITEM_SPEC_STAT_WAND); - break; - default: - break; - } - } - else if (item->ClassID == ITEM_CLASS_ARMOR) - { - switch (item->SubclassID) - { - case ITEM_SUBCLASS_ARMOR_CLOTH: - if (sparse->InventoryType != INVTYPE_CLOAK) - { - ItemType = 1; - break; - } - - ItemType = 0; - AddStat(ITEM_SPEC_STAT_CLOAK); - break; - case ITEM_SUBCLASS_ARMOR_LEATHER: - ItemType = 2; - break; - case ITEM_SUBCLASS_ARMOR_MAIL: - ItemType = 3; - break; - case ITEM_SUBCLASS_ARMOR_PLATE: - ItemType = 4; - break; - default: - if (item->SubclassID == ITEM_SUBCLASS_ARMOR_SHIELD) - { - ItemType = 6; - AddStat(ITEM_SPEC_STAT_SHIELD); - } - else if (item->SubclassID > ITEM_SUBCLASS_ARMOR_SHIELD && item->SubclassID <= ITEM_SUBCLASS_ARMOR_RELIC) - { - ItemType = 6; - AddStat(ITEM_SPEC_STAT_RELIC); - } - else - ItemType = 0; - break; - } - } - else if (item->ClassID == ITEM_CLASS_GEM) - { - ItemType = 7; - if (GemPropertiesEntry const* gem = sGemPropertiesStore.LookupEntry(sparse->GemProperties)) - { - if (gem->Type & SOCKET_COLOR_RELIC_IRON) - AddStat(ITEM_SPEC_STAT_RELIC_IRON); - if (gem->Type & SOCKET_COLOR_RELIC_BLOOD) - AddStat(ITEM_SPEC_STAT_RELIC_BLOOD); - if (gem->Type & SOCKET_COLOR_RELIC_SHADOW) - AddStat(ITEM_SPEC_STAT_RELIC_SHADOW); - if (gem->Type & SOCKET_COLOR_RELIC_FEL) - AddStat(ITEM_SPEC_STAT_RELIC_FEL); - if (gem->Type & SOCKET_COLOR_RELIC_ARCANE) - AddStat(ITEM_SPEC_STAT_RELIC_ARCANE); - if (gem->Type & SOCKET_COLOR_RELIC_FROST) - AddStat(ITEM_SPEC_STAT_RELIC_FROST); - if (gem->Type & SOCKET_COLOR_RELIC_FIRE) - AddStat(ITEM_SPEC_STAT_RELIC_FIRE); - if (gem->Type & SOCKET_COLOR_RELIC_WATER) - AddStat(ITEM_SPEC_STAT_RELIC_WATER); - if (gem->Type & SOCKET_COLOR_RELIC_LIFE) - AddStat(ITEM_SPEC_STAT_RELIC_LIFE); - if (gem->Type & SOCKET_COLOR_RELIC_WIND) - AddStat(ITEM_SPEC_STAT_RELIC_WIND); - if (gem->Type & SOCKET_COLOR_RELIC_HOLY) - AddStat(ITEM_SPEC_STAT_RELIC_HOLY); - } - } - else - ItemType = 0; - - for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - if (sparse->StatModifierBonusStat[i] != -1) - AddModStat(sparse->StatModifierBonusStat[i]); - } - - void AddStat(ItemSpecStat statType) - { - if (ItemSpecStatCount >= MAX_ITEM_PROTO_STATS) - return; - - for (uint32 i = 0; i < MAX_ITEM_PROTO_STATS; ++i) - if (ItemSpecStatTypes[i] == uint32(statType)) - return; - - ItemSpecStatTypes[ItemSpecStatCount++] = statType; - } - - void AddModStat(int32 itemStatType) - { - switch (itemStatType) - { - case ITEM_MOD_AGILITY: - AddStat(ITEM_SPEC_STAT_AGILITY); - break; - case ITEM_MOD_STRENGTH: - AddStat(ITEM_SPEC_STAT_STRENGTH); - break; - case ITEM_MOD_INTELLECT: - AddStat(ITEM_SPEC_STAT_INTELLECT); - break; - case ITEM_MOD_DODGE_RATING: - AddStat(ITEM_SPEC_STAT_DODGE); - break; - case ITEM_MOD_PARRY_RATING: - AddStat(ITEM_SPEC_STAT_PARRY); - break; - case ITEM_MOD_CRIT_MELEE_RATING: - case ITEM_MOD_CRIT_RANGED_RATING: - case ITEM_MOD_CRIT_SPELL_RATING: - case ITEM_MOD_CRIT_RATING: - AddStat(ITEM_SPEC_STAT_CRIT); - break; - case ITEM_MOD_HASTE_RATING: - AddStat(ITEM_SPEC_STAT_HASTE); - break; - case ITEM_MOD_HIT_RATING: - AddStat(ITEM_SPEC_STAT_HIT); - break; - case ITEM_MOD_EXTRA_ARMOR: - AddStat(ITEM_SPEC_STAT_BONUS_ARMOR); - break; - case ITEM_MOD_AGI_STR_INT: - AddStat(ITEM_SPEC_STAT_AGILITY); - AddStat(ITEM_SPEC_STAT_STRENGTH); - AddStat(ITEM_SPEC_STAT_INTELLECT); - break; - case ITEM_MOD_AGI_STR: - AddStat(ITEM_SPEC_STAT_AGILITY); - AddStat(ITEM_SPEC_STAT_STRENGTH); - break; - case ITEM_MOD_AGI_INT: - AddStat(ITEM_SPEC_STAT_AGILITY); - AddStat(ITEM_SPEC_STAT_INTELLECT); - break; - case ITEM_MOD_STR_INT: - AddStat(ITEM_SPEC_STAT_STRENGTH); - AddStat(ITEM_SPEC_STAT_INTELLECT); - break; - } - } -}; - void ObjectMgr::LoadItemTemplates() { uint32 oldMSTime = getMSTime(); @@ -3299,57 +3089,6 @@ void ObjectMgr::LoadItemTemplates() itemTemplate.ItemSpecClassMask = 0; itemTemplate.QuestLogItemId = 0; - if (std::vector<ItemSpecOverrideEntry const*> const* itemSpecOverrides = sDB2Manager.GetItemSpecOverrides(sparse->ID)) - { - for (ItemSpecOverrideEntry const* itemSpecOverride : *itemSpecOverrides) - { - if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(itemSpecOverride->SpecID)) - { - itemTemplate.ItemSpecClassMask |= 1 << (specialization->ClassID - 1); - itemTemplate.Specializations[0].set(ItemTemplate::CalculateItemSpecBit(specialization)); - itemTemplate.Specializations[1] |= itemTemplate.Specializations[0]; - itemTemplate.Specializations[2] |= itemTemplate.Specializations[0]; - } - } - } - else - { - ItemSpecStats itemSpecStats(db2Data, sparse); - - for (ItemSpecEntry const* itemSpec : sItemSpecStore) - { - if (itemSpecStats.ItemType != itemSpec->ItemType) - continue; - - bool hasPrimary = itemSpec->PrimaryStat == ITEM_SPEC_STAT_NONE; - bool hasSecondary = itemSpec->SecondaryStat == ITEM_SPEC_STAT_NONE; - for (uint32 i = 0; i < itemSpecStats.ItemSpecStatCount; ++i) - { - if (itemSpecStats.ItemSpecStatTypes[i] == itemSpec->PrimaryStat) - hasPrimary = true; - if (itemSpecStats.ItemSpecStatTypes[i] == itemSpec->SecondaryStat) - hasSecondary = true; - } - - if (!hasPrimary || !hasSecondary) - continue; - - if (ChrSpecializationEntry const* specialization = sChrSpecializationStore.LookupEntry(itemSpec->SpecializationID)) - { - if ((1 << (specialization->ClassID - 1)) & sparse->AllowableClass) - { - itemTemplate.ItemSpecClassMask |= 1 << (specialization->ClassID - 1); - std::size_t specBit = ItemTemplate::CalculateItemSpecBit(specialization); - itemTemplate.Specializations[0].set(specBit); - if (itemSpec->MaxLevel > 40) - itemTemplate.Specializations[1].set(specBit); - if (itemSpec->MaxLevel >= 110) - itemTemplate.Specializations[2].set(specBit); - } - } - } - } - // Items that have no specializations set can be used by everyone for (auto& specs : itemTemplate.Specializations) if (specs.count() == 0) diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp index 903bef7790f..e501d901f34 100644 --- a/src/server/game/Handlers/InspectHandler.cpp +++ b/src/server/game/Handlers/InspectHandler.cpp @@ -52,10 +52,12 @@ void WorldSession::HandleInspectOpcode(WorldPackets::Inspect::Inspect& inspect) // if (v.second != PLAYERSPELL_REMOVED) // inspectResult.Talents.push_back(v.first); + /* inspectResult.TalentTraits.Level = player->GetLevel(); inspectResult.TalentTraits.ChrSpecializationID = AsUnderlyingType(player->GetPrimarySpecialization()); if (UF::TraitConfig const* traitConfig = player->GetTraitConfig(player->m_activePlayerData->ActiveCombatTraitConfigID)) inspectResult.TalentTraits.Config = WorldPackets::Traits::TraitConfig(*traitConfig); + */ } if (Guild* guild = sGuildMgr->GetGuildById(player->GetGuildId())) diff --git a/src/server/game/Handlers/LootHandler.cpp b/src/server/game/Handlers/LootHandler.cpp index 42174715278..d3633b3c248 100644 --- a/src/server/game/Handlers/LootHandler.cpp +++ b/src/server/game/Handlers/LootHandler.cpp @@ -499,14 +499,6 @@ void WorldSession::HandleLootRoll(WorldPackets::Loot::LootRoll& packet) lootRoll->PlayerVote(GetPlayer(), RollVote(packet.RollType)); } -void WorldSession::HandleSetLootSpecialization(WorldPackets::Loot::SetLootSpecialization& packet) +void WorldSession::HandleSetLootSpecialization(WorldPackets::Loot::SetLootSpecialization& /*packet*/) { - if (packet.SpecID) - { - if (ChrSpecializationEntry const* chrSpec = sChrSpecializationStore.LookupEntry(packet.SpecID)) - if (chrSpec->ClassID == GetPlayer()->GetClass()) - GetPlayer()->SetLootSpecId(packet.SpecID); - } - else - GetPlayer()->SetLootSpecId(0); } diff --git a/src/server/game/Handlers/TraitHandler.cpp b/src/server/game/Handlers/TraitHandler.cpp index 4b458f576d1..f25752d0231 100644 --- a/src/server/game/Handlers/TraitHandler.cpp +++ b/src/server/game/Handlers/TraitHandler.cpp @@ -143,8 +143,9 @@ void WorldSession::HandleTraitsCommitConfig(WorldPackets::Traits::TraitsCommitCo */ } -void WorldSession::HandleClassTalentsRequestNewConfig(WorldPackets::Traits::ClassTalentsRequestNewConfig& classTalentsRequestNewConfig) +void WorldSession::HandleClassTalentsRequestNewConfig(WorldPackets::Traits::ClassTalentsRequestNewConfig& /*classTalentsRequestNewConfig*/) { + /* if (classTalentsRequestNewConfig.Config.Type != TraitConfigType::Combat) return; @@ -196,6 +197,7 @@ void WorldSession::HandleClassTalentsRequestNewConfig(WorldPackets::Traits::Clas return; _player->CreateTraitConfig(classTalentsRequestNewConfig.Config); + */ } void WorldSession::HandleClassTalentsRenameConfig(WorldPackets::Traits::ClassTalentsRenameConfig& classTalentsRenameConfig) @@ -208,8 +210,9 @@ void WorldSession::HandleClassTalentsDeleteConfig(WorldPackets::Traits::ClassTal _player->DeleteTraitConfig(classTalentsDeleteConfig.ConfigID); } -void WorldSession::HandleClassTalentsSetStarterBuildActive(WorldPackets::Traits::ClassTalentsSetStarterBuildActive const& classTalentsSetStarterBuildActive) +void WorldSession::HandleClassTalentsSetStarterBuildActive(WorldPackets::Traits::ClassTalentsSetStarterBuildActive const& /*classTalentsSetStarterBuildActive*/) { + /* UF::TraitConfig const* traitConfig = _player->GetTraitConfig(classTalentsSetStarterBuildActive.ConfigID); if (!traitConfig) return; @@ -246,6 +249,7 @@ void WorldSession::HandleClassTalentsSetStarterBuildActive(WorldPackets::Traits: } else _player->SetTraitConfigUseStarterBuild(classTalentsSetStarterBuildActive.ConfigID, false); + */ } void WorldSession::HandleClassTalentsSetUsesSharedActionBars(WorldPackets::Traits::ClassTalentsSetUsesSharedActionBars const& classTalentsSetUsesSharedActionBars) diff --git a/src/server/game/Loot/Loot.cpp b/src/server/game/Loot/Loot.cpp index ab022379792..edbdd6c9013 100644 --- a/src/server/game/Loot/Loot.cpp +++ b/src/server/game/Loot/Loot.cpp @@ -143,9 +143,6 @@ bool LootItem::ItemAllowedForPlayer(Player const* player, Loot const* loot, uint if (strictUsabilityCheck) { - if ((pProto->IsWeapon() || pProto->IsArmor()) && !pProto->IsUsableByLootSpecialization(player, true)) - return false; - if (player->CanRollNeedForItem(pProto, nullptr, false) != EQUIP_ERR_OK) return false; } diff --git a/src/server/game/Miscellaneous/CommonHelpers.cpp b/src/server/game/Miscellaneous/CommonHelpers.cpp new file mode 100644 index 00000000000..6dc2adc6fb3 --- /dev/null +++ b/src/server/game/Miscellaneous/CommonHelpers.cpp @@ -0,0 +1,96 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#include "CommonHelpers.h" +#include "Common.h" +#include "Item.h" +#include "ItemTemplate.h" +#include "Player.h" +#include "SharedDefines.h" + +uint8 Trinity::Helpers::Entity::GetPlayerSpecialization(Player const* who) +{ + if (!who) + return 0; + + uint32 tabId = who->GetPrimaryTalentTree(); + TalentTabEntry const* tabEntry = sTalentTabStore.LookupEntry(tabId); + if (!tabEntry) + return 0; + + return tabEntry->OrderIndex; +} + +bool Trinity::Helpers::Entity::IsPlayerHealer(Player const* who) +{ + if (!who) + return false; + + switch (who->GetClass()) + { + case CLASS_WARRIOR: + case CLASS_HUNTER: + case CLASS_ROGUE: + case CLASS_DEATH_KNIGHT: + case CLASS_MAGE: + case CLASS_WARLOCK: + default: + return false; + case CLASS_PALADIN: + return (Trinity::Helpers::Entity::GetPlayerSpecialization(who) == SPEC_PALADIN_HOLY); + case CLASS_PRIEST: + return (Trinity::Helpers::Entity::GetPlayerSpecialization(who) != SPEC_PRIEST_SHADOW); + case CLASS_SHAMAN: + return (Trinity::Helpers::Entity::GetPlayerSpecialization(who) == SPEC_SHAMAN_RESTORATION); + case CLASS_DRUID: + return (Trinity::Helpers::Entity::GetPlayerSpecialization(who) == SPEC_DRUID_RESTORATION); + } +} + +bool Trinity::Helpers::Entity::IsPlayerRangedAttacker(Player const* who) +{ + if (!who) + return false; + + switch (who->GetClass()) + { + case CLASS_WARRIOR: + case CLASS_PALADIN: + case CLASS_ROGUE: + case CLASS_DEATH_KNIGHT: + default: + return false; + case CLASS_MAGE: + case CLASS_WARLOCK: + return true; + case CLASS_HUNTER: + { + // check if we have a ranged weapon equipped + Item const* rangedSlot = who->GetItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_RANGED); + if (ItemTemplate const* rangedTemplate = rangedSlot ? rangedSlot->GetTemplate() : nullptr) + if ((1 << rangedTemplate->GetSubClass()) & ITEM_SUBCLASS_MASK_WEAPON_RANGED) + return true; + return false; + } + case CLASS_PRIEST: + return (Trinity::Helpers::Entity::GetPlayerSpecialization(who) == SPEC_PRIEST_SHADOW); + case CLASS_SHAMAN: + return (Trinity::Helpers::Entity::GetPlayerSpecialization(who) == SPEC_SHAMAN_ELEMENTAL); + case CLASS_DRUID: + return (Trinity::Helpers::Entity::GetPlayerSpecialization(who) == SPEC_DRUID_BALANCE); + } +} diff --git a/src/server/game/Miscellaneous/CommonHelpers.h b/src/server/game/Miscellaneous/CommonHelpers.h new file mode 100644 index 00000000000..e9951f3426a --- /dev/null +++ b/src/server/game/Miscellaneous/CommonHelpers.h @@ -0,0 +1,39 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +#ifndef TRINITY_COMMONHELPERS_H +#define TRINITY_COMMONHELPERS_H + +#include "Define.h" + +class Player; + +namespace Trinity +{ + namespace Helpers + { + namespace Entity + { + // Return values range from 0 (left-most spec) to 2 (right-most spec). If two specs have the same number of talent points, the left-most of those specs is returned. + uint8 GetPlayerSpecialization(Player const* who); + bool IsPlayerHealer(Player const* who); + bool IsPlayerRangedAttacker(Player const* who); + } + } +} + +#endif //TRINITY_COMMONHELPERS_H diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 3adf09cba24..af1d754ab20 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -185,6 +185,40 @@ constexpr uint32 MAX_CLASS_ID = CLASS_DRUID; (1<<(CLASS_DEMON_HUNTER-1)) | \ (1<<(CLASS_EVOKER-1))) +enum PlayerSpecializations : uint8 +{ + SPEC_WARRIOR_ARMS = 0, + SPEC_WARRIOR_FURY = 1, + SPEC_WARRIOR_PROTECTION = 2, + SPEC_PALADIN_HOLY = 0, + SPEC_PALADIN_PROTECTION = 1, + SPEC_PALADIN_RETRIBUTION = 2, + SPEC_HUNTER_BEAST_MASTERY = 0, + SPEC_HUNTER_MARKSMANSHIP = 1, + SPEC_HUNTER_SURVIVAL = 2, + SPEC_ROGUE_ASSASSINATION = 0, + SPEC_ROGUE_COMBAT = 1, + SPEC_ROGUE_SUBLETY = 2, + SPEC_PRIEST_DISCIPLINE = 0, + SPEC_PRIEST_HOLY = 1, + SPEC_PRIEST_SHADOW = 2, + SPEC_DEATH_KNIGHT_BLOOD = 0, + SPEC_DEATH_KNIGHT_FROST = 1, + SPEC_DEATH_KNIGHT_UNHOLY = 2, + SPEC_SHAMAN_ELEMENTAL = 0, + SPEC_SHAMAN_ENHANCEMENT = 1, + SPEC_SHAMAN_RESTORATION = 2, + SPEC_MAGE_ARCANE = 0, + SPEC_MAGE_FIRE = 1, + SPEC_MAGE_FROST = 2, + SPEC_WARLOCK_AFFLICTION = 0, + SPEC_WARLOCK_DEMONOLOGY = 1, + SPEC_WARLOCK_DESTRUCTION = 2, + SPEC_DRUID_BALANCE = 0, + SPEC_DRUID_FERAL = 1, + SPEC_DRUID_RESTORATION = 2 +}; + // valid classes for creature_template.unit_class enum UnitClass { diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index fbc6e256408..21af63f970f 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -158,8 +158,6 @@ EnumCharactersResult::CharacterInfo::CharacterInfo(Field const* fields) std::vector<std::string_view> equipment = Trinity::Tokenize(fields[17].GetStringView(), ' ', false); ListPosition = fields[19].GetUInt8(); LastPlayedTime = fields[20].GetInt64(); - if (ChrSpecializationEntry const* spec = sDB2Manager.GetChrSpecializationByIndex(ClassID, fields[21].GetUInt8())) - SpecID = spec->ID; LastLoginVersion = fields[22].GetUInt32(); diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp index 942ffdc8f63..cd188712349 100644 --- a/src/server/game/Server/Packets/InspectPackets.cpp +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -76,7 +76,7 @@ ByteBuffer& operator<<(ByteBuffer& data, InspectItemData const& itemData) void PlayerModelDisplayInfo::Initialize(Player const* player) { GUID = player->GetGUID(); - SpecializationID = AsUnderlyingType(player->GetPrimarySpecialization()); + SpecializationID = player->GetPrimaryTalentTree(); Name = player->GetName(); GenderID = player->GetNativeGender(); Race = player->GetRace(); diff --git a/src/server/game/Server/Packets/PartyPackets.cpp b/src/server/game/Server/Packets/PartyPackets.cpp index fe533101dae..b42ceca8007 100644 --- a/src/server/game/Server/Packets/PartyPackets.cpp +++ b/src/server/game/Server/Packets/PartyPackets.cpp @@ -627,7 +627,7 @@ void WorldPackets::Party::PartyMemberFullState::Initialize(Player const* player) MemberStats.PositionY = int16(player->GetPositionY()); MemberStats.PositionZ = int16(player->GetPositionZ()); - MemberStats.SpecID = AsUnderlyingType(player->GetPrimarySpecialization()); + MemberStats.SpecID = player->GetPrimaryTalentTree(); MemberStats.PartyType[0] = player->m_playerData->PartyType[0]; MemberStats.PartyType[1] = player->m_playerData->PartyType[1]; diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 2c454ee55d9..c418dc4a613 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -6164,7 +6164,7 @@ void AuraEffect::HandleShowConfirmationPrompt(AuraApplication const* aurApp, uin player->RemoveTemporarySpell(GetSpellEffectInfo().TriggerSpell); } -void AuraEffect::HandleOverridePetSpecs(AuraApplication const* aurApp, uint8 mode, bool apply) const +void AuraEffect::HandleOverridePetSpecs(AuraApplication const* aurApp, uint8 mode, bool /*apply*/) const { if (!(mode & AURA_EFFECT_HANDLE_REAL)) return; @@ -6180,11 +6180,13 @@ void AuraEffect::HandleOverridePetSpecs(AuraApplication const* aurApp, uint8 mod if (!pet) return; + /* ChrSpecializationEntry const* currSpec = sChrSpecializationStore.LookupEntry(pet->GetSpecialization()); if (!currSpec) return; pet->SetSpecialization(sDB2Manager.GetChrSpecializationByIndex(apply ? PET_SPEC_OVERRIDE_CLASS_INDEX : 0, currSpec->OrderIndex)->ID); + */ } void AuraEffect::HandleAllowUsingGameobjectsWhileMounted(AuraApplication const* aurApp, uint8 mode, bool apply) const diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index e7df19f190f..76e557892e6 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -4165,9 +4165,11 @@ float SpellInfo::CalcProcPPM(Unit* caster, int32 itemLevel) const } case SPELL_PPM_MOD_SPEC: { + /* if (Player* plrCaster = caster->ToPlayer()) if (plrCaster->GetPrimarySpecialization() == ChrSpecialization(mod->Param)) ppm *= 1.0f + mod->Coeff; + */ break; } case SPELL_PPM_MOD_RACE: diff --git a/src/server/game/Spells/TraitMgr.cpp b/src/server/game/Spells/TraitMgr.cpp index 3f0e73c7679..017f7757cfa 100644 --- a/src/server/game/Spells/TraitMgr.cpp +++ b/src/server/game/Spells/TraitMgr.cpp @@ -285,8 +285,9 @@ TraitConfigType GetConfigTypeForTree(int32 traitTreeId) * @param traitConfig config data * @return Trait tree data */ -std::vector<Tree const*> const* GetTreesForConfig(WorldPackets::Traits::TraitConfig const& traitConfig) +std::vector<Tree const*> const* GetTreesForConfig(WorldPackets::Traits::TraitConfig const& /*traitConfig*/) { + /* switch (traitConfig.Type) { case TraitConfigType::Combat: @@ -300,6 +301,7 @@ std::vector<Tree const*> const* GetTreesForConfig(WorldPackets::Traits::TraitCon default: break; } + */ return nullptr; } @@ -451,6 +453,7 @@ bool MeetsTraitCondition(WorldPackets::Traits::TraitConfig const& traitConfig, P if (condition->AchievementID && !player.HasAchieved(condition->AchievementID)) return false; + /* if (condition->SpecSetID) { uint32 chrSpecializationId = player.GetPrimarySpecialization(); @@ -460,6 +463,7 @@ bool MeetsTraitCondition(WorldPackets::Traits::TraitConfig const& traitConfig, P if (!sDB2Manager.IsSpecSetMember(condition->SpecSetID, chrSpecializationId)) return false; } + */ if (condition->TraitCurrencyID && condition->SpentAmountRequired) { diff --git a/src/server/game/Tools/CharacterDatabaseCleaner.cpp b/src/server/game/Tools/CharacterDatabaseCleaner.cpp index 3405427f91a..d27fd004f1b 100644 --- a/src/server/game/Tools/CharacterDatabaseCleaner.cpp +++ b/src/server/game/Tools/CharacterDatabaseCleaner.cpp @@ -140,7 +140,7 @@ bool CharacterDatabaseCleaner::TalentCheck(uint32 talent_id) if (!talentInfo) return false; - return sChrSpecializationStore.LookupEntry(talentInfo->SpecID) != nullptr; + return sTalentTabStore.LookupEntry(talentInfo->TabID) != nullptr; } void CharacterDatabaseCleaner::CleanCharacterTalent() diff --git a/src/server/scripts/Commands/cs_learn.cpp b/src/server/scripts/Commands/cs_learn.cpp index b8b43344dff..557e48fe04e 100644 --- a/src/server/scripts/Commands/cs_learn.cpp +++ b/src/server/scripts/Commands/cs_learn.cpp @@ -195,9 +195,6 @@ public: if (playerClass != talentInfo->ClassID) continue; - if (talentInfo->SpecID && player->GetPrimarySpecialization() != ChrSpecialization(talentInfo->SpecID)) - continue; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(talentInfo->SpellID, DIFFICULTY_NONE); if (!spellInfo || !SpellMgr::IsSpellValid(spellInfo, handler->GetSession()->GetPlayer(), false)) continue; diff --git a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp index 0812891367b..102714a3b71 100644 --- a/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp +++ b/src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp @@ -242,7 +242,7 @@ struct boss_volazj : public BossAI // clone player->CastSpell(summon, SPELL_CLONE_PLAYER, true); summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_CLASS, player->GetClass()); - summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_SPEC, AsUnderlyingType(player->GetPrimarySpecialization())); + summon->GetAI()->SetData(DATA_TWISTED_VISAGE_PLAYER_SPEC, player->GetPrimaryTalentTree()); summon->SetReactState(REACT_AGGRESSIVE); DoZoneInCombat(summon); // set phase @@ -417,11 +417,40 @@ struct npc_twisted_visage : public ScriptedAI void AttackStart(Unit* who) override { - ChrSpecializationEntry const* chrSpecialization = sChrSpecializationStore.LookupEntry(_playerSpec); - if (chrSpecialization && chrSpecialization->GetFlags().HasFlag(ChrSpecializationFlag::Ranged)) - ScriptedAI::AttackStartCaster(who, 25.0f); - else - ScriptedAI::AttackStart(who); + switch (_playerClass) + { + case CLASS_SHAMAN: + switch (_playerSpec) + { + case SPEC_SHAMAN_ELEMENTAL: + case SPEC_SHAMAN_RESTORATION: + ScriptedAI::AttackStartCaster(who, 25.0f); + break; + default: + break; + } + break; + case CLASS_DRUID: + switch (_playerSpec) + { + case SPEC_DRUID_BALANCE: + case SPEC_DRUID_RESTORATION: + ScriptedAI::AttackStartCaster(who, 25.0f); + break; + default: + break; + } + break; + case CLASS_PRIEST: + case CLASS_HUNTER: + case CLASS_MAGE: + case CLASS_WARLOCK: + ScriptedAI::AttackStartCaster(who, 25.0f); + break; + case CLASS_ROGUE: + ScriptedAI::AttackStart(who); + break; + } } void SetData(uint32 type, uint32 data) override @@ -439,9 +468,9 @@ struct npc_twisted_visage : public ScriptedAI switch (_playerClass) { case CLASS_WARRIOR: - switch (ChrSpecialization(data)) + switch (data) { - case ChrSpecialization::WarriorArms: + case SPEC_WARRIOR_ARMS: _scheduler.Schedule(3s, [this](TaskContext mortalStrike) { DoCastVictim(SPELL_TWISTED_VISAGE_MORTAL_STRIKE); @@ -453,7 +482,7 @@ struct npc_twisted_visage : public ScriptedAI }); break; default: - case ChrSpecialization::WarriorFury: + case SPEC_WARRIOR_FURY: _scheduler.Schedule(2s, [this](TaskContext intercept) { if (!me->IsWithinCombatRange(me->GetVictim(), 8.0f)) @@ -469,7 +498,7 @@ struct npc_twisted_visage : public ScriptedAI bloodthirst.Repeat(3s, 5s); }); break; - case ChrSpecialization::WarriorProtection: + case SPEC_WARRIOR_PROTECTION: _scheduler.Schedule(5s, [this](TaskContext thunderClap) { DoCastSelf(SPELL_TWISTED_VISAGE_THUNDER_CLAP); @@ -483,9 +512,9 @@ struct npc_twisted_visage : public ScriptedAI } break; case CLASS_PALADIN: - switch (ChrSpecialization(data)) + switch (data) { - case ChrSpecialization::PaladinProtection: + case SPEC_PALADIN_PROTECTION: _scheduler.Schedule(5s, [this](TaskContext consecration) { DoCastSelf(SPELL_TWISTED_VISAGE_CONSECRATION); @@ -497,7 +526,7 @@ struct npc_twisted_visage : public ScriptedAI }); break; default: - case ChrSpecialization::PaladinRetribution: + case SPEC_PALADIN_RETRIBUTION: _scheduler.Schedule(5s, [this](TaskContext consecration) { DoCastSelf(SPELL_TWISTED_VISAGE_CONSECRATION); @@ -542,9 +571,9 @@ struct npc_twisted_visage : public ScriptedAI }); break; case CLASS_PRIEST: - switch (ChrSpecialization(data)) + switch (data) { - case ChrSpecialization::PriestShadow: + case SPEC_PRIEST_SHADOW: _scheduler.Schedule(5s, [this](TaskContext shadowWordPain) { DoCastVictim(SPELL_TWISTED_VISAGE_SHADOW_WORD_PAIN); @@ -595,10 +624,10 @@ struct npc_twisted_visage : public ScriptedAI }); break; case CLASS_SHAMAN: - switch (ChrSpecialization(data)) + switch (data) { default: - case ChrSpecialization::ShamanElemental: + case SPEC_SHAMAN_ELEMENTAL: _scheduler.Schedule(5s, [this](TaskContext thunderstorm) { DoCastSelf(SPELL_TWISTED_VISAGE_THUNDERSTORM); @@ -609,14 +638,14 @@ struct npc_twisted_visage : public ScriptedAI lightningBolt.Repeat(3s, 5s); }); break; - case ChrSpecialization::ShamanEnhancement: + case SPEC_SHAMAN_ENHANCEMENT: _scheduler.Schedule(2s, [this](TaskContext earthShock) { DoCastVictim(SPELL_TWISTED_VISAGE_EARTH_SHOCK); earthShock.Repeat(3s, 5s); }); break; - case ChrSpecialization::ShamanRestoration: + case SPEC_SHAMAN_RESTORATION: _scheduler.Schedule(2s, [this](TaskContext earthShield) { if (Unit* target = DoSelectLowestHpFriendly(40.f)) @@ -662,9 +691,9 @@ struct npc_twisted_visage : public ScriptedAI }); break; case CLASS_DRUID: - switch (ChrSpecialization(data)) + switch (data) { - case ChrSpecialization::DruidBalance: + case SPEC_DRUID_BALANCE: _scheduler.Schedule(2s, [this](TaskContext moonfire) { DoCastVictim(SPELL_TWISTED_VISAGE_MOONFIRE); @@ -675,8 +704,7 @@ struct npc_twisted_visage : public ScriptedAI wrath.Repeat(3s, 5s); }); break; - case ChrSpecialization::DruidGuardian: - case ChrSpecialization::DruidFeral: + case SPEC_DRUID_FERAL: _scheduler.Schedule(1ms, [this](TaskContext /*catForm*/) { DoCastSelf(SPELL_TWISTED_VISAGE_CAT_FORM); @@ -691,7 +719,7 @@ struct npc_twisted_visage : public ScriptedAI }); break; default: - case ChrSpecialization::DruidRestoration: + case SPEC_DRUID_RESTORATION: _scheduler.Schedule(2s, [this](TaskContext lifebloom) { if (Unit* target = DoSelectLowestHpFriendly(40.f)) diff --git a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp index 807109e1493..46bc594645c 100644 --- a/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp +++ b/src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp @@ -16,6 +16,7 @@ */ #include "icecrown_citadel.h" +#include "CommonHelpers.h" #include "Containers.h" #include "DB2Stores.h" #include "GridNotifiers.h" @@ -1089,18 +1090,30 @@ class spell_sindragosa_unchained_magic : public SpellScript if (!player) continue; - ChrSpecializationEntry const* specialization = player->GetPrimarySpecializationEntry(); - if (!specialization) - continue; - - if (specialization->GetRole() == ChrSpecializationRole::Healer) + if (Trinity::Helpers::Entity::IsPlayerHealer(player)) { healers.push_back(target); continue; } - if (specialization->GetFlags().HasFlag(ChrSpecializationFlag::Caster)) - casters.push_back(target); + switch (player->GetClass()) + { + case CLASS_PRIEST: + case CLASS_MAGE: + case CLASS_WARLOCK: + casters.push_back(target); + break; + case CLASS_SHAMAN: + if (Trinity::Helpers::Entity::GetPlayerSpecialization(player) != SPEC_SHAMAN_ENHANCEMENT) + casters.push_back(target); + break; + case CLASS_DRUID: + if (Trinity::Helpers::Entity::GetPlayerSpecialization(player) != SPEC_DRUID_FERAL) + casters.push_back(target); + break; + default: + break; + } } targets.clear(); diff --git a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp index a36f99be4a2..a1864798ff1 100644 --- a/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp +++ b/src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp @@ -15,11 +15,12 @@ * with this program. If not, see <http://www.gnu.org/licenses/>. */ +#include "naxxramas.h" #include "ScriptMgr.h" +#include "CommonHelpers.h" #include "GameObject.h" #include "InstanceScript.h" #include "MotionMaster.h" -#include "naxxramas.h" #include "ObjectAccessor.h" #include "Player.h" #include "PlayerAI.h" @@ -183,7 +184,7 @@ class KelThuzadCharmedPlayerAI : public SimpleCharmedPlayerAI if (pTarget->HasBreakableByDamageCrowdControlAura()) return false; // We _really_ dislike healers. So we hit them in the face. Repeatedly. Exclusively. - return PlayerAI::IsPlayerHealer(pTarget); + return Trinity::Helpers::Entity::IsPlayerHealer(pTarget); } }; diff --git a/src/server/scripts/Spells/spell_item.cpp b/src/server/scripts/Spells/spell_item.cpp index a9c0464863c..6ec90ad3535 100644 --- a/src/server/scripts/Spells/spell_item.cpp +++ b/src/server/scripts/Spells/spell_item.cpp @@ -4252,119 +4252,6 @@ class spell_item_sephuzs_secret : public AuraScript } }; -enum AmalgamsSeventhSpine -{ - SPELL_FRAGILE_ECHOES_MONK = 225281, - SPELL_FRAGILE_ECHOES_SHAMAN = 225292, - SPELL_FRAGILE_ECHOES_PRIEST_DISCIPLINE = 225294, - SPELL_FRAGILE_ECHOES_PALADIN = 225297, - SPELL_FRAGILE_ECHOES_DRUID = 225298, - SPELL_FRAGILE_ECHOES_PRIEST_HOLY = 225366, - SPELL_FRAGILE_ECHOES_EVOKER = 429020, - SPELL_FRAGILE_ECHO_ENERGIZE = 215270, -}; - -// 215266 - Fragile Echoes -class spell_item_amalgams_seventh_spine : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo - ({ - SPELL_FRAGILE_ECHOES_MONK, - SPELL_FRAGILE_ECHOES_SHAMAN, - SPELL_FRAGILE_ECHOES_PRIEST_DISCIPLINE, - SPELL_FRAGILE_ECHOES_PALADIN, - SPELL_FRAGILE_ECHOES_DRUID, - SPELL_FRAGILE_ECHOES_PRIEST_HOLY, - SPELL_FRAGILE_ECHOES_EVOKER - }); - } - - void UpdateSpecAura(bool apply) const - { - Player* target = GetUnitOwner()->ToPlayer(); - if (!target) - return; - - auto updateAuraIfInCorrectSpec = [&](ChrSpecialization spec, AmalgamsSeventhSpine aura) - { - if (!apply || target->GetPrimarySpecialization() != spec) - target->RemoveAurasDueToSpell(aura); - else if (!target->HasAura(aura)) - target->CastSpell(target, aura, GetEffect(EFFECT_0)); - }; - - switch (target->GetClass()) - { - case CLASS_MONK: - updateAuraIfInCorrectSpec(ChrSpecialization::MonkMistweaver, SPELL_FRAGILE_ECHOES_MONK); - break; - case CLASS_SHAMAN: - updateAuraIfInCorrectSpec(ChrSpecialization::ShamanRestoration, SPELL_FRAGILE_ECHOES_SHAMAN); - break; - case CLASS_PRIEST: - updateAuraIfInCorrectSpec(ChrSpecialization::PriestDiscipline, SPELL_FRAGILE_ECHOES_PRIEST_DISCIPLINE); - updateAuraIfInCorrectSpec(ChrSpecialization::PriestHoly, SPELL_FRAGILE_ECHOES_PRIEST_HOLY); - break; - case CLASS_PALADIN: - updateAuraIfInCorrectSpec(ChrSpecialization::PaladinHoly, SPELL_FRAGILE_ECHOES_PALADIN); - break; - case CLASS_DRUID: - updateAuraIfInCorrectSpec(ChrSpecialization::DruidRestoration, SPELL_FRAGILE_ECHOES_DRUID); - break; - case CLASS_EVOKER: - updateAuraIfInCorrectSpec(ChrSpecialization::EvokerPreservation, SPELL_FRAGILE_ECHOES_EVOKER); - break; - default: - break; - } - } - - void HandleHeartbeat() const - { - UpdateSpecAura(true); - } - - void HandleRemove(AuraEffect const* /*aurEff*/, AuraEffectHandleModes /*mode*/) const - { - UpdateSpecAura(false); - } - - void Register() override - { - OnHeartbeat += AuraHeartbeatFn(spell_item_amalgams_seventh_spine::HandleHeartbeat); - AfterEffectRemove += AuraEffectRemoveFn(spell_item_amalgams_seventh_spine::HandleRemove, EFFECT_0, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } -}; - -// 215267 - Fragile Echo -class spell_item_amalgams_seventh_spine_mana_restore : public AuraScript -{ - bool Validate(SpellInfo const* /*spellInfo*/) override - { - return ValidateSpellInfo({ SPELL_FRAGILE_ECHO_ENERGIZE }); - } - - void TriggerManaRestoration(AuraEffect const* aurEff, AuraEffectHandleModes /*mode*/) const - { - if (GetTargetApplication()->GetRemoveMode() != AURA_REMOVE_BY_EXPIRE) - return; - - Unit* caster = GetCaster(); - if (!caster) - return; - - if (AuraEffect const* trinketEffect = caster->GetAuraEffect(aurEff->GetSpellEffectInfo().TriggerSpell, EFFECT_0)) - caster->CastSpell(caster, SPELL_FRAGILE_ECHO_ENERGIZE, CastSpellExtraArgs(aurEff).AddSpellMod(SPELLVALUE_BASE_POINT0, trinketEffect->GetAmount())); - } - - void Register() override - { - AfterEffectRemove += AuraEffectRemoveFn(spell_item_amalgams_seventh_spine_mana_restore::TriggerManaRestoration, EFFECT_1, SPELL_AURA_DUMMY, AURA_EFFECT_HANDLE_REAL); - } -}; - // 228445 - March of the Legion class spell_item_set_march_of_the_legion : public AuraScript { @@ -4787,8 +4674,6 @@ void AddSC_item_spell_scripts() RegisterSpellScript(spell_item_eggnog); RegisterSpellScript(spell_item_sephuzs_secret); - RegisterSpellScript(spell_item_amalgams_seventh_spine); - RegisterSpellScript(spell_item_amalgams_seventh_spine_mana_restore); RegisterSpellScript(spell_item_set_march_of_the_legion); RegisterSpellScript(spell_item_seal_of_darkshire_nobility); RegisterSpellScript(spell_item_lightblood_elixir); |