From 877c941e1f09cc19e388c126fef6b7f38526cf09 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Tue, 18 Jun 2024 08:19:04 +0000 Subject: [PATCH] Add null checks to fix NPEs caused by custom head blocks from Polymer --- .../geyser/entity/type/player/SkullPlayerEntity.java | 4 ++-- .../main/java/org/geysermc/geyser/level/WorldManager.java | 7 ++++++- .../java/org/geysermc/geyser/session/cache/SkullCache.java | 4 ++-- .../level/block/entity/SkullBlockEntityTranslator.java | 4 ++++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java index f2f93b266..0cf8399f7 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/SkullPlayerEntity.java @@ -141,7 +141,7 @@ public class SkullPlayerEntity extends PlayerEntity { float rotation; BlockState blockState = skull.getBlockState(); - if (blockState.block() instanceof WallSkullBlock) { + if (blockState != null && blockState.block() instanceof WallSkullBlock) { y += 0.25f; Direction direction = blockState.getValue(Properties.HORIZONTAL_FACING); rotation = WallSkullBlock.getDegrees(direction); @@ -152,7 +152,7 @@ public class SkullPlayerEntity extends PlayerEntity { case EAST -> x -= 0.24f; } } else { - rotation = (180f + (blockState.getValue(Properties.ROTATION_16) * 22.5f)) % 360; + rotation = (180f + (blockState != null ? blockState.getValue(Properties.ROTATION_16) * 22.5f : 0.0f)) % 360; } moveAbsolute(Vector3f.from(x, y, z), rotation, 0, rotation, true, true); diff --git a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java index 3670b6b73..a18db03fe 100644 --- a/core/src/main/java/org/geysermc/geyser/level/WorldManager.java +++ b/core/src/main/java/org/geysermc/geyser/level/WorldManager.java @@ -33,6 +33,7 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3i; import org.geysermc.erosion.util.BlockPositionIterator; +import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.level.block.type.BlockState; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; @@ -64,7 +65,11 @@ public abstract class WorldManager { @NonNull public BlockState blockAt(GeyserSession session, int x, int y, int z) { - return BlockState.of(this.getBlockAt(session, x, y, z)); + BlockState block = BlockState.of(this.getBlockAt(session, x, y, z)); + if (block == null) { + return BlockState.of(Block.JAVA_AIR_ID); + } + return block; } /** diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java index a40a1156d..43ee38735 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/SkullCache.java @@ -254,10 +254,10 @@ public class SkullCache { CustomSkull customSkull = BlockRegistries.CUSTOM_SKULLS.get(skinHash); if (customSkull != null) { CustomBlockState customBlockState; - if (blockState.block() instanceof WallSkullBlock) { + if (blockState != null && blockState.block() instanceof WallSkullBlock) { customBlockState = customSkull.getWallBlockState(WallSkullBlock.getDegrees(blockState)); } else { - customBlockState = customSkull.getFloorBlockState(blockState.getValue(Properties.ROTATION_16)); + customBlockState = customSkull.getFloorBlockState(blockState != null ? blockState.getValue(Properties.ROTATION_16) : 0); } return session.getBlockMappings().getCustomBlockStateDefinitions().get(customBlockState); diff --git a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java index cdbb20c44..86b88c5c0 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/level/block/entity/SkullBlockEntityTranslator.java @@ -53,6 +53,10 @@ public class SkullBlockEntityTranslator extends BlockEntityTranslator implements @Override public void translateTag(GeyserSession session, NbtMapBuilder bedrockNbt, NbtMap javaNbt, BlockState blockState) { + if (blockState == null) { + bedrockNbt.putByte("SkullType", (byte) 0); + return; + } Integer rotation = blockState.getValue(Properties.ROTATION_16); if (rotation != null) { // Could be a wall skull block otherwise, which has rotation in its Bedrock state