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 <noreply@anthropic.com>
This commit is contained in:
MagicBotandClaude Opus 5.5 committed 2026-10-26 11:42:09 -04:00
1 parent 24e91cc0a9
commit 9e50d0a5ad
3 files changed
+53 -1

No files matched your search

+47 -1
View File
@@ -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<PowerReq>
private short level;
private ConcurrentHashMap<Integer, Byte> powerReqs;
private ConcurrentHashMap<Integer, Byte> skillReqs;
private static ConcurrentHashMap<Integer, ArrayList<PowerReq>> runePowers = fillRunePowers();
private static ConcurrentHashMap<Integer, ArrayList<PowerReq>> 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<PowerReq>
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<String, Integer> entry : powerGrant.power_granted_powers.entrySet())
this.powerReqs.put(Hasher.SBStringHash(entry.getKey()), entry.getValue().byteValue());
for (Map.Entry<String, Integer> 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<PowerReq>
return new ArrayList<>();
}
// item_power_grant power_value is the level the power unlocks at
public static void loadRunePowers() {
ArrayList<PowerReq> 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<Integer, ArrayList<PowerReq>> fillRunePowers() {
PowerReq.runePowers = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW);
+3
View File
@@ -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();
+3
View File
@@ -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();