Search in sources :

Example 1 with AutomaticItemPlacementContext

use of net.minecraft.item.AutomaticItemPlacementContext in project Paradise-Lost by devs-immortal.

the class FloatingBlockEntity method postTickEntities.

/**
 * Because this entity moves other entities, including the player, this entity has
 * to tick after the all other entities have ticked to prevent them phasing though this
 */
public void postTickEntities() {
    if (this.blockState.isAir()) {
        this.remove();
    } else {
        Block block = this.blockState.getBlock();
        BlockPos blockPos;
        if (this.floatTime++ == 0) {
            blockPos = this.getBlockPos();
            if (this.world.getBlockState(blockPos).isOf(block)) {
                this.world.removeBlock(blockPos, false);
            } else if (!this.world.isClient) {
                this.remove();
                return;
            }
        }
        boolean isFastFloater = (this.blockState.getBlock() == AetherBlocks.GRAVITITE_ORE || this.blockState.getBlock() == AetherBlocks.GRAVITITE_LEVITATOR || this.blockState.getBlock() == AetherBlocks.BLOCK_OF_GRAVITITE);
        if (!this.hasNoGravity()) {
            if (isFastFloater) {
                this.setVelocity(this.getVelocity().add(0.0D, 0.05D, 0.0D));
            } else {
                this.setVelocity(this.getVelocity().add(0.0D, 0.03D, 0.0D));
            }
        }
        Box oldBox = getBoundingBox();
        this.move(MovementType.SELF, this.getVelocity());
        if (!FallingBlock.canFallThrough(this.blockState)) {
            Box newBox = getBoundingBox();
            List<Entity> otherEntities = this.world.getOtherEntities(this, oldBox.union(newBox));
            for (Entity entity : otherEntities) {
                if (!(entity instanceof FloatingBlockEntity) && !entity.noClip) {
                    if (entity.getY() < newBox.maxY) {
                        entity.updatePosition(entity.getPos().x, newBox.maxY, entity.getPos().z);
                    }
                }
            }
        }
        if (!this.world.isClient) {
            blockPos = this.getBlockPos();
            boolean isConcrete = this.blockState.getBlock() instanceof ConcretePowderBlock;
            boolean shouldSolidify = isConcrete && this.world.getFluidState(blockPos).isIn(FluidTags.WATER);
            double speed = this.getVelocity().lengthSquared();
            if (isConcrete && speed > 1.0D) {
                BlockHitResult blockHitResult = this.world.raycast(new RaycastContext(new Vec3d(this.prevX, this.prevY, this.prevZ), new Vec3d(this.getX(), this.getY(), this.getZ()), RaycastContext.ShapeType.COLLIDER, RaycastContext.FluidHandling.SOURCE_ONLY, this));
                if (blockHitResult.getType() != HitResult.Type.MISS && this.world.getFluidState(blockHitResult.getBlockPos()).isIn(FluidTags.WATER)) {
                    blockPos = blockHitResult.getBlockPos();
                    shouldSolidify = true;
                }
            }
            if (!this.verticalCollision && !shouldSolidify) {
                if (!this.world.isClient) {
                    if (this.floatTime > 100 && blockPos.getY() > this.world.getHeight() + 64) {
                        if (this.dropItem && this.world.getGameRules().getBoolean(GameRules.DO_ENTITY_DROPS) && this.world.isPlayerInRange(blockPos.getX(), blockPos.getY(), blockPos.getZ(), 4)) {
                            this.dropItem(block);
                        }
                        this.remove();
                    }
                }
            } else {
                BlockState blockState = this.world.getBlockState(blockPos);
                this.setVelocity(this.getVelocity().multiply(0.7, 0.5, 0.7));
                if (blockState.getBlock() != Blocks.MOVING_PISTON) {
                    this.remove();
                    if (!this.destroyedOnLanding) {
                        boolean canReplace = blockState.canReplace(new AutomaticItemPlacementContext(this.world, blockPos, Direction.DOWN, ItemStack.EMPTY, Direction.UP));
                        if (!canReplace) {
                            canReplace = blockState.canReplace(new AutomaticItemPlacementContext(this.world, blockPos, Direction.UP, ItemStack.EMPTY, Direction.DOWN));
                        }
                        boolean canPlace = this.blockState.canPlaceAt(this.world, blockPos);
                        if (canReplace && canPlace) {
                            if (this.blockState.contains(Properties.WATERLOGGED) && this.world.getFluidState(blockPos).getFluid() == Fluids.WATER)
                                this.blockState = this.blockState.with(Properties.WATERLOGGED, true);
                            if (this.world.setBlockState(blockPos, this.blockState, 3)) {
                                if (block instanceof FloatingBlock)
                                    ((FloatingBlock) block).onEndFloating(this.world, blockPos, this.blockState, blockState);
                                if (this.blockEntityData != null && this.blockState.getBlock().hasBlockEntity()) {
                                    BlockEntity blockEntity = this.world.getBlockEntity(blockPos);
                                    if (blockEntity != null) {
                                        CompoundTag compoundTag = blockEntity.toTag(new CompoundTag());
                                        for (String keyName : this.blockEntityData.getKeys()) {
                                            Tag tag = this.blockEntityData.get(keyName);
                                            if (tag != null && !"x".equals(keyName) && !"y".equals(keyName) && !"z".equals(keyName)) {
                                                compoundTag.put(keyName, tag.copy());
                                            }
                                        }
                                        blockEntity.fromTag(this.blockState, compoundTag);
                                        blockEntity.markDirty();
                                    }
                                }
                            } else if (this.dropItem && this.world.getGameRules().getBoolean(GameRules.DO_ENTITY_DROPS)) {
                                this.dropItem(block);
                            }
                        } else if (this.dropItem && this.world.getGameRules().getBoolean(GameRules.DO_ENTITY_DROPS)) {
                            this.dropItem(block);
                        }
                    } else if (block instanceof FloatingBlock) {
                        ((FloatingBlock) block).onBroken(this.world, blockPos);
                    }
                }
            }
        }
        this.setVelocity(this.getVelocity().multiply(0.98D));
    }
}
Also used : BlockEntity(net.minecraft.block.entity.BlockEntity) AetherNonLivingEntity(com.aether.entities.AetherNonLivingEntity) PlayerEntity(net.minecraft.entity.player.PlayerEntity) FloatingBlock(com.aether.blocks.FloatingBlock) RaycastContext(net.minecraft.world.RaycastContext) AutomaticItemPlacementContext(net.minecraft.item.AutomaticItemPlacementContext) FloatingBlock(com.aether.blocks.FloatingBlock) Tag(net.minecraft.nbt.Tag) CompoundTag(net.minecraft.nbt.CompoundTag) BlockHitResult(net.minecraft.util.hit.BlockHitResult) CompoundTag(net.minecraft.nbt.CompoundTag) BlockEntity(net.minecraft.block.entity.BlockEntity)

Aggregations

FloatingBlock (com.aether.blocks.FloatingBlock)1 AetherNonLivingEntity (com.aether.entities.AetherNonLivingEntity)1 BlockEntity (net.minecraft.block.entity.BlockEntity)1 PlayerEntity (net.minecraft.entity.player.PlayerEntity)1 AutomaticItemPlacementContext (net.minecraft.item.AutomaticItemPlacementContext)1 CompoundTag (net.minecraft.nbt.CompoundTag)1 Tag (net.minecraft.nbt.Tag)1 BlockHitResult (net.minecraft.util.hit.BlockHitResult)1 RaycastContext (net.minecraft.world.RaycastContext)1