From 06a421de0fb18454e510ea673503af000fac60e7 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Fri, 23 Oct 2026 14:32:59 -0400 Subject: [PATCH] Load MobBaseStats from the race rune's rune_attr_adj Parity (scripts/p32.py, static_npc_mobbase_stats by loadID vs rune_attr_adj): 2301 of 2375 mobbases identical. 74 have no stats row and went from all-zero stats to the rune values: CSR 2020/2021, summoner pets 12024-12035 and 13266-13301, clay constructs 12200-12202/12375/12382, Guard 13170 (not spawned or contracted), necro undead 13339-13348, and 13961, 14167, 14168, 14260-14262, 14285, 14292. On dev 47 obj_mob spawns use these (13343, 14167, 14168, 14285, 14292). Effect: higher rune skill values for these mobs via CharacterSkill. LOAD_STATS stays until the table is dropped. Co-Authored-By: Claude Opus 5.5 --- src/engine/objects/MobBase.java | 2 +- src/engine/objects/MobBaseStats.java | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/engine/objects/MobBase.java b/src/engine/objects/MobBase.java index 9d399c2e..2bf3ca6f 100644 --- a/src/engine/objects/MobBase.java +++ b/src/engine/objects/MobBase.java @@ -117,7 +117,7 @@ public class MobBase extends AbstractGameObject { if (this.flags.contains(mbEnums.MobFlagType.RAT)) this.mask += MBServerStatics.MASK_RAT; - this.mobBaseStats = DbManager.MobBaseQueries.LOAD_STATS(this.loadID); + this.mobBaseStats = (rune != null) ? new MobBaseStats(rune) : MobBaseStats.GetGenericStats(); DbManager.MobBaseQueries.LOAD_ALL_MOBBASE_SPEEDS(this); //load effects for mobbase this.effectsList = DbManager.MobBaseQueries.GET_RUNEBASE_EFFECTS(this.loadID); diff --git a/src/engine/objects/MobBaseStats.java b/src/engine/objects/MobBaseStats.java index 2781c174..1c789f8d 100644 --- a/src/engine/objects/MobBaseStats.java +++ b/src/engine/objects/MobBaseStats.java @@ -9,6 +9,9 @@ package engine.objects; +import engine.mbEnums; +import engine.parsers.objects.RuneTemplate; + import java.sql.ResultSet; import java.sql.SQLException; @@ -38,6 +41,16 @@ public class MobBaseStats { this.mobbaseSkillAmount = rs.getInt("skillAmount"); } + public MobBaseStats(RuneTemplate rune) { + this.baseStr = rune.rune_attr_adj.getOrDefault(mbEnums.AttributeType.Strength, 0); + this.baseInt = rune.rune_attr_adj.getOrDefault(mbEnums.AttributeType.Intelligence, 0); + this.baseCon = rune.rune_attr_adj.getOrDefault(mbEnums.AttributeType.Constitution, 0); + this.baseSpi = rune.rune_attr_adj.getOrDefault(mbEnums.AttributeType.Spirit, 0); + this.baseDex = rune.rune_attr_adj.getOrDefault(mbEnums.AttributeType.Dexterity, 0); + this.mobbaseSkill = 0; + this.mobbaseSkillAmount = 0; + } + /** * Generic Constructor */