Skip to content

Commit 126d56d

Browse files
Fix: Ignore invalid block entity data sent by Java server (#4766)
* Proper block entity checks; ignore invalid block entity data sent by Java server * fix intelliJ warning about potentially null block state * Use auto-generated block entity types instead of hardcoding them * undo some diff * Update BlockRegistryPopulator.java * Access block entity type of state by getting the block first * deprecate JavaBlockState#hasBlockEntity * Simplify check * Add type check in JavaBlockEntityDataTranslator, ensure deprecated setBlockEntity() method still sets piston behavior * nullability annotations * yeet duplicate check
1 parent 34158f9 commit 126d56d

16 files changed

+226
-225
lines changed

api/src/main/java/org/geysermc/geyser/api/block/custom/nonvanilla/JavaBlockState.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ public interface JavaBlockState {
7373
* Gets whether the block state has block entity
7474
*
7575
* @return whether the block state has block entity
76+
* @deprecated Does not have an effect. If you were using this to
77+
* set piston behavior, use {@link #pistonBehavior()} instead.
7678
*/
79+
@Deprecated(forRemoval = true)
7780
boolean hasBlockEntity();
7881

7982
/**
@@ -104,6 +107,11 @@ interface Builder {
104107

105108
Builder pistonBehavior(@Nullable String pistonBehavior);
106109

110+
/**
111+
* @deprecated Does not have an effect. If you were using this to
112+
* * set piston behavior, use {@link #pistonBehavior(String)} instead.
113+
*/
114+
@Deprecated(forRemoval = true)
107115
Builder hasBlockEntity(boolean hasBlockEntity);
108116

109117
JavaBlockState build();

core/src/main/java/org/geysermc/geyser/level/block/Blocks.java

Lines changed: 167 additions & 166 deletions
Large diffs are not rendered by default.

core/src/main/java/org/geysermc/geyser/level/block/GeyserJavaBlockState.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ public class GeyserJavaBlockState implements JavaBlockState {
1616
boolean canBreakWithHand;
1717
String pickItem;
1818
String pistonBehavior;
19-
boolean hasBlockEntity;
2019

2120
private GeyserJavaBlockState(Builder builder) {
2221
this.identifier = builder.identifier;
@@ -28,7 +27,6 @@ private GeyserJavaBlockState(Builder builder) {
2827
this.canBreakWithHand = builder.canBreakWithHand;
2928
this.pickItem = builder.pickItem;
3029
this.pistonBehavior = builder.pistonBehavior;
31-
this.hasBlockEntity = builder.hasBlockEntity;
3230
}
3331

3432
@Override
@@ -76,9 +74,10 @@ public boolean canBreakWithHand() {
7674
return pistonBehavior;
7775
}
7876

77+
@SuppressWarnings("removal")
7978
@Override
8079
public boolean hasBlockEntity() {
81-
return hasBlockEntity;
80+
return false;
8281
}
8382

8483
public static class Builder implements JavaBlockState.Builder {
@@ -91,7 +90,6 @@ public static class Builder implements JavaBlockState.Builder {
9190
private boolean canBreakWithHand;
9291
private String pickItem;
9392
private String pistonBehavior;
94-
private boolean hasBlockEntity;
9593

9694
@Override
9795
public Builder identifier(@NonNull String identifier) {
@@ -147,9 +145,13 @@ public Builder pistonBehavior(@Nullable String pistonBehavior) {
147145
return this;
148146
}
149147

148+
@SuppressWarnings("removal")
150149
@Override
151150
public Builder hasBlockEntity(boolean hasBlockEntity) {
152-
this.hasBlockEntity = hasBlockEntity;
151+
// keep the current behavior
152+
if (this.pistonBehavior == null && hasBlockEntity) {
153+
this.pistonBehavior = "BLOCK";
154+
}
153155
return this;
154156
}
155157

core/src/main/java/org/geysermc/geyser/level/block/type/Block.java

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import it.unimi.dsi.fastutil.ints.IntList;
3030
import net.kyori.adventure.key.Key;
3131
import org.checkerframework.checker.nullness.qual.NonNull;
32+
import org.checkerframework.checker.nullness.qual.Nullable;
3233
import org.cloudburstmc.math.vector.Vector3i;
3334
import org.cloudburstmc.protocol.bedrock.data.definitions.BlockDefinition;
3435
import org.cloudburstmc.protocol.bedrock.packet.UpdateBlockPacket;
@@ -41,6 +42,7 @@
4142
import org.geysermc.geyser.registry.BlockRegistries;
4243
import org.geysermc.geyser.session.GeyserSession;
4344
import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack;
45+
import org.geysermc.mcprotocollib.protocol.data.game.level.block.BlockEntityType;
4446
import org.intellij.lang.annotations.Subst;
4547

4648
import java.util.*;
@@ -55,7 +57,7 @@ public class Block {
5557
* Can you harvest this with your hand.
5658
*/
5759
private final boolean requiresCorrectToolForDrops;
58-
private final boolean hasBlockEntity;
60+
private final @Nullable BlockEntityType blockEntityType;
5961
private final float destroyTime;
6062
private final @NonNull PistonBehavior pushReaction;
6163
/**
@@ -75,7 +77,7 @@ public class Block {
7577
public Block(@Subst("empty") String javaIdentifier, Builder builder) {
7678
this.javaIdentifier = Key.key(javaIdentifier);
7779
this.requiresCorrectToolForDrops = builder.requiresCorrectToolForDrops;
78-
this.hasBlockEntity = builder.hasBlockEntity;
80+
this.blockEntityType = builder.blockEntityType;
7981
this.destroyTime = builder.destroyTime;
8082
this.pushReaction = builder.pushReaction;
8183
this.pickItem = builder.pickItem;
@@ -181,7 +183,12 @@ public boolean requiresCorrectToolForDrops() {
181183
}
182184

183185
public boolean hasBlockEntity() {
184-
return hasBlockEntity;
186+
return blockEntityType != null;
187+
}
188+
189+
@Nullable
190+
public BlockEntityType blockEntityType() {
191+
return blockEntityType;
185192
}
186193

187194
public float destroyTime() {
@@ -227,7 +234,7 @@ public static Builder builder() {
227234
public static final class Builder {
228235
private final Map<Property<?>, List<Comparable<?>>> states = new LinkedHashMap<>();
229236
private boolean requiresCorrectToolForDrops = false;
230-
private boolean hasBlockEntity = false;
237+
private BlockEntityType blockEntityType = null;
231238
private PistonBehavior pushReaction = PistonBehavior.NORMAL;
232239
private float destroyTime;
233240
private Supplier<Item> pickItem;
@@ -271,8 +278,8 @@ public Builder requiresCorrectToolForDrops() {
271278
return this;
272279
}
273280

274-
public Builder setBlockEntity() {
275-
this.hasBlockEntity = true;
281+
public Builder setBlockEntity(BlockEntityType blockEntityType) {
282+
this.blockEntityType = blockEntityType;
276283
return this;
277284
}
278285

core/src/main/java/org/geysermc/geyser/level/block/type/BlockState.java

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,6 @@ public <T extends Comparable<T>> T getValueNullable(Property<T> property) {
6565
return (T) get(property);
6666
}
6767

68-
public boolean getValue(Property<Boolean> property, boolean def) {
69-
var value = get(property);
70-
if (value == null) {
71-
return def;
72-
}
73-
return (Boolean) value;
74-
}
75-
7668
public <T extends Comparable<T>> T getValue(Property<T> property, T def) {
7769
var value = get(property);
7870
if (value == null) {

core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -435,9 +435,6 @@ private static void registerJavaBlocks() {
435435
if (!javaBlockState.canBreakWithHand()) {
436436
builder.requiresCorrectToolForDrops();
437437
}
438-
if (javaBlockState.hasBlockEntity()) {
439-
builder.setBlockEntity();
440-
}
441438
String cleanJavaIdentifier = BlockUtils.getCleanIdentifier(javaBlockState.identifier());
442439
String pickItem = javaBlockState.pickItem();
443440
Block block = new Block(cleanJavaIdentifier, builder) {

core/src/main/java/org/geysermc/geyser/translator/level/block/entity/BrushableBlockEntityTranslator.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737

3838
@BlockEntity(type = BlockEntityType.BRUSHABLE_BLOCK)
3939
public class BrushableBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState {
40-
4140
@Override
4241
public void translateTag(GeyserSession session, NbtMapBuilder bedrockNbt, @Nullable NbtMap javaNbt, BlockState blockState) {
4342
if (javaNbt == null) {

core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DecoratedPotBlockEntityTranslator.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434

3535
@BlockEntity(type = BlockEntityType.DECORATED_POT)
3636
public class DecoratedPotBlockEntityTranslator extends BlockEntityTranslator {
37-
3837
@Override
3938
public void translateTag(GeyserSession session, NbtMapBuilder bedrockNbt, NbtMap javaNbt, BlockState blockState) {
4039
if (javaNbt == null) {

core/src/main/java/org/geysermc/geyser/translator/level/block/entity/DoubleChestBlockEntityTranslator.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727

2828
import org.cloudburstmc.nbt.NbtMap;
2929
import org.cloudburstmc.nbt.NbtMapBuilder;
30-
import org.geysermc.geyser.level.block.Blocks;
3130
import org.geysermc.geyser.level.block.property.ChestType;
3231
import org.geysermc.geyser.level.block.property.Properties;
3332
import org.geysermc.geyser.level.block.type.BlockState;
@@ -40,12 +39,8 @@
4039
*/
4140
@BlockEntity(type = { BlockEntityType.CHEST, BlockEntityType.TRAPPED_CHEST })
4241
public class DoubleChestBlockEntityTranslator extends BlockEntityTranslator implements RequiresBlockState {
43-
4442
@Override
4543
public void translateTag(GeyserSession session, NbtMapBuilder bedrockNbt, NbtMap javaNbt, BlockState blockState) {
46-
if (!(blockState.is(Blocks.CHEST) || blockState.is(Blocks.TRAPPED_CHEST))) {
47-
return;
48-
}
4944
if (blockState.getValue(Properties.CHEST_TYPE) != ChestType.SINGLE) {
5045
int x = (int) bedrockNbt.get("x");
5146
int z = (int) bedrockNbt.get("z");

core/src/main/java/org/geysermc/geyser/translator/level/block/entity/ShulkerBoxBlockEntityTranslator.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.cloudburstmc.nbt.NbtMapBuilder;
3131
import org.geysermc.geyser.level.block.property.Properties;
3232
import org.geysermc.geyser.level.block.type.BlockState;
33-
import org.geysermc.geyser.level.physics.Direction;
3433
import org.geysermc.geyser.session.GeyserSession;
3534
import org.geysermc.geyser.translator.inventory.ShulkerInventoryTranslator;
3635
import org.geysermc.mcprotocollib.protocol.data.game.level.block.BlockEntityType;
@@ -43,6 +42,6 @@ public class ShulkerBoxBlockEntityTranslator extends BlockEntityTranslator imple
4342
*/
4443
@Override
4544
public void translateTag(GeyserSession session, NbtMapBuilder bedrockNbt, @Nullable NbtMap javaNbt, BlockState blockState) {
46-
bedrockNbt.putByte("facing", (byte) blockState.getValue(Properties.FACING, Direction.UP).ordinal());
45+
bedrockNbt.putByte("facing", (byte) blockState.getValue(Properties.FACING).ordinal());
4746
}
4847
}

0 commit comments

Comments
 (0)