From 200311033f3bcf773b902dcd5342227a50920ca9 Mon Sep 17 00:00:00 2001 From: SquidDev Date: Tue, 14 May 2019 17:17:34 +0100 Subject: [PATCH] Small bodgey patch to fix NPEs when turtles place tiles --- .../shared/mixin/MixinWorld.java | 55 +++++++++++++++++++ src/main/resources/computercraft.common.json | 3 +- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dan200/computercraft/shared/mixin/MixinWorld.java diff --git a/src/main/java/dan200/computercraft/shared/mixin/MixinWorld.java b/src/main/java/dan200/computercraft/shared/mixin/MixinWorld.java new file mode 100644 index 000000000..657713068 --- /dev/null +++ b/src/main/java/dan200/computercraft/shared/mixin/MixinWorld.java @@ -0,0 +1,55 @@ +/* + * This file is part of ComputerCraft - http://www.computercraft.info + * Copyright Daniel Ratcliffe, 2011-2019. Do not distribute without permission. + * Send enquiries to dratcliffe@gmail.com + */ + +package dan200.computercraft.shared.mixin; + +import dan200.computercraft.shared.common.TileGeneric; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.World; +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 javax.annotation.Nullable; +import java.util.Collection; + +/** + * Horrible bodge to ensure a {@link BlockEntity}'s world is always present when setting a TE during another TE's tick. + * + * Forge does this, this is just a bodge to get Fabric in line with that behaviour. + */ +@Mixin( World.class ) +public class MixinWorld +{ + @Shadow + protected boolean iteratingTickingBlockEntities; + + @Inject( method = "setBlockEntity", at = @At( "HEAD" ) ) + public void setBlockEntity( BlockPos pos, @Nullable BlockEntity entity, CallbackInfo info ) + { + if( !World.isHeightInvalid( pos ) && entity != null && !entity.isInvalid() && iteratingTickingBlockEntities ) + { + setWorld( entity, this ); + } + } + + @Inject( method = "addBlockEntities", at = @At( "HEAD" ) ) + public void addBlockEntities( Collection entities, CallbackInfo info ) + { + if( iteratingTickingBlockEntities ) + { + for( BlockEntity entity : entities ) setWorld( entity, this ); + } + } + + private static void setWorld( BlockEntity entity, Object world ) + { + if( entity.getWorld() != world && entity instanceof TileGeneric ) entity.setWorld( (World) world ); + } +} diff --git a/src/main/resources/computercraft.common.json b/src/main/resources/computercraft.common.json index 746f83d16..3d0c652eb 100644 --- a/src/main/resources/computercraft.common.json +++ b/src/main/resources/computercraft.common.json @@ -5,7 +5,8 @@ "mixins": [ "MixinBlock", "MixinEntity", - "MixinServerWorld" + "MixinServerWorld", + "MixinWorld" ], "injectors": { "defaultRequire": 1