Core/Skinning: Autolearn skill of skinned mob if not already learned (#28894)

This commit is contained in:
Meji
2023-04-06 17:28:38 +02:00
committed by GitHub
parent c21a01442e
commit 74c280da9e
3 changed files with 90 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
DELETE FROM `spell_script_names` WHERE `spell_id`=8613;
INSERT INTO `spell_script_names` (`spell_id`, `ScriptName`) VALUES
(8613, 'spell_gen_skinning');

View File

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

View File

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