From 9a10574e59541fdae7b7baeba4299d114044ce99 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Mon, 19 Oct 2026 12:45:59 -0400 Subject: [PATCH] Read defense, bulk and primary attr from the cache ItemTemplate item_defense_rating, item_bulk_factor and item_primary_attr are Item-only fields, not on CObjectTemplate, so their consumers read engine.parsers.objects.ItemTemplate._items by templateID, like the RuneTemplate and DeedTemplate consumers. The primary attr checks compare with == because the cache template leaves the attr null (legacy: None) on non-weapons. Parity (offline, scripts/p14.py, 7586 templates): 0 differences in item_defense_rating, item_bulk_factor and item_primary_attr. Every DB ARMOR and WEAPON template is in the ITEM folder, so both sides gate these fields on the same templates. No value changes expected. JSON-Refactor-Plan Task 1.4. Co-Authored-By: Claude Opus 5.5 --- src/engine/gameManager/NPCManager.java | 6 +++--- src/engine/objects/AbstractCharacter.java | 12 ++++++------ src/engine/objects/PlayerCharacter.java | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/engine/gameManager/NPCManager.java b/src/engine/gameManager/NPCManager.java index 3dbea024..f15c6610 100644 --- a/src/engine/gameManager/NPCManager.java +++ b/src/engine/gameManager/NPCManager.java @@ -315,7 +315,7 @@ public enum NPCManager { //has main hand weapon Item weapon = guard.charItemManager.equipped.get(mbEnums.EquipSlotType.RHELD); - if (weapon.template.item_primary_attr.equals(mbEnums.AttributeType.Strength)) + if (engine.parsers.objects.ItemTemplate._items.get(weapon.templateID).item_primary_attr == mbEnums.AttributeType.Strength) primaryStat = guard.getStatStrCurrent(); else primaryStat = guard.getStatDexCurrent(); @@ -327,7 +327,7 @@ public enum NPCManager { } else if (guard.charItemManager.equipped.containsKey(mbEnums.EquipSlotType.LHELD) && !ItemManager.isShield(guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD).template)) { //has off hand weapon Item weapon = guard.charItemManager.equipped.get(mbEnums.EquipSlotType.LHELD); - if (weapon.template.item_primary_attr.equals(mbEnums.AttributeType.Strength)) + if (engine.parsers.objects.ItemTemplate._items.get(weapon.templateID).item_primary_attr == mbEnums.AttributeType.Strength) primaryStat = guard.getStatStrCurrent(); else primaryStat = guard.getStatDexCurrent(); @@ -353,7 +353,7 @@ public enum NPCManager { int armorDefense = 0; for (Item equipped : guard.charItemManager.equipped.values()) if (equipped.template.cacheTemplate.getItemType().equals(mbEnums.ItemType.ARMOR) || ItemManager.isShield(equipped.template)) - armorDefense += equipped.template.item_defense_rating; + armorDefense += engine.parsers.objects.ItemTemplate._items.get(equipped.templateID).item_defense_rating; guard.defenseRating = dexterity + baseDef + armorDefense; } diff --git a/src/engine/objects/AbstractCharacter.java b/src/engine/objects/AbstractCharacter.java index 0312630b..00770cb0 100644 --- a/src/engine/objects/AbstractCharacter.java +++ b/src/engine/objects/AbstractCharacter.java @@ -778,7 +778,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject { min = damages[0]; max = damages[1]; - strBased = weaponTemplate.item_primary_attr.equals(AttributeType.Strength); + strBased = engine.parsers.objects.ItemTemplate._items.get(weapon.templateID).item_primary_attr == AttributeType.Strength; } if (abstractCharacter.effects != null && abstractCharacter.effects.containsKey("DeathShroud")) @@ -970,7 +970,7 @@ public abstract class AbstractCharacter extends AbstractWorldObject { } else skillMod = blockSkill.getModifiedAmount(); - float def = template.item_defense_rating; + float def = engine.parsers.objects.ItemTemplate._items.get(shield.templateID).item_defense_rating; //apply item defense bonuses @@ -1001,20 +1001,20 @@ public abstract class AbstractCharacter extends AbstractWorldObject { return 0; if (armor.template.item_skill_used.isEmpty()) - return template.item_defense_rating; + return engine.parsers.objects.ItemTemplate._items.get(armor.templateID).item_defense_rating; CharacterSkill armorSkill = abstractCharacter.skills.get(armor.template.item_skill_used); if (abstractCharacter.getObjectType().equals(GameObjectType.PlayerCharacter) && armorSkill == null) { Logger.error("Player " + abstractCharacter.getObjectUUID() + " has armor equipped without the nescessary skill to equip it"); - return template.item_defense_rating; + return engine.parsers.objects.ItemTemplate._items.get(armor.templateID).item_defense_rating; } if (armorSkill == null) - return template.item_defense_rating; // Mobiles do not have armor skills @TODO + return engine.parsers.objects.ItemTemplate._items.get(armor.templateID).item_defense_rating; // Mobiles do not have armor skills @TODO - float def = template.item_defense_rating; + float def = engine.parsers.objects.ItemTemplate._items.get(armor.templateID).item_defense_rating; //apply item defense bonuses diff --git a/src/engine/objects/PlayerCharacter.java b/src/engine/objects/PlayerCharacter.java index 96b55b73..f81b62d2 100644 --- a/src/engine/objects/PlayerCharacter.java +++ b/src/engine/objects/PlayerCharacter.java @@ -1356,7 +1356,7 @@ public class PlayerCharacter extends AbstractCharacter { ItemTemplate ab = armor.template; if (ab == null) return 0f; - return ab.item_bulk_factor; + return engine.parsers.objects.ItemTemplate._items.get(armor.templateID).item_bulk_factor; } public static void InitializeSkillsOnLoad(PlayerCharacter pc) {