Search in sources :

Example 1 with BlockSnow

use of net.minecraft.block.BlockSnow in project SpongeCommon by SpongePowered.

the class DefaultTeleportHelperFilter method isSafeBodyMaterial.

@Override
public boolean isSafeBodyMaterial(BlockState blockState) {
    IBlockState state = BlockUtil.toNative(blockState);
    Material material = state.getMaterial();
    // Deny blocks that suffocate
    if (state.causesSuffocation()) {
        return false;
    }
    // Deny dangerous lava
    if (material == Material.LAVA) {
        return false;
    }
    // Deny non-passable non "full" blocks
    return !(state.getBlock() instanceof BlockSlab || state.getBlock() instanceof BlockCauldron || state.getBlock() instanceof BlockAnvil || state.getBlock() instanceof BlockFence || state.getBlock() instanceof BlockChorusPlant || state.getBlock() instanceof BlockSnow || material == Material.GLASS || material == Material.LEAVES);
}
Also used : BlockSnow(net.minecraft.block.BlockSnow) IBlockState(net.minecraft.block.state.IBlockState) BlockSlab(net.minecraft.block.BlockSlab) BlockCauldron(net.minecraft.block.BlockCauldron) BlockAnvil(net.minecraft.block.BlockAnvil) Material(net.minecraft.block.material.Material) BlockFence(net.minecraft.block.BlockFence) BlockChorusPlant(net.minecraft.block.BlockChorusPlant)

Example 2 with BlockSnow

use of net.minecraft.block.BlockSnow in project Solar by ArekkuusuJerii.

the class TileDilaton method pushExtension.

