diff --git a/gradle.properties b/gradle.properties index eb7f710..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.1.0 +mod_version=5.2.0 maven_group=me.wurgo archives_base_name=antiresourcereload 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/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/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..97a98d7 --- /dev/null +++ b/src/main/java/me/wurgo/antiresourcereload/mixin/Structure$PalettedBlockInfoListMixin.java @@ -0,0 +1,27 @@ +package me.wurgo.antiresourcereload.mixin; + +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; + +import java.util.Collections; +import java.util.Map; + +@Mixin(Structure.PalettedBlockInfoList.class) +public abstract class Structure$PalettedBlockInfoListMixin { + + @WrapOperation( + method = "*", + at = @At( + value = "FIELD", + target = "Lnet/minecraft/structure/Structure$PalettedBlockInfoList;blockToInfos:Ljava/util/Map;", + opcode = Opcodes.PUTFIELD + ) + ) + private void synchronizeBlockToInfosMap(Structure.PalettedBlockInfoList list, Map blockToInfos, Operation original) { + original.call(list, Collections.synchronizedMap(blockToInfos)); + } +} 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..c7a1700 100644 --- a/src/main/resources/antiresourcereload.mixins.json +++ b/src/main/resources/antiresourcereload.mixins.json @@ -4,11 +4,14 @@ "package": "me.wurgo.antiresourcereload.mixin", "compatibilityLevel": "JAVA_8", "client": [ + "DefaultResourcePackMixin", "MinecraftClientMixin", - "ServerResourceManagerMixin", + "RecipeBookWidgetMixin", "RecipeManagerAccess", "RecipeManagerMixin", - "RecipeBookWidgetMixin" + "ServerResourceManagerMixin", + "Structure$PalettedBlockInfoListMixin", + "StructureManagerMixin" ], "injectors": { "defaultRequire": 1 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",