|
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