aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/hotfixes/cata_classic/2024_09_01_00_hotfixes.sql5
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.cpp21
-rw-r--r--src/server/database/Database/Implementation/HotfixDatabase.h13
-rw-r--r--src/server/game/AI/PlayerAI/PlayerAI.cpp117
-rw-r--r--src/server/game/AI/PlayerAI/PlayerAI.h15
-rw-r--r--src/server/game/Achievements/CriteriaHandler.cpp11
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp2
-rw-r--r--src/server/game/Chat/HyperlinkTags.cpp13
-rw-r--r--src/server/game/Chat/Hyperlinks.cpp1
-rw-r--r--src/server/game/Chat/Hyperlinks.h15
-rw-r--r--src/server/game/Conditions/ConditionMgr.cpp21
-rw-r--r--src/server/game/DataStores/DB2LoadInfo.h63
-rw-r--r--src/server/game/DataStores/DB2Stores.cpp65
-rw-r--r--src/server/game/DataStores/DB2Stores.h8
-rw-r--r--src/server/game/DataStores/DB2Structure.h56
-rw-r--r--src/server/game/DataStores/DBCEnums.h109
-rw-r--r--src/server/game/DungeonFinding/LFGMgr.cpp10
-rw-r--r--src/server/game/Entities/Item/Item.cpp3
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.cpp29
-rw-r--r--src/server/game/Entities/Item/ItemTemplate.h2
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp42
-rw-r--r--src/server/game/Entities/Player/Player.h6
-rw-r--r--src/server/game/Entities/Unit/StatSystem.cpp3
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp261
-rw-r--r--src/server/game/Handlers/InspectHandler.cpp2
-rw-r--r--src/server/game/Handlers/LootHandler.cpp10
-rw-r--r--src/server/game/Handlers/TraitHandler.cpp8
-rw-r--r--src/server/game/Loot/Loot.cpp3
-rw-r--r--src/server/game/Miscellaneous/CommonHelpers.cpp96
-rw-r--r--src/server/game/Miscellaneous/CommonHelpers.h39
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h34
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/InspectPackets.cpp2
-rw-r--r--src/server/game/Server/Packets/PartyPackets.cpp2
-rw-r--r--src/server/game/Spells/Auras/SpellAuraEffects.cpp4
-rw-r--r--src/server/game/Spells/SpellInfo.cpp2
-rw-r--r--src/server/game/Spells/TraitMgr.cpp6
-rw-r--r--src/server/game/Tools/CharacterDatabaseCleaner.cpp2
-rw-r--r--src/server/scripts/Commands/cs_learn.cpp3
-rw-r--r--src/server/scripts/Northrend/AzjolNerub/Ahnkahet/boss_herald_volazj.cpp76
-rw-r--r--src/server/scripts/Northrend/IcecrownCitadel/boss_sindragosa.cpp27
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_kelthuzad.cpp5
-rw-r--r--src/server/scripts/Spells/spell_item.cpp115
44 files changed, 351 insertions, 982 deletions
diff --git a/sql/updates/hotfixes/cata_classic/2024_09_01_00_hotfixes.sql b/sql/updates/hotfixes/cata_classic/2024_09_01_00_hotfixes.sql
new file mode 100644
index 00000000000..2ad5240ed13
--- /dev/null
+++ b/sql/updates/hotfixes/cata_classic/2024_09_01_00_hotfixes.sql
@@ -0,0 +1,5 @@
+DROP TABLE IF EXISTS `chr_specialization`;
+DROP TABLE IF EXISTS `chr_specialization_locale`;
+DROP TABLE IF EXISTS `item_spec`;
+DROP TABLE IF EXISTS `item_spec_override`;
+DROP TABLE IF EXISTS `spec_set_member`;
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);