From 236bddc93b019078212b637825aa277ddb22a89f Mon Sep 17 00:00:00 2001 From: MagicBot Date: Sat, 24 Oct 2026 09:37:16 -0400 Subject: [PATCH] Key MobBase on its ID and stop reading loadID Every static_npc_mobbase row has ID = loadID since 3.6 dropped the server-made rows, so the race rune and rune effects are looked up by ID and the loaders no longer filter on loadID. No value change (dev: 2375 of 2375 rows have ID = loadID). Mob.loadID and NPC.loadID are unchanged. Co-Authored-By: Claude Opus 5.5 --- src/engine/db/handlers/dbMobBaseHandler.java | 6 ++---- src/engine/mobileAI/MobAI.java | 2 +- src/engine/objects/Mob.java | 6 +++--- src/engine/objects/MobBase.java | 12 +++--------- src/engine/objects/NPC.java | 2 +- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/engine/db/handlers/dbMobBaseHandler.java b/src/engine/db/handlers/dbMobBaseHandler.java index aae29211..762483a8 100644 --- a/src/engine/db/handlers/dbMobBaseHandler.java +++ b/src/engine/db/handlers/dbMobBaseHandler.java @@ -39,7 +39,7 @@ public class dbMobBaseHandler extends dbHandlerBase { return mobBase; try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase` WHERE `ID`=? AND `ID` = `loadID`")) { + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase` WHERE `ID`=?")) { preparedStatement.setInt(1, id); @@ -58,10 +58,8 @@ public class dbMobBaseHandler extends dbHandlerBase { ArrayList mobbaseList = new ArrayList<>(); - // ID <> loadID rows were junk server-made mobbases (15000-17266); skip them on databases that still have them. - try (Connection connection = DbManager.getConnection(); - PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase` WHERE `ID` = `loadID`;")) { + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM `static_npc_mobbase`;")) { ResultSet rs = preparedStatement.executeQuery(); mobbaseList = getObjectsFromRs(rs, 1000); diff --git a/src/engine/mobileAI/MobAI.java b/src/engine/mobileAI/MobAI.java index bf002971..bc0c8dc0 100644 --- a/src/engine/mobileAI/MobAI.java +++ b/src/engine/mobileAI/MobAI.java @@ -470,7 +470,7 @@ public class MobAI { //trebuchet spawn handler - if (mob.despawned && mob.getMobBase().getLoadID() == 13171) { + if (mob.despawned && mob.getMobBase().getObjectUUID() == 13171) { checkForRespawn(mob); return; } diff --git a/src/engine/objects/Mob.java b/src/engine/objects/Mob.java index 05a3f6e5..bc9fc53a 100644 --- a/src/engine/objects/Mob.java +++ b/src/engine/objects/Mob.java @@ -164,7 +164,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed { writer.putInt(0); writer.putInt(0); - int tid = (mob.mobBase != null) ? mob.mobBase.getLoadID() : 0; + int tid = (mob.mobBase != null) ? mob.mobBase.getObjectUUID() : 0; if (mob.isPet()) { writer.putInt(2); writer.putInt(3); @@ -191,7 +191,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed { writer.putInt(0); if (mob.mobBase != null) - writer.putInt(mob.mobBase.getLoadID()); + writer.putInt(mob.mobBase.getObjectUUID()); else writer.putInt(mob.loadID); @@ -768,7 +768,7 @@ public class Mob extends AbstractIntelligenceAgent implements Delayed { bonus *= (1 + this.bonuses.getFloatPercentAll(ModType.Speed, SourceType.None)); if (this.isPlayerGuard()) - switch (this.mobBase.getLoadID()) { + switch (this.mobBase.getObjectUUID()) { case 2111: if (this.isWalk()) if (this.isCombat()) diff --git a/src/engine/objects/MobBase.java b/src/engine/objects/MobBase.java index 02463e09..d948a0ac 100644 --- a/src/engine/objects/MobBase.java +++ b/src/engine/objects/MobBase.java @@ -27,7 +27,6 @@ import java.util.concurrent.ConcurrentHashMap; public class MobBase extends AbstractGameObject { - private final int loadID; private final String firstName; private final byte level; private final float scale; @@ -65,8 +64,7 @@ public class MobBase extends AbstractGameObject { RuneTemplate rune = null; String fsmName; - this.loadID = rs.getInt("loadID"); - rune = RuneTemplate._runes.get(this.loadID); + rune = RuneTemplate._runes.get(this.getObjectUUID()); if (rune != null) { this.firstName = rune.obj_name; @@ -87,7 +85,7 @@ public class MobBase extends AbstractGameObject { this.run = rune.rune_speed.getOrDefault(mbEnums.MovementType.RUN, 0f); this.runCombat = rune.rune_speed.getOrDefault(mbEnums.MovementType.COMBATRUN, 0f); } else { - Logger.error("Mobbase " + this.getObjectUUID() + " has no race rune " + this.loadID); + Logger.error("Mobbase " + this.getObjectUUID() + " has no race rune"); this.firstName = ""; this.level = 0; this.fsm = mbEnums.MobBehaviourType.None; @@ -126,7 +124,7 @@ public class MobBase extends AbstractGameObject { this.mask += MBServerStatics.MASK_RAT; this.mobBaseStats = (rune != null) ? new MobBaseStats(rune) : MobBaseStats.GetGenericStats(); - this.effectsList = MobBaseEffects.getEffectsForRune(this.loadID); + this.effectsList = MobBaseEffects.getEffectsForRune(this.getObjectUUID()); } @@ -171,10 +169,6 @@ public class MobBase extends AbstractGameObject { return this.firstName; } - public int getLoadID() { - return this.loadID; - } - public int getLevel() { return this.level; } diff --git a/src/engine/objects/NPC.java b/src/engine/objects/NPC.java index 6ecf9f9d..f6d2d336 100644 --- a/src/engine/objects/NPC.java +++ b/src/engine/objects/NPC.java @@ -236,7 +236,7 @@ public class NPC extends AbstractCharacter { writer.putInt(0); if (npc.mobBase != null) - writer.putInt(npc.mobBase.getLoadID()); + writer.putInt(npc.mobBase.getObjectUUID()); else writer.putInt(2011);