diff --git a/library/core/resource_loader/DISABLE b/library/core/resource_loader/DISABLE deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/GroupPack.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/GroupPack.java index 2505cc4b36..dd660812df 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/GroupPack.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/GroupPack.java @@ -33,7 +33,9 @@ import net.minecraft.resource.ResourceIoSupplier; import net.minecraft.resource.ResourceType; +import net.minecraft.resource.pack.CompositeResourcePack; import net.minecraft.resource.pack.PackLocationInfo; +import net.minecraft.resource.pack.PackProfile; import net.minecraft.resource.pack.ResourcePack; import net.minecraft.resource.pack.metadata.ResourceMetadataSectionReader; import net.minecraft.text.Text; @@ -53,7 +55,6 @@ public abstract class GroupPack implements ResourcePack { protected final ResourceType type; protected final List packs; protected final Map> namespacedPacks = new Object2ObjectOpenHashMap<>(); - private boolean builtin; public GroupPack(@NotNull ResourceType type, @NotNull List packs) { this.type = type; @@ -150,6 +151,8 @@ public void close() { this.packs.forEach(ResourcePack::close); } + public abstract PackProfile.PackFactory wrapToFactory(); + /** * Represents a group resource pack which wraps a "base" resource pack. */ @@ -213,5 +216,39 @@ public String getName() { return this.getName() + " (" + this.packs.stream().filter(pack -> pack != this.basePack) .map(ResourcePack::getName).collect(Collectors.joining(", ")) + ")"; } + + @Override + public @NotNull ResourcePack createOverlay(String overlay) { + return new Wrapped( + this.type, + this.basePack.createOverlay(overlay), + this.packs.stream().map(pack -> pack.createOverlay(overlay)).toList(), + false + ); + } + + @Override + public PackProfile.PackFactory wrapToFactory() { + return new PackProfile.PackFactory() { + @Override + public ResourcePack openPrimary(PackLocationInfo locationInfo) { + return Wrapped.this; + } + + @Override + public ResourcePack open(PackLocationInfo locationInfo, PackProfile.Metadata metadata) { + if (metadata.overlays().isEmpty()) { + return Wrapped.this; + } + + List overlays = metadata.overlays() + .stream() + .map(Wrapped.this::createOverlay) + .toList(); + + return new CompositeResourcePack(Wrapped.this, overlays); + } + }; + } } } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/InMemoryPack.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/InMemoryPack.java index 2ac52a80d7..80cce8f622 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/InMemoryPack.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/InMemoryPack.java @@ -47,6 +47,7 @@ import net.minecraft.resource.ResourceIoSupplier; import net.minecraft.resource.ResourceType; import net.minecraft.resource.pack.PackLocationInfo; +import net.minecraft.resource.pack.PackSource; import net.minecraft.resource.pack.ResourcePack; import net.minecraft.resource.pack.metadata.ResourceMetadataSectionReader; import net.minecraft.text.Text; @@ -62,6 +63,7 @@ *

