Core/Misc: removed most retail specialization code and restored legacy functionality for Classic

This commit is contained in:
Ovahlord
2024-09-01 06:52:54 +02:00
parent b0f12aeceb
commit b5e681e682
44 changed files with 351 additions and 982 deletions

View File

@@ -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;

View File

@@ -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))

View File

@@ -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();

View File

@@ -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);
}
};

View File

@@ -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);