From 244b04a6fd51cb3ab38072bcd1ab696f5b2b0b4e Mon Sep 17 00:00:00 2001 From: contaria Date: Fri, 22 Nov 2024 11:06:16 +0100 Subject: [PATCH 1/8] feature: cache structures --- .../AntiResourceReload.java | 5 +++ .../mixin/StructureManagerMixin.java | 40 +++++++++++++++++++ .../resources/antiresourcereload.mixins.json | 5 ++- 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/main/java/me/wurgo/antiresourcereload/mixin/StructureManagerMixin.java diff --git a/src/main/java/me/wurgo/antiresourcereload/AntiResourceReload.java b/src/main/java/me/wurgo/antiresourcereload/AntiResourceReload.java index 661d51c..8d9b792 100644 --- a/src/main/java/me/wurgo/antiresourcereload/AntiResourceReload.java +++ b/src/main/java/me/wurgo/antiresourcereload/AntiResourceReload.java @@ -2,11 +2,14 @@ import com.google.gson.JsonElement; import net.minecraft.resource.ServerResourceManager; +import net.minecraft.structure.Structure; import net.minecraft.util.Identifier; import net.minecraft.util.UserCache; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.CompletableFuture; @@ -19,6 +22,8 @@ public class AntiResourceReload { public static UserCache userCache; + public static final Map structures = Collections.synchronizedMap(new HashMap<>()); + public static void log(String message) { LOGGER.info("[AntiResourceReload] {}", message); } diff --git a/src/main/java/me/wurgo/antiresourcereload/mixin/StructureManagerMixin.java b/src/main/java/me/wurgo/antiresourcereload/mixin/StructureManagerMixin.java new file mode 100644 index 0000000..d81cf4b --- /dev/null +++ b/src/main/java/me/wurgo/antiresourcereload/mixin/StructureManagerMixin.java @@ -0,0 +1,40 @@ +package me.wurgo.antiresourcereload.mixin; + +import me.wurgo.antiresourcereload.AntiResourceReload; +import net.minecraft.resource.ResourceManager; +import net.minecraft.resource.ServerResourceManager; +import net.minecraft.structure.Structure; +import net.minecraft.structure.StructureManager; +import net.minecraft.util.Identifier; +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 java.util.function.Function; + +@Mixin(StructureManager.class) +public abstract class StructureManagerMixin { + @Shadow + private ResourceManager field_25189; + + @ModifyArg( + method = "getStructure", + at = @At( + value = "INVOKE", + target = "Ljava/util/Map;computeIfAbsent(Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object;" + ), + index = 1 + ) + private Function getCachedStructure(Function function) { + return id -> { + if (AntiResourceReload.cache != null) { + ServerResourceManager serverResourceManager = AntiResourceReload.cache.getNow(null); + if (serverResourceManager != null && serverResourceManager.getResourceManager() == this.field_25189) { + return AntiResourceReload.structures.computeIfAbsent(id, function); + } + } + return function.apply(id); + }; + } +} diff --git a/src/main/resources/antiresourcereload.mixins.json b/src/main/resources/antiresourcereload.mixins.json index eaa4791..04326a2 100644 --- a/src/main/resources/antiresourcereload.mixins.json +++ b/src/main/resources/antiresourcereload.mixins.json @@ -5,10 +5,11 @@ "compatibilityLevel": "JAVA_8", "client": [ "MinecraftClientMixin", - "ServerResourceManagerMixin", + "RecipeBookWidgetMixin", "RecipeManagerAccess", "RecipeManagerMixin", - "RecipeBookWidgetMixin" + "ServerResourceManagerMixin", + "StructureManagerMixin" ], "injectors": { "defaultRequire": 1 From eaa4a53ed442bd02d842ae39e8762f6404d04cd7 Mon Sep 17 00:00:00 2001 From: contaria Date: Fri, 7 Feb 2025 23:23:41 +0100 Subject: [PATCH 2/8] fix: synchronize blockToInfos map blockToInfos is populated lazily which can lead to concurrency issues when multiple servers are using the same structures in seedqueue --- .../Structure$PalettedBlockInfoListMixin.java | 24 +++++++++++++++++++ .../resources/antiresourcereload.mixins.json | 1 + 2 files changed, 25 insertions(+) create mode 100644 src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java diff --git a/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java b/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java new file mode 100644 index 0000000..2017507 --- /dev/null +++ b/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java @@ -0,0 +1,24 @@ +package me.wurgo.antiresourcereload.mixin; + +import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import net.minecraft.structure.Structure; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; + +import java.util.Collections; +import java.util.Map; + +@Mixin(Structure.PalettedBlockInfoList.class) +public abstract class Structure$PalettedBlockInfoListMixin { + + @ModifyExpressionValue( + method = "*", + at = @At( + value = "INVOKE", + target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;" + ) + ) + private Map synchronizeBlockToInfosMap(Map blockToInfos) { + return Collections.synchronizedMap(blockToInfos); + } +} diff --git a/src/main/resources/antiresourcereload.mixins.json b/src/main/resources/antiresourcereload.mixins.json index 04326a2..bf38bf2 100644 --- a/src/main/resources/antiresourcereload.mixins.json +++ b/src/main/resources/antiresourcereload.mixins.json @@ -9,6 +9,7 @@ "RecipeManagerAccess", "RecipeManagerMixin", "ServerResourceManagerMixin", + "Structure$PalettedBlockInfoListMixin", "StructureManagerMixin" ], "injectors": { From ec102ea74a61fa635f4601de0a2f34f19cf73e6a Mon Sep 17 00:00:00 2001 From: contaria Date: Fri, 7 Feb 2025 23:24:00 +0100 Subject: [PATCH 3/8] feature: cache default pack metadata --- .../mixin/DefaultResourcePackMixin.java | 28 +++++++++++++++++++ .../resources/antiresourcereload.mixins.json | 1 + 2 files changed, 29 insertions(+) create mode 100644 src/main/java/me/wurgo/antiresourcereload/mixin/DefaultResourcePackMixin.java diff --git a/src/main/java/me/wurgo/antiresourcereload/mixin/DefaultResourcePackMixin.java b/src/main/java/me/wurgo/antiresourcereload/mixin/DefaultResourcePackMixin.java new file mode 100644 index 0000000..6e2932f --- /dev/null +++ b/src/main/java/me/wurgo/antiresourcereload/mixin/DefaultResourcePackMixin.java @@ -0,0 +1,28 @@ +package me.wurgo.antiresourcereload.mixin; + +import com.llamalad7.mixinextras.injector.wrapmethod.WrapMethod; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import net.minecraft.resource.DefaultResourcePack; +import net.minecraft.resource.metadata.PackResourceMetadata; +import net.minecraft.resource.metadata.ResourceMetadataReader; +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(DefaultResourcePack.class) +public abstract class DefaultResourcePackMixin { + @Nullable + @Unique + private static PackResourceMetadata METADATA; + + @WrapMethod(method = "parseMetadata") + private Object cacheMetadata(ResourceMetadataReader reader, Operation original) { + if (reader != PackResourceMetadata.READER) { + return original.call(reader); + } + if (METADATA == null) { + METADATA = (PackResourceMetadata) original.call(reader); + } + return METADATA; + } +} diff --git a/src/main/resources/antiresourcereload.mixins.json b/src/main/resources/antiresourcereload.mixins.json index bf38bf2..c7a1700 100644 --- a/src/main/resources/antiresourcereload.mixins.json +++ b/src/main/resources/antiresourcereload.mixins.json @@ -4,6 +4,7 @@ "package": "me.wurgo.antiresourcereload.mixin", "compatibilityLevel": "JAVA_8", "client": [ + "DefaultResourcePackMixin", "MinecraftClientMixin", "RecipeBookWidgetMixin", "RecipeManagerAccess", From 0a967094739e9cccb543777f62d47195d6bf6757 Mon Sep 17 00:00:00 2001 From: contaria Date: Fri, 7 Feb 2025 23:24:46 +0100 Subject: [PATCH 4/8] Version 5.2.0-beta.1 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index eb7f710..150128c 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.16.1-build.24 loader_version=0.16.0 # Mod Properties -mod_version=5.1.0 +mod_version=5.2.0-beta.1 maven_group=me.wurgo archives_base_name=antiresourcereload From c65e4608a3d9208fa0f3b8f1fcbe70580434f9cd Mon Sep 17 00:00:00 2001 From: contaria Date: Fri, 7 Feb 2025 23:34:06 +0100 Subject: [PATCH 5/8] fix: wrap field set instead of map instantiation --- .../Structure$PalettedBlockInfoListMixin.java | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java b/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java index 2017507..97a98d7 100644 --- a/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java +++ b/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java @@ -1,7 +1,9 @@ package me.wurgo.antiresourcereload.mixin; -import com.llamalad7.mixinextras.injector.ModifyExpressionValue; +import com.llamalad7.mixinextras.injector.wrapoperation.Operation; +import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation; import net.minecraft.structure.Structure; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; @@ -11,14 +13,15 @@ @Mixin(Structure.PalettedBlockInfoList.class) public abstract class Structure$PalettedBlockInfoListMixin { - @ModifyExpressionValue( + @WrapOperation( method = "*", at = @At( - value = "INVOKE", - target = "Lcom/google/common/collect/Maps;newHashMap()Ljava/util/HashMap;" + value = "FIELD", + target = "Lnet/minecraft/structure/Structure$PalettedBlockInfoList;blockToInfos:Ljava/util/Map;", + opcode = Opcodes.PUTFIELD ) ) - private Map synchronizeBlockToInfosMap(Map blockToInfos) { - return Collections.synchronizedMap(blockToInfos); + private void synchronizeBlockToInfosMap(Structure.PalettedBlockInfoList list, Map blockToInfos, Operation original) { + original.call(list, Collections.synchronizedMap(blockToInfos)); } } From eda44bce4934cb32cd7bee7d818ce94bfc5a35c3 Mon Sep 17 00:00:00 2001 From: contaria Date: Fri, 7 Feb 2025 23:34:12 +0100 Subject: [PATCH 6/8] Version 5.2.0-beta.2 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 150128c..2eba970 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.16.1-build.24 loader_version=0.16.0 # Mod Properties -mod_version=5.2.0-beta.1 +mod_version=5.2.0-beta.2 maven_group=me.wurgo archives_base_name=antiresourcereload From 4a81a352a4aa7f963907f36c96b9cbbb94794898 Mon Sep 17 00:00:00 2001 From: contaria Date: Thu, 12 Jun 2025 01:56:30 +0200 Subject: [PATCH 7/8] metadata: update links --- src/main/resources/fabric.mod.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index cf3bb3d..edc6891 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -9,13 +9,15 @@ ], "contributors": [ "Pixfumy", - "KingContaria", + "contaria", "Ronkzinho", "jan-leila", "VoidXWalker" ], "contact": { - "homepage": "https://github.com/wurgo" + "homepage": "https://github.com/wurgo", + "sources": "https://github.com/Minecraft-Java-Edition-Speedrunning/antiresourcereload", + "issues": "https://github.com/Minecraft-Java-Edition-Speedrunning/antiresourcereload/issues" }, "license": "MIT", "environment": "client", From 5b7f8064aae6361e2bcaf38b8e32f23d440d9a13 Mon Sep 17 00:00:00 2001 From: contaria Date: Thu, 12 Jun 2025 01:56:43 +0200 Subject: [PATCH 8/8] Version 5.2.0 --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 2eba970..c0a4c31 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ yarn_mappings=1.16.1-build.24 loader_version=0.16.0 # Mod Properties -mod_version=5.2.0-beta.2 +mod_version=5.2.0 maven_group=me.wurgo archives_base_name=antiresourcereload