From 045080948759034e4cd5ee56762ba2d849c54ebf Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:12:31 +0000 Subject: [PATCH 1/2] Initial plan From ccbfccbffee0bf60699b94858adeb3f50314a221 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 3 Dec 2025 15:17:00 +0000 Subject: [PATCH 2/2] Address review comments: fix bounds check, resource leak, and add @Override annotations Co-authored-by: lonelyicer <63995099+lonelyicer@users.noreply.github.com> --- .../altnoir/mia/block/entity/AbyssSpawnerBlockEntity.java | 3 +++ .../altnoir/mia/core/spawner/AbyssTrialSpawnerManager.java | 4 ++-- src/main/java/com/altnoir/mia/util/MiaUtil.java | 5 +++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/altnoir/mia/block/entity/AbyssSpawnerBlockEntity.java b/src/main/java/com/altnoir/mia/block/entity/AbyssSpawnerBlockEntity.java index c61891d..acafe7a 100644 --- a/src/main/java/com/altnoir/mia/block/entity/AbyssSpawnerBlockEntity.java +++ b/src/main/java/com/altnoir/mia/block/entity/AbyssSpawnerBlockEntity.java @@ -109,6 +109,7 @@ public void setPatternId(@Nullable ResourceLocation patternId) { } @Nullable + @Override public ResourceLocation getPatternId() { return this.patternId; } @@ -125,10 +126,12 @@ public void refreshPattern() { } @Nullable + @Override public AbyssTrialSpawnerPattern getPattern() { return this.cachedPattern; } + @Override public boolean hasValidPattern() { return this.cachedPattern != null; } diff --git a/src/main/java/com/altnoir/mia/core/spawner/AbyssTrialSpawnerManager.java b/src/main/java/com/altnoir/mia/core/spawner/AbyssTrialSpawnerManager.java index 0512e47..5f5d67f 100644 --- a/src/main/java/com/altnoir/mia/core/spawner/AbyssTrialSpawnerManager.java +++ b/src/main/java/com/altnoir/mia/core/spawner/AbyssTrialSpawnerManager.java @@ -56,8 +56,8 @@ public AbyssTrialSpawnerManager() { var fixedLoc = ResourceLocation.fromNamespaceAndPath(namespace, parts[0]); var res = entry.getValue(); - try (var stream = res.open()) { - var json = GsonHelper.fromJson(GSON, new InputStreamReader(stream), JsonElement.class); + try (var stream = res.open(); var reader = new InputStreamReader(stream)) { + var json = GsonHelper.fromJson(GSON, reader, JsonElement.class); result.put(fixedLoc, json); } catch (IOException | JsonParseException e) { LOGGER.error("Failed to load trial spawner JSON from {}", fileLoc, e); diff --git a/src/main/java/com/altnoir/mia/util/MiaUtil.java b/src/main/java/com/altnoir/mia/util/MiaUtil.java index a9570fc..2363ce1 100644 --- a/src/main/java/com/altnoir/mia/util/MiaUtil.java +++ b/src/main/java/com/altnoir/mia/util/MiaUtil.java @@ -222,6 +222,11 @@ public static boolean isCreativeOrSpectator(Player player) { return null; } + // Ensure there is at least one character after basePath before substring + if (filePath.length() <= basePath.length()) { + return null; + } + var trimmedPath = filePath.substring(basePath.length() + 1); if (trimmedPath.endsWith(".json")) { trimmedPath = trimmedPath.substring(0, trimmedPath.length() - 5);