Search in sources :

Example 1 with TilePipeHolder

use of buildcraft.transport.tile.TilePipeHolder in project BuildCraft by BuildCraft.

the class BlockPipeHolder method getDrops.

@Override
public void getDrops(NonNullList<ItemStack> toDrop, IBlockAccess world, BlockPos pos, IBlockState state, int fortune) {
    TilePipeHolder tile = getPipe(world, pos, false);
    for (EnumFacing face : EnumFacing.VALUES) {
        PipePluggable pluggable = tile.getPluggable(face);
        if (pluggable != null) {
            pluggable.addDrops(toDrop, fortune);
        }
    }
    for (EnumDyeColor color : tile.wireManager.parts.values()) {
        toDrop.add(new ItemStack(BCTransportItems.wire, 1, color.getMetadata()));
    }
    Pipe pipe = tile.getPipe();
    if (pipe != null) {
        pipe.addDrops(toDrop, fortune);
    }
}
Also used : TilePipeHolder(buildcraft.transport.tile.TilePipeHolder) EnumFacing(net.minecraft.util.EnumFacing) PipePluggable(buildcraft.api.transport.pluggable.PipePluggable) Pipe(buildcraft.transport.pipe.Pipe) ItemStack(net.minecraft.item.ItemStack) EnumDyeColor(net.minecraft.item.EnumDyeColor)

Example 2 with TilePipeHolder

use of buildcraft.transport.tile.TilePipeHolder in project BuildCraft by BuildCraft.

the class BlockPipeHolder method getExtendedState.

// rendering
@Override
@SideOnly(Side.CLIENT)
public IBlockState getExtendedState(IBlockState state, IBlockAccess world, BlockPos pos) {
    IExtendedBlockState extended = (IExtendedBlockState) state;
    TilePipeHolder tile = getPipe(world, pos, false);
    if (tile != null) {
        extended = extended.withProperty(PROP_TILE, new WeakReference<>(tile));
    }
    return extended;
}
Also used : TilePipeHolder(buildcraft.transport.tile.TilePipeHolder) IExtendedBlockState(net.minecraftforge.common.property.IExtendedBlockState) WeakReference(java.lang.ref.WeakReference) SideOnly(net.minecraftforge.fml.relauncher.SideOnly)

Example 3 with TilePipeHolder

use of buildcraft.transport.tile.TilePipeHolder in project BuildCraft by BuildCraft.

the class BlockPipeHolder method getExplosionResistance.

@Override
public float getExplosionResistance(World world, BlockPos pos, @Nullable Entity exploder, Explosion explosion) {
    if (exploder != null) {
        Vec3d subtract = exploder.getPositionVector().subtract(new Vec3d(pos).add(VecUtil.VEC_HALF)).normalize();
        EnumFacing side = Arrays.stream(EnumFacing.VALUES).min(Comparator.comparing(facing -> new Vec3d(facing.getDirectionVec()).distanceTo(subtract))).orElseThrow(IllegalArgumentException::new);
        TilePipeHolder tile = getPipe(world, pos, true);
        if (tile != null) {
            PipePluggable pluggable = tile.getPluggable(side);
            if (pluggable != null) {
                float explosionResistance = pluggable.getExplosionResistance(exploder, explosion);
                if (explosionResistance > 0) {
                    return explosionResistance;
                }
            }
        }
    }
    return super.getExplosionResistance(world, pos, exploder, explosion);
}
Also used : TilePipeHolder(buildcraft.transport.tile.TilePipeHolder) EnumFacing(net.minecraft.util.EnumFacing) PipePluggable(buildcraft.api.transport.pluggable.PipePluggable) Vec3d(net.minecraft.util.math.Vec3d)

Example 4 with TilePipeHolder

use of buildcraft.transport.tile.TilePipeHolder in project BuildCraft by BuildCraft.

the class BlockPipeHolder method removedByPlayer.

@Override
public boolean removedByPlayer(IBlockState state, World world, BlockPos pos, EntityPlayer player, boolean willHarvest) {
    if (world.isRemote) {
        return false;
    }
    TilePipeHolder tile = getPipe(world, pos, false);
    if (tile == null) {
        return super.removedByPlayer(state, world, pos, player, willHarvest);
    }
    NonNullList<ItemStack> toDrop = NonNullList.create();
    RayTraceResult trace = rayTrace(world, pos, player);
    EnumFacing side = null;
    EnumWirePart part = null;
    EnumWireBetween between = null;
    if (trace != null && trace.subHit > 6) {
        side = getPartSideHit(trace);
        part = getWirePartHit(trace);
        between = getWireBetweenHit(trace);
    }
    if (side != null) {
        removePluggable(side, tile, toDrop);
        if (!player.capabilities.isCreativeMode) {
            InventoryUtil.dropAll(world, pos, toDrop);
        }
        return false;
    } else if (part != null) {
        toDrop.add(new ItemStack(BCTransportItems.wire, 1, tile.wireManager.getColorOfPart(part).getMetadata()));
        tile.wireManager.removePart(part);
        if (!player.capabilities.isCreativeMode) {
            InventoryUtil.dropAll(world, pos, toDrop);
        }
        tile.scheduleNetworkUpdate(IPipeHolder.PipeMessageReceiver.WIRES);
        return false;
    } else if (between != null) {
        toDrop.add(new ItemStack(BCTransportItems.wire, between.to == null ? 2 : 1, tile.wireManager.getColorOfPart(between.parts[0]).getMetadata()));
        if (between.to == null) {
            tile.wireManager.removeParts(Arrays.asList(between.parts));
        } else {
            tile.wireManager.removePart(between.parts[0]);
        }
        if (!player.capabilities.isCreativeMode) {
            InventoryUtil.dropAll(world, pos, toDrop);
        }
        tile.scheduleNetworkUpdate(IPipeHolder.PipeMessageReceiver.WIRES);
        return false;
    } else {
        toDrop.addAll(getDrops(world, pos, state, 0));
        for (EnumFacing face : EnumFacing.VALUES) {
            removePluggable(face, tile, NonNullList.create());
        }
    }
    if (!player.capabilities.isCreativeMode) {
        InventoryUtil.dropAll(world, pos, toDrop);
    }
    return super.removedByPlayer(state, world, pos, player, willHarvest);
}
Also used : TilePipeHolder(buildcraft.transport.tile.TilePipeHolder) EnumWirePart(buildcraft.api.transport.EnumWirePart) EnumFacing(net.minecraft.util.EnumFacing) RayTraceResult(net.minecraft.util.math.RayTraceResult) ItemStack(net.minecraft.item.ItemStack) EnumWireBetween(buildcraft.transport.wire.EnumWireBetween)

