diff options
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 44 |
1 files changed, 39 insertions, 5 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 1b78d61ed9c..2941d93898c 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2299,14 +2299,18 @@ void Spell::EffectLearnSkill() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + Player* playerTarget = Object::ToPlayer(unitTarget); + if (!playerTarget) return; if (damage < 1) return; uint32 skillid = effectInfo->MiscValue; - SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skillid, unitTarget->GetRace(), unitTarget->GetClass()); + if (effectInfo->Effect == SPELL_EFFECT_SKILL && playerTarget->GetSkillStep(skillid) >= damage) + return; + + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skillid, playerTarget->GetRace(), playerTarget->GetClass()); if (!rcEntry) return; @@ -2314,8 +2318,13 @@ void Spell::EffectLearnSkill() if (!tier) return; - uint16 skillval = unitTarget->ToPlayer()->GetPureSkillValue(skillid); - unitTarget->ToPlayer()->SetSkill(skillid, damage, std::max<uint16>(skillval, 1), tier->Value[damage - 1]); + uint16 skillval = std::max<uint16>(1, playerTarget->GetPureSkillValue(skillid)); + uint16 maxSkillVal = tier->Value[damage - 1]; + + if (rcEntry->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) + skillval = maxSkillVal; + + playerTarget->SetSkill(skillid, damage, skillval, maxSkillVal); } void Spell::EffectPlayMovie() @@ -4538,7 +4547,32 @@ void Spell::EffectSkill() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - TC_LOG_DEBUG("spells", "WORLD: SkillEFFECT"); + Player* playerTarget = Object::ToPlayer(GetUnitCasterForEffectHandlers()); + if (!playerTarget) + return; + + if (damage < 1) + return; + + uint32 skillid = effectInfo->MiscValue; + if (effectInfo->Effect == SPELL_EFFECT_SKILL && playerTarget->GetSkillStep(skillid) >= damage) + return; + + SkillRaceClassInfoEntry const* rcEntry = sDB2Manager.GetSkillRaceClassInfo(skillid, playerTarget->GetRace(), playerTarget->GetClass()); + if (!rcEntry) + return; + + SkillTiersEntry const* tier = sObjectMgr->GetSkillTier(rcEntry->SkillTierID); + if (!tier) + return; + + uint16 skillval = std::max<uint16>(1, playerTarget->GetPureSkillValue(skillid)); + uint16 maxSkillVal = tier->Value[damage - 1]; + + if (rcEntry->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) + skillval = maxSkillVal; + + playerTarget->SetSkill(skillid, damage, skillval, maxSkillVal); } void Spell::EffectSpiritHeal() |
