From 6cff433d237e711f3e77103b855f3a3f01dd58ff Mon Sep 17 00:00:00 2001 From: Paul Coene Date: Mon, 31 Jul 2023 21:00:48 -0400 Subject: [PATCH] [Scaling/Bug Fix] Scaling where min and max damage was bugged (#3514) * [Scaling/Bug Fix] Scaling where min and max damage were both 0 tossed out min_dmg * Clamp values so independant calls dont leave us in odd state --- zone/npc.cpp | 22 ++++------------------ zone/npc_scale_manager.cpp | 25 +++++++++---------------- 2 files changed, 13 insertions(+), 34 deletions(-) diff --git a/zone/npc.cpp b/zone/npc.cpp index 5563ffde7..0e5422997 100644 --- a/zone/npc.cpp +++ b/zone/npc.cpp @@ -2583,30 +2583,16 @@ 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; - } - + // 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); - - // TODO: fix DB - - if (max_dmg < min_dmg) { - const auto temporary_damage = min_dmg; - min_dmg = max_dmg; - max_dmg = temporary_damage; - } - + // 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; diff --git a/zone/npc_scale_manager.cpp b/zone/npc_scale_manager.cpp index 4d04fd3c1..5949b7e8e 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)) {