From 865949fd1c7a966d503bc0f653f440842ff1e3fc Mon Sep 17 00:00:00 2001 From: MagicBot Date: Thu, 22 Oct 2026 07:46:48 -0400 Subject: [PATCH] Load rune granted skills from level-0 rune_skill_adj instead of static_skill_skillsgranted Load moved after the rune templates are parsed. Parity (scripts/p27.py): 76 of 107 DB runes match. Value changes (JSON wins, Task 2.7 decisions): - Blade Master 3005: Sword +10 removed (no rune_skill_adj in the JSON; Blade Weaver 3006 keeps Sword +10). Reaches players via PlayerBonuses. - Pet 2522: Dodge and Unarmed Combat 1 -> 22. Not reachable; players never hold the Pet rune. - 29 Master X / trainer runes lose their rows (no level-0 pairs in the JSON). Not reachable; players never hold trainer runes. Their caps still load into MaxSkills. - 2243 mob/guard race runes gain rows. Not reachable; PlayerBonuses only reads player race/class/promotion/held runes. Co-Authored-By: Claude Opus 5.5 --- src/engine/objects/SkillsBase.java | 30 ++++++++++++++++++++++++ src/engine/server/world/WorldServer.java | 7 +++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/engine/objects/SkillsBase.java b/src/engine/objects/SkillsBase.java index 718c0bd6..a750c029 100644 --- a/src/engine/objects/SkillsBase.java +++ b/src/engine/objects/SkillsBase.java @@ -11,11 +11,16 @@ package engine.objects; import engine.gameManager.DbManager; import engine.mbEnums.SourceType; +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.HashMap; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -102,6 +107,31 @@ public class SkillsBase extends AbstractGameObject { return null; } + // Level 0 adjusts are the skills a rune grants outright; higher levels are trainer caps + public static void LoadAllRuneSkills() { + + HashMap grantedSkills; + int entryCount = 0; + + for (RuneTemplate rune : RuneTemplate._runes.values()) { + + grantedSkills = new HashMap<>(); + + for (Map.Entry> skillAdjust : rune.rune_skill_adj.entrySet()) + for (int[] adjust : skillAdjust.getValue()) + if (adjust[1] == 0) + grantedSkills.put(Hasher.SBStringHash(skillAdjust.getKey()), adjust[0]); + + if (grantedSkills.isEmpty()) + continue; + + runeSkillsCache.put(rune.template_id, grantedSkills); + entryCount += grantedSkills.size(); + } + + Logger.info("Loaded " + entryCount + " granted skills for " + runeSkillsCache.size() + " runes"); + } + public static void putInCache(SkillsBase sb) { if (sb == null) diff --git a/src/engine/server/world/WorldServer.java b/src/engine/server/world/WorldServer.java index 35bdd602..43f56bcb 100644 --- a/src/engine/server/world/WorldServer.java +++ b/src/engine/server/world/WorldServer.java @@ -282,9 +282,6 @@ public class WorldServer { Logger.info("Initializing PowersManager."); PowersManager.initPowersManager(true); - Logger.info("Loading granted Skills for Runes"); - DbManager.SkillsBaseQueries.LOAD_ALL_RUNE_SKILLS(); - Logger.info("Loading Player Friends"); DbManager.PlayerCharacterQueries.LOAD_PLAYER_FRIENDS(); @@ -353,6 +350,10 @@ public class WorldServer { BaseClass.LoadAllBaseClasses(); Race.loadAllRaces(); RuneBaseEffect.LoadRuneBaseEffects(); + + Logger.info("Loading granted Skills for Runes"); + SkillsBase.LoadAllRuneSkills(); + Logger.info("Loading MobBases."); DbManager.MobBaseQueries.GET_ALL_MOBBASES();