From 441a935bd91f00e1874542588b24ec694fb3d64d Mon Sep 17 00:00:00 2001 From: MagicBot Date: Mon, 19 Oct 2026 14:11:21 -0400 Subject: [PATCH] Read armor resists from the cache template EnumMap Resists.getArmorResists and NPCManager.applyEquipmentResists now read cacheTemplate.getCombatAttackResist() with DamageType keys instead of the legacy String-keyed map, and default a missing key to 0 instead of an unboxing NPE. Offline parity (scripts/p15a.py, all 7586 static_item_templates rows vs the template CObjectIndex.lookup picks): 0 differences in the full combat_attack_resist map. Every ITEM/DEED/RUNE template carries all 16 keys, so no value changes. No comparator added or removed. Co-Authored-By: Claude Opus 5.5 --- src/engine/gameManager/NPCManager.java | 10 +++++++--- src/engine/objects/Resists.java | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/engine/gameManager/NPCManager.java b/src/engine/gameManager/NPCManager.java index 584ea145..8ab554f2 100644 --- a/src/engine/gameManager/NPCManager.java +++ b/src/engine/gameManager/NPCManager.java @@ -25,6 +25,7 @@ import engine.server.MBServerStatics; import org.pmw.tinylog.Logger; import java.util.ArrayList; +import java.util.EnumMap; import java.util.HashMap; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ThreadLocalRandom; @@ -438,14 +439,17 @@ public enum NPCManager { public static void applyEquipmentResists(Mob mob) { + EnumMap armorResists; + if (mob.charItemManager.equipped.isEmpty()) return; for (Item equipped : mob.charItemManager.equipped.values()) { if (equipped.template.cacheTemplate.getItemType().equals(mbEnums.ItemType.ARMOR)) { - mob.resists.setResist(mbEnums.DamageType.SLASHING, mob.resists.getResist(mbEnums.DamageType.SLASHING, 0) + equipped.template.combat_attack_resist.get("SLASHING")); - mob.resists.setResist(mbEnums.DamageType.CRUSHING, mob.resists.getResist(mbEnums.DamageType.CRUSHING, 0) + equipped.template.combat_attack_resist.get("CRUSHING")); - mob.resists.setResist(mbEnums.DamageType.PIERCING, mob.resists.getResist(mbEnums.DamageType.PIERCING, 0) + equipped.template.combat_attack_resist.get("PIERCING")); + armorResists = equipped.template.cacheTemplate.getCombatAttackResist(); + mob.resists.setResist(mbEnums.DamageType.SLASHING, mob.resists.getResist(mbEnums.DamageType.SLASHING, 0) + armorResists.getOrDefault(mbEnums.DamageType.SLASHING, 0f)); + mob.resists.setResist(mbEnums.DamageType.CRUSHING, mob.resists.getResist(mbEnums.DamageType.CRUSHING, 0) + armorResists.getOrDefault(mbEnums.DamageType.CRUSHING, 0f)); + mob.resists.setResist(mbEnums.DamageType.PIERCING, mob.resists.getResist(mbEnums.DamageType.PIERCING, 0) + armorResists.getOrDefault(mbEnums.DamageType.PIERCING, 0f)); } } } diff --git a/src/engine/objects/Resists.java b/src/engine/objects/Resists.java index a0de2e6f..84e3b323 100644 --- a/src/engine/objects/Resists.java +++ b/src/engine/objects/Resists.java @@ -19,6 +19,7 @@ import org.pmw.tinylog.Logger; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.EnumMap; import java.util.HashSet; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; @@ -159,13 +160,16 @@ public class Resists { private static float[] getArmorResists(Item armor, float[] phys) { + EnumMap armorResists; + if (armor == null) return phys; if (armor.template.cacheTemplate.getItemType().equals(mbEnums.ItemType.ARMOR)) { - phys[0] += armor.template.combat_attack_resist.get("SLASHING"); - phys[1] += armor.template.combat_attack_resist.get("CRUSHING"); - phys[2] += armor.template.combat_attack_resist.get("PIERCING"); + armorResists = armor.template.cacheTemplate.getCombatAttackResist(); + phys[0] += armorResists.getOrDefault(mbEnums.DamageType.SLASHING, 0f); + phys[1] += armorResists.getOrDefault(mbEnums.DamageType.CRUSHING, 0f); + phys[2] += armorResists.getOrDefault(mbEnums.DamageType.PIERCING, 0f); } return phys;