Merge branch 'master' into future

This commit is contained in:
gnembon committed 2021-10-20 23:24:52 -03:00
commit 31a6bd21df
14 files changed
+223 -18

No files matched your search

@@ -0,0 +1,57 @@
package carpet.mixins;
import carpet.CarpetSettings;
import carpet.helpers.ThrowableSuppression;
import carpet.logging.LoggerRegistry;
import carpet.utils.Messenger;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.text.BaseText;
import net.minecraft.util.crash.CrashException;
import net.minecraft.util.math.BlockPos;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
import java.util.function.BooleanSupplier;
@Mixin(MinecraftServer.class)
public class MinecraftServer_updateSuppressionCrashFixMixin {
@Redirect(
method = "tickWorlds",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/server/world/ServerWorld;tick(Ljava/util/function/BooleanSupplier;)V"
),
require = 0
)
private void fixUpdateSuppressionCrashTick(ServerWorld serverWorld, BooleanSupplier shouldKeepTicking){
if (!CarpetSettings.updateSuppressionCrashFix) {
serverWorld.tick(shouldKeepTicking);
return;
}
try {
serverWorld.tick(shouldKeepTicking);
} catch (CrashException e) {
if (!(e.getCause() instanceof ThrowableSuppression throwableSuppression)) throw e;
logUpdateSuppression(throwableSuppression.pos);
} catch (ThrowableSuppression e) {
logUpdateSuppression(e.pos);
}
}
private void logUpdateSuppression(BlockPos pos) {
if(LoggerRegistry.__updateSuppressedCrashes) {
LoggerRegistry.getLogger("updateSuppressedCrashes").log(() -> {
return new BaseText[]{Messenger.c(
"w Server crash prevented in: ",
"m world tick ",
"w - at: ",
"g [ " + pos.toShortString() + " ]"
)};
});
}
}
}
@@ -62,7 +62,7 @@ public abstract class ServerChunkManager_tickMixin
// simplified chunk tick iteration assuming world is frozen otherwise as suggested by Hadron67
// to be kept in sync with the original injection source
if (!debug){
List<ChunkHolder> holders = Lists.newArrayList(((ThreadedAnvilChunkStorageInterface)threadedAnvilChunkStorage).getChunks());
List<ChunkHolder> holders = Lists.newArrayList(((ThreadedAnvilChunkStorageInterface)threadedAnvilChunkStorage).getChunksCM());
Collections.shuffle(holders);
for (ChunkHolder holder: holders){
Optional<WorldChunk> optional = holder.getTickingFuture().getNow(ChunkHolder.UNLOADED_WORLD_CHUNK).left();
@@ -0,0 +1,55 @@
package carpet.mixins;
import carpet.CarpetSettings;
import carpet.helpers.ThrowableSuppression;
import carpet.logging.LoggerRegistry;
import carpet.utils.Messenger;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.network.ServerPlayerEntity;
import net.minecraft.text.BaseText;
import net.minecraft.util.crash.CrashException;
import net.minecraft.util.math.BlockPos;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Redirect;
@Mixin(ServerPlayerEntity.class)
public class ServerPlayerEntity_updateSuppressionCrashFixMixin {
@Redirect(
method = "playerTick()V",
at = @At(
value = "INVOKE",
target = "Lnet/minecraft/entity/player/PlayerEntity;tick()V"
),
require = 0
)
private void fixUpdateSuppressionCrashPlayerTick(PlayerEntity playerEntity){
if (!CarpetSettings.updateSuppressionCrashFix) {
playerEntity.tick();
return;
}
try {
playerEntity.tick();
} catch (CrashException e) {
if (!(e.getCause() instanceof ThrowableSuppression throwableSuppression)) throw e;
logUpdateSuppressionPlayer(throwableSuppression.pos);
} catch (ThrowableSuppression e) {
logUpdateSuppressionPlayer(e.pos);
}
}
private void logUpdateSuppressionPlayer(BlockPos pos) {
if(LoggerRegistry.__updateSuppressedCrashes) {
LoggerRegistry.getLogger("updateSuppressedCrashes").log(() -> {
return new BaseText[]{Messenger.c(
"w Server crash prevented in: ",
"m player tick ",
"w - at: ",
"g [ " + pos.toShortString() + " ]"
)};
});
}
}
}
@@ -484,7 +484,7 @@ public abstract class ThreadedAnvilChunkStorage_scarpetChunkCreationMixin implem
}
@Override
public Iterable<ChunkHolder> getChunks() {
public Iterable<ChunkHolder> getChunksCM() {
return entryIterator();
}
}
@@ -0,0 +1,32 @@
package carpet.mixins;
import carpet.CarpetSettings;
import carpet.helpers.ThrowableSuppression;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
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.asm.mixin.injection.callback.LocalCapture;
@Mixin(World.class)
public class World_updateSuppressionCrashFixMixin {
@Inject(
method = "updateNeighbor",
at = @At(
value="INVOKE",
target = "Lnet/minecraft/util/crash/CrashReport;create(Ljava/lang/Throwable;Ljava/lang/String;)Lnet/minecraft/util/crash/CrashReport;"
),
locals = LocalCapture.CAPTURE_FAILHARD,
require = 0
)
public void checkUpdateSuppression(BlockPos sourcePos, Block sourceBlock, BlockPos neighborPos, CallbackInfo ci, BlockState state,Throwable throwable){
if(CarpetSettings.updateSuppressionCrashFix && (throwable instanceof ThrowableSuppression || throwable instanceof StackOverflowError)){
throw new ThrowableSuppression("Update suppression",neighborPos);
}
}
}