Skip to content

Commit 8e5f474

Browse files
committed
add rule: cceSuppressionCrashFix
1 parent 34930fd commit 8e5f474

File tree

7 files changed

+137
-0
lines changed

7 files changed

+137
-0
lines changed

src/main/java/io/github/optijava/opt_carpet_addition/OptCarpetSettings.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,5 +158,11 @@ public class OptCarpetSettings {
158158
category = RuleCategory.OPTIMIZATION
159159
)
160160
public static boolean optimizeFakePlayerSpawn = false;
161+
162+
@Rule(
163+
desc = "Fix CCE Suppression crashes",
164+
category = {RuleCategory.BUGFIX, RuleCategory.EXPERIMENTAL}
165+
)
166+
public static boolean cceSuppressionCrashFix = false;
161167
}
162168

src/main/java/io/github/optijava/opt_carpet_addition/logger/LoggerRegister.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.github.optijava.opt_carpet_addition.logger;
22

33
import carpet.logging.LoggerRegistry;
4+
import io.github.optijava.opt_carpet_addition.logger.cceSuppressionCrashLogger.CCESuppressionCrashLogger;
45
import io.github.optijava.opt_carpet_addition.logger.disk.DiskHUDLogger;
56
import io.github.optijava.opt_carpet_addition.logger.updateSuppression.UpdateSuppressionLogger;
67

