|
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