* The resources of this pack are stored in memory instead of it being on-disk. */ +// TODO: Add API for overlays public abstract class InMemoryPack implements MutablePack { private static final Logger LOGGER = LogUtils.getLogger(); private static final ExecutorService EXECUTOR_SERVICE; @@ -72,6 +74,8 @@ public abstract class InMemoryPack implements MutablePack { private final Map> data = new ConcurrentHashMap<>(); private final Map> root = new ConcurrentHashMap<>(); + private final Map overlays = new ConcurrentHashMap<>(); + @Override public @Nullable ResourceIoSupplier openRoot(String... path) { String actualPath = String.join("/", path); @@ -204,6 +208,11 @@ public void putResource(@NotNull ResourceType type, @NotNull Identifier id, @Not return future; } + @Override + public void putOverlay(@NotNull String overlay, ResourcePack pack) { + this.overlays.put(overlay, pack); + } + @Override public void clearResources(ResourceType type) { this.getResourceMap(type).clear(); @@ -212,6 +221,7 @@ public void clearResources(ResourceType type) { @Override public void clearResources() { this.root.clear(); + this.overlays.clear(); this.clearResources(ResourceType.CLIENT_RESOURCES); this.clearResources(ResourceType.SERVER_DATA); } @@ -230,6 +240,14 @@ public void dumpTo(@NotNull Path path) { this.dumpResource(path, QuiltPack.getResourcePath(ResourceType.CLIENT_RESOURCES, p), resource.get())); this.data.forEach((p, resource) -> this.dumpResource(path, QuiltPack.getResourcePath(ResourceType.SERVER_DATA, p), resource.get())); + this.overlays.forEach((overlay, pack) -> { + if (pack instanceof InMemoryPack imp) { + imp.dumpTo(path.resolve(overlay)); + return; + } + + LOGGER.info("Unable to dump overlay {} ({}) from In Memory Pack {}", overlay, pack.getName(), this.getName()); + }); } catch (IOException e) { LOGGER.error("Failed to write resource pack dump from pack {} to {}.", this.getName(), path, e); } @@ -275,6 +293,10 @@ private Map> getResourceMap(ResourceType type) { ); } + protected PackSource getSource() { + return PackSource.PACK_SOURCE_BUILTIN; + } + /** * Represents an in-memory resource pack with a static name. */ @@ -290,7 +312,7 @@ public PackLocationInfo getLocationInfo() { return new PackLocationInfo( this.name, Text.literal(this.name), - null, + this.getSource(), Optional.empty() ); } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/MutablePack.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/MutablePack.java index 5a7aee3ef9..968f05f2d0 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/MutablePack.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/MutablePack.java @@ -19,6 +19,7 @@ import java.io.IOException; import java.nio.charset.StandardCharsets; import java.util.concurrent.Future; +import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; @@ -108,7 +109,7 @@ public interface MutablePack extends ResourcePack { * @see #putResource(ResourceType, Identifier, Supplier) */ @NotNull Future putResourceAsync(@NotNull ResourceType type, @NotNull Identifier id, - @NotNull Function<@NotNull Identifier, byte @NotNull []> resourceFactory); + @NotNull Function<@NotNull Identifier, byte @NotNull []> resourceFactory); /** * Puts a text resource into the resource pack's root. @@ -180,7 +181,7 @@ default void putText(@NotNull ResourceType type, @NotNull Identifier id, @NotNul * @see #putResourceAsync(ResourceType, Identifier, Function) */ default @NotNull Future putTextAsync(@NotNull ResourceType type, @NotNull Identifier id, - @NotNull Function<@NotNull Identifier, @NotNull String> textFactory) { + @NotNull Function<@NotNull Identifier, @NotNull String> textFactory) { return this.putResourceAsync(type, id, textFactory.andThen(text -> text.getBytes(StandardCharsets.UTF_8))); } @@ -293,6 +294,14 @@ default void putImage(Identifier id, Supplier imageSupplier) { })); } + /** + * Adds a pack overlay to the mutable pack. + * + * @param overlay the overlay name + * @param pack the pack + */ + void putOverlay(@NotNull String overlay, ResourcePack pack); + /** * Clears the resource of a specific resource type. * diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/QuiltPack.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/QuiltPack.java index e4eadf419d..e3e6ac74f5 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/QuiltPack.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/QuiltPack.java @@ -51,6 +51,15 @@ public interface QuiltPack { return PackActivationType.NORMAL; } + /** + * Creates the specified overlay for the pack. + * + * @return the activation type of this resource pack + */ + default @NotNull ResourcePack createOverlay(String overlay) { + return (ResourcePack) this; + } + /** * {@return the path inside a resource pack of the given resource path} * diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/reloader/ResourceReloaderKeys.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/reloader/ResourceReloaderKeys.java index ac1741d450..b0d1777838 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/reloader/ResourceReloaderKeys.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/api/reloader/ResourceReloaderKeys.java @@ -32,7 +32,7 @@ public final class ResourceReloaderKeys { * * @see org.quiltmc.qsl.resource.loader.api.ResourceLoader#addReloaderOrdering(Identifier, Identifier) */ - public static final Identifier BEFORE_VANILLA = new Identifier("quilt", "before_vanilla"); + public static final Identifier BEFORE_VANILLA = Identifier.of("quilt", "before_vanilla"); /** * Represents the application phase after Vanilla resource reloaders are invoked. *

