aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMeji <alvaro.megias@outlook.com>2023-03-30 17:35:58 +0200
committerGitHub <noreply@github.com>2023-03-30 17:35:58 +0200
commit229a7ac79d38b9db76387f92e846c04c151ad3aa (patch)
tree83260381e739a9ae9e367fe35220b0a23ab47705 /src
parent98df53650b62695c2519014b4a7900fa88f356be (diff)
Core/Skinning: Update correct skinning skill according to creature expansion (#28861)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Entities/Player/Player.cpp56
-rw-r--r--src/server/game/Entities/Player/Player.h2
-rw-r--r--src/server/game/Entities/Unit/Unit.h1
-rw-r--r--src/server/game/Spells/Spell.cpp8
-rw-r--r--src/server/game/Spells/SpellEffects.cpp18
5 files changed, 33 insertions, 52 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index b3c813be426..5875c671799 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -5548,16 +5548,22 @@ bool Player::UpdateCraftSkill(SpellInfo const* spellInfo)
return false;
}
-bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator /*= 1*/, WorldObject const* object /*= nullptr*/)
+bool Player::UpdateGatherSkill(uint32 skillId, uint32 skillValue, uint32 redLevel, uint32 multiplicator /*= 1*/, WorldObject const* object /*= nullptr*/)
{
TC_LOG_DEBUG("entities.player.skills", "Player::UpdateGatherSkill: Player '{}' ({}), SkillID: {}, SkillLevel: {}, RedLevel: {})",
- GetName(), GetGUID().ToString(), SkillId, SkillValue, RedLevel);
+ GetName(), GetGUID().ToString(), skillId, skillValue, redLevel);
- uint32 gathering_skill_gain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
+ SkillLineEntry const* skillEntry = sSkillLineStore.LookupEntry(skillId);
+ if (!skillEntry)
+ return false;
+
+ uint32 gatheringSkillGain = sWorld->getIntConfig(CONFIG_SKILL_GAIN_GATHERING);
+
+ uint32 baseSkillLevelStep = 30;
+ uint32 yellowLevel = redLevel + baseSkillLevelStep;
+ uint32 greenLevel = yellowLevel + baseSkillLevelStep;
+ uint32 grayLevel = greenLevel + baseSkillLevelStep;
- uint32 grayLevel = RedLevel + 100;
- uint32 greenLevel = RedLevel + 50;
- uint32 yellowLevel = RedLevel + 25;
if (GameObject const* go = Object::ToGameObject(object))
{
if (go->GetGOInfo()->GetTrivialSkillLow())
@@ -5570,46 +5576,20 @@ bool Player::UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLeve
}
// For skinning and Mining chance decrease with level. 1-74 - no decrease, 75-149 - 2 times, 225-299 - 8 times
- switch (SkillId)
+ switch (skillEntry->ParentSkillLineID)
{
case SKILL_HERBALISM:
- case SKILL_CLASSIC_HERBALISM:
- case SKILL_OUTLAND_HERBALISM:
- case SKILL_NORTHREND_HERBALISM:
- case SKILL_CATACLYSM_HERBALISM:
- case SKILL_PANDARIA_HERBALISM:
- case SKILL_DRAENOR_HERBALISM:
- case SKILL_LEGION_HERBALISM:
- case SKILL_KUL_TIRAN_HERBALISM:
- case SKILL_JEWELCRAFTING:
- case SKILL_INSCRIPTION:
- return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, grayLevel, greenLevel, yellowLevel) * Multiplicator, gathering_skill_gain);
+ return UpdateSkillPro(skillId, SkillGainChance(skillValue, grayLevel, greenLevel, yellowLevel) * multiplicator, gatheringSkillGain);
case SKILL_SKINNING:
- case SKILL_CLASSIC_SKINNING:
- case SKILL_OUTLAND_SKINNING:
- case SKILL_NORTHREND_SKINNING:
- case SKILL_CATACLYSM_SKINNING:
- case SKILL_PANDARIA_SKINNING:
- case SKILL_DRAENOR_SKINNING:
- case SKILL_LEGION_SKINNING:
- case SKILL_KUL_TIRAN_SKINNING:
if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS) == 0)
- return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, grayLevel, greenLevel, yellowLevel) * Multiplicator, gathering_skill_gain);
+ return UpdateSkillPro(skillId, SkillGainChance(skillValue, grayLevel, greenLevel, yellowLevel) * multiplicator, gatheringSkillGain);
else
- return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, grayLevel, greenLevel, yellowLevel) * Multiplicator) >> (SkillValue / sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS)), gathering_skill_gain);
+ return UpdateSkillPro(skillId, (SkillGainChance(skillValue, grayLevel, greenLevel, yellowLevel) * multiplicator) >> (skillValue / sWorld->getIntConfig(CONFIG_SKILL_CHANCE_SKINNING_STEPS)), gatheringSkillGain);
case SKILL_MINING:
- case SKILL_CLASSIC_MINING:
- case SKILL_OUTLAND_MINING:
- case SKILL_NORTHREND_MINING:
- case SKILL_CATACLYSM_MINING:
- case SKILL_PANDARIA_MINING:
- case SKILL_DRAENOR_MINING:
- case SKILL_LEGION_MINING:
- case SKILL_KUL_TIRAN_MINING:
if (sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS) == 0)
- return UpdateSkillPro(SkillId, SkillGainChance(SkillValue, grayLevel, greenLevel, yellowLevel) * Multiplicator, gathering_skill_gain);
+ return UpdateSkillPro(skillId, SkillGainChance(skillValue, grayLevel, greenLevel, yellowLevel) * multiplicator, gatheringSkillGain);
else
- return UpdateSkillPro(SkillId, (SkillGainChance(SkillValue, grayLevel, greenLevel, yellowLevel) * Multiplicator) >> (SkillValue / sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS)), gathering_skill_gain);
+ return UpdateSkillPro(skillId, (SkillGainChance(skillValue, grayLevel, greenLevel, yellowLevel) * multiplicator) >> (skillValue / sWorld->getIntConfig(CONFIG_SKILL_CHANCE_MINING_STEPS)), gatheringSkillGain);
}
return false;
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 2a89b326754..c4e6bce850c 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2024,7 +2024,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool UpdateSkillPro(uint16 skillId, int32 chance, uint32 step);
bool UpdateCraftSkill(SpellInfo const* spellInfo);
- bool UpdateGatherSkill(uint32 SkillId, uint32 SkillValue, uint32 RedLevel, uint32 Multiplicator = 1, WorldObject const* object = nullptr);
+ bool UpdateGatherSkill(uint32 skillId, uint32 skillValue, uint32 redLevel, uint32 multiplicator = 1, WorldObject const* object = nullptr);
bool UpdateFishingSkill(int32 expansion);
float GetHealthBonusFromStamina() const;
diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h
index aad726ce8ca..39c60a575cc 100644
--- a/src/server/game/Entities/Unit/Unit.h
+++ b/src/server/game/Entities/Unit/Unit.h
@@ -852,6 +852,7 @@ class TC_GAME_API Unit : public WorldObject
bool IsTotem() const { return (m_unitTypeMask & UNIT_MASK_TOTEM) != 0; }
bool IsVehicle() const { return (m_unitTypeMask & UNIT_MASK_VEHICLE) != 0; }
+ int32 GetContentTuning() const { return m_unitData->ContentTuningID; }
uint8 GetLevel() const { return uint8(m_unitData->Level); }
uint8 GetLevelForTarget(WorldObject const* /*target*/) const override { return GetLevel(); }
void SetLevel(uint8 lvl, bool sendUpdate = true);
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 6d6e5e7e44f..35fa7d853f6 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -6016,14 +6016,6 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32
if (loot && (!loot->isLooted() || loot->loot_type == LOOT_SKINNING))
return SPELL_FAILED_TARGET_NOT_LOOTED;
- uint32 skill = creature->GetCreatureTemplate()->GetRequiredLootSkill();
-
- int32 skillValue = m_caster->ToPlayer()->GetSkillValue(skill);
- int32 TargetLevel = m_targets.GetUnitTarget()->GetLevelForTarget(m_caster);
- int32 ReqValue = (skillValue < 100 ? (TargetLevel-10) * 10 : TargetLevel * 5);
- if (ReqValue > skillValue)
- return SPELL_FAILED_LOW_CASTLEVEL;
-
break;
}
case SPELL_EFFECT_OPEN_LOCK:
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 39d9e952c68..f3526a6a32f 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -3723,6 +3723,7 @@ void Spell::EffectSkinning()
loot->FillLoot(creature->GetCreatureTemplate()->SkinLootId, LootTemplates_Skinning, player, true);
player->SendLoot(*loot);
+ // This formula is still used (10.0.5.48526)
if (skill == SKILL_SKINNING)
{
int32 reqValue;
@@ -3751,12 +3752,19 @@ void Spell::EffectSkinning()
else
reqValue = 900;
- // TODO: Specialize skillid for each expansion
- // new db field?
- // tied to one of existing expansion fields in creature_template?
+ ContentTuningEntry const* contentTuning = sContentTuningStore.LookupEntry(creature->GetContentTuning());
+ if (!contentTuning)
+ return;
+
+ uint32 skinningSkill = player->GetProfessionSkillForExp(skill, contentTuning->ExpansionID);
+ if (!skinningSkill)
+ return;
- // Double chances for elites
- m_caster->ToPlayer()->UpdateGatherSkill(skill, damage, reqValue, creature->isElite() ? 2 : 1);
+ if (uint32 pureSkillValue = player->GetPureSkillValue(skinningSkill))
+ {
+ // Double chances for elites
+ player->UpdateGatherSkill(skinningSkill, pureSkillValue, reqValue, creature->isElite() ? 2 : 1);
+ }
}
}