|  | 
| 13 | 13 | import net.minecraft.world.level.block.entity.BlockEntity; | 
| 14 | 14 | import net.minecraft.world.level.block.state.BlockState; | 
| 15 | 15 | 
 | 
| 16 |  | -public class SingleBlockServerLevel extends WrappedServerLevel { | 
|  | 16 | +import java.util.HashMap; | 
|  | 17 | +import java.util.Map; | 
| 17 | 18 | 
 | 
| 18 |  | -	public BlockState blockState; | 
| 19 |  | -	public @Nullable BlockEntity blockEntity; | 
|  | 19 | +public class GhostPlacementServerLevel extends WrappedServerLevel { | 
| 20 | 20 | 
 | 
| 21 |  | -	public SingleBlockServerLevel(ServerLevel level) { | 
|  | 21 | +	protected final Map<BlockPos, BlockState> blockStates = new HashMap<>(); | 
|  | 22 | +	protected final Map<BlockPos, BlockEntity> blockEntities = new HashMap<>(); | 
|  | 23 | + | 
|  | 24 | +	public GhostPlacementServerLevel(ServerLevel level) { | 
| 22 | 25 | 		super(level); | 
| 23 |  | -		blockState = Blocks.AIR.defaultBlockState(); | 
| 24 |  | -		blockEntity = null; | 
| 25 | 26 | 	} | 
| 26 | 27 | 
 | 
| 27 | 28 | 	@Override | 
| 28 | 29 | 	public boolean setBlock(BlockPos pos, BlockState newState, int flags) { | 
| 29 |  | -		blockState.onRemove(this, pos, newState, (flags & 64) != 0); | 
| 30 |  | -		blockState = newState; | 
| 31 |  | -		blockEntity = null; | 
|  | 30 | +		pos = pos.immutable(); | 
|  | 31 | +		getBlockState(pos).onRemove(this, pos, newState,false); | 
|  | 32 | +		blockStates.put(pos, newState); | 
| 32 | 33 | 		return true; | 
| 33 | 34 | 	} | 
| 34 | 35 | 
 | 
| 35 | 36 | 	@Override | 
| 36 | 37 | 	public BlockState getBlockState(BlockPos pos) { | 
| 37 |  | -		return blockState; | 
|  | 38 | +		return blockStates.getOrDefault(pos, Blocks.AIR.defaultBlockState()); | 
| 38 | 39 | 	} | 
| 39 | 40 | 
 | 
| 40 | 41 | 	@Nullable | 
| 41 | 42 | 	public BlockEntity getBlockEntity(BlockPos pos) { | 
| 42 |  | -		if (blockState.hasBlockEntity() && blockEntity == null) | 
|  | 43 | +		BlockState blockState = getBlockState(pos); | 
|  | 44 | +		BlockEntity blockEntity = blockEntities.getOrDefault(pos, null); | 
|  | 45 | +		if (blockState.hasBlockEntity() && blockEntity == null) { | 
| 43 | 46 | 			blockEntity = ((EntityBlock) blockState.getBlock()).newBlockEntity(pos, blockState); | 
|  | 47 | +			if(blockEntity != null) | 
|  | 48 | +				blockEntity.setLevel(this); | 
|  | 49 | +			pos = pos.immutable(); | 
|  | 50 | +			blockEntities.put(pos, blockEntity); | 
|  | 51 | +		} | 
| 44 | 52 | 		return blockEntity; | 
| 45 | 53 | 	} | 
| 46 | 54 | 
 | 
|  | 55 | +	@Override | 
|  | 56 | +	public void removeBlockEntity(BlockPos pos) { | 
|  | 57 | +		blockEntities.remove(pos); | 
|  | 58 | +	} | 
|  | 59 | + | 
| 47 | 60 | 	@Override | 
| 48 | 61 | 	public boolean destroyBlock(BlockPos pos, boolean dropBlock, @Nullable Entity entity, int recursionLeft){ | 
|  | 62 | +		BlockState blockState = getBlockState(pos); | 
| 49 | 63 | 		if (blockState.isAir()) | 
| 50 | 64 | 			return false; | 
| 51 | 65 | 		if (dropBlock) | 
| 52 |  | -			Block.dropResources(blockState, this, pos, blockEntity, entity, ItemStack.EMPTY); | 
|  | 66 | +			Block.dropResources(blockState, this, pos, getBlockEntity(pos), entity, ItemStack.EMPTY); | 
| 53 | 67 | 		setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_NONE); | 
| 54 | 68 | 		return true; | 
| 55 | 69 | 	} | 
|  | 
0 commit comments