From dedddea65dc89699edfa9a0fca5c6ef4b995c6bd Mon Sep 17 00:00:00 2001 From: Owen1212055 <23108066+Owen1212055@users.noreply.github.com> Date: Sun, 5 Dec 2021 14:58:17 -0500 Subject: [PATCH] Expand FallingBlock API - add auto expire setting - add setter for block data - add accessors for block state == AT == public net.minecraft.world.entity.item.FallingBlockEntity blockState Co-authored-by: Lukas Planz --- .../entity/item/FallingBlockEntity.java.patch | 48 ++++++++++++++++--- .../craftbukkit/entity/CraftFallingBlock.java | 36 ++++++++++++++ 2 files changed, 77 insertions(+), 7 deletions(-) diff --git a/paper-server/patches/sources/net/minecraft/world/entity/item/FallingBlockEntity.java.patch b/paper-server/patches/sources/net/minecraft/world/entity/item/FallingBlockEntity.java.patch index 336ebfaa2a..1972a3acae 100644 --- a/paper-server/patches/sources/net/minecraft/world/entity/item/FallingBlockEntity.java.patch +++ b/paper-server/patches/sources/net/minecraft/world/entity/item/FallingBlockEntity.java.patch @@ -12,7 +12,15 @@ public class FallingBlockEntity extends Entity { private static final Logger LOGGER = LogUtils.getLogger(); -@@ -87,10 +92,17 @@ +@@ -66,6 +71,7 @@ + public CompoundTag blockData; + public boolean forceTickAfterTeleportToDuplicate; + protected static final EntityDataAccessor DATA_START_POS = SynchedEntityData.defineId(FallingBlockEntity.class, EntityDataSerializers.BLOCK_POS); ++ public boolean autoExpire = true; // Paper - Expand FallingBlock API + + public FallingBlockEntity(EntityType type, Level world) { + super(type, world); +@@ -87,10 +93,17 @@ } public static FallingBlockEntity fall(Level world, BlockPos pos, BlockState state) { @@ -33,7 +41,7 @@ return entityfallingblock; } -@@ -139,7 +151,7 @@ +@@ -139,7 +152,7 @@ @Override public void tick() { if (this.blockState.isAir()) { @@ -42,7 +50,7 @@ } else { Block block = this.blockState.getBlock(); -@@ -147,6 +159,16 @@ +@@ -147,6 +160,16 @@ this.applyGravity(); this.move(MoverType.SELF, this.getDeltaMovement()); this.applyEffectsFromBlocks(); @@ -59,7 +67,13 @@ this.handlePortal(); Level world = this.level(); -@@ -174,7 +196,7 @@ +@@ -169,12 +192,12 @@ + } + + if (!this.onGround() && !flag1) { +- if (this.time > 100 && (blockposition.getY() <= this.level().getMinY() || blockposition.getY() > this.level().getMaxY()) || this.time > 600) { ++ if ((this.time > 100 && autoExpire) && (blockposition.getY() <= this.level().getMinY() || blockposition.getY() > this.level().getMaxY()) || (this.time > 600 && autoExpire)) { // Paper - Expand FallingBlock API + if (this.dropItem && worldserver.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { this.spawnAtLocation(worldserver, (ItemLike) block); } @@ -68,7 +82,7 @@ } } else { BlockState iblockdata = this.level().getBlockState(blockposition); -@@ -191,9 +213,15 @@ +@@ -191,9 +214,15 @@ this.blockState = (BlockState) this.blockState.setValue(BlockStateProperties.WATERLOGGED, true); } @@ -85,7 +99,7 @@ if (block instanceof Fallable) { ((Fallable) block).onLand(this.level(), blockposition, this.blockState, iblockdata, this); } -@@ -221,19 +249,19 @@ +@@ -221,19 +250,19 @@ } } } else if (this.dropItem && worldserver.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { @@ -108,7 +122,15 @@ this.callOnBrokenAfterFall(block, blockposition); } } -@@ -328,7 +356,7 @@ +@@ -310,6 +339,7 @@ + } + + nbt.putBoolean("CancelDrop", this.cancelDrop); ++ if (!autoExpire) {nbt.putBoolean("Paper.AutoExpire", false);} // Paper - Expand FallingBlock API + } + + @Override +@@ -328,7 +358,7 @@ this.dropItem = nbt.getBoolean("DropItem"); } @@ -117,3 +139,15 @@ this.blockData = nbt.getCompound("TileEntityData").copy(); } +@@ -337,6 +367,11 @@ + this.blockState = Blocks.SAND.defaultBlockState(); + } + ++ // Paper start - Expand FallingBlock API ++ if (nbt.contains("Paper.AutoExpire")) { ++ this.autoExpire = nbt.getBoolean("Paper.AutoExpire"); ++ } ++ // Paper end - Expand FallingBlock API + } + + public void setHurtsEntities(float fallHurtAmount, int fallHurtMax) { diff --git a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java index a7a3f74b84..1359d25a32 100644 --- a/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java +++ b/paper-server/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java @@ -33,6 +33,31 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock { public BlockData getBlockData() { return CraftBlockData.fromData(this.getHandle().getBlockState()); } + // Paper start - Expand FallingBlock API + @Override + public void setBlockData(final BlockData blockData) { + Preconditions.checkArgument(blockData != null, "blockData"); + final net.minecraft.world.level.block.state.BlockState oldState = this.getHandle().blockState, newState = ((CraftBlockData) blockData).getState(); + this.getHandle().blockState = newState; + this.getHandle().blockData = null; + + if (oldState != newState) this.update(); + } + + @Override + public org.bukkit.block.BlockState getBlockState() { + return org.bukkit.craftbukkit.block.CraftBlockStates.getBlockState(this.getHandle().blockState, this.getHandle().blockData); + } + + @Override + public void setBlockState(final org.bukkit.block.BlockState blockState) { + Preconditions.checkArgument(blockState != null, "blockState"); + // Calls #update if needed, the block data compound tag is not synced with the client and hence can be mutated after the sync with clients. + // The call also clears any potential old block data. + this.setBlockData(blockState.getBlockData()); + if (blockState instanceof final org.bukkit.craftbukkit.block.CraftBlockEntityState tileEntity) this.getHandle().blockData = tileEntity.getSnapshotNBT(); + } + // Paper end - Expand FallingBlock API @Override public boolean getDropItem() { @@ -101,4 +126,15 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock { this.setHurtEntities(true); } } + // Paper start - Expand FallingBlock API + @Override + public boolean doesAutoExpire() { + return this.getHandle().autoExpire; + } + + @Override + public void shouldAutoExpire(boolean autoExpires) { + this.getHandle().autoExpire = autoExpires; + } + // Paper end - Expand FallingBlock API }