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:
parent
8737d4f6a8
commit
05fbf0eb5b
@ -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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -8,7 +8,6 @@
|
||||
|
||||
"MixinBlock",
|
||||
"MixinEntity",
|
||||
"MixinLevel",
|
||||
"MixinMatrix4f",
|
||||
"MixinServerLevel",
|
||||
"MixinServerPlayerGameMode"
|
||||
|
Loading…
x
Reference in New Issue
Block a user