From c7d8483d553060ae9e138e9435bfc8b48ee8914d Mon Sep 17 00:00:00 2001 From: MagicBot Date: Mon, 19 Oct 2026 14:22:36 -0400 Subject: [PATCH] Read item race/class/disc requirements from the cache template ValidRace/ValidClass/ValidDiscipline use the single req set plus the restrict flag (true = blacklist, false = whitelist) instead of the legacy req/res split. Offline parity (p15c.py, 7586 rows): 0 differences in restrict or set for race, class and disc. Value changes: none for equip checks. The legacy disc blacklist branch was inverted (passed only when a listed disc was held); the new check passes when none is held. No ITEM has a disc blacklist (only 19 RUNEs), and ValidDiscipline has no callers. Co-Authored-By: Claude Opus 5.5 --- src/engine/gameManager/ItemManager.java | 60 +++++++++---------------- 1 file changed, 20 insertions(+), 40 deletions(-) diff --git a/src/engine/gameManager/ItemManager.java b/src/engine/gameManager/ItemManager.java index c5bb2a74..ac97103d 100644 --- a/src/engine/gameManager/ItemManager.java +++ b/src/engine/gameManager/ItemManager.java @@ -21,66 +21,46 @@ public enum ItemManager { public static final AtomicInteger lastNegativeID = new AtomicInteger(0); + // restrict true: the set is a blacklist; false: a whitelist. An empty set allows everyone. + public static Boolean ValidRace(Item item, mbEnums.MonsterType race) { - if (item.template.item_race_req.isEmpty() && item.template.item_race_res.isEmpty()) + EnumSet races = item.template.cacheTemplate.getItemRaceReq(); + boolean restrict = item.template.cacheTemplate.getItemRaceReqRestrict(); + + if (races.isEmpty()) return true; - if (item.template.item_race_req.isEmpty() == false) - if (item.template.item_race_req.contains(race)) - return true; - - if (item.template.item_race_res.isEmpty() == false) - if (item.template.item_race_res.contains(race) == false) - return true; - - return false; + return races.contains(race) != restrict; } public static Boolean ValidClass(Item item, mbEnums.ClassType base, mbEnums.ClassType profession) { - // Early exit if no entry + EnumSet classes = item.template.cacheTemplate.getItemClassReq(); + boolean restrict = item.template.cacheTemplate.getItemClassReqRestrict(); + boolean listed; - if (item.template.item_class_req.isEmpty() && item.template.item_class_res.isEmpty()) + if (classes.isEmpty()) return true; - if (item.template.item_class_req.isEmpty() == false) - if (item.template.item_class_req.contains(base) || item.template.item_class_req.contains(profession)) - return true; + listed = classes.contains(base) || classes.contains(profession); - if (item.template.item_class_res.isEmpty() == false) - if (item.template.item_class_res.contains(base) == false && item.template.item_class_res.contains(profession) == false) - return true; - - return false; + return listed != restrict; } public static Boolean ValidDiscipline(Item item, EnumSet discs) { - // Early exit if no entry + EnumSet disciplines = item.template.cacheTemplate.getItemDiscReq(); + boolean restrict = item.template.cacheTemplate.getItemDiscReqRestrict(); + EnumSet workSet; - if (item.template.item_disc_req.isEmpty() && item.template.item_disc_res.isEmpty()) + if (disciplines.isEmpty()) return true; - EnumSet workSet = EnumSet.copyOf(discs); + workSet = EnumSet.copyOf(discs); + workSet.retainAll(disciplines); - if (item.template.item_disc_req.isEmpty() == false) { - - workSet.retainAll(item.template.item_disc_req); - - if (workSet.isEmpty() == false) - return true; - } - - if (item.template.item_disc_res.isEmpty() == false) { - - workSet.retainAll(item.template.item_disc_res); - - if (workSet.isEmpty() == false) - return true; - } - - return false; + return workSet.isEmpty() == restrict; } public static Boolean canCharacterEquip(Item item, AbstractCharacter character) {