aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellEffects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
-rw-r--r--src/server/game/Spells/SpellEffects.cpp44
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()