Skip to content

Commit

Permalink
add MixinStatBaseFix
Browse files Browse the repository at this point in the history
Make a fix for duplicate Stat Ids , to prevent crashes
  • Loading branch information
quentin452 committed May 10, 2023
1 parent 116050b commit 9cdf63f
Show file tree
Hide file tree
Showing 6 changed files with 87 additions and 25 deletions.
7 changes: 4 additions & 3 deletions src/main/java/fr/iamacat/multithreading/asm/Mixin.java
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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 {
Expand Down Expand Up @@ -63,7 +65,7 @@ private void onPopulate(IChunkProvider chunkProvider, IChunkProvider chunkProvid
method = "Lnet/minecraft/world/WorldServer;<init>(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
Expand All @@ -76,5 +78,5 @@ private void onInitialize(MinecraftServer server, ExecutorService executorServic
chunksToPopulate.offer(chunk);
}
}
}
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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);
Expand Down Expand Up @@ -74,4 +78,3 @@ private void tick(CallbackInfo ci) {
}
}
}

Original file line number Diff line number Diff line change
@@ -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<String, StatBase> statMap = new HashMap<>();

@Inject(method = "registerStat", at = @At("HEAD"), cancellable = true)
private void onRegisterStat(CallbackInfoReturnable<StatBase> 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
}
}
}
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -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());
Expand Down Expand Up @@ -88,11 +89,21 @@ private void processChunkBatch() {
}

private void updateChunks(List<Chunk> 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;
Expand Down

0 comments on commit 9cdf63f

Please sign in to comment.