From 64a86152d300e81282709b994896da72be1fd79e Mon Sep 17 00:00:00 2001 From: MagicBot Date: Thu, 22 Oct 2026 12:36:34 -0400 Subject: [PATCH] Load rune bases from all non-RACE runes, dropping static_rune_runebase reads The 315 static_rune_runebase rows are exactly the non-RACE runes, so the loader selects by rune_type. Removes the server type/subtype columns (no live reader), the runereq/overwrite path, the GET_RUNEBASE cache-miss query, the runebase attribute handler, the racerune/baseclassrune loaders and the 111111 checks. No value changes. Co-Authored-By: Claude Opus 5.5 --- .../handlers/dbRuneBaseAttributeHandler.java | 48 ------ src/engine/db/handlers/dbRuneBaseHandler.java | 150 ------------------ src/engine/gameManager/DbManager.java | 1 - src/engine/objects/BaseClass.java | 4 - src/engine/objects/NPCRune.java | 14 -- src/engine/objects/Race.java | 4 - src/engine/objects/RuneBase.java | 114 +------------ src/engine/objects/RuneBaseAttribute.java | 40 ----- 8 files changed, 8 insertions(+), 367 deletions(-) delete mode 100644 src/engine/db/handlers/dbRuneBaseAttributeHandler.java diff --git a/src/engine/db/handlers/dbRuneBaseAttributeHandler.java b/src/engine/db/handlers/dbRuneBaseAttributeHandler.java deleted file mode 100644 index f5c0e012..00000000 --- a/src/engine/db/handlers/dbRuneBaseAttributeHandler.java +++ /dev/null @@ -1,48 +0,0 @@ -// • ▌ ▄ ·. ▄▄▄· ▄▄ • ▪ ▄▄· ▄▄▄▄· ▄▄▄· ▐▄▄▄ ▄▄▄ . -// ·██ ▐███▪▐█ ▀█ ▐█ ▀ ▪██ ▐█ ▌▪▐█ ▀█▪▐█ ▀█ •█▌ ▐█▐▌· -// ▐█ ▌▐▌▐█·▄█▀▀█ ▄█ ▀█▄▐█·██ ▄▄▐█▀▀█▄▄█▀▀█ ▐█▐ ▐▌▐▀▀▀ -// ██ ██▌▐█▌▐█ ▪▐▌▐█▄▪▐█▐█▌▐███▌██▄▪▐█▐█ ▪▐▌██▐ █▌▐█▄▄▌ -// ▀▀ █▪▀▀▀ ▀ ▀ ·▀▀▀▀ ▀▀▀·▀▀▀ ·▀▀▀▀ ▀ ▀ ▀▀ █▪ ▀▀▀ -// Magicbane Emulator Project © 2013 - 2026 -// https://www.magicbane.com - - -package engine.db.handlers; - -import engine.gameManager.DbManager; -import engine.mbEnums; -import engine.objects.RuneBaseAttribute; -import org.pmw.tinylog.Logger; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; - -public class dbRuneBaseAttributeHandler extends dbHandlerBase { - - public dbRuneBaseAttributeHandler() { - this.localClass = RuneBaseAttribute.class; - this.localObjectType = mbEnums.GameObjectType.valueOf(this.localClass.getSimpleName()); - } - - public ArrayList GET_ATTRIBUTES_FOR_RUNEBASE() { - - ArrayList runeBaseAttributesList = new ArrayList<>(); - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runebaseattribute`")) { - - ResultSet rs = preparedStatement.executeQuery(); - runeBaseAttributesList = getObjectsFromRs(rs, 10); - - } catch (SQLException e) { - Logger.error(e); - } - - return runeBaseAttributesList; - } - - -} diff --git a/src/engine/db/handlers/dbRuneBaseHandler.java b/src/engine/db/handlers/dbRuneBaseHandler.java index 8edbc86e..897da5c9 100644 --- a/src/engine/db/handlers/dbRuneBaseHandler.java +++ b/src/engine/db/handlers/dbRuneBaseHandler.java @@ -107,154 +107,4 @@ public class dbRuneBaseHandler extends dbHandlerBase { Logger.info("read: " + recordsRead + " cached: " + runeSkillAdjusts.size()); return runeSkillAdjusts; } - - public void GET_RUNE_REQS(final RuneBase rb) { - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runereq` WHERE `runeID` = ?")) { - - preparedStatement.setInt(1, rb.getObjectUUID()); - - ResultSet rs = preparedStatement.executeQuery(); - - while (rs.next()) { - int type = rs.getInt("type"); - - switch (type) { - case 1: - rb.getRace().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed")); - break; - case 2: - rb.getBaseClass().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed")); - break; - case 3: - rb.getPromotionClass().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed")); - break; - case 4: - rb.getDiscipline().put(rs.getInt("requiredRuneID"), rs.getBoolean("isAllowed")); - break; - case 5: - rb.getOverwrite().add(rs.getInt("requiredRuneID")); - break; - case 6: - rb.setLevelRequired(rs.getInt("requiredRuneID")); - break; - } - } - - } catch (SQLException e) { - Logger.error(e); - } - - } - - public RuneBase GET_RUNEBASE(final int id) { - - RuneBase runeBase = null; - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runebase` WHERE `ID` = ?")) { - - preparedStatement.setInt(1, id); - - ResultSet rs = preparedStatement.executeQuery(); - runeBase = (RuneBase) getObjectFromRs(rs); - - } catch (SQLException e) { - Logger.error(e); - } - return runeBase; - } - - public ArrayList LOAD_ALL_RUNEBASES() { - - ArrayList runeBasesList = new ArrayList<>(); - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_rune_runebase`;")) { - - ResultSet rs = preparedStatement.executeQuery(); - runeBasesList = getObjectsFromRs(rs, 1000); - - } catch (SQLException e) { - Logger.error(e); - } - - return runeBasesList; - } - - public HashMap> LOAD_ALLOWED_STARTING_RUNES_FOR_BASECLASS() { - - HashMap> runeSets = new HashMap<>(); - - int recordsRead = 0; - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_rune_baseclassrune")) { - - ResultSet rs = preparedStatement.executeQuery(); - - while (rs.next()) { - - recordsRead++; - - int baseClassID = rs.getInt("BaseClassesID"); - int runeBaseID = rs.getInt("RuneBaseID"); - - if (runeSets.get(baseClassID) == null) { - ArrayList runeList = new ArrayList<>(); - runeList.add(runeBaseID); - runeSets.put(baseClassID, runeList); - } else { - ArrayList runeList = runeSets.get(baseClassID); - runeList.add(runeBaseID); - runeSets.put(baseClassID, runeList); - } - } - - } catch (SQLException e) { - Logger.error(e); - } - - Logger.info("read: " + recordsRead + " cached: " + runeSets.size()); - - return runeSets; - } - - public HashMap> LOAD_ALLOWED_STARTING_RUNES_FOR_RACE() { - - HashMap> runeSets; - - runeSets = new HashMap<>(); - int recordsRead = 0; - - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM static_rune_racerune")) { - - ResultSet rs = preparedStatement.executeQuery(); - - while (rs.next()) { - - recordsRead++; - - int raceID = rs.getInt("RaceID"); - int runeBaseID = rs.getInt("RuneBaseID"); - - if (runeSets.get(raceID) == null) { - ArrayList runeList = new ArrayList<>(); - runeList.add(runeBaseID); - runeSets.put(raceID, runeList); - } else { - ArrayList runeList = runeSets.get(raceID); - runeList.add(runeBaseID); - runeSets.put(raceID, runeList); - } - } - } catch (SQLException e) { - Logger.error(e); - } - - Logger.info("read: " + recordsRead + " cached: " + runeSets.size()); - return runeSets; - } } diff --git a/src/engine/gameManager/DbManager.java b/src/engine/gameManager/DbManager.java index 99c13fb2..74d18d29 100644 --- a/src/engine/gameManager/DbManager.java +++ b/src/engine/gameManager/DbManager.java @@ -58,7 +58,6 @@ public enum DbManager { public static final dbPromotionClassHandler PromotionQueries = new dbPromotionClassHandler(); public static final dbRaceHandler RaceQueries = new dbRaceHandler(); public static final dbResistHandler ResistQueries = new dbResistHandler(); - public static final dbRuneBaseAttributeHandler RuneBaseAttributeQueries = new dbRuneBaseAttributeHandler(); public static final dbRuneBaseEffectHandler RuneBaseEffectQueries = new dbRuneBaseEffectHandler(); public static final dbRuneBaseHandler RuneBaseQueries = new dbRuneBaseHandler(); public static final dbSkillBaseHandler SkillsBaseQueries = new dbSkillBaseHandler(); diff --git a/src/engine/objects/BaseClass.java b/src/engine/objects/BaseClass.java index 1f018152..f27a35ac 100644 --- a/src/engine/objects/BaseClass.java +++ b/src/engine/objects/BaseClass.java @@ -237,10 +237,6 @@ public class BaseClass extends AbstractGameObject { if (this.getRuneList().contains(rb.getObjectUUID())) return true; - if (RuneBase.AllowedBaseClassRunesMap.containsKey(111111)) { - if (RuneBase.AllowedBaseClassRunesMap.get(111111).contains(rb.getObjectUUID())) - return true; - } return false; } diff --git a/src/engine/objects/NPCRune.java b/src/engine/objects/NPCRune.java index 8ce6d103..dddd6390 100644 --- a/src/engine/objects/NPCRune.java +++ b/src/engine/objects/NPCRune.java @@ -10,7 +10,6 @@ package engine.objects; import engine.gameManager.DbManager; -import engine.net.ByteBufferWriter; import org.pmw.tinylog.Logger; import java.sql.ResultSet; @@ -71,19 +70,6 @@ public class NPCRune extends AbstractGameObject { } } - public static void serializeForClientMsg(NPCRune npcRune, ByteBufferWriter writer) { - if (npcRune.runeBase != null) { - writer.putInt(npcRune.runeBase.getType()); - writer.putInt(0); - writer.putInt(npcRune.runeBase.getObjectUUID()); - writer.putInt(npcRune.getObjectType().ordinal()); - writer.putInt(npcRune.getObjectUUID()); - } else { - for (int i = 0; i < 5; i++) - writer.putInt(0); - } - } - /* * Getters */ diff --git a/src/engine/objects/Race.java b/src/engine/objects/Race.java index 16817192..d21d31e3 100644 --- a/src/engine/objects/Race.java +++ b/src/engine/objects/Race.java @@ -395,10 +395,6 @@ public class Race { if (this.getAllowedRunes() != null) if (this.getAllowedRunes().contains(rb.getObjectUUID())) return true; - if (RuneBase.AllowedBaseClassRunesMap.containsKey(111111)) { - if (RuneBase.AllowedRaceRunesMap.get(111111).contains(rb.getObjectUUID())) - return true; - } return false; } diff --git a/src/engine/objects/RuneBase.java b/src/engine/objects/RuneBase.java index 2af7eb66..af4e63fa 100644 --- a/src/engine/objects/RuneBase.java +++ b/src/engine/objects/RuneBase.java @@ -11,15 +11,12 @@ package engine.objects; import engine.gameManager.DbManager; import engine.mbEnums; -import engine.net.ByteBufferWriter; import engine.parsers.cache.CObjectIndex; import engine.parsers.objects.RuneTemplate; import engine.server.MBServerStatics; import engine.util.Hasher; import org.pmw.tinylog.Logger; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -37,13 +34,10 @@ public class RuneBase extends AbstractGameObject { private static final Set NON_CREATION_TALENTS = new HashSet<>(Arrays.asList(2910, 2911, 250081, 250116, 250117, 250123, 250124, 250125)); private final String name; private final String description; - private final int type; - private final byte subtype; private final ConcurrentHashMap race = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); private final ConcurrentHashMap baseClass = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); private final ConcurrentHashMap promotionClass = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); private final ConcurrentHashMap discipline = new ConcurrentHashMap<>(MBServerStatics.CHM_INIT_CAP, MBServerStatics.CHM_LOAD, MBServerStatics.CHM_THREAD_LOW); - private final ArrayList overwrite = new ArrayList<>(); private int levelRequired = 1; private ArrayList effectsList = new ArrayList<>(); private mbEnums.RuneType runeType; @@ -53,56 +47,11 @@ public class RuneBase extends AbstractGameObject { private boolean classRestrict; private boolean discRestrict; - /** - * No Table ID Constructor - */ - public RuneBase(String name, String description, int type, byte subtype, ArrayList attrs) { - super(); - - this.name = name; - this.description = description; - this.type = type; - this.subtype = subtype; - - } - - /** - * Normal Constructor - */ - public RuneBase(String name, String description, int type, byte subtype, ArrayList attrs, int newUUID) { - super(newUUID); - - this.name = name; - this.description = description; - this.type = type; - this.subtype = subtype; - - } - - /** - * ResultSet Constructor - */ - public RuneBase(ResultSet rs) throws SQLException { - super(rs); - - this.name = rs.getString("name"); - this.description = rs.getString("description"); - this.type = rs.getInt("type"); - this.subtype = rs.getByte("subtype"); - - // static_rune_runereq race/class rows are whitelists, its discipline rows prohibitions - this.discRestrict = true; - DbManager.RuneBaseQueries.GET_RUNE_REQS(this); - this.effectsList = MobBaseEffects.getEffectsForRune(this.getObjectUUID()); - } - /** * Rune Template Constructor - * type and subtype are server enums that don't map cleanly from rune_type/rune_sub_type, so they - * come from the static_rune_runebase row. * Talents with the same sub type token replace each other by rank (client 0x4695D0), so no overwrite list. */ - public RuneBase(RuneTemplate rune, RuneBase dbRuneBase) { + public RuneBase(RuneTemplate rune) { super(rune.template_id); Integer classRuneID; @@ -112,8 +61,6 @@ public class RuneBase extends AbstractGameObject { this.name = rune.item_base_name; this.description = rune.rune_dsc; - this.type = dbRuneBase.type; - this.subtype = dbRuneBase.subtype; this.effectsList = MobBaseEffects.getEffectsForRune(rune.template_id); this.runeType = rune.rune_type; this.rank = rune.rune_rank; @@ -171,48 +118,27 @@ public class RuneBase extends AbstractGameObject { if (tableId == 0) return null; - RuneBase rb = (RuneBase) DbManager.getFromCache(mbEnums.GameObjectType.RuneBase, tableId); - - if (rb != null) - return rb; - - return DbManager.RuneBaseQueries.GET_RUNEBASE(tableId); + return (RuneBase) DbManager.getFromCache(mbEnums.GameObjectType.RuneBase, tableId); } - public static void serializeForClientMsg(RuneBase runeBase, ByteBufferWriter writer) { - writer.putInt(runeBase.type); - writer.putInt(0); // Pad - writer.putInt(runeBase.getObjectUUID()); - writer.putInt(runeBase.getObjectType().ordinal()); - writer.putInt(runeBase.getObjectUUID()); - - } - - // Iterates the static_rune_runebase rows: no rune field separates the player runes from the mob - // talents, and each row still holds the server type/subtype. + // Rune bases are every non-RACE rune: the classes, disciplines and talents (the 315 former static_rune_runebase rows). public static void LoadAllRuneBases() { - ArrayList dbRuneBases; ArrayList attributes; - RuneTemplate rune; int loadedCount = 0; - dbRuneBases = DbManager.RuneBaseQueries.LOAD_ALL_RUNEBASES(); RuneBaseAttribute.runeBaseAttributeMap.clear(); - for (RuneBase dbRuneBase : dbRuneBases) { - rune = RuneTemplate._runes.get(dbRuneBase.getObjectUUID()); + for (RuneTemplate rune : RuneTemplate._runes.values()) { - if (rune == null) { - Logger.warn("RuneBase " + dbRuneBase.getObjectUUID() + " has no rune; loaded from static_rune_runebase without attributes"); + if (rune.rune_type == mbEnums.RuneType.RACE) continue; - } - DbManager.addToCache(new RuneBase(rune, dbRuneBase)); + DbManager.addToCache(new RuneBase(rune)); attributes = RuneBaseAttribute.getAttributesForRune(rune); - // getAttrs() returns null for a rune without attributes, as the DB map did + // getAttrs() returns null for a rune without attributes if (!attributes.isEmpty()) RuneBaseAttribute.runeBaseAttributeMap.put(rune.template_id, attributes); @@ -224,7 +150,7 @@ public class RuneBase extends AbstractGameObject { loadCreationTalents(); } - // Every creation race and class gets a list, so the 111111 "any" sentinel of the DB tables is no longer used. + // Every creation race and class gets an explicit list; there is no "any" entry. private static void loadCreationTalents() { @@ -318,15 +244,6 @@ public class RuneBase extends AbstractGameObject { return false; } - if (this.type != rbObj.type) { - return false; - } - - if (this.subtype != rbObj.subtype) { - return false; - } - - return true; } @@ -344,17 +261,6 @@ public class RuneBase extends AbstractGameObject { return description; } - public int getType() { - return type; - } - - /** - * @return the subtype - */ - public byte getSubtype() { - return subtype; - } - /** * @return the attrs */ @@ -378,10 +284,6 @@ public class RuneBase extends AbstractGameObject { return this.discipline; } - public ArrayList getOverwrite() { - return this.overwrite; - } - public mbEnums.RuneType getRuneType() { return this.runeType; } diff --git a/src/engine/objects/RuneBaseAttribute.java b/src/engine/objects/RuneBaseAttribute.java index 6da30197..b4e23f9f 100644 --- a/src/engine/objects/RuneBaseAttribute.java +++ b/src/engine/objects/RuneBaseAttribute.java @@ -9,14 +9,10 @@ package engine.objects; -import engine.gameManager.DbManager; import engine.mbEnums; -import engine.mbEnums.GameObjectType; import engine.parsers.objects.RuneTemplate; import engine.server.MBServerStatics; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; import java.util.EnumMap; import java.util.HashMap; @@ -27,7 +23,6 @@ public class RuneBaseAttribute extends AbstractGameObject { public static HashMap> runeBaseAttributeMap = new HashMap<>(); private short attributeID; private short modValue; - private int runeBaseID; /** @@ -50,17 +45,6 @@ public class RuneBaseAttribute extends AbstractGameObject { this.modValue = modValue; } - /** - * ResultSet Constructor - */ - public RuneBaseAttribute(ResultSet rs) throws SQLException { - super(rs); - - this.attributeID = rs.getShort("attributeID"); - this.modValue = rs.getShort("modValue"); - this.runeBaseID = rs.getInt("RuneBaseID"); - } - // Attribute ids: 0 = rune_creation_cost, 1-5 = rune_attr_adj, 6-10 = rune_max_attr_adj, // 11-15 = item_attr_req; the AttributeType ordinals Strength..Spirit are 1-5. @@ -88,30 +72,6 @@ public class RuneBaseAttribute extends AbstractGameObject { } } - public static void LoadAllAttributes() { - DbManager.RuneBaseAttributeQueries.GET_ATTRIBUTES_FOR_RUNEBASE(); - - - //cache attributeLists for rune. - for (AbstractGameObject ago : DbManager.getList(GameObjectType.RuneBaseAttribute)) { - - RuneBaseAttribute runeBaseAttribute = (RuneBaseAttribute) ago; - - int runeBaseID = ((RuneBaseAttribute) runeBaseAttribute).runeBaseID; - if (runeBaseAttributeMap.get(runeBaseID) == null) { - ArrayList attributeList = new ArrayList<>(); - attributeList.add(runeBaseAttribute); - runeBaseAttributeMap.put(runeBaseID, attributeList); - } else { - ArrayList attributeList = runeBaseAttributeMap.get(runeBaseID); - attributeList.add(runeBaseAttribute); - runeBaseAttributeMap.put(runeBaseID, attributeList); - } - - } - - } - /* * Getters */