From 9803f2bfe36587270278ea5e64d036b1d50254bf Mon Sep 17 00:00:00 2001 From: Matt Worzala <35708499+mworzala@users.noreply.github.com> Date: Thu, 26 Dec 2024 13:14:01 -0500 Subject: [PATCH] chore: file registries (#2538) --- .../server/registry/DynamicRegistryImpl.java | 2 +- .../minestom/server/registry/Registry.java | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/minestom/server/registry/DynamicRegistryImpl.java b/src/main/java/net/minestom/server/registry/DynamicRegistryImpl.java index 24c2f5b7a..820cfebdf 100644 --- a/src/main/java/net/minestom/server/registry/DynamicRegistryImpl.java +++ b/src/main/java/net/minestom/server/registry/DynamicRegistryImpl.java @@ -230,7 +230,7 @@ final class DynamicRegistryImpl implements DynamicRegistry { static void loadStaticSnbtRegistry(@NotNull Registries registries, @NotNull DynamicRegistryImpl registry, @NotNull Registry.Resource resource) { Check.argCondition(!resource.fileName().endsWith(".snbt"), "Resource must be an SNBT file: {0}", resource.fileName()); - try (InputStream resourceStream = Registry.class.getClassLoader().getResourceAsStream(resource.fileName())) { + try (InputStream resourceStream = Registry.loadRegistryFile(resource)) { Check.notNull(resourceStream, "Resource {0} does not exist!", resource); final BinaryTag tag = TagStringIOExt.readTag(new String(resourceStream.readAllBytes(), StandardCharsets.UTF_8)); if (!(tag instanceof CompoundBinaryTag compound)) { diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 27b694a0d..f413861fa 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -35,6 +35,8 @@ import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.*; import java.util.concurrent.atomic.AtomicReference; import java.util.function.Supplier; @@ -135,11 +137,24 @@ public final class Registry { return new JukeboxSongEntry(namespace, main, null); } + public static @NotNull InputStream loadRegistryFile(@NotNull Resource resource) throws IOException { + // 1. Try to load from jar resources + InputStream resourceStream = Registry.class.getClassLoader().getResourceAsStream(resource.name); + + // 2. Try to load from working directory + if (resourceStream == null && Files.exists(Path.of(resource.name))) { + resourceStream = Files.newInputStream(Path.of(resource.name)); + } + + // 3. Not found :( + Check.notNull(resourceStream, "Resource {0} does not exist!", resource); + return resourceStream; + } + @ApiStatus.Internal public static Map> load(Resource resource) { Map> map = new HashMap<>(); - try (InputStream resourceStream = Registry.class.getClassLoader().getResourceAsStream(resource.name)) { - Check.notNull(resourceStream, "Resource {0} does not exist!", resource); + try (InputStream resourceStream = loadRegistryFile(resource)) { try (JsonReader reader = new JsonReader(new InputStreamReader(resourceStream))) { reader.beginObject(); while (reader.hasNext()) map.put(reader.nextName(), (Map) readObject(reader));