From 0db87eb1d4233e10b9ad787f25f73a6c4832fdf6 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Tue, 29 Sep 2026 20:16:37 +0200 Subject: [PATCH 1/4] [resource loader] add simple json resource reloaders --- .../reload/ResourceReloadListener.java | 2 +- .../api/resource/reload/ResourceReloader.java | 3 + .../reload/SimpleJsonResourceReloader.java | 66 +++++++++++++++++++ .../reload/SimpleResourceReloader.java | 10 +-- 4 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleJsonResourceReloader.java diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloadListener.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloadListener.java index 053628474..56b0f2fe7 100644 --- a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloadListener.java +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloadListener.java @@ -22,6 +22,6 @@ default CompletableFuture reloadResources(SharedState state, ReloadStep pr }, applyExecutor); } - void resourcesReloaded(ResourceManager manager); + void resourcesReloaded(ResourceManager resourceManager); } diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloader.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloader.java index 10ff63357..223ce5711 100644 --- a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloader.java +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/ResourceReloader.java @@ -7,6 +7,9 @@ /** * A resource reloader handles the actual reloading of specific resources. + * + * @see ResourceReloadListener + * @see SimpleResourceReloader */ public interface ResourceReloader { diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleJsonResourceReloader.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleJsonResourceReloader.java new file mode 100644 index 000000000..74abf0143 --- /dev/null +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleJsonResourceReloader.java @@ -0,0 +1,66 @@ +package net.ornithemc.osl.resource.loader.api.resource.reload; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; + +/** + * A simple resource reloader that parses all resources in a given directory + * into JSON objects. + */ +public abstract class SimpleJsonResourceReloader implements SimpleResourceReloader> { + + private static final String FILE_EXTENSION = ".json"; + + private final Gson gson; + private final String directory; + + protected SimpleJsonResourceReloader(Gson gson, String directory) { + this.gson = gson; + this.directory = directory; + } + + @Override + public Map reloadResources(ResourceManager resourceManager) { + Map resources = new HashMap<>(); + + int prefixLength = this.directory.length() + 1; + int suffixLength = FILE_EXTENSION.length(); + + resourceManager.findResources(this.directory, location -> location.identifier().endsWith(FILE_EXTENSION)).forEach((location, resource) -> { + NamespacedIdentifier identifier = location.subidentifier( + prefixLength, + location.identifier().length() - suffixLength + ); + + try (BufferedReader br = resource.openAsReader()) { + JsonObject json = this.gson.fromJson(br, JsonObject.class); + + if (json == null) { + ResourceLoader.LOGGER.error("Couldn't load data file {} from {} as it's null or empty", identifier, location); + } else { + json = resources.put(identifier, json); + + if (json != null) { + throw new IllegalStateException("Duplicate data file with ID " + identifier); + } + } + } catch (JsonParseException | IllegalArgumentException e) { + ResourceLoader.LOGGER.error("Couldn't parse data file {}", identifier, e); + } catch (IOException e) { + ResourceLoader.LOGGER.error("Couldn't read data file {} from {}", identifier, location, e); + } + }); + + return resources; + } +} diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleResourceReloader.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleResourceReloader.java index 8eea62429..b4471e40f 100644 --- a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleResourceReloader.java +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/reload/SimpleResourceReloader.java @@ -9,6 +9,8 @@ * A simple, two-stage resource reloader. * * @param the type of resources to be reloaded. + * + * @see SimpleJsonResourceReloader */ public interface SimpleResourceReloader extends ResourceReloader { @@ -30,17 +32,17 @@ default CompletableFuture reloadResources(SharedState state, ReloadStep pr * This stage may not run on the main game thread, so it is * imperative that the world or render state is not modified. * - * @param manager + * @param resourceManager * @return the reloaded resources. */ - T reloadResources(ResourceManager manager); + T reloadResources(ResourceManager resourceManager); /** * Performs the application stage for this resource reloader. * * @param resources the resources to apply. - * @param manager + * @param resourceManager */ - void applyResources(T resources, ResourceManager manager); + void applyResources(T resources, ResourceManager resourceManager); } From ff54653c4d2e9faa1b06a4ae31c93acc621ed7c8 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Sat, 10 Oct 2026 20:31:36 +0200 Subject: [PATCH 2/4] [resource loader] fix unable to disable mods data pack --- .../impl/mixin/client/ResourcePacksMixin.java | 2 +- .../impl/mixin/client/TexturePacksMixin.java | 2 +- .../impl/mixin/client/TexturePacksMixin.java | 2 +- .../impl/mixin/client/ResourcePacksMixin.java | 2 +- .../impl/mixin/client/MinecraftMixin.java | 2 +- .../mixin/common/MinecraftServerMixin.java | 2 +- .../impl/mixin/client/MinecraftMixin.java | 2 +- .../mixin/common/MinecraftServerMixin.java | 2 +- .../impl/mixin/client/MinecraftMixin.java | 2 +- .../impl/mixin/client/TexturePacksMixin.java | 2 +- .../repository/BundledModResourcePacks.java | 18 ++++++++++++++++-- 11 files changed, 26 insertions(+), 12 deletions(-) diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java index f1b11de6b..b859a541e 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java @@ -68,7 +68,7 @@ private void load() { } this.packRepository.setCallbacks(null, this::selectionChanged); this.packRepository.addSource(new ClientResourcePacks((ResourcePacks) (Object) this)); - this.packRepository.addSource(new BundledModResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.client()); this.packRepository.addSource(this); // resourcepacks/ directory source this.packRepository.init(); diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java index 35a812776..ac53b5c06 100644 --- a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java @@ -88,7 +88,7 @@ private void reload() { } this.packRepository.setCallbacks(null, this::selectionChanged); this.packRepository.addSource(new ClientResourcePacks((TexturePacks) (Object) this)); - this.packRepository.addSource(new BundledModResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.client()); this.packRepository.addSource(this); // texturepacks/ directory source this.packRepository.init(); diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java index a037df518..c141162b9 100644 --- a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java @@ -87,7 +87,7 @@ private void reload() { } this.packRepository.setCallbacks(null, this::selectionChanged); this.packRepository.addSource(new ClientResourcePacks((TexturePacks) (Object) this)); - this.packRepository.addSource(new BundledModResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.client()); this.packRepository.addSource(this); // texturepacks/ directory source this.packRepository.init(); diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java index 5d47168b5..33e3fae70 100644 --- a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/ResourcePacksMixin.java @@ -66,7 +66,7 @@ private void load() { } this.packRepository.setCallbacks(null, this::selectionChanged); this.packRepository.addSource(new ClientResourcePacks((ResourcePacks) (Object) this)); - this.packRepository.addSource(new BundledModResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.client()); this.packRepository.addSource(this); // resourcepacks/ directory source this.packRepository.init(); diff --git a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index 04321aecb..73c00b3fe 100644 --- a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -113,7 +113,7 @@ public class MinecraftMixin { ) ) private void osl$resource_loader$registerModResources(CallbackInfo ci) { - this.actualPackRepository.addSource(new BundledModResourcePacks()); + this.actualPackRepository.addSource(BundledModResourcePacks.client()); } @Inject( diff --git a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java index 00f85397c..2a4d1b698 100644 --- a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java +++ b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -114,7 +114,7 @@ public class MinecraftServerMixin { ) ) private void osl$resource_loader$registerModResources(CallbackInfo ci) { - this.actualPackRepository.addSource(new BundledModResourcePacks()); + this.actualPackRepository.addSource(BundledModResourcePacks.server()); } @Inject( diff --git a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index ec5a5b2ed..adbad5105 100644 --- a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -110,7 +110,7 @@ public class MinecraftMixin { ) ) private void osl$resource_loader$registerModResources(CallbackInfo ci) { - this.actualPackRepository.addSource(new BundledModResourcePacks()); + this.actualPackRepository.addSource(BundledModResourcePacks.client()); } @Inject( diff --git a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java index ab76d82d7..c537f6f4c 100644 --- a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -110,7 +110,7 @@ public class MinecraftServerMixin { ) ) private void osl$resource_loader$registerModResources(CallbackInfo ci) { - this.actualPackRepository.addSource(new BundledModResourcePacks()); + this.actualPackRepository.addSource(BundledModResourcePacks.server()); } @Inject( diff --git a/libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index 770b3bdd0..c7103799e 100644 --- a/libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -91,7 +91,7 @@ public class MinecraftMixin implements MinecraftExtension { this.packRepository.setCallbacks(null, null); this.packRepository.addSource(new ClientResourcePacks()); - this.packRepository.addSource(new BundledModResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.client()); this.packRepository.addSource(new DirectoryPackSource(dir.resolve("texturepacks"), new TexturePackDetector())); this.packRepository.init(); diff --git a/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java b/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java index b976ceee6..f9af3276c 100644 --- a/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java +++ b/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/TexturePacksMixin.java @@ -95,7 +95,7 @@ private void reload() { } this.packRepository.setCallbacks(null, this::selectionChanged); this.packRepository.addSource(new ClientResourcePacks((TexturePacks) (Object) this)); - this.packRepository.addSource(new BundledModResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.client()); this.packRepository.addSource(this); // texturepacks/ directory source this.packRepository.init(); diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/repository/BundledModResourcePacks.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/repository/BundledModResourcePacks.java index c99dc8647..b71f64025 100644 --- a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/repository/BundledModResourcePacks.java +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/repository/BundledModResourcePacks.java @@ -31,6 +31,20 @@ public static void registerBundledModResourcePack(String id, String name, ModCon CUSTOM_MOD_RESOURCES.put(id, new CustomModResources(id, name, mod, directory)); } + public static BundledModResourcePacks client() { + return new BundledModResourcePacks(true); + } + + public static BundledModResourcePacks server() { + return new BundledModResourcePacks(false); + } + + private final boolean required; + + private BundledModResourcePacks(boolean required) { + this.required = required; + } + @Override public void loadResourcePacks(Consumer consumer) { List packs = new ArrayList<>(); @@ -47,7 +61,7 @@ public void loadResourcePacks(Consumer consumer) { ResourcePackSummary compositeSummary = ResourcePackSummary.create( compositePack, BUILT_IN_MOD_RESOURCES_ID, - true, + this.required, false, PackPosition.BOTTOM ); @@ -59,7 +73,7 @@ public void loadResourcePacks(Consumer consumer) { ResourcePackSummary summary = ResourcePackSummary.create( pack, customResources.id, - true, + this.required, false, PackPosition.BOTTOM ); From 37ce441bf4bf870fb45f38b3110583aadea0b6b2 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Mon, 28 Sep 2026 18:55:03 +0200 Subject: [PATCH 3/4] [resource loader] implement data packs in 1.3-1.12 --- .../gradle.properties | 1 - .../api/server/MinecraftServerExtension.java | 11 + .../server/resource/reload/DataReloaders.java | 21 ++ .../loader/api/world/WorldDataExtension.java | 11 + .../resource/loader/impl/DefaultDataPack.java | 91 ++++++ .../loader/impl/ServerResourcePacks.java | 18 ++ .../loader/impl/access/LootTablesAccess.java | 13 + .../mixin/client/IntegratedServerMixin.java | 97 ++++++ .../impl/mixin/client/MinecraftMixin.java | 16 + .../mixin/common/AdvancementManagerMixin.java | 96 +++++- .../mixin/common/FunctionManagerMixin.java | 101 +++++++ .../impl/mixin/common/LootTablesMixin.java | 140 +++++++++ .../mixin/common/MinecraftServerMixin.java | 286 ++++++++++++++++++ .../impl/mixin/common/ServerWorldMixin.java | 60 ++++ .../mixin/common/StructureManagerMixin.java | 100 ++++++ .../impl/mixin/common/WorldDataMixin.java | 124 ++++++++ .../server/MinecraftServerExtensionImpl.java | 18 ++ .../impl/world/WorldDataExtensionImpl.java | 18 ++ .../src/main/resources/fabric.mod.json | 3 +- .../osl.resource-loader.classtweaker | 4 + .../resources/osl.resource-loader.mixins.json | 10 +- .../gradle.properties | 1 - .../api/server/MinecraftServerExtension.java | 7 + .../server/resource/reload/DataReloaders.java | 21 ++ .../loader/api/world/WorldDataExtension.java | 11 + .../resource/loader/impl/DefaultDataPack.java | 52 ++++ .../loader/impl/ServerResourcePacks.java | 18 ++ .../mixin/client/IntegratedServerMixin.java | 56 ++++ .../impl/mixin/client/MinecraftMixin.java | 10 + .../mixin/common/MinecraftServerMixin.java | 225 ++++++++++++++ .../impl/mixin/common/WorldDataMixin.java | 123 ++++++++ .../server/MinecraftServerExtensionImpl.java | 11 + .../impl/world/WorldDataExtensionImpl.java | 18 ++ .../src/main/resources/fabric.mod.json | 2 +- .../osl.resource-loader.classtweaker | 4 + .../resources/osl.resource-loader.mixins.json | 6 +- .../gradle.properties | 1 - .../api/server/MinecraftServerExtension.java | 7 + .../server/resource/reload/DataReloaders.java | 21 ++ .../loader/api/world/WorldDataExtension.java | 11 + .../resource/loader/impl/DefaultDataPack.java | 52 ++++ .../loader/impl/ServerResourcePacks.java | 18 ++ .../mixin/client/IntegratedServerMixin.java | 52 ++++ .../impl/mixin/client/MinecraftMixin.java | 8 + .../mixin/common/AlphaWorldStorageMixin.java | 22 ++ .../mixin/common/MinecraftServerMixin.java | 183 +++++++++++ .../impl/mixin/common/WorldDataMixin.java | 124 ++++++++ .../impl/mixin/common/WorldStorageMixin.java | 18 ++ .../server/MinecraftServerExtensionImpl.java | 11 + .../impl/world/WorldDataExtensionImpl.java | 18 ++ .../impl/world/WorldStorageExtensionImpl.java | 10 + .../src/main/resources/fabric.mod.json | 2 +- .../osl.resource-loader.classtweaker | 5 + .../resources/osl.resource-loader.mixins.json | 8 +- .../gradle.properties | 1 - .../api/server/MinecraftServerExtension.java | 7 + .../server/resource/reload/DataReloaders.java | 21 ++ .../loader/api/world/WorldDataExtension.java | 11 + .../resource/loader/impl/DefaultDataPack.java | 52 ++++ .../loader/impl/ServerResourcePacks.java | 18 ++ .../mixin/client/IntegratedServerMixin.java | 81 +++++ .../impl/mixin/client/MinecraftMixin.java | 16 + .../mixin/common/AlphaWorldStorageMixin.java | 26 ++ .../mixin/common/MinecraftServerMixin.java | 211 +++++++++++++ .../impl/mixin/common/NbtCompoundMixin.java | 25 ++ .../impl/mixin/common/NbtListMixin.java | 27 ++ .../impl/mixin/common/WorldDataMixin.java | 141 +++++++++ .../impl/mixin/common/WorldStorageMixin.java | 22 ++ .../impl/nbt/NbtCompoundExtensionImpl.java | 12 + .../loader/impl/nbt/NbtListExtensionImpl.java | 10 + .../server/MinecraftServerExtensionImpl.java | 11 + .../impl/world/WorldDataExtensionImpl.java | 18 ++ .../impl/world/WorldStorageExtensionImpl.java | 10 + .../src/main/resources/fabric.mod.json | 3 +- .../osl.resource-loader.classtweaker | 11 + .../resources/osl.resource-loader.mixins.json | 10 +- 76 files changed, 3106 insertions(+), 13 deletions(-) create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/access/LootTablesAccess.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/FunctionManagerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/LootTablesMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/ServerWorldMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/StructureManagerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.classtweaker create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtCompoundMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtListMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtCompoundExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtListExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.classtweaker diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/gradle.properties b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/gradle.properties index dc55abfcb..4df0729db 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/gradle.properties +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/gradle.properties @@ -1,4 +1,3 @@ -environment = client min_mc_version = 1.8.2-pre5 max_mc_version = 1.12.2 diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java new file mode 100644 index 000000000..e32bcf5c6 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.api.server; + +import net.minecraft.world.gen.loot.LootTables; + +public interface MinecraftServerExtension { + + LootTables getLootTables(); + + void reloadResources(); + +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java new file mode 100644 index 000000000..3864d679f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.resource.loader.api.server.resource.reload; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.impl.resource.reload.ResourceReloaders; + +public final class DataReloaders { + + public static final NamespacedIdentifier CRAFTING_MANAGER = vanilla("recipes"); + public static final NamespacedIdentifier LOOT_TABLE_MANAGER = vanilla("loot_tables"); + public static final NamespacedIdentifier FUNCTION_MANAGER = vanilla("functions"); + public static final NamespacedIdentifier ADVANCEMENT_MANAGER = vanilla("advancements"); + public static final NamespacedIdentifier STRUCTURE_MANAGER = vanilla("structures"); + + public static final NamespacedIdentifier BEFORE_VANILLA = ResourceReloaders.BEFORE_VANILLA; + public static final NamespacedIdentifier AFTER_VANILLA = ResourceReloaders.AFTER_VANILLA; + + private static NamespacedIdentifier vanilla(String identifier) { + return ResourceReloaders.vanilla(ResourceType.SERVER_DATA, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java new file mode 100644 index 000000000..6c5af8209 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.api.world; + +import java.util.Set; + +public interface WorldDataExtension { + + Set getDisabledDataPacks(); + + Set getEnabledDataPacks(); + +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java new file mode 100644 index 000000000..b86b839f0 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java @@ -0,0 +1,91 @@ +package net.ornithemc.osl.resource.loader.impl; + +import java.io.InputStream; +import java.util.Collections; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import net.fabricmc.loader.api.FabricLoader; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.function.IOSupplier; +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourceConsumer; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ModContainerResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ResourcePacks; +import net.ornithemc.osl.text.api.TextComponents; + +public class DefaultDataPack extends ModContainerResourcePack { + + private static final boolean LOOT_TABLES_EXIST = MinecraftVersion.resolve().compareTo("15w43a") >= 0; + private static final boolean FUNCTIONS_EXIST = MinecraftVersion.resolve().compareTo("1.12-pre1") >= 0; + private static final boolean ADVANCEMENTS_EXIST = MinecraftVersion.resolve().compareTo("17w13a") >= 0; + + private final Set directoriesToRedirect = new HashSet<>(); + private final boolean shouldRedirectSomeDirectories; + + public DefaultDataPack() { + super(FabricLoader.getInstance().getModContainer("minecraft").get(), ".", "Default"); + +// this.directoriesToRedirect.add("recipes"); // TODO: support re-loading crafting recipes + if (LOOT_TABLES_EXIST) { + this.directoriesToRedirect.add("loot_tables"); + } + if (FUNCTIONS_EXIST) { + this.directoriesToRedirect.add("advancements"); + } + if (ADVANCEMENTS_EXIST) { + this.directoriesToRedirect.add("structures"); + } + + this.shouldRedirectSomeDirectories = !this.directoriesToRedirect.isEmpty(); + } + + @Override + protected IOSupplier generateMetadataFile() { + return ResourcePacks.generateMetadataFile(TextComponents.literal("The default behavior of Minecraft")); + } + + @Override + protected IOSupplier generateIconFile() { + return ModContainerResourcePack.getIcon(this.mod); + } + + @Override + protected Map> findNamespaces() { + return Collections.singletonMap(ResourceType.SERVER_DATA, Collections.singleton("minecraft")); + } + + private boolean shouldRedirectToAssets(String path) { + return this.directoriesToRedirect.stream().anyMatch(dir -> path.equals(dir) || path.startsWith(dir + "/")); + } + + private ResourceType updateResourceType(ResourceType type, NamespacedIdentifier location) { + return this.updateResourceType(type, location.identifier()); + } + + private ResourceType updateResourceType(ResourceType type, String path) { + if (this.shouldRedirectSomeDirectories && this.shouldRedirectToAssets(path)) { + type = ResourceType.CLIENT_ASSETS; + } + + return type; + } + + @Override + public boolean hasResource(ResourceType type, NamespacedIdentifier location) { + return super.hasResource(this.updateResourceType(type, location), location); + } + + @Override + public IOSupplier getResource(ResourceType type, NamespacedIdentifier location) { + return super.getResource(this.updateResourceType(type, location), location); + } + + @Override + public void findResources(ResourceType type, String namespace, String directory, ResourceConsumer consumer) { + super.findResources(this.updateResourceType(type, directory), namespace, directory, consumer); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java new file mode 100644 index 000000000..f606598e8 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl; + +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.repository.AbstractServerPackSource; + +public class ServerResourcePacks extends AbstractServerPackSource { + + private ResourcePack defaultPack; + + public ServerResourcePacks() { + this.defaultPack = new DefaultDataPack(); + } + + @Override + protected ResourcePack getOrWrapDefaultPack() { + return this.defaultPack; + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/access/LootTablesAccess.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/access/LootTablesAccess.java new file mode 100644 index 000000000..1e942f537 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/access/LootTablesAccess.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.resource.loader.impl.access; + +import com.google.gson.Gson; + +import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; + +public interface LootTablesAccess { + + Gson osl$resource_loader$getGson(); + + ResourceManager osl$resource_loader$getResourceManager(); + +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java new file mode 100644 index 000000000..e7a5b3e54 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java @@ -0,0 +1,97 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.AdvancementManager; +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.world.WorldData; +import net.minecraft.world.gen.loot.LootTables; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.resource.loader.impl.mixin.common.MinecraftServerMixin; + +@Mixin(IntegratedServer.class) +public class IntegratedServerMixin extends MinecraftServerMixin { + + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/integrated/IntegratedServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage, @Local WorldData data) { + this.onLoadWorldBeforeCreateServerWorlds(storage, data); + } + + @Conditional(minecraftVersion = @Version(">=15w43a <17w18a")) + @Redirect( + method = "m_90502033", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/gen/loot/LootTables;reload()V" + ) + ) + private void osl$resource_loader$cancelLootTablesReload(LootTables lootTables) { + // the loot table manager is added as a resource reload listener + } + + @Conditional(minecraftVersion = @Version(">=17w15a <17w18a")) + @Redirect( + method = "m_90502033", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/AdvancementManager;reload()V" + ) + ) + private void osl$resource_loader$cancelAdvancementsReload(AdvancementManager advancements) { + // the advancement manager is added as a resource reload listener + } + + @Conditional(minecraftVersion = @Version(">=15w43a <17w15a")) + @Inject( + method = "m_90502033", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/gen/loot/LootTables;reload()V", + shift = Shift.AFTER + ) + ) + private void osl$resource_loader$reloadResourcesPreAdvancements(CallbackInfo ci) { + this.reloadDataPacks(this.worlds[0].getData()); + } + + @Conditional(minecraftVersion = @Version(">=17w15a <17w18a")) + @Inject( + method = "m_90502033", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/PlayerManager;reloadResources()V" + ) + ) + private void osl$resource_loader$reloadResourcesPostAdvancements(CallbackInfo ci) { + this.reloadDataPacks(this.worlds[0].getData()); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index 3ebac78f1..5402c560a 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -32,6 +32,7 @@ import net.minecraft.client.sound.system.SoundManager; import net.minecraft.client.world.color.FoliageColorReloader; import net.minecraft.client.world.color.GrassColorReloader; +import net.minecraft.server.integrated.IntegratedServer; import net.ornithemc.conditionalmixin.annotations.Conditional; import net.ornithemc.conditionalmixin.annotations.Version; @@ -59,6 +60,8 @@ public class MinecraftMixin { private BuiltInResourcePack defaultResourcePack; @Shadow private ReloadableResourceManager resourceManager; + @Shadow + private IntegratedServer server; @Shadow private LanguageManager languageManager; @@ -158,6 +161,19 @@ public class MinecraftMixin { this.actualResourceManager.partialReload(); } + @Conditional(minecraftVersion = @Version("<15w43a")) + @Inject( + method = "reloadResources", + at = @At( + value = "HEAD" + ) + ) + private void osl$resource_loader$reloadServerResources(CallbackInfo ci) { + if (this.server != null) { + this.server.reloadResources(); + } + } + @Inject( method = "reloadResources", at = @At( diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AdvancementManagerMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AdvancementManagerMixin.java index 0a0859d50..b1f47bf57 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AdvancementManagerMixin.java +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AdvancementManagerMixin.java @@ -1,29 +1,86 @@ package net.ornithemc.osl.resource.loader.impl.mixin.common; +import java.io.BufferedReader; +import java.io.IOException; import java.net.URI; import java.nio.file.FileSystem; import java.nio.file.Path; import java.util.Map; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Redirect; +import com.google.gson.Gson; +import com.google.gson.JsonParseException; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.ModContainer; +import net.minecraft.advancement.Advancement; +import net.minecraft.resource.Identifier; import net.minecraft.server.AdvancementManager; +import net.minecraft.util.JsonUtils; import net.ornithemc.conditionalmixin.annotations.Conditional; import net.ornithemc.conditionalmixin.annotations.Version; import net.ornithemc.osl.resource.loader.api.resource.ResourcePath; +import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; @Conditional(minecraftVersion = @Version(">=17w13a")) @Mixin(AdvancementManager.class) -public class AdvancementManagerMixin { +public class AdvancementManagerMixin implements ResourceReloadListener { + + @Shadow @Final + private static Gson GSON; private static final ModContainer MINECRAFT = FabricLoader.getInstance().getModContainer("minecraft").get(); + private static final String DIRECTORY = "advancements"; + private static final String EXTENSION = ".json"; + + @Shadow + private boolean error; + + @Unique + private ResourceManager resourceManager; + + @Shadow + private void reload() { } + + @Redirect( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/AdvancementManager;reload()V" + ) + ) + private void osl$resource_loader$cancelReloadOnInit(AdvancementManager advancements) { + // we trigger this reload through the resource manager so it can be profiled + } + + @WrapOperation( + method = "reload", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/AdvancementManager;loadBuiltIn(Ljava/util/Map;)V" + ) + ) + private void osl$resource_loader$loadFromResources(AdvancementManager manager, Map advancements, Operation op) { + if (this.resourceManager == null) { + op.call(manager, advancements); + } else { + this.loadFromResources(advancements); + } + } @Redirect( method = "loadBuiltIn", @@ -50,4 +107,41 @@ public class AdvancementManagerMixin { private Path osl$resource_loader$getPathFromJar(FileSystem fs, String path, String... paths) { return MINECRAFT.findPath(ResourcePath.relative(path)).orElse(null); } + + @Override + public void resourcesReloaded(ResourceManager manager) { + this.resourceManager = manager; + this.reload(); + } + + @Unique + private void loadFromResources(Map advancements) { + this.resourceManager.findResources(DIRECTORY, location -> location.identifier().endsWith(EXTENSION)).forEach((location, resource) -> { + Identifier identifier = new Identifier( + location.namespace(), + location.identifier().substring(DIRECTORY.length() + 1, location.identifier().length() - EXTENSION.length()) + ); + + // prioritize advancements from local data/ directory + if (advancements.containsKey(identifier)) { + return; + } + + try (BufferedReader br = resource.openAsReader()) { + Advancement.Builder advancement = JsonUtils.fromJson(GSON, br, Advancement.Builder.class); + + if (advancement == null) { + ResourceLoader.LOGGER.error("Couldn't load custom advancement {} from {} as it's empty or null", identifier, location); + } else { + advancements.put(identifier, advancement); + } + } catch (IllegalArgumentException | JsonParseException e) { + ResourceLoader.LOGGER.error("Parsing error loading custom advancement {}: {}", identifier, e.getMessage()); + this.error = true; + } catch (IOException e) { + ResourceLoader.LOGGER.error("Couldn't read custom advancement {} from {}", identifier, location, e); + this.error = true; + } + }); + } } diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/FunctionManagerMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/FunctionManagerMixin.java new file mode 100644 index 000000000..b0b3c9a3f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/FunctionManagerMixin.java @@ -0,0 +1,101 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.BufferedReader; +import java.io.IOException; +import java.util.Map; +import java.util.stream.Collectors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.resource.Identifier; +import net.minecraft.server.FunctionManager; +import net.minecraft.server.command.function.CommandFunction; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; + +@Conditional(minecraftVersion = @Version(">=1.12-pre1")) +@Mixin(FunctionManager.class) +public class FunctionManagerMixin implements ResourceReloadListener { + + private static final String DIRECTORY = "functions"; + private static final String EXTENSION = MinecraftVersion.resolve().compareTo("1.12-pre3") < 0 ? ".txt" : ".mcfunction"; + + @Shadow + private Map customFunctions; + + @Unique + private ResourceManager resourceManager; + + @Shadow + private void reload() { } + + @Redirect( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/FunctionManager;reload()V" + ) + ) + private void osl$resource_loader$cancelReloadOnInit(FunctionManager functions) { + // we trigger this reload through the resource manager so it can be profiled + } + + @Inject( + method = "reload", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$loadFromResources(CallbackInfo ci) { + if (this.resourceManager != null) { + this.loadFromResources(this.customFunctions); + } + } + + @Override + public void resourcesReloaded(ResourceManager manager) { + this.resourceManager = manager; + this.reload(); + } + + @Unique + private void loadFromResources(Map functions) { + this.resourceManager.findResources(DIRECTORY, location -> location.identifier().endsWith(EXTENSION)).forEach((location, resource) -> { + Identifier identifier = new Identifier( + location.namespace(), + location.identifier().substring(DIRECTORY.length() + 1, location.identifier().length() - EXTENSION.length()) + ); + + // prioritize functions from local data/ directory + if (functions.containsKey(identifier)) { + return; + } + + try (BufferedReader br = resource.openAsReader()) { + CommandFunction function = CommandFunction.of((FunctionManager) (Object) this, br.lines().collect(Collectors.toList())); + + if (function == null) { + ResourceLoader.LOGGER.error("Couldn't load custom function {} from {} as it's empty or null", identifier, location); + } else { + functions.put(identifier, function); + } + } catch (IllegalArgumentException e) { + ResourceLoader.LOGGER.error("Parsing error loading custom function {}: {}", identifier, e.getMessage()); + } catch (IOException e) { + ResourceLoader.LOGGER.error("Couldn't read custom function {} from {}", identifier, location, e); + } + }); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/LootTablesMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/LootTablesMixin.java new file mode 100644 index 000000000..d0e20c324 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/LootTablesMixin.java @@ -0,0 +1,140 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.BufferedReader; +import java.io.IOException; + +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Coerce; +import org.spongepowered.asm.mixin.injection.Redirect; + +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.google.gson.Gson; +import com.google.gson.JsonParseException; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import net.minecraft.resource.Identifier; +import net.minecraft.world.gen.loot.LootTable; +import net.minecraft.world.gen.loot.LootTables; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; +import net.ornithemc.osl.resource.loader.impl.access.LootTablesAccess; + +@Conditional(minecraftVersion = @Version(">=15w43a")) +@Mixin(LootTables.class) +public class LootTablesMixin implements LootTablesAccess, ResourceReloadListener { + + private static final String DIRECTORY = "loot_tables"; + private static final String EXTENSION = ".json"; + + @Shadow @Final + private static Gson GSON; + + @Shadow + private LoadingCache lootTables; + + @Unique + private ResourceManager resourceManager; + + @Shadow + private void reload() { } + + @Redirect( + method = "", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/gen/loot/LootTables;reload()V" + ) + ) + private void osl$resource_loader$cancelReloadOnInit(LootTables lootTables) { + // we trigger this reload through the resource manager so it can be profiled + } + + @Override + public Gson osl$resource_loader$getGson() { + return GSON; + } + + @Override + public ResourceManager osl$resource_loader$getResourceManager() { + return this.resourceManager; + } + + @Override + public void resourcesReloaded(ResourceManager manager) { + this.resourceManager = manager; + this.reload(); + } + + @Conditional(minecraftVersion = @Version(">=15w43a")) + @Mixin(targets = "net/minecraft/world/gen/loot/LootTables$CacheLoader") + private static class CacheLoaderMixin { + + @Shadow + private LootTables f_13326223; // enclosing class instance + + @WrapOperation( + method = "load", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/gen/loot/LootTables$CacheLoader;loadFromAssets(Lnet/minecraft/resource/Identifier;)Lnet/minecraft/world/gen/loot/LootTable;" + ) + ) + private LootTable osl$resource_loader$loadFromResources(@Coerce CacheLoader cacheLoader, Identifier identifier, Operation op) { + if (this.resourceManager() == null) { + return op.call(cacheLoader, identifier); + } else { + return this.loadFromResources(identifier); + } + } + + @Unique + private LootTable loadFromResources(Identifier identifier) { + NamespacedIdentifier location = identifier + .prefixed(DIRECTORY + "/") + .suffixed(EXTENSION); + + return this.resourceManager().getResource(location) + .map(resource -> { + try (BufferedReader br = resource.openAsReader()) { + LootTable lootTable = this.gson().fromJson(br, LootTable.class); + + if (lootTable == null) { + ResourceLoader.LOGGER.error("Couldn't load custom loot table {} from {} as it's empty or null", identifier, location); + } else { + return lootTable; + } + } catch (IllegalArgumentException | JsonParseException e) { + ResourceLoader.LOGGER.error("Parsing error loading custom loot table {}: {}", identifier, e.getMessage()); + } catch (IOException e) { + ResourceLoader.LOGGER.error("Couldn't read custom loot table {} from {}", identifier, location, e); + } + + return LootTable.EMPTY; + }) + .orElse(null); + } + + @Unique + private Gson gson() { + return ((LootTablesAccess) this.f_13326223).osl$resource_loader$getGson(); + } + + @Unique + private ResourceManager resourceManager() { + return ((LootTablesAccess) this.f_13326223).osl$resource_loader$getResourceManager(); + } + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 000000000..d153ce5ac --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,286 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.File; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.AdvancementManager; +import net.minecraft.server.FunctionManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.PlayerManager; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.WorldData; +import net.minecraft.world.gen.loot.LootTables; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; +import net.ornithemc.osl.resource.loader.api.resource.repository.ResourcePackSummary; +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; +import net.ornithemc.osl.resource.loader.api.server.resource.reload.DataReloaders; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; +import net.ornithemc.osl.resource.loader.impl.ServerResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; +import net.ornithemc.osl.resource.loader.impl.resource.repository.BundledModResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.repository.DirectoryPackSource; +import net.ornithemc.osl.resource.loader.impl.resource.repository.SimpleResourcePackRepository; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServerExtension { + + private static final boolean LOOT_TABLE_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("15w43a") >= 0; + private static final boolean FUNCTION_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("1.12-pre1") >= 0; + private static final boolean ADVANCEMENT_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("17w13a") >= 0; + private static final boolean STRUCTURE_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("15w31a") >= 0; + private static final boolean PLAYER_MANAGER_IS_RELOADER = MinecraftVersion.resolve().compareTo("17w15a") >= 0; + + @Shadow + private PlayerManager playerManager; + @Shadow + protected ServerWorld[] worlds; + + @Unique + private SimpleResourcePackRepository packRepository; + @Unique + private SimpleReloadableResourceManager resourceManager; + + @Conditional(minecraftVersion = @Version(">=15w43a")) + @Unique + private LootTables lootTables; + @Conditional(minecraftVersion = @Version(">=1.12-pre1")) + @Unique + private FunctionManager functions; + @Conditional(minecraftVersion = @Version(">=17w13a")) + @Unique + private AdvancementManager advancements; + + @Inject( + method = "*", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.packRepository = SimpleResourcePackRepository.server(); + this.resourceManager = SimpleReloadableResourceManager.server(); + } + + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage, @Local WorldData data) { + this.onLoadWorldBeforeCreateServerWorlds(storage, data); + } + + @Conditional(minecraftVersion = @Version(">=17w18a")) + @Redirect( + method = "reloadResources", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/gen/loot/LootTables;reload()V" + ) + ) + private void osl$resource_loader$cancelLootTablesReload(LootTables lootTables) { + // the loot table manager is added as a resource reload listener + } + + @Conditional(minecraftVersion = @Version(">=17w18a")) + @Redirect( + method = "reloadResources", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/AdvancementManager;reload()V" + ) + ) + private void osl$resource_loader$cancelAdvancementsReload(AdvancementManager advancements) { + // the advancement manager is added as a resource reload listener + } + + @Conditional(minecraftVersion = @Version(">=1.12-pre1")) + @Redirect( + method = "reloadResources", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/FunctionManager;reload()V" + ) + ) + private void osl$resource_loader$cancelFunctionsReload(FunctionManager functions) { + // the function manager is added as a resource reload listener + } + + @Conditional(minecraftVersion = @Version(">=17w18a")) + @Inject( + method = "reloadResources", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/PlayerManager;reloadResources()V" + ) + ) + private void osl$resource_loader$reloadResources(CallbackInfo ci) { + this.reloadDataPacks(this.worlds[0].getData()); + } + + @Unique + protected void onLoadWorldBeforeCreateServerWorlds(WorldStorage storage, WorldData data) { + File dataDir = new File(storage.getDirectory(), "data"); + + if (LOOT_TABLE_MANAGER_EXISTS) { + this.lootTables = new LootTables(new File(dataDir, "loot_tables")); + } + if (FUNCTION_MANAGER_EXISTS) { + this.functions = new FunctionManager(new File(dataDir, "functions"), (MinecraftServer) (Object) this); + } + if (ADVANCEMENT_MANAGER_EXISTS) { + this.advancements = new AdvancementManager(new File(dataDir, "advancements")); + } + + this.loadDataPacks(storage.getDirectory().toPath(), storage, data); + } + + @Unique + private void loadDataPacks(Path dir, WorldStorage storage, WorldData data) { + this.packRepository.reset(); + this.packRepository.setCallbacks(null, null); + + this.packRepository.addSource(new ServerResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.server()); + this.packRepository.addSource(new DirectoryPackSource(dir.resolve("datapacks"))); + + this.packRepository.init(); + this.packRepository.reload(); + + List packsToSelect = new ArrayList<>(); + + for (String id : data.getEnabledDataPacks()) { + ResourcePackSummary pack = this.packRepository.getPack(id); + + if (pack == null) { + ResourceLoader.LOGGER.warn("Missing data pack {}", id); + } else { + packsToSelect.add(id); + } + } + + this.packRepository.setSelectedPacks(packsToSelect); + + this.resourceManager.reset(); + this.resourceManager.addAll(this.packRepository.openSelectedPacks()); + + // Vanilla's data reloaders all trigger a reload in + // we cancel those since we do a full reload here anyway +// this.resourceManager.registerReloader(DataReloaders.CRAFTING_MANAGER, new RecipesManager()); // TODO + if (LOOT_TABLE_MANAGER_EXISTS) { + this.resourceManager.registerReloader(DataReloaders.LOOT_TABLE_MANAGER, (ResourceReloader) this.lootTables); + } + if (FUNCTION_MANAGER_EXISTS) { + this.resourceManager.registerReloader(DataReloaders.FUNCTION_MANAGER, (ResourceReloader) this.functions); + } + if (ADVANCEMENT_MANAGER_EXISTS) { + this.resourceManager.registerReloader(DataReloaders.ADVANCEMENT_MANAGER, (ResourceReloader) this.advancements); + } + if (STRUCTURE_MANAGER_EXISTS) { + this.resourceManager.registerReloader(DataReloaders.STRUCTURE_MANAGER, (ResourceReloader) storage.getStructureManager()); + } + + this.resourceManager.init(); +// this.resourceManager.partialReload(); // unnecessary since full reload follows + + this.reloadDataPacks(data); + } + + @Unique + protected void reloadDataPacks(WorldData data) { + List packsToSelect = new ArrayList<>(this.packRepository.getSelectedPacks()); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + if (!data.getDisabledDataPacks().contains(pack.getId())) { + ResourceLoader.LOGGER.info("Found new data pack {}, loading it automatically", pack.getId()); + + pack.getDefaultPosition().insert(packsToSelect, pack, false); + } + } + + this.packRepository.setSelectedPacks(packsToSelect.stream().map(ResourcePackSummary::getId).collect(Collectors.toList())); + + try { + this.resourceManager.reload(this.packRepository.openSelectedPacks()); + } catch (Throwable t) { + ResourceLoader.LOGGER.error("Failed to reload data packs", t); + } + + data.getEnabledDataPacks().clear(); + data.getDisabledDataPacks().clear(); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + data.getDisabledDataPacks().add(pack.getId()); + } + for (ResourcePackSummary pack : this.packRepository.getSelectedPacks()) { + data.getEnabledDataPacks().add(pack.getId()); + } + } + + @Conditional(minecraftVersion = @Version(">=15w43a")) + @Override + public LootTables getLootTables() { + return this.lootTables; + } + + @Conditional(minecraftVersion = @Version(">=1.12-pre1")) + @Overwrite + public FunctionManager getFunctions() { + return this.functions; + } + + @Conditional(minecraftVersion = @Version(">=17w13a")) + @Overwrite + public AdvancementManager getAdvancements() { + return this.advancements; + } + + @Conditional(minecraftVersion = @Version("<17w18a")) + @Override + public void reloadResources() { + if (this.isRunningOnSameThread()) { + this.reloadDataPacks(this.worlds[0].getData()); + if (PLAYER_MANAGER_IS_RELOADER) { + this.playerManager.reloadResources(); + } + } else { + this.execute(this::reloadResources); + } + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/ServerWorldMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/ServerWorldMixin.java new file mode 100644 index 000000000..ea245a4e2 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/ServerWorldMixin.java @@ -0,0 +1,60 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.File; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import net.minecraft.server.AdvancementManager; +import net.minecraft.server.FunctionManager; +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.gen.loot.LootTables; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +@Mixin(ServerWorld.class) +public class ServerWorldMixin { + + @Shadow + private MinecraftServer server; + + @Conditional(minecraftVersion = @Version(">=15w43a")) + @Redirect( + method = "load", + at = @At( + value = "NEW", + target = "net/minecraft/world/gen/loot/LootTables" + ) + ) + private LootTables osl$resource_loader$replaceLootTableManager(File file) { + return this.server.getLootTables(); + } + + @Conditional(minecraftVersion = @Version(">=1.12-pre1")) + @Redirect( + method = "load", + at = @At( + value = "NEW", + target = "net/minecraft/server/FunctionManager" + ) + ) + private FunctionManager osl$resource_loader$replaceFunctionManager(File file, MinecraftServer server) { + return this.server.getFunctions(); + } + + @Conditional(minecraftVersion = @Version(">=17w13a")) + @Redirect( + method = "load", + at = @At( + value = "NEW", + target = "net/minecraft/server/AdvancementManager" + ) + ) + private AdvancementManager osl$resource_loader$replaceAdvancementManager(File file) { + return this.server.getAdvancements(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/StructureManagerMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/StructureManagerMixin.java new file mode 100644 index 000000000..a3d3d1f5f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/StructureManagerMixin.java @@ -0,0 +1,100 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; +import java.util.Optional; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; + +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; + +import net.minecraft.resource.Identifier; +import net.minecraft.world.gen.structure.template.StructureManager; +import net.minecraft.world.gen.structure.template.StructureTemplate; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.Resource; +import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; + +@Conditional(minecraftVersion = @Version(">=15w31a")) +@Mixin(StructureManager.class) +public class StructureManagerMixin implements ResourceReloadListener { + + private static final String DIRECTORY = "structures"; + private static final String EXTENSION = ".nbt"; + + @Shadow + private Map templates; + + @Unique + private ResourceManager resourceManager; + + @Shadow + private void loadStructure(String path, InputStream is) throws IOException { } + + @WrapOperation( + method = "getStructure", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/gen/structure/template/StructureManager;loadGeneratedStructure(Lnet/minecraft/resource/Identifier;)Z" + ) + ) + private boolean osl$resource_loader$loadFromResources1(StructureManager structureManager, Identifier identifier, Operation op) { + if (this.resourceManager == null) { + return op.call(structureManager, identifier); + } else { + return this.loadFromResources(identifier); + } + } + + @WrapOperation( + method = "loadFromNbt", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/gen/structure/template/StructureManager;loadGeneratedStructure(Lnet/minecraft/resource/Identifier;)Z" + ) + ) + private boolean osl$resource_loader$loadFromResources2(StructureManager structureManager, Identifier identifier, Operation op) { + if (this.resourceManager == null) { + return op.call(structureManager, identifier); + } else { + return this.loadFromResources(identifier); + } + } + + @Override + public void resourcesReloaded(ResourceManager resourceManager) { + this.templates.clear(); + this.resourceManager = resourceManager; + } + + @Unique + private boolean loadFromResources(Identifier identifier) { + NamespacedIdentifier location = identifier + .prefixed(DIRECTORY + "/") + .suffixed(EXTENSION); + Optional resource = this.resourceManager.getResource(location); + + if (!resource.isPresent()) { + return false; + } + + try (InputStream is = resource.get().open()) { + this.loadStructure(identifier.getPath(), is); + return true; + } catch (Throwable t) { + ResourceLoader.LOGGER.error("Couldn't load custom structure template {} from {}", identifier, location, t); + return false; + } + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java new file mode 100644 index 000000000..16a16bdac --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java @@ -0,0 +1,124 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.world.WorldData; +import net.minecraft.world.WorldSettings; + +import net.ornithemc.feather.constants.NbtTypes; + +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +@Mixin(WorldData.class) +public class WorldDataMixin implements WorldDataExtension { + + private static final String DATA_PACKS = "DataPacks"; + private static final String DATA_PACKS_DISABLED = "Disabled"; + private static final String DATA_PACKS_ENABLED = "Enabled"; + + @Unique + private Set disabledDataPacks; + @Unique + private Set enabledDataPacks; + + @Inject( + method = "()V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/world/WorldSettings;Ljava/lang/String;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(WorldSettings settings, String name, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/nbt/NbtCompound;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$readDataPacks(NbtCompound nbt, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + + if (nbt.contains(DATA_PACKS, NbtTypes.COMPOUND)) { + NbtCompound dataPacksNbt = nbt.getCompound(DATA_PACKS); + NbtList disabledNbt = dataPacksNbt.getList(DATA_PACKS_DISABLED, NbtTypes.STRING); + NbtList enabledNbt = dataPacksNbt.getList(DATA_PACKS_ENABLED, NbtTypes.STRING); + + for (int i = 0; i < disabledNbt.size(); i++) { + this.disabledDataPacks.add(disabledNbt.getString(i)); + } + for (int i = 0; i < enabledNbt.size(); i++) { + this.enabledDataPacks.add(enabledNbt.getString(i)); + } + } + } + + @Inject( + method = "(Lnet/minecraft/world/WorldData;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$copyDataPacks(WorldData data, CallbackInfo ci) { + this.disabledDataPacks = data.getDisabledDataPacks(); + this.enabledDataPacks = data.getEnabledDataPacks(); + } + + @Inject( + method = "writeNbt", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$writeDataPacks(NbtCompound nbt, NbtCompound playerNbt, CallbackInfo ci) { + NbtCompound dataPacksNbt = new NbtCompound(); + NbtList disabledNbt = new NbtList(); + NbtList enabledNbt = new NbtList(); + + for (String id : this.enabledDataPacks) { + enabledNbt.addElement(new NbtString(id)); + } + for (String id : this.disabledDataPacks) { + disabledNbt.addElement(new NbtString(id)); + } + + dataPacksNbt.put(DATA_PACKS_ENABLED, enabledNbt); + dataPacksNbt.put(DATA_PACKS_DISABLED, disabledNbt); + nbt.put(DATA_PACKS, dataPacksNbt); + } + + @Override + public Set getDisabledDataPacks() { + return this.disabledDataPacks; + } + + @Override + public Set getEnabledDataPacks() { + return this.enabledDataPacks; + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java new file mode 100644 index 000000000..ea7d1d3d5 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl.server; + +import net.minecraft.world.gen.loot.LootTables; + +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; + +public interface MinecraftServerExtensionImpl extends MinecraftServerExtension { + + @Override + default LootTables getLootTables() { + throw new AbstractMethodError(); + } + + @Override + default void reloadResources() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java new file mode 100644 index 000000000..bf7ef06bf --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl.world; + +import java.util.Set; + +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +public interface WorldDataExtensionImpl extends WorldDataExtension { + + @Override + default Set getDisabledDataPacks() { + throw new AbstractMethodError(); + } + + @Override + default Set getEnabledDataPacks() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/fabric.mod.json b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/fabric.mod.json index 376cce3fa..4eb48eb5b 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/fabric.mod.json +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/fabric.mod.json @@ -2,10 +2,11 @@ "schemaVersion": 1, "id": "osl-resource-loader", "version": "0.10.0+mc1.8.2-pre5-mc1.12.2", - "environment": "client", + "environment": "*", "mixins": [ "osl.resource-loader.mixins.json" ], + "accessWidener": "osl.resource-loader.classtweaker", "depends": { "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.8.2-rc.5 \u003c\u003d1.12.2", diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.classtweaker b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.classtweaker new file mode 100644 index 000000000..63f0bbeb5 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.classtweaker @@ -0,0 +1,4 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/world/WorldData net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.mixins.json b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.mixins.json index f0c0eb9ca..6cf3b1e1d 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.mixins.json +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/resources/osl.resource-loader.mixins.json @@ -6,11 +6,19 @@ "plugin": "net.ornithemc.conditionalmixin.mixin.ConditionalMixinPlugin", "mixins": [ "common.AdvancementManagerMixin", - "common.CraftingManagerMixin" + "common.CraftingManagerMixin", + "common.FunctionManagerMixin", + "common.LootTablesMixin", + "common.LootTablesMixin$CacheLoaderMixin", + "common.MinecraftServerMixin", + "common.ServerWorldMixin", + "common.StructureManagerMixin", + "common.WorldDataMixin" ], "client": [ "client.BuiltInResourcePackMixin", "client.CustomResourcePackAccess", + "client.IntegratedServerMixin", "client.LegacyResourcePackAccess", "client.MinecraftMixin", "client.ResourcePacksMixin", diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/gradle.properties b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/gradle.properties index a9adae0d8..4e3127e59 100644 --- a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/gradle.properties +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/gradle.properties @@ -1,4 +1,3 @@ -environment = client min_mc_version = 12w15a max_mc_version = 13w07a diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java new file mode 100644 index 000000000..d411f9167 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java @@ -0,0 +1,7 @@ +package net.ornithemc.osl.resource.loader.api.server; + +public interface MinecraftServerExtension { + + void reloadResources(); + +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java new file mode 100644 index 000000000..3864d679f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.resource.loader.api.server.resource.reload; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.impl.resource.reload.ResourceReloaders; + +public final class DataReloaders { + + public static final NamespacedIdentifier CRAFTING_MANAGER = vanilla("recipes"); + public static final NamespacedIdentifier LOOT_TABLE_MANAGER = vanilla("loot_tables"); + public static final NamespacedIdentifier FUNCTION_MANAGER = vanilla("functions"); + public static final NamespacedIdentifier ADVANCEMENT_MANAGER = vanilla("advancements"); + public static final NamespacedIdentifier STRUCTURE_MANAGER = vanilla("structures"); + + public static final NamespacedIdentifier BEFORE_VANILLA = ResourceReloaders.BEFORE_VANILLA; + public static final NamespacedIdentifier AFTER_VANILLA = ResourceReloaders.AFTER_VANILLA; + + private static NamespacedIdentifier vanilla(String identifier) { + return ResourceReloaders.vanilla(ResourceType.SERVER_DATA, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java new file mode 100644 index 000000000..6c5af8209 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.api.world; + +import java.util.Set; + +public interface WorldDataExtension { + + Set getDisabledDataPacks(); + + Set getEnabledDataPacks(); + +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java new file mode 100644 index 000000000..e3da96176 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java @@ -0,0 +1,52 @@ +package net.ornithemc.osl.resource.loader.impl; + +import java.io.InputStream; +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import net.fabricmc.loader.api.FabricLoader; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.function.IOSupplier; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourceConsumer; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ModContainerResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ResourcePacks; +import net.ornithemc.osl.text.api.TextComponents; + +public class DefaultDataPack extends ModContainerResourcePack { + + public DefaultDataPack() { + super(FabricLoader.getInstance().getModContainer("minecraft").get(), ".", "Default"); + } + + @Override + protected IOSupplier generateMetadataFile() { + return ResourcePacks.generateMetadataFile(TextComponents.literal("The default behavior of Minecraft")); + } + + @Override + protected IOSupplier generateIconFile() { + return ModContainerResourcePack.getIcon(this.mod); + } + + @Override + protected Map> findNamespaces() { + return Collections.emptyMap(); + } + + @Override + public boolean hasResource(ResourceType type, NamespacedIdentifier location) { + return false; + } + + @Override + public IOSupplier getResource(ResourceType type, NamespacedIdentifier location) { + return null; + } + + @Override + public void findResources(ResourceType type, String namespace, String directory, ResourceConsumer consumer) { + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java new file mode 100644 index 000000000..f606598e8 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl; + +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.repository.AbstractServerPackSource; + +public class ServerResourcePacks extends AbstractServerPackSource { + + private ResourcePack defaultPack; + + public ServerResourcePacks() { + this.defaultPack = new DefaultDataPack(); + } + + @Override + protected ResourcePack getOrWrapDefaultPack() { + return this.defaultPack; + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java new file mode 100644 index 000000000..95f343a4a --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java @@ -0,0 +1,56 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.resource.loader.impl.mixin.common.MinecraftServerMixin; + +@Conditional(minecraftVersion = @Version(">=12w21a")) +@Mixin(IntegratedServer.class) +public class IntegratedServerMixin extends MinecraftServerMixin { + + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorageSource;get(Ljava/lang/String;Z)Lnet/minecraft/world/storage/WorldStorage;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/integrated/IntegratedServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage) { + this.onLoadWorldBeforeCreateServerWorlds(storage, storage.loadData()); + } + + @Inject( + method = "loadWorld", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/integrated/IntegratedServer;prepareWorlds()V" + ) + ) + private void osl$resource_loader$saveDataPacks(CallbackInfo ci) { + this.saveDataPacks(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index dbe733872..ff314b9ea 100644 --- a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -14,6 +14,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.render.texture.TextureManager; import net.minecraft.client.render.world.WorldRenderer; +import net.minecraft.server.integrated.IntegratedServer; import net.ornithemc.conditionalmixin.annotations.Conditional; import net.ornithemc.conditionalmixin.annotations.Version; @@ -32,12 +33,17 @@ public class MinecraftMixin implements MinecraftExtension { private static final boolean TEXTURE_PACK_IN_CRASH_REPORT = MinecraftVersion.resolve().compareTo("1.3.1") >= 0; + private static final boolean INTEGRATED_SERVER_EXISTS = MinecraftVersion.resolve().compareTo("12w21a") >= 0; @Shadow private TextureManager textureManager; @Shadow private WorldRenderer worldRenderer; + @Conditional(minecraftVersion = @Version(">=12w21a")) + @Shadow + private IntegratedServer server; + @Unique private SimpleResourcePackRepository packRepository; @Unique @@ -126,6 +132,10 @@ public class MinecraftMixin implements MinecraftExtension { @Override public void reloadResources() { + if (INTEGRATED_SERVER_EXISTS && this.server != null) { + this.server.reloadResources(); + } + this.packRepository.reload(); try { diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 000000000..8b216264a --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,225 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.WorldData; +import net.minecraft.world.storage.AlphaWorldStorage; +import net.minecraft.world.storage.AnvilWorldStorage; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.GameSide; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.resource.loader.api.resource.repository.ResourcePackSummary; +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; +import net.ornithemc.osl.resource.loader.impl.ServerResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; +import net.ornithemc.osl.resource.loader.impl.resource.repository.BundledModResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.repository.DirectoryPackSource; +import net.ornithemc.osl.resource.loader.impl.resource.repository.SimpleResourcePackRepository; + +@Conditional(minecraftVersion = @Version( + value = ">=12w18a", + gameSide = GameSide.CLIENT +)) +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServerExtension { + + @Shadow + protected ServerWorld[] worlds; + + @Unique + private SimpleResourcePackRepository packRepository; + @Unique + private SimpleReloadableResourceManager resourceManager; + + + @Inject( + method = "*", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.packRepository = SimpleResourcePackRepository.server(); + this.resourceManager = SimpleReloadableResourceManager.server(); + } + + @Conditional(minecraftVersion = @Version(">=12w18a")) + @Inject( + method = "loadWorld", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;", + shift = Shift.BY, + by = 2 + ) + ) + private void osl$resource_loader$storeWorldData(CallbackInfo ci, @Local WorldData data, @Share("osl$resource_loader$worldData") LocalRef dataRef) { + dataRef.set(data); + } + + @Conditional(minecraftVersion = @Version(">=12w18a")) + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage, @Share("osl$resource_loader$worldData") LocalRef dataRef) { + this.onLoadWorldBeforeCreateServerWorlds(storage, dataRef.get()); + } + + @Conditional(minecraftVersion = @Version("<12w18a")) + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "NEW", + target = "net/minecraft/world/storage/AnvilWorldStorage" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local AnvilWorldStorage storage) { + this.onLoadWorldBeforeCreateServerWorlds(storage, storage.loadData()); + } + + @Unique + protected void onLoadWorldBeforeCreateServerWorlds(WorldStorage storage, WorldData data) { + if (storage instanceof AlphaWorldStorage) { + AlphaWorldStorage strg = (AlphaWorldStorage) storage; + Path dir = strg.getDirectory().toPath(); + + this.loadDataPacks(dir, strg, data); + } else { + ResourceLoader.LOGGER.warn("Unable to load data packs for world {}: unknown storage type {}", storage.getName(), storage.getClass().getName()); + } + } + + @Unique + private void loadDataPacks(Path dir, WorldStorage storage, WorldData data) { + this.packRepository.reset(); + this.packRepository.setCallbacks(null, null); + + this.packRepository.addSource(new ServerResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.server()); + this.packRepository.addSource(new DirectoryPackSource(dir.resolve("datapacks"))); + + this.packRepository.init(); + this.packRepository.reload(); + + List packsToSelect = new ArrayList<>(); + + for (String id : data.getEnabledDataPacks()) { + ResourcePackSummary pack = this.packRepository.getPack(id); + + if (pack == null) { + ResourceLoader.LOGGER.warn("Missing data pack {}", id); + } else { + packsToSelect.add(id); + } + } + + this.packRepository.setSelectedPacks(packsToSelect); + + this.resourceManager.reset(); + this.resourceManager.addAll(this.packRepository.openSelectedPacks()); + + this.resourceManager.init(); +// this.resourceManager.partialReload(); // unnecessary since full reload follows + + this.reloadDataPacks(data); + } + + @Unique + protected void reloadDataPacks(WorldData data) { + List packsToSelect = new ArrayList<>(this.packRepository.getSelectedPacks()); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + if (!data.getDisabledDataPacks().contains(pack.getId())) { + ResourceLoader.LOGGER.info("Found new data pack {}, loading it automatically", pack.getId()); + + pack.getDefaultPosition().insert(packsToSelect, pack, false); + } + } + + this.packRepository.setSelectedPacks(packsToSelect.stream().map(ResourcePackSummary::getId).collect(Collectors.toList())); + + try { + this.resourceManager.reload(this.packRepository.openSelectedPacks()); + } catch (Throwable t) { + ResourceLoader.LOGGER.error("Failed to reload data packs", t); + } + + this.saveDataPacks(data); + } + + @Unique + protected void saveDataPacks() { + this.saveDataPacks(this.worlds[0].getData()); + } + + @Unique + private void saveDataPacks(WorldData data) { + data.getEnabledDataPacks().clear(); + data.getDisabledDataPacks().clear(); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + data.getDisabledDataPacks().add(pack.getId()); + } + for (ResourcePackSummary pack : this.packRepository.getSelectedPacks()) { + data.getEnabledDataPacks().add(pack.getId()); + } + } + + @Override + public void reloadResources() { + if (this.isRunningOnSameThread()) { + this.reloadDataPacks(this.worlds[0].getData()); + } else { + this.execute(this::reloadResources); + } + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java new file mode 100644 index 000000000..6385487cf --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java @@ -0,0 +1,123 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.world.WorldData; +import net.minecraft.world.WorldSettings; + +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +@Mixin(WorldData.class) +public class WorldDataMixin implements WorldDataExtension { + + private static final String DATA_PACKS = "DataPacks"; + private static final String DATA_PACKS_DISABLED = "Disabled"; + private static final String DATA_PACKS_ENABLED = "Enabled"; + + @Unique + private Set disabledDataPacks; + @Unique + private Set enabledDataPacks; + + @Inject( + method = "()V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/world/WorldSettings;Ljava/lang/String;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(WorldSettings settings, String name, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/nbt/NbtCompound;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$readDataPacks(NbtCompound nbt, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + + if (nbt.contains(DATA_PACKS)) { + NbtCompound dataPacksNbt = nbt.getCompound(DATA_PACKS); + NbtList disabledNbt = dataPacksNbt.getList(DATA_PACKS_DISABLED); + NbtList enabledNbt = dataPacksNbt.getList(DATA_PACKS_ENABLED); + + for (int i = 0; i < disabledNbt.size(); i++) { + NbtString packNbt = (NbtString) disabledNbt.get(i); + this.disabledDataPacks.add(packNbt.value); + } + for (int i = 0; i < enabledNbt.size(); i++) { + NbtString packNbt = (NbtString) enabledNbt.get(i); + this.enabledDataPacks.add(packNbt.value); + } + } + } + + @Inject( + method = "(Lnet/minecraft/world/WorldData;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$copyDataPacks(WorldData data, CallbackInfo ci) { + this.disabledDataPacks = data.getDisabledDataPacks(); + this.enabledDataPacks = data.getEnabledDataPacks(); + } + + @Inject( + method = "writeNbt", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$writeDataPacks(NbtCompound nbt, NbtCompound playerNbt, CallbackInfo ci) { + NbtCompound dataPacksNbt = new NbtCompound(); + NbtList disabledNbt = new NbtList(); + NbtList enabledNbt = new NbtList(); + + for (String id : this.enabledDataPacks) { + enabledNbt.addElement(new NbtString("", id)); + } + for (String id : this.disabledDataPacks) { + disabledNbt.addElement(new NbtString("", id)); + } + + dataPacksNbt.put(DATA_PACKS_ENABLED, enabledNbt); + dataPacksNbt.put(DATA_PACKS_DISABLED, disabledNbt); + nbt.put(DATA_PACKS, dataPacksNbt); + } + + @Override + public Set getDisabledDataPacks() { + return this.disabledDataPacks; + } + @Override + public Set getEnabledDataPacks() { + return this.enabledDataPacks; + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java new file mode 100644 index 000000000..a42fd081f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.impl.server; + +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; + +public interface MinecraftServerExtensionImpl extends MinecraftServerExtension { + + @Override + default void reloadResources() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java new file mode 100644 index 000000000..bf7ef06bf --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl.world; + +import java.util.Set; + +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +public interface WorldDataExtensionImpl extends WorldDataExtension { + + @Override + default Set getDisabledDataPacks() { + throw new AbstractMethodError(); + } + + @Override + default Set getEnabledDataPacks() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/fabric.mod.json b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/fabric.mod.json index 8ac785438..337f6e9bd 100644 --- a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/fabric.mod.json +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/fabric.mod.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "osl-resource-loader", "version": "0.10.0+mc12w15a-mc13w07a", - "environment": "client", + "environment": "*", "mixins": [ "osl.resource-loader.mixins.json" ], diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.classtweaker b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.classtweaker index a622451e1..ec3068869 100644 --- a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.classtweaker +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.classtweaker @@ -1,3 +1,7 @@ classTweaker v1 named +accessible method net/minecraft/world/storage/AlphaWorldStorage getDirectory ()Ljava/io/File; + transitive-inject-interface net/minecraft/client/Minecraft net/ornithemc/osl/resource/loader/impl/client/MinecraftExtensionImpl +transitive-inject-interface net/minecraft/world/WorldData net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.mixins.json b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.mixins.json index eea09975b..398476d95 100644 --- a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.mixins.json +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/resources/osl.resource-loader.mixins.json @@ -4,10 +4,13 @@ "package": "net.ornithemc.osl.resource.loader.impl.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "common.MinecraftServerMixin", + "common.WorldDataMixin" ], "client": [ "client.AbstractTexturePackAccess", "client.AbstractTexturePackMixin", + "client.IntegratedServerMixin", "client.MinecraftMixin", "client.TextureManagerMixin", "client.TexturePackListMixin", @@ -16,6 +19,7 @@ "server": [ ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 1, + "maxShiftBy": 2 } } diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/gradle.properties b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/gradle.properties index 3b992b47d..098cb647b 100644 --- a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/gradle.properties +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/gradle.properties @@ -1,4 +1,3 @@ -environment = client min_mc_version = 13w09a max_mc_version = 1.5.2 diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java new file mode 100644 index 000000000..d411f9167 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java @@ -0,0 +1,7 @@ +package net.ornithemc.osl.resource.loader.api.server; + +public interface MinecraftServerExtension { + + void reloadResources(); + +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java new file mode 100644 index 000000000..3864d679f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.resource.loader.api.server.resource.reload; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.impl.resource.reload.ResourceReloaders; + +public final class DataReloaders { + + public static final NamespacedIdentifier CRAFTING_MANAGER = vanilla("recipes"); + public static final NamespacedIdentifier LOOT_TABLE_MANAGER = vanilla("loot_tables"); + public static final NamespacedIdentifier FUNCTION_MANAGER = vanilla("functions"); + public static final NamespacedIdentifier ADVANCEMENT_MANAGER = vanilla("advancements"); + public static final NamespacedIdentifier STRUCTURE_MANAGER = vanilla("structures"); + + public static final NamespacedIdentifier BEFORE_VANILLA = ResourceReloaders.BEFORE_VANILLA; + public static final NamespacedIdentifier AFTER_VANILLA = ResourceReloaders.AFTER_VANILLA; + + private static NamespacedIdentifier vanilla(String identifier) { + return ResourceReloaders.vanilla(ResourceType.SERVER_DATA, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java new file mode 100644 index 000000000..6c5af8209 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.api.world; + +import java.util.Set; + +public interface WorldDataExtension { + + Set getDisabledDataPacks(); + + Set getEnabledDataPacks(); + +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java new file mode 100644 index 000000000..e3da96176 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java @@ -0,0 +1,52 @@ +package net.ornithemc.osl.resource.loader.impl; + +import java.io.InputStream; +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import net.fabricmc.loader.api.FabricLoader; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.function.IOSupplier; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourceConsumer; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ModContainerResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ResourcePacks; +import net.ornithemc.osl.text.api.TextComponents; + +public class DefaultDataPack extends ModContainerResourcePack { + + public DefaultDataPack() { + super(FabricLoader.getInstance().getModContainer("minecraft").get(), ".", "Default"); + } + + @Override + protected IOSupplier generateMetadataFile() { + return ResourcePacks.generateMetadataFile(TextComponents.literal("The default behavior of Minecraft")); + } + + @Override + protected IOSupplier generateIconFile() { + return ModContainerResourcePack.getIcon(this.mod); + } + + @Override + protected Map> findNamespaces() { + return Collections.emptyMap(); + } + + @Override + public boolean hasResource(ResourceType type, NamespacedIdentifier location) { + return false; + } + + @Override + public IOSupplier getResource(ResourceType type, NamespacedIdentifier location) { + return null; + } + + @Override + public void findResources(ResourceType type, String namespace, String directory, ResourceConsumer consumer) { + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java new file mode 100644 index 000000000..f606598e8 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl; + +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.repository.AbstractServerPackSource; + +public class ServerResourcePacks extends AbstractServerPackSource { + + private ResourcePack defaultPack; + + public ServerResourcePacks() { + this.defaultPack = new DefaultDataPack(); + } + + @Override + protected ResourcePack getOrWrapDefaultPack() { + return this.defaultPack; + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java new file mode 100644 index 000000000..afb6b917b --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java @@ -0,0 +1,52 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.osl.resource.loader.impl.mixin.common.MinecraftServerMixin; + +@Mixin(IntegratedServer.class) +public class IntegratedServerMixin extends MinecraftServerMixin { + + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorageSource;get(Ljava/lang/String;Z)Lnet/minecraft/world/storage/WorldStorage;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/integrated/IntegratedServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage) { + this.onLoadWorldBeforeCreateServerWorlds(storage, storage.loadData()); + } + + @Inject( + method = "loadWorld", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/integrated/IntegratedServer;prepareWorlds()V" + ) + ) + private void osl$resource_loader$saveDataPacks(CallbackInfo ci) { + this.saveDataPacks(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index 55d107dfc..04e2ed2f5 100644 --- a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -14,6 +14,7 @@ import net.minecraft.client.Minecraft; import net.minecraft.client.render.texture.TextureManager; import net.minecraft.client.render.world.WorldRenderer; +import net.minecraft.server.integrated.IntegratedServer; import net.ornithemc.osl.crashreports.impl.crash.ModifiableCrashReportSection; import net.ornithemc.osl.resource.loader.api.client.MinecraftExtension; @@ -31,6 +32,9 @@ public class MinecraftMixin implements MinecraftExtension { @Shadow private WorldRenderer worldRenderer; + @Shadow + private IntegratedServer server; + @Unique private SimpleResourcePackRepository packRepository; @Unique @@ -113,6 +117,10 @@ public class MinecraftMixin implements MinecraftExtension { @Override public void reloadResources() { + if (this.server != null) { + this.server.reloadResources(); + } + this.packRepository.reload(); try { diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java new file mode 100644 index 000000000..ae475ab3f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.File; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.storage.AlphaWorldStorage; + +import net.ornithemc.osl.resource.loader.impl.world.WorldStorageExtensionImpl; + +@Mixin(AlphaWorldStorage.class) +public class AlphaWorldStorageMixin implements WorldStorageExtensionImpl { + + @Shadow + private File dir; + + @Override + public File getDirectory() { + return this.dir; + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 000000000..17a6de92d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,183 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.WorldData; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.resource.loader.api.resource.repository.ResourcePackSummary; +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; +import net.ornithemc.osl.resource.loader.impl.ServerResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; +import net.ornithemc.osl.resource.loader.impl.resource.repository.BundledModResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.repository.DirectoryPackSource; +import net.ornithemc.osl.resource.loader.impl.resource.repository.SimpleResourcePackRepository; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServerExtension { + + @Shadow + protected ServerWorld[] worlds; + + @Unique + private SimpleResourcePackRepository packRepository; + @Unique + private SimpleReloadableResourceManager resourceManager; + + + @Inject( + method = "*", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.packRepository = SimpleResourcePackRepository.server(); + this.resourceManager = SimpleReloadableResourceManager.server(); + } + + @Inject( + method = "loadWorld", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;", + shift = Shift.BY, + by = 2 + ) + ) + private void osl$resource_loader$storeWorldData(CallbackInfo ci, @Local WorldData data, @Share("osl$resource_loader$worldData") LocalRef dataRef) { + dataRef.set(data); + } + + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage, @Share("osl$resource_loader$worldData") LocalRef dataRef) { + this.onLoadWorldBeforeCreateServerWorlds(storage, dataRef.get()); + } + + @Unique + protected void onLoadWorldBeforeCreateServerWorlds(WorldStorage storage, WorldData data) { + this.loadDataPacks(storage.getDirectory().toPath(), storage, data); + } + + @Unique + private void loadDataPacks(Path dir, WorldStorage storage, WorldData data) { + this.packRepository.reset(); + this.packRepository.setCallbacks(null, null); + + this.packRepository.addSource(new ServerResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.server()); + this.packRepository.addSource(new DirectoryPackSource(dir.resolve("datapacks"))); + + this.packRepository.init(); + this.packRepository.reload(); + + List packsToSelect = new ArrayList<>(); + + for (String id : data.getEnabledDataPacks()) { + ResourcePackSummary pack = this.packRepository.getPack(id); + + if (pack == null) { + ResourceLoader.LOGGER.warn("Missing data pack {}", id); + } else { + packsToSelect.add(id); + } + } + + this.packRepository.setSelectedPacks(packsToSelect); + + this.resourceManager.reset(); + this.resourceManager.addAll(this.packRepository.openSelectedPacks()); + + this.resourceManager.init(); +// this.resourceManager.partialReload(); // unnecessary since full reload follows + + this.reloadDataPacks(data); + } + + @Unique + protected void reloadDataPacks(WorldData data) { + List packsToSelect = new ArrayList<>(this.packRepository.getSelectedPacks()); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + if (!data.getDisabledDataPacks().contains(pack.getId())) { + ResourceLoader.LOGGER.info("Found new data pack {}, loading it automatically", pack.getId()); + + pack.getDefaultPosition().insert(packsToSelect, pack, false); + } + } + + this.packRepository.setSelectedPacks(packsToSelect.stream().map(ResourcePackSummary::getId).collect(Collectors.toList())); + + try { + this.resourceManager.reload(this.packRepository.openSelectedPacks()); + } catch (Throwable t) { + ResourceLoader.LOGGER.error("Failed to reload data packs", t); + } + + this.saveDataPacks(data); + } + + @Unique + protected void saveDataPacks() { + this.saveDataPacks(this.worlds[0].getData()); + } + + @Unique + private void saveDataPacks(WorldData data) { + data.getEnabledDataPacks().clear(); + data.getDisabledDataPacks().clear(); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + data.getDisabledDataPacks().add(pack.getId()); + } + for (ResourcePackSummary pack : this.packRepository.getSelectedPacks()) { + data.getEnabledDataPacks().add(pack.getId()); + } + } + + @Override + public void reloadResources() { + if (this.isRunningOnSameThread()) { + this.reloadDataPacks(this.worlds[0].getData()); + } else { + this.execute(this::reloadResources); + } + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java new file mode 100644 index 000000000..6bbf0ea98 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java @@ -0,0 +1,124 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.world.WorldData; +import net.minecraft.world.WorldSettings; + +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +@Mixin(WorldData.class) +public class WorldDataMixin implements WorldDataExtension { + + private static final String DATA_PACKS = "DataPacks"; + private static final String DATA_PACKS_DISABLED = "Disabled"; + private static final String DATA_PACKS_ENABLED = "Enabled"; + + @Unique + private Set disabledDataPacks; + @Unique + private Set enabledDataPacks; + + @Inject( + method = "()V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/world/WorldSettings;Ljava/lang/String;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(WorldSettings settings, String name, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/nbt/NbtCompound;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$readDataPacks(NbtCompound nbt, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + + if (nbt.contains(DATA_PACKS)) { + NbtCompound dataPacksNbt = nbt.getCompound(DATA_PACKS); + NbtList disabledNbt = dataPacksNbt.getList(DATA_PACKS_DISABLED); + NbtList enabledNbt = dataPacksNbt.getList(DATA_PACKS_ENABLED); + + for (int i = 0; i < disabledNbt.size(); i++) { + NbtString packNbt = (NbtString) disabledNbt.get(i); + this.disabledDataPacks.add(packNbt.value); + } + for (int i = 0; i < enabledNbt.size(); i++) { + NbtString packNbt = (NbtString) enabledNbt.get(i); + this.enabledDataPacks.add(packNbt.value); + } + } + } + + @Inject( + method = "(Lnet/minecraft/world/WorldData;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$copyDataPacks(WorldData data, CallbackInfo ci) { + this.disabledDataPacks = data.getDisabledDataPacks(); + this.enabledDataPacks = data.getEnabledDataPacks(); + } + + @Inject( + method = "writeNbt", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$writeDataPacks(NbtCompound nbt, NbtCompound playerNbt, CallbackInfo ci) { + NbtCompound dataPacksNbt = new NbtCompound(); + NbtList disabledNbt = new NbtList(); + NbtList enabledNbt = new NbtList(); + + for (String id : this.enabledDataPacks) { + enabledNbt.addElement(new NbtString("", id)); + } + for (String id : this.disabledDataPacks) { + disabledNbt.addElement(new NbtString("", id)); + } + + dataPacksNbt.put(DATA_PACKS_ENABLED, enabledNbt); + dataPacksNbt.put(DATA_PACKS_DISABLED, disabledNbt); + nbt.put(DATA_PACKS, dataPacksNbt); + } + + @Override + public Set getDisabledDataPacks() { + return this.disabledDataPacks; + } + + @Override + public Set getEnabledDataPacks() { + return this.enabledDataPacks; + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java new file mode 100644 index 000000000..ba3d19492 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.File; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.osl.resource.loader.impl.world.WorldStorageExtensionImpl; + +@Mixin(WorldStorage.class) +public interface WorldStorageMixin extends WorldStorageExtensionImpl { + + @Override + default File getDirectory() { + throw new UnsupportedOperationException(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java new file mode 100644 index 000000000..a42fd081f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.impl.server; + +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; + +public interface MinecraftServerExtensionImpl extends MinecraftServerExtension { + + @Override + default void reloadResources() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java new file mode 100644 index 000000000..bf7ef06bf --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl.world; + +import java.util.Set; + +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +public interface WorldDataExtensionImpl extends WorldDataExtension { + + @Override + default Set getDisabledDataPacks() { + throw new AbstractMethodError(); + } + + @Override + default Set getEnabledDataPacks() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java new file mode 100644 index 000000000..b0c112e62 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java @@ -0,0 +1,10 @@ +package net.ornithemc.osl.resource.loader.impl.world; + +import java.io.File; + +public interface WorldStorageExtensionImpl { + + default File getDirectory() { + throw new AbstractMethodError(); + } +} \ No newline at end of file diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/fabric.mod.json b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/fabric.mod.json index ad3434939..5e9005108 100644 --- a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/fabric.mod.json +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/fabric.mod.json @@ -2,7 +2,7 @@ "schemaVersion": 1, "id": "osl-resource-loader", "version": "0.10.0+mc13w09a-mc1.5.2", - "environment": "client", + "environment": "*", "mixins": [ "osl.resource-loader.mixins.json" ], diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.classtweaker b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.classtweaker index 25fa7ccbc..a476c9d42 100644 --- a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.classtweaker +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.classtweaker @@ -1,5 +1,10 @@ classTweaker v1 named extendable method net/minecraft/client/resource/pack/AbstractTexturePack loadIcon ()V +accessible method net/minecraft/world/storage/AlphaWorldStorage getDirectory ()Ljava/io/File; transitive-inject-interface net/minecraft/client/Minecraft net/ornithemc/osl/resource/loader/impl/client/MinecraftExtensionImpl +transitive-inject-interface net/minecraft/world/WorldData net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl + +inject-interface net/minecraft/world/storage/WorldStorage net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.mixins.json b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.mixins.json index eea09975b..908d5e311 100644 --- a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.mixins.json +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/resources/osl.resource-loader.mixins.json @@ -4,10 +4,15 @@ "package": "net.ornithemc.osl.resource.loader.impl.mixin", "compatibilityLevel": "JAVA_8", "mixins": [ + "common.AlphaWorldStorageMixin", + "common.MinecraftServerMixin", + "common.WorldDataMixin", + "common.WorldStorageMixin" ], "client": [ "client.AbstractTexturePackAccess", "client.AbstractTexturePackMixin", + "client.IntegratedServerMixin", "client.MinecraftMixin", "client.TextureManagerMixin", "client.TexturePackListMixin", @@ -16,6 +21,7 @@ "server": [ ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 1, + "maxShiftBy": 2 } } diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/gradle.properties b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/gradle.properties index d2f62b02a..9e945c67d 100644 --- a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/gradle.properties +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/gradle.properties @@ -1,4 +1,3 @@ -environment = client min_mc_version = 13w26a max_mc_version = 1.8.2-pre4 diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java new file mode 100644 index 000000000..d411f9167 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/MinecraftServerExtension.java @@ -0,0 +1,7 @@ +package net.ornithemc.osl.resource.loader.api.server; + +public interface MinecraftServerExtension { + + void reloadResources(); + +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java new file mode 100644 index 000000000..3864d679f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java @@ -0,0 +1,21 @@ +package net.ornithemc.osl.resource.loader.api.server.resource.reload; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.impl.resource.reload.ResourceReloaders; + +public final class DataReloaders { + + public static final NamespacedIdentifier CRAFTING_MANAGER = vanilla("recipes"); + public static final NamespacedIdentifier LOOT_TABLE_MANAGER = vanilla("loot_tables"); + public static final NamespacedIdentifier FUNCTION_MANAGER = vanilla("functions"); + public static final NamespacedIdentifier ADVANCEMENT_MANAGER = vanilla("advancements"); + public static final NamespacedIdentifier STRUCTURE_MANAGER = vanilla("structures"); + + public static final NamespacedIdentifier BEFORE_VANILLA = ResourceReloaders.BEFORE_VANILLA; + public static final NamespacedIdentifier AFTER_VANILLA = ResourceReloaders.AFTER_VANILLA; + + private static NamespacedIdentifier vanilla(String identifier) { + return ResourceReloaders.vanilla(ResourceType.SERVER_DATA, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java new file mode 100644 index 000000000..6c5af8209 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/world/WorldDataExtension.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.api.world; + +import java.util.Set; + +public interface WorldDataExtension { + + Set getDisabledDataPacks(); + + Set getEnabledDataPacks(); + +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java new file mode 100644 index 000000000..e3da96176 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/DefaultDataPack.java @@ -0,0 +1,52 @@ +package net.ornithemc.osl.resource.loader.impl; + +import java.io.InputStream; +import java.util.Collections; +import java.util.Map; +import java.util.Set; + +import net.fabricmc.loader.api.FabricLoader; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.function.IOSupplier; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourceConsumer; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ModContainerResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.pack.ResourcePacks; +import net.ornithemc.osl.text.api.TextComponents; + +public class DefaultDataPack extends ModContainerResourcePack { + + public DefaultDataPack() { + super(FabricLoader.getInstance().getModContainer("minecraft").get(), ".", "Default"); + } + + @Override + protected IOSupplier generateMetadataFile() { + return ResourcePacks.generateMetadataFile(TextComponents.literal("The default behavior of Minecraft")); + } + + @Override + protected IOSupplier generateIconFile() { + return ModContainerResourcePack.getIcon(this.mod); + } + + @Override + protected Map> findNamespaces() { + return Collections.emptyMap(); + } + + @Override + public boolean hasResource(ResourceType type, NamespacedIdentifier location) { + return false; + } + + @Override + public IOSupplier getResource(ResourceType type, NamespacedIdentifier location) { + return null; + } + + @Override + public void findResources(ResourceType type, String namespace, String directory, ResourceConsumer consumer) { + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java new file mode 100644 index 000000000..f606598e8 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/ServerResourcePacks.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl; + +import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack; +import net.ornithemc.osl.resource.loader.impl.resource.repository.AbstractServerPackSource; + +public class ServerResourcePacks extends AbstractServerPackSource { + + private ResourcePack defaultPack; + + public ServerResourcePacks() { + this.defaultPack = new DefaultDataPack(); + } + + @Override + protected ResourcePack getOrWrapDefaultPack() { + return this.defaultPack; + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java new file mode 100644 index 000000000..dbd57f4c2 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/IntegratedServerMixin.java @@ -0,0 +1,81 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; + +import net.minecraft.server.integrated.IntegratedServer; +import net.minecraft.world.WorldData; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.resource.loader.impl.mixin.common.MinecraftServerMixin; + +@Mixin(IntegratedServer.class) +public class IntegratedServerMixin extends MinecraftServerMixin { + + @Conditional(minecraftVersion = @Version("<14w02a")) + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorageSource;get(Ljava/lang/String;Z)Lnet/minecraft/world/storage/WorldStorage;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/integrated/IntegratedServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage) { + this.onLoadWorldBeforeCreateServerWorlds(storage, storage.loadData()); + } + + @Conditional(minecraftVersion = @Version("<14w02a")) + @Inject( + method = "loadWorld", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/server/integrated/IntegratedServer;prepareWorlds()V" + ) + ) + private void osl$resource_loader$saveDataPacks(CallbackInfo ci) { + this.saveDataPacks(); + } + + @Conditional(minecraftVersion = @Version(">=14w02a")) + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/integrated/IntegratedServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage, @Local WorldData data) { + this.onLoadWorldBeforeCreateServerWorlds(storage, data); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index 4ad7383b9..4743dc2ea 100644 --- a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -33,6 +33,7 @@ import net.minecraft.client.sound.system.SoundManager; import net.minecraft.client.world.color.FoliageColorReloader; import net.minecraft.client.world.color.GrassColorReloader; +import net.minecraft.server.integrated.IntegratedServer; import net.ornithemc.conditionalmixin.annotations.Conditional; import net.ornithemc.conditionalmixin.annotations.Version; @@ -69,6 +70,9 @@ public class MinecraftMixin { @Shadow private ReloadableResourceManager resourceManager; + @Shadow + private IntegratedServer server; + @Shadow private LanguageManager languageManager; @Shadow @@ -180,6 +184,18 @@ public class MinecraftMixin { this.actualResourceManager.partialReload(); } + @Inject( + method = "reloadResources", + at = @At( + value = "HEAD" + ) + ) + private void osl$resource_loader$reloadServerResources(CallbackInfo ci) { + if (this.server != null) { + this.server.reloadResources(); + } + } + @Inject( method = "reloadResources", at = @At( diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java new file mode 100644 index 000000000..c961cc612 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/AlphaWorldStorageMixin.java @@ -0,0 +1,26 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.File; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.world.storage.AlphaWorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.resource.loader.impl.world.WorldStorageExtensionImpl; + +@Conditional(minecraftVersion = @Version("<=1.6.4")) +@Mixin(AlphaWorldStorage.class) +public class AlphaWorldStorageMixin implements WorldStorageExtensionImpl { + + @Shadow + private File dir; + + @Override + public File getDirectory() { + return this.dir; + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java new file mode 100644 index 000000000..4093e18d7 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -0,0 +1,211 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Slice; +import org.spongepowered.asm.mixin.injection.At.Shift; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.Share; +import com.llamalad7.mixinextras.sugar.ref.LocalRef; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.server.world.ServerWorld; +import net.minecraft.world.WorldData; +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.executors.api.MainThreadExecutor; +import net.ornithemc.osl.resource.loader.api.resource.repository.ResourcePackSummary; +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; +import net.ornithemc.osl.resource.loader.impl.ServerResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; +import net.ornithemc.osl.resource.loader.impl.resource.repository.BundledModResourcePacks; +import net.ornithemc.osl.resource.loader.impl.resource.repository.DirectoryPackSource; +import net.ornithemc.osl.resource.loader.impl.resource.repository.SimpleResourcePackRepository; + +@Mixin(MinecraftServer.class) +public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServerExtension { + + @Shadow + protected ServerWorld[] worlds; + + @Unique + private SimpleResourcePackRepository packRepository; + @Unique + private SimpleReloadableResourceManager resourceManager; + + + @Inject( + method = "*", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.packRepository = SimpleResourcePackRepository.server(); + this.resourceManager = SimpleReloadableResourceManager.server(); + } + + @Conditional(minecraftVersion = @Version("<14w02a")) + @Inject( + method = "loadWorld", + at = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;", + shift = Shift.BY, + by = 2 + ) + ) + private void osl$resource_loader$storeWorldData(CallbackInfo ci, @Local WorldData data, @Share("osl$resource_loader$worldData") LocalRef dataRef) { + dataRef.set(data); + } + + @Conditional(minecraftVersion = @Version("<14w02a")) + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage, @Share("osl$resource_loader$worldData") LocalRef dataRef) { + this.onLoadWorldBeforeCreateServerWorlds(storage, dataRef.get()); + } + + @Conditional(minecraftVersion = @Version(">=14w02a")) + @Inject( + method = "loadWorld", + slice = @Slice( + from = @At( + value = "INVOKE", + target = "Lnet/minecraft/world/storage/WorldStorage;loadData()Lnet/minecraft/world/WorldData;" + ) + ), + at = @At( + // inject before the for-loop for ServerWorld instancing + value = "FIELD", + target = "Lnet/minecraft/server/MinecraftServer;worlds:[Lnet/minecraft/server/world/ServerWorld;", + ordinal = 0, + shift = Shift.BY, + // it's extreme but this ensures that the injector is only invoked once + by = -5 + ) + ) + private void osl$resource_loader$loadDataPacks(CallbackInfo ci, @Local WorldStorage storage, @Local WorldData data) { + this.onLoadWorldBeforeCreateServerWorlds(storage, data); + } + + @Unique + protected void onLoadWorldBeforeCreateServerWorlds(WorldStorage storage, WorldData data) { + this.loadDataPacks(storage.getDirectory().toPath(), storage, data); + } + + @Unique + private void loadDataPacks(Path dir, WorldStorage storage, WorldData data) { + this.packRepository.reset(); + this.packRepository.setCallbacks(null, null); + + this.packRepository.addSource(new ServerResourcePacks()); + this.packRepository.addSource(BundledModResourcePacks.server()); + this.packRepository.addSource(new DirectoryPackSource(dir.resolve("datapacks"))); + + this.packRepository.init(); + this.packRepository.reload(); + + List packsToSelect = new ArrayList<>(); + + for (String id : data.getEnabledDataPacks()) { + ResourcePackSummary pack = this.packRepository.getPack(id); + + if (pack == null) { + ResourceLoader.LOGGER.warn("Missing data pack {}", id); + } else { + packsToSelect.add(id); + } + } + + this.packRepository.setSelectedPacks(packsToSelect); + + this.resourceManager.reset(); + this.resourceManager.addAll(this.packRepository.openSelectedPacks()); + + this.resourceManager.init(); +// this.resourceManager.partialReload(); // unnecessary since full reload follows + + this.reloadDataPacks(data); + } + + @Unique + protected void reloadDataPacks(WorldData data) { + List packsToSelect = new ArrayList<>(this.packRepository.getSelectedPacks()); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + if (!data.getDisabledDataPacks().contains(pack.getId())) { + ResourceLoader.LOGGER.info("Found new data pack {}, loading it automatically", pack.getId()); + + pack.getDefaultPosition().insert(packsToSelect, pack, false); + } + } + + this.packRepository.setSelectedPacks(packsToSelect.stream().map(ResourcePackSummary::getId).collect(Collectors.toList())); + + try { + this.resourceManager.reload(this.packRepository.openSelectedPacks()); + } catch (Throwable t) { + ResourceLoader.LOGGER.error("Failed to reload data packs", t); + } + + this.saveDataPacks(data); + } + + @Unique + protected void saveDataPacks() { + this.saveDataPacks(this.worlds[0].getData()); + } + + @Unique + private void saveDataPacks(WorldData data) { + data.getEnabledDataPacks().clear(); + data.getDisabledDataPacks().clear(); + + for (ResourcePackSummary pack : this.packRepository.getUnselectedPacks()) { + data.getDisabledDataPacks().add(pack.getId()); + } + for (ResourcePackSummary pack : this.packRepository.getSelectedPacks()) { + data.getEnabledDataPacks().add(pack.getId()); + } + } + + @Override + public void reloadResources() { + if (this.isRunningOnSameThread()) { + this.reloadDataPacks(this.worlds[0].getData()); + } else { + this.execute(this::reloadResources); + } + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtCompoundMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtCompoundMixin.java new file mode 100644 index 000000000..4cc630420 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtCompoundMixin.java @@ -0,0 +1,25 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.resource.loader.impl.nbt.NbtCompoundExtensionImpl; + +@Conditional(minecraftVersion = @Version("<=1.6.4")) +@Mixin(NbtCompound.class) +public class NbtCompoundMixin implements NbtCompoundExtensionImpl { + + @Shadow + private NbtList m_95654166(String key) { return null; } + + @Override + public NbtList getList(String key, int type) { + return this.m_95654166(key); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtListMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtListMixin.java new file mode 100644 index 000000000..02bc92d49 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/NbtListMixin.java @@ -0,0 +1,27 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; + +import net.minecraft.nbt.NbtElement; +import net.minecraft.nbt.NbtList; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.resource.loader.impl.nbt.NbtListExtensionImpl; + +@Conditional(minecraftVersion = @Version("<=1.6.4")) +@Mixin(NbtList.class) +public class NbtListMixin implements NbtListExtensionImpl { + + @Shadow + private List elements; + + @Override + public String getString(int index) { + return this.elements.get(index).toString(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java new file mode 100644 index 000000000..a4353ea9d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldDataMixin.java @@ -0,0 +1,141 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.Set; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +import net.minecraft.nbt.NbtCompound; +import net.minecraft.nbt.NbtList; +import net.minecraft.nbt.NbtString; +import net.minecraft.world.WorldData; +import net.minecraft.world.WorldSettings; + +import net.ornithemc.feather.constants.NbtTypes; + +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +@Mixin(WorldData.class) +public class WorldDataMixin implements WorldDataExtension { + + private static final boolean NBT_ELEMENTS_STORE_NAME = MinecraftVersion.resolve().compareTo("13w38a") < 0; + + private static final String DATA_PACKS = "DataPacks"; + private static final String DATA_PACKS_DISABLED = "Disabled"; + private static final String DATA_PACKS_ENABLED = "Enabled"; + + @Unique + private Set disabledDataPacks; + @Unique + private Set enabledDataPacks; + + @Inject( + method = "()V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/world/WorldSettings;Ljava/lang/String;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$initDataPacks(WorldSettings settings, String name, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + } + + @Inject( + method = "(Lnet/minecraft/nbt/NbtCompound;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$readDataPacks(NbtCompound nbt, CallbackInfo ci) { + this.disabledDataPacks = new HashSet<>(); + this.enabledDataPacks = new LinkedHashSet<>(); + + if (nbt.contains(DATA_PACKS)) { + NbtCompound dataPacksNbt = nbt.getCompound(DATA_PACKS); + NbtList disabledNbt = dataPacksNbt.getList(DATA_PACKS_DISABLED, NbtTypes.STRING); + NbtList enabledNbt = dataPacksNbt.getList(DATA_PACKS_ENABLED, NbtTypes.STRING); + + for (int i = 0; i < disabledNbt.size(); i++) { + this.disabledDataPacks.add(disabledNbt.getString(i)); + } + for (int i = 0; i < enabledNbt.size(); i++) { + this.enabledDataPacks.add(enabledNbt.getString(i)); + } + } + } + + @Inject( + method = "(Lnet/minecraft/world/WorldData;)V", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$copyDataPacks(WorldData data, CallbackInfo ci) { + this.disabledDataPacks = data.getDisabledDataPacks(); + this.enabledDataPacks = data.getEnabledDataPacks(); + } + + @Inject( + method = "writeNbt", + at = @At( + value = "TAIL" + ) + ) + private void osl$resource_loader$writeDataPacks(NbtCompound nbt, NbtCompound playerNbt, CallbackInfo ci) { + NbtCompound dataPacksNbt = new NbtCompound(); + NbtList disabledNbt = new NbtList(); + NbtList enabledNbt = new NbtList(); + + for (String id : this.enabledDataPacks) { + enabledNbt.addElement(this.makeNbtString(id)); + } + for (String id : this.disabledDataPacks) { + disabledNbt.addElement(this.makeNbtString(id)); + } + + dataPacksNbt.put(DATA_PACKS_ENABLED, enabledNbt); + dataPacksNbt.put(DATA_PACKS_DISABLED, disabledNbt); + nbt.put(DATA_PACKS, dataPacksNbt); + } + + @Unique + private NbtString makeNbtString(String value) { + NbtString nbt; + + if (NBT_ELEMENTS_STORE_NAME) { + nbt = new NbtString(""); + nbt.value = value; + } else { + nbt = new NbtString(value); + } + + return nbt; + } + + @Override + public Set getDisabledDataPacks() { + return this.disabledDataPacks; + } + + @Override + public Set getEnabledDataPacks() { + return this.enabledDataPacks; + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java new file mode 100644 index 000000000..d901e10ed --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/WorldStorageMixin.java @@ -0,0 +1,22 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.common; + +import java.io.File; + +import org.spongepowered.asm.mixin.Mixin; + +import net.minecraft.world.storage.WorldStorage; + +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.resource.loader.impl.world.WorldStorageExtensionImpl; + +@Conditional(minecraftVersion = @Version("<=1.6.4")) +@Mixin(WorldStorage.class) +public interface WorldStorageMixin extends WorldStorageExtensionImpl { + + @Override + default File getDirectory() { + throw new UnsupportedOperationException(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtCompoundExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtCompoundExtensionImpl.java new file mode 100644 index 000000000..fd35817fc --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtCompoundExtensionImpl.java @@ -0,0 +1,12 @@ +package net.ornithemc.osl.resource.loader.impl.nbt; + +import net.minecraft.nbt.NbtList; + +public interface NbtCompoundExtensionImpl { + + // this method changed signature in 13w36a so we hack it in + // in 1.6 cause I don't wanna split this module in two + default NbtList getList(String key, int type) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtListExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtListExtensionImpl.java new file mode 100644 index 000000000..1051432b3 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/nbt/NbtListExtensionImpl.java @@ -0,0 +1,10 @@ +package net.ornithemc.osl.resource.loader.impl.nbt; + +public interface NbtListExtensionImpl { + + // this method was added in 13w36a so we hack it in + // in 1.6 cause I don't wanna split this module in two + default String getString(int index) { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java new file mode 100644 index 000000000..a42fd081f --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.impl.server; + +import net.ornithemc.osl.resource.loader.api.server.MinecraftServerExtension; + +public interface MinecraftServerExtensionImpl extends MinecraftServerExtension { + + @Override + default void reloadResources() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java new file mode 100644 index 000000000..bf7ef06bf --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl.java @@ -0,0 +1,18 @@ +package net.ornithemc.osl.resource.loader.impl.world; + +import java.util.Set; + +import net.ornithemc.osl.resource.loader.api.world.WorldDataExtension; + +public interface WorldDataExtensionImpl extends WorldDataExtension { + + @Override + default Set getDisabledDataPacks() { + throw new AbstractMethodError(); + } + + @Override + default Set getEnabledDataPacks() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java new file mode 100644 index 000000000..e8ce328fb --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl.java @@ -0,0 +1,10 @@ +package net.ornithemc.osl.resource.loader.impl.world; + +import java.io.File; + +public interface WorldStorageExtensionImpl { + + default File getDirectory() { + throw new AbstractMethodError(); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/fabric.mod.json b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/fabric.mod.json index 1c970de7d..01262ee94 100644 --- a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/fabric.mod.json +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/fabric.mod.json @@ -2,10 +2,11 @@ "schemaVersion": 1, "id": "osl-resource-loader", "version": "0.10.0+mc13w26a-mc1.8.2-pre4", - "environment": "client", + "environment": "*", "mixins": [ "osl.resource-loader.mixins.json" ], + "accessWidener": "osl.resource-loader.classtweaker", "depends": { "fabricloader": "\u003e\u003d0.18.0", "minecraft": "\u003e\u003d1.6-alpha.13.26.a \u003c\u003d1.8.2-rc.4", diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.classtweaker b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.classtweaker new file mode 100644 index 000000000..2023a1268 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.classtweaker @@ -0,0 +1,11 @@ +classTweaker v1 named + +transitive-inject-interface net/minecraft/world/WorldData net/ornithemc/osl/resource/loader/impl/world/WorldDataExtensionImpl +transitive-inject-interface net/minecraft/server/MinecraftServer net/ornithemc/osl/resource/loader/impl/server/MinecraftServerExtensionImpl + +accessible field net/minecraft/nbt/NbtString value Ljava/lang/String; +accessible method net/minecraft/world/storage/AlphaWorldStorage getDirectory ()Ljava/io/File; + +inject-interface net/minecraft/world/storage/WorldStorage net/ornithemc/osl/resource/loader/impl/world/WorldStorageExtensionImpl +inject-interface net/minecraft/nbt/NbtCompound net/ornithemc/osl/resource/loader/impl/nbt/NbtCompoundExtensionImpl +inject-interface net/minecraft/nbt/NbtList net/ornithemc/osl/resource/loader/impl/nbt/NbtListExtensionImpl diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.mixins.json b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.mixins.json index db55de33c..63291449e 100644 --- a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.mixins.json +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/resources/osl.resource-loader.mixins.json @@ -5,10 +5,17 @@ "compatibilityLevel": "JAVA_8", "plugin": "net.ornithemc.conditionalmixin.mixin.ConditionalMixinPlugin", "mixins": [ + "common.AlphaWorldStorageMixin", + "common.MinecraftServerMixin", + "common.NbtCompoundMixin", + "common.NbtListMixin", + "common.WorldDataMixin", + "common.WorldStorageMixin" ], "client": [ "client.BuiltInResourcePackMixin", "client.CustomResourcePackAccess", + "client.IntegratedServerMixin", "client.MinecraftMixin", "client.ResourcePacksMixin", "client.ResourcePacksScreenMixin", @@ -17,6 +24,7 @@ "server": [ ], "injectors": { - "defaultRequire": 1 + "defaultRequire": 1, + "maxShiftBy": 2 } } From 90ee0ef7f1206daed59e379a4c0da6cff4f34537 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Fri, 16 Oct 2026 20:06:10 +0200 Subject: [PATCH 4/4] [resource loader] add data pack details to crash reports --- .../impl/mixin/common/MinecraftServerMixin.java | 17 +++++++++++++++++ .../impl/mixin/common/MinecraftServerMixin.java | 17 +++++++++++++++++ .../impl/mixin/common/MinecraftServerMixin.java | 17 +++++++++++++++++ .../impl/mixin/common/MinecraftServerMixin.java | 17 +++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java index d153ce5ac..8a20dcde8 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -82,6 +82,23 @@ public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServer private void osl$resource_loader$initDataPacks(CallbackInfo ci) { this.packRepository = SimpleResourcePackRepository.server(); this.resourceManager = SimpleReloadableResourceManager.server(); + + MinecraftServer server = (MinecraftServer) (Object) this; + + server.addCrashListener((report, section) -> { + section.addDetail("Data Packs", () -> { + return this.packRepository.getSelectedPacks().stream() + .map(summary -> { + String s = summary.getId(); + if (!summary.getCompatibility().isCompatible()) { + s += " (incompatible)"; + } + + return s; + }) + .collect(Collectors.joining(", ")); + }); + }); } @Inject( diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java index 8b216264a..b2b2ba7bd 100644 --- a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -64,6 +64,23 @@ public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServer private void osl$resource_loader$initDataPacks(CallbackInfo ci) { this.packRepository = SimpleResourcePackRepository.server(); this.resourceManager = SimpleReloadableResourceManager.server(); + + MinecraftServer server = (MinecraftServer) (Object) this; + + server.addCrashListener((report, section) -> { + section.addDetail("Data Packs", () -> { + return this.packRepository.getSelectedPacks().stream() + .map(summary -> { + String s = summary.getId(); + if (!summary.getCompatibility().isCompatible()) { + s += " (incompatible)"; + } + + return s; + }) + .collect(Collectors.joining(", ")); + }); + }); } @Conditional(minecraftVersion = @Version(">=12w18a")) diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java index 17a6de92d..bd0b9545f 100644 --- a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -54,6 +54,23 @@ public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServer private void osl$resource_loader$initDataPacks(CallbackInfo ci) { this.packRepository = SimpleResourcePackRepository.server(); this.resourceManager = SimpleReloadableResourceManager.server(); + + MinecraftServer server = (MinecraftServer) (Object) this; + + server.addCrashListener((report, section) -> { + section.addDetail("Data Packs", () -> { + return this.packRepository.getSelectedPacks().stream() + .map(summary -> { + String s = summary.getId(); + if (!summary.getCompatibility().isCompatible()) { + s += " (incompatible)"; + } + + return s; + }) + .collect(Collectors.joining(", ")); + }); + }); } @Inject( diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java index 4093e18d7..1119599e5 100644 --- a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/common/MinecraftServerMixin.java @@ -57,6 +57,23 @@ public class MinecraftServerMixin implements MainThreadExecutor, MinecraftServer private void osl$resource_loader$initDataPacks(CallbackInfo ci) { this.packRepository = SimpleResourcePackRepository.server(); this.resourceManager = SimpleReloadableResourceManager.server(); + + MinecraftServer server = (MinecraftServer) (Object) this; + + server.addCrashListener((report, section) -> { + section.addDetail("Data Packs", () -> { + return this.packRepository.getSelectedPacks().stream() + .map(summary -> { + String s = summary.getId(); + if (!summary.getCompatibility().isCompatible()) { + s += " (incompatible)"; + } + + return s; + }) + .collect(Collectors.joining(", ")); + }); + }); } @Conditional(minecraftVersion = @Version("<14w02a"))