From 9cdf63f70ec41f43e6c273e21a496fec3e3a082a Mon Sep 17 00:00:00 2001 From: QUENTIN453 Date: Wed, 10 May 2023 16:19:25 +0200 Subject: [PATCH] add MixinStatBaseFix Make a fix for duplicate Stat Ids , to prevent crashes --- .../fr/iamacat/multithreading/asm/Mixin.java | 7 ++-- ...hreadingandtweaksMultithreadingConfig.java | 4 ++ .../common/core/MixinChunkPopulating.java | 18 ++++---- .../common/core/MixinChunkProviderServer.java | 25 ++++++----- .../mixins/common/core/MixinStatBaseFix.java | 41 +++++++++++++++++++ .../mixins/common/core/MixinUpdateBlocks.java | 17 ++++++-- 6 files changed, 87 insertions(+), 25 deletions(-) create mode 100644 src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinStatBaseFix.java diff --git a/src/main/java/fr/iamacat/multithreading/asm/Mixin.java b/src/main/java/fr/iamacat/multithreading/asm/Mixin.java index 433cdd77..0307f47a 100644 --- a/src/main/java/fr/iamacat/multithreading/asm/Mixin.java +++ b/src/main/java/fr/iamacat/multithreading/asm/Mixin.java @@ -39,8 +39,8 @@ public enum Mixin implements IMixin { "core.MixinExplosions"), common_core_MixinFallBlocksTick(Side.COMMON, m -> MultithreadingandtweaksMultithreadingConfig.enableMixinFallBlocksTick, "core.MixinFallBlocksTick"), - common_core_MixinUpdateBlocks(Side.COMMON, - m -> MultithreadingandtweaksMultithreadingConfig.enableMixinUpdateBlocks, "core.MixinUpdateBlocks"), + common_core_MixinUpdateBlocks(Side.COMMON, m -> MultithreadingandtweaksMultithreadingConfig.enableMixinUpdateBlocks, + "core.MixinUpdateBlocks"), common_core_MixinGrassSpread(Side.COMMON, m -> MultithreadingandtweaksMultithreadingConfig.enableMixinGrassSpread, "core.MixinGrassSpread"), common_core_MixinEntitiesCollision(Side.COMMON, @@ -55,7 +55,8 @@ public enum Mixin implements IMixin { "core.MixinChunkProviderServer"), common_core_MixinGodZillaFix(Side.COMMON, m -> MultithreadingandtweaksMultithreadingConfig.enableMixinGodZillaFix, "core.MixinGodZillaFix"), - + common_core_MixinStatBaseFix(Side.COMMON, m -> MultithreadingandtweaksMultithreadingConfig.enableMixinStatBaseFix, + "core.MixinStatBaseFix"), // CLIENT MIXINS client_core_MixinParticle(Side.CLIENT, m -> MultithreadingandtweaksMultithreadingConfig.enableMixinParticle, diff --git a/src/main/java/fr/iamacat/multithreading/config/MultithreadingandtweaksMultithreadingConfig.java b/src/main/java/fr/iamacat/multithreading/config/MultithreadingandtweaksMultithreadingConfig.java index b9e5cef8..8972c288 100644 --- a/src/main/java/fr/iamacat/multithreading/config/MultithreadingandtweaksMultithreadingConfig.java +++ b/src/main/java/fr/iamacat/multithreading/config/MultithreadingandtweaksMultithreadingConfig.java @@ -111,6 +111,10 @@ public class MultithreadingandtweaksMultithreadingConfig { @Config.DefaultBoolean(false) @Config.RequiresWorldRestart public static boolean enableMixinGodZillaFix; + @Config.Comment("Fix Duplicated stats ids crash") + @Config.DefaultBoolean(true) + @Config.RequiresWorldRestart + public static boolean enableMixinStatBaseFix; @Config.Comment("Choose the number of processor/CPU of your computer to fix potential issues.") @Config.DefaultInt(6) @Config.RangeInt(min = 1, max = 64) diff --git a/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkPopulating.java b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkPopulating.java index 10a87afc..713f58da 100644 --- a/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkPopulating.java +++ b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkPopulating.java @@ -1,8 +1,10 @@ package fr.iamacat.multithreading.mixins.common.core; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; -import com.falsepattern.lib.compat.MathHelper; -import fr.iamacat.multithreading.config.MultithreadingandtweaksMultithreadingConfig; import net.minecraft.crash.CrashReport; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.profiler.Profiler; @@ -14,16 +16,16 @@ import net.minecraft.world.chunk.IChunkProvider; import net.minecraft.world.storage.ISaveHandler; import net.minecraft.world.storage.WorldInfo; + import org.spongepowered.asm.mixin.Mixin; 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.libraries.com.google.common.util.concurrent.ThreadFactoryBuilder; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; +import com.falsepattern.lib.compat.MathHelper; + +import fr.iamacat.multithreading.config.MultithreadingandtweaksMultithreadingConfig; @Mixin(World.class) public abstract class MixinChunkPopulating { @@ -63,7 +65,7 @@ private void onPopulate(IChunkProvider chunkProvider, IChunkProvider chunkProvid method = "Lnet/minecraft/world/WorldServer;(Lnet/minecraft/server/MinecraftServer;Ljava/util/concurrent/ExecutorService;Lnet/minecraft/world/storage/ISaveHandler;Lnet/minecraft/world/storage/WorldInfo;Lnet/minecraft/world/WorldProvider;Lnet/minecraft/profiler/Profiler;Lnet/minecraft/crash/CrashReport;Lnet/minecraft/util/ReportedException;)V", at = @At("RETURN")) private void onInitialize(MinecraftServer server, ExecutorService executorService, ISaveHandler saveHandler, - WorldInfo info, WorldProvider provider, Profiler profiler, CrashReport report, CallbackInfo ci) { + WorldInfo info, WorldProvider provider, Profiler profiler, CrashReport report, CallbackInfo ci) { ServerConfigurationManager playerList = server.getConfigurationManager(); EntityPlayerMP player = (EntityPlayerMP) playerList.playerEntityList.get(0); int viewDistance = playerList.getViewDistance() * 16; // Distance in blocks @@ -76,5 +78,5 @@ private void onInitialize(MinecraftServer server, ExecutorService executorServic chunksToPopulate.offer(chunk); } } - } } +} diff --git a/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkProviderServer.java b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkProviderServer.java index 226e6565..b9b588f6 100644 --- a/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkProviderServer.java +++ b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinChunkProviderServer.java @@ -1,26 +1,28 @@ package fr.iamacat.multithreading.mixins.common.core; -import fr.iamacat.multithreading.config.MultithreadingandtweaksMultithreadingConfig; -import net.minecraft.nbt.NBTTagCompound; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import net.minecraft.server.MinecraftServer; import net.minecraft.world.ChunkCoordIntPair; -import net.minecraft.world.World; import net.minecraft.world.WorldServer; import net.minecraft.world.chunk.Chunk; import net.minecraft.world.gen.ChunkProviderServer; + 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 java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; +import fr.iamacat.multithreading.config.MultithreadingandtweaksMultithreadingConfig; + @Mixin(ChunkProviderServer.class) public class MixinChunkProviderServer { + @Shadow public Chunk loadChunk(int x, int z) { return null; @@ -45,8 +47,10 @@ private void tick(CallbackInfo ci) { currentChunkSetField.setAccessible(true); ChunkCoordIntPair currentChunkSet = (ChunkCoordIntPair) currentChunkSetField.get(chunkProvider); - for (int chunkX = currentChunkSet.chunkXPos - batchSize; chunkX <= currentChunkSet.chunkXPos + batchSize; chunkX++) { - for (int chunkZ = currentChunkSet.chunkZPos - batchSize; chunkZ <= currentChunkSet.chunkZPos + batchSize; chunkZ++) { + for (int chunkX = currentChunkSet.chunkXPos - batchSize; chunkX + <= currentChunkSet.chunkXPos + batchSize; chunkX++) { + for (int chunkZ = currentChunkSet.chunkZPos - batchSize; chunkZ + <= currentChunkSet.chunkZPos + batchSize; chunkZ++) { Chunk chunk = chunkProvider.loadChunk(chunkX, chunkZ); if (chunk != null) { chunksToProcess.add(chunk); @@ -74,4 +78,3 @@ private void tick(CallbackInfo ci) { } } } - diff --git a/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinStatBaseFix.java b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinStatBaseFix.java new file mode 100644 index 00000000..a4cab19a --- /dev/null +++ b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinStatBaseFix.java @@ -0,0 +1,41 @@ +package fr.iamacat.multithreading.mixins.common.core; + +import java.util.HashMap; +import java.util.Map; + +import net.minecraft.stats.StatBase; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import fr.iamacat.multithreading.config.MultithreadingandtweaksMultithreadingConfig; + +@Mixin(StatBase.class) +public abstract class MixinStatBaseFix { + + private static Map statMap = new HashMap<>(); + + @Inject(method = "registerStat", at = @At("HEAD"), cancellable = true) + private void onRegisterStat(CallbackInfoReturnable callbackInfo) { + if (MultithreadingandtweaksMultithreadingConfig.enableMixinStatBaseFix) { + StatBase stat = callbackInfo.getReturnValue(); + + if (stat != null && stat.statId != null) { + String statId = stat.statId; + + if (statMap.containsKey(statId)) { + StatBase existingStat = statMap.get(statId); + existingStat.registerStat(); + callbackInfo.setReturnValue(existingStat); + } else { + statMap.put(statId, stat); + callbackInfo.cancel(); // Cancel the original method to prevent registration + } + } + } + } +} + diff --git a/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinUpdateBlocks.java b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinUpdateBlocks.java index 00deb714..854dea7a 100644 --- a/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinUpdateBlocks.java +++ b/src/main/java/fr/iamacat/multithreading/mixins/common/core/MixinUpdateBlocks.java @@ -26,7 +26,8 @@ public abstract class MixinUpdateBlocks { private final ExecutorService executorService = new ThreadPoolExecutor( MultithreadingandtweaksMultithreadingConfig.numberofcpus, MultithreadingandtweaksMultithreadingConfig.numberofcpus, - 0L, TimeUnit.MILLISECONDS, + 0L, + TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(MultithreadingandtweaksMultithreadingConfig.batchsize), new ThreadFactoryBuilder().setNameFormat("MixinUpdateBlocks-worker-%d") .build()); @@ -88,11 +89,21 @@ private void processChunkBatch() { } private void updateChunks(List chunks) { - chunks.forEach(chunk -> updateChunk(chunk, -30000000, 0, -30000000, 30000000, 255, 30000000, chunk.xPosition, chunk.zPosition)); + chunks.forEach( + chunk -> updateChunk( + chunk, + -30000000, + 0, + -30000000, + 30000000, + 255, + 30000000, + chunk.xPosition, + chunk.zPosition)); } private void updateChunk(Chunk chunk, int minX, int minY, int minZ, int maxX, int maxY, int maxZ, int chunkX, - int chunkZ) { + int chunkZ) { int chunkMinX = chunkX << 4; int chunkMinY = minY < 0 ? 0 : minY; int chunkMinZ = chunkZ << 4;