use of net.dries007.tfc.common.blocks.rock.IFallableBlock in project TerraFirmaCraft by TerraFirmaCraft.
the class TFCFallingBlockEntity method tick.
@Override
public void tick() {
final BlockState fallingBlockState = getBlockState();
if (fallingBlockState.isAir()) {
remove(RemovalReason.DISCARDED);
} else {
Block block = fallingBlockState.getBlock();
if (time++ == 0) {
// First tick, replace the existing block
BlockPos blockpos = blockPosition();
if (block == level.getBlockState(blockpos).getBlock()) {
level.removeBlock(blockpos, false);
} else if (!level.isClientSide) {
remove(RemovalReason.DISCARDED);
return;
}
}
if (!isNoGravity()) {
setDeltaMovement(getDeltaMovement().add(0.0D, -0.04D, 0.0D));
}
move(MoverType.SELF, getDeltaMovement());
if (!level.isClientSide) {
BlockPos posAt = blockPosition();
if (!onGround) {
failedBreakCheck = false;
if ((time > 100 && (posAt.getY() < 1 || posAt.getY() > 256)) || time > 600) {
if (dropItem && level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
spawnAtLocation(block);
}
remove(RemovalReason.DISCARDED);
}
} else {
// On ground
if (!failedBreakCheck) {
if (!level.isEmptyBlock(posAt) && canFallThrough(level, posAt, level.getBlockState(posAt))) {
level.destroyBlock(posAt, true);
failedBreakCheck = true;
return;
} else if (!level.isEmptyBlock(posAt.below()) && canFallThrough(level, posAt.below(), level.getBlockState(posAt.below()))) {
level.destroyBlock(posAt.below(), true);
failedBreakCheck = true;
return;
}
}
BlockState hitBlockState = level.getBlockState(posAt);
setDeltaMovement(getDeltaMovement().multiply(0.7D, -0.5D, 0.7D));
if (hitBlockState.getBlock() != Blocks.MOVING_PISTON) {
remove(RemovalReason.DISCARDED);
if (!dontSetBlock) {
if (hitBlockState.canBeReplaced(new DirectionalPlaceContext(this.level, posAt, Direction.DOWN, ItemStack.EMPTY, Direction.UP)) && fallingBlockState.canSurvive(this.level, posAt) && !FallingBlock.isFree(this.level.getBlockState(posAt.below()))) {
if (fallingBlockState.hasProperty(BlockStateProperties.WATERLOGGED) && this.level.getFluidState(posAt).getType() == Fluids.WATER) {
// todo: mixin
// ((FallingBlockEntityAccessor) this).accessor$setBlockState(fallingBlockState.setValue(BlockStateProperties.WATERLOGGED, Boolean.TRUE));
}
if (level.setBlockAndUpdate(posAt, fallingBlockState)) {
if (block instanceof FallingBlock) {
((FallingBlock) block).onLand(this.level, posAt, fallingBlockState, hitBlockState, this);
}
if (TFCTags.Blocks.CAN_LANDSLIDE.contains(fallingBlockState.getBlock())) {
level.getCapability(WorldTrackerCapability.CAPABILITY).ifPresent(cap -> cap.addLandslidePos(posAt));
}
// Sets the tile entity if it exists
if (blockData != null && fallingBlockState.hasBlockEntity()) {
BlockEntity tileEntity = level.getBlockEntity(posAt);
if (tileEntity != null) {
CompoundTag tileEntityData = tileEntity.saveWithoutMetadata();
for (String dataKey : tileEntityData.getAllKeys()) {
Tag dataElement = tileEntityData.get(dataKey);
if (!"x".equals(dataKey) && !"y".equals(dataKey) && !"z".equals(dataKey) && dataElement != null) {
tileEntityData.put(dataKey, dataElement.copy());
}
}
tileEntity.load(tileEntityData);
tileEntity.setChanged();
}
}
} else if (dropItem && level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
spawnAtLocation(block);
}
} else if (dropItem && this.level.getGameRules().getBoolean(GameRules.RULE_DOENTITYDROPS)) {
spawnAtLocation(block);
}
}
if (block instanceof IFallableBlock) {
((IFallableBlock) block).onceFinishedFalling(this.level, posAt, this);
}
}
}
}
setDeltaMovement(getDeltaMovement().scale(0.98D));
}
}
Aggregations