diff options
author | Meji <alvaro.megias@outlook.com> | 2023-04-06 17:28:38 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-04-06 17:28:38 +0200 |
commit | 74c280da9eac16c5d4a875ff2ea5aa30034ff1dd (patch) | |
tree | 9c0747368643a8d6f02d4bd7b62d1daf480b1e90 /src | |
parent | c21a01442eb7f24dd9ba06eb2045f09ba27bff5b (diff) |
Core/Skinning: Autolearn skill of skinned mob if not already learned (#28894)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 4 | ||||
-rw-r--r-- | src/server/scripts/Spells/spell_generic.cpp | 83 |
2 files changed, 87 insertions, 0 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index f3526a6a32f..35a4879dd5c 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -3723,6 +3723,10 @@ void Spell::EffectSkinning() loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, player, true); player->SendLoot(*loot); + if (!IsPartOfSkillLine(skill, m_spellInfo->Id)) + return; + + // Skill gain for skinning // This formula is still used (10.0.5.48526) if (skill == SKILL_SKINNING) { diff --git a/src/server/scripts/Spells/spell_generic.cpp b/src/server/scripts/Spells/spell_generic.cpp index 974362634c5..5ecc8a1f325 100644 --- a/src/server/scripts/Spells/spell_generic.cpp +++ b/src/server/scripts/Spells/spell_generic.cpp @@ -5228,6 +5228,88 @@ class spell_gen_despawn_all_summons_owned_by_caster : public SpellScript } }; +enum SkinningLearningSpell +{ + SPELL_CLASSIC_SKINNING = 265856, + SPELL_OUTLAND_SKINNING = 265858, + SPELL_NORTHREND_SKINNING = 265860, + SPELL_CATACLYSM_SKINNING = 265862, + SPELL_PANDARIA_SKINNING = 265864, + SPELL_DRAENOR_SKINNING = 265866, + SPELL_LEGION_SKINNING = 265868, + SPELL_KUL_TIRAN_SKINNING = 265870, + SPELL_ZANDALARI_SKINNING = 265872, + SPELL_SHADOWLANDS_SKINNING = 308570, + SPELL_DRAGON_ISLES_SKINNING = 366263 +}; + +// 8613 - Skinning +class spell_gen_skinning : public SpellScript +{ + PrepareSpellScript(spell_gen_skinning); + + bool Validate(SpellInfo const* /*spell*/) override + { + return ValidateSpellInfo( + { + SPELL_OUTLAND_SKINNING, + SPELL_NORTHREND_SKINNING, + SPELL_CATACLYSM_SKINNING, + SPELL_PANDARIA_SKINNING, + SPELL_DRAENOR_SKINNING, + SPELL_KUL_TIRAN_SKINNING, + SPELL_ZANDALARI_SKINNING, + SPELL_SHADOWLANDS_SKINNING, + SPELL_DRAGON_ISLES_SKINNING + }); + } + + void HandleSkinningEffect(SpellEffIndex /*effIndex*/) + { + Player* player = GetCaster()->ToPlayer(); + if (!player) + return; + + ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(GetHitUnit()->GetContentTuning()); + if (!contentTuning) + return; + + uint32 skinningSkill = player->GetProfessionSkillForExp(SKILL_SKINNING, contentTuning->ExpansionID); + if (!skinningSkill) + return; + + // Autolearning missing skinning skill (Dragonflight) + auto getSkinningLearningSpellBySkill = [&]() -> uint32 + { + switch (skinningSkill) + { + case SKILL_OUTLAND_SKINNING: return SPELL_OUTLAND_SKINNING; + case SKILL_NORTHREND_SKINNING: return SPELL_NORTHREND_SKINNING; + case SKILL_CATACLYSM_SKINNING: return SPELL_CATACLYSM_SKINNING; + case SKILL_PANDARIA_SKINNING: return SPELL_PANDARIA_SKINNING; + case SKILL_DRAENOR_SKINNING: return SPELL_DRAENOR_SKINNING; + case SKILL_KUL_TIRAN_SKINNING: return player->GetTeam() == ALLIANCE ? SPELL_KUL_TIRAN_SKINNING : SPELL_ZANDALARI_SKINNING; + case SKILL_SHADOWLANDS_SKINNING: return SPELL_SHADOWLANDS_SKINNING; + case SKILL_DRAGON_ISLES_SKINNING: return SPELL_DRAGON_ISLES_SKINNING; + case SKILL_CLASSIC_SKINNING: // Trainer only + case SKILL_LEGION_SKINNING: // Quest only + default: break; + } + + return 0; + }; + + if (!player->HasSkill(skinningSkill)) + if (uint32 spellId = getSkinningLearningSpellBySkill()) + player->CastSpell(nullptr, spellId, true); + } + + void Register() override + { + OnEffectHitTarget += SpellEffectFn(spell_gen_skinning::HandleSkinningEffect, EFFECT_0, SPELL_EFFECT_SKINNING); + } +}; + void AddSC_generic_spell_scripts() { RegisterSpellScript(spell_gen_absorb0_hitlimit1); @@ -5389,4 +5471,5 @@ void AddSC_generic_spell_scripts() RegisterSpellScript(spell_gen_eject_passengers_3_8); RegisterSpellScript(spell_gen_reverse_cast_target_to_caster_triggered); RegisterSpellScript(spell_gen_despawn_all_summons_owned_by_caster); + RegisterSpellScript(spell_gen_skinning); } |