diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java index 72e77b908..10c076bac 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java @@ -23,7 +23,7 @@ public class CraftBeacon extends CraftBlockEntityState impleme @Override public Collection getEntitiesInRange() { - Preconditions.checkState(getWorldHandle() instanceof net.minecraft.world.level.World, "Can't get entities during world generation"); + ensureNoWorldGeneration(); TileEntity tileEntity = this.getTileEntityFromWorld(); if (tileEntity instanceof TileEntityBeacon) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java index 1cca73d58..d7485cc1a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java @@ -60,7 +60,7 @@ public class CraftBeehive extends CraftBlockEntityState imple @Override public List releaseEntities() { - Preconditions.checkState(getWorldHandle() instanceof net.minecraft.world.level.World, "Can't release entities during world generation"); + ensureNoWorldGeneration(); List bees = new ArrayList<>(); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index b23f0260c..d29c7bd9b 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -57,20 +57,33 @@ public class CraftBlockState implements BlockState { } } + // Returns null if weakWorld is not available and the BlockState is not placed. + // If this returns a World instead of only a GeneratorAccess, this implies that this BlockState is placed. public GeneratorAccess getWorldHandle() { if (weakWorld == null) { - return world.getHandle(); + return this.isPlaced() ? world.getHandle() : null; } GeneratorAccess access = weakWorld.get(); if (access == null) { weakWorld = null; - return world.getHandle(); + return this.isPlaced() ? world.getHandle() : null; } return access; } + protected final boolean isWorldGeneration() { + GeneratorAccess generatorAccess = this.getWorldHandle(); + return generatorAccess != null && !(generatorAccess instanceof World); + } + + protected final void ensureNoWorldGeneration() { + if (isWorldGeneration()) { + throw new IllegalStateException("This operation is not supported during world generation!"); + } + } + @Override public World getWorld() { requirePlaced(); diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java index adbab4032..3a20de0aa 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java @@ -37,10 +37,8 @@ public class CraftChest extends CraftLootable implements Chest @Override public Inventory getInventory() { - Preconditions.checkState(getWorldHandle() instanceof net.minecraft.world.level.World, "Can't get inventory during world generation, use getBlockInventory() instead"); - CraftInventory inventory = (CraftInventory) this.getBlockInventory(); - if (!isPlaced()) { + if (!isPlaced() || isWorldGeneration()) { return inventory; } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java index 7e429362f..474fe3c77 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java @@ -47,10 +47,8 @@ public class CraftDispenser extends CraftLootable implement @Override public boolean dispense() { - Preconditions.checkState(getWorldHandle() instanceof net.minecraft.world.level.World, "Can't dispense during world generation"); - + ensureNoWorldGeneration(); Block block = getBlock(); - if (block.getType() == Material.DISPENSER) { CraftWorld world = (CraftWorld) this.getWorld(); BlockDispenser dispense = (BlockDispenser) Blocks.DISPENSER; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java index f11296ec1..7df00f693 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java @@ -34,10 +34,8 @@ public class CraftDropper extends CraftLootable implements Dr @Override public void drop() { - Preconditions.checkState(getWorldHandle() instanceof net.minecraft.world.level.World, "Can't drop during world generation"); - + ensureNoWorldGeneration(); Block block = getBlock(); - if (block.getType() == Material.DROPPER) { CraftWorld world = (CraftWorld) this.getWorld(); BlockDropper drop = (BlockDropper) Blocks.DROPPER; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java index 76770318f..469904ee9 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java @@ -81,9 +81,8 @@ public class CraftJukebox extends CraftBlockEntityState imple @Override public boolean eject() { - Preconditions.checkState(getWorldHandle() instanceof net.minecraft.world.level.World, "Can't eject during world generation"); + ensureNoWorldGeneration(); - requirePlaced(); TileEntity tileEntity = this.getTileEntityFromWorld(); if (!(tileEntity instanceof TileEntityJukeBox)) return false; diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java b/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java index 6375e1667..99cf060b6 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java @@ -42,7 +42,7 @@ public class CraftLectern extends CraftBlockEntityState imple public boolean update(boolean force, boolean applyPhysics) { boolean result = super.update(force, applyPhysics); - if (result && this.isPlaced() && this.getType() == Material.LECTERN && getWorldHandle() instanceof net.minecraft.world.level.World) { + if (result && this.getType() == Material.LECTERN && getWorldHandle() instanceof net.minecraft.world.level.World) { BlockLectern.a(this.world.getHandle(), this.getPosition(), this.getHandle()); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java index 1dd43643a..53ee38485 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java @@ -180,7 +180,7 @@ public class CraftStructureBlock extends CraftBlockEntityState