diff --git a/gradle.properties b/gradle.properties index 51905af9..15b272b3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,11 +5,11 @@ org.gradle.jvmargs=-Xmx4G # check these on https://fabricmc.net/use minecraft_version=26.2 -loader_version=0.19.2 +loader_version=0.19.3 loom_version=1.16-SNAPSHOT # Fabric API -fabric_api_version=0.150.2+26.2 +fabric_api_version=0.155.2+26.2 maven_group = eu.pb4 diff --git a/polymer-blocks/src/main/java/eu/pb4/polymer/blocks/api/BlockResourceCreator.java b/polymer-blocks/src/main/java/eu/pb4/polymer/blocks/api/BlockResourceCreator.java index 08913dde..5482ae6e 100644 --- a/polymer-blocks/src/main/java/eu/pb4/polymer/blocks/api/BlockResourceCreator.java +++ b/polymer-blocks/src/main/java/eu/pb4/polymer/blocks/api/BlockResourceCreator.java @@ -1,6 +1,7 @@ package eu.pb4.polymer.blocks.api; import com.google.gson.JsonArray; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.mojang.datafixers.util.Either; @@ -219,7 +220,7 @@ private void generateResources(DefaultRPBuilder builder, List credits) { } - for (var keyVal : keys) { + for (var keyVal : keys.stream().sorted(Map.Entry.comparingByKey()).toList()) { var key = keyVal.getKey(); try { var modelObject = new JsonObject(); @@ -237,7 +238,7 @@ private void generateResources(DefaultRPBuilder builder, List credits) { if (multipart.containsKey(key)) { - multipart.get(key).forEach(multipartObject::add); + multipart.get(key).stream().sorted(Comparator.comparing(JsonObject::toString)).forEach(multipartObject::add); var vanillaData = builder.getDataOrSource(key); if (vanillaData != null) { @@ -264,7 +265,10 @@ private void generateResources(DefaultRPBuilder builder, List credits) { } var ban2 = new JsonObject(); - ban2.add("AND", bannedStates.get(key)); + ban2.add("AND", bannedStates.get(key).asList().stream() + .sorted(Comparator.comparing(JsonElement::toString)) + .collect(JsonArray::new, JsonArray::add, JsonArray::addAll) + ); list.add(ban2); var when = new JsonObject(); diff --git a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackBuilder.java b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackBuilder.java index f16d36b0..bde55714 100644 --- a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackBuilder.java +++ b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackBuilder.java @@ -79,7 +79,7 @@ default boolean copyResourcePackFromPath(Path root, @Nullable String sourceName) } } - try (var str = Files.list(root)) { + try (var str = Files.list(root).sorted()) { String finalSourceName = sourceName; str.forEach(file -> { try { diff --git a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackCreator.java b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackCreator.java index c0f9f6ac..4ee096a1 100644 --- a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackCreator.java +++ b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/ResourcePackCreator.java @@ -155,15 +155,15 @@ public T build(OutputGenerator output, ResourcePackStatusConsumer status) var successful = true; - for (var path : this.sourcePaths) { + for (var path : this.sourcePaths.stream().sorted(Comparator.naturalOrder()).toList()) { successful = builder.copyFromPath(path) && successful; } - for (String modId : this.modIdsNoCopy) { + for (String modId : this.modIdsNoCopy.stream().sorted(Comparator.naturalOrder()).toList()) { successful = builder.addAssetsSource(modId) && successful; } - for (String modId : this.modIds) { + for (String modId : this.modIds.stream().sorted(Comparator.naturalOrder()).toList()) { successful = builder.copyAssets(modId) && successful; } diff --git a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/metadata/PackMcMeta.java b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/metadata/PackMcMeta.java index 1fe95626..96ed5d46 100644 --- a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/metadata/PackMcMeta.java +++ b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/api/metadata/PackMcMeta.java @@ -42,7 +42,7 @@ public static class Builder { ); private final List filter = new ArrayList<>(); private final List overlay = new ArrayList<>(); - private final Map language = new HashMap<>(); + private final Map language = new LinkedHashMap<>(); public Builder metadata(PackMetadataSection metadata) { this.metadata = metadata; @@ -76,8 +76,8 @@ public Builder addLanguage(String name, LanguageDefinition definition) { public PackMcMeta build() { return new PackMcMeta(this.metadata, - this.filter.isEmpty() ? Optional.empty() : Optional.of(new ResourceFilterSection(this.filter)), - this.overlay.isEmpty() ? Optional.empty() : Optional.of(new OverlayMetadataSection(this.overlay)), + this.filter.isEmpty() ? Optional.empty() : Optional.of(new ResourceFilterSection(this.filter.stream().sorted(Comparator.comparing(Object::toString)).toList())), + this.overlay.isEmpty() ? Optional.empty() : Optional.of(new OverlayMetadataSection(this.overlay.stream().sorted(Comparator.comparing(Object::toString)).toList())), this.language.isEmpty() ? Optional.empty() : Optional.of(new LanguageResourceMetadata(this.language)) ); } diff --git a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackImpl.java b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackImpl.java index 83ad2cec..989ab8e1 100644 --- a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackImpl.java +++ b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackImpl.java @@ -17,6 +17,7 @@ public class PolymerResourcePackImpl { public static final String FILE_NAME; public static final boolean IGNORE_PACK_VERSION; public static final boolean LOG_ERRORS; + public static final boolean LOG_GENERATED_PACK_SHA1; static { @@ -30,6 +31,7 @@ public class PolymerResourcePackImpl { FORCE_REQUIRE = config.markResourcePackAsRequiredByDefault; LOG_ERRORS = config.logErrors || FabricLoader.getInstance().isDevelopmentEnvironment(); + LOG_GENERATED_PACK_SHA1 = config.logGeneratedPackSha1; } public static Config loadConfig() { @@ -61,5 +63,7 @@ public static class Config { public String _c10 = "Toggles logging of non-critical errors when generating the pack."; @SerializedName("log_errors") public boolean logErrors = true; + @SerializedName("log_generated_pack_sha1") + public boolean logGeneratedPackSha1 = true; } } diff --git a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackMod.java b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackMod.java index 27ad94b3..c31541d3 100644 --- a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackMod.java +++ b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/PolymerResourcePackMod.java @@ -3,7 +3,6 @@ import com.mojang.brigadier.context.CommandContext; import eu.pb4.polymer.common.impl.CommonImpl; import eu.pb4.polymer.common.impl.CommonImplUtils; -import eu.pb4.polymer.common.impl.CompatStatus; import eu.pb4.polymer.resourcepack.api.OutputGenerator; import eu.pb4.polymer.resourcepack.api.PolymerResourcePackUtils; import eu.pb4.polymer.resourcepack.api.ResourcePackStatusConsumer; @@ -11,7 +10,6 @@ import eu.pb4.polymer.resourcepack.impl.client.rendering.PolymerResourcePack; import net.fabricmc.api.ClientModInitializer; import net.fabricmc.api.ModInitializer; -import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents; import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.metadata.CustomValue; import net.minecraft.ChatFormatting; @@ -36,6 +34,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Consumer; +import java.util.stream.StreamSupport; import static net.minecraft.commands.Commands.literal; @@ -126,7 +125,9 @@ public void onInitialize() { continue; } try (var stream = Files.newDirectoryStream(folderPath, parts[parts.length - 1])){ - stream.forEach(zipReader); + StreamSupport.stream(stream.spliterator(), false) + .sorted() + .forEach(zipReader); } } else { zipReader.accept(gamePath.resolve(field)); diff --git a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/generation/DefaultRPBuilder.java b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/generation/DefaultRPBuilder.java index a9b85440..e9d6ec43 100644 --- a/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/generation/DefaultRPBuilder.java +++ b/polymer-resource-pack/src/main/java/eu/pb4/polymer/resourcepack/impl/generation/DefaultRPBuilder.java @@ -25,6 +25,7 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; +import java.nio.file.attribute.FileTime; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.function.BiConsumer; @@ -193,7 +194,7 @@ public boolean copyFromPath(Path basePath, String targetPrefix, boolean override if (Files.isDirectory(basePath)) { status.accept("action:copy_path_start/" + sourceName); Path finalBasePath = basePath; - try (var str = Files.walk(basePath)) { + try (var str = Files.walk(basePath).sorted()) { str.forEach((file) -> { var relative = finalBasePath.relativize(file); var path = targetPrefix + relative.toString().replace("\\", "/"); @@ -246,7 +247,7 @@ public boolean copyAssets(String modId) { this.modsList.add(container); try { for (var rootPaths : container.getRootPaths()) { - try (var str = Files.list(rootPaths)) { + try (var str = Files.list(rootPaths).sorted()) { str.forEach(file -> { try { var name = file.getFileName().toString(); @@ -272,7 +273,7 @@ public boolean copyAssets(String modId) { for (var x : baseToCopy) { Path assets = rootPaths.resolve(x); if (Files.exists(assets)) { - try (var str = Files.walk(assets)) { + try (var str = Files.walk(assets).sorted()) { str.forEach((file) -> { var relative = assets.relativize(file); var path = relative.toString().replace("\\", "/"); @@ -324,7 +325,9 @@ public byte[] getDataOrSource(String path) { @Override public void forEachResource(BiConsumer consumer) { - Map.copyOf(this.fileMap).forEach(consumer); + var sorted = new ArrayList<>(this.fileMap.entrySet()); + sorted.sort(Map.Entry.comparingByKey()); + sorted.forEach(e -> consumer.accept(e.getKey(), e.getValue())); } @Override @@ -438,14 +441,24 @@ public CompletableFuture buildResourcePack() { status.accept("action:merge_files_start"); - for (var entry : this.atlasDefinitions.entrySet()) { + var sortedAtlas = new ArrayList<>(this.atlasDefinitions.entrySet()); + sortedAtlas.sort(Map.Entry.comparingByKey()); + for (var entry : sortedAtlas) { var obj = new JsonObject(); obj.add("sources", entry.getValue()); this.fileMap.put(entry.getKey(), PackResource.of(obj.toString().getBytes(StandardCharsets.UTF_8))); } - for (var entry : this.objectMergeDefinitions.entrySet()) { - this.fileMap.put(entry.getKey(), PackResource.of(entry.getValue().toString().getBytes(StandardCharsets.UTF_8))); + var sortedObjects = new ArrayList<>(this.objectMergeDefinitions.entrySet()); + sortedObjects.sort(Map.Entry.comparingByKey()); + for (var entry : sortedObjects) { + var sortedJson = new JsonObject(); + var keys = new ArrayList<>(entry.getValue().keySet()); + keys.sort(String::compareTo); + for (var key : keys) { + sortedJson.add(key, entry.getValue().get(key)); + } + this.fileMap.put(entry.getKey(), PackResource.of(sortedJson.toString().getBytes(StandardCharsets.UTF_8))); } this.fileMap.put(AssetPaths.PACK_METADATA, PackResource.of(this.packMetadata.build().asString().getBytes(StandardCharsets.UTF_8))); @@ -519,7 +532,7 @@ public static OutputGenerator.Result writeSingleZip(Path out, Collection