From db95e37d224c2c130b67de70fd7b0e1cc6a5d27c Mon Sep 17 00:00:00 2001 From: embeddedt <42941056+embeddedt@users.noreply.github.com> Date: Wed, 1 Mar 2023 20:03:47 -0500 Subject: [PATCH] Fix MC-218112 --- .../core/config/ModernFixEarlyConfig.java | 1 + .../mc218112/SynchedEntityDataMixin.java | 34 ++++++++++++++ .../SynchedEntityDataMixin_Client.java | 46 +++++++++++++++++++ src/main/resources/modernfix.mixins.json | 2 + 4 files changed, 83 insertions(+) create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin.java create mode 100644 src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin_Client.java diff --git a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java index 1beb4b03..22c90055 100644 --- a/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java +++ b/src/main/java/org/embeddedt/modernfix/core/config/ModernFixEarlyConfig.java @@ -36,6 +36,7 @@ public class ModernFixEarlyConfig { this.addMixinRule("bugfix.edge_chunk_not_saved", true); this.addMixinRule("bugfix.packet_leak", false); this.addMixinRule("bugfix.structure_manager_crash", true); + this.addMixinRule("bugfix.mc218112", true); this.addMixinRule("perf.async_jei", true); this.addMixinRule("perf.thread_priorities", true); this.addMixinRule("perf.preload_block_classes", false); diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin.java b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin.java new file mode 100644 index 00000000..64b4f16b --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin.java @@ -0,0 +1,34 @@ +package org.embeddedt.modernfix.mixin.bugfix.mc218112; + +import net.minecraft.network.syncher.EntityDataAccessor; +import net.minecraft.network.syncher.SynchedEntityData; +import org.spongepowered.asm.mixin.Final; +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.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; + +import java.util.Map; +import java.util.concurrent.locks.ReadWriteLock; + +@Mixin(SynchedEntityData.class) +public class SynchedEntityDataMixin { + @Shadow @Final private Map> itemsById; + + @Shadow @Final private ReadWriteLock lock; + + @Shadow private boolean isEmpty; + + @Inject(method = "createDataItem", at = @At(value = "INVOKE", target = "Ljava/util/Map;put(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;"), cancellable = true, locals = LocalCapture.CAPTURE_FAILHARD) + private void putWithLock(EntityDataAccessor key, T value, CallbackInfo ci, SynchedEntityData.DataItem item) { + ci.cancel(); + try { + this.itemsById.put(key.getId(), item); + this.isEmpty = false; + } finally { + this.lock.writeLock().unlock(); + } + } +} diff --git a/src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin_Client.java b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin_Client.java new file mode 100644 index 00000000..156442e0 --- /dev/null +++ b/src/main/java/org/embeddedt/modernfix/mixin/bugfix/mc218112/SynchedEntityDataMixin_Client.java @@ -0,0 +1,46 @@ +package org.embeddedt.modernfix.mixin.bugfix.mc218112; + +import net.minecraft.network.syncher.SynchedEntityData; +import net.minecraft.world.entity.Entity; +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.List; +import java.util.Map; +import java.util.concurrent.locks.ReadWriteLock; + +@Mixin(SynchedEntityData.class) +public abstract class SynchedEntityDataMixin_Client { + @Shadow @Final private ReadWriteLock lock; + + @Shadow private boolean isDirty; + + @Shadow protected abstract void assignValue(SynchedEntityData.DataItem target, SynchedEntityData.DataItem source); + + @Shadow @Final private Entity entity; + + @Shadow @Final private Map> itemsById; + + /** + * @author embeddedt + * @reason always unlock + */ + @Overwrite + public void assignValues(List> entries) { + this.lock.writeLock().lock(); + try { + for(SynchedEntityData.DataItem dataentry : entries) { + SynchedEntityData.DataItem dataentry1 = this.itemsById.get(dataentry.getAccessor().getId()); + if (dataentry1 != null) { + this.assignValue(dataentry1, dataentry); + this.entity.onSyncedDataUpdated(dataentry.getAccessor()); + } + } + } finally { + this.lock.writeLock().unlock(); + } + this.isDirty = true; + } +} diff --git a/src/main/resources/modernfix.mixins.json b/src/main/resources/modernfix.mixins.json index c0591966..4650ceeb 100644 --- a/src/main/resources/modernfix.mixins.json +++ b/src/main/resources/modernfix.mixins.json @@ -52,6 +52,7 @@ "perf.fast_registry_validation.ForgeRegistryMixin", "perf.cache_strongholds.ChunkGeneratorMixin", "perf.cache_upgraded_structures.StructureManagerMixin", + "bugfix.mc218112.SynchedEntityDataMixin", "perf.cache_strongholds.ServerLevelMixin" ], "client": [ @@ -94,6 +95,7 @@ "perf.reuse_datapacks.MinecraftServerMixin", "perf.use_integrated_resources.LootTableHelperMixin", "perf.use_integrated_resources.PiglinBarteringRecipeBuilderMixin", + "bugfix.mc218112.SynchedEntityDataMixin_Client", "perf.faster_singleplayer_load.MinecraftServerMixin" ], "injectors": {