From 159cdba9864164604d874a31506c0ac2fee2a0ce Mon Sep 17 00:00:00 2001 From: Space Walker Date: Sun, 27 Sep 2026 15:25:44 +0200 Subject: [PATCH 1/3] [core] add TopoSort util --- .../osl/core/api/util/sort/TopoSort.java | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 libraries/core/src/main/java/net/ornithemc/osl/core/api/util/sort/TopoSort.java diff --git a/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/sort/TopoSort.java b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/sort/TopoSort.java new file mode 100644 index 00000000..5d2f96cf --- /dev/null +++ b/libraries/core/src/main/java/net/ornithemc/osl/core/api/util/sort/TopoSort.java @@ -0,0 +1,85 @@ +package net.ornithemc.osl.core.api.util.sort; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; + +public final class TopoSort { + + public static List sort(Collection unsortedNodes, Map> incomingEdges) { + Map> nodes = unsortedNodes.stream() + .collect(Collectors.toMap(Function.identity(), Node::new)); + + nodes.forEach((value, node) -> { + Set nodesIn = incomingEdges.get(value); + + if (nodesIn != null && !nodesIn.isEmpty()) { + for (T prev : nodesIn) { + Node pred = nodes.get(prev); + + if (pred != null) { + node.addPredecessor(pred); + } + } + } + }); + + return sort(nodes.values()); + } + + public static List sort(Collection> unsortedNodes) { + List sortedNodes = new ArrayList<>(); + + while (!unsortedNodes.isEmpty()) { + Iterator> it = unsortedNodes.iterator(); + + while (it.hasNext()) { + Node node = it.next(); + + if (node.precedingNodes.isEmpty()) { + it.remove(); + + sortedNodes.add(node.value); + node.removeSuccessors(); + } + } + } + + return sortedNodes; + } + + private static final class Node { + + private final T value; + private final Set> precedingNodes; + private final Set> succedingNodes; + + public Node(T value) { + this.value = value; + this.precedingNodes = new HashSet<>(); + this.succedingNodes = new HashSet<>(); + } + + public void addPredecessor(Node node) { + this.precedingNodes.add(node); + node.succedingNodes.add(this); + } + + public void removeSuccessors() { + Iterator> it = this.succedingNodes.iterator(); + + while (it.hasNext()) { + Node node = it.next(); + + it.remove(); + node.precedingNodes.remove(this); + } + } + } +} From 06ea5a82ba0d2f8ddd7cbdb5a966513a2e556f04 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Sun, 27 Sep 2026 15:26:06 +0200 Subject: [PATCH 2/3] [resource loader] implement reloader dependency system --- libraries/resource-loader/README.md | 12 ++- .../resource/reload/AssetsReloaders.java | 29 ++++++ .../impl/adapter/ResourceManagerAdapter.java | 14 ++- .../adapter/ResourceReloaderIdentifier.java | 11 +++ .../impl/mixin/client/MinecraftMixin.java | 82 +++++++++++++++- .../resource/reload/AssetsReloaders.java | 27 ++++++ .../impl/mixin/client/MinecraftMixin.java | 3 +- .../resource/reload/AssetsReloaders.java | 27 ++++++ .../impl/mixin/client/MinecraftMixin.java | 5 +- .../resource/reload/AssetsReloaders.java | 28 ++++++ .../impl/adapter/ResourceManagerAdapter.java | 14 ++- .../adapter/ResourceReloaderIdentifier.java | 11 +++ .../impl/mixin/client/MinecraftMixin.java | 96 ++++++++++++++++++- .../resource/reload/AssetsReloaders.java | 29 ++++++ .../server/resource/reload/DataReloaders.java | 22 +++++ .../impl/adapter/ResourceManagerAdapter.java | 14 ++- .../adapter/ResourceReloaderIdentifier.java | 11 +++ .../impl/mixin/client/MinecraftMixin.java | 90 ++++++++++++++++- .../mixin/common/MinecraftServerMixin.java | 47 ++++++++- .../resource/reload/AssetsReloaders.java | 34 +++++++ .../server/resource/reload/DataReloaders.java | 22 +++++ .../impl/adapter/ResourceManagerAdapter.java | 13 ++- .../adapter/ResourceReloaderIdentifier.java | 11 +++ .../impl/mixin/client/MinecraftMixin.java | 95 +++++++++++++++++- .../client/VillagerProfessionLayerAccess.java | 14 +++ .../mixin/common/MinecraftServerMixin.java | 43 ++++++++- .../resources/osl.resource-loader.mixins.json | 3 +- .../resource/reload/AssetsReloaders.java | 27 ++++++ .../impl/mixin/client/MinecraftMixin.java | 3 +- .../resource/reload/AssetsReloaders.java | 27 ++++++ .../impl/mixin/client/MinecraftMixin.java | 3 +- .../manager/ReloadableResourceManager.java | 28 +++++- .../SimpleReloadableResourceManager.java | 88 ++++++++++++++++- .../reload/IdentifiableResourceReloader.java | 38 ++++++++ .../resource/reload/NoOpResourceReloader.java | 13 +++ .../resource/reload/ResourceReloaders.java | 33 +++++++ 36 files changed, 1043 insertions(+), 24 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/client/resource/reload/AssetsReloaders.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/adapter/ResourceReloaderIdentifier.java create mode 100644 libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java create mode 100644 libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java create mode 100644 libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java create mode 100644 libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/VillagerProfessionLayerAccess.java create mode 100644 libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java create mode 100644 libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java create mode 100644 libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/IdentifiableResourceReloader.java create mode 100644 libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/NoOpResourceReloader.java create mode 100644 libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/ResourceReloaders.java diff --git a/libraries/resource-loader/README.md b/libraries/resource-loader/README.md index f000b614..1d82151b 100644 --- a/libraries/resource-loader/README.md +++ b/libraries/resource-loader/README.md @@ -151,8 +151,8 @@ public class ExampleInitializer implements ClientModInitializer { @Override public void initClient() { ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> { - resourceManager.addReloader(new CookiesManager()); - resourceManager.addReloader(new ExampleReloadListener()); + resourceManager.registerReloader(CookiesManager.IDENTIFIER, new CookiesManager()); + resourceManager.registerReloader(ExampleReloadListener.IDENTIFIER, new ExampleReloadListener()); }); } } @@ -161,11 +161,15 @@ public class ExampleInitializer implements ClientModInitializer { ```java package com.example; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; import net.ornithemc.osl.resource.loader.api.resource.reload.SimpleResourceReloader; public class CookiesManager implements SimpleResourceReloader { + public static final NamespacedIdentifier IDENTIFIER = NamespacedIdentifiers.from("example", "cookies"); + private Cookies cookies; @Override @@ -190,11 +194,15 @@ public class CookiesManager implements SimpleResourceReloader { ```java package com.example; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; public class ExampleReloadListener implements ResourceReloadListener { + public static final NamespacedIdentifier IDENTIFIER = NamespacedIdentifiers.from("example", "example"); + @Override public void resourcesReloaded(ResourceManager manager) { // diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..962c7abf --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,29 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier MODEL_MANAGER = vanilla("models"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + public static final NamespacedIdentifier SEARCH_REGISTRY = vanilla("search_registry"); + + 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.CLIENT_ASSETS, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java index 9b707373..bdc5f257 100644 --- a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java @@ -16,6 +16,7 @@ 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.pack.ResourcePack; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -23,10 +24,12 @@ public class ResourceManagerAdapter implements net.minecraft.client.resource.man private final ResourceMetadataSerializerRegistry metadataSerializers; private final SimpleReloadableResourceManager resourceManager; + private final ResourceReloaderIdentifier reloaderIdentifier; - public ResourceManagerAdapter(ResourceMetadataSerializerRegistry metadataSerializers, SimpleReloadableResourceManager resourceManager) { + public ResourceManagerAdapter(ResourceMetadataSerializerRegistry metadataSerializers, SimpleReloadableResourceManager resourceManager, ResourceReloaderIdentifier reloaderIdentifier) { this.metadataSerializers = metadataSerializers; this.resourceManager = resourceManager; + this.reloaderIdentifier = reloaderIdentifier; } @Override @@ -46,7 +49,14 @@ public List getResources(Identifier loca @Override public void addListener(net.minecraft.client.resource.manager.ResourceReloadListener listener) { - this.resourceManager.addReloadedReloader(new WrappedResourceReloadListener(listener)); + NamespacedIdentifier identifier = this.reloaderIdentifier.identify(listener); + ResourceReloader reloader = new WrappedResourceReloadListener(listener); + + if (identifier == null) { + this.resourceManager.addReloadedReloader(reloader); + } else { + this.resourceManager.registerReloadedReloader(identifier, reloader); + } } @Override diff --git a/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java new file mode 100644 index 00000000..b33b21da --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc1.8.2-pre5-mc1.12.2/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.impl.adapter; + +import net.minecraft.client.resource.manager.ResourceReloadListener; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +public interface ResourceReloaderIdentifier { + + NamespacedIdentifier identify(ResourceReloadListener reloader); + +} 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 73d84db0..298a8048 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 @@ -14,11 +14,31 @@ import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.Minecraft; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.TextRenderer; +import net.minecraft.client.render.block.BlockRenderDispatcher; +import net.minecraft.client.render.entity.ItemRenderer; +import net.minecraft.client.render.texture.TextureManager; +import net.minecraft.client.render.world.WorldRenderer; +import net.minecraft.client.resource.language.LanguageManager; import net.minecraft.client.resource.manager.ReloadableResourceManager; +import net.minecraft.client.resource.manager.ResourceReloadListener; import net.minecraft.client.resource.metadata.ResourceMetadataSerializerRegistry; +import net.minecraft.client.resource.model.ModelManager; import net.minecraft.client.resource.pack.BuiltInResourcePack; import net.minecraft.client.resource.pack.ResourcePack; +import net.minecraft.client.search.SearchRegistry; +import net.minecraft.client.sound.system.SoundManager; +import net.minecraft.client.world.color.FoliageColorReloader; +import net.minecraft.client.world.color.GrassColorReloader; +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; import net.ornithemc.osl.resource.loader.impl.adapter.ResourceManagerAdapter; import net.ornithemc.osl.resource.loader.impl.adapter.ResourcePackLists; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -26,6 +46,8 @@ @Mixin(Minecraft.class) public class MinecraftMixin { + private static final boolean SEARCH_REGISTRY_EXISTS = MinecraftVersion.resolve().compareTo("1.12-pre6") >= 0; + @Shadow @Final private ResourceMetadataSerializerRegistry resourceMetadataSerializerRegistry; @Shadow @Final @@ -35,6 +57,30 @@ public class MinecraftMixin { @Shadow private ReloadableResourceManager resourceManager; + @Shadow + private LanguageManager languageManager; + @Shadow + private TextureManager textureManager; + @Shadow + private SoundManager soundManager; + @Shadow + private TextRenderer textRenderer; + @Shadow + private TextRenderer enchantingPhraseRenderer; + @Shadow + private ModelManager modelManager; + @Shadow + private ItemRenderer itemRenderer; + @Shadow + private GameRenderer gameRenderer; + @Shadow + private BlockRenderDispatcher blockRenderer; + @Shadow + private WorldRenderer worldRenderer; + @Conditional(minecraftVersion = @Version(">=1.12-pre6")) + @Shadow + private SearchRegistry searchRegistry; + @Unique private SimpleReloadableResourceManager actualResourceManager; @@ -49,7 +95,7 @@ public class MinecraftMixin { ) private void osl$resource_loader$setResourceManager(CallbackInfo ci) { this.actualResourceManager = SimpleReloadableResourceManager.client(); - this.resourceManager = new ResourceManagerAdapter(this.resourceMetadataSerializerRegistry, this.actualResourceManager); + this.resourceManager = new ResourceManagerAdapter(this.resourceMetadataSerializerRegistry, this.actualResourceManager, this::identifyReloadListener); this.actualResourceManager.reset(); // this.actualResourceManager.addAll(this.packRepository.openSelectedPacks()); // handled by Vanilla @@ -83,4 +129,38 @@ public class MinecraftMixin { ResourcePackLists.fixSelection(selection, false); } + + private NamespacedIdentifier identifyReloadListener(ResourceReloadListener listener) { + if (listener == this.languageManager) { + return AssetsReloaders.LANGUAGE_MANAGER; + } else if (listener == this.textureManager) { + return AssetsReloaders.TEXTURE_MANAGER; + } else if (listener == this.soundManager) { + return AssetsReloaders.SOUND_MANAGER; + } else if (listener == this.textRenderer) { + return AssetsReloaders.FONT_MANAGER; + } else if (listener == this.enchantingPhraseRenderer) { + return AssetsReloaders.ENCHANTING_PHRASE_FONT_MANAGER; + } else if (listener instanceof GrassColorReloader) { + return AssetsReloaders.GRASS_COLORS; + } else if (listener instanceof FoliageColorReloader) { + return AssetsReloaders.FOLIAGE_COLORS; + } else if (listener == this.modelManager) { + return AssetsReloaders.MODEL_MANAGER; + } else if (listener == this.itemRenderer) { + return AssetsReloaders.ITEM_RENDERER; + } else if (listener == this.gameRenderer) { + return AssetsReloaders.GAME_RENDERER; + } else if (listener == this.blockRenderer) { + return AssetsReloaders.BLOCK_RENDERER; + } else if (listener == this.worldRenderer) { + return AssetsReloaders.WORLD_RENDERER; + } else if (SEARCH_REGISTRY_EXISTS && listener == this.searchRegistry) { + return AssetsReloaders.SEARCH_REGISTRY; + } else { + ResourceLoader.LOGGER.debug("Unknown resource reload listener {}/{}", listener.getClass().getSimpleName(), listener); + } + + return null; + } } diff --git a/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..d1cb926d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc12w15a-mc13w07a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,27 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + + 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.CLIENT_ASSETS, identifier); + } +} 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 12c1d1ad..a56d123d 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 @@ -17,6 +17,7 @@ import net.ornithemc.conditionalmixin.annotations.Version; import net.ornithemc.osl.resource.loader.api.client.MinecraftExtension; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; import net.ornithemc.osl.resource.loader.impl.ResourceLoader; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -63,7 +64,7 @@ public class MinecraftMixin implements MinecraftExtension { this.reloadResources(); - this.resourceManager.addReloadedReloader((ResourceReloader) this.textureManager); + this.resourceManager.registerReloadedReloader(AssetsReloaders.TEXTURE_MANAGER, (ResourceReloader) this.textureManager); this.resourceManager.init(); // Vanilla reloaders are triggered when registered diff --git a/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..d1cb926d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w09a-mc1.5.2/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,27 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + + 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.CLIENT_ASSETS, identifier); + } +} 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 20b20357..f820bd38 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 @@ -4,9 +4,9 @@ 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.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.Redirect; -import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; @@ -14,6 +14,7 @@ import net.minecraft.client.render.world.WorldRenderer; import net.ornithemc.osl.resource.loader.api.client.MinecraftExtension; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; import net.ornithemc.osl.resource.loader.impl.ResourceLoader; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -60,7 +61,7 @@ public class MinecraftMixin implements MinecraftExtension { this.reloadResources(); - this.resourceManager.addReloadedReloader((ResourceReloader) this.textureManager); + this.resourceManager.registerReloadedReloader(AssetsReloaders.TEXTURE_MANAGER, (ResourceReloader) this.textureManager); this.resourceManager.init(); // Vanilla reloaders are triggered when registered diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..1de1d1bb --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,28 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier MODEL_MANAGER = vanilla("models"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + + 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.CLIENT_ASSETS, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java index 9b707373..bdc5f257 100644 --- a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java @@ -16,6 +16,7 @@ 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.pack.ResourcePack; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -23,10 +24,12 @@ public class ResourceManagerAdapter implements net.minecraft.client.resource.man private final ResourceMetadataSerializerRegistry metadataSerializers; private final SimpleReloadableResourceManager resourceManager; + private final ResourceReloaderIdentifier reloaderIdentifier; - public ResourceManagerAdapter(ResourceMetadataSerializerRegistry metadataSerializers, SimpleReloadableResourceManager resourceManager) { + public ResourceManagerAdapter(ResourceMetadataSerializerRegistry metadataSerializers, SimpleReloadableResourceManager resourceManager, ResourceReloaderIdentifier reloaderIdentifier) { this.metadataSerializers = metadataSerializers; this.resourceManager = resourceManager; + this.reloaderIdentifier = reloaderIdentifier; } @Override @@ -46,7 +49,14 @@ public List getResources(Identifier loca @Override public void addListener(net.minecraft.client.resource.manager.ResourceReloadListener listener) { - this.resourceManager.addReloadedReloader(new WrappedResourceReloadListener(listener)); + NamespacedIdentifier identifier = this.reloaderIdentifier.identify(listener); + ResourceReloader reloader = new WrappedResourceReloadListener(listener); + + if (identifier == null) { + this.resourceManager.addReloadedReloader(reloader); + } else { + this.resourceManager.registerReloadedReloader(identifier, reloader); + } } @Override diff --git a/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java new file mode 100644 index 00000000..b33b21da --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc13w26a-mc1.8.2-pre4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.impl.adapter; + +import net.minecraft.client.resource.manager.ResourceReloadListener; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +public interface ResourceReloaderIdentifier { + + NamespacedIdentifier identify(ResourceReloadListener reloader); + +} 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 b271f7ee..aa062da8 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 @@ -15,11 +15,31 @@ import com.llamalad7.mixinextras.sugar.Local; import net.minecraft.client.Minecraft; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.TextRenderer; +import net.minecraft.client.render.block.BlockRenderDispatcher; +import net.minecraft.client.render.entity.ItemRenderer; +import net.minecraft.client.render.texture.TextureManager; +import net.minecraft.client.render.world.WorldRenderer; +import net.minecraft.client.resource.language.LanguageManager; import net.minecraft.client.resource.manager.ReloadableResourceManager; +import net.minecraft.client.resource.manager.ResourceReloadListener; import net.minecraft.client.resource.metadata.ResourceMetadataSerializerRegistry; +import net.minecraft.client.resource.model.ModelManager; import net.minecraft.client.resource.pack.BuiltInResourcePack; import net.minecraft.client.resource.pack.ResourcePack; +import net.minecraft.client.sound.system.SoundEngine; +import net.minecraft.client.sound.system.SoundManager; +import net.minecraft.client.world.color.FoliageColorReloader; +import net.minecraft.client.world.color.GrassColorReloader; +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; import net.ornithemc.osl.resource.loader.impl.adapter.ResourceManagerAdapter; import net.ornithemc.osl.resource.loader.impl.adapter.ResourcePackLists; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -27,6 +47,14 @@ @Mixin(Minecraft.class) public class MinecraftMixin { + private static final boolean SOUND_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("13w42a") >= 0; + private static final boolean TEXT_RENDERERS_ARE_RELOAD_LISTENERS = MinecraftVersion.resolve().compareTo("1.6.2") >= 0; + private static final boolean MODEL_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("14w10a") >= 0; + private static final boolean ITEM_RENDERER_IS_RELOAD_LISTENER = MinecraftVersion.resolve().compareTo("14w25a") >= 0; + private static final boolean GAME_RENDERER_IS_RELOAD_LISTENER = MinecraftVersion.resolve().compareTo("13w38a") >= 0; + private static final boolean BLOCK_RENDERER_IS_RELOAD_LISTENER = MinecraftVersion.resolve().compareTo("14w10c") >= 0; + private static final boolean WORLD_RENDERER_IS_RELOAD_LISTENER = MinecraftVersion.resolve().compareTo("14w25b") >= 0; + @Shadow @Final private ResourceMetadataSerializerRegistry resourceMetadataSerializerRegistry; @Shadow @Final @@ -36,6 +64,38 @@ public class MinecraftMixin { @Shadow private ReloadableResourceManager resourceManager; + @Shadow + private LanguageManager languageManager; + @Shadow + private TextureManager textureManager; + @Conditional(minecraftVersion = @Version("<13w42a")) + @Shadow + private SoundEngine f_52467463; + @Conditional(minecraftVersion = @Version(">=13w42a")) + @Shadow + private SoundManager soundManager; + @Conditional(minecraftVersion = @Version(">=1.6.2")) + @Shadow + private TextRenderer textRenderer; + @Conditional(minecraftVersion = @Version(">=1.6.2")) + @Shadow + private TextRenderer enchantingPhraseRenderer; + @Conditional(minecraftVersion = @Version(">=14w10a")) + @Shadow + private ModelManager modelManager; + @Conditional(minecraftVersion = @Version(">=14w25a")) + @Shadow + private ItemRenderer itemRenderer; + @Conditional(minecraftVersion = @Version(">=13w38a")) + @Shadow + private GameRenderer gameRenderer; + @Conditional(minecraftVersion = @Version(">=14w10c")) + @Shadow + private BlockRenderDispatcher blockRenderer; + @Conditional(minecraftVersion = @Version(">=14w25b")) + @Shadow + private WorldRenderer worldRenderer; + @Unique private SimpleReloadableResourceManager actualResourceManager; @@ -50,7 +110,7 @@ public class MinecraftMixin { ) private void osl$resource_loader$setResourceManager(CallbackInfo ci) { this.actualResourceManager = SimpleReloadableResourceManager.client(); - this.resourceManager = new ResourceManagerAdapter(this.resourceMetadataSerializerRegistry, this.actualResourceManager); + this.resourceManager = new ResourceManagerAdapter(this.resourceMetadataSerializerRegistry, this.actualResourceManager, this::identifyReloadListener); this.actualResourceManager.reset(); // this.actualResourceManager.addAll(this.packRepository.openSelectedPacks()); // handled by Vanilla @@ -84,4 +144,38 @@ public class MinecraftMixin { ResourcePackLists.fixSelection(selection, false); } + + private NamespacedIdentifier identifyReloadListener(ResourceReloadListener listener) { + if (listener == this.languageManager) { + return AssetsReloaders.LANGUAGE_MANAGER; + } else if (listener == this.textureManager) { + return AssetsReloaders.TEXTURE_MANAGER; + } else if (!SOUND_MANAGER_EXISTS && listener == this.f_52467463) { + return AssetsReloaders.SOUND_MANAGER; + } else if (SOUND_MANAGER_EXISTS && listener == this.soundManager) { + return AssetsReloaders.SOUND_MANAGER; + } else if (TEXT_RENDERERS_ARE_RELOAD_LISTENERS && listener == this.textRenderer) { + return AssetsReloaders.FONT_MANAGER; + } else if (TEXT_RENDERERS_ARE_RELOAD_LISTENERS && listener == this.enchantingPhraseRenderer) { + return AssetsReloaders.ENCHANTING_PHRASE_FONT_MANAGER; + } else if (listener instanceof GrassColorReloader) { + return AssetsReloaders.GRASS_COLORS; + } else if (listener instanceof FoliageColorReloader) { + return AssetsReloaders.FOLIAGE_COLORS; + } else if (MODEL_MANAGER_EXISTS && listener == this.modelManager) { + return AssetsReloaders.MODEL_MANAGER; + } else if (ITEM_RENDERER_IS_RELOAD_LISTENER && listener == this.itemRenderer) { + return AssetsReloaders.ITEM_RENDERER; + } else if (GAME_RENDERER_IS_RELOAD_LISTENER && listener == this.gameRenderer) { + return AssetsReloaders.GAME_RENDERER; + } else if (BLOCK_RENDERER_IS_RELOAD_LISTENER && listener == this.blockRenderer) { + return AssetsReloaders.BLOCK_RENDERER; + } else if (WORLD_RENDERER_IS_RELOAD_LISTENER && listener == this.worldRenderer) { + return AssetsReloaders.WORLD_RENDERER; + } else { + ResourceLoader.LOGGER.debug("Unknown resource reload listener {}/{}", listener.getClass().getSimpleName(), listener); + } + + return null; + } } diff --git a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..962c7abf --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,29 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier MODEL_MANAGER = vanilla("models"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + public static final NamespacedIdentifier SEARCH_REGISTRY = vanilla("search_registry"); + + 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.CLIENT_ASSETS, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java new file mode 100644 index 00000000..120a0362 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java @@ -0,0 +1,22 @@ +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 TAG_MANAGER = vanilla("tags"); + 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-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java index f65fc971..7f46efc7 100644 --- a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java +++ b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java @@ -19,14 +19,17 @@ import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; public class ResourceManagerAdapter implements net.minecraft.resource.manager.ReloadableResourceManager { private final SimpleReloadableResourceManager resourceManager; + private final ResourceReloaderIdentifier reloaderIdentifier; - public ResourceManagerAdapter(SimpleReloadableResourceManager resourceManager) { + public ResourceManagerAdapter(SimpleReloadableResourceManager resourceManager, ResourceReloaderIdentifier reloaderIdentifier) { this.resourceManager = resourceManager; + this.reloaderIdentifier = reloaderIdentifier; } @Override @@ -51,7 +54,14 @@ public Collection listResources(String directory, Predicate @Override public void addListener(net.minecraft.resource.manager.ResourceReloadListener listener) { - this.resourceManager.addReloadedReloader(new WrappedResourceReloadListener(listener)); + NamespacedIdentifier identifier = this.reloaderIdentifier.identify(listener); + ResourceReloader reloader = new WrappedResourceReloadListener(listener); + + if (identifier == null) { + this.resourceManager.addReloadedReloader(reloader); + } else { + this.resourceManager.registerReloadedReloader(identifier, reloader); + } } @Override diff --git a/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java new file mode 100644 index 00000000..496b5d2d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc17w43a-mc19w05a/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.impl.adapter; + +import net.minecraft.resource.manager.ResourceReloadListener; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +public interface ResourceReloaderIdentifier { + + NamespacedIdentifier identify(ResourceReloadListener reloader); + +} 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 fe086c99..04321aec 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 @@ -10,11 +10,32 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.FontManager; import net.minecraft.client.Minecraft; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.TextRenderer; +import net.minecraft.client.render.block.BlockRenderDispatcher; +import net.minecraft.client.render.entity.ItemRenderer; +import net.minecraft.client.render.texture.TextureManager; +import net.minecraft.client.render.world.WorldRenderer; +import net.minecraft.client.resource.language.LanguageManager; +import net.minecraft.client.resource.model.ModelManager; import net.minecraft.client.resource.pack.UnopenedResourcePack; +import net.minecraft.client.search.SearchRegistry; +import net.minecraft.client.sound.system.SoundManager; +import net.minecraft.client.world.color.FoliageColorReloader; +import net.minecraft.client.world.color.GrassColorReloader; import net.minecraft.resource.manager.ReloadableResourceManager; +import net.minecraft.resource.manager.ResourceReloadListener; import net.minecraft.resource.pack.repository.PackRepository; +import net.ornithemc.conditionalmixin.annotations.Conditional; +import net.ornithemc.conditionalmixin.annotations.Version; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; import net.ornithemc.osl.resource.loader.impl.adapter.ResourceManagerAdapter; import net.ornithemc.osl.resource.loader.impl.adapter.ResourcePackRepositoryAdapter; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -24,16 +45,47 @@ @Mixin(Minecraft.class) public class MinecraftMixin { + private static final boolean FONT_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("1.13-pre7") >= 0; + @Shadow @Final @Mutable private PackRepository packRepository; @Shadow private ReloadableResourceManager resourceManager; + @Shadow + private LanguageManager languageManager; + @Shadow + private TextureManager textureManager; + @Shadow + private SoundManager soundManager; + @Conditional(minecraftVersion = @Version("<1.13-pre7")) + @Shadow + private TextRenderer textRenderer; + @Conditional(minecraftVersion = @Version("<1.13-pre7")) + @Shadow + private TextRenderer f_77337277; + @Shadow + private ModelManager modelManager; + @Shadow + private ItemRenderer itemRenderer; + @Shadow + private GameRenderer gameRenderer; + @Shadow + private BlockRenderDispatcher blockRenderer; + @Shadow + private WorldRenderer worldRenderer; + @Shadow + private SearchRegistry searchRegistry; + @Unique private SimpleResourcePackRepository actualPackRepository; @Unique private SimpleReloadableResourceManager actualResourceManager; + @Conditional(minecraftVersion = @Version(">=1.13-pre7")) + @Shadow + private FontManager getFontManager() { return null; } + @Inject( method = "", at = @At( @@ -89,7 +141,7 @@ public class MinecraftMixin { ) private void osl$resource_loader$setResourceManager(CallbackInfo ci) { this.actualResourceManager = SimpleReloadableResourceManager.client(); - this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager); + this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager, this::identifyReloadListener); this.actualResourceManager.reset(); // this.actualResourceManager.addAll(this.actualPackRepository.openSelectedPacks()); // handled by Vanilla @@ -108,4 +160,40 @@ public class MinecraftMixin { // OSL reloaders are queued and reloaded at once this.actualResourceManager.partialReload(); } + + private NamespacedIdentifier identifyReloadListener(ResourceReloadListener listener) { + if (listener == this.languageManager) { + return AssetsReloaders.LANGUAGE_MANAGER; + } else if (listener == this.textureManager) { + return AssetsReloaders.TEXTURE_MANAGER; + } else if (listener == this.soundManager) { + return AssetsReloaders.SOUND_MANAGER; + } else if (!FONT_MANAGER_EXISTS && listener == this.textRenderer) { + return AssetsReloaders.FONT_MANAGER; + } else if (!FONT_MANAGER_EXISTS && listener == this.f_77337277) { + return AssetsReloaders.ENCHANTING_PHRASE_FONT_MANAGER; + } else if (FONT_MANAGER_EXISTS && listener == this.getFontManager()) { + return AssetsReloaders.FONT_MANAGER; + } else if (listener instanceof GrassColorReloader) { + return AssetsReloaders.GRASS_COLORS; + } else if (listener instanceof FoliageColorReloader) { + return AssetsReloaders.FOLIAGE_COLORS; + } else if (listener == this.modelManager) { + return AssetsReloaders.MODEL_MANAGER; + } else if (listener == this.itemRenderer) { + return AssetsReloaders.ITEM_RENDERER; + } else if (listener == this.gameRenderer) { + return AssetsReloaders.GAME_RENDERER; + } else if (listener == this.blockRenderer) { + return AssetsReloaders.BLOCK_RENDERER; + } else if (listener == this.worldRenderer) { + return AssetsReloaders.WORLD_RENDERER; + } else if (listener == this.searchRegistry) { + return AssetsReloaders.SEARCH_REGISTRY; + } else { + ResourceLoader.LOGGER.debug("Unknown resource reload listener {}/{}", listener.getClass().getSimpleName(), listener); + } + + return null; + } } 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 7bc4c9f9..376cb001 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 @@ -10,11 +10,22 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.crafting.CraftingManager; import net.minecraft.resource.manager.ReloadableResourceManager; +import net.minecraft.resource.manager.ResourceReloadListener; import net.minecraft.resource.pack.repository.PackRepository; import net.minecraft.resource.pack.repository.UnopenedPack; +import net.minecraft.server.AdvancementManager; +import net.minecraft.server.FunctionManager; import net.minecraft.server.MinecraftServer; +import net.minecraft.tag.TagManager; +import net.minecraft.world.gen.loot.LootTables; +import net.minecraft.world.gen.structure.template.StructureManager; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.impl.util.MinecraftVersion; +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.adapter.ResourceManagerAdapter; import net.ornithemc.osl.resource.loader.impl.adapter.ResourcePackRepositoryAdapter; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -24,11 +35,25 @@ @Mixin(MinecraftServer.class) public class MinecraftServerMixin { + private static final boolean TAG_MANAGER_EXISTS = MinecraftVersion.resolve().compareTo("17w49a") >= 0; + private static final boolean CRAFTING_MANAGER_IS_RELOAD_LISTENER = MinecraftVersion.resolve().compareTo("17w48a") >= 0; + @Shadow @Final @Mutable private PackRepository packRepository; @Shadow @Final @Mutable private ReloadableResourceManager resourceManager; + @Shadow + private TagManager tags; + @Shadow + private CraftingManager craftingManager; + @Shadow + private LootTables lootTables; + @Shadow + private FunctionManager functions; + @Shadow + private AdvancementManager advancements; + @Unique private SimpleResourcePackRepository actualPackRepository; @Unique @@ -62,7 +87,7 @@ public class MinecraftServerMixin { ) private void osl$resource_loader$setResourceManager(CallbackInfo ci) { this.actualResourceManager = SimpleReloadableResourceManager.server(); - this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager); + this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager, this::identifyReloadListener); this.actualResourceManager.reset(); // this.actualResourceManager.addAll(this.actualPackRepository.openSelectedPacks()); // handled by Vanilla @@ -105,4 +130,24 @@ public class MinecraftServerMixin { this.actualPackRepository.init(); // this.actualPackRepository.reload(); // handled by Vanilla } + + private NamespacedIdentifier identifyReloadListener(ResourceReloadListener listener) { + if (TAG_MANAGER_EXISTS && listener == this.tags) { + return DataReloaders.TAG_MANAGER; + } else if (CRAFTING_MANAGER_IS_RELOAD_LISTENER && listener == this.craftingManager) { + return DataReloaders.CRAFTING_MANAGER; + } else if (listener == this.lootTables) { + return DataReloaders.LOOT_TABLE_MANAGER; + } else if (listener == this.functions) { + return DataReloaders.FUNCTION_MANAGER; + } else if (listener == this.advancements) { + return DataReloaders.ADVANCEMENT_MANAGER; + } else if (listener instanceof StructureManager) { + return DataReloaders.STRUCTURE_MANAGER; + } else { + ResourceLoader.LOGGER.debug("Unknown resource reload listener {}/{}", listener.getClass().getSimpleName(), listener); + } + + return null; + } } diff --git a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..87b7a50a --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,34 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier SPLASH_MANAGER = vanilla("splashes"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier MODEL_MANAGER = vanilla("models"); + public static final NamespacedIdentifier VILLAGER_HATS = vanilla("villager_hats"); + public static final NamespacedIdentifier ZOMBIE_VILLAGER_HATS = vanilla("zombie_villager_hats"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + public static final NamespacedIdentifier SEARCH_REGISTRY = vanilla("search_registry"); + public static final NamespacedIdentifier PARTICLE_MANAGER = vanilla("particles"); + public static final NamespacedIdentifier PAINTING_MOTIVE_TEXTURES = vanilla("painting_textures"); + public static final NamespacedIdentifier STATUS_EFFECT_TEXTURES = vanilla("mob_effect_textures"); + + 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.CLIENT_ASSETS, identifier); + } +} diff --git a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java new file mode 100644 index 00000000..120a0362 --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/api/server/resource/reload/DataReloaders.java @@ -0,0 +1,22 @@ +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 TAG_MANAGER = vanilla("tags"); + 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-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java index 42a98213..95e9ea05 100644 --- a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceManagerAdapter.java @@ -29,9 +29,11 @@ public class ResourceManagerAdapter implements net.minecraft.resource.manager.ReloadableResourceManager { private final SimpleReloadableResourceManager resourceManager; + private final ResourceReloaderIdentifier reloaderIdentifier; - public ResourceManagerAdapter(SimpleReloadableResourceManager resourceManager) { + public ResourceManagerAdapter(SimpleReloadableResourceManager resourceManager, ResourceReloaderIdentifier reloaderIdentifier) { this.resourceManager = resourceManager; + this.reloaderIdentifier = reloaderIdentifier; } @Override @@ -66,7 +68,14 @@ public boolean m_12351820(Identifier location) { @Override public void addListener(net.minecraft.resource.manager.ResourceReloadListener listener) { - this.resourceManager.addReloader(new WrappedResourceReloadListener(listener)); + NamespacedIdentifier identifier = this.reloaderIdentifier.identify(listener); + ResourceReloader reloader = new WrappedResourceReloadListener(listener); + + if (identifier == null) { + this.resourceManager.addReloader(reloader); + } else { + this.resourceManager.registerReloader(identifier, reloader); + } } @Override diff --git a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java new file mode 100644 index 00000000..496b5d2d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/adapter/ResourceReloaderIdentifier.java @@ -0,0 +1,11 @@ +package net.ornithemc.osl.resource.loader.impl.adapter; + +import net.minecraft.resource.manager.ResourceReloadListener; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; + +public interface ResourceReloaderIdentifier { + + NamespacedIdentifier identify(ResourceReloadListener reloader); + +} 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 f11cbbd0..ec5a5b2e 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 @@ -10,11 +10,31 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.client.FontManager; import net.minecraft.client.Minecraft; +import net.minecraft.client.ParticleManager; +import net.minecraft.client.render.GameRenderer; +import net.minecraft.client.render.block.BlockRenderDispatcher; +import net.minecraft.client.render.entity.ItemRenderer; +import net.minecraft.client.render.texture.TextureManager; +import net.minecraft.client.render.world.WorldRenderer; +import net.minecraft.client.resource.language.LanguageManager; +import net.minecraft.client.resource.model.ModelManager; import net.minecraft.client.resource.pack.UnopenedResourcePack; +import net.minecraft.client.search.SearchRegistry; +import net.minecraft.client.sound.system.SoundManager; +import net.minecraft.client.world.color.FoliageColorReloader; +import net.minecraft.client.world.color.GrassColorReloader; import net.minecraft.resource.manager.ReloadableResourceManager; +import net.minecraft.resource.manager.ResourceReloadListener; import net.minecraft.resource.pack.repository.PackRepository; +import net.minecraft.unmapped.C_09408996; +import net.minecraft.unmapped.C_52526630; +import net.minecraft.unmapped.C_55117267; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; +import net.ornithemc.osl.resource.loader.impl.ResourceLoader; import net.ornithemc.osl.resource.loader.impl.adapter.ResourceManagerAdapter; import net.ornithemc.osl.resource.loader.impl.adapter.ResourcePackRepositoryAdapter; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -29,6 +49,35 @@ public class MinecraftMixin { @Shadow private ReloadableResourceManager resourceManager; + @Shadow + private LanguageManager languageManager; + @Shadow + private TextureManager textureManager; + @Shadow + private SoundManager soundManager; + @Shadow + private C_55117267 f_77560420; + @Shadow + private FontManager fontManager; + @Shadow + private ModelManager modelManager; + @Shadow + private ItemRenderer itemRenderer; + @Shadow + private GameRenderer gameRenderer; + @Shadow + private BlockRenderDispatcher blockRenderer; + @Shadow + private WorldRenderer worldRenderer; + @Shadow + private SearchRegistry searchRegistry; + @Shadow + private ParticleManager particleManager; + @Shadow + private C_52526630 f_86430456; + @Shadow + private C_09408996 f_03548195; + @Unique private SimpleResourcePackRepository actualPackRepository; @Unique @@ -89,7 +138,7 @@ public class MinecraftMixin { ) private void osl$resource_loader$setResourceManager(CallbackInfo ci) { this.actualResourceManager = SimpleReloadableResourceManager.client(); - this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager); + this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager, this::identifyReloadListener); this.actualResourceManager.reset(); // this.actualResourceManager.addAll(this.actualPackRepository.openSelectedPacks()); // handled by Vanilla @@ -106,4 +155,48 @@ public class MinecraftMixin { this.actualResourceManager.init(); // this.actualResourceManager.partialReload(); // handled by Vanilla } + + private NamespacedIdentifier identifyReloadListener(ResourceReloadListener listener) { + if (listener == this.languageManager) { + return AssetsReloaders.LANGUAGE_MANAGER; + } else if (listener == this.textureManager) { + return AssetsReloaders.TEXTURE_MANAGER; + } else if (listener == this.soundManager) { + return AssetsReloaders.SOUND_MANAGER; + } else if (listener == this.f_77560420) { + return AssetsReloaders.SPLASH_MANAGER; + } else if (listener == this.fontManager.m_81272309()) { + return AssetsReloaders.FONT_MANAGER; + } else if (listener instanceof GrassColorReloader) { + return AssetsReloaders.GRASS_COLORS; + } else if (listener instanceof FoliageColorReloader) { + return AssetsReloaders.FOLIAGE_COLORS; + } else if (listener == this.modelManager) { + return AssetsReloaders.MODEL_MANAGER; + } else if (listener instanceof VillagerProfessionLayerAccess && ((VillagerProfessionLayerAccess) listener).osl$resource_loader$getIdentifier().equals("villager")) { + return AssetsReloaders.VILLAGER_HATS; + } else if (listener instanceof VillagerProfessionLayerAccess && ((VillagerProfessionLayerAccess) listener).osl$resource_loader$getIdentifier().equals("zombie_villager")) { + return AssetsReloaders.ZOMBIE_VILLAGER_HATS; + } else if (listener == this.itemRenderer) { + return AssetsReloaders.ITEM_RENDERER; + } else if (listener == this.gameRenderer) { + return AssetsReloaders.GAME_RENDERER; + } else if (listener == this.blockRenderer) { + return AssetsReloaders.BLOCK_RENDERER; + } else if (listener == this.worldRenderer) { + return AssetsReloaders.WORLD_RENDERER; + } else if (listener == this.searchRegistry) { + return AssetsReloaders.SEARCH_REGISTRY; + } else if (listener == this.particleManager) { + return AssetsReloaders.PARTICLE_MANAGER; + } else if (listener == this.f_86430456) { + return AssetsReloaders.PAINTING_MOTIVE_TEXTURES; + } else if (listener == this.f_03548195) { + return AssetsReloaders.STATUS_EFFECT_TEXTURES; + } else { + ResourceLoader.LOGGER.debug("Unknown resource reload listener {}/{}", listener.getClass().getSimpleName(), listener); + } + + return null; + } } diff --git a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/VillagerProfessionLayerAccess.java b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/VillagerProfessionLayerAccess.java new file mode 100644 index 00000000..e72963ba --- /dev/null +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/VillagerProfessionLayerAccess.java @@ -0,0 +1,14 @@ +package net.ornithemc.osl.resource.loader.impl.mixin.client; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import net.minecraft.unmapped.C_70716992; + +@Mixin(C_70716992.class) +public interface VillagerProfessionLayerAccess { + + @Accessor("f_82523592") + String osl$resource_loader$getIdentifier(); + +} 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 7bc4c9f9..723f1cc3 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 @@ -10,11 +10,21 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.crafting.CraftingManager; import net.minecraft.resource.manager.ReloadableResourceManager; +import net.minecraft.resource.manager.ResourceReloadListener; import net.minecraft.resource.pack.repository.PackRepository; import net.minecraft.resource.pack.repository.UnopenedPack; +import net.minecraft.server.AdvancementManager; +import net.minecraft.server.FunctionManager; import net.minecraft.server.MinecraftServer; +import net.minecraft.tag.TagManager; +import net.minecraft.world.gen.loot.LootTables; +import net.minecraft.world.gen.structure.template.StructureManager; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +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.adapter.ResourceManagerAdapter; import net.ornithemc.osl.resource.loader.impl.adapter.ResourcePackRepositoryAdapter; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -29,6 +39,17 @@ public class MinecraftServerMixin { @Shadow @Final @Mutable private ReloadableResourceManager resourceManager; + @Shadow + private TagManager tags; + @Shadow + private CraftingManager craftingManager; + @Shadow + private LootTables lootTables; + @Shadow + private FunctionManager functions; + @Shadow + private AdvancementManager advancements; + @Unique private SimpleResourcePackRepository actualPackRepository; @Unique @@ -62,7 +83,7 @@ public class MinecraftServerMixin { ) private void osl$resource_loader$setResourceManager(CallbackInfo ci) { this.actualResourceManager = SimpleReloadableResourceManager.server(); - this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager); + this.resourceManager = new ResourceManagerAdapter(this.actualResourceManager, this::identifyReloadListener); this.actualResourceManager.reset(); // this.actualResourceManager.addAll(this.actualPackRepository.openSelectedPacks()); // handled by Vanilla @@ -105,4 +126,24 @@ public class MinecraftServerMixin { this.actualPackRepository.init(); // this.actualPackRepository.reload(); // handled by Vanilla } + + private NamespacedIdentifier identifyReloadListener(ResourceReloadListener listener) { + if (listener == this.tags) { + return DataReloaders.TAG_MANAGER; + } else if (listener == this.craftingManager) { + return DataReloaders.CRAFTING_MANAGER; + } else if (listener == this.lootTables) { + return DataReloaders.LOOT_TABLE_MANAGER; + } else if (listener == this.functions) { + return DataReloaders.FUNCTION_MANAGER; + } else if (listener == this.advancements) { + return DataReloaders.ADVANCEMENT_MANAGER; + } else if (listener instanceof StructureManager) { + return DataReloaders.STRUCTURE_MANAGER; + } else { + ResourceLoader.LOGGER.debug("Unknown resource reload listener {}/{}", listener.getClass().getSimpleName(), listener); + } + + return null; + } } diff --git a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/resources/osl.resource-loader.mixins.json b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/resources/osl.resource-loader.mixins.json index d516d571..8a4c3ce6 100644 --- a/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/resources/osl.resource-loader.mixins.json +++ b/libraries/resource-loader/resource-loader-mc19w07a-mc1.14.4/src/main/resources/osl.resource-loader.mixins.json @@ -9,7 +9,8 @@ ], "client": [ "client.MinecraftMixin", - "client.ResourcePacksMixin" + "client.ResourcePacksMixin", + "client.VillagerProfessionLayerAccess" ], "server": [ ], diff --git a/libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..d1cb926d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mca1.0.1_01-mca1.2.1_01/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,27 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + + 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.CLIENT_ASSETS, identifier); + } +} 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 875e81fd..cd815925 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 @@ -19,6 +19,7 @@ import net.ornithemc.osl.resource.loader.api.client.MinecraftExtension; import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; 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.impl.ClientResourcePacks; @@ -98,7 +99,7 @@ public class MinecraftMixin implements MinecraftExtension { this.reloadResources(); - this.resourceManager.addReloadedReloader((ResourceReloader) this.textureManager); + this.resourceManager.registerReloadedReloader(AssetsReloaders.TEXTURE_MANAGER, (ResourceReloader) this.textureManager); this.resourceManager.init(); // Vanilla reloaders are triggered when registered diff --git a/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java b/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java new file mode 100644 index 00000000..d1cb926d --- /dev/null +++ b/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/api/client/resource/reload/AssetsReloaders.java @@ -0,0 +1,27 @@ +package net.ornithemc.osl.resource.loader.api.client.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 AssetsReloaders { + + public static final NamespacedIdentifier LANGUAGE_MANAGER = vanilla("languages"); + public static final NamespacedIdentifier TEXTURE_MANAGER = vanilla("textures"); + public static final NamespacedIdentifier SOUND_MANAGER = vanilla("sounds"); + public static final NamespacedIdentifier FONT_MANAGER = vanilla("fonts"); + public static final NamespacedIdentifier ENCHANTING_PHRASE_FONT_MANAGER = vanilla("enchanting_phrase_fonts"); + public static final NamespacedIdentifier GRASS_COLORS = vanilla("grass_colors"); + public static final NamespacedIdentifier FOLIAGE_COLORS = vanilla("foliage_colors"); + public static final NamespacedIdentifier ITEM_RENDERER = vanilla("item_renderer"); + public static final NamespacedIdentifier GAME_RENDERER = vanilla("game_renderer"); + public static final NamespacedIdentifier BLOCK_RENDERER = vanilla("block_renderer"); + public static final NamespacedIdentifier WORLD_RENDERER = vanilla("level_renderer"); + + 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.CLIENT_ASSETS, identifier); + } +} 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/MinecraftMixin.java b/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java index b8389292..e01038d4 100644 --- a/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java +++ b/libraries/resource-loader/resource-loader-mca1.2.2-mc1.2.5/src/main/java/net/ornithemc/osl/resource/loader/impl/mixin/client/MinecraftMixin.java @@ -13,6 +13,7 @@ import net.minecraft.client.render.world.WorldRenderer; import net.ornithemc.osl.resource.loader.api.client.MinecraftExtension; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; import net.ornithemc.osl.resource.loader.impl.ResourceLoader; import net.ornithemc.osl.resource.loader.impl.resource.manager.SimpleReloadableResourceManager; @@ -59,7 +60,7 @@ public class MinecraftMixin implements MinecraftExtension { this.reloadResources(); - this.resourceManager.addReloadedReloader((ResourceReloader) this.textureManager); + this.resourceManager.registerReloadedReloader(AssetsReloaders.TEXTURE_MANAGER, (ResourceReloader) this.textureManager); this.resourceManager.init(); // Vanilla reloaders are triggered when registered diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/manager/ReloadableResourceManager.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/manager/ReloadableResourceManager.java index d3d7bd4f..cea7f381 100644 --- a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/manager/ReloadableResourceManager.java +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/api/resource/manager/ReloadableResourceManager.java @@ -4,6 +4,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.resource.loader.api.resource.pack.ResourcePack; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReload; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; @@ -16,10 +17,35 @@ public interface ReloadableResourceManager extends ResourceManager { /** * Adds a reloader to this resource manager that will be triggered on every resource reload. * - * @param reloader + * @param reloader the resource reloader to add. + * + * @deprecated use {@linkplain #registerReloader(NamespacedIdentifier, ResourceReloader)} instead. */ + @Deprecated void addReloader(ResourceReloader reloader); + /** + * Registers a reloader to this resource manager that will be triggered on every resource reload. + * + * @param identifier the namespaced ID of the reloader to be registered. + * @param reloader the resource reloader to be registered. + */ + void registerReloader(NamespacedIdentifier identifier, ResourceReloader reloader); + + /** + * Registers dependencies for a resource reloader, i.e. ensure a resource reloader will run after + * the other specified resource reloaders. Any resource reloaders without dependencies will run + * last, with no defined ordering between them. All Vanilla reloaders are given identifiers, and + * OSL provides markers for running reloaders before or after all Vanilla reloaders. + * + * @param identifier identifier of the resource reloader for which to register the dependencies. + * @param dependencies identifiers of the dependencies: the resource reloaders that must run first. + * + * @see net.ornithemc.osl.resource.loader.api.client.AssetsReloaders + * @see net.ornithemc.osl.resource.loader.api.server.DataReloaders + */ + void registerReloaderDependencies(NamespacedIdentifier identifier, NamespacedIdentifier... dependencies); + /** * Reload all resources, blocking the current thread until finished. */ diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/manager/SimpleReloadableResourceManager.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/manager/SimpleReloadableResourceManager.java index 6f32674e..81a6b722 100644 --- a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/manager/SimpleReloadableResourceManager.java +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/manager/SimpleReloadableResourceManager.java @@ -3,9 +3,11 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.EnumMap; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; @@ -19,6 +21,7 @@ import net.ornithemc.osl.core.api.util.NamespacedIdentifier; import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; import net.ornithemc.osl.core.api.util.Unit; +import net.ornithemc.osl.core.api.util.sort.TopoSort; import net.ornithemc.osl.resource.loader.api.client.ClientResourceLoaderEvents; import net.ornithemc.osl.resource.loader.api.resource.Resource; import net.ornithemc.osl.resource.loader.api.resource.ResourceType; @@ -30,6 +33,9 @@ import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; import net.ornithemc.osl.resource.loader.api.server.ServerResourceLoaderEvents; import net.ornithemc.osl.resource.loader.impl.ResourceLoader; +import net.ornithemc.osl.resource.loader.impl.resource.reload.IdentifiableResourceReloader; +import net.ornithemc.osl.resource.loader.impl.resource.reload.NoOpResourceReloader; +import net.ornithemc.osl.resource.loader.impl.resource.reload.ResourceReloaders; import net.ornithemc.osl.resource.loader.impl.resource.reload.SimpleResourceReloadContext; public class SimpleReloadableResourceManager implements ReloadableResourceManager { @@ -51,14 +57,20 @@ public static SimpleReloadableResourceManager server() { private final ResourceType type; private final List registeredReloaders; private final List recentlyRegisteredReloaders; + private final Map identifiableReloaders; + private final Map> reloaderDependencies; private final List resourcePacks; private final Map resourceManagers; private final LegacyResourceManager legacyResourceManager; + private NamespacedIdentifier lastVanillaReloader; + public SimpleReloadableResourceManager(ResourceType type) { this.type = type; this.registeredReloaders = new ArrayList<>(); this.recentlyRegisteredReloaders = new ArrayList<>(); + this.identifiableReloaders = new HashMap<>(); + this.reloaderDependencies = new HashMap<>(); this.resourcePacks = new ArrayList<>(); this.resourceManagers = new HashMap<>(); this.legacyResourceManager = new LegacyResourceManager(); @@ -70,14 +82,24 @@ public void init() { } else if (this.type == ResourceType.SERVER_DATA) { ServerResourceLoaderEvents.INIT_RESOURCE_MANAGER.invoker().accept(this); } + + this.registerReloaderDependencies(ResourceReloaders.AFTER_VANILLA, this.lastVanillaReloader); } public void reset() { this.registeredReloaders.clear(); this.recentlyRegisteredReloaders.clear(); + this.identifiableReloaders.clear(); + this.reloaderDependencies.clear(); this.resourcePacks.clear(); this.resourceManagers.clear(); this.legacyResourceManager.clear(); + + this.registerReloader(ResourceReloaders.BEFORE_VANILLA, NoOpResourceReloader.INSTANCE); + this.registerReloader(ResourceReloaders.AFTER_VANILLA, NoOpResourceReloader.INSTANCE); + this.registerReloaderDependencies(ResourceReloaders.AFTER_VANILLA, ResourceReloaders.BEFORE_VANILLA); + + this.lastVanillaReloader = ResourceReloaders.BEFORE_VANILLA; } public void addAll(Iterable packs) { @@ -181,15 +203,53 @@ public Map> findResourceStacks(String names } @Override + @Deprecated public void addReloader(ResourceReloader reloader) { this.registeredReloaders.add(reloader); this.recentlyRegisteredReloaders.add(reloader); } + @Deprecated public void addReloadedReloader(ResourceReloader reloader) { this.registeredReloaders.add(reloader); } + @Override + public void registerReloader(NamespacedIdentifier identifier, ResourceReloader reloader) { + this.registerIdentifiableReloader(identifier, reloader, false); + } + + public void registerReloadedReloader(NamespacedIdentifier identifier, ResourceReloader reloader) { + this.registerIdentifiableReloader(identifier, reloader, true); + } + + private void registerIdentifiableReloader(NamespacedIdentifier identifier, ResourceReloader reloader, boolean reloaded) { + if (this.identifiableReloaders.containsKey(identifier)) { + throw new IllegalArgumentException("Duplicate resource reloader " + identifier); + } + + reloader = new IdentifiableResourceReloader(identifier, reloader); + + this.identifiableReloaders.put(identifier, reloader); + this.registeredReloaders.add(reloader); + if (!reloaded) { + this.recentlyRegisteredReloaders.add(reloader); + } + + if (ResourceReloaders.isVanilla(this.type, identifier)) { + this.registerReloaderDependencies(identifier, this.lastVanillaReloader); + } + } + + @Override + public void registerReloaderDependencies(NamespacedIdentifier identifier, NamespacedIdentifier... dependencies) { + this.reloaderDependencies.computeIfAbsent(identifier, key -> new HashSet<>()).addAll(Arrays.asList(dependencies)); + + if (ResourceReloaders.isVanilla(this.type, identifier)) { + this.lastVanillaReloader = identifier; + } + } + @Override public void reload(List packs) { ResourceReload reload = this.startReload(packs, Runnable::run, Runnable::run, CompletableFuture.completedFuture(Unit.INSTANCE)); @@ -227,7 +287,7 @@ public ResourceReload startPartialReload(Executor backgroundExecutor, Executor m } private ResourceReload startReload(Executor backgroundExecutor, Executor mainThreadExecutor, CompletableFuture initialTask, List reloaders) { - reloaders = new ArrayList<>(reloaders); + reloaders = this.sortReloaders(reloaders); this.recentlyRegisteredReloaders.clear(); ResourceReloadContext context = new SimpleResourceReloadContext(this.resourcePacks, reloaders); @@ -248,4 +308,30 @@ private ResourceReload startReload(Executor backgroundExecutor, Executor mainThr } }); } + + private List sortReloaders(List reloaders) { + List unidentifiedReloaders = new ArrayList<>(); + Set reloaderIdentifiers = new HashSet<>(); + + reloaderIdentifiers.add(ResourceReloaders.BEFORE_VANILLA); + reloaderIdentifiers.add(ResourceReloaders.AFTER_VANILLA); + + for (ResourceReloader reloader : reloaders) { + if (reloader instanceof IdentifiableResourceReloader) { + IdentifiableResourceReloader identifiableReloader = (IdentifiableResourceReloader) reloader; + NamespacedIdentifier identifier = identifiableReloader.getIdentifier(); + + reloaderIdentifiers.add(identifier); + } else { + unidentifiedReloaders.add(reloader); + } + } + + List sorted = TopoSort.sort(reloaderIdentifiers, this.reloaderDependencies); + + reloaders = sorted.stream().map(this.identifiableReloaders::get).collect(Collectors.toCollection(ArrayList::new)); + reloaders.addAll(unidentifiedReloaders); + + return reloaders; + } } diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/IdentifiableResourceReloader.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/IdentifiableResourceReloader.java new file mode 100644 index 00000000..f800a930 --- /dev/null +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/IdentifiableResourceReloader.java @@ -0,0 +1,38 @@ +package net.ornithemc.osl.resource.loader.impl.resource.reload; + +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Executor; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.resource.loader.api.resource.reload.ReloadStep; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloader; + +public final class IdentifiableResourceReloader implements ResourceReloader { + + private final NamespacedIdentifier identifier; + private final ResourceReloader reloader; + + public IdentifiableResourceReloader(NamespacedIdentifier identifier, ResourceReloader reloader) { + this.identifier = identifier; + this.reloader = reloader; + } + + public NamespacedIdentifier getIdentifier() { + return this.identifier; + } + + @Override + public String getName() { + return this.identifier.toString(); + } + + @Override + public void prepareSharedState(SharedState state) { + this.reloader.prepareSharedState(state); + } + + @Override + public CompletableFuture reloadResources(SharedState state, ReloadStep previousStep, Executor reloadExecutor, Executor applyExecutor) { + return this.reloader.reloadResources(state, previousStep, reloadExecutor, applyExecutor); + } +} diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/NoOpResourceReloader.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/NoOpResourceReloader.java new file mode 100644 index 00000000..f906c12c --- /dev/null +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/NoOpResourceReloader.java @@ -0,0 +1,13 @@ +package net.ornithemc.osl.resource.loader.impl.resource.reload; + +import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; +import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; + +public enum NoOpResourceReloader implements ResourceReloadListener { + + INSTANCE; + + @Override + public void resourcesReloaded(ResourceManager manager) { + } +} diff --git a/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/ResourceReloaders.java b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/ResourceReloaders.java new file mode 100644 index 00000000..9dc67add --- /dev/null +++ b/libraries/resource-loader/src/main/java/net/ornithemc/osl/resource/loader/impl/resource/reload/ResourceReloaders.java @@ -0,0 +1,33 @@ +package net.ornithemc.osl.resource.loader.impl.resource.reload; + +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import net.ornithemc.osl.core.api.util.NamespacedIdentifier; +import net.ornithemc.osl.core.api.util.NamespacedIdentifiers; +import net.ornithemc.osl.resource.loader.api.resource.ResourceType; + +public final class ResourceReloaders { + + public static final NamespacedIdentifier BEFORE_VANILLA = osl("before_vanilla"); + public static final NamespacedIdentifier AFTER_VANILLA = osl("after_vanilla"); + + private static final Map> VANILLA = new EnumMap<>(ResourceType.class); + + public static NamespacedIdentifier vanilla(ResourceType type, String identifier) { + NamespacedIdentifier id = NamespacedIdentifiers.from(identifier); + VANILLA.computeIfAbsent(type, key -> new HashSet<>()).add(id); + return id; + } + + public static NamespacedIdentifier osl(String identifier) { + return NamespacedIdentifiers.from("osl", identifier); + } + + public static boolean isVanilla(ResourceType type, NamespacedIdentifier identifier) { + return VANILLA.getOrDefault(type, Collections.emptySet()).contains(identifier); + } +} From b0fca67df178aaad0685814e23c82613699a8312 Mon Sep 17 00:00:00 2001 From: Space Walker Date: Mon, 28 Sep 2026 20:13:41 +0200 Subject: [PATCH 3/3] [localization] update language reloaders --- .../net/ornithemc/osl/localization/impl/LanguageReloader.java | 3 ++- .../net/ornithemc/osl/localization/impl/LanguageReloader.java | 3 ++- .../net/ornithemc/osl/localization/impl/LanguageReloader.java | 3 ++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/libraries/localization/localization-mc11w49a-mc1.5.2/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java b/libraries/localization/localization-mc11w49a-mc1.5.2/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java index 3832d392..d8ba66ad 100644 --- a/libraries/localization/localization-mc11w49a-mc1.5.2/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java +++ b/libraries/localization/localization-mc11w49a-mc1.5.2/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java @@ -1,6 +1,7 @@ package net.ornithemc.osl.localization.impl; import net.ornithemc.osl.resource.loader.api.client.ClientResourceLoaderEvents; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; @@ -8,7 +9,7 @@ public class LanguageReloader implements ResourceReloadListener { public static void init() { ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> { - resourceManager.addReloader(new LanguageReloader()); + resourceManager.registerReloader(AssetsReloaders.LANGUAGE_MANAGER, new LanguageReloader()); }); ClientResourceLoaderEvents.START_RESOURCE_RELOAD.register((resourceManager, context) -> { Localization.getLanguageManager().reload(context.resourcePacks()); diff --git a/libraries/localization/localization-mca1.0.1_01-mca1.2.6/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java b/libraries/localization/localization-mca1.0.1_01-mca1.2.6/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java index 3832d392..d8ba66ad 100644 --- a/libraries/localization/localization-mca1.0.1_01-mca1.2.6/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java +++ b/libraries/localization/localization-mca1.0.1_01-mca1.2.6/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java @@ -1,6 +1,7 @@ package net.ornithemc.osl.localization.impl; import net.ornithemc.osl.resource.loader.api.client.ClientResourceLoaderEvents; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; @@ -8,7 +9,7 @@ public class LanguageReloader implements ResourceReloadListener { public static void init() { ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> { - resourceManager.addReloader(new LanguageReloader()); + resourceManager.registerReloader(AssetsReloaders.LANGUAGE_MANAGER, new LanguageReloader()); }); ClientResourceLoaderEvents.START_RESOURCE_RELOAD.register((resourceManager, context) -> { Localization.getLanguageManager().reload(context.resourcePacks()); diff --git a/libraries/localization/localization-mcb1.0-mc11w48a/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java b/libraries/localization/localization-mcb1.0-mc11w48a/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java index 3832d392..d8ba66ad 100644 --- a/libraries/localization/localization-mcb1.0-mc11w48a/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java +++ b/libraries/localization/localization-mcb1.0-mc11w48a/src/main/java/net/ornithemc/osl/localization/impl/LanguageReloader.java @@ -1,6 +1,7 @@ package net.ornithemc.osl.localization.impl; import net.ornithemc.osl.resource.loader.api.client.ClientResourceLoaderEvents; +import net.ornithemc.osl.resource.loader.api.client.resource.reload.AssetsReloaders; import net.ornithemc.osl.resource.loader.api.resource.manager.ResourceManager; import net.ornithemc.osl.resource.loader.api.resource.reload.ResourceReloadListener; @@ -8,7 +9,7 @@ public class LanguageReloader implements ResourceReloadListener { public static void init() { ClientResourceLoaderEvents.INIT_RESOURCE_MANAGER.register(resourceManager -> { - resourceManager.addReloader(new LanguageReloader()); + resourceManager.registerReloader(AssetsReloaders.LANGUAGE_MANAGER, new LanguageReloader()); }); ClientResourceLoaderEvents.START_RESOURCE_RELOAD.register((resourceManager, context) -> { Localization.getLanguageManager().reload(context.resourcePacks());