From d1330e693833fd0981e572c69b623b3ca6bb82f8 Mon Sep 17 00:00:00 2001 From: Noudess Date: Fri, 28 Jul 2023 16:15:31 -0400 Subject: [PATCH 1/2] [Scaling/Bug Fix] Scaling where min and max damage were both 0 tossed out min_dmg --- zone/npc.cpp | 18 ------------------ zone/npc_scale_manager.cpp | 25 +++++++++---------------- 2 files changed, 9 insertions(+), 34 deletions(-) diff --git a/zone/npc.cpp b/zone/npc.cpp index 5563ffde71..214df1de2c 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -2583,30 +2583,12 @@ void NPC::ModifyNPCStat(const std::string& stat, const std::string& value) } else if (stat_lower == "min_hit") { min_dmg = Strings::ToInt(value); - - // TODO: fix DB - - if (min_dmg > max_dmg) { - const auto temporary_damage = max_dmg; - max_dmg = min_dmg; - min_dmg = temporary_damage; - } - base_damage = round((max_dmg - min_dmg) / 1.9); min_damage = min_dmg - round(base_damage / 10.0); return; } else if (stat_lower == "max_hit") { max_dmg = Strings::ToInt(value); - - // TODO: fix DB - - if (max_dmg < min_dmg) { - const auto temporary_damage = min_dmg; - min_dmg = max_dmg; - max_dmg = temporary_damage; - } - base_damage = round((max_dmg - min_dmg) / 1.9); min_damage = min_dmg - round(base_damage / 10.0); return; diff --git a/zone/npc_scale_manager.cpp b/zone/npc_scale_manager.cpp index 4d04fd3c19..5949b7e8ef 100644 --- a/zone/npc_scale_manager.cpp +++ b/zone/npc_scale_manager.cpp @@ -135,31 +135,24 @@ void NpcScaleManager::ScaleNPC( npc->ModifyNPCStat("phr", std::to_string(scale_data.physical_resist)); } - auto min_damage_set = false; + // If either is scaled, both need to be. The values for base_damage and min_damage will be in flux until + // both are complete. - if (always_scale || npc->GetMinDMG() == 0) { + if (always_scale || npc->GetMinDMG() == 0 || npc->GetMaxDMG() == 0) { int64 min_dmg = scale_data.min_dmg; + int64 max_dmg = scale_data.max_dmg; + if (RuleB(Combat, UseNPCDamageClassLevelMods)) { uint32 class_level_damage_mod = GetClassLevelDamageMod(npc->GetLevel(), npc->GetClass()); min_dmg = (min_dmg * class_level_damage_mod) / 220; - - LogNPCScaling("ClassLevelDamageMod::min_dmg base: [{}] calc: [{}]", scale_data.min_dmg, min_dmg); + max_dmg = (max_dmg * class_level_damage_mod) / 220; } npc->ModifyNPCStat("min_hit", std::to_string(min_dmg)); - min_damage_set = true; - } - - if (always_scale || npc->GetMaxDMG() == 0 || min_damage_set) { - int64 max_dmg = scale_data.max_dmg; - if (RuleB(Combat, UseNPCDamageClassLevelMods)) { - uint32 class_level_damage_mod = GetClassLevelDamageMod(npc->GetLevel(), npc->GetClass()); - max_dmg = (scale_data.max_dmg * class_level_damage_mod) / 220; - - LogNPCScaling("ClassLevelDamageMod::max_dmg base: [{}] calc: [{}]", scale_data.max_dmg, max_dmg); - } - npc->ModifyNPCStat("max_hit", std::to_string(max_dmg)); + + LogNPCScaling("ClassLevelDamageMod::min_dmg base: [{}] calc: [{}]", scale_data.min_dmg, min_dmg); + LogNPCScaling("ClassLevelDamageMod::max_dmg base: [{}] calc: [{}]", scale_data.max_dmg, max_dmg); } if (always_scale || (npc->GetHPRegen() == 0 && is_auto_scaled)) { From 683d68af49bbad76e1fd64f17e3f275d03626e59 Mon Sep 17 00:00:00 2001 From: Noudess Date: Mon, 31 Jul 2023 08:59:08 -0400 Subject: [PATCH 2/2] Clamp values so independant calls dont leave us in odd state --- zone/npc.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/zone/npc.cpp b/zone/npc.cpp index 214df1de2c..0e54229979 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -2583,12 +2583,16 @@ void NPC::ModifyNPCStat(const std::string& stat, const std::string& value) } else if (stat_lower == "min_hit") { min_dmg = Strings::ToInt(value); + // Clamp max_dmg to be >= min_dmg + max_dmg = std::max(min_dmg, max_dmg); base_damage = round((max_dmg - min_dmg) / 1.9); min_damage = min_dmg - round(base_damage / 10.0); return; } else if (stat_lower == "max_hit") { max_dmg = Strings::ToInt(value); + // Clamp min_dmg to be <= max_dmg + min_dmg = std::min(min_dmg, max_dmg); base_damage = round((max_dmg - min_dmg) / 1.9); min_damage = min_dmg - round(base_damage / 10.0); return;