From dc305294bb9d37c582dffadbe4105c4939637447 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 17 Dec 2023 16:17:00 +0200 Subject: [PATCH 1/7] Allow mods to not provide pack information --- .../neoforge/resource/ResourcePackLoader.java | 76 ++++++++++++++----- .../resources/META-INF/accesstransformer.cfg | 1 + 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java index 5aa447d308..4298a9f446 100644 --- a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java @@ -8,6 +8,7 @@ import com.mojang.datafixers.util.Pair; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; +import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedHashMap; @@ -20,14 +21,19 @@ import java.util.stream.Collectors; import net.minecraft.SharedConstants; import net.minecraft.network.chat.Component; +import net.minecraft.server.packs.FeatureFlagsMetadataSection; +import net.minecraft.server.packs.OverlayMetadataSection; +import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.PathPackResources; import net.minecraft.server.packs.metadata.pack.PackMetadataSection; import net.minecraft.server.packs.repository.Pack; +import net.minecraft.server.packs.repository.PackCompatibility; import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.server.packs.repository.PackSource; import net.minecraft.server.packs.repository.RepositorySource; -import net.neoforged.fml.Logging; +import net.minecraft.util.InclusiveRange; +import net.minecraft.world.flag.FeatureFlagSet; import net.neoforged.fml.ModList; import net.neoforged.fml.ModLoader; import net.neoforged.fml.ModLoadingStage; @@ -76,30 +82,64 @@ private static void packFinder(Map modResource if ("minecraft".equals(mod.getModId())) continue; // skip the minecraft "mod" final String name = "mod:" + mod.getModId(); final String packName = mod.getOwningFile().getFile().getFileName(); - Pack modPack = Pack.readMetaAndCreate( - name, - Component.literal(packName.isEmpty() ? "[unnamed]" : packName), - false, - e.getValue(), - packType, - Pack.Position.BOTTOM, - PackSource.DEFAULT); - if (modPack == null) { - // Vanilla only logs an error, instead of propagating, so handle null and warn that something went wrong + + try { + final Pack modPack = readWithOptionalMeta( + name, + Component.literal(packName.isEmpty() ? "[unnamed]" : packName), + false, + e.getValue(), + packType, + Pack.Position.BOTTOM, + PackSource.DEFAULT); + if ((packType == PackType.CLIENT_RESOURCES && mod.getOwningFile().showAsResourcePack()) || (packType == PackType.SERVER_DATA && mod.getOwningFile().showAsDataPack())) { + packAcceptor.accept(modPack); + } else { + hiddenPacks.add(modPack.hidden()); + } + } catch (IOException exception) { + LOGGER.error("Failed to read pack.mcmeta file of mod {}", mod.getModId(), exception); ModLoader.get().addWarning(new ModLoadingWarning(mod, ModLoadingStage.ERROR, "fml.modloading.brokenresources", e.getKey())); - continue; - } - LOGGER.debug(Logging.CORE, "Generating PackInfo named {} for mod file {}", name, e.getKey().getFilePath()); - if ((packType == PackType.CLIENT_RESOURCES && mod.getOwningFile().showAsResourcePack()) || (packType == PackType.SERVER_DATA && mod.getOwningFile().showAsDataPack())) { - packAcceptor.accept(modPack); - } else { - hiddenPacks.add(modPack.hidden()); } } packAcceptor.accept(makePack(packType, hiddenPacks)); } + public static Pack readWithOptionalMeta( + String id, + Component title, + boolean required, + Pack.ResourcesSupplier resources, + PackType type, + Pack.Position position, + PackSource source) throws IOException { + final Pack.Info packInfo = readInfo(type, resources, id, title); + return Pack.create(id, title, required, resources, packInfo, position, false, source); + } + + private static Pack.Info readInfo(PackType type, Pack.ResourcesSupplier resources, String id, Component title) throws IOException { + final int currentVersion = SharedConstants.getCurrentVersion().getPackVersion(type); + try (final PackResources primaryResources = resources.openPrimary(id)) { + final PackMetadataSection metadata = primaryResources.getMetadataSection(PackMetadataSection.TYPE); + + final FeatureFlagSet flags = Optional.ofNullable(primaryResources.getMetadataSection(FeatureFlagsMetadataSection.TYPE)) + .map(FeatureFlagsMetadataSection::flags) + .orElse(FeatureFlagSet.of()); + + final List overlays = Optional.ofNullable(primaryResources.getMetadataSection(OverlayMetadataSection.TYPE)) + .map(section -> section.overlaysForVersion(currentVersion)) + .orElse(List.of()); + + if (metadata == null) { + return new Pack.Info(title, PackCompatibility.COMPATIBLE, flags, overlays, primaryResources.isHidden()); + } + + final InclusiveRange range = Pack.getDeclaredPackVersions(id, metadata); + return new Pack.Info(metadata.description(), PackCompatibility.forVersion(range, currentVersion), flags, overlays, primaryResources.isHidden()); + } + } + private static Pack makePack(PackType packType, ArrayList hiddenPacks) { final String id = packType == PackType.CLIENT_RESOURCES ? MOD_RESOURCES_ID : MOD_DATA_ID; final String name = packType == PackType.CLIENT_RESOURCES ? "Mod Resources" : "Mod Data"; diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index efa0d24086..ec8fca7907 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -269,6 +269,7 @@ public net.minecraft.server.packs.FilePackResources$SharedZipFileAccess public net.minecraft.server.packs.FilePackResources$SharedZipFileAccess (Ljava/io/File;)V # constructor public net.minecraft.server.packs.repository.BuiltInPackSource fixedResources(Lnet/minecraft/server/packs/PackResources;)Lnet/minecraft/server/packs/repository/Pack$ResourcesSupplier; # fixedResources public net.minecraft.server.packs.repository.ServerPacksSource createVanillaPackSource()Lnet/minecraft/server/packs/VanillaPackResources; # createVanillaPackSource +public net.minecraft.server.packs.repository.Pack getDeclaredPackVersions(Ljava/lang/String;Lnet/minecraft/server/packs/metadata/pack/PackMetadataSection;)Lnet/minecraft/util/InclusiveRange; # getDeclaredPackVersions public net.minecraft.server.packs.resources.FallbackResourceManager fallbacks # fallbacks public net.minecraft.util.ExtraCodecs$EitherCodec public net.minecraft.util.datafix.fixes.StructuresBecomeConfiguredFix$Conversion From 643d9aa9b948bf15cb8ec608dde231efd74bf052 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 17 Dec 2023 16:25:52 +0200 Subject: [PATCH 2/7] Optional `pack_format` --- .../neoforge/resource/ResourcePackLoader.java | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java index 4298a9f446..7c1625761f 100644 --- a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java @@ -6,6 +6,8 @@ package net.neoforged.neoforge.resource; import com.mojang.datafixers.util.Pair; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import java.io.IOException; @@ -21,11 +23,13 @@ import java.util.stream.Collectors; import net.minecraft.SharedConstants; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.ComponentSerialization; import net.minecraft.server.packs.FeatureFlagsMetadataSection; import net.minecraft.server.packs.OverlayMetadataSection; import net.minecraft.server.packs.PackResources; import net.minecraft.server.packs.PackType; import net.minecraft.server.packs.PathPackResources; +import net.minecraft.server.packs.metadata.MetadataSectionType; import net.minecraft.server.packs.metadata.pack.PackMetadataSection; import net.minecraft.server.packs.repository.Pack; import net.minecraft.server.packs.repository.PackCompatibility; @@ -106,6 +110,13 @@ private static void packFinder(Map modResource packAcceptor.accept(makePack(packType, hiddenPacks)); } + public static final MetadataSectionType OPTIONAL_FORMAT = MetadataSectionType.fromCodec("pack", RecordCodecBuilder.create( + in -> in.group( + ComponentSerialization.CODEC.fieldOf("description").forGetter(PackMetadataSection::description), + Codec.INT.optionalFieldOf("pack_format", -1).forGetter(PackMetadataSection::packFormat), + InclusiveRange.codec(Codec.INT).optionalFieldOf("supported_formats").forGetter(PackMetadataSection::supportedFormats)) + .apply(in, PackMetadataSection::new))); + public static Pack readWithOptionalMeta( String id, Component title, @@ -135,8 +146,13 @@ private static Pack.Info readInfo(PackType type, Pack.ResourcesSupplier resource return new Pack.Info(title, PackCompatibility.COMPATIBLE, flags, overlays, primaryResources.isHidden()); } - final InclusiveRange range = Pack.getDeclaredPackVersions(id, metadata); - return new Pack.Info(metadata.description(), PackCompatibility.forVersion(range, currentVersion), flags, overlays, primaryResources.isHidden()); + final PackCompatibility compatibility; + if (metadata.packFormat() == -1 && metadata.supportedFormats().isEmpty()) { + compatibility = PackCompatibility.COMPATIBLE; + } else { + compatibility = PackCompatibility.forVersion(Pack.getDeclaredPackVersions(id, metadata), currentVersion); + } + return new Pack.Info(metadata.description(), compatibility, flags, overlays, primaryResources.isHidden()); } } From 9747328012a215eef9d74d6316b09c65f374e0c6 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 17 Dec 2023 16:29:31 +0200 Subject: [PATCH 3/7] Update ResourcePackLoader.java --- .../net/neoforged/neoforge/resource/ResourcePackLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java index 7c1625761f..681efed61f 100644 --- a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java @@ -132,7 +132,7 @@ public static Pack readWithOptionalMeta( private static Pack.Info readInfo(PackType type, Pack.ResourcesSupplier resources, String id, Component title) throws IOException { final int currentVersion = SharedConstants.getCurrentVersion().getPackVersion(type); try (final PackResources primaryResources = resources.openPrimary(id)) { - final PackMetadataSection metadata = primaryResources.getMetadataSection(PackMetadataSection.TYPE); + final PackMetadataSection metadata = primaryResources.getMetadataSection(OPTIONAL_FORMAT); final FeatureFlagSet flags = Optional.ofNullable(primaryResources.getMetadataSection(FeatureFlagsMetadataSection.TYPE)) .map(FeatureFlagsMetadataSection::flags) From 671446b540e249cf735e8e2fbb55ecc004f8526e Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Sun, 17 Dec 2023 16:36:41 +0200 Subject: [PATCH 4/7] Description also isn't necessarily needed --- .../net/neoforged/neoforge/resource/ResourcePackLoader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java index 681efed61f..49edcb155e 100644 --- a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java @@ -112,7 +112,7 @@ private static void packFinder(Map modResource public static final MetadataSectionType OPTIONAL_FORMAT = MetadataSectionType.fromCodec("pack", RecordCodecBuilder.create( in -> in.group( - ComponentSerialization.CODEC.fieldOf("description").forGetter(PackMetadataSection::description), + ComponentSerialization.CODEC.optionalFieldOf("description", Component.empty()).forGetter(PackMetadataSection::description), Codec.INT.optionalFieldOf("pack_format", -1).forGetter(PackMetadataSection::packFormat), InclusiveRange.codec(Codec.INT).optionalFieldOf("supported_formats").forGetter(PackMetadataSection::supportedFormats)) .apply(in, PackMetadataSection::new))); From fcd27a6e87722178aff46864240feb148d720d87 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Mon, 18 Dec 2023 21:43:57 +0200 Subject: [PATCH 5/7] Require meta for for standalone packs --- .../neoforge/resource/ResourcePackLoader.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java index 49edcb155e..9aa39650c4 100644 --- a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java @@ -88,15 +88,24 @@ private static void packFinder(Map modResource final String packName = mod.getOwningFile().getFile().getFileName(); try { - final Pack modPack = readWithOptionalMeta( + final boolean isRequired = (packType == PackType.CLIENT_RESOURCES && mod.getOwningFile().showAsResourcePack()) || (packType == PackType.SERVER_DATA && mod.getOwningFile().showAsDataPack()); + final Pack modPack = isRequired ? Pack.readMetaAndCreate( name, Component.literal(packName.isEmpty() ? "[unnamed]" : packName), false, e.getValue(), packType, Pack.Position.BOTTOM, - PackSource.DEFAULT); - if ((packType == PackType.CLIENT_RESOURCES && mod.getOwningFile().showAsResourcePack()) || (packType == PackType.SERVER_DATA && mod.getOwningFile().showAsDataPack())) { + PackSource.DEFAULT) + : readWithOptionalMeta( + name, + Component.literal(packName.isEmpty() ? "[unnamed]" : packName), + false, + e.getValue(), + packType, + Pack.Position.BOTTOM, + PackSource.DEFAULT); + if (isRequired) { packAcceptor.accept(modPack); } else { hiddenPacks.add(modPack.hidden()); From 9ac0e3d0fb3f4558c54d05453756433e600123c5 Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Mon, 18 Dec 2023 22:55:10 +0200 Subject: [PATCH 6/7] Happy xfact == happy everyone? --- .../neoforge/resource/ResourcePackLoader.java | 43 ++++++++++++------- 1 file changed, 27 insertions(+), 16 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java index 9aa39650c4..1c6b21a2d1 100644 --- a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java @@ -89,22 +89,33 @@ private static void packFinder(Map modResource try { final boolean isRequired = (packType == PackType.CLIENT_RESOURCES && mod.getOwningFile().showAsResourcePack()) || (packType == PackType.SERVER_DATA && mod.getOwningFile().showAsDataPack()); - final Pack modPack = isRequired ? Pack.readMetaAndCreate( - name, - Component.literal(packName.isEmpty() ? "[unnamed]" : packName), - false, - e.getValue(), - packType, - Pack.Position.BOTTOM, - PackSource.DEFAULT) - : readWithOptionalMeta( - name, - Component.literal(packName.isEmpty() ? "[unnamed]" : packName), - false, - e.getValue(), - packType, - Pack.Position.BOTTOM, - PackSource.DEFAULT); + final Pack modPack; + // Packs displayed separately must be valid + if (isRequired) { + modPack = Pack.readMetaAndCreate( + name, + Component.literal(packName.isEmpty() ? "[unnamed]" : packName), + false, + e.getValue(), + packType, + Pack.Position.BOTTOM, + PackSource.DEFAULT); + + if (modPack == null) { + ModLoader.get().addWarning(new ModLoadingWarning(mod, ModLoadingStage.ERROR, "fml.modloading.brokenresources", e.getKey())); + continue; + } + } else { + modPack = readWithOptionalMeta( + name, + Component.literal(packName.isEmpty() ? "[unnamed]" : packName), + false, + e.getValue(), + packType, + Pack.Position.BOTTOM, + PackSource.DEFAULT); + } + if (isRequired) { packAcceptor.accept(modPack); } else { From 21d85b23ff0e72b2506dbf950a401a0316cb2a4e Mon Sep 17 00:00:00 2001 From: Matyrobbrt Date: Mon, 18 Dec 2023 23:24:42 +0200 Subject: [PATCH 7/7] Update ResourcePackLoader.java --- .../neoforged/neoforge/resource/ResourcePackLoader.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java index 1c6b21a2d1..fbdc23085d 100644 --- a/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java +++ b/src/main/java/net/neoforged/neoforge/resource/ResourcePackLoader.java @@ -36,6 +36,7 @@ import net.minecraft.server.packs.repository.PackRepository; import net.minecraft.server.packs.repository.PackSource; import net.minecraft.server.packs.repository.RepositorySource; +import net.minecraft.util.ExtraCodecs; import net.minecraft.util.InclusiveRange; import net.minecraft.world.flag.FeatureFlagSet; import net.neoforged.fml.ModList; @@ -132,9 +133,9 @@ private static void packFinder(Map modResource public static final MetadataSectionType OPTIONAL_FORMAT = MetadataSectionType.fromCodec("pack", RecordCodecBuilder.create( in -> in.group( - ComponentSerialization.CODEC.optionalFieldOf("description", Component.empty()).forGetter(PackMetadataSection::description), - Codec.INT.optionalFieldOf("pack_format", -1).forGetter(PackMetadataSection::packFormat), - InclusiveRange.codec(Codec.INT).optionalFieldOf("supported_formats").forGetter(PackMetadataSection::supportedFormats)) + ExtraCodecs.strictOptionalField(ComponentSerialization.CODEC, "description", Component.empty()).forGetter(PackMetadataSection::description), + ExtraCodecs.strictOptionalField(Codec.INT, "pack_format", -1).forGetter(PackMetadataSection::packFormat), + ExtraCodecs.strictOptionalField(InclusiveRange.codec(Codec.INT), "supported_formats").forGetter(PackMetadataSection::supportedFormats)) .apply(in, PackMetadataSection::new))); public static Pack readWithOptionalMeta(