From 9e50d0a5add39934b56a75288ba805367c1fc179 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Mon, 26 Oct 2026 11:42:09 -0400 Subject: [PATCH] Build power requirements from rune item_power_grant PowerReq lists now come from the rune JSON on world and login: level from power_value, skill and power prereqs from power_granted_skills/powers. The DB table is no longer read. Co-Authored-By: Claude Opus 5.5 --- src/engine/objects/PowerReq.java | 48 +++++++++++++++++++++++- src/engine/server/login/LoginServer.java | 3 ++ src/engine/server/world/WorldServer.java | 3 ++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/engine/objects/PowerReq.java b/src/engine/objects/PowerReq.java index 0f42802a..088b7c1a 100644 --- a/src/engine/objects/PowerReq.java +++ b/src/engine/objects/PowerReq.java @@ -11,8 +11,11 @@ package engine.objects; import engine.gameManager.DbManager; import engine.gameManager.PowersManager; +import engine.parsers.objects.PowerGrant; +import engine.parsers.objects.RuneTemplate; import engine.powers.PowersBase; import engine.server.MBServerStatics; +import engine.util.Hasher; import org.pmw.tinylog.Logger; import java.sql.Connection; @@ -21,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -32,7 +36,7 @@ public class PowerReq extends AbstractGameObject implements Comparable private short level; private ConcurrentHashMap powerReqs; private ConcurrentHashMap skillReqs; - private static ConcurrentHashMap> runePowers = fillRunePowers(); + private static ConcurrentHashMap> runePowers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); /** * No Table ID Constructor @@ -64,6 +68,21 @@ public class PowerReq extends AbstractGameObject implements Comparable this.token = 0; } + public PowerReq(PowerGrant powerGrant) { + super(); + this.token = Hasher.SBStringHash(powerGrant.power_type); + this.powersBase = PowersManager.getPowerByToken(this.token); + this.level = (short) powerGrant.power_value; + this.powerReqs = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); + this.skillReqs = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); + + for (Map.Entry entry : powerGrant.power_granted_powers.entrySet()) + this.powerReqs.put(Hasher.SBStringHash(entry.getKey()), entry.getValue().byteValue()); + + for (Map.Entry entry : powerGrant.power_granted_skills.entrySet()) + this.skillReqs.put(Hasher.SBStringHash(entry.getKey()), entry.getValue().byteValue()); + } + /** * ResultSet Constructor */ @@ -89,6 +108,33 @@ public class PowerReq extends AbstractGameObject implements Comparable return new ArrayList<>(); } + // item_power_grant power_value is the level the power unlocks at + public static void loadRunePowers() { + + ArrayList runePR; + int entryCount = 0; + + PowerReq.runePowers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); + + for (RuneTemplate rune : RuneTemplate._runes.values()) { + + if (rune.item_power_grant.isEmpty()) + continue; + + runePR = new ArrayList<>(); + + for (PowerGrant powerGrant : rune.item_power_grant) + runePR.add(new PowerReq(powerGrant)); + + //order the list by level so prerequisites are met + Collections.sort(runePR); + PowerReq.runePowers.put(rune.template_id, runePR); + entryCount += runePR.size(); + } + + Logger.info("Loaded " + entryCount + " power requirements for " + PowerReq.runePowers.size() + " runes"); + } + public static ConcurrentHashMap> fillRunePowers() { PowerReq.runePowers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); diff --git a/src/engine/server/login/LoginServer.java b/src/engine/server/login/LoginServer.java index 41ab0649..348d7fec 100644 --- a/src/engine/server/login/LoginServer.java +++ b/src/engine/server/login/LoginServer.java @@ -384,6 +384,9 @@ public class LoginServer { Logger.info("Initializing PowersManager."); PowersManager.initPowersManager(false); + Logger.info("Loading Rune Power Requirements"); + PowerReq.loadRunePowers(); + RuneBase.LoadAllRuneBases(); BaseClass.LoadAllBaseClasses(); PromotionClass.LoadAllPromotions(); diff --git a/src/engine/server/world/WorldServer.java b/src/engine/server/world/WorldServer.java index 960febc9..d1cb41f4 100644 --- a/src/engine/server/world/WorldServer.java +++ b/src/engine/server/world/WorldServer.java @@ -430,6 +430,9 @@ public class WorldServer { Logger.info("Indexing Cache Templates"); CObjectIndex.build(); + Logger.info("Loading Rune Power Requirements"); + PowerReq.loadRunePowers(); + Logger.info("Loading PromotionClasses"); PromotionClass.LoadAllPromotions();