From 0000000000000000000000000000000000000000 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 diff --git a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java index 5164c2bfb32275beff01b6e76dfbd9d031231bc6..e6f75a9cac46c8e3ddba664a9d5b27b665a94cb4 100644 --- a/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java +++ b/src/main/java/net/minecraft/world/entity/item/FallingBlockEntity.java @@ -66,6 +66,7 @@ public class FallingBlockEntity extends Entity { @Nullable public CompoundTag blockData; protected static final EntityDataAccessor DATA_START_POS = SynchedEntityData.defineId(FallingBlockEntity.class, EntityDataSerializers.BLOCK_POS); + public boolean autoExpire = true; // Paper - Auto expire setting public FallingBlockEntity(EntityType type, Level world) { super(type, world); @@ -180,7 +181,7 @@ public class FallingBlockEntity extends Entity { } if (!this.onGround() && !flag1) { - if (!this.level().isClientSide && (this.time > 100 && (blockposition.getY() <= this.level().getMinBuildHeight() || blockposition.getY() > this.level().getMaxBuildHeight()) || this.time > 600)) { + if (!this.level().isClientSide && ((this.time > 100 && autoExpire) && (blockposition.getY() <= this.level().getMinBuildHeight() || blockposition.getY() > this.level().getMaxBuildHeight()) || (this.time > 600 && autoExpire))) { // Paper - Auto expire setting if (this.dropItem && this.level().getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) { this.spawnAtLocation((ItemLike) block); } @@ -328,6 +329,7 @@ public class FallingBlockEntity extends Entity { } nbt.putBoolean("CancelDrop", this.cancelDrop); + if (!autoExpire) {nbt.putBoolean("Paper.AutoExpire", false);} // Paper - AutoExpire setting } @Override @@ -363,6 +365,11 @@ public class FallingBlockEntity extends Entity { this.setOrigin(new org.bukkit.Location(this.level().getWorld(), srcX, srcY, srcZ)); } // Paper end + // Paper start + if (nbt.contains("Paper.AutoExpire")) { + this.autoExpire = nbt.getBoolean("Paper.AutoExpire"); + } + // Paper end } public void setHurtsEntities(float fallHurtAmount, int fallHurtMax) { diff --git a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java b/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java index a7a3f74b846112d752fe04162b30805961457b11..73911b81f4e927026657953a0c68ddda9a8f93c1 100644 --- a/src/main/java/org/bukkit/craftbukkit/entity/CraftFallingBlock.java +++ b/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 + @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 @Override public boolean getDropItem() { @@ -101,4 +126,15 @@ public class CraftFallingBlock extends CraftEntity implements FallingBlock { this.setHurtEntities(true); } } + // Paper Start - Auto expire setting + @Override + public boolean doesAutoExpire() { + return this.getHandle().autoExpire; + } + + @Override + public void shouldAutoExpire(boolean autoExpires) { + this.getHandle().autoExpire = autoExpires; + } + // Paper End - Auto expire setting }