Search in sources :

Example 1 with IFallableBlock

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));
    }
}
Also used : FallingBlock(net.minecraft.world.level.block.FallingBlock) BlockState(net.minecraft.world.level.block.state.BlockState) IFallableBlock(net.dries007.tfc.common.blocks.rock.IFallableBlock) FallingBlock(net.minecraft.world.level.block.FallingBlock) IFallableBlock(net.dries007.tfc.common.blocks.rock.IFallableBlock) Block(net.minecraft.world.level.block.Block) BlockPos(net.minecraft.core.BlockPos) Tag(net.minecraft.nbt.Tag) CompoundTag(net.minecraft.nbt.CompoundTag) DirectionalPlaceContext(net.minecraft.world.item.context.DirectionalPlaceContext) CompoundTag(net.minecraft.nbt.CompoundTag) FallingBlockEntity(net.minecraft.world.entity.item.FallingBlockEntity) BlockEntity(net.minecraft.world.level.block.entity.BlockEntity)

Aggregations

IFallableBlock (net.dries007.tfc.common.blocks.rock.IFallableBlock)1 BlockPos (net.minecraft.core.BlockPos)1 CompoundTag (net.minecraft.nbt.CompoundTag)1 Tag (net.minecraft.nbt.Tag)1 FallingBlockEntity (net.minecraft.world.entity.item.FallingBlockEntity)1 DirectionalPlaceContext (net.minecraft.world.item.context.DirectionalPlaceContext)1 Block (net.minecraft.world.level.block.Block)1 FallingBlock (net.minecraft.world.level.block.FallingBlock)1 BlockEntity (net.minecraft.world.level.block.entity.BlockEntity)1 BlockState (net.minecraft.world.level.block.state.BlockState)1