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