Skip to content

Commit b2475c7

Browse files
authored
Fix some exceptions from SpongeWorld (#2218)
* Fix exception when calling SpongeWorld#setBlock with present block entity * Fix missing block entity metadata in SpongeWorld#getFullBlock
1 parent 882c3dd commit b2475c7

1 file changed

Lines changed: 24 additions & 6 deletions

File tree

worldedit-sponge/src/main/java/com/sk89q/worldedit/sponge/SpongeWorld.java

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121

2222
import com.google.common.collect.Sets;
2323
import com.sk89q.jnbt.CompoundTag;
24+
import com.sk89q.jnbt.CompoundTagBuilder;
25+
import com.sk89q.jnbt.IntTag;
26+
import com.sk89q.jnbt.StringTag;
2427
import com.sk89q.worldedit.EditSession;
2528
import com.sk89q.worldedit.WorldEditException;
2629
import com.sk89q.worldedit.blocks.BaseItemStack;
@@ -57,6 +60,7 @@
5760
import org.spongepowered.api.ResourceKey;
5861
import org.spongepowered.api.Server;
5962
import org.spongepowered.api.Sponge;
63+
import org.spongepowered.api.block.entity.BlockEntity;
6064
import org.spongepowered.api.block.entity.BlockEntityArchetype;
6165
import org.spongepowered.api.block.entity.BlockEntityType;
6266
import org.spongepowered.api.entity.EntityArchetype;
@@ -152,11 +156,25 @@ public BlockState getBlock(BlockVector3 position) {
152156

153157
@Override
154158
public BaseBlock getFullBlock(BlockVector3 position) {
155-
CompoundTag entity = getWorld()
156-
.blockEntity(position.getX(), position.getY(), position.getZ())
157-
.map(e -> NbtAdapter.adaptToWorldEdit(e.createArchetype().blockEntityData()))
158-
.orElse(null);
159-
return getBlock(position).toBaseBlock(entity);
159+
BlockEntity blockEntity = getWorld().blockEntity(
160+
position.getX(), position.getY(), position.getZ()
161+
).orElse(null);
162+
CompoundTag blockEntityData = null;
163+
if (blockEntity != null) {
164+
BlockEntityArchetype blockEntityArchetype = blockEntity.createArchetype();
165+
BlockEntityType blockEntityType = blockEntityArchetype.blockEntityType();
166+
ResourceKey blockEntityId = blockEntityType.key(RegistryTypes.BLOCK_ENTITY_TYPE);
167+
blockEntityData = NbtAdapter.adaptToWorldEdit(blockEntityArchetype.blockEntityData());
168+
169+
// Add ID and position since Sponge's #blockEntityData does not save metadata
170+
CompoundTagBuilder fullBlockEntityDataBuilder = blockEntityData.createBuilder();
171+
fullBlockEntityDataBuilder.put("id", new StringTag(blockEntityId.formatted()));
172+
fullBlockEntityDataBuilder.put("x", new IntTag(position.getX()));
173+
fullBlockEntityDataBuilder.put("y", new IntTag(position.getY()));
174+
fullBlockEntityDataBuilder.put("z", new IntTag(position.getZ()));
175+
blockEntityData = fullBlockEntityDataBuilder.build();
176+
}
177+
return getBlock(position).toBaseBlock(blockEntityData);
160178
}
161179

162180
@Override
@@ -195,7 +213,7 @@ public <B extends BlockStateHolder<B>> boolean setBlock(BlockVector3 position, B
195213
BaseBlock baseBlock = (BaseBlock) block;
196214
BlockEntityArchetype.builder()
197215
.blockEntity((BlockEntityType)
198-
world.engine().registry(RegistryTypes.BLOCK_ENTITY_TYPE)
216+
Sponge.game().registry(RegistryTypes.BLOCK_ENTITY_TYPE)
199217
.value(ResourceKey.resolve(baseBlock.getNbtId()))
200218
)
201219
.blockEntityData(NbtAdapter.adaptFromWorldEdit(baseBlock.getNbtData()))

0 commit comments

Comments
 (0)