Example 5 with TilePipeHolder

use of buildcraft.transport.tile.TilePipeHolder in project BuildCraft by BuildCraft.

the class BlockPipeHolder method rayTrace.

@Nullable
public RayTraceResult rayTrace(World world, BlockPos pos, Vec3d start, Vec3d end) {
    TilePipeHolder tile = getPipe(world, pos, false);
    if (tile == null) {
        return computeTrace(null, pos, start, end, FULL_BLOCK_AABB, 400);
    }
    RayTraceResult best = null;
    Pipe pipe = tile.getPipe();
    boolean computed = false;
    if (pipe != null) {
        computed = true;
        best = computeTrace(best, pos, start, end, BOX_CENTER, 0);
        for (EnumFacing face : EnumFacing.VALUES) {
            float conSize = pipe.getConnectedDist(face);
            if (conSize > 0) {
                AxisAlignedBB aabb = BOX_FACES[face.ordinal()];
                if (conSize != 0.25f) {
                    Vec3d center = VecUtil.offset(new Vec3d(0.5, 0.5, 0.5), face, 0.25 + (conSize / 2));
                    Vec3d radius = new Vec3d(0.25, 0.25, 0.25);
                    radius = VecUtil.replaceValue(radius, face.getAxis(), conSize / 2);
                    Vec3d min = center.subtract(radius);
                    Vec3d max = center.add(radius);
                    aabb = BoundingBoxUtil.makeFrom(min, max);
                }
                best = computeTrace(best, pos, start, end, aabb, face.ordinal() + 1);
            }
        }
    }
    for (EnumFacing face : EnumFacing.VALUES) {
        PipePluggable pluggable = tile.getPluggable(face);
        if (pluggable != null) {
            AxisAlignedBB bb = pluggable.getBoundingBox();
            best = computeTrace(best, pos, start, end, bb, face.ordinal() + 1 + 6);
            computed = true;
        }
    }
    for (EnumWirePart part : tile.getWireManager().parts.keySet()) {
        best = computeTrace(best, pos, start, end, part.boundingBox, part.ordinal() + 1 + 6 + 6);
        computed = true;
    }
    for (EnumWireBetween between : tile.getWireManager().betweens.keySet()) {
        best = computeTrace(best, pos, start, end, between.boundingBox, between.ordinal() + 1 + 6 + 6 + 8);
        computed = true;
    }
    if (!computed) {
        return computeTrace(null, pos, start, end, FULL_BLOCK_AABB, 400);
    }
    return best;
}
Also used : AxisAlignedBB(net.minecraft.util.math.AxisAlignedBB) TilePipeHolder(buildcraft.transport.tile.TilePipeHolder) EnumWirePart(buildcraft.api.transport.EnumWirePart) EnumFacing(net.minecraft.util.EnumFacing) RayTraceResult(net.minecraft.util.math.RayTraceResult) PipePluggable(buildcraft.api.transport.pluggable.PipePluggable) Pipe(buildcraft.transport.pipe.Pipe) Vec3d(net.minecraft.util.math.Vec3d) EnumWireBetween(buildcraft.transport.wire.EnumWireBetween) Nullable(javax.annotation.Nullable)

Aggregations

TilePipeHolder (buildcraft.transport.tile.TilePipeHolder)14 PipePluggable (buildcraft.api.transport.pluggable.PipePluggable)10 Pipe (buildcraft.transport.pipe.Pipe)8 EnumFacing (net.minecraft.util.EnumFacing)8 EnumWirePart (buildcraft.api.transport.EnumWirePart)6 EnumWireBetween (buildcraft.transport.wire.EnumWireBetween)5 ItemStack (net.minecraft.item.ItemStack)4 RayTraceResult (net.minecraft.util.math.RayTraceResult)4 Vec3d (net.minecraft.util.math.Vec3d)4 AxisAlignedBB (net.minecraft.util.math.AxisAlignedBB)3 Item (net.minecraft.item.Item)2 SideOnly (net.minecraftforge.fml.relauncher.SideOnly)2 EnumPipePart (buildcraft.api.core.EnumPipePart)1 IItemPluggable (buildcraft.api.transport.IItemPluggable)1 WireNode (buildcraft.api.transport.WireNode)1 PipeDefinition (buildcraft.api.transport.pipe.PipeDefinition)1 ItemWire (buildcraft.transport.item.ItemWire)1 WeakReference (java.lang.ref.WeakReference)1 Nullable (javax.annotation.Nullable)1 EnumDyeColor (net.minecraft.item.EnumDyeColor)1