From e50859f10d1559b6bd1e6218c756c3798074106e Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Sun, 1 Jan 2023 19:34:29 -0500 Subject: [PATCH] Fix occasional crash due to unsafe concurrency with RenderTypes --- .../modernfix/mixin/RenderTypeMixin.java | 28 +++++++++++++++++++ .../resources/META-INF/accesstransformer.cfg | 4 ++- src/main/resources/modernfix.mixins.json | 3 +- 3 files changed, 33 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/RenderTypeMixin.java diff --git a/src/main/java/org/embeddedt/modernfix/mixin/RenderTypeMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/RenderTypeMixin.java new file mode 100644 index 00000000..42254d06 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/RenderTypeMixin.java @@ -0,0 +1,28 @@ +package org.embeddedt.modernfix.mixin; + +import com.google.common.base.Preconditions; +import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; +import net.minecraft.client.renderer.RenderType; +import net.minecraft.client.renderer.vertex.VertexFormat; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; +import org.spongepowered.asm.mixin.Shadow; + +import java.util.Collections; + +@Mixin(targets = {"net/minecraft/client/renderer/RenderType$Type"}) +public class RenderTypeMixin { + @Shadow @Final private static ObjectOpenCustomHashSet TYPES; + + /** + * @author embeddedt + * @reason synchronize, can be accessed by multiple mods during modloading + */ + @Overwrite + private static RenderType.Type getOrCreate(String name, VertexFormat format, int drawMode, int bufferSize, boolean useDelegate, boolean needsSorting, RenderType.State renderState) { + synchronized (TYPES){ + return TYPES.addOrGet(new RenderType.Type(name, format, drawMode, bufferSize, useDelegate, needsSorting, renderState)); + } + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 460d2e77..45ace3e9 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -1 +1,3 @@ -public net.minecraft.client.Minecraft$WorldSelectionType \ No newline at end of file +public net.minecraft.client.Minecraft$WorldSelectionType +public net.minecraft.client.renderer.RenderType$Type +public net.minecraft.client.renderer.RenderType$Type (Ljava/lang/String;Lnet/minecraft/client/renderer/vertex/VertexFormat;IIZZLnet/minecraft/client/renderer/RenderType$State;)V \ No newline at end of file diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index ac6e1362..05a17998 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -11,7 +11,8 @@ "SaveFormatAccessor" ], "client": [ - "MinecraftMixin" + "MinecraftMixin", + "RenderTypeMixin" ], "injectors": { "defaultRequire": 1