diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 80 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 44 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 7 |
3 files changed, 113 insertions, 18 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 180ce2558da..d5b1db07180 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -3114,13 +3114,44 @@ bool Player::AddSpell(uint32 spellId, bool active, bool learning, bool dependent // add dependent skills if this spell is not learned from adding skill already if (spellLearnSkill->skill != fromSkill) { - uint32 skill_value = GetPureSkillValue(spellLearnSkill->skill); - uint32 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill); + uint16 skill_value = GetPureSkillValue(spellLearnSkill->skill); + uint16 skill_max_value = GetPureMaxSkillValue(spellLearnSkill->skill); if (skill_value < spellLearnSkill->value) skill_value = spellLearnSkill->value; - uint32 new_skill_max_value = spellLearnSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : spellLearnSkill->maxvalue; + uint16 new_skill_max_value = spellLearnSkill->maxvalue; + + if (new_skill_max_value == 0) + { + if (SkillRaceClassInfoEntry const* rcInfo = sDB2Manager.GetSkillRaceClassInfo(spellLearnSkill->skill, GetRace(), GetClass())) + { + switch (GetSkillRangeType(rcInfo)) + { + case SKILL_RANGE_LANGUAGE: + skill_value = 300; + new_skill_max_value = 300; + break; + case SKILL_RANGE_LEVEL: + new_skill_max_value = GetMaxSkillValueForLevel(); + break; + case SKILL_RANGE_MONO: + new_skill_max_value = 1; + break; + case SKILL_RANGE_RANK: + { + SkillTiersEntry const* tier = sObjectMgr->GetSkillTier(rcInfo->SkillTierID); + new_skill_max_value = tier->Value[spellLearnSkill->step - 1]; + break; + } + default: + break; + } + + if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) + skill_value = new_skill_max_value; + } + } if (skill_max_value < new_skill_max_value) skill_max_value = new_skill_max_value; @@ -3361,17 +3392,50 @@ void Player::RemoveSpell(uint32 spell_id, bool disabled /*= false*/, bool learn_ SetSkill(spellLearnSkill->skill, 0, 0, 0); else // set to prev. skill setting values { - uint32 skill_value = GetPureSkillValue(prevSkill->skill); - uint32 skill_max_value = GetPureMaxSkillValue(prevSkill->skill); + uint16 skill_value = GetPureSkillValue(prevSkill->skill); + uint16 skill_max_value = GetPureMaxSkillValue(prevSkill->skill); - if (skill_value > prevSkill->value) - skill_value = prevSkill->value; + uint16 new_skill_max_value = prevSkill->maxvalue; - uint32 new_skill_max_value = prevSkill->maxvalue == 0 ? GetMaxSkillValueForLevel() : prevSkill->maxvalue; + if (new_skill_max_value == 0) + { + if (SkillRaceClassInfoEntry const* rcInfo = sDB2Manager.GetSkillRaceClassInfo(prevSkill->skill, GetRace(), GetClass())) + { + switch (GetSkillRangeType(rcInfo)) + { + case SKILL_RANGE_LANGUAGE: + skill_value = 300; + new_skill_max_value = 300; + break; + case SKILL_RANGE_LEVEL: + new_skill_max_value = GetMaxSkillValueForLevel(); + break; + case SKILL_RANGE_MONO: + new_skill_max_value = 1; + break; + case SKILL_RANGE_RANK: + { + SkillTiersEntry const* tier = sObjectMgr->GetSkillTier(rcInfo->SkillTierID); + new_skill_max_value = tier->Value[prevSkill->step - 1]; + break; + } + default: + break; + } + + if (rcInfo->Flags & SKILL_FLAG_ALWAYS_MAX_VALUE) + skill_value = new_skill_max_value; + } + } + else if (skill_value > prevSkill->value) + skill_value = prevSkill->value; if (skill_max_value > new_skill_max_value) skill_max_value = new_skill_max_value; + if (skill_value > new_skill_max_value) + skill_value = new_skill_max_value; + SetSkill(prevSkill->skill, prevSkill->step, skill_value, skill_max_value); } } 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() diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 72ad8ccd7fa..a5009bdd6c8 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -965,11 +965,8 @@ void SpellMgr::LoadSpellLearnSkills() case SPELL_EFFECT_SKILL: dbc_node.skill = uint16(spellEffectInfo.MiscValue); dbc_node.step = uint16(spellEffectInfo.CalcValue()); - if (dbc_node.skill != SKILL_RIDING) - dbc_node.value = 1; - else - dbc_node.value = dbc_node.step * 75; - dbc_node.maxvalue = dbc_node.step * 75; + dbc_node.value = 0; + dbc_node.maxvalue = 0; break; case SPELL_EFFECT_DUAL_WIELD: dbc_node.skill = SKILL_DUAL_WIELD; |
