From dc764e7a2f9272e72a3f37c6770c9c0f7ea83d43 Mon Sep 17 00:00:00 2001 From: blablubbabc Date: Wed, 29 Sep 2021 18:56:16 +1000 Subject: [PATCH] #877: Improve and simplify CraftBlockState --- .../net/minecraft/world/item/ItemBlock.patch | 2 +- .../level/block/BlockConcretePowder.patch | 13 +- .../world/level/block/BlockFire.patch | 19 +- .../level/block/LayeredCauldronBlock.patch | 11 +- .../bukkit/craftbukkit/block/CraftBanner.java | 11 +- .../bukkit/craftbukkit/block/CraftBarrel.java | 11 +- .../bukkit/craftbukkit/block/CraftBeacon.java | 11 +- .../bukkit/craftbukkit/block/CraftBed.java | 11 +- .../craftbukkit/block/CraftBeehive.java | 11 +- .../bukkit/craftbukkit/block/CraftBell.java | 11 +- .../craftbukkit/block/CraftBlastFurnace.java | 11 +- .../bukkit/craftbukkit/block/CraftBlock.java | 170 +------ .../block/CraftBlockEntityState.java | 33 +- .../craftbukkit/block/CraftBlockState.java | 28 +- .../craftbukkit/block/CraftBlockStates.java | 385 ++++++++++++++ .../craftbukkit/block/CraftBrewingStand.java | 11 +- .../craftbukkit/block/CraftCampfire.java | 11 +- .../bukkit/craftbukkit/block/CraftChest.java | 10 +- .../craftbukkit/block/CraftCommandBlock.java | 11 +- .../craftbukkit/block/CraftComparator.java | 11 +- .../craftbukkit/block/CraftConduit.java | 11 +- .../craftbukkit/block/CraftContainer.java | 11 +- .../block/CraftCreatureSpawner.java | 11 +- .../block/CraftDaylightDetector.java | 11 +- .../craftbukkit/block/CraftDispenser.java | 9 +- .../craftbukkit/block/CraftDropper.java | 9 +- .../block/CraftEnchantingTable.java | 11 +- .../craftbukkit/block/CraftEndGateway.java | 11 +- .../craftbukkit/block/CraftEndPortal.java | 11 + .../craftbukkit/block/CraftEnderChest.java | 11 +- .../craftbukkit/block/CraftFurnace.java | 11 +- .../block/CraftFurnaceFurnace.java | 11 +- .../bukkit/craftbukkit/block/CraftHopper.java | 11 +- .../bukkit/craftbukkit/block/CraftJigsaw.java | 11 +- .../craftbukkit/block/CraftJukebox.java | 10 +- .../craftbukkit/block/CraftLectern.java | 10 +- .../craftbukkit/block/CraftLootable.java | 11 +- .../craftbukkit/block/CraftMovingPiston.java | 11 + .../craftbukkit/block/CraftSculkSensor.java | 11 +- .../craftbukkit/block/CraftShulkerBox.java | 16 +- .../bukkit/craftbukkit/block/CraftSign.java | 11 +- .../bukkit/craftbukkit/block/CraftSkull.java | 11 +- .../bukkit/craftbukkit/block/CraftSmoker.java | 11 +- .../block/CraftStructureBlock.java | 11 +- .../craftbukkit/event/CraftEventFactory.java | 9 +- .../inventory/CraftMetaBlockState.java | 476 +----------------- .../craftbukkit/block/BlockStateTest.java | 28 ++ 47 files changed, 591 insertions(+), 977 deletions(-) create mode 100644 src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java create mode 100644 src/main/java/org/bukkit/craftbukkit/block/CraftEndPortal.java create mode 100644 src/main/java/org/bukkit/craftbukkit/block/CraftMovingPiston.java create mode 100644 src/test/java/org/bukkit/craftbukkit/block/BlockStateTest.java diff --git a/nms-patches/net/minecraft/world/item/ItemBlock.patch b/nms-patches/net/minecraft/world/item/ItemBlock.patch index f7b150d46..d7f9148db 100644 --- a/nms-patches/net/minecraft/world/item/ItemBlock.patch +++ b/nms-patches/net/minecraft/world/item/ItemBlock.patch @@ -21,7 +21,7 @@ + // CraftBukkit start - special case for handling block placement with water lilies and snow buckets + org.bukkit.block.BlockState blockstate = null; + if (this instanceof ItemWaterLily || this instanceof SolidBucketItem) { -+ blockstate = org.bukkit.craftbukkit.block.CraftBlockState.getBlockState(blockactioncontext1.getWorld(), blockactioncontext1.getClickPosition()); ++ blockstate = org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(blockactioncontext1.getWorld(), blockactioncontext1.getClickPosition()); + } + // CraftBukkit end diff --git a/nms-patches/net/minecraft/world/level/block/BlockConcretePowder.patch b/nms-patches/net/minecraft/world/level/block/BlockConcretePowder.patch index d52156f1c..163789e6c 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockConcretePowder.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockConcretePowder.patch @@ -1,18 +1,19 @@ --- a/net/minecraft/world/level/block/BlockConcretePowder.java +++ b/net/minecraft/world/level/block/BlockConcretePowder.java -@@ -13,6 +13,11 @@ +@@ -13,6 +13,12 @@ import net.minecraft.world.level.block.state.BlockBase; import net.minecraft.world.level.block.state.IBlockData; +// CraftBukkit start +import org.bukkit.craftbukkit.block.CraftBlockState; ++import org.bukkit.craftbukkit.block.CraftBlockStates; +import org.bukkit.event.block.BlockFormEvent; +// CraftBukkit end + public class BlockConcretePowder extends BlockFalling { private final IBlockData concrete; -@@ -25,7 +30,7 @@ +@@ -25,7 +31,7 @@ @Override public void a(World world, BlockPosition blockposition, IBlockData iblockdata, IBlockData iblockdata1, EntityFallingBlock entityfallingblock) { if (canHarden(world, blockposition, iblockdata1)) { @@ -21,7 +22,7 @@ } } -@@ -36,7 +41,24 @@ +@@ -36,7 +42,24 @@ BlockPosition blockposition = blockactioncontext.getClickPosition(); IBlockData iblockdata = world.getType(blockposition); @@ -32,7 +33,7 @@ + } + + // TODO: An event factory call for methods like this -+ CraftBlockState blockState = CraftBlockState.getBlockState(world, blockposition); ++ CraftBlockState blockState = CraftBlockStates.getBlockState(world, blockposition); + blockState.setData(this.concrete); + + BlockFormEvent event = new BlockFormEvent(blockState.getBlock(), blockState); @@ -47,7 +48,7 @@ } private static boolean canHarden(IBlockAccess iblockaccess, BlockPosition blockposition, IBlockData iblockdata) { -@@ -72,7 +94,25 @@ +@@ -72,7 +95,25 @@ @Override public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) { @@ -58,7 +59,7 @@ + if (!(generatoraccess instanceof World)) { + return this.concrete; + } -+ CraftBlockState blockState = CraftBlockState.getBlockState(generatoraccess, blockposition); ++ CraftBlockState blockState = CraftBlockStates.getBlockState(generatoraccess, blockposition); + blockState.setData(this.concrete); + + BlockFormEvent event = new BlockFormEvent(blockState.getBlock(), blockState); diff --git a/nms-patches/net/minecraft/world/level/block/BlockFire.patch b/nms-patches/net/minecraft/world/level/block/BlockFire.patch index 867afd04f..7769de27c 100644 --- a/nms-patches/net/minecraft/world/level/block/BlockFire.patch +++ b/nms-patches/net/minecraft/world/level/block/BlockFire.patch @@ -1,11 +1,12 @@ --- a/net/minecraft/world/level/block/BlockFire.java +++ b/net/minecraft/world/level/block/BlockFire.java -@@ -28,6 +28,13 @@ +@@ -28,6 +28,14 @@ import net.minecraft.world.phys.shapes.VoxelShapeCollision; import net.minecraft.world.phys.shapes.VoxelShapes; +// CraftBukkit start +import org.bukkit.craftbukkit.block.CraftBlockState; ++import org.bukkit.craftbukkit.block.CraftBlockStates; +import org.bukkit.craftbukkit.event.CraftEventFactory; +import org.bukkit.event.block.BlockBurnEvent; +import org.bukkit.event.block.BlockFadeEvent; @@ -14,7 +15,7 @@ public class BlockFire extends BlockFireAbstract { public static final int MAX_AGE = 15; -@@ -93,7 +100,24 @@ +@@ -93,7 +101,24 @@ @Override public IBlockData updateState(IBlockData iblockdata, EnumDirection enumdirection, IBlockData iblockdata1, GeneratorAccess generatoraccess, BlockPosition blockposition, BlockPosition blockposition1) { @@ -25,7 +26,7 @@ + if (!(generatoraccess instanceof World)) { + return Blocks.AIR.getBlockData(); + } -+ CraftBlockState blockState = CraftBlockState.getBlockState(generatoraccess, blockposition); ++ CraftBlockState blockState = CraftBlockStates.getBlockState(generatoraccess, blockposition); + blockState.setData(Blocks.AIR.getBlockData()); + + BlockFadeEvent event = new BlockFadeEvent(blockState.getBlock(), blockState); @@ -40,7 +41,7 @@ } @Override -@@ -142,7 +166,7 @@ +@@ -142,7 +167,7 @@ worldserver.getBlockTickList().a(blockposition, this, a(worldserver.random)); if (worldserver.getGameRules().getBoolean(GameRules.RULE_DOFIRETICK)) { if (!iblockdata.canPlace(worldserver, blockposition)) { @@ -49,7 +50,7 @@ } IBlockData iblockdata1 = worldserver.getType(blockposition.down()); -@@ -150,7 +174,7 @@ +@@ -150,7 +175,7 @@ int i = (Integer) iblockdata.get(BlockFire.AGE); if (!flag && worldserver.isRaining() && this.a((World) worldserver, blockposition) && random.nextFloat() < 0.2F + (float) i * 0.03F) { @@ -58,7 +59,7 @@ } else { int j = Math.min(15, i + random.nextInt(3) / 2); -@@ -164,14 +188,14 @@ +@@ -164,14 +189,14 @@ BlockPosition blockposition1 = blockposition.down(); if (!worldserver.getType(blockposition1).d(worldserver, blockposition1, EnumDirection.UP) || i > 3) { @@ -75,7 +76,7 @@ return; } } -@@ -179,12 +203,14 @@ +@@ -179,12 +204,14 @@ boolean flag1 = worldserver.u(blockposition); int k = flag1 ? -50 : 0; @@ -96,7 +97,7 @@ BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(); for (int l = -1; l <= 1; ++l) { -@@ -210,7 +236,15 @@ +@@ -210,7 +237,15 @@ if (i2 > 0 && random.nextInt(k1) <= i2 && (!worldserver.isRaining() || !this.a((World) worldserver, (BlockPosition) blockposition_mutableblockposition))) { int j2 = Math.min(15, i + random.nextInt(5) / 4); @@ -113,7 +114,7 @@ } } } -@@ -234,12 +268,24 @@ +@@ -234,12 +269,24 @@ return iblockdata.b(BlockProperties.WATERLOGGED) && (Boolean) iblockdata.get(BlockProperties.WATERLOGGED) ? 0 : this.flameOdds.getInt(iblockdata.getBlock()); } diff --git a/nms-patches/net/minecraft/world/level/block/LayeredCauldronBlock.patch b/nms-patches/net/minecraft/world/level/block/LayeredCauldronBlock.patch index 09c93f629..aa7893e6f 100644 --- a/nms-patches/net/minecraft/world/level/block/LayeredCauldronBlock.patch +++ b/nms-patches/net/minecraft/world/level/block/LayeredCauldronBlock.patch @@ -1,18 +1,19 @@ --- a/net/minecraft/world/level/block/LayeredCauldronBlock.java +++ b/net/minecraft/world/level/block/LayeredCauldronBlock.java -@@ -17,6 +17,11 @@ +@@ -17,6 +17,12 @@ import net.minecraft.world.level.material.FluidType; import net.minecraft.world.level.material.FluidTypes; +// CraftBukkit start +import org.bukkit.craftbukkit.block.CraftBlockState; ++import org.bukkit.craftbukkit.block.CraftBlockStates; +import org.bukkit.event.block.CauldronLevelChangeEvent; +// CraftBukkit end + public class LayeredCauldronBlock extends AbstractCauldronBlock { public static final int MIN_FILL_LEVEL = 1; -@@ -56,10 +61,14 @@ +@@ -56,10 +62,14 @@ @Override public void a(IBlockData iblockdata, World world, BlockPosition blockposition, Entity entity) { if (!world.isClientSide && entity.isBurning() && this.a(iblockdata, blockposition, entity)) { @@ -29,7 +30,7 @@ } } -@@ -69,15 +78,38 @@ +@@ -69,15 +79,38 @@ } public static void e(IBlockData iblockdata, World world, BlockPosition blockposition) { @@ -46,7 +47,7 @@ + // CraftBukkit start + public static boolean changeLevel(IBlockData iblockdata, World world, BlockPosition blockposition, IBlockData newBlock, Entity entity, CauldronLevelChangeEvent.ChangeReason reason) { -+ CraftBlockState newState = CraftBlockState.getBlockState(world, blockposition); ++ CraftBlockState newState = CraftBlockStates.getBlockState(world, blockposition); + newState.setData(newBlock); + + CauldronLevelChangeEvent event = new CauldronLevelChangeEvent( @@ -70,7 +71,7 @@ } } -@@ -94,7 +126,11 @@ +@@ -94,7 +127,11 @@ @Override protected void a(IBlockData iblockdata, World world, BlockPosition blockposition, FluidType fluidtype) { if (!this.c(iblockdata)) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java index 520309eb8..af06f630c 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBanner.java @@ -9,9 +9,8 @@ import net.minecraft.world.item.EnumColor; import net.minecraft.world.level.block.BlockBannerAbstract; import net.minecraft.world.level.block.entity.TileEntityBanner; import org.bukkit.DyeColor; -import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Banner; -import org.bukkit.block.Block; import org.bukkit.block.banner.Pattern; import org.bukkit.block.banner.PatternType; @@ -20,12 +19,8 @@ public class CraftBanner extends CraftBlockEntityState impleme private DyeColor base; private List patterns; - public CraftBanner(final Block block) { - super(block, TileEntityBanner.class); - } - - public CraftBanner(final Material material, final TileEntityBanner te) { - super(material, te); + public CraftBanner(World world, TileEntityBanner tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBarrel.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBarrel.java index 300923cd0..bc324e162 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBarrel.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBarrel.java @@ -4,20 +4,15 @@ import net.minecraft.sounds.SoundEffects; import net.minecraft.world.level.block.BlockBarrel; import net.minecraft.world.level.block.entity.TileEntityBarrel; import net.minecraft.world.level.block.state.IBlockData; -import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Barrel; -import org.bukkit.block.Block; import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.inventory.Inventory; public class CraftBarrel extends CraftLootable implements Barrel { - public CraftBarrel(Block block) { - super(block, TileEntityBarrel.class); - } - - public CraftBarrel(Material material, TileEntityBarrel te) { - super(material, te); + public CraftBarrel(World world, TileEntityBarrel tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java index 0e74937a6..72e77b908 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeacon.java @@ -8,9 +8,8 @@ import net.minecraft.world.effect.MobEffectList; import net.minecraft.world.entity.player.EntityHuman; import net.minecraft.world.level.block.entity.TileEntity; import net.minecraft.world.level.block.entity.TileEntityBeacon; -import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Beacon; -import org.bukkit.block.Block; import org.bukkit.craftbukkit.util.CraftChatMessage; import org.bukkit.entity.LivingEntity; import org.bukkit.potion.PotionEffect; @@ -18,12 +17,8 @@ import org.bukkit.potion.PotionEffectType; public class CraftBeacon extends CraftBlockEntityState implements Beacon { - public CraftBeacon(final Block block) { - super(block, TileEntityBeacon.class); - } - - public CraftBeacon(final Material material, final TileEntityBeacon te) { - super(material, te); + public CraftBeacon(World world, TileEntityBeacon tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java index 418e525e6..2fb4c1383 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBed.java @@ -2,18 +2,13 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityBed; import org.bukkit.DyeColor; -import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Bed; -import org.bukkit.block.Block; public class CraftBed extends CraftBlockEntityState implements Bed { - public CraftBed(Block block) { - super(block, TileEntityBed.class); - } - - public CraftBed(Material material, TileEntityBed te) { - super(material, te); + public CraftBed(World world, TileEntityBed tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java index 3474ca6c1..1cca73d58 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBeehive.java @@ -8,20 +8,15 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.level.block.entity.TileEntityBeehive; import net.minecraft.world.level.block.entity.TileEntityBeehive.ReleaseStatus; import org.bukkit.Location; -import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Beehive; -import org.bukkit.block.Block; import org.bukkit.craftbukkit.entity.CraftBee; import org.bukkit.entity.Bee; public class CraftBeehive extends CraftBlockEntityState implements Beehive { - public CraftBeehive(final Block block) { - super(block, TileEntityBeehive.class); - } - - public CraftBeehive(final Material material, final TileEntityBeehive te) { - super(material, te); + public CraftBeehive(World world, TileEntityBeehive tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBell.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBell.java index b2b34ff0a..02d1c7e2f 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBell.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBell.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityBell; -import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Bell; -import org.bukkit.block.Block; public class CraftBell extends CraftBlockEntityState implements Bell { - public CraftBell(Block block) { - super(block, TileEntityBell.class); - } - - public CraftBell(Material material, TileEntityBell te) { - super(material, te); + public CraftBell(World world, TileEntityBell tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlastFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlastFurnace.java index 39fd6ebf7..a0778746e 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlastFurnace.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlastFurnace.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityBlastFurnace; -import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.BlastFurnace; -import org.bukkit.block.Block; public class CraftBlastFurnace extends CraftFurnace implements BlastFurnace { - public CraftBlastFurnace(Block block) { - super(block, TileEntityBlastFurnace.class); - } - - public CraftBlastFurnace(Material material, TileEntityBlastFurnace te) { - super(material, te); + public CraftBlastFurnace(World world, TileEntityBlastFurnace tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java index bb31c71ac..12aac2a6d 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlock.java @@ -20,7 +20,6 @@ import net.minecraft.world.level.RayTrace; import net.minecraft.world.level.biome.BiomeBase; import net.minecraft.world.level.block.BlockRedstoneWire; import net.minecraft.world.level.block.Blocks; -import net.minecraft.world.level.block.entity.TileEntity; import net.minecraft.world.level.block.state.IBlockData; import net.minecraft.world.phys.AxisAlignedBB; import net.minecraft.world.phys.MovingObjectPosition; @@ -318,174 +317,7 @@ public class CraftBlock implements Block { @Override public BlockState getState() { - Material material = getType(); - - switch (material) { - case ACACIA_SIGN: - case ACACIA_WALL_SIGN: - case BIRCH_SIGN: - case BIRCH_WALL_SIGN: - case CRIMSON_SIGN: - case CRIMSON_WALL_SIGN: - case DARK_OAK_SIGN: - case DARK_OAK_WALL_SIGN: - case JUNGLE_SIGN: - case JUNGLE_WALL_SIGN: - case OAK_SIGN: - case OAK_WALL_SIGN: - case SPRUCE_SIGN: - case SPRUCE_WALL_SIGN: - case WARPED_SIGN: - case WARPED_WALL_SIGN: - return new CraftSign(this); - case CHEST: - case TRAPPED_CHEST: - return new CraftChest(this); - case FURNACE: - return new CraftFurnaceFurnace(this); - case DISPENSER: - return new CraftDispenser(this); - case DROPPER: - return new CraftDropper(this); - case END_GATEWAY: - return new CraftEndGateway(this); - case HOPPER: - return new CraftHopper(this); - case SPAWNER: - return new CraftCreatureSpawner(this); - case JUKEBOX: - return new CraftJukebox(this); - case BREWING_STAND: - return new CraftBrewingStand(this); - case CREEPER_HEAD: - case CREEPER_WALL_HEAD: - case DRAGON_HEAD: - case DRAGON_WALL_HEAD: - case PLAYER_HEAD: - case PLAYER_WALL_HEAD: - case SKELETON_SKULL: - case SKELETON_WALL_SKULL: - case WITHER_SKELETON_SKULL: - case WITHER_SKELETON_WALL_SKULL: - case ZOMBIE_HEAD: - case ZOMBIE_WALL_HEAD: - return new CraftSkull(this); - case COMMAND_BLOCK: - case CHAIN_COMMAND_BLOCK: - case REPEATING_COMMAND_BLOCK: - return new CraftCommandBlock(this); - case BEACON: - return new CraftBeacon(this); - case BLACK_BANNER: - case BLACK_WALL_BANNER: - case BLUE_BANNER: - case BLUE_WALL_BANNER: - case BROWN_BANNER: - case BROWN_WALL_BANNER: - case CYAN_BANNER: - case CYAN_WALL_BANNER: - case GRAY_BANNER: - case GRAY_WALL_BANNER: - case GREEN_BANNER: - case GREEN_WALL_BANNER: - case LIGHT_BLUE_BANNER: - case LIGHT_BLUE_WALL_BANNER: - case LIGHT_GRAY_BANNER: - case LIGHT_GRAY_WALL_BANNER: - case LIME_BANNER: - case LIME_WALL_BANNER: - case MAGENTA_BANNER: - case MAGENTA_WALL_BANNER: - case ORANGE_BANNER: - case ORANGE_WALL_BANNER: - case PINK_BANNER: - case PINK_WALL_BANNER: - case PURPLE_BANNER: - case PURPLE_WALL_BANNER: - case RED_BANNER: - case RED_WALL_BANNER: - case WHITE_BANNER: - case WHITE_WALL_BANNER: - case YELLOW_BANNER: - case YELLOW_WALL_BANNER: - return new CraftBanner(this); - case STRUCTURE_BLOCK: - return new CraftStructureBlock(this); - case SHULKER_BOX: - case WHITE_SHULKER_BOX: - case ORANGE_SHULKER_BOX: - case MAGENTA_SHULKER_BOX: - case LIGHT_BLUE_SHULKER_BOX: - case YELLOW_SHULKER_BOX: - case LIME_SHULKER_BOX: - case PINK_SHULKER_BOX: - case GRAY_SHULKER_BOX: - case LIGHT_GRAY_SHULKER_BOX: - case CYAN_SHULKER_BOX: - case PURPLE_SHULKER_BOX: - case BLUE_SHULKER_BOX: - case BROWN_SHULKER_BOX: - case GREEN_SHULKER_BOX: - case RED_SHULKER_BOX: - case BLACK_SHULKER_BOX: - return new CraftShulkerBox(this); - case ENCHANTING_TABLE: - return new CraftEnchantingTable(this); - case ENDER_CHEST: - return new CraftEnderChest(this); - case DAYLIGHT_DETECTOR: - return new CraftDaylightDetector(this); - case COMPARATOR: - return new CraftComparator(this); - case BLACK_BED: - case BLUE_BED: - case BROWN_BED: - case CYAN_BED: - case GRAY_BED: - case GREEN_BED: - case LIGHT_BLUE_BED: - case LIGHT_GRAY_BED: - case LIME_BED: - case MAGENTA_BED: - case ORANGE_BED: - case PINK_BED: - case PURPLE_BED: - case RED_BED: - case WHITE_BED: - case YELLOW_BED: - return new CraftBed(this); - case CONDUIT: - return new CraftConduit(this); - case BARREL: - return new CraftBarrel(this); - case BELL: - return new CraftBell(this); - case BLAST_FURNACE: - return new CraftBlastFurnace(this); - case CAMPFIRE: - case SOUL_CAMPFIRE: - return new CraftCampfire(this); - case JIGSAW: - return new CraftJigsaw(this); - case LECTERN: - return new CraftLectern(this); - case SMOKER: - return new CraftSmoker(this); - case BEEHIVE: - case BEE_NEST: - return new CraftBeehive(this); - case SCULK_SENSOR: - return new CraftSculkSensor(this); - default: - TileEntity tileEntity = world.getTileEntity(position); - if (tileEntity != null) { - // block with unhandled TileEntity: - return new CraftBlockEntityState(this, (Class) tileEntity.getClass()); - } else { - // Block without TileEntity: - return new CraftBlockState(this); - } - } + return CraftBlockStates.getBlockState(this); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java index 47243111b..26409a4f5 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockEntityState.java @@ -1,39 +1,19 @@ package org.bukkit.craftbukkit.block; -import com.google.common.base.Preconditions; -import net.minecraft.core.BlockPosition; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.level.block.entity.TileEntity; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.TileState; -import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.persistence.PersistentDataContainer; -public class CraftBlockEntityState extends CraftBlockState implements TileState { +public abstract class CraftBlockEntityState extends CraftBlockState implements TileState { - private final Class tileEntityClass; private final T tileEntity; private final T snapshot; - public CraftBlockEntityState(Block block, Class tileEntityClass) { - super(block); + public CraftBlockEntityState(World world, T tileEntity) { + super(world, tileEntity.getPosition(), tileEntity.getBlock()); - this.tileEntityClass = tileEntityClass; - - // get tile entity from block: - this.tileEntity = tileEntityClass.cast(getWorldHandle().getTileEntity(this.getPosition())); - Preconditions.checkState(this.tileEntity != null, "Tile is null, asynchronous access? %s", block); - - // copy tile entity data: - this.snapshot = this.createSnapshot(tileEntity); - this.load(snapshot); - } - - public CraftBlockEntityState(Material material, T tileEntity) { - super(material); - - this.tileEntityClass = (Class) tileEntity.getClass(); this.tileEntity = tileEntity; // copy tile entity data: @@ -58,7 +38,6 @@ public class CraftBlockEntityState extends CraftBlockState // copies the TileEntity-specific data, retains the position private void copyData(T from, T to) { - BlockPosition pos = to.getPosition(); NBTTagCompound nbtTagCompound = from.save(new NBTTagCompound()); to.load(nbtTagCompound); } @@ -103,7 +82,7 @@ public class CraftBlockEntityState extends CraftBlockState } protected boolean isApplicable(TileEntity tileEntity) { - return tileEntityClass.isInstance(tileEntity); + return this.tileEntity.getClass() == tileEntity.getClass(); } @Override @@ -114,7 +93,7 @@ public class CraftBlockEntityState extends CraftBlockState TileEntity tile = getTileEntityFromWorld(); if (isApplicable(tile)) { - applyTo(tileEntityClass.cast(tile)); + applyTo((T) tile); tile.update(); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java index b4e94915e..b23f0260c 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockState.java @@ -3,6 +3,7 @@ package org.bukkit.craftbukkit.block; import com.google.common.base.Preconditions; import java.lang.ref.WeakReference; import java.util.List; +import javax.annotation.Nullable; import net.minecraft.core.BlockPosition; import net.minecraft.world.level.GeneratorAccess; import net.minecraft.world.level.block.state.IBlockData; @@ -22,39 +23,30 @@ import org.bukkit.metadata.MetadataValue; import org.bukkit.plugin.Plugin; public class CraftBlockState implements BlockState { + protected final CraftWorld world; private final BlockPosition position; protected IBlockData data; protected int flag; private WeakReference weakWorld; - public CraftBlockState(final Block block) { - this.world = (CraftWorld) block.getWorld(); - this.position = ((CraftBlock) block).getPosition(); - this.data = ((CraftBlock) block).getNMS(); + protected CraftBlockState(final Block block) { + this(block.getWorld(), ((CraftBlock) block).getPosition(), ((CraftBlock) block).getNMS()); this.flag = 3; setWorldHandle(((CraftBlock) block).getHandle()); } - public CraftBlockState(final Block block, int flag) { + protected CraftBlockState(final Block block, int flag) { this(block); this.flag = flag; } - public CraftBlockState(Material material) { - world = null; - data = CraftMagicNumbers.getBlock(material).getBlockData(); - position = BlockPosition.ZERO; - this.weakWorld = null; - } - - public static CraftBlockState getBlockState(GeneratorAccess world, net.minecraft.core.BlockPosition pos) { - return new CraftBlockState(CraftBlock.at(world, pos)); - } - - public static CraftBlockState getBlockState(GeneratorAccess world, net.minecraft.core.BlockPosition pos, int flag) { - return new CraftBlockState(CraftBlock.at(world, pos), flag); + // world can be null for non-placed BlockStates. + protected CraftBlockState(@Nullable World world, BlockPosition blockPosition, IBlockData blockData) { + this.world = (CraftWorld) world; + position = blockPosition; + data = blockData; } public void setWorldHandle(GeneratorAccess generatorAccess) { diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java new file mode 100644 index 000000000..79b64bdb3 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBlockStates.java @@ -0,0 +1,385 @@ +package org.bukkit.craftbukkit.block; + +import com.google.common.base.Preconditions; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.function.BiFunction; +import javax.annotation.Nullable; +import net.minecraft.core.BlockPosition; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.world.level.GeneratorAccess; +import net.minecraft.world.level.block.entity.SculkSensorBlockEntity; +import net.minecraft.world.level.block.entity.TileEntity; +import net.minecraft.world.level.block.entity.TileEntityBanner; +import net.minecraft.world.level.block.entity.TileEntityBarrel; +import net.minecraft.world.level.block.entity.TileEntityBeacon; +import net.minecraft.world.level.block.entity.TileEntityBed; +import net.minecraft.world.level.block.entity.TileEntityBeehive; +import net.minecraft.world.level.block.entity.TileEntityBell; +import net.minecraft.world.level.block.entity.TileEntityBlastFurnace; +import net.minecraft.world.level.block.entity.TileEntityBrewingStand; +import net.minecraft.world.level.block.entity.TileEntityCampfire; +import net.minecraft.world.level.block.entity.TileEntityChest; +import net.minecraft.world.level.block.entity.TileEntityCommand; +import net.minecraft.world.level.block.entity.TileEntityComparator; +import net.minecraft.world.level.block.entity.TileEntityConduit; +import net.minecraft.world.level.block.entity.TileEntityDispenser; +import net.minecraft.world.level.block.entity.TileEntityDropper; +import net.minecraft.world.level.block.entity.TileEntityEnchantTable; +import net.minecraft.world.level.block.entity.TileEntityEndGateway; +import net.minecraft.world.level.block.entity.TileEntityEnderChest; +import net.minecraft.world.level.block.entity.TileEntityEnderPortal; +import net.minecraft.world.level.block.entity.TileEntityFurnaceFurnace; +import net.minecraft.world.level.block.entity.TileEntityHopper; +import net.minecraft.world.level.block.entity.TileEntityJigsaw; +import net.minecraft.world.level.block.entity.TileEntityJukeBox; +import net.minecraft.world.level.block.entity.TileEntityLectern; +import net.minecraft.world.level.block.entity.TileEntityLightDetector; +import net.minecraft.world.level.block.entity.TileEntityMobSpawner; +import net.minecraft.world.level.block.entity.TileEntityShulkerBox; +import net.minecraft.world.level.block.entity.TileEntitySign; +import net.minecraft.world.level.block.entity.TileEntitySkull; +import net.minecraft.world.level.block.entity.TileEntitySmoker; +import net.minecraft.world.level.block.entity.TileEntityStructure; +import net.minecraft.world.level.block.piston.TileEntityPiston; +import net.minecraft.world.level.block.state.IBlockData; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.BlockState; +import org.bukkit.craftbukkit.CraftWorld; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; + +public final class CraftBlockStates { + + private abstract static class BlockStateFactory { + + public final Class blockStateType; + + public BlockStateFactory(Class blockStateType) { + this.blockStateType = blockStateType; + } + + // The given world can be null for unplaced BlockStates. + // If the world is not null and the given block data is a tile entity, the given tile entity is expected to not be null. + // Otherwise, the given tile entity may or may not be null. + // If the given tile entity is not null, its position and block data are expected to match the given block position and block data. + // In some situations, such as during chunk generation, the tile entity's world may be null, even if the given world is not null. + // If the tile entity's world is not null, it is expected to match the given world. + public abstract B createBlockState(World world, BlockPosition blockPosition, IBlockData blockData, TileEntity tileEntity); + } + + private static class BlockEntityStateFactory> extends BlockStateFactory { + + private final BiFunction blockStateConstructor; + private final BiFunction tileEntityConstructor; + + protected BlockEntityStateFactory(Class blockStateType, BiFunction blockStateConstructor, BiFunction tileEntityConstructor) { + super(blockStateType); + this.blockStateConstructor = blockStateConstructor; + this.tileEntityConstructor = tileEntityConstructor; + } + + @Override + public final B createBlockState(World world, BlockPosition blockPosition, IBlockData blockData, TileEntity tileEntity) { + if (world != null) { + Preconditions.checkState(tileEntity != null, "Tile is null, asynchronous access? %s", CraftBlock.at(((CraftWorld) world).getHandle(), blockPosition)); + } else if (tileEntity == null) { + tileEntity = this.createTileEntity(blockPosition, blockData); + } + return this.createBlockState(world, (T) tileEntity); + } + + private T createTileEntity(BlockPosition blockPosition, IBlockData blockData) { + return tileEntityConstructor.apply(blockPosition, blockData); + } + + private B createBlockState(World world, T tileEntity) { + return blockStateConstructor.apply(world, tileEntity); + } + } + + private static final Map> FACTORIES = new HashMap<>(); + private static final BlockStateFactory DEFAULT_FACTORY = new BlockStateFactory(CraftBlockState.class) { + @Override + public CraftBlockState createBlockState(World world, BlockPosition blockPosition, IBlockData blockData, TileEntity tileEntity) { + Preconditions.checkState(tileEntity == null, "Unexpected BlockState for %s", CraftMagicNumbers.getMaterial(blockData.getBlock())); + return new CraftBlockState(world, blockPosition, blockData); + } + }; + + static { + register( + Arrays.asList( + Material.ACACIA_SIGN, + Material.ACACIA_WALL_SIGN, + Material.BIRCH_SIGN, + Material.BIRCH_WALL_SIGN, + Material.CRIMSON_SIGN, + Material.CRIMSON_WALL_SIGN, + Material.DARK_OAK_SIGN, + Material.DARK_OAK_WALL_SIGN, + Material.JUNGLE_SIGN, + Material.JUNGLE_WALL_SIGN, + Material.OAK_SIGN, + Material.OAK_WALL_SIGN, + Material.SPRUCE_SIGN, + Material.SPRUCE_WALL_SIGN, + Material.WARPED_SIGN, + Material.WARPED_WALL_SIGN + ), CraftSign.class, CraftSign::new, TileEntitySign::new + ); + + register( + Arrays.asList( + Material.CREEPER_HEAD, + Material.CREEPER_WALL_HEAD, + Material.DRAGON_HEAD, + Material.DRAGON_WALL_HEAD, + Material.PLAYER_HEAD, + Material.PLAYER_WALL_HEAD, + Material.SKELETON_SKULL, + Material.SKELETON_WALL_SKULL, + Material.WITHER_SKELETON_SKULL, + Material.WITHER_SKELETON_WALL_SKULL, + Material.ZOMBIE_HEAD, + Material.ZOMBIE_WALL_HEAD + ), CraftSkull.class, CraftSkull::new, TileEntitySkull::new + ); + + register( + Arrays.asList( + Material.COMMAND_BLOCK, + Material.REPEATING_COMMAND_BLOCK, + Material.CHAIN_COMMAND_BLOCK + ), CraftCommandBlock.class, CraftCommandBlock::new, TileEntityCommand::new + ); + + register( + Arrays.asList( + Material.BLACK_BANNER, + Material.BLACK_WALL_BANNER, + Material.BLUE_BANNER, + Material.BLUE_WALL_BANNER, + Material.BROWN_BANNER, + Material.BROWN_WALL_BANNER, + Material.CYAN_BANNER, + Material.CYAN_WALL_BANNER, + Material.GRAY_BANNER, + Material.GRAY_WALL_BANNER, + Material.GREEN_BANNER, + Material.GREEN_WALL_BANNER, + Material.LIGHT_BLUE_BANNER, + Material.LIGHT_BLUE_WALL_BANNER, + Material.LIGHT_GRAY_BANNER, + Material.LIGHT_GRAY_WALL_BANNER, + Material.LIME_BANNER, + Material.LIME_WALL_BANNER, + Material.MAGENTA_BANNER, + Material.MAGENTA_WALL_BANNER, + Material.ORANGE_BANNER, + Material.ORANGE_WALL_BANNER, + Material.PINK_BANNER, + Material.PINK_WALL_BANNER, + Material.PURPLE_BANNER, + Material.PURPLE_WALL_BANNER, + Material.RED_BANNER, + Material.RED_WALL_BANNER, + Material.WHITE_BANNER, + Material.WHITE_WALL_BANNER, + Material.YELLOW_BANNER, + Material.YELLOW_WALL_BANNER + ), CraftBanner.class, CraftBanner::new, TileEntityBanner::new + ); + + register( + Arrays.asList( + Material.SHULKER_BOX, + Material.WHITE_SHULKER_BOX, + Material.ORANGE_SHULKER_BOX, + Material.MAGENTA_SHULKER_BOX, + Material.LIGHT_BLUE_SHULKER_BOX, + Material.YELLOW_SHULKER_BOX, + Material.LIME_SHULKER_BOX, + Material.PINK_SHULKER_BOX, + Material.GRAY_SHULKER_BOX, + Material.LIGHT_GRAY_SHULKER_BOX, + Material.CYAN_SHULKER_BOX, + Material.PURPLE_SHULKER_BOX, + Material.BLUE_SHULKER_BOX, + Material.BROWN_SHULKER_BOX, + Material.GREEN_SHULKER_BOX, + Material.RED_SHULKER_BOX, + Material.BLACK_SHULKER_BOX + ), CraftShulkerBox.class, CraftShulkerBox::new, TileEntityShulkerBox::new + ); + + register( + Arrays.asList( + Material.BLACK_BED, + Material.BLUE_BED, + Material.BROWN_BED, + Material.CYAN_BED, + Material.GRAY_BED, + Material.GREEN_BED, + Material.LIGHT_BLUE_BED, + Material.LIGHT_GRAY_BED, + Material.LIME_BED, + Material.MAGENTA_BED, + Material.ORANGE_BED, + Material.PINK_BED, + Material.PURPLE_BED, + Material.RED_BED, + Material.WHITE_BED, + Material.YELLOW_BED + ), CraftBed.class, CraftBed::new, TileEntityBed::new + ); + + register( + Arrays.asList( + Material.BEEHIVE, + Material.BEE_NEST + ), CraftBeehive.class, CraftBeehive::new, TileEntityBeehive::new + ); + + register( + Arrays.asList( + Material.CAMPFIRE, + Material.SOUL_CAMPFIRE + ), CraftCampfire.class, CraftCampfire::new, TileEntityCampfire::new + ); + + register( + Arrays.asList( + Material.CHEST, + Material.TRAPPED_CHEST + ), CraftChest.class, CraftChest::new, TileEntityChest::new + ); + + register(Material.BARREL, CraftBarrel.class, CraftBarrel::new, TileEntityBarrel::new); + register(Material.BEACON, CraftBeacon.class, CraftBeacon::new, TileEntityBeacon::new); + register(Material.BELL, CraftBell.class, CraftBell::new, TileEntityBell::new); + register(Material.BLAST_FURNACE, CraftBlastFurnace.class, CraftBlastFurnace::new, TileEntityBlastFurnace::new); + register(Material.BREWING_STAND, CraftBrewingStand.class, CraftBrewingStand::new, TileEntityBrewingStand::new); + register(Material.COMPARATOR, CraftComparator.class, CraftComparator::new, TileEntityComparator::new); + register(Material.CONDUIT, CraftConduit.class, CraftConduit::new, TileEntityConduit::new); + register(Material.DAYLIGHT_DETECTOR, CraftDaylightDetector.class, CraftDaylightDetector::new, TileEntityLightDetector::new); + register(Material.DISPENSER, CraftDispenser.class, CraftDispenser::new, TileEntityDispenser::new); + register(Material.DROPPER, CraftDropper.class, CraftDropper::new, TileEntityDropper::new); + register(Material.ENCHANTING_TABLE, CraftEnchantingTable.class, CraftEnchantingTable::new, TileEntityEnchantTable::new); + register(Material.ENDER_CHEST, CraftEnderChest.class, CraftEnderChest::new, TileEntityEnderChest::new); + register(Material.END_GATEWAY, CraftEndGateway.class, CraftEndGateway::new, TileEntityEndGateway::new); + register(Material.END_PORTAL, CraftEndPortal.class, CraftEndPortal::new, TileEntityEnderPortal::new); + register(Material.FURNACE, CraftFurnaceFurnace.class, CraftFurnaceFurnace::new, TileEntityFurnaceFurnace::new); + register(Material.HOPPER, CraftHopper.class, CraftHopper::new, TileEntityHopper::new); + register(Material.JIGSAW, CraftJigsaw.class, CraftJigsaw::new, TileEntityJigsaw::new); + register(Material.JUKEBOX, CraftJukebox.class, CraftJukebox::new, TileEntityJukeBox::new); + register(Material.LECTERN, CraftLectern.class, CraftLectern::new, TileEntityLectern::new); + register(Material.MOVING_PISTON, CraftMovingPiston.class, CraftMovingPiston::new, TileEntityPiston::new); + register(Material.SCULK_SENSOR, CraftSculkSensor.class, CraftSculkSensor::new, SculkSensorBlockEntity::new); + register(Material.SMOKER, CraftSmoker.class, CraftSmoker::new, TileEntitySmoker::new); + register(Material.SPAWNER, CraftCreatureSpawner.class, CraftCreatureSpawner::new, TileEntityMobSpawner::new); + register(Material.STRUCTURE_BLOCK, CraftStructureBlock.class, CraftStructureBlock::new, TileEntityStructure::new); + } + + private static void register(Material blockType, BlockStateFactory factory) { + FACTORIES.put(blockType, factory); + } + + private static > void register( + Material blockType, + Class blockStateType, + BiFunction blockStateConstructor, + BiFunction tileEntityConstructor + ) { + register(Collections.singletonList(blockType), blockStateType, blockStateConstructor, tileEntityConstructor); + } + + private static > void register( + List blockTypes, + Class blockStateType, + BiFunction blockStateConstructor, + BiFunction tileEntityConstructor + ) { + BlockStateFactory factory = new BlockEntityStateFactory<>(blockStateType, blockStateConstructor, tileEntityConstructor); + for (Material blockType : blockTypes) { + register(blockType, factory); + } + } + + private static BlockStateFactory getFactory(Material material) { + return FACTORIES.getOrDefault(material, DEFAULT_FACTORY); + } + + public static Class getBlockStateType(Material material) { + Preconditions.checkNotNull(material, "material is null"); + return getFactory(material).blockStateType; + } + + public static BlockState getBlockState(Block block) { + Preconditions.checkNotNull(block, "block is null"); + CraftBlock craftBlock = (CraftBlock) block; + CraftWorld world = (CraftWorld) block.getWorld(); + BlockPosition blockPosition = craftBlock.getPosition(); + IBlockData blockData = craftBlock.getNMS(); + TileEntity tileEntity = craftBlock.getHandle().getTileEntity(blockPosition); + CraftBlockState blockState = getBlockState(world, blockPosition, blockData, tileEntity); + blockState.setWorldHandle(craftBlock.getHandle()); // Inject the block's generator access + return blockState; + } + + public static BlockState getBlockState(Material material, @Nullable NBTTagCompound blockEntityTag) { + return getBlockState(BlockPosition.ZERO, material, blockEntityTag); + } + + public static BlockState getBlockState(BlockPosition blockPosition, Material material, @Nullable NBTTagCompound blockEntityTag) { + Preconditions.checkNotNull(material, "material is null"); + IBlockData blockData = CraftMagicNumbers.getBlock(material).getBlockData(); + return getBlockState(blockPosition, blockData, blockEntityTag); + } + + public static BlockState getBlockState(IBlockData blockData, @Nullable NBTTagCompound blockEntityTag) { + return getBlockState(BlockPosition.ZERO, blockData, blockEntityTag); + } + + public static BlockState getBlockState(BlockPosition blockPosition, IBlockData blockData, @Nullable NBTTagCompound blockEntityTag) { + Preconditions.checkNotNull(blockPosition, "blockPosition is null"); + Preconditions.checkNotNull(blockData, "blockData is null"); + TileEntity tileEntity = (blockEntityTag == null) ? null : TileEntity.create(blockPosition, blockData, blockEntityTag); + return getBlockState(null, blockPosition, blockData, tileEntity); + } + + // See BlockStateFactory#createBlockState(World, BlockPosition, IBlockData, TileEntity) + private static CraftBlockState getBlockState(World world, BlockPosition blockPosition, IBlockData blockData, TileEntity tileEntity) { + Material material = CraftMagicNumbers.getMaterial(blockData.getBlock()); + BlockStateFactory factory; + // For some types of TileEntity blocks (eg. moving pistons), Minecraft may in some situations (eg. when using Block#setType or the + // setBlock command) not create a corresponding TileEntity in the world. We return a normal BlockState in this case. + if (world != null && tileEntity == null && isTileEntityOptional(material)) { + factory = DEFAULT_FACTORY; + } else { + factory = getFactory(material); + } + return factory.createBlockState(world, blockPosition, blockData, tileEntity); + } + + private static boolean isTileEntityOptional(Material material) { + return material == Material.MOVING_PISTON; + } + + // This ignores tile entity data. + public static CraftBlockState getBlockState(GeneratorAccess world, BlockPosition pos) { + return new CraftBlockState(CraftBlock.at(world, pos)); + } + + // This ignores tile entity data. + public static CraftBlockState getBlockState(GeneratorAccess world, BlockPosition pos, int flag) { + return new CraftBlockState(CraftBlock.at(world, pos), flag); + } + + private CraftBlockStates() { + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java b/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java index 580f187e5..248b11d71 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftBrewingStand.java @@ -1,20 +1,15 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityBrewingStand; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.BrewingStand; import org.bukkit.craftbukkit.inventory.CraftInventoryBrewer; import org.bukkit.inventory.BrewerInventory; public class CraftBrewingStand extends CraftContainer implements BrewingStand { - public CraftBrewingStand(Block block) { - super(block, TileEntityBrewingStand.class); - } - - public CraftBrewingStand(final Material material, final TileEntityBrewingStand te) { - super(material, te); + public CraftBrewingStand(World world, TileEntityBrewingStand tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCampfire.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCampfire.java index 4b924b7ad..4e36c8182 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftCampfire.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCampfire.java @@ -1,20 +1,15 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityCampfire; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Campfire; import org.bukkit.craftbukkit.inventory.CraftItemStack; import org.bukkit.inventory.ItemStack; public class CraftCampfire extends CraftBlockEntityState implements Campfire { - public CraftCampfire(Block block) { - super(block, TileEntityCampfire.class); - } - - public CraftCampfire(Material material, TileEntityCampfire te) { - super(material, te); + public CraftCampfire(World world, TileEntityCampfire tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java index 63b6589f9..adbab4032 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftChest.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.TileEntityChest; import net.minecraft.world.level.block.state.IBlockData; import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Chest; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.inventory.CraftInventory; @@ -17,12 +17,8 @@ import org.bukkit.inventory.Inventory; public class CraftChest extends CraftLootable implements Chest { - public CraftChest(final Block block) { - super(block, TileEntityChest.class); - } - - public CraftChest(final Material material, final TileEntityChest te) { - super(material, te); + public CraftChest(World world, TileEntityChest tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java index a99d79153..8569cfe2e 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCommandBlock.java @@ -1,19 +1,14 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityCommand; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.CommandBlock; import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftCommandBlock extends CraftBlockEntityState implements CommandBlock { - public CraftCommandBlock(Block block) { - super(block, TileEntityCommand.class); - } - - public CraftCommandBlock(final Material material, final TileEntityCommand te) { - super(material, te); + public CraftCommandBlock(World world, TileEntityCommand tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftComparator.java b/src/main/java/org/bukkit/craftbukkit/block/CraftComparator.java index 12d7efdb9..b6d905005 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftComparator.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftComparator.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityComparator; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Comparator; public class CraftComparator extends CraftBlockEntityState implements Comparator { - public CraftComparator(final Block block) { - super(block, TileEntityComparator.class); - } - - public CraftComparator(final Material material, final TileEntityComparator te) { - super(material, te); + public CraftComparator(World world, TileEntityComparator tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java index 49b485920..db5285a26 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftConduit.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityConduit; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Conduit; public class CraftConduit extends CraftBlockEntityState implements Conduit { - public CraftConduit(Block block) { - super(block, TileEntityConduit.class); - } - - public CraftConduit(Material material, TileEntityConduit te) { - super(material, te); + public CraftConduit(World world, TileEntityConduit tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java b/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java index 2a680527b..7e3ad4401 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftContainer.java @@ -2,19 +2,14 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.ChestLock; import net.minecraft.world.level.block.entity.TileEntityContainer; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Container; import org.bukkit.craftbukkit.util.CraftChatMessage; public abstract class CraftContainer extends CraftBlockEntityState implements Container { - public CraftContainer(Block block, Class tileEntityClass) { - super(block, tileEntityClass); - } - - public CraftContainer(final Material material, T tileEntity) { - super(material, tileEntity); + public CraftContainer(World world, T tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java index 319cac3e6..041b5b9d6 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftCreatureSpawner.java @@ -5,19 +5,14 @@ import net.minecraft.core.BlockPosition; import net.minecraft.resources.MinecraftKey; import net.minecraft.world.entity.EntityTypes; import net.minecraft.world.level.block.entity.TileEntityMobSpawner; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.CreatureSpawner; import org.bukkit.entity.EntityType; public class CraftCreatureSpawner extends CraftBlockEntityState implements CreatureSpawner { - public CraftCreatureSpawner(final Block block) { - super(block, TileEntityMobSpawner.class); - } - - public CraftCreatureSpawner(final Material material, TileEntityMobSpawner te) { - super(material, te); + public CraftCreatureSpawner(World world, TileEntityMobSpawner tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDaylightDetector.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDaylightDetector.java index 04bd48f95..10c1f09d6 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDaylightDetector.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDaylightDetector.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityLightDetector; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.DaylightDetector; public class CraftDaylightDetector extends CraftBlockEntityState implements DaylightDetector { - public CraftDaylightDetector(final Block block) { - super(block, TileEntityLightDetector.class); - } - - public CraftDaylightDetector(final Material material, final TileEntityLightDetector te) { - super(material, te); + public CraftDaylightDetector(World world, TileEntityLightDetector tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java index afb619fc7..7e429362f 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDispenser.java @@ -5,6 +5,7 @@ import net.minecraft.world.level.block.BlockDispenser; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.TileEntityDispenser; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.Dispenser; import org.bukkit.craftbukkit.CraftWorld; @@ -15,12 +16,8 @@ import org.bukkit.projectiles.BlockProjectileSource; public class CraftDispenser extends CraftLootable implements Dispenser { - public CraftDispenser(final Block block) { - super(block, TileEntityDispenser.class); - } - - public CraftDispenser(final Material material, final TileEntityDispenser te) { - super(material, te); + public CraftDispenser(World world, TileEntityDispenser tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java index 9f0598036..f11296ec1 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftDropper.java @@ -5,6 +5,7 @@ import net.minecraft.world.level.block.BlockDropper; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.entity.TileEntityDropper; import org.bukkit.Material; +import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.Dropper; import org.bukkit.craftbukkit.CraftWorld; @@ -13,12 +14,8 @@ import org.bukkit.inventory.Inventory; public class CraftDropper extends CraftLootable implements Dropper { - public CraftDropper(final Block block) { - super(block, TileEntityDropper.class); - } - - public CraftDropper(final Material material, TileEntityDropper te) { - super(material, te); + public CraftDropper(World world, TileEntityDropper tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java index a559a77aa..b63bc3c4f 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEnchantingTable.java @@ -1,19 +1,14 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityEnchantTable; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.EnchantingTable; import org.bukkit.craftbukkit.util.CraftChatMessage; public class CraftEnchantingTable extends CraftBlockEntityState implements EnchantingTable { - public CraftEnchantingTable(final Block block) { - super(block, TileEntityEnchantTable.class); - } - - public CraftEnchantingTable(final Material material, final TileEntityEnchantTable te) { - super(material, te); + public CraftEnchantingTable(World world, TileEntityEnchantTable tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEndGateway.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEndGateway.java index 57e458628..823ac562c 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftEndGateway.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEndGateway.java @@ -4,18 +4,13 @@ import java.util.Objects; import net.minecraft.core.BlockPosition; import net.minecraft.world.level.block.entity.TileEntityEndGateway; import org.bukkit.Location; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.EndGateway; public class CraftEndGateway extends CraftBlockEntityState implements EndGateway { - public CraftEndGateway(Block block) { - super(block, TileEntityEndGateway.class); - } - - public CraftEndGateway(final Material material, TileEntityEndGateway te) { - super(material, te); + public CraftEndGateway(World world, TileEntityEndGateway tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEndPortal.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEndPortal.java new file mode 100644 index 000000000..ef5b80a8a --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEndPortal.java @@ -0,0 +1,11 @@ +package org.bukkit.craftbukkit.block; + +import net.minecraft.world.level.block.entity.TileEntityEnderPortal; +import org.bukkit.World; + +public class CraftEndPortal extends CraftBlockEntityState { + + public CraftEndPortal(World world, TileEntityEnderPortal tileEntity) { + super(world, tileEntity); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java b/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java index 3c0b28faa..c0cd734ca 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftEnderChest.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityEnderChest; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.EnderChest; public class CraftEnderChest extends CraftBlockEntityState implements EnderChest { - public CraftEnderChest(final Block block) { - super(block, TileEntityEnderChest.class); - } - - public CraftEnderChest(final Material material, final TileEntityEnderChest te) { - super(material, te); + public CraftEnderChest(World world, TileEntityEnderChest tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java index 36c339e3c..ecf1bd31e 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnace.java @@ -2,20 +2,15 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.BlockFurnace; import net.minecraft.world.level.block.entity.TileEntityFurnace; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Furnace; import org.bukkit.craftbukkit.inventory.CraftInventoryFurnace; import org.bukkit.inventory.FurnaceInventory; public abstract class CraftFurnace extends CraftContainer implements Furnace { - public CraftFurnace(Block block, Class tileEntityClass) { - super(block, tileEntityClass); - } - - public CraftFurnace(final Material material, final T te) { - super(material, te); + public CraftFurnace(World world, T tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnaceFurnace.java b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnaceFurnace.java index e6800689f..6a5183886 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftFurnaceFurnace.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftFurnaceFurnace.java @@ -1,16 +1,11 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityFurnaceFurnace; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; public class CraftFurnaceFurnace extends CraftFurnace { - public CraftFurnaceFurnace(Block block) { - super(block, TileEntityFurnaceFurnace.class); - } - - public CraftFurnaceFurnace(Material material, TileEntityFurnaceFurnace te) { - super(material, te); + public CraftFurnaceFurnace(World world, TileEntityFurnaceFurnace tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java b/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java index 5231afc29..f1ecdbf66 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftHopper.java @@ -1,20 +1,15 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityHopper; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Hopper; import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.inventory.Inventory; public class CraftHopper extends CraftLootable implements Hopper { - public CraftHopper(final Block block) { - super(block, TileEntityHopper.class); - } - - public CraftHopper(final Material material, final TileEntityHopper te) { - super(material, te); + public CraftHopper(World world, TileEntityHopper tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftJigsaw.java b/src/main/java/org/bukkit/craftbukkit/block/CraftJigsaw.java index 0e4144795..dc0222aa8 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftJigsaw.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftJigsaw.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntityJigsaw; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Jigsaw; public class CraftJigsaw extends CraftBlockEntityState implements Jigsaw { - public CraftJigsaw(Block block) { - super(block, TileEntityJigsaw.class); - } - - public CraftJigsaw(Material material, TileEntityJigsaw te) { - super(material, te); + public CraftJigsaw(World world, TileEntityJigsaw tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java index c3b8c7950..76770318f 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftJukebox.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.entity.TileEntity; import net.minecraft.world.level.block.entity.TileEntityJukeBox; import org.bukkit.Effect; import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Jukebox; import org.bukkit.craftbukkit.CraftWorld; import org.bukkit.craftbukkit.inventory.CraftItemStack; @@ -16,12 +16,8 @@ import org.bukkit.craftbukkit.util.CraftMagicNumbers; public class CraftJukebox extends CraftBlockEntityState implements Jukebox { - public CraftJukebox(final Block block) { - super(block, TileEntityJukeBox.class); - } - - public CraftJukebox(final Material material, TileEntityJukeBox te) { - super(material, te); + public CraftJukebox(World world, TileEntityJukeBox tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java b/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java index 5286c4ca2..6375e1667 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftLectern.java @@ -3,19 +3,15 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.BlockLectern; import net.minecraft.world.level.block.entity.TileEntityLectern; import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Lectern; import org.bukkit.craftbukkit.inventory.CraftInventoryLectern; import org.bukkit.inventory.Inventory; public class CraftLectern extends CraftBlockEntityState implements Lectern { - public CraftLectern(Block block) { - super(block, TileEntityLectern.class); - } - - public CraftLectern(Material material, TileEntityLectern te) { - super(material, te); + public CraftLectern(World world, TileEntityLectern tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java index f0a7e61a2..791894642 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftLootable.java @@ -3,21 +3,16 @@ package org.bukkit.craftbukkit.block; import net.minecraft.resources.MinecraftKey; import net.minecraft.world.level.block.entity.TileEntityLootable; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.Nameable; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.craftbukkit.util.CraftNamespacedKey; import org.bukkit.loot.LootTable; import org.bukkit.loot.Lootable; public abstract class CraftLootable extends CraftContainer implements Nameable, Lootable { - public CraftLootable(Block block, Class tileEntityClass) { - super(block, tileEntityClass); - } - - public CraftLootable(Material material, T tileEntity) { - super(material, tileEntity); + public CraftLootable(World world, T tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftMovingPiston.java b/src/main/java/org/bukkit/craftbukkit/block/CraftMovingPiston.java new file mode 100644 index 000000000..668506820 --- /dev/null +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftMovingPiston.java @@ -0,0 +1,11 @@ +package org.bukkit.craftbukkit.block; + +import net.minecraft.world.level.block.piston.TileEntityPiston; +import org.bukkit.World; + +public class CraftMovingPiston extends CraftBlockEntityState { + + public CraftMovingPiston(World world, TileEntityPiston tileEntity) { + super(world, tileEntity); + } +} diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java index be7490ade..2733154f5 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSculkSensor.java @@ -2,18 +2,13 @@ package org.bukkit.craftbukkit.block; import com.google.common.base.Preconditions; import net.minecraft.world.level.block.entity.SculkSensorBlockEntity; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.SculkSensor; public class CraftSculkSensor extends CraftBlockEntityState implements SculkSensor { - public CraftSculkSensor(final Block block) { - super(block, SculkSensorBlockEntity.class); - } - - public CraftSculkSensor(final Material material, final SculkSensorBlockEntity te) { - super(material, te); + public CraftSculkSensor(World world, SculkSensorBlockEntity tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftShulkerBox.java b/src/main/java/org/bukkit/craftbukkit/block/CraftShulkerBox.java index ea226d6e3..29015ac9d 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftShulkerBox.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftShulkerBox.java @@ -3,12 +3,10 @@ package org.bukkit.craftbukkit.block; import net.minecraft.sounds.SoundCategory; import net.minecraft.sounds.SoundEffects; import net.minecraft.world.item.EnumColor; -import net.minecraft.world.level.World; import net.minecraft.world.level.block.BlockShulkerBox; import net.minecraft.world.level.block.entity.TileEntityShulkerBox; import org.bukkit.DyeColor; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.ShulkerBox; import org.bukkit.craftbukkit.inventory.CraftInventory; import org.bukkit.craftbukkit.util.CraftMagicNumbers; @@ -16,12 +14,8 @@ import org.bukkit.inventory.Inventory; public class CraftShulkerBox extends CraftLootable implements ShulkerBox { - public CraftShulkerBox(final Block block) { - super(block, TileEntityShulkerBox.class); - } - - public CraftShulkerBox(final Material material, final TileEntityShulkerBox te) { - super(material, te); + public CraftShulkerBox(World world, TileEntityShulkerBox tileEntity) { + super(world, tileEntity); } @Override @@ -49,7 +43,7 @@ public class CraftShulkerBox extends CraftLootable impleme public void open() { requirePlaced(); if (!getTileEntity().opened && getWorldHandle() instanceof net.minecraft.world.level.World) { - World world = getTileEntity().getWorld(); + net.minecraft.world.level.World world = getTileEntity().getWorld(); world.playBlockAction(getPosition(), getTileEntity().getBlock().getBlock(), 1, 1); world.playSound(null, getPosition(), SoundEffects.SHULKER_BOX_OPEN, SoundCategory.BLOCKS, 0.5F, world.random.nextFloat() * 0.1F + 0.9F); } @@ -60,7 +54,7 @@ public class CraftShulkerBox extends CraftLootable impleme public void close() { requirePlaced(); if (getTileEntity().opened && getWorldHandle() instanceof net.minecraft.world.level.World) { - World world = getTileEntity().getWorld(); + net.minecraft.world.level.World world = getTileEntity().getWorld(); world.playBlockAction(getPosition(), getTileEntity().getBlock().getBlock(), 1, 0); world.playSound(null, getPosition(), SoundEffects.SHULKER_BOX_OPEN, SoundCategory.BLOCKS, 0.5F, world.random.nextFloat() * 0.1F + 0.9F); } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java index b4bedba81..e4c7d1702 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSign.java @@ -5,8 +5,7 @@ import net.minecraft.network.chat.IChatBaseComponent; import net.minecraft.world.item.EnumColor; import net.minecraft.world.level.block.entity.TileEntitySign; import org.bukkit.DyeColor; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Sign; import org.bukkit.craftbukkit.util.CraftChatMessage; @@ -16,12 +15,8 @@ public class CraftSign extends CraftBlockEntityState implements private String[] originalLines = null; private String[] lines = null; - public CraftSign(final Block block) { - super(block, TileEntitySign.class); - } - - public CraftSign(final Material material, final TileEntitySign te) { - super(material, te); + public CraftSign(World world, TileEntitySign tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java index 46a968f83..4da5a7a15 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSkull.java @@ -5,10 +5,9 @@ import com.mojang.authlib.GameProfile; import net.minecraft.server.MinecraftServer; import net.minecraft.world.level.block.entity.TileEntitySkull; import org.bukkit.Bukkit; -import org.bukkit.Material; import org.bukkit.OfflinePlayer; import org.bukkit.SkullType; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.BlockFace; import org.bukkit.block.Skull; import org.bukkit.block.data.BlockData; @@ -21,12 +20,8 @@ public class CraftSkull extends CraftBlockEntityState implement private static final int MAX_OWNER_LENGTH = 16; private GameProfile profile; - public CraftSkull(final Block block) { - super(block, TileEntitySkull.class); - } - - public CraftSkull(final Material material, final TileEntitySkull te) { - super(material, te); + public CraftSkull(World world, TileEntitySkull tileEntity) { + super(world, tileEntity); } @Override diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftSmoker.java b/src/main/java/org/bukkit/craftbukkit/block/CraftSmoker.java index ddfd2db31..0cec0853a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftSmoker.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftSmoker.java @@ -1,17 +1,12 @@ package org.bukkit.craftbukkit.block; import net.minecraft.world.level.block.entity.TileEntitySmoker; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Smoker; public class CraftSmoker extends CraftFurnace implements Smoker { - public CraftSmoker(Block block) { - super(block, TileEntitySmoker.class); - } - - public CraftSmoker(Material material, TileEntitySmoker te) { - super(material, te); + public CraftSmoker(World world, TileEntitySmoker tileEntity) { + super(world, tileEntity); } } diff --git a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java index 858876bfa..1dd43643a 100644 --- a/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java +++ b/src/main/java/org/bukkit/craftbukkit/block/CraftStructureBlock.java @@ -7,8 +7,7 @@ import net.minecraft.world.level.block.EnumBlockRotation; import net.minecraft.world.level.block.entity.TileEntityStructure; import net.minecraft.world.level.block.state.properties.BlockPropertyStructureMode; import org.apache.commons.lang3.Validate; -import org.bukkit.Material; -import org.bukkit.block.Block; +import org.bukkit.World; import org.bukkit.block.Structure; import org.bukkit.block.structure.Mirror; import org.bukkit.block.structure.StructureRotation; @@ -21,12 +20,8 @@ public class CraftStructureBlock extends CraftBlockEntityState blockStateType = CraftBlockStates.getBlockStateType(stateMaterial); + Validate.isTrue(blockStateType == blockState.getClass() && blockState instanceof CraftBlockEntityState, "Invalid blockState for " + material); blockEntityTag = ((CraftBlockEntityState) blockState).getSnapshotNBT(); // Set shield base diff --git a/src/test/java/org/bukkit/craftbukkit/block/BlockStateTest.java b/src/test/java/org/bukkit/craftbukkit/block/BlockStateTest.java new file mode 100644 index 000000000..af4d4f4fc --- /dev/null +++ b/src/test/java/org/bukkit/craftbukkit/block/BlockStateTest.java @@ -0,0 +1,28 @@ +package org.bukkit.craftbukkit.block; + +import static org.junit.Assert.assertTrue; +import net.minecraft.core.IRegistry; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.ITileEntity; +import org.bukkit.Material; +import org.bukkit.craftbukkit.util.CraftMagicNumbers; +import org.bukkit.support.AbstractTestingBase; +import org.junit.Test; + +public class BlockStateTest extends AbstractTestingBase { + + @Test + public void testTileEntityBlockStates() { + for (Block block : IRegistry.BLOCK) { + Material material = CraftMagicNumbers.getMaterial(block); + Class blockStateType = CraftBlockStates.getBlockStateType(material); + boolean isCraftBlockEntityState = CraftBlockEntityState.class.isAssignableFrom(blockStateType); + + if (block instanceof ITileEntity) { + assertTrue(material + " has BlockState of type " + blockStateType.getName() + ", but expected subtype of CraftBlockEntityState", isCraftBlockEntityState); + } else { + assertTrue(material + " has unexpected CraftBlockEntityState subytype " + blockStateType.getName() + " (but is not a tile)", !isCraftBlockEntityState); + } + } + } +}