1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-08-27 07:52:18 +00:00

Fix NPE when pistons extend (#43).

- MixinLevel was needed in <= 1.16 to make sure pending block entities
had a valid world, but in 1.17 and up all block entities have their
world set immediately (after checking that their blockPos is valid).
- Unfortunately, this bug leaves broken pistons in the world :(
A piston will never seem to extend in the block location where the game
hit the NPE, even if other block entities are put in that position
and replaced with a new piston...
This commit is contained in:
Toad-Dev 2021-12-20 09:07:05 -08:00
parent 8737d4f6a8
commit 05fbf0eb5b
2 changed files with 0 additions and 60 deletions

View File

@ -1,59 +0,0 @@
/*
* This file is part of ComputerCraft - http://www.computercraft.info
* Copyright Daniel Ratcliffe, 2011-2021. Do not distribute without permission.
* Send enquiries to dratcliffe@gmail.com
*/
package dan200.computercraft.fabric.mixin;
import dan200.computercraft.shared.common.TileGeneric;
import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.entity.BlockEntity;
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( Level.class )
public class MixinLevel
{
@Shadow
protected boolean tickingBlockEntities;
@Inject( method = "setBlockEntity", at = @At( "HEAD" ) )
public void setBlockEntity( @Nullable BlockEntity entity, CallbackInfo info )
{
if( entity != null && !entity.isRemoved() && entity.getLevel().isInWorldBounds( entity.getBlockPos() ) && tickingBlockEntities )
{
setWorld( entity, this );
}
}
private static void setWorld( BlockEntity entity, Object world )
{
if( entity.getLevel() != world && entity instanceof TileGeneric )
{
entity.setLevel( (Level) world ); //TODO why?
}
}
// @Inject( method = "addBlockEntities", at = @At( "HEAD" ) )
public void addBlockEntities( Collection<BlockEntity> entities, CallbackInfo info )
{
if( tickingBlockEntities )
{
for( BlockEntity entity : entities )
{
setWorld( entity, this );
}
}
}
}

View File

@ -8,7 +8,6 @@
"MixinBlock",
"MixinEntity",
"MixinLevel",
"MixinMatrix4f",
"MixinServerLevel",
"MixinServerPlayerGameMode"