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 <lukas.planz@web.de>
This commit is contained in:
Owen1212055 2021-12-05 14:58:17 -05:00
parent 8c8e7968ab
commit dedddea65d
2 changed files with 77 additions and 7 deletions

View File

@ -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<BlockPos> DATA_START_POS = SynchedEntityData.defineId(FallingBlockEntity.class, EntityDataSerializers.BLOCK_POS);
+ public boolean autoExpire = true; // Paper - Expand FallingBlock API
public FallingBlockEntity(EntityType<? extends FallingBlockEntity> 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) {

View File

@ -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
}