Skip to content

Commit 0d275fc

Browse files
committed
better name, extended storage, building height case
1 parent 88fc285 commit 0d275fc

File tree

2 files changed

+37
-23
lines changed

2 files changed

+37
-23
lines changed

src/main/java/com/simibubi/create/content/contraptions/Contraption.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1144,7 +1144,7 @@ public void addBlocksToWorld(Level world, StructureTransform transform) {
11441144

11451145
translateMultiblockControllers(transform);
11461146

1147-
SingleBlockServerLevel popChamber = null;
1147+
GhostPlacementServerLevel ghostLevel = null;
11481148

11491149
for (boolean nonBrittles : Iterate.trueAndFalse) {
11501150
for (StructureBlockInfo block : blocks.values()) {
@@ -1163,26 +1163,26 @@ public void addBlocksToWorld(Level world, StructureTransform transform) {
11631163
targetPos.relative(face));
11641164

11651165
BlockState blockState = world.getBlockState(targetPos);
1166-
if (blockState.getDestroySpeed(world, targetPos) == -1 || (state.getCollisionShape(world, targetPos)
1167-
.isEmpty()
1168-
&& !blockState.getCollisionShape(world, targetPos)
1169-
.isEmpty())) {
1166+
if (world.isOutsideBuildHeight(targetPos) ||
1167+
blockState.getDestroySpeed(world, targetPos) == -1 ||
1168+
(state.getCollisionShape(world, targetPos).isEmpty() &&
1169+
!blockState.getCollisionShape(world, targetPos).isEmpty())) {
11701170
if (targetPos.getY() == world.getMinBuildHeight())
11711171
targetPos = targetPos.above();
11721172

1173-
if(popChamber == null && world instanceof ServerLevel serverWorld)
1174-
popChamber = new SingleBlockServerLevel(serverWorld);
1173+
if(ghostLevel == null && world instanceof ServerLevel serverWorld)
1174+
ghostLevel = new GhostPlacementServerLevel(serverWorld);
11751175

1176-
if(popChamber != null){
1177-
popChamber.setBlock(targetPos, state, Block.UPDATE_NONE);
1178-
BlockEntity be = popChamber.getBlockEntity(targetPos);
1176+
if(ghostLevel != null){
1177+
ghostLevel.setBlock(targetPos, state, Block.UPDATE_NONE);
1178+
BlockEntity be = ghostLevel.getBlockEntity(targetPos);
11791179
if (be != null) {
11801180
CompoundTag tag = block.nbt();
11811181
tag = NBTProcessors.process(state, be, tag, false);
11821182
if (tag != null)
11831183
be.load(tag);
11841184
}
1185-
popChamber.destroyBlock(targetPos, true);
1185+
ghostLevel.destroyBlock(targetPos, true);
11861186
}
11871187
world.levelEvent(2001, targetPos, Block.getId(state));
11881188
continue;

src/main/java/com/simibubi/create/content/contraptions/SingleBlockServerLevel.java renamed to src/main/java/com/simibubi/create/content/contraptions/GhostPlacementServerLevel.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,43 +13,57 @@
1313
import net.minecraft.world.level.block.entity.BlockEntity;
1414
import net.minecraft.world.level.block.state.BlockState;
1515

16-
public class SingleBlockServerLevel extends WrappedServerLevel {
16+
import java.util.HashMap;
17+
import java.util.Map;
1718

18-
public BlockState blockState;
19-
public @Nullable BlockEntity blockEntity;
19+
public class GhostPlacementServerLevel extends WrappedServerLevel {
2020

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) {
2225
super(level);
23-
blockState = Blocks.AIR.defaultBlockState();
24-
blockEntity = null;
2526
}
2627

2728
@Override
2829
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);
3233
return true;
3334
}
3435

3536
@Override
3637
public BlockState getBlockState(BlockPos pos) {
37-
return blockState;
38+
return blockStates.getOrDefault(pos, Blocks.AIR.defaultBlockState());
3839
}
3940

4041
@Nullable
4142
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) {
4346
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+
}
4452
return blockEntity;
4553
}
4654

55+
@Override
56+
public void removeBlockEntity(BlockPos pos) {
57+
blockEntities.remove(pos);
58+
}
59+
4760
@Override
4861
public boolean destroyBlock(BlockPos pos, boolean dropBlock, @Nullable Entity entity, int recursionLeft){
62+
BlockState blockState = getBlockState(pos);
4963
if (blockState.isAir())
5064
return false;
5165
if (dropBlock)
52-
Block.dropResources(blockState, this, pos, blockEntity, entity, ItemStack.EMPTY);
66+
Block.dropResources(blockState, this, pos, getBlockEntity(pos), entity, ItemStack.EMPTY);
5367
setBlock(pos, Blocks.AIR.defaultBlockState(), Block.UPDATE_NONE);
5468
return true;
5569
}

0 commit comments

Comments
 (0)