@@ -40,7 +40,7 @@ public final class ResourceReloaderKeys { * * @see org.quiltmc.qsl.resource.loader.api.ResourceLoader#addReloaderOrdering(Identifier, Identifier) */ - public static final Identifier AFTER_VANILLA = new Identifier("quilt", "after_vanilla"); + public static final Identifier AFTER_VANILLA = Identifier.of("quilt", "after_vanilla"); /** * Keys for various client resource reloaders. @@ -87,6 +87,6 @@ private ResourceReloaderKeys() { } private static Identifier id(String path) { - return new Identifier(Identifier.DEFAULT_NAMESPACE, path); + return Identifier.ofDefault(path); } } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModNioPack.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModNioPack.java index b709173393..b8e9959479 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModNioPack.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModNioPack.java @@ -201,6 +201,19 @@ public void close() { } } + @Override + public @NotNull ResourcePack createOverlay(String overlay) { + return new ModNioPack( + this.name, + this.modInfo, + this.displayName, + this.activationType, + this.io.basePath.resolve(overlay), + this.type, + this.closer + ); + } + //region metadata @Override public String getName() { diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModPackUtil.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModPackUtil.java index 9de403ca9d..c79be8b8fe 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModPackUtil.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ModPackUtil.java @@ -33,10 +33,8 @@ import net.minecraft.resource.pack.DataPackSettings; import net.minecraft.resource.pack.PackProfile; import net.minecraft.resource.pack.ResourcePack; -import net.minecraft.unmapped.C_yzksgymh; import org.quiltmc.loader.api.ModMetadata; -import org.quiltmc.qsl.resource.loader.api.QuiltPackProfile; @ApiStatus.Internal public final class ModPackUtil { @@ -99,30 +97,4 @@ public static DataPackSettings createDefaultDataPackSettings(DataPackSettings so return new DataPackSettings(enabled, disabled); } - - public static PackProfile makeBuiltinPackProfile(ModNioPack pack, PackProfile.Metadata info) { - return PackProfile.of( - pack.getLocationInfo(), - QuiltPackProfile.wrapToFactory(pack), - ResourceType.CLIENT_RESOURCES, - new C_yzksgymh( - true, - PackProfile.InsertionPosition.TOP, - false - ) - ); - } - - static @Nullable PackProfile makeBuiltinPackProfile(ModNioPack pack) { - // I think the resource version really shouldn't matter here, but we'll go for the latest asset version just in case - PackProfile.Metadata info = PackProfile.loadMetadata(pack.getLocationInfo(), QuiltPackProfile.wrapToFactory(pack), - SharedConstants.getGameVersion().getResourceVersion(ResourceType.CLIENT_RESOURCES)); - - if (info == null) { - LOGGER.warn("Couldn't find pack meta for pack {}.", pack.getName()); - return null; - } - - return makeBuiltinPackProfile(pack, info); - } } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/QuiltBuiltinPackProfile.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/QuiltBuiltinPackProfile.java index ff04d31b17..26a80a45d0 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/QuiltBuiltinPackProfile.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/QuiltBuiltinPackProfile.java @@ -23,12 +23,12 @@ import org.slf4j.Logger; import net.minecraft.SharedConstants; +import net.minecraft.resource.PackPosition; import net.minecraft.resource.pack.PackCompatibility; import net.minecraft.resource.pack.PackProfile; import net.minecraft.resource.pack.PackSource; import net.minecraft.resource.pack.ResourcePack; import net.minecraft.text.Text; -import net.minecraft.unmapped.C_yzksgymh; import net.minecraft.util.Formatting; import org.quiltmc.qsl.resource.loader.api.QuiltPackProfile; @@ -56,7 +56,7 @@ private QuiltBuiltinPackProfile(ModNioPack pack, Metadata info) { pack.getLocationInfo(), QuiltPackProfile.wrapToFactory(pack), info, - new C_yzksgymh( + new PackPosition( true, PackProfile.InsertionPosition.TOP, false diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ResourceLoaderImpl.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ResourceLoaderImpl.java index 98436bf695..0718b732cc 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ResourceLoaderImpl.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/impl/ResourceLoaderImpl.java @@ -258,7 +258,7 @@ private void sort(List reloaders) { if (currentReloader instanceof IdentifiableResourceReloader identifiable) { id = identifiable.getQuiltId(); } else { - id = new Identifier("unknown", + id = Identifier.of("unknown", "private/" + currentReloader.getClass().getName() .replace(".", "/") @@ -488,7 +488,7 @@ public static void registerBuiltinPacks(ResourceType type, Consumer // Add the built-in pack only if namespaces for the specified resource type are present. if (!pack.getNamespaces(type).isEmpty()) { // Make the resource pack profile for built-in pack, should never be always enabled. - var profile = ModPackUtil.makeBuiltinPackProfile(pack); + var profile = QuiltBuiltinPackProfile.of(pack); if (profile != null) { profileAdder.accept(profile); @@ -511,7 +511,7 @@ public static void appendLanguageEntries(@NotNull Map map) { try (var manager = new MultiPackResourceManager(ResourceType.CLIENT_RESOURCES, List.of(pack))) { for (var namespace : manager.getAllNamespaces()) { - var langId = new Identifier(namespace, "lang/" + Language.DEFAULT_LANGUAGE + ".json"); + var langId = Identifier.of(namespace, "lang/" + Language.DEFAULT_LANGUAGE + ".json"); for (var resource : manager.getAllResources(langId)) { try (var stream = resource.open()) { diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/BuiltinPackProvider$WrapToFactory$PackFactoryMixin.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/BuiltinPackProvider$WrapToFactory$PackFactoryMixin.java new file mode 100644 index 0000000000..01ee042f6c --- /dev/null +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/BuiltinPackProvider$WrapToFactory$PackFactoryMixin.java @@ -0,0 +1,50 @@ +/* + * Copyright 2024 The Quilt Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.quiltmc.qsl.resource.loader.mixin; + +import java.util.List; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import net.minecraft.resource.pack.CompositeResourcePack; +import net.minecraft.resource.pack.PackLocationInfo; +import net.minecraft.resource.pack.PackProfile; +import net.minecraft.resource.pack.ResourcePack; + +@Mixin(targets = {"net/minecraft/resource/pack/BuiltinPackProvider$C_oniaunfd"}) +public class BuiltinPackProvider$WrapToFactory$PackFactoryMixin { + @Shadow + ResourcePack resourcePack; + + @Inject(method = "open", at = @At("RETURN"), cancellable = true) + private void onRegisterAdditionalPacks(PackLocationInfo locationInfo, PackProfile.Metadata metadata, CallbackInfoReturnable ci) { + if (metadata.overlays().isEmpty()) { + return; + } + + List overlays = metadata.overlays() + .stream() + .map(this.resourcePack::createOverlay) + .toList(); + + ci.setReturnValue(new CompositeResourcePack(this.resourcePack, overlays)); + } +} diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/KeyedResourceReloaderMixin.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/KeyedResourceReloaderMixin.java index f0ed3b3040..468eaf340f 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/KeyedResourceReloaderMixin.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/KeyedResourceReloaderMixin.java @@ -55,7 +55,7 @@ public abstract class KeyedResourceReloaderMixin implements IdentifiableResource } else if (self instanceof TagManagerLoader) { this.quilt$id = ResourceReloaderKeys.Server.TAGS; } else { - this.quilt$id = new Identifier("private/" + self.getClass().getSimpleName().toLowerCase(Locale.ROOT)); + this.quilt$id = Identifier.ofDefault("private/" + self.getClass().getSimpleName().toLowerCase(Locale.ROOT)); } } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/PackProfileMixin.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/PackProfileMixin.java index 74ac133ebb..acb8a1f287 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/PackProfileMixin.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/PackProfileMixin.java @@ -23,11 +23,9 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import net.minecraft.resource.PackPosition; import net.minecraft.resource.pack.PackLocationInfo; import net.minecraft.resource.pack.PackProfile; -import net.minecraft.resource.pack.PackSource; -import net.minecraft.text.Text; -import net.minecraft.unmapped.C_yzksgymh; import org.quiltmc.qsl.resource.loader.api.QuiltPackProfile; import org.quiltmc.qsl.resource.loader.api.PackActivationType; @@ -38,7 +36,7 @@ public class PackProfileMixin implements QuiltPackProfile { private PackActivationType quilt$activationType; @Inject(method = "", at = @At("RETURN")) - private void quilt$onInit(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, PackProfile.Metadata info, C_yzksgymh c_yzksgymh, CallbackInfo ci) { + private void quilt$onInit(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, PackProfile.Metadata info, PackPosition position, CallbackInfo ci) { try (var pack = packFactory.open(locationInfo, info)) { this.quilt$activationType = pack.getActivationType(); } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/VanillaDataPackProviderMixin.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/VanillaDataPackProviderMixin.java index 3cc2f18463..88ebc98b37 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/VanillaDataPackProviderMixin.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/VanillaDataPackProviderMixin.java @@ -22,19 +22,14 @@ import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.ModifyArg; +import net.minecraft.resource.PackPosition; import net.minecraft.resource.ResourceType; import net.minecraft.resource.pack.PackLocationInfo; import net.minecraft.resource.pack.PackProfile; -import net.minecraft.resource.pack.PackSource; -import net.minecraft.resource.pack.ResourcePack; import net.minecraft.resource.pack.VanillaDataPackProvider; -import net.minecraft.text.Text; -import net.minecraft.unmapped.C_yzksgymh; import net.minecraft.util.Identifier; -import org.quiltmc.qsl.resource.loader.api.QuiltPackProfile; import org.quiltmc.qsl.resource.loader.impl.ResourceLoaderImpl; @Mixin(VanillaDataPackProvider.class) @@ -43,30 +38,37 @@ public class VanillaDataPackProviderMixin { @Final private static Identifier DATA_PACKS_DIR; - @ModifyArg( - method = "createBuiltinPackProfile(Lnet/minecraft/resource/pack/ResourcePack;)Lnet/minecraft/resource/pack/PackProfile;", + @WrapOperation( + method = "createVanillaPackProfile", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/resource/pack/VanillaDataPackProvider;wrapToFactory(Lnet/minecraft/resource/pack/ResourcePack;)Lnet/minecraft/resource/pack/PackProfile$PackFactory;" - ), - index = 0 + value = "INVOKE", + target = "Lnet/minecraft/resource/pack/PackProfile;of(Lnet/minecraft/resource/pack/PackLocationInfo;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/resource/ResourceType;Lnet/minecraft/resource/PackPosition;)Lnet/minecraft/resource/pack/PackProfile;" + ) ) - private ResourcePack onPackGet(ResourcePack pack) { - return ResourceLoaderImpl.buildMinecraftPack(ResourceType.SERVER_DATA, pack); + private PackProfile onCreateVanillaPackProfile(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, ResourceType type, PackPosition position, Operation original) { + packFactory = ResourceLoaderImpl + .buildMinecraftPack( + ResourceType.SERVER_DATA, + packFactory.openPrimary(locationInfo)) + .wrapToFactory(); + + return original.call(locationInfo, packFactory, type, position); } @WrapOperation( method = "createBuiltinPackProfile(Ljava/lang/String;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/text/Text;)Lnet/minecraft/resource/pack/PackProfile;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/resource/pack/PackProfile;of(Lnet/minecraft/resource/pack/PackLocationInfo;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/resource/ResourceType;Lnet/minecraft/unmapped/C_yzksgymh;)Lnet/minecraft/resource/pack/PackProfile;" + target = "Lnet/minecraft/resource/pack/PackProfile;of(Lnet/minecraft/resource/pack/PackLocationInfo;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/resource/ResourceType;Lnet/minecraft/resource/PackPosition;)Lnet/minecraft/resource/pack/PackProfile;" ) ) - private PackProfile onCreateBuiltinResourcePackProfile(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, ResourceType type, C_yzksgymh c_yzksgymh, Operation original) { - packFactory = QuiltPackProfile.wrapToFactory(ResourceLoaderImpl.buildVanillaBuiltinPack(packFactory.openPrimary(locationInfo), ResourceType.SERVER_DATA, + private PackProfile onCreateBuiltinPackProfile(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, ResourceType type, PackPosition position, Operation original) { + packFactory = ResourceLoaderImpl.buildVanillaBuiltinPack( + packFactory.openPrimary(locationInfo), + ResourceType.SERVER_DATA, "data/" + DATA_PACKS_DIR.getNamespace() + '/' + DATA_PACKS_DIR.getPath() + '/' + locationInfo.id() - )); + ).wrapToFactory(); - return original.call(locationInfo, packFactory, type, c_yzksgymh); + return original.call(locationInfo, packFactory, type, position); } } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/ClientBuiltinResourcePackProviderMixin.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/ClientBuiltinResourcePackProviderMixin.java index f4209c7a5b..eb57937948 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/ClientBuiltinResourcePackProviderMixin.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/ClientBuiltinResourcePackProviderMixin.java @@ -26,21 +26,17 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.resource.ClientBuiltinResourcePackProvider; +import net.minecraft.resource.PackPosition; import net.minecraft.resource.ResourceType; import net.minecraft.resource.pack.BuiltinPackProvider; import net.minecraft.resource.pack.PackLocationInfo; import net.minecraft.resource.pack.PackProfile; -import net.minecraft.resource.pack.PackSource; -import net.minecraft.resource.pack.ResourcePack; import net.minecraft.text.Text; -import net.minecraft.unmapped.C_yzksgymh; import org.quiltmc.loader.api.minecraft.ClientOnly; -import org.quiltmc.qsl.resource.loader.api.QuiltPackProfile; import org.quiltmc.qsl.resource.loader.impl.ModPackProvider; import org.quiltmc.qsl.resource.loader.impl.ResourceLoaderImpl; @@ -52,30 +48,39 @@ public abstract class ClientBuiltinResourcePackProviderMixin { private static Map BUILTIN_PACK_DISPLAY_NAMES; @WrapOperation( - method = "createBuiltinPackProfile(Ljava/lang/String;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/text/Text;)Lnet/minecraft/resource/pack/PackProfile;", + method = "createVanillaPackProfile", at = @At( - value = "INVOKE", - target = "Lnet/minecraft/resource/pack/PackProfile;of(Lnet/minecraft/resource/pack/PackLocationInfo;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/resource/ResourceType;Lnet/minecraft/unmapped/C_yzksgymh;)Lnet/minecraft/resource/pack/PackProfile;" + value = "INVOKE", + target = "Lnet/minecraft/resource/pack/PackProfile;of(Lnet/minecraft/resource/pack/PackLocationInfo;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/resource/ResourceType;Lnet/minecraft/resource/PackPosition;)Lnet/minecraft/resource/pack/PackProfile;" ) ) - private PackProfile onCreateBuiltinResourcePackProfile(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, ResourceType type, C_yzksgymh c_yzksgymh, Operation original) { - if (BUILTIN_PACK_DISPLAY_NAMES.containsKey(locationInfo.id())) { - packFactory = QuiltPackProfile.wrapToFactory(ResourceLoaderImpl.buildVanillaBuiltinPack(packFactory.openPrimary(locationInfo), ResourceType.CLIENT_RESOURCES, locationInfo.id())); - } + private PackProfile onCreateVanillaPackProfile(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, ResourceType type, PackPosition position, Operation original) { + packFactory = ResourceLoaderImpl + .buildMinecraftPack( + ResourceType.CLIENT_RESOURCES, + packFactory.openPrimary(locationInfo)) + .wrapToFactory(); - return original.call(locationInfo, packFactory, type, c_yzksgymh); + return original.call(locationInfo, packFactory, type, position); } - @ModifyArg( - method = "createBuiltinPackProfile(Lnet/minecraft/resource/pack/ResourcePack;)Lnet/minecraft/resource/pack/PackProfile;", + @WrapOperation( + method = "createBuiltinPackProfile(Ljava/lang/String;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/text/Text;)Lnet/minecraft/resource/pack/PackProfile;", at = @At( value = "INVOKE", - target = "Lnet/minecraft/client/resource/ClientBuiltinResourcePackProvider;wrapToFactory(Lnet/minecraft/resource/pack/ResourcePack;)Lnet/minecraft/resource/pack/PackProfile$PackFactory;" - ), - index = 0 + target = "Lnet/minecraft/resource/pack/PackProfile;of(Lnet/minecraft/resource/pack/PackLocationInfo;Lnet/minecraft/resource/pack/PackProfile$PackFactory;Lnet/minecraft/resource/ResourceType;Lnet/minecraft/resource/PackPosition;)Lnet/minecraft/resource/pack/PackProfile;" + ) ) - private ResourcePack onPackGet(ResourcePack pack) { - return ResourceLoaderImpl.buildMinecraftPack(ResourceType.CLIENT_RESOURCES, pack); + private PackProfile onCreateBuiltinPackProfile(PackLocationInfo locationInfo, PackProfile.PackFactory packFactory, ResourceType type, PackPosition position, Operation original) { + if (BUILTIN_PACK_DISPLAY_NAMES.containsKey(locationInfo.id())) { + packFactory = ResourceLoaderImpl + .buildVanillaBuiltinPack(packFactory.openPrimary(locationInfo), + ResourceType.CLIENT_RESOURCES, + locationInfo.id()) + .wrapToFactory(); + } + + return original.call(locationInfo, packFactory, type, position); } @ClientOnly diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/KeyedClientResourceReloaderMixin.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/KeyedClientResourceReloaderMixin.java index 1bc7618c09..3953d09315 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/KeyedClientResourceReloaderMixin.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/KeyedClientResourceReloaderMixin.java @@ -40,7 +40,6 @@ import net.minecraft.client.resource.SplashTextResourceSupplier; import net.minecraft.client.resource.VideoWarningManager; import net.minecraft.client.resource.language.LanguageManager; -import net.minecraft.client.search.SearchManager; import net.minecraft.client.sound.SoundManager; import net.minecraft.client.texture.PaintingManager; import net.minecraft.client.texture.SpriteAtlasHolder; @@ -61,7 +60,7 @@ StatusEffectSpriteManager.class, SoundManager.class, SplashTextResourceSupplier.class, TextureManager.class, SpriteAtlasHolder.class, /* private */ - GameRenderer.class, WorldRenderer.class, VideoWarningManager.class, PeriodicNotificationManager.class, SearchManager.class + GameRenderer.class, WorldRenderer.class, VideoWarningManager.class, PeriodicNotificationManager.class, }) public abstract class KeyedClientResourceReloaderMixin implements IdentifiableResourceReloader { @Unique @@ -110,7 +109,7 @@ public abstract class KeyedClientResourceReloaderMixin implements IdentifiableRe } else if (self instanceof SpriteAtlasHolder) { this.quilt$id = ResourceReloaderKeys.Client.SPRITE_ATLASES; } else { - this.quilt$id = new Identifier("private/" + self.getClass().getSimpleName().toLowerCase(Locale.ROOT)); + this.quilt$id = Identifier.ofDefault("private/" + self.getClass().getSimpleName().toLowerCase(Locale.ROOT)); } } diff --git a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/MinecraftClientMixin.java b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/MinecraftClientMixin.java index 0075caa98e..3bba67fc97 100644 --- a/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/MinecraftClientMixin.java +++ b/library/core/resource_loader/src/main/java/org/quiltmc/qsl/resource/loader/mixin/client/MinecraftClientMixin.java @@ -66,7 +66,7 @@ private void onFirstEndReloadResource(MinecraftClient.LoadingContext loadingCont } @Inject( - method = "method_36561", + method = "reloadResources(ZLnet/minecraft/client/MinecraftClient$LoadingContext;)Ljava/util/concurrent/CompletableFuture;", at = @At( value = "INVOKE", target = "Lnet/minecraft/resource/ReloadableResourceManager;reload(Ljava/util/concurrent/Executor;Ljava/util/concurrent/Executor;Ljava/util/concurrent/CompletableFuture;Ljava/util/List;)Lnet/minecraft/resource/ResourceReload;" diff --git a/library/core/resource_loader/src/main/resources/quilt_resource_loader.mixins.json b/library/core/resource_loader/src/main/resources/quilt_resource_loader.mixins.json index 5564b9a01b..78ac8ee981 100644 --- a/library/core/resource_loader/src/main/resources/quilt_resource_loader.mixins.json +++ b/library/core/resource_loader/src/main/resources/quilt_resource_loader.mixins.json @@ -4,6 +4,7 @@ "compatibilityLevel": "JAVA_17", "mixins": [ "BuiltinPackProviderMixin", + "BuiltinPackProvider$WrapToFactory$PackFactoryMixin", "IdentifierAccessor", "KeyedResourceReloaderMixin", "MinecraftServerMixin", diff --git a/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/ResourceLoaderTestMod.java b/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/ResourceLoaderTestMod.java index d37b10e44e..31fd32c7ef 100644 --- a/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/ResourceLoaderTestMod.java +++ b/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/ResourceLoaderTestMod.java @@ -25,7 +25,7 @@ public final class ResourceLoaderTestMod { public static boolean loadingServerResources = false; public static Identifier id(String path) { - return new Identifier(NAMESPACE, path); + return Identifier.of(NAMESPACE, path); } private ResourceLoaderTestMod() { diff --git a/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/VirtualResourcePackTestMod.java b/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/VirtualResourcePackTestMod.java index 5a982feac8..86d6cd2efa 100644 --- a/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/VirtualResourcePackTestMod.java +++ b/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/VirtualResourcePackTestMod.java @@ -26,12 +26,10 @@ import net.minecraft.registry.Registries; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.tag.TagKey; +import net.minecraft.resource.PackPosition; import net.minecraft.resource.ResourceType; import net.minecraft.resource.pack.PackProfile; -import net.minecraft.resource.pack.PackSource; import net.minecraft.server.MinecraftServer; -import net.minecraft.text.Text; -import net.minecraft.unmapped.C_yzksgymh; import net.minecraft.util.Identifier; import org.quiltmc.loader.api.ModContainer; @@ -46,11 +44,11 @@ public class VirtualResourcePackTestMod implements ModInitializer, PackRegistrationContext.Callback, ServerLifecycleEvents.Ready { private static final TagKey TEST_TAG = TagKey.of(RegistryKeys.BLOCK, ResourceLoaderTestMod.id("test_virtual_tag")); private static final TagKey TEST_TAG2 = TagKey.of(RegistryKeys.BLOCK, ResourceLoaderTestMod.id("test_stackable_tag")); - private static final Identifier TAG_FILE = new Identifier( - TEST_TAG.id().getNamespace(), "tags/blocks/" + TEST_TAG.id().getPath() + ".json" + private static final Identifier TAG_FILE = Identifier.of( + TEST_TAG.id().getNamespace(), "tags/block/" + TEST_TAG.id().getPath() + ".json" ); - private static final Identifier TAG_FILE2 = new Identifier( - TEST_TAG2.id().getNamespace(), "tags/blocks/" + TEST_TAG2.id().getPath() + ".json" + private static final Identifier TAG_FILE2 = Identifier.of( + TEST_TAG2.id().getNamespace(), "tags/block/" + TEST_TAG2.id().getPath() + ".json" ); @Override @@ -82,7 +80,7 @@ private void providePacks(Consumer profileAdder, ResourceType type) pack.putText("pack.mcmeta", String.format(""" {"pack":{"pack_format":%d,"description":"Provided pack activation test."}} """, SharedConstants.getGameVersion().getResourceVersion(type))); - pack.putText(ResourceType.CLIENT_RESOURCES, new Identifier("models/block/dandelion.json"), """ + pack.putText(ResourceType.CLIENT_RESOURCES, Identifier.ofDefault("models/block/dandelion.json"), """ { "parent": "minecraft:block/cube_all", "textures": { @@ -90,7 +88,7 @@ private void providePacks(Consumer profileAdder, ResourceType type) } } """); - pack.putText(ResourceType.SERVER_DATA, new Identifier("loot_tables/blocks/dandelion.json"), """ + pack.putText(ResourceType.SERVER_DATA, Identifier.ofDefault("loot_table/blocks/dandelion.json"), """ { "type": "minecraft:block", "pools": [ @@ -116,17 +114,17 @@ private void providePacks(Consumer profileAdder, ResourceType type) profileAdder.accept(PackProfile.of(pack.getLocationInfo(), QuiltPackProfile.wrapToFactory(pack), type, - new C_yzksgymh( - true, - PackProfile.InsertionPosition.BOTTOM, - true + new PackPosition( + false, + PackProfile.InsertionPosition.TOP, + false ))); } @Override public void onRegisterPack(@NotNull PackRegistrationContext context) { var pack = new InMemoryPack.Named("Test Virtual Resource Pack"); - pack.putText(ResourceType.CLIENT_RESOURCES, new Identifier("models/block/poppy.json"), """ + pack.putText(ResourceType.CLIENT_RESOURCES, Identifier.ofDefault("models/block/poppy.json"), """ { "parent": "minecraft:block/cube_all", "textures": { @@ -134,7 +132,7 @@ public void onRegisterPack(@NotNull PackRegistrationContext context) { } } """); - pack.putText(ResourceType.SERVER_DATA, new Identifier("loot_tables/blocks/poppy.json"), """ + pack.putText(ResourceType.SERVER_DATA, Identifier.ofDefault("loot_table/blocks/poppy.json"), """ { "type": "minecraft:block", "pools": [ diff --git a/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/client/ResourcePackProfileProviderTestMod.java b/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/client/ResourcePackProfileProviderTestMod.java index d35770858b..67d53b6e6b 100644 --- a/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/client/ResourcePackProfileProviderTestMod.java +++ b/library/core/resource_loader/src/testmod/java/org/quiltmc/qsl/resource/loader/test/client/ResourcePackProfileProviderTestMod.java @@ -24,13 +24,12 @@ import com.mojang.blaze3d.texture.NativeImage; import net.minecraft.SharedConstants; +import net.minecraft.resource.PackPosition; import net.minecraft.resource.ResourceType; import net.minecraft.resource.pack.PackLocationInfo; import net.minecraft.resource.pack.PackProfile; import net.minecraft.resource.pack.PackSource; import net.minecraft.text.Text; -import net.minecraft.unmapped.C_yzksgymh; -import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; import org.quiltmc.loader.api.ModContainer; @@ -50,7 +49,7 @@ public void onInitializeClient(ModContainer mod) { pack.getLocationInfo(), QuiltPackProfile.wrapToFactory(pack), ResourceType.CLIENT_RESOURCES, - new C_yzksgymh( + new PackPosition( true, PackProfile.InsertionPosition.TOP, true @@ -59,7 +58,7 @@ public void onInitializeClient(ModContainer mod) { } static class TestPack extends InMemoryPack { - private static final Identifier DIRT_IDENTIFIER = new Identifier("textures/block/dirt.png"); + private static final Identifier DIRT_IDENTIFIER = Identifier.ofDefault("textures/block/dirt.png"); private final Random random = new Random(); TestPack() { diff --git a/library/core/resource_loader/src/testmod/resources/data/minecraft/tags/blocks/climbable.json b/library/core/resource_loader/src/testmod/resources/data/minecraft/tags/block/climbable.json similarity index 100% rename from library/core/resource_loader/src/testmod/resources/data/minecraft/tags/blocks/climbable.json rename to library/core/resource_loader/src/testmod/resources/data/minecraft/tags/block/climbable.json diff --git a/library/core/resource_loader/src/testmod/resources/data/namespace-_.test1/tags/blocks/test.json b/library/core/resource_loader/src/testmod/resources/data/namespace-_.test1/tags/block/test.json similarity index 100% rename from library/core/resource_loader/src/testmod/resources/data/namespace-_.test1/tags/blocks/test.json rename to library/core/resource_loader/src/testmod/resources/data/namespace-_.test1/tags/block/test.json diff --git a/library/core/resource_loader/src/testmod/resources/data/quilt_resource_loader_testmod/tags/blocks/test_stackable_tag.json b/library/core/resource_loader/src/testmod/resources/data/quilt_resource_loader_testmod/tags/block/test_stackable_tag.json similarity index 100% rename from library/core/resource_loader/src/testmod/resources/data/quilt_resource_loader_testmod/tags/blocks/test_stackable_tag.json rename to library/core/resource_loader/src/testmod/resources/data/quilt_resource_loader_testmod/tags/block/test_stackable_tag.json diff --git a/library/core/resource_loader/src/testmod/resources/resourcepacks/test/data/minecraft/tags/blocks/climbable.json b/library/core/resource_loader/src/testmod/resources/resourcepacks/test/data/minecraft/tags/block/climbable.json similarity index 100% rename from library/core/resource_loader/src/testmod/resources/resourcepacks/test/data/minecraft/tags/blocks/climbable.json rename to library/core/resource_loader/src/testmod/resources/resourcepacks/test/data/minecraft/tags/block/climbable.json diff --git a/library/core/resource_loader/src/testmod/resources/resourcepacks/test/pack.mcmeta b/library/core/resource_loader/src/testmod/resources/resourcepacks/test/pack.mcmeta index 24529a49d0..7ca489330c 100644 --- a/library/core/resource_loader/src/testmod/resources/resourcepacks/test/pack.mcmeta +++ b/library/core/resource_loader/src/testmod/resources/resourcepacks/test/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { - "pack_format": 8, + "pack_format": 34, "description": "Quilt Resource Loader Test Builtin Pack" } }