@@ -12,8 +13,11 @@ private LoggerRegister() {
1213

1314
public static boolean __updateSuppression = false;
1415

16+
public static boolean __cceSuppressionCrash = false;
17+
1518
public static void registry() {
1619
LoggerRegistry.registerLogger("disk", DiskHUDLogger.INSTANCE);
1720
LoggerRegistry.registerLogger("updateSuppression", UpdateSuppressionLogger.INSTANCE);
21+
LoggerRegistry.registerLogger("cceSuppressionCrash", CCESuppressionCrashLogger.INSTANCE);
1822
}
1923
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package io.github.optijava.opt_carpet_addition.logger.cceSuppressionCrashLogger;
2+
3+
import carpet.utils.Messenger;
4+
import io.github.optijava.opt_carpet_addition.logger.AbstractLogger;
5+
import io.github.optijava.opt_carpet_addition.logger.LoggerRegister;
6+
import net.minecraft.text.BaseText;
7+
import net.minecraft.util.math.BlockPos;
8+
9+
import java.lang.reflect.Field;
10+
11+
public class CCESuppressionCrashLogger extends AbstractLogger {
12+
13+
public static final CCESuppressionCrashLogger INSTANCE;
14+
15+
static {
16+
try {
17+
INSTANCE = new CCESuppressionCrashLogger(LoggerRegister.class.getField("__cceSuppressionCrash"), "cceSuppressionCrash", null, null, false);
18+
} catch (NoSuchFieldException e) {
19+
throw new Error("Failed to init UpdateSuppressionLogger", e);
20+
}
21+
}
22+
23+
protected CCESuppressionCrashLogger(Field acceleratorField, String logName, String def, String[] options, boolean strictOptions) {
24+
super(acceleratorField, logName, def, options, strictOptions);
25+
}
26+
27+
public void logUpdateSuppression(BlockPos pos) {
28+
if (LoggerRegister.__cceSuppressionCrash) {
29+
super.log(() -> new BaseText[]{
30+
Messenger.c("w CCE suppression crash prevented in: ", "m world tick ", "w - at: ", "g [ " + pos.toShortString() + " ]")
31+
});
32+
}
33+
}
34+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package io.github.optijava.opt_carpet_addition.logger.cceSuppressionCrashLogger;
2+
3+
import net.minecraft.util.math.BlockPos;
4+
5+
public class ThrowableCCESuppression extends RuntimeException{
6+
public final BlockPos pos;
7+
8+
public ThrowableCCESuppression(String message, BlockPos pos) {
9+
super(message);
10+
this.pos = pos;
11+
}
12+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package io.github.optijava.opt_carpet_addition.mixins.rule.cceSuppressionCrashFix;
2+
3+
import io.github.optijava.opt_carpet_addition.OptCarpetSettings;
4+
import io.github.optijava.opt_carpet_addition.logger.cceSuppressionCrashLogger.CCESuppressionCrashLogger;
5+
import io.github.optijava.opt_carpet_addition.logger.cceSuppressionCrashLogger.ThrowableCCESuppression;
6+
import net.minecraft.server.MinecraftServer;
7+
import net.minecraft.server.world.ServerWorld;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
import org.spongepowered.asm.mixin.injection.Inject;
11+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
12+
import org.spongepowered.asm.mixin.injection.callback.LocalCapture;
13+
14+
import java.util.Iterator;
15+
import java.util.function.BooleanSupplier;
16+
17+
@Mixin(MinecraftServer.class)
18+
public class MinecraftServer_Mixin {
19+
20+
@Inject(
21+
method = {"tickWorlds"},
22+
at = {@At(
23+
value = "INVOKE",
24+
target = "Lnet/minecraft/util/crash/CrashReport;create(Ljava/lang/Throwable;Ljava/lang/String;)Lnet/minecraft/util/crash/CrashReport;"
25+
)},
26+
locals = LocalCapture.CAPTURE_FAILHARD,
27+
cancellable = true
28+
)
29+
public void injectTickWorlds(BooleanSupplier shouldKeepTicking, CallbackInfo ci, @SuppressWarnings("all") Iterator var2, ServerWorld serverWorld, Throwable throwable) {
30+
if (OptCarpetSettings.cceSuppressionCrashFix && (throwable instanceof ThrowableCCESuppression || throwable.getCause() instanceof ThrowableCCESuppression)) {
31+
try {
32+
if (throwable instanceof ThrowableCCESuppression) {
33+
CCESuppressionCrashLogger.INSTANCE.logUpdateSuppression(((ThrowableCCESuppression) throwable).pos);
34+
} else {
35+
CCESuppressionCrashLogger.INSTANCE.logUpdateSuppression(((ThrowableCCESuppression) throwable.getCause()).pos);
36+
}
37+
} catch (Exception ignored){}
38+
39+
ci.cancel();
40+
}
41+
}
42+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package io.github.optijava.opt_carpet_addition.mixins.rule.cceSuppressionCrashFix;
2+
3+
import io.github.optijava.opt_carpet_addition.OptCarpetSettings;
4+
import io.github.optijava.opt_carpet_addition.logger.cceSuppressionCrashLogger.ThrowableCCESuppression;
5+
import net.minecraft.block.BlockState;
6+
import net.minecraft.block.ShulkerBoxBlock;
7+
import net.minecraft.inventory.Inventory;
8+
import net.minecraft.screen.ScreenHandler;
9+
import net.minecraft.util.math.BlockPos;
10+
import net.minecraft.world.World;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.injection.At;
13+
import org.spongepowered.asm.mixin.injection.Inject;
14+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
15+
16+
@Mixin(ShulkerBoxBlock.class)
17+
public class ShulkerBoxBlock_Mixin {
18+
19+
@Inject(
20+
method = "getComparatorOutput",
21+
at = @At("HEAD"),
22+
cancellable = true
23+
)
24+
public void injectGetComparatorOutput(BlockState state, World world, BlockPos pos, CallbackInfoReturnable<Integer> cir) {
25+
if (OptCarpetSettings.cceSuppressionCrashFix) {
26+
int var1 = 0;
27+
try {
28+
var1 = ScreenHandler.calculateComparatorOutput((Inventory)((Object)world.getBlockEntity(pos)));
29+
} catch (ClassCastException e) {
30+
throw new ThrowableCCESuppression(e.getMessage(), pos);
31+
}
32+
cir.setReturnValue(var1);
33+
} else {
34+
cir.setReturnValue(ScreenHandler.calculateComparatorOutput((Inventory)((Object)world.getBlockEntity(pos))));
35+
}
36+
}
37+
}

src/main/resources/opt-carpet-addition.mixins.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
"rule.async.optimizePlayerConnect.World_Mixin",
1515
"rule.async.optimizeTeleport.ServerPlayerEntity_Mixin",
1616
"rule.async.optimizeTeleport.ServerPlayNetworkHandler_Mixin",
17+
"rule.cceSuppressionCrashFix.MinecraftServer_Mixin",
18+
"rule.cceSuppressionCrashFix.ShulkerBoxBlock_Mixin",
1719
"rule.commandLogger.CommandManager_Mixin",
1820
"rule.disabledEnderManPickupGoal.EnderManEntity_Mixin",
1921
"rule.disabledEnderManPlaceBlockGoal.EndermanEntity_Mixin",

0 commit comments

Comments
 (0)