public void pushExtension(boolean powered) {
    if (!world.isRemote && !(!isActiveLazy() && !powered)) {
        ProfilerHelper.flagSection("[Dilaton] Redstone signal received");
        BlockPos.MutableBlockPos pos = new BlockPos.MutableBlockPos(getPos());
        EnumFacing facing = getFacingLazy();
        int range = powered ? getRedstonePower() + 1 : 16;
        int pointer = 0;
        if (isActiveLazy()) {
            ProfilerHelper.flagSection("[Dilaton] Locate nearest extension");
            boolean found = false;
            for (; pointer < range; pointer++) {
                if (!isPosValid(pos.move(facing)) || pointer >= range)
                    return;
                IBlockState state = world.getBlockState(pos);
                if (state.getBlock() == ModBlocks.DILATON_EXTENSION) {
                    world.setBlockToAir(pos);
                    found = true;
                    break;
                }
            }
            if (!found)
                return;
            if (!powered)
                pointer = 0;
        }
        ProfilerHelper.begin("[Dilaton] Gathering pushed blocks");
        if (!powered)
            facing = facing.getOpposite();
        List<Triple<IBlockState, NBTTagCompound, BlockPos>> pushed = Lists.newArrayList();
        List<BlockPos> removed = Lists.newArrayList();
        loop: for (; pointer < range; pointer++) {
            if (pos.move(facing).equals(getPos()) || !isPosValid(pos))
                break;
            IBlockState next = world.getBlockState(pos);
            if (next.getBlock() == Blocks.AIR)
                continue;
            float hardness = next.getBlockHardness(world, pos);
            if (hardness > 2000F || hardness < 0F)
                break;
            EnumPushReaction reaction;
            if (next.getMaterial() == Material.WATER)
                reaction = EnumPushReaction.IGNORE;
            else
                reaction = next.getMobilityFlag();
            switch(reaction) {
                case PUSH_ONLY:
                case NORMAL:
                    if (pushed.add(getStateTile(next, pos.toImmutable())) && pushed.size() > 15)
                        break loop;
                    else
                        ++range;
                    continue loop;
                case DESTROY:
                    removed.add(pos.toImmutable());
                    continue loop;
                case BLOCK:
                    break loop;
                case IGNORE:
            }
        }
        ProfilerHelper.interrupt("[Dilaton] Relocating pushed blocks");
        Set<BlockPos> deleted = Sets.newHashSet();
        if (pushed.size() <= 15) {
            pos.move(facing.getOpposite());
        }
        for (int i = 0, size = pushed.size(); i < size; i++) {
            if (isPosReplaceable(pos)) {
                for (int index = pushed.size() - 1; index >= 0; index--) {
                    Triple<IBlockState, NBTTagCompound, BlockPos> triplet = pushed.get(index);
                    if (setStateTile(triplet.getLeft(), triplet.getMiddle(), pos.toImmutable()))
                        removed.add(pos.toImmutable());
                    BlockPos oldPos = triplet.getRight();
                    if (deleted.add(oldPos))
                        deleted.removeIf(a -> a.equals(pos));
                    pos.move(facing.getOpposite());
                }
                deleted.forEach(delete -> {
                    if (world.getTileEntity(delete) != null)
                        world.removeTileEntity(delete);
                    world.setBlockToAir(delete);
                });
                break;
            } else if (!pushed.isEmpty())
                pushed.remove(pushed.size() - 1);
            pos.move(facing.getOpposite());
        }
        ProfilerHelper.flagSection("[Dilaton] Block drops");
        removed.forEach(p -> {
            IBlockState state = world.getBlockState(p);
            float chance = state.getBlock() instanceof BlockSnow ? -1.0F : 1.0F;
            state.getBlock().dropBlockAsItemWithChance(world, p, state, chance, 0);
            world.setBlockToAir(p);
        });
        ProfilerHelper.end();
        ProfilerHelper.flagSection("[Dilaton] Place extension");
        if (pos.equals(getPos().offset(facing.getOpposite()))) {
            if (isActiveLazy())
                world.setBlockState(getPos(), world.getBlockState(getPos()).withProperty(State.ACTIVE, false));
        } else if (!pos.equals(getPos())) {
            if (!isActiveLazy())
                world.setBlockState(getPos(), world.getBlockState(getPos()).withProperty(State.ACTIVE, true));
            IBlockState extension = ModBlocks.DILATON_EXTENSION.getDefaultState().withProperty(BlockDirectional.FACING, facing);
            world.setBlockState(pos, extension);
        }
    }
}
Also used : NBTTagCompound(net.minecraft.nbt.NBTTagCompound) State(arekkuusu.solar.api.state.State) BlockSnow(net.minecraft.block.BlockSnow) Blocks(net.minecraft.init.Blocks) EnumFacing(net.minecraft.util.EnumFacing) Set(java.util.Set) ProfilerHelper(arekkuusu.solar.client.util.helper.ProfilerHelper) BlockPos(net.minecraft.util.math.BlockPos) Sets(com.google.common.collect.Sets) IBlockState(net.minecraft.block.state.IBlockState) List(java.util.List) Lists(com.google.common.collect.Lists) Material(net.minecraft.block.material.Material) BlockDirectional(net.minecraft.block.BlockDirectional) TileEntity(net.minecraft.tileentity.TileEntity) ModBlocks(arekkuusu.solar.common.block.ModBlocks) Triple(org.apache.commons.lang3.tuple.Triple) EnumPushReaction(net.minecraft.block.material.EnumPushReaction) BlockSnow(net.minecraft.block.BlockSnow) IBlockState(net.minecraft.block.state.IBlockState) EnumFacing(net.minecraft.util.EnumFacing) NBTTagCompound(net.minecraft.nbt.NBTTagCompound) Triple(org.apache.commons.lang3.tuple.Triple) BlockPos(net.minecraft.util.math.BlockPos) EnumPushReaction(net.minecraft.block.material.EnumPushReaction)

Aggregations

BlockSnow (net.minecraft.block.BlockSnow)2 Material (net.minecraft.block.material.Material)2 IBlockState (net.minecraft.block.state.IBlockState)2 State (arekkuusu.solar.api.state.State)1 ProfilerHelper (arekkuusu.solar.client.util.helper.ProfilerHelper)1 ModBlocks (arekkuusu.solar.common.block.ModBlocks)1 Lists (com.google.common.collect.Lists)1 Sets (com.google.common.collect.Sets)1 List (java.util.List)1 Set (java.util.Set)1 BlockAnvil (net.minecraft.block.BlockAnvil)1 BlockCauldron (net.minecraft.block.BlockCauldron)1 BlockChorusPlant (net.minecraft.block.BlockChorusPlant)1 BlockDirectional (net.minecraft.block.BlockDirectional)1 BlockFence (net.minecraft.block.BlockFence)1 BlockSlab (net.minecraft.block.BlockSlab)1 EnumPushReaction (net.minecraft.block.material.EnumPushReaction)1 Blocks (net.minecraft.init.Blocks)1 NBTTagCompound (net.minecraft.nbt.NBTTagCompound)1 TileEntity (net.minecraft.tileentity.TileEntity)1