Search in sources :

Example 1 with State

use of arekkuusu.solar.api.state.State in project Solar by ArekkuusuJerii.

the class BlockElectron method onBlockAdded.

@Override
public void onBlockAdded(World world, BlockPos pos, IBlockState state) {
    if (!world.isRemote) {
        BlockPos from = pos.add(-8, -8, -8);
        BlockPos to = pos.add(8, 8, 8);
        BlockPos.getAllInBoxMutable(from, to).forEach(p -> getTile(TileHyperConductor.class, world, p).ifPresent(conductor -> conductor.addElectron(pos)));
        world.scheduleUpdate(pos, this, tickRate(world));
    }
}
Also used : BakedElectron(arekkuusu.solar.client.util.baker.baked.BakedElectron) SoundType(net.minecraft.block.SoundType) State(arekkuusu.solar.api.state.State) DummyBakedRegistry(arekkuusu.solar.client.util.baker.DummyBakedRegistry) World(net.minecraft.world.World) AxisAlignedBB(net.minecraft.util.math.AxisAlignedBB) FXUtil(arekkuusu.solar.client.effect.FXUtil) LibNames(arekkuusu.solar.common.lib.LibNames) Vector3(net.katsstuff.mirror.data.Vector3) EnumFacing(net.minecraft.util.EnumFacing) ModelHandler(arekkuusu.solar.client.util.helper.ModelHandler) TileHyperConductor(arekkuusu.solar.common.block.tile.TileHyperConductor) BlockStateContainer(net.minecraft.block.state.BlockStateContainer) BlockPos(net.minecraft.util.math.BlockPos) Random(java.util.Random) SolarSounds(arekkuusu.solar.api.sound.SolarSounds) FixedDamage(arekkuusu.solar.api.util.FixedDamage) IBlockState(net.minecraft.block.state.IBlockState) Material(net.minecraft.block.material.Material) EntityLivingBase(net.minecraft.entity.EntityLivingBase) Side(net.minecraftforge.fml.relauncher.Side) SideOnly(net.minecraftforge.fml.relauncher.SideOnly) SoundCategory(net.minecraft.util.SoundCategory) IBlockAccess(net.minecraft.world.IBlockAccess) BlockPos(net.minecraft.util.math.BlockPos)

Example 2 with State

use of arekkuusu.solar.api.state.State 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

State (arekkuusu.solar.api.state.State)2 Material (net.minecraft.block.material.Material)2 IBlockState (net.minecraft.block.state.IBlockState)2 EnumFacing (net.minecraft.util.EnumFacing)2 BlockPos (net.minecraft.util.math.BlockPos)2 SolarSounds (arekkuusu.solar.api.sound.SolarSounds)1 FixedDamage (arekkuusu.solar.api.util.FixedDamage)1 FXUtil (arekkuusu.solar.client.effect.FXUtil)1 DummyBakedRegistry (arekkuusu.solar.client.util.baker.DummyBakedRegistry)1 BakedElectron (arekkuusu.solar.client.util.baker.baked.BakedElectron)1 ModelHandler (arekkuusu.solar.client.util.helper.ModelHandler)1 ProfilerHelper (arekkuusu.solar.client.util.helper.ProfilerHelper)1 ModBlocks (arekkuusu.solar.common.block.ModBlocks)1 TileHyperConductor (arekkuusu.solar.common.block.tile.TileHyperConductor)1 LibNames (arekkuusu.solar.common.lib.LibNames)1 Lists (com.google.common.collect.Lists)1 Sets (com.google.common.collect.Sets)1 List (java.util.List)1 Random (java.util.Random)1 Set (java.util.Set)1