From 7309159f83e59900546520ea9868638b68e785f3 Mon Sep 17 00:00:00 2001 From: MagicBot Date: Sat, 17 Oct 2026 07:45:24 -0400 Subject: [PATCH] Abort world server startup when any deed or rune file fails to parse Co-Authored-By: Claude Opus 5.5 --- src/engine/parsers/cache/DeedParser.java | 6 ++++++ src/engine/parsers/cache/RuneParser.java | 6 ++++++ src/engine/server/world/WorldServer.java | 8 ++++---- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/engine/parsers/cache/DeedParser.java b/src/engine/parsers/cache/DeedParser.java index 81755da6..52de5769 100644 --- a/src/engine/parsers/cache/DeedParser.java +++ b/src/engine/parsers/cache/DeedParser.java @@ -30,6 +30,7 @@ public class DeedParser { File[] deedFiles = CacheParserUtil.listJsonFiles(deedPath); int templateId; JSONObject deedJson; + int failedCount = 0; for (File deedFile : deedFiles) { try { @@ -38,11 +39,16 @@ public class DeedParser { deedTemplates.put(templateId, parseDeedEntry(templateId, deedJson)); } catch (Exception e) { Logger.error(deedFile.getName() + ": " + e); + failedCount++; } } Logger.info("Loaded " + deedTemplates.size() + " of " + deedFiles.length + " deed templates"); + // Partial deed data is never usable; null tells the caller to abort + if (failedCount > 0) + return null; + return deedTemplates; } diff --git a/src/engine/parsers/cache/RuneParser.java b/src/engine/parsers/cache/RuneParser.java index c3510762..b913a345 100644 --- a/src/engine/parsers/cache/RuneParser.java +++ b/src/engine/parsers/cache/RuneParser.java @@ -30,6 +30,7 @@ public class RuneParser { File[] runeFiles = CacheParserUtil.listJsonFiles(runePath); int templateId; JSONObject runeJson; + int failedCount = 0; for (File runeFile : runeFiles) { try { @@ -38,11 +39,16 @@ public class RuneParser { runeTemplates.put(templateId, parseRuneEntry(templateId, runeJson)); } catch (Exception e) { Logger.error(runeFile.getName() + ": " + e); + failedCount++; } } Logger.info("Loaded " + runeTemplates.size() + " of " + runeFiles.length + " rune templates"); + // Partial rune data is never usable; null tells the caller to abort + if (failedCount > 0) + return null; + return runeTemplates; } diff --git a/src/engine/server/world/WorldServer.java b/src/engine/server/world/WorldServer.java index f32dc6b4..6bf87897 100644 --- a/src/engine/server/world/WorldServer.java +++ b/src/engine/server/world/WorldServer.java @@ -310,16 +310,16 @@ public class WorldServer { Logger.info("Loading Deed Templates"); DeedTemplate._deeds = DeedParser.parseDeedFolder(); - if (DeedTemplate._deeds.isEmpty()) { - Logger.error("ABORT! No deed templates loaded!"); + if (DeedTemplate._deeds == null || DeedTemplate._deeds.isEmpty()) { + Logger.error("ABORT! Deed templates failed to load!"); exit(1); } Logger.info("Loading Rune Templates"); RuneTemplate._runes = RuneParser.parseRuneFolder(); - if (RuneTemplate._runes.isEmpty()) { - Logger.error("ABORT! No rune templates loaded!"); + if (RuneTemplate._runes == null || RuneTemplate._runes.isEmpty()) { + Logger.error("ABORT! Rune templates failed to load!"); exit(1); }