API improvements: start refactoring pipe API, add renderers, hitboxes, registration and network sync to IPipePluggable API, fix tons of design things

This commit is contained in:
asiekierka 2014-12-15 19:10:12 +01:00
parent 078ff84fd7
commit ad36ec30cd
89 changed files with 1330 additions and 1204 deletions

View file

@ -0,0 +1,8 @@
package buildcraft.api.core;
import net.minecraft.nbt.NBTTagCompound;
public interface INBTStoreable {
void readFromNBT(NBTTagCompound tag);
void writeToNBT(NBTTagCompound tag);
}

View file

@ -2,15 +2,29 @@
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* The BuildCraft API is distributed under the terms of the MIT License.
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.api.core;
import io.netty.buffer.ByteBuf;
/**
* Implemented by classes representing serializable packet state
*/
public interface ISerializable {
void readData(ByteBuf stream);
void writeData(ByteBuf stream);
/**
* Serializes the state to the stream
*
* @param data
*/
void writeData(ByteBuf data);
/**
* Deserializes the state from the stream
*
* @param data
*/
void readData(ByteBuf data);
}

View file

@ -6,6 +6,6 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "1.3", owner = "BuildCraft|Core", provides = "BuildCraftAPI|core")
@API(apiVersion = "1.4", owner = "BuildCraft|Core", provides = "BuildCraftAPI|core")
package buildcraft.api.core;
import cpw.mods.fml.common.API;

View file

@ -6,7 +6,7 @@
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.transport.render;
package buildcraft.api.core.render;
import net.minecraft.world.IBlockAccess;
import net.minecraftforge.common.util.ForgeDirection;

View file

@ -6,10 +6,11 @@
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.transport.render;
package buildcraft.api.core.render;
import net.minecraft.block.Block;
import net.minecraft.util.IIcon;
import buildcraft.transport.render.TextureStateManager;
public interface ITextureStates extends ICullable {

View file

@ -10,7 +10,7 @@ package buildcraft.api.gates;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IPipe;
import buildcraft.api.pipes.IPipe;
public interface IGate {
@Deprecated

View file

@ -6,20 +6,13 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
package buildcraft.api.pipes;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.gates.IGate;
public interface IPipe {
int x();
int y();
int z();
IPipeTile getTile();
IPipeContainer getTile();
IGate getGate(ForgeDirection side);

View file

@ -6,11 +6,11 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
package buildcraft.api.pipes;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer.PipeType;
public interface IPipeConnection {

View file

@ -0,0 +1,49 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* The BuildCraft API is distributed under the terms of the MIT License.
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.pipes;
import net.minecraft.block.Block;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.EnumColor;
import buildcraft.api.transport.IInjectable;
public interface IPipeContainer extends IInjectable {
public enum PipeType {
ITEM, FLUID, POWER, STRUCTURE
}
PipeType getPipeType();
World getWorldObj();
int x();
int y();
int z();
/**
* True if the pipe is connected to the block/pipe in the specific direction
*
* @param with
* @return true if connect
*/
boolean isPipeConnected(ForgeDirection with);
Block getNeighborBlock(ForgeDirection dir);
TileEntity getNeighborTile(ForgeDirection dir);
IPipe getNeighborPipe(ForgeDirection dir);
IPipe getPipe();
}

View file

@ -0,0 +1,42 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* The BuildCraft API is distributed under the terms of the MIT License.
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.pipes;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.INBTStoreable;
import buildcraft.api.core.ISerializable;
/**
* An IPipePluggable MUST have an empty constructor for client-side
* rendering!
*/
public interface IPipePluggable extends INBTStoreable, ISerializable {
ItemStack[] getDropItems(IPipeContainer pipe);
void onAttachedPipe(IPipeContainer pipe, ForgeDirection direction);
void onDetachedPipe(IPipeContainer pipe, ForgeDirection direction);
boolean isBlocking(IPipeContainer pipe, ForgeDirection direction);
void invalidate();
void validate(IPipeContainer pipe, ForgeDirection direction);
AxisAlignedBB getBoundingBox(ForgeDirection side);
@SideOnly(Side.CLIENT)
IPipePluggableRenderer getRenderer();
}

View file

@ -0,0 +1,11 @@
package buildcraft.api.pipes;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.render.ITextureStates;
public interface IPipePluggableRenderer {
void renderPluggable(RenderBlocks renderblocks, IPipe pipe, ForgeDirection side,
IPipePluggable pipePluggable, ITextureStates blockStateMachine,
int x, int y, int z);
}

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
package buildcraft.api.pipes;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
package buildcraft.api.pipes;
import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;

View file

@ -6,17 +6,25 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
package buildcraft.api.pipes;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.minecraft.world.World;
import buildcraft.api.transport.IExtractionHandler;
public abstract class PipeManager {
public static List<IStripesHandler> stripesHandlers = new ArrayList<IStripesHandler>();
public static List<IExtractionHandler> extractionHandlers = new ArrayList<IExtractionHandler>();
public static ArrayList<Class<? extends IPipePluggable>> pipePluggables = new ArrayList<Class<? extends IPipePluggable>>();
private static Map<String, Class<? extends IPipePluggable>> pipePluggableNames =
new HashMap<String, Class<? extends IPipePluggable>>();
private static Map<Class<? extends IPipePluggable>, String> pipePluggableByNames =
new HashMap<Class<? extends IPipePluggable>, String>();
public static void registerExtractionHandler(IExtractionHandler handler) {
extractionHandlers.add(handler);
@ -26,6 +34,12 @@ public abstract class PipeManager {
stripesHandlers.add(handler);
}
public static void registerPipePluggable(Class<? extends IPipePluggable> pluggable, String name) {
pipePluggables.add(pluggable);
pipePluggableNames.put(name, pluggable);
pipePluggableByNames.put(pluggable, name);
}
/**
* param extractor can be null
*/
@ -51,4 +65,12 @@ public abstract class PipeManager {
return true;
}
public static Class<?> getPluggableByName(String pluggableName) {
return pipePluggableNames.get(pluggableName);
}
public static String getPluggableName(Class<? extends IPipePluggable> aClass) {
return pipePluggableByNames.get(aClass);
}
}

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
package buildcraft.api.pipes;
import java.util.Locale;

View file

@ -0,0 +1,3 @@
@API(apiVersion = "1.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|pipes")
package buildcraft.api.pipes;
import cpw.mods.fml.common.API;

View file

@ -0,0 +1,22 @@
package buildcraft.api.power;
import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyConnection;
import cofh.api.energy.IEnergyReceiver;
/**
* Implement this on tiles that you wish to be able to receive Redstone Engine
* (low-power) energy.
*
* Please do not implement it on batteries, pipes or machines which can have
* their energy extracted from. That could lead to exploits and abuse.
*/
public interface IRedstoneEngineReceiver extends IEnergyReceiver {
/**
* This function is queried on every attempt to receive energy from a
* redstone engine as well.
* @param side
* @return
*/
boolean canConnectRedstoneEngine(ForgeDirection side);
}

View file

@ -6,6 +6,6 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "1.2", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|power")
@API(apiVersion = "1.3", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|power")
package buildcraft.api.power;
import cpw.mods.fml.common.API;

View file

@ -1,27 +1,10 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* The BuildCraft API is distributed under the terms of the MIT License.
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
import net.minecraft.item.ItemStack;
import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.EnumColor;
public interface IPipeTile {
public enum PipeType {
ITEM, FLUID, POWER, STRUCTURE
}
PipeType getPipeType();
public interface IInjectable {
/**
* Offers an ItemStack for addition to the pipe. Will be rejected if the
* pipe doesn't accept items from that side.
@ -41,16 +24,4 @@ public interface IPipeTile {
* but with no color attribute.
*/
int injectItem(ItemStack stack, boolean doAdd, ForgeDirection from);
/**
* True if the pipe is connected to the block/pipe in the specific direction
*
* @param with
* @return true if connect
*/
boolean isPipeConnected(ForgeDirection with);
TileEntity getAdjacentTile(ForgeDirection dir);
IPipe getPipe();
}

View file

@ -1,32 +0,0 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* The BuildCraft API is distributed under the terms of the MIT License.
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
package buildcraft.api.transport;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
public interface IPipePluggable {
void writeToNBT(NBTTagCompound nbt);
void readFromNBT(NBTTagCompound nbt);
ItemStack[] getDropItems(IPipeTile pipe);
void onAttachedPipe(IPipeTile pipe, ForgeDirection direction);
void onDetachedPipe(IPipeTile pipe, ForgeDirection direction);
boolean blocking(IPipeTile pipe, ForgeDirection direction);
void invalidate();
void validate(IPipeTile pipe, ForgeDirection direction);
}

View file

@ -6,7 +6,7 @@
* Please check the contents of the license, which should be located
* as "LICENSE.API" in the BuildCraft source code distribution.
*/
@API(apiVersion = "2.1", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|transport")
@API(apiVersion = "3.0", owner = "BuildCraftAPI|core", provides = "BuildCraftAPI|transport")
package buildcraft.api.transport;
import cpw.mods.fml.common.API;

View file

@ -43,8 +43,8 @@ import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.ITriggerInternal;
import buildcraft.api.statements.StatementManager;
import buildcraft.api.transport.IExtractionHandler;
import buildcraft.api.transport.PipeManager;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeManager;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.CreativeTabBuildCraft;
import buildcraft.core.DefaultProps;
import buildcraft.core.InterModComms;
@ -56,6 +56,7 @@ import buildcraft.core.proxy.CoreProxy;
import buildcraft.silicon.ItemRedstoneChipset.Chipset;
import buildcraft.transport.BlockFilteredBuffer;
import buildcraft.transport.BlockGenericPipe;
import buildcraft.transport.FacadePluggable;
import buildcraft.transport.GuiHandler;
import buildcraft.transport.ItemFacade;
import buildcraft.transport.ItemGateCopier;
@ -68,6 +69,8 @@ import buildcraft.transport.PipeActionProvider;
import buildcraft.transport.PipeColoringRecipe;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.PipeTriggerProvider;
import buildcraft.transport.PlugPluggable;
import buildcraft.transport.RobotStationPluggable;
import buildcraft.transport.TileFilteredBuffer;
import buildcraft.transport.TileGenericPipe;
import buildcraft.transport.TransportProxy;
@ -77,6 +80,7 @@ import buildcraft.transport.gates.GateDefinition.GateMaterial;
import buildcraft.transport.gates.GateExpansionPulsar;
import buildcraft.transport.gates.GateExpansionRedstoneFader;
import buildcraft.transport.gates.GateExpansionTimer;
import buildcraft.transport.gates.GatePluggable;
import buildcraft.transport.gates.ItemGate;
import buildcraft.transport.network.PacketHandlerTransport;
import buildcraft.transport.pipes.PipeFluidsCobblestone;
@ -501,6 +505,11 @@ public class BuildCraftTransport extends BuildCraftMod {
PipeManager.registerStripesHandler(new StripesHandlerBucket());
PipeManager.registerStripesHandler(new StripesHandlerArrow());
PipeManager.registerStripesHandler(new StripesHandlerShears());
PipeManager.registerPipePluggable(FacadePluggable.class, "facade");
PipeManager.registerPipePluggable(GatePluggable.class, "gate");
PipeManager.registerPipePluggable(PlugPluggable.class, "plug");
PipeManager.registerPipePluggable(RobotStationPluggable.class, "robotStation");
if (BuildCraftCore.loadDefaultRecipes) {
loadRecipes();

View file

@ -18,9 +18,8 @@ import net.minecraftforge.fluids.FluidTank;
import buildcraft.core.gui.tooltips.ToolTip;
import buildcraft.core.gui.tooltips.ToolTipLine;
import buildcraft.core.network.INBTSerializable;
public class Tank extends FluidTank implements INBTSerializable {
public class Tank extends FluidTank {
public int colorRenderCache = 0xFFFFFF;
protected final ToolTip toolTip = new ToolTip() {
@ -93,16 +92,4 @@ public class Tank extends FluidTank implements INBTSerializable {
}
toolTip.add(new ToolTipLine(String.format(Locale.ENGLISH, "%,d / %,d", amount, getCapacity())));
}
@Override
public NBTTagCompound serializeNBT() {
NBTTagCompound nbt = new NBTTagCompound();
writeToNBT(nbt);
return nbt;
}
@Override
public void serializeNBT(NBTTagCompound nbt) {
readFromNBT(nbt);
}
}

View file

@ -27,9 +27,7 @@ import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler;
import buildcraft.core.network.INBTSerializable;
public class TankManager<T extends Tank> extends ForwardingList<T> implements IFluidHandler, List<T>, INBTSerializable {
public class TankManager<T extends Tank> extends ForwardingList<T> implements IFluidHandler, List<T> {
private List<T> tanks = new ArrayList<T>();
@ -141,16 +139,4 @@ public class TankManager<T extends Tank> extends ForwardingList<T> implements IF
}
}
}
@Override
public NBTTagCompound serializeNBT() {
NBTTagCompound nbt = new NBTTagCompound();
writeToNBT(nbt);
return nbt;
}
@Override
public void serializeNBT(NBTTagCompound nbt) {
readFromNBT(nbt);
}
}

View file

@ -1,30 +0,0 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.network;
import io.netty.buffer.ByteBuf;
/**
* Implemented by classes representing serializable client state
*/
public interface IClientState {
/**
* Serializes the state to the stream
*
* @param data
*/
void writeData(ByteBuf data);
/**
* Deserializes the state from the stream
*
* @param data
*/
void readData(ByteBuf data);
}

View file

@ -1,17 +0,0 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.network;
import net.minecraft.nbt.NBTTagCompound;
public interface INBTSerializable {
NBTTagCompound serializeNBT();
void serializeNBT(NBTTagCompound nbt);
}

View file

@ -8,6 +8,8 @@
*/
package buildcraft.core.network;
import buildcraft.api.core.ISerializable;
public interface ISyncedTile {
/**
@ -16,7 +18,7 @@ public interface ISyncedTile {
* @param stateId
* @return an object that should be refreshed from the state
*/
IClientState getStateInstance(byte stateId);
ISerializable getStateInstance(byte stateId);
/**
* Called after a state has been updated

View file

@ -1,24 +0,0 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.network;
/**
* Keeps track of the indices to use when writing data to payload arrays. Internal use only.
*/
public class IndexInPayload {
public int intIndex = 0;
public int floatIndex = 0;
public int stringIndex = 0;
public IndexInPayload(int intIndex, int floatIndex, int stringIndex) {
this.intIndex = intIndex;
this.floatIndex = floatIndex;
this.stringIndex = stringIndex;
}
}

View file

@ -14,6 +14,7 @@ import java.util.List;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import buildcraft.api.core.ISerializable;
public class PacketTileState extends PacketCoordinates {
@ -21,9 +22,9 @@ public class PacketTileState extends PacketCoordinates {
private class StateWithId {
public byte stateId;
public IClientState state;
public ISerializable state;
public StateWithId(byte stateId, IClientState state) {
public StateWithId(byte stateId, ISerializable state) {
this.stateId = stateId;
this.state = state;
}
@ -40,8 +41,7 @@ public class PacketTileState extends PacketCoordinates {
/**
* Constructor for outgoing packets
*
* @param x
* , y, z - the coordinates the tile to sync
* @param x, y, z - the coordinates the tile to sync
*/
public PacketTileState(int x, int y, int z) {
super(PacketIds.STATE_UPDATE, x, y, z);
@ -62,7 +62,7 @@ public class PacketTileState extends PacketCoordinates {
}
}
public void addStateForSerialization(byte stateId, IClientState state) {
public void addStateForSerialization(byte stateId, ISerializable state) {
stateList.add(new StateWithId(stateId, state));
}

View file

@ -1,30 +0,0 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.core.network;
import io.netty.buffer.ByteBuf;
import buildcraft.api.core.ISerializable;
public class PacketWrapper implements ISerializable {
private final ISerializable wrapped;
public PacketWrapper(ISerializable wrapped) {
this.wrapped = wrapped;
}
@Override
public void readData(ByteBuf stream) {
wrapped.readData(stream);
}
@Override
public void writeData(ByteBuf stream) {
wrapped.writeData(stream);
}
}

View file

@ -10,7 +10,7 @@ package buildcraft.core.robots;
import buildcraft.api.robots.AIRobot;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.transport.PipeTransportPower;
public class AIRobotRecharge extends AIRobot {

View file

@ -11,10 +11,7 @@ package buildcraft.core.statements;
import java.util.Collection;
import java.util.LinkedList;
import org.apache.logging.log4j.Level;
import net.minecraft.tileentity.TileEntity;
import cpw.mods.fml.common.FMLLog;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftCore;
import buildcraft.api.core.BCLog;
@ -23,7 +20,7 @@ import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.IActionProvider;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.tiles.IControllable;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.pipes.IPipeContainer;
public class DefaultActionProvider implements IActionProvider {
@ -31,7 +28,7 @@ public class DefaultActionProvider implements IActionProvider {
public Collection<IActionInternal> getInternalActions(IStatementContainer container) {
LinkedList<IActionInternal> res = new LinkedList<IActionInternal>();
if (container.getTile() instanceof IPipeTile) {
if (container.getTile() instanceof IPipeContainer) {
res.add(BuildCraftCore.actionRedstone);
}

View file

@ -40,8 +40,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.IAreaProvider;
import buildcraft.api.core.Position;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.DefaultProps;
import buildcraft.core.EntityBlock;
import buildcraft.core.IDropControlInventory;
@ -149,7 +149,7 @@ public final class Utils {
* successful, false otherwise.
*/
public static int addToRandomPipeAround(World world, int x, int y, int z, ForgeDirection from, ItemStack stack) {
List<IPipeTile> possiblePipes = new ArrayList<IPipeTile>();
List<IPipeContainer> possiblePipes = new ArrayList<IPipeContainer>();
List<ForgeDirection> pipeDirections = new ArrayList<ForgeDirection>();
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
@ -163,8 +163,8 @@ public final class Utils {
TileEntity tile = world.getTileEntity((int) pos.x, (int) pos.y, (int) pos.z);
if (tile instanceof IPipeTile) {
IPipeTile pipe = (IPipeTile) tile;
if (tile instanceof IPipeContainer) {
IPipeContainer pipe = (IPipeContainer) tile;
if (pipe.getPipeType() != PipeType.ITEM) {
continue;
}
@ -180,7 +180,7 @@ public final class Utils {
if (possiblePipes.size() > 0) {
int choice = RANDOM.nextInt(possiblePipes.size());
IPipeTile pipeEntry = possiblePipes.get(choice);
IPipeContainer pipeEntry = possiblePipes.get(choice);
return pipeEntry.injectItem(stack, true, pipeDirections.get(choice));
}
@ -366,7 +366,7 @@ public final class Utils {
return false;
}
if (!(tile1 instanceof IPipeTile) && !(tile2 instanceof IPipeTile)) {
if (!(tile1 instanceof IPipeContainer) && !(tile2 instanceof IPipeContainer)) {
return false;
}
@ -386,11 +386,11 @@ public final class Utils {
o = ForgeDirection.SOUTH;
}
if (tile1 instanceof IPipeTile && !((IPipeTile) tile1).isPipeConnected(o)) {
if (tile1 instanceof IPipeContainer && !((IPipeContainer) tile1).isPipeConnected(o)) {
return false;
}
if (tile2 instanceof IPipeTile && !((IPipeTile) tile2).isPipeConnected(o.getOpposite())) {
if (tile2 instanceof IPipeContainer && !((IPipeContainer) tile2).isPipeConnected(o.getOpposite())) {
return false;
}

View file

@ -16,8 +16,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyHandler;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeConnection;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.TileBuffer;
import buildcraft.core.TileBuildCraft;

View file

@ -21,9 +21,9 @@ import buildcraft.BuildCraftEnergy;
import buildcraft.api.power.IEngine;
import buildcraft.api.tiles.IHeatable;
import buildcraft.api.tools.IToolWrench;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeConnection;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.DefaultProps;
import buildcraft.core.TileBuildCraft;
import buildcraft.core.utils.MathUtils;
@ -383,7 +383,7 @@ public abstract class TileEngine extends TileBuildCraft implements IPipeConnecti
TileEntity tile = getTile(o);
if ((!pipesOnly || tile instanceof IPipeTile) && isPoweredTile(tile, o)) {
if ((!pipesOnly || tile instanceof IPipeContainer) && isPoweredTile(tile, o)) {
orientation = o;
worldObj.markBlockForUpdate(xCoord, yCoord, zCoord);
worldObj.notifyBlocksOfNeighborChange(xCoord, yCoord, zCoord, worldObj.getBlock(xCoord, yCoord, zCoord));

View file

@ -11,8 +11,8 @@ package buildcraft.energy;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.factory.TilePump;
public class TileEngineWood extends TileEngine {
@ -127,7 +127,7 @@ public class TileEngineWood extends TileEngine {
// TODO: Make a proper API out of this
if (tile instanceof TilePump ||
(tile instanceof IPipeTile && ((IPipeTile) tile).getPipeType() != PipeType.POWER)) {
(tile instanceof IPipeContainer && ((IPipeContainer) tile).getPipeType() != PipeType.POWER)) {
super.sendPower();
} else {
this.energy = 0;

View file

@ -14,8 +14,8 @@ import buildcraft.BuildCraftFactory;
import buildcraft.api.blueprints.BuilderAPI;
import buildcraft.api.tiles.IControllable;
import buildcraft.api.tiles.IHasWork;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeConnection;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.RFBattery;
import buildcraft.core.TileBuildCraft;
import buildcraft.core.utils.BlockUtils;

View file

@ -36,8 +36,8 @@ import buildcraft.api.core.SafeTimeTracker;
import buildcraft.api.filler.FillerManager;
import buildcraft.api.tiles.IControllable;
import buildcraft.api.tiles.IHasWork;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.pipes.IPipeConnection;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.core.Box;
import buildcraft.core.Box.Kind;
import buildcraft.core.CoreConstants;
@ -874,7 +874,7 @@ public class TileQuarry extends TileAbstractBuilder implements IHasWork, ISidedI
}
@Override
public ConnectOverride overridePipeConnection(IPipeTile.PipeType type, ForgeDirection with) {
return type == IPipeTile.PipeType.ITEM ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT;
public ConnectOverride overridePipeConnection(IPipeContainer.PipeType type, ForgeDirection with) {
return type == IPipeContainer.PipeType.ITEM ? ConnectOverride.CONNECT : ConnectOverride.DEFAULT;
}
}

View file

@ -52,9 +52,10 @@ import buildcraft.api.events.PipePlacedEvent;
import buildcraft.api.events.RobotPlacementEvent;
import buildcraft.api.gates.GateExpansions;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.api.tools.IToolWrench;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.BlockBuildCraft;
import buildcraft.core.CoreConstants;
import buildcraft.core.CreativeTabBuildCraft;
@ -67,6 +68,7 @@ import buildcraft.core.utils.MatrixTranformations;
import buildcraft.core.utils.Utils;
import buildcraft.transport.gates.GateDefinition;
import buildcraft.transport.gates.GateFactory;
import buildcraft.transport.gates.GatePluggable;
import buildcraft.transport.gates.ItemGate;
import buildcraft.transport.render.PipeRendererWorld;
import buildcraft.transport.utils.FacadeMatrix;
@ -84,10 +86,7 @@ public class BlockGenericPipe extends BlockBuildCraft {
static enum Part {
Pipe,
Gate,
Facade,
Plug,
RobotStation
Pluggable
}
static class RaytraceResult {
@ -253,20 +252,16 @@ public class BlockGenericPipe extends BlockBuildCraft {
if (rayTraceResult != null && rayTraceResult.boundingBox != null) {
AxisAlignedBB box = rayTraceResult.boundingBox;
switch (rayTraceResult.hitPart) {
case Gate:
case Plug:
case RobotStation: {
float scale = 0.001F;
box = box.expand(scale, scale, scale);
break;
}
case Pipe: {
float scale = 0.08F;
box = box.expand(scale, scale, scale);
break;
}
case Facade:
break;
case Pluggable: {
float scale = 0.001F;
box = box.expand(scale, scale, scale);
break;
}
case Pipe: {
float scale = 0.08F;
box = box.expand(scale, scale, scale);
break;
}
}
return box.getOffsetBoundingBox(x, y, z);
}
@ -338,11 +333,11 @@ public class BlockGenericPipe extends BlockBuildCraft {
}
}
// gates
// pluggables
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
if (pipe.hasGate(side)) {
AxisAlignedBB bb = getGateBoundingBox(side);
if (tileG.getPluggable(side) != null) {
AxisAlignedBB bb = tileG.getPluggable(side).getBoundingBox(side);
setBlockBounds(bb);
boxes[7 + side.ordinal()] = bb;
hits[7 + side.ordinal()] = super.collisionRayTrace(world, x, y, z, origin, direction);
@ -350,42 +345,6 @@ public class BlockGenericPipe extends BlockBuildCraft {
}
}
// facades
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
if (tileG.hasFacade(side)) {
AxisAlignedBB bb = getFacadeBoundingBox(side);
setBlockBounds(bb);
boxes[13 + side.ordinal()] = bb;
hits[13 + side.ordinal()] = super.collisionRayTrace(world, x, y, z, origin, direction);
sideHit[13 + side.ordinal()] = side;
}
}
// plugs
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
if (tileG.hasPlug(side)) {
AxisAlignedBB bb = getPlugBoundingBox(side);
setBlockBounds(bb);
boxes[19 + side.ordinal()] = bb;
hits[19 + side.ordinal()] = super.collisionRayTrace(world, x, y, z, origin, direction);
sideHit[19 + side.ordinal()] = side;
}
}
// robotStations
for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) {
if (tileG.hasRobotStation(side)) {
AxisAlignedBB bb = getRobotStationBoundingBox(side);
setBlockBounds(bb);
boxes[25 + side.ordinal()] = bb;
hits[25 + side.ordinal()] = super.collisionRayTrace(world, x, y, z, origin, direction);
sideHit[25 + side.ordinal()] = side;
}
}
// TODO: check wires
// get closest hit
@ -418,14 +377,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
if (minIndex < 7) {
hitPart = Part.Pipe;
} else if (minIndex < 13) {
hitPart = Part.Gate;
} else if (minIndex < 19) {
hitPart = Part.Facade;
} else if (minIndex < 25) {
hitPart = Part.Plug;
} else {
hitPart = Part.RobotStation;
hitPart = Part.Pluggable;
}
return new RaytraceResult(hitPart, hits[minIndex], boxes[minIndex], sideHit[minIndex]);
@ -436,73 +389,6 @@ public class BlockGenericPipe extends BlockBuildCraft {
setBlockBounds((float) bb.minX, (float) bb.minY, (float) bb.minZ, (float) bb.maxX, (float) bb.maxY, (float) bb.maxZ);
}
private AxisAlignedBB getGateBoundingBox(ForgeDirection side) {
float min = CoreConstants.PIPE_MIN_POS + 0.05F;
float max = CoreConstants.PIPE_MAX_POS - 0.05F;
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = min;
bounds[0][1] = max;
// Y START - END
bounds[1][0] = CoreConstants.PIPE_MIN_POS - 0.10F;
bounds[1][1] = CoreConstants.PIPE_MIN_POS;
// Z START - END
bounds[2][0] = min;
bounds[2][1] = max;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
private AxisAlignedBB getFacadeBoundingBox(ForgeDirection side) {
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = 0.0F;
bounds[0][1] = 1.0F;
// Y START - END
bounds[1][0] = 0.0F;
bounds[1][1] = TransportConstants.FACADE_THICKNESS;
// Z START - END
bounds[2][0] = 0.0F;
bounds[2][1] = 1.0F;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
private AxisAlignedBB getPlugBoundingBox(ForgeDirection side) {
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = 0.25F;
bounds[0][1] = 0.75F;
// Y START - END
bounds[1][0] = 0.125F;
bounds[1][1] = 0.251F;
// Z START - END
bounds[2][0] = 0.25F;
bounds[2][1] = 0.75F;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
private AxisAlignedBB getRobotStationBoundingBox(ForgeDirection side) {
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = 0.25F;
bounds[0][1] = 0.75F;
// Y START - END
bounds[1][0] = 0.125F;
bounds[1][1] = 0.251F;
// Z START - END
bounds[2][0] = 0.25F;
bounds[2][1] = 0.75F;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
private AxisAlignedBB getPipeBoundingBox(ForgeDirection side) {
float min = CoreConstants.PIPE_MIN_POS;
float max = CoreConstants.PIPE_MAX_POS;
@ -625,25 +511,27 @@ public class BlockGenericPipe extends BlockBuildCraft {
if (rayTraceResult != null && rayTraceResult.boundingBox != null) {
switch (rayTraceResult.hitPart) {
case Gate:
case Pluggable: {
Pipe<?> pipe = getPipe(world, x, y, z);
Gate gate = pipe.gates[rayTraceResult.sideHit.ordinal()];
return gate != null ? gate.getGateItem() : null;
case Plug:
return new ItemStack(BuildCraftTransport.plugItem);
case RobotStation:
return new ItemStack(BuildCraftTransport.robotStationItem);
case Pipe:
return new ItemStack(getPipe(world, x, y, z).item, 1, getPipe(world, x, y, z).container.getItemMetadata());
case Facade:
ForgeDirection dir = ForgeDirection
.getOrientation(target.sideHit);
FacadeMatrix matrix = getPipe(world, x, y, z).container.renderState.facadeMatrix;
Block block = matrix.getFacadeBlock(dir);
if (block != null) {
return BuildCraftTransport.facadeItem.getFacadeForBlock(block,
matrix.getFacadeMetaId(dir));
IPipePluggable pluggable = pipe.container.getPluggable(rayTraceResult.sideHit);
if (pluggable instanceof FacadePluggable) {
ForgeDirection dir = ForgeDirection
.getOrientation(target.sideHit);
FacadeMatrix matrix = getPipe(world, x, y, z).container.renderState.facadeMatrix;
Block block = matrix.getFacadeBlock(dir);
if (block != null) {
return BuildCraftTransport.facadeItem.getFacadeForBlock(block,
matrix.getFacadeMetaId(dir));
}
} else {
ItemStack[] drops = pluggable.getDropItems(pipe.container);
if (drops != null && drops.length > 0) {
return drops[0];
}
}
}
case Pipe:
return new ItemStack(getPipe(world, x, y, z).item, 1, getPipe(world, x, y, z).container.getItemMetadata());
}
}
return null;
@ -788,7 +676,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
RaytraceResult rayTraceResult = doRayTrace(world, x, y, z,
player);
if (rayTraceResult != null && rayTraceResult.hitPart == Part.RobotStation) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Pluggable
&& pipe.container.getPluggable(rayTraceResult.sideHit) instanceof RobotStationPluggable) {
DockingStation station = pipe.container.getStation(rayTraceResult.sideHit);
if (!station.isTaken()) {
@ -831,7 +720,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
RaytraceResult rayTraceResult = doRayTrace(world, x, y, z, player);
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Gate) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Pluggable
&& pipe.container.getPluggable(rayTraceResult.sideHit) instanceof GatePluggable) {
clickedGate = pipe.gates[rayTraceResult.sideHit.ordinal()];
}
@ -849,7 +739,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
private boolean addOrStripGate(World world, int x, int y, int z, EntityPlayer player, ForgeDirection side, Pipe<?> pipe) {
RaytraceResult rayTraceResult = doRayTrace(world, x, y, z, player);
if (player.isSneaking()) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Gate) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Pluggable
&& pipe.container.getPluggable(rayTraceResult.sideHit) instanceof GatePluggable) {
if (pipe.container.hasGate(rayTraceResult.sideHit)) {
return pipe.container.dropSideItems(rayTraceResult.sideHit);
}
@ -923,7 +814,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
private boolean addOrStripFacade(World world, int x, int y, int z, EntityPlayer player, ForgeDirection side, Pipe<?> pipe) {
RaytraceResult rayTraceResult = doRayTrace(world, x, y, z, player);
if (player.isSneaking()) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Facade) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Pluggable
&& pipe.container.getPluggable(rayTraceResult.sideHit) instanceof FacadePluggable) {
if (pipe.container.hasFacade(rayTraceResult.sideHit)) {
return pipe.container.dropSideItems(rayTraceResult.sideHit);
}
@ -951,7 +843,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
private boolean addOrStripPlug(World world, int x, int y, int z, EntityPlayer player, ForgeDirection side, Pipe<?> pipe) {
RaytraceResult rayTraceResult = doRayTrace(world, x, y, z, player);
if (player.isSneaking()) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Plug) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Pluggable
&& pipe.container.getPluggable(rayTraceResult.sideHit) instanceof PlugPluggable) {
if (pipe.container.dropSideItems(rayTraceResult.sideHit)) {
return true;
}
@ -968,7 +861,8 @@ public class BlockGenericPipe extends BlockBuildCraft {
private boolean addOrStripRobotStation(World world, int x, int y, int z, EntityPlayer player, ForgeDirection side, Pipe<?> pipe) {
RaytraceResult rayTraceResult = doRayTrace(world, x, y, z, player);
if (player.isSneaking()) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.RobotStation) {
if (rayTraceResult != null && rayTraceResult.hitPart == Part.Pluggable
&& pipe.container.getPluggable(rayTraceResult.sideHit) instanceof RobotStationPluggable) {
if (pipe.container.dropSideItems(rayTraceResult.sideHit)) {
return true;
}
@ -1311,7 +1205,7 @@ public class BlockGenericPipe extends BlockBuildCraft {
@Override
public boolean recolourBlock(World world, int x, int y, int z, ForgeDirection side, int colour) {
TileGenericPipe pipeTile = (TileGenericPipe) world.getTileEntity(x, y, z);
if (!pipeTile.hasPlug(side)) {
if (!pipeTile.hasBlockingPluggable(side)) {
return pipeTile.setColor(colour);
}

View file

@ -0,0 +1,98 @@
package buildcraft.transport;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipePluggableRenderer;
import buildcraft.core.utils.MatrixTranformations;
public class FacadePluggable implements IPipePluggable {
public ItemFacade.FacadeState[] states;
public FacadePluggable(ItemFacade.FacadeState[] states) {
this.states = states;
}
public FacadePluggable() {
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
if (states != null) {
nbt.setTag("states", ItemFacade.FacadeState.writeArray(states));
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
if (nbt.hasKey("states")) {
states = ItemFacade.FacadeState.readArray(nbt.getTagList("states", Constants.NBT.TAG_COMPOUND));
}
}
@Override
public ItemStack[] getDropItems(IPipeContainer pipe) {
return states == null ? null : new ItemStack[] { ItemFacade.getFacade(states) };
}
@Override
public void onAttachedPipe(IPipeContainer pipe, ForgeDirection direction) {
}
@Override
public void onDetachedPipe(IPipeContainer pipe, ForgeDirection direction) {
}
@Override
public boolean isBlocking(IPipeContainer pipe, ForgeDirection direction) {
return false;
}
@Override
public void invalidate() {
}
@Override
public void validate(IPipeContainer pipe, ForgeDirection direction) {
}
@Override
public AxisAlignedBB getBoundingBox(ForgeDirection side) {
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = 0.0F;
bounds[0][1] = 1.0F;
// Y START - END
bounds[1][0] = 0.0F;
bounds[1][1] = TransportConstants.FACADE_THICKNESS;
// Z START - END
bounds[2][0] = 0.0F;
bounds[2][1] = 1.0F;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
@Override
public IPipePluggableRenderer getRenderer() {
return null;
}
@Override
public void writeData(ByteBuf data) {
}
@Override
public void readData(ByteBuf data) {
}
}

View file

@ -35,8 +35,8 @@ import buildcraft.api.statements.ITriggerExternal;
import buildcraft.api.statements.ITriggerInternal;
import buildcraft.api.statements.StatementManager;
import buildcraft.api.statements.StatementParameterItemStack;
import buildcraft.api.transport.IPipe;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.IPipe;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.GuiIds;
import buildcraft.transport.gates.GateDefinition.GateLogic;
import buildcraft.transport.gates.GateDefinition.GateMaterial;
@ -472,7 +472,7 @@ public final class Gate implements IGate, IStatementContainer {
((IActionInternal) action).actionActivate(this, slot.parameters);
} else if (action instanceof IActionExternal) {
for (ForgeDirection side: ForgeDirection.VALID_DIRECTIONS) {
TileEntity tile = this.getPipe().getTile().getAdjacentTile(side);
TileEntity tile = this.getPipe().getTile().getNeighborTile(side);
if (tile != null) {
((IActionExternal) action).actionActivate(tile, side, this, slot.parameters);
}
@ -532,7 +532,7 @@ public final class Gate implements IGate, IStatementContainer {
}
} else if (trigger instanceof ITriggerExternal) {
for (ForgeDirection side: ForgeDirection.VALID_DIRECTIONS) {
TileEntity tile = this.getPipe().getTile().getAdjacentTile(side);
TileEntity tile = this.getPipe().getTile().getNeighborTile(side);
if (tile != null && ((ITriggerExternal) trigger).isTriggerActive(tile, side, this, parameters)) {
return true;
}

View file

@ -9,9 +9,9 @@
package buildcraft.transport;
import net.minecraft.inventory.IInventory;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
public interface IDiamondPipe extends IClientState {
public interface IDiamondPipe extends ISerializable {
IInventory getFilters();
}

View file

@ -9,9 +9,9 @@
package buildcraft.transport;
import net.minecraft.inventory.IInventory;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
public interface IFilteredPipe extends IClientState {
public interface IFilteredPipe extends ISerializable {
IInventory getFilters();
}

View file

@ -37,9 +37,9 @@ import buildcraft.api.core.Position;
import buildcraft.api.facades.FacadeType;
import buildcraft.api.facades.IFacadeItem;
import buildcraft.api.recipes.BuildcraftRecipeRegistry;
import buildcraft.api.transport.IPipePluggable;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.BlockSpring;
import buildcraft.core.CreativeTabBuildCraft;
import buildcraft.core.ItemBuildCraft;
@ -446,61 +446,6 @@ public class ItemFacade extends ItemBuildCraft implements IFacadeItem {
}
}
public static class FacadePluggable implements IPipePluggable {
public FacadeState[] states;
public FacadePluggable(FacadeState[] states) {
this.states = states;
}
public FacadePluggable() {
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
if (states != null) {
nbt.setTag("states", FacadeState.writeArray(states));
}
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
if (nbt.hasKey("states")) {
states = FacadeState.readArray(nbt.getTagList("states", Constants.NBT.TAG_COMPOUND));
}
}
@Override
public ItemStack[] getDropItems(IPipeTile pipe) {
return states == null ? null : new ItemStack[] { getFacade(states) };
}
@Override
public void onAttachedPipe(IPipeTile pipe, ForgeDirection direction) {
}
@Override
public void onDetachedPipe(IPipeTile pipe, ForgeDirection direction) {
}
@Override
public boolean blocking(IPipeTile pipe, ForgeDirection direction) {
return false;
}
@Override
public void invalidate() {
}
@Override
public void validate(IPipeTile pipe, ForgeDirection direction) {
}
}
public class FacadeRecipe implements IRecipe {
@Override

View file

@ -11,11 +11,13 @@ import net.minecraft.util.IIcon;
import net.minecraft.world.World;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.core.ItemBuildCraft;
import buildcraft.core.utils.NBTUtils;
import buildcraft.transport.BlockGenericPipe.Part;
import buildcraft.transport.BlockGenericPipe.RaytraceResult;
import buildcraft.transport.gates.GateDefinition.GateMaterial;
import buildcraft.transport.gates.GatePluggable;
public class ItemGateCopier extends ItemBuildCraft {
@ -53,8 +55,11 @@ public class ItemGateCopier extends ItemBuildCraft {
RaytraceResult rayTraceResult = ((BlockGenericPipe) block).doRayTrace(world, x, y, z, player);
if (rayTraceResult != null && rayTraceResult.boundingBox != null && rayTraceResult.hitPart == Part.Gate) {
gate = ((TileGenericPipe) tile).pipe.gates[rayTraceResult.sideHit.ordinal()];
if (rayTraceResult != null && rayTraceResult.boundingBox != null && rayTraceResult.hitPart == Part.Pluggable) {
IPipePluggable pluggable = ((TileGenericPipe) tile).getPluggable(rayTraceResult.sideHit);
if (pluggable instanceof GatePluggable) {
gate = ((TileGenericPipe) tile).pipe.gates[rayTraceResult.sideHit.ordinal()];
}
}
if (isCopying) {

View file

@ -20,7 +20,7 @@ import cpw.mods.fml.common.registry.GameRegistry;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.ItemBuildCraft;
public class ItemPipeWire extends ItemBuildCraft {

View file

@ -20,8 +20,8 @@ import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.transport.IPipePluggable;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.core.ItemBuildCraft;
public class ItemPlug extends ItemBuildCraft {
@ -52,49 +52,4 @@ public class ItemPlug extends ItemBuildCraft {
return 0;
}
public static class PlugPluggable implements IPipePluggable {
public PlugPluggable() {
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
}
@Override
public ItemStack[] getDropItems(IPipeTile pipe) {
return new ItemStack[] { new ItemStack(BuildCraftTransport.plugItem) };
}
@Override
public void onAttachedPipe(IPipeTile pipe, ForgeDirection direction) {
}
@Override
public void onDetachedPipe(IPipeTile pipe, ForgeDirection direction) {
}
@Override
public boolean blocking(IPipeTile pipe, ForgeDirection direction) {
return true;
}
@Override
public void invalidate() {
}
@Override
public void validate(IPipeTile pipe, ForgeDirection direction) {
}
}
}

View file

@ -20,8 +20,8 @@ import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.transport.IPipePluggable;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.core.CreativeTabBuildCraft;
import buildcraft.core.ItemBuildCraft;
import buildcraft.core.robots.DockingStation;
@ -55,76 +55,4 @@ public class ItemRobotStation extends ItemBuildCraft {
return 0;
}
public static class RobotStationPluggable implements IPipePluggable {
private DockingStation station;
private boolean isValid = false;
public RobotStationPluggable() {
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
}
@Override
public ItemStack[] getDropItems(IPipeTile pipe) {
return new ItemStack[] { new ItemStack(BuildCraftTransport.robotStationItem) };
}
@Override
public void onAttachedPipe(IPipeTile pipe, ForgeDirection direction) {
validate(pipe, direction);
}
@Override
public void onDetachedPipe(IPipeTile pipe, ForgeDirection direction) {
invalidate();
}
public DockingStation getStation() {
return station;
}
@Override
public boolean blocking(IPipeTile pipe, ForgeDirection direction) {
return true;
}
@Override
public void invalidate() {
if (station != null
&& station.getPipe() != null
&& !station.getPipe().getWorld().isRemote) {
RobotRegistry.getRegistry(station.world).removeStation(station);
isValid = false;
}
}
@Override
public void validate(IPipeTile pipe, ForgeDirection direction) {
TileGenericPipe gPipe = (TileGenericPipe) pipe;
if (!isValid && !gPipe.getWorld().isRemote) {
station = (DockingStation)
RobotRegistry.getRegistry(gPipe.getWorld()).getStation(
gPipe.xCoord,
gPipe.yCoord,
gPipe.zCoord,
direction);
if (station == null) {
station = new DockingStation(gPipe, direction);
RobotRegistry.getRegistry(gPipe.getWorld()).registerStation(station);
}
isValid = true;
}
}
}
}

View file

@ -33,9 +33,9 @@ import buildcraft.api.core.IIconProvider;
import buildcraft.api.gates.IGate;
import buildcraft.api.statements.ActionState;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.transport.IPipe;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.IPipe;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.IDropControlInventory;
import buildcraft.core.inventory.InvUtils;
import buildcraft.core.utils.Utils;
@ -495,16 +495,10 @@ public abstract class Pipe<T extends PipeTransport> implements IDropControlInven
}
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
if (container.hasFacade(direction)) {
result.add (container.getFacade(direction));
}
if (container.hasPlug(direction)) {
result.add (new ItemStack(BuildCraftTransport.plugItem));
}
if (container.hasRobotStation(direction)) {
result.add (new ItemStack(BuildCraftTransport.robotStationItem));
if (container.hasPluggable(direction)) {
for (ItemStack stack : container.getPluggable(direction).getDropItems(container)) {
result.add(stack);
}
}
}
@ -623,22 +617,7 @@ public abstract class Pipe<T extends PipeTransport> implements IDropControlInven
}
@Override
public int x() {
return container.xCoord;
}
@Override
public int y() {
return container.yCoord;
}
@Override
public int z() {
return container.zCoord;
}
@Override
public IPipeTile getTile() {
public IPipeContainer getTile() {
return container;
}

View file

@ -0,0 +1,57 @@
package buildcraft.transport;
import io.netty.buffer.ByteBuf;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.ISerializable;
import buildcraft.api.pipes.IPipe;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.PipeManager;
import buildcraft.transport.utils.ConnectionMatrix;
public class PipePluggableState implements ISerializable {
private IPipePluggable[] pluggables = new IPipePluggable[6];
private ConnectionMatrix pluggableMatrix = new ConnectionMatrix();
public PipePluggableState() {
}
public IPipePluggable[] getPluggables() {
return pluggables;
}
public void setPluggables(IPipePluggable[] pluggables) {
this.pluggables = pluggables;
this.pluggableMatrix.clean();
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
this.pluggableMatrix.setConnected(dir, pluggables[dir.ordinal()] != null);
}
}
@Override
public void writeData(ByteBuf data) {
this.pluggableMatrix.writeData(data);
for (IPipePluggable p : pluggables) {
if (p != null) {
data.writeShort(PipeManager.pipePluggables.indexOf(p.getClass()));
p.writeData(data);
}
}
}
@Override
public void readData(ByteBuf data) {
this.pluggableMatrix.readData(data);
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if (this.pluggableMatrix.isConnected(dir)) {
try {
IPipePluggable p = PipeManager.pipePluggables.get(data.readUnsignedShort()).newInstance();
p.readData(data);
pluggables[dir.ordinal()] = p;
} catch(Exception e) {
e.printStackTrace();
}
}
}
}
}

View file

@ -10,21 +10,18 @@ package buildcraft.transport;
import io.netty.buffer.ByteBuf;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
import buildcraft.transport.utils.ConnectionMatrix;
import buildcraft.transport.utils.FacadeMatrix;
import buildcraft.transport.utils.GateMatrix;
import buildcraft.transport.utils.RobotStationMatrix;
import buildcraft.transport.utils.TextureMatrix;
import buildcraft.transport.utils.WireMatrix;
public class PipeRenderState implements IClientState {
public class PipeRenderState implements ISerializable {
public final ConnectionMatrix pipeConnectionMatrix = new ConnectionMatrix();
public final TextureMatrix textureMatrix = new TextureMatrix();
public final WireMatrix wireMatrix = new WireMatrix();
public final ConnectionMatrix plugMatrix = new ConnectionMatrix();
public final RobotStationMatrix robotStationMatrix = new RobotStationMatrix();
public final FacadeMatrix facadeMatrix = new FacadeMatrix();
public final GateMatrix gateMatrix = new GateMatrix();
public byte glassColor = -1;
@ -37,22 +34,19 @@ public class PipeRenderState implements IClientState {
textureMatrix.clean();
facadeMatrix.clean();
wireMatrix.clean();
plugMatrix.clean();
robotStationMatrix.clean();
gateMatrix.clean();
}
public boolean isDirty() {
return dirty || pipeConnectionMatrix.isDirty()
|| textureMatrix.isDirty() || wireMatrix.isDirty()
|| facadeMatrix.isDirty() || plugMatrix.isDirty()
|| robotStationMatrix.isDirty() || gateMatrix.isDirty();
|| facadeMatrix.isDirty() || gateMatrix.isDirty();
}
public boolean needsRenderUpdate() {
return pipeConnectionMatrix.isDirty() || textureMatrix.isDirty()
|| facadeMatrix.isDirty() || plugMatrix.isDirty()
|| robotStationMatrix.isDirty() || gateMatrix.isDirty();
|| wireMatrix.isDirty() || facadeMatrix.isDirty()
|| gateMatrix.isDirty();
}
@Override
@ -62,8 +56,6 @@ public class PipeRenderState implements IClientState {
textureMatrix.writeData(data);
wireMatrix.writeData(data);
facadeMatrix.writeData(data);
plugMatrix.writeData(data);
robotStationMatrix.writeData(data);
gateMatrix.writeData(data);
}
@ -74,8 +66,6 @@ public class PipeRenderState implements IClientState {
textureMatrix.readData(data);
wireMatrix.readData(data);
facadeMatrix.readData(data);
plugMatrix.readData(data);
robotStationMatrix.readData(data);
gateMatrix.readData(data);
}
}

View file

@ -17,7 +17,7 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.utils.BitSetUtils;
public abstract class PipeTransport {

View file

@ -24,7 +24,7 @@ import net.minecraftforge.fluids.IFluidHandler;
import buildcraft.BuildCraftCore;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.SafeTimeTracker;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.DefaultProps;
import buildcraft.core.utils.MathUtils;
import buildcraft.transport.network.PacketFluidUpdate;

View file

@ -28,7 +28,7 @@ import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.BCLog;
import buildcraft.api.core.Position;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.DefaultProps;
import buildcraft.core.inventory.Transactor;
import buildcraft.core.utils.BlockUtils;

View file

@ -22,7 +22,7 @@ import buildcraft.BuildCraftCore;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.SafeTimeTracker;
import buildcraft.api.power.IEngine;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.core.DefaultProps;
import buildcraft.core.TileBuildCraft;
import buildcraft.transport.network.PacketPowerUpdate;

View file

@ -12,7 +12,7 @@ import net.minecraft.tileentity.TileEntity;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.pipes.IPipeContainer.PipeType;
public class PipeTransportStructure extends PipeTransport {

View file

@ -0,0 +1,137 @@
package buildcraft.transport;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.render.ITextureStates;
import buildcraft.api.pipes.IPipe;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipePluggableRenderer;
import buildcraft.core.utils.MatrixTranformations;
public class PlugPluggable implements IPipePluggable {
public class PlugPluggableRenderer implements IPipePluggableRenderer {
private float zFightOffset = 1 / 4096.0F;
@Override
public void renderPluggable(RenderBlocks renderblocks, IPipe pipe, ForgeDirection side, IPipePluggable pipePluggable, ITextureStates blockStateMachine, int x, int y, int z) {
float[][] zeroState = new float[3][2];
// X START - END
zeroState[0][0] = 0.25F + zFightOffset;
zeroState[0][1] = 0.75F - zFightOffset;
// Y START - END
zeroState[1][0] = 0.125F;
zeroState[1][1] = 0.251F;
// Z START - END
zeroState[2][0] = 0.25F + zFightOffset;
zeroState[2][1] = 0.75F - zFightOffset;
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, side);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
// X START - END
zeroState[0][0] = 0.25F + 0.125F / 2 + zFightOffset;
zeroState[0][1] = 0.75F - 0.125F / 2 + zFightOffset;
// Y START - END
zeroState[1][0] = 0.25F;
zeroState[1][1] = 0.25F + 0.125F;
// Z START - END
zeroState[2][0] = 0.25F + 0.125F / 2;
zeroState[2][1] = 0.75F - 0.125F / 2;
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe
rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, side);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
}
}
public PlugPluggable() {
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
}
@Override
public ItemStack[] getDropItems(IPipeContainer pipe) {
return new ItemStack[] { new ItemStack(BuildCraftTransport.plugItem) };
}
@Override
public void onAttachedPipe(IPipeContainer pipe, ForgeDirection direction) {
}
@Override
public void onDetachedPipe(IPipeContainer pipe, ForgeDirection direction) {
}
@Override
public boolean isBlocking(IPipeContainer pipe, ForgeDirection direction) {
return true;
}
@Override
public void invalidate() {
}
@Override
public void validate(IPipeContainer pipe, ForgeDirection direction) {
}
@Override
public AxisAlignedBB getBoundingBox(ForgeDirection side) {
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = 0.25F;
bounds[0][1] = 0.75F;
// Y START - END
bounds[1][0] = 0.125F;
bounds[1][1] = 0.251F;
// Z START - END
bounds[2][0] = 0.25F;
bounds[2][1] = 0.75F;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
@Override
public IPipePluggableRenderer getRenderer() {
return new PlugPluggableRenderer();
}
@Override
public void writeData(ByteBuf data) {
}
@Override
public void readData(ByteBuf data) {
}
}

View file

@ -0,0 +1,256 @@
package buildcraft.transport;
import java.awt.*;
import io.netty.buffer.ByteBuf;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.render.ITextureStates;
import buildcraft.api.pipes.IPipe;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipePluggableRenderer;
import buildcraft.core.robots.DockingStation;
import buildcraft.core.robots.RobotRegistry;
import buildcraft.core.utils.MatrixTranformations;
/**
* Created by asie on 12/15/14.
*/
public class RobotStationPluggable implements IPipePluggable {
public class RobotStationPluggableRenderer implements IPipePluggableRenderer {
private float zFightOffset = 1 / 4096.0F;
private void robotStationPartRender(RenderBlocks renderblocks, RobotStationState state,
ForgeDirection side, ITextureStates blockStateMachine, int x, int y, int z,
float xStart, float xEnd, float yStart, float yEnd, float zStart,
float zEnd) {
float[][] zeroState = new float[3][2];
// X START - END
zeroState[0][0] = xStart + zFightOffset;
zeroState[0][1] = xEnd - zFightOffset;
// Y START - END
zeroState[1][0] = yStart;
zeroState[1][1] = yEnd;
// Z START - END
zeroState[2][0] = zStart + zFightOffset;
zeroState[2][1] = zEnd - zFightOffset;
switch (state) {
case None:
case Available:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal()));
break;
case Reserved:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal()));
break;
case Linked:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal()));
break;
}
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, side);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0],
rotated[2][0], rotated[0][1], rotated[1][1],
rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
}
@Override
public void renderPluggable(RenderBlocks renderblocks, IPipe pipe, ForgeDirection side, IPipePluggable pipePluggable, ITextureStates blockStateMachine, int x, int y, int z) {
RobotStationState state = ((RobotStationPluggable) pipePluggable).renderState;
//float width = 0.075F;
robotStationPartRender (renderblocks, state, side, blockStateMachine, x, y, z,
0.45F, 0.55F,
0.0F, 0.224F,
0.45F, 0.55F);
/*pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.25F, 0.75F,
0.025F, 0.224F,
0.25F, 0.25F + width);
pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.25F, 0.75F,
0.025F, 0.224F,
0.75F - width, 0.75F);
pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.25F, 0.25F + width,
0.025F, 0.224F,
0.25F + width, 0.75F - width);
pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.75F - width, 0.75F,
0.025F, 0.224F,
0.25F + width, 0.75F - width);*/
float[][] zeroState = new float[3][2];
// X START - END
zeroState[0][0] = 0.25F + zFightOffset;
zeroState[0][1] = 0.75F - zFightOffset;
// Y START - END
zeroState[1][0] = 0.225F;
zeroState[1][1] = 0.251F;
// Z START - END
zeroState[2][0] = 0.25F + zFightOffset;
zeroState[2][1] = 0.75F - zFightOffset;
switch(state) {
case None:
case Available:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal()));
break;
case Reserved:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal()));
break;
case Linked:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal()));
break;
}
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, side);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0],
rotated[2][0], rotated[0][1], rotated[1][1],
rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
}
}
public static enum RobotStationState {
None,
Available,
Reserved,
Linked
}
private RobotStationState renderState;
private DockingStation station;
private boolean isValid = false;
public RobotStationPluggable() {
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
}
@Override
public ItemStack[] getDropItems(IPipeContainer pipe) {
return new ItemStack[] { new ItemStack(BuildCraftTransport.robotStationItem) };
}
@Override
public void onAttachedPipe(IPipeContainer pipe, ForgeDirection direction) {
validate(pipe, direction);
}
@Override
public void onDetachedPipe(IPipeContainer pipe, ForgeDirection direction) {
invalidate();
}
public DockingStation getStation() {
return station;
}
@Override
public boolean isBlocking(IPipeContainer pipe, ForgeDirection direction) {
return true;
}
@Override
public void invalidate() {
if (station != null
&& station.getPipe() != null
&& !station.getPipe().getWorld().isRemote) {
RobotRegistry.getRegistry(station.world).removeStation(station);
isValid = false;
}
}
@Override
public void validate(IPipeContainer pipe, ForgeDirection direction) {
TileGenericPipe gPipe = (TileGenericPipe) pipe;
if (!isValid && !gPipe.getWorld().isRemote) {
station = (DockingStation)
RobotRegistry.getRegistry(gPipe.getWorld()).getStation(
gPipe.xCoord,
gPipe.yCoord,
gPipe.zCoord,
direction);
if (station == null) {
station = new DockingStation(gPipe, direction);
RobotRegistry.getRegistry(gPipe.getWorld()).registerStation(station);
}
isValid = true;
}
}
@Override
public AxisAlignedBB getBoundingBox(ForgeDirection side) {
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = 0.25F;
bounds[0][1] = 0.75F;
// Y START - END
bounds[1][0] = 0.125F;
bounds[1][1] = 0.251F;
// Z START - END
bounds[2][0] = 0.25F;
bounds[2][1] = 0.75F;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
public RobotStationState getRenderState() {
return renderState;
}
@Override
public IPipePluggableRenderer getRenderer() {
return new RobotStationPluggableRenderer();
}
@Override
public void writeData(ByteBuf data) {
DockingStation station = getStation();
this.renderState = station.isTaken()
? (station.isMainStation() ? RobotStationState.Linked : RobotStationState.Reserved)
: RobotStationState.Available;
data.writeByte(getRenderState().ordinal());
}
@Override
public void readData(ByteBuf data) {
this.renderState = RobotStationState.values()[data.readUnsignedByte()];
}
}

View file

@ -37,18 +37,19 @@ import buildcraft.api.core.EnumColor;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.core.Position;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.transport.IPipe;
import buildcraft.api.transport.IPipeConnection;
import buildcraft.api.transport.IPipePluggable;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.IPipe;
import buildcraft.api.pipes.IPipeConnection;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.PipeManager;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.DefaultProps;
import buildcraft.core.IDropControlInventory;
import buildcraft.core.ITileBufferHolder;
import buildcraft.core.TileBuffer;
import buildcraft.core.inventory.InvUtils;
import buildcraft.core.network.BuildCraftPacket;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
import buildcraft.core.network.IGuiReturnHandler;
import buildcraft.core.network.ISyncedTile;
import buildcraft.core.network.PacketTileState;
@ -56,15 +57,15 @@ import buildcraft.core.robots.DockingStation;
import buildcraft.core.utils.Utils;
import buildcraft.transport.ItemFacade.FacadeState;
import buildcraft.transport.gates.GateFactory;
import buildcraft.transport.gates.ItemGate;
import buildcraft.transport.utils.RobotStationState;
import buildcraft.transport.gates.GatePluggable;
public class TileGenericPipe extends TileEntity implements IFluidHandler,
IPipeTile, ITileBufferHolder, IEnergyHandler, IDropControlInventory,
IPipeContainer, ITileBufferHolder, IEnergyHandler, IDropControlInventory,
ISyncedTile, ISolidSideTile, IGuiReturnHandler {
public boolean initialized = false;
public final PipeRenderState renderState = new PipeRenderState();
public final PipePluggableState pluggableState = new PipePluggableState();
public final CoreState coreState = new CoreState();
public boolean[] pipeConnectionsBuffer = new boolean[6];
@ -80,41 +81,21 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
protected boolean resyncGateExpansions = false;
protected boolean attachPluggables = false;
private SideProperties sideProperties = new SideProperties();
private TileBuffer[] tileBuffer;
private int glassColor = -1;
public static class CoreState implements IClientState {
public static class CoreState implements ISerializable {
public int pipeId = -1;
public ItemGate.GatePluggable[] gates = new ItemGate.GatePluggable[ForgeDirection.VALID_DIRECTIONS.length];
@Override
public void writeData(ByteBuf data) {
data.writeInt(pipeId);
for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
ItemGate.GatePluggable gate = gates[i];
boolean gateValid = gate != null;
data.writeBoolean(gateValid);
if (gateValid) {
gate.writeToByteBuf(data);
}
}
}
@Override
public void readData(ByteBuf data) {
pipeId = data.readInt();
for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
if (data.readBoolean()) {
ItemGate.GatePluggable gate = gates[i];
if (gate == null) {
gates[i] = gate = new ItemGate.GatePluggable();
}
gate.readFromByteBuf(data);
} else {
gates[i] = null;
}
}
}
}
@ -129,7 +110,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
nbt.removeTag(key);
} else {
NBTTagCompound pluggableData = new NBTTagCompound();
pluggableData.setString("pluggableClass", pluggable.getClass().getName());
pluggableData.setString("pluggableName", PipeManager.getPluggableName(pluggable.getClass()));
pluggable.writeToNBT(pluggableData);
nbt.setTag(key, pluggableData);
}
@ -144,7 +125,22 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
try {
NBTTagCompound pluggableData = nbt.getCompoundTag(key);
Class<?> pluggableClass = Class.forName(pluggableData.getString("pluggableClass"));
Class<?> pluggableClass = null;
// Migration support for 6.1.x/6.2.x
if (pluggableData.hasKey("pluggableClass")) {
String c = pluggableData.getString("pluggableClass");
if ("buildcraft.transport.gates.ItemGate$GatePluggable".equals(c)) {
pluggableClass = GatePluggable.class;
} else if ("buildcraft.transport.gates.ItemFacade$FacadePluggable".equals(c)) {
pluggableClass = FacadePluggable.class;
} else if ("buildcraft.transport.gates.ItemPlug$PlugPluggable".equals(c)) {
pluggableClass = PlugPluggable.class;
} else if ("buildcraft.transport.gates.ItemRobotStation$RobotStationPluggable".equals(c)) {
pluggableClass = RobotStationPluggable.class;
}
} else {
pluggableClass = PipeManager.getPluggableByName(pluggableData.getString("pluggableName"));
}
if (!IPipePluggable.class.isAssignableFrom(pluggableClass)) {
BCLog.logger.warn("Wrong pluggable class: " + pluggableClass);
continue;
@ -162,7 +158,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
IPipePluggable pluggable = null;
if (nbt.hasKey("facadeState[" + i + "]")) {
pluggable = new ItemFacade.FacadePluggable(FacadeState.readArray(nbt.getTagList("facadeState[" + i + "]", Constants.NBT.TAG_COMPOUND)));
pluggable = new FacadePluggable(FacadeState.readArray(nbt.getTagList("facadeState[" + i + "]", Constants.NBT.TAG_COMPOUND)));
} else {
// Migration support for 5.0.x and 6.0.x
if (nbt.hasKey("facadeBlocks[" + i + "]")) {
@ -172,7 +168,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
if (blockId != 0) {
int metadata = nbt.getInteger("facadeMeta[" + i + "]");
pluggable = new ItemFacade.FacadePluggable(new FacadeState[]{FacadeState.create(block, metadata)});
pluggable = new FacadePluggable(new FacadeState[]{FacadeState.create(block, metadata)});
}
} else if (nbt.hasKey("facadeBlocksStr[" + i + "][0]")) {
// 6.0.x
@ -186,18 +182,18 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
nbt.getInteger("facadeMeta[" + i + "][1]"),
PipeWire.fromOrdinal(nbt.getInteger("facadeWires[" + i + "]"))
);
pluggable = new ItemFacade.FacadePluggable(new FacadeState[]{mainState, phasedState});
pluggable = new FacadePluggable(new FacadeState[]{mainState, phasedState});
} else {
pluggable = new ItemFacade.FacadePluggable(new FacadeState[]{mainState});
pluggable = new FacadePluggable(new FacadeState[]{mainState});
}
}
}
if (nbt.getBoolean("plug[" + i + "]")) {
pluggable = new ItemPlug.PlugPluggable();
pluggable = new PlugPluggable();
}
if (nbt.getBoolean("robotStation[" + i + "]")) {
pluggable = new ItemRobotStation.RobotStationPluggable();
pluggable = new RobotStationPluggable();
}
if (pluggable != null) {
@ -251,8 +247,6 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
}
private SideProperties sideProperties = new SideProperties();
public TileGenericPipe() {
}
@ -501,11 +495,11 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
// Facades
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
IPipePluggable pluggable = sideProperties.pluggables[direction.ordinal()];
if (!(pluggable instanceof ItemFacade.FacadePluggable)) {
if (!(pluggable instanceof FacadePluggable)) {
renderState.facadeMatrix.setFacade(direction, null, 0, true);
continue;
}
FacadeState[] states = ((ItemFacade.FacadePluggable) pluggable).states;
FacadeState[] states = ((FacadePluggable) pluggable).states;
if (states == null) {
renderState.facadeMatrix.setFacade(direction, null, 0, true);
continue;
@ -531,31 +525,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
renderState.facadeMatrix.setFacade(direction, block, metadata, transparent);
}
//Plugs
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
IPipePluggable pluggable = sideProperties.pluggables[direction.ordinal()];
renderState.plugMatrix.setConnected(direction, pluggable instanceof ItemPlug.PlugPluggable);
if (pluggable instanceof ItemRobotStation.RobotStationPluggable) {
DockingStation station = ((ItemRobotStation.RobotStationPluggable) pluggable).getStation();
if (station.isTaken()) {
if (station.isMainStation()) {
renderState.robotStationMatrix.setState(direction,
RobotStationState.Linked);
} else {
renderState.robotStationMatrix.setState(direction,
RobotStationState.Reserved);
}
} else {
renderState.robotStationMatrix.setState(direction,
RobotStationState.Available);
}
} else {
renderState.robotStationMatrix.setState(direction, RobotStationState.None);
}
}
pluggableState.setPluggables(sideProperties.pluggables);
if (renderState.isDirty()) {
renderState.clean();
@ -649,6 +619,21 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
return null;
}
@Override
public int x() {
return xCoord;
}
@Override
public int y() {
return yCoord;
}
@Override
public int z() {
return zCoord;
}
/* SMP */
public BuildCraftPacket getBCDescriptionPacket() {
@ -663,9 +648,10 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
packet.addStateForSerialization((byte) 0, coreState);
packet.addStateForSerialization((byte) 1, renderState);
packet.addStateForSerialization((byte) 2, pluggableState);
if (pipe instanceof IClientState) {
packet.addStateForSerialization((byte) 2, (IClientState) pipe);
if (pipe instanceof ISerializable) {
packet.addStateForSerialization((byte) 3, (ISerializable) pipe);
}
return packet;
@ -779,8 +765,8 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
protected boolean hasBlockingPluggable(ForgeDirection side) {
IPipePluggable pluggable = sideProperties.pluggables[side.ordinal()];
return pluggable != null && pluggable.blocking(this, side);
IPipePluggable pluggable = getPluggable(side);
return pluggable != null && pluggable.isBlocking(this, side);
}
private void computeConnections() {
@ -826,7 +812,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
*/
@Override
public int fill(ForgeDirection from, FluidStack resource, boolean doFill) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasPlug(from) && !hasRobotStation(from)) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasBlockingPluggable(from)) {
return ((IFluidHandler) pipe.transport).fill(from, resource, doFill);
} else {
return 0;
@ -835,7 +821,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
@Override
public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasPlug(from) && !hasRobotStation(from)) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasBlockingPluggable(from)) {
return ((IFluidHandler) pipe.transport).drain(from, maxDrain, doDrain);
} else {
return null;
@ -844,7 +830,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
@Override
public FluidStack drain(ForgeDirection from, FluidStack resource, boolean doDrain) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasPlug(from) && !hasRobotStation(from)) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasBlockingPluggable(from)) {
return ((IFluidHandler) pipe.transport).drain(from, resource, doDrain);
} else {
return null;
@ -853,7 +839,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
@Override
public boolean canFill(ForgeDirection from, Fluid fluid) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasPlug(from) && !hasRobotStation(from)) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasBlockingPluggable(from)) {
return ((IFluidHandler) pipe.transport).canFill(from, fluid);
} else {
return false;
@ -862,7 +848,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
@Override
public boolean canDrain(ForgeDirection from, Fluid fluid) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasPlug(from) && !hasRobotStation(from)) {
if (BlockGenericPipe.isValid(pipe) && pipe.transport instanceof IFluidHandler && !hasBlockingPluggable(from)) {
return ((IFluidHandler) pipe.transport).canDrain(from, fluid);
} else {
return false;
@ -879,21 +865,21 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
public boolean addFacade(ForgeDirection direction, FacadeState[] states) {
return setPluggable(direction, new ItemFacade.FacadePluggable(states));
return setPluggable(direction, new FacadePluggable(states));
}
public boolean addPlug(ForgeDirection direction) {
return setPluggable(direction, new ItemPlug.PlugPluggable());
return setPluggable(direction, new PlugPluggable());
}
public boolean addRobotStation(ForgeDirection direction) {
return setPluggable(direction, new ItemRobotStation.RobotStationPluggable());
return setPluggable(direction, new RobotStationPluggable());
}
public boolean addGate(ForgeDirection direction, Gate gate) {
gate.setDirection(direction);
pipe.gates[direction.ordinal()] = gate;
return setPluggable(direction, new ItemGate.GatePluggable(gate));
return setPluggable(direction, new GatePluggable(gate));
}
public boolean hasFacade(ForgeDirection direction) {
@ -902,7 +888,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
} else if (this.getWorldObj().isRemote) {
return renderState.facadeMatrix.getFacadeBlock(direction) != null;
} else {
return sideProperties.pluggables[direction.ordinal()] instanceof ItemFacade.FacadePluggable;
return sideProperties.pluggables[direction.ordinal()] instanceof FacadePluggable;
}
}
@ -912,7 +898,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
} else if (this.getWorldObj().isRemote) {
return renderState.gateMatrix.isGateExists(direction);
} else {
return sideProperties.pluggables[direction.ordinal()] instanceof ItemGate.GatePluggable;
return sideProperties.pluggables[direction.ordinal()] instanceof GatePluggable;
}
}
@ -928,10 +914,6 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
private void updateCoreState() {
for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
IPipePluggable pluggable = sideProperties.pluggables[i];
coreState.gates[i] = pluggable instanceof ItemGate.GatePluggable ? (ItemGate.GatePluggable) pluggable : null;
}
}
public boolean hasEnabledFacade(ForgeDirection direction) {
@ -940,14 +922,14 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
public ItemStack getFacade(ForgeDirection direction) {
IPipePluggable pluggable = sideProperties.pluggables[direction.ordinal()];
return pluggable instanceof ItemFacade.FacadePluggable ?
ItemFacade.getFacade(((ItemFacade.FacadePluggable) pluggable).states) : null;
return pluggable instanceof FacadePluggable ?
ItemFacade.getFacade(((FacadePluggable) pluggable).states) : null;
}
public DockingStation getStation(ForgeDirection direction) {
IPipePluggable pluggable = sideProperties.pluggables[direction.ordinal()];
return pluggable instanceof ItemRobotStation.RobotStationPluggable ?
((ItemRobotStation.RobotStationPluggable) pluggable).getStation() : null;
return pluggable instanceof RobotStationPluggable ?
((RobotStationPluggable) pluggable).getStation() : null;
}
// Legacy
@ -955,7 +937,7 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
if (sideProperties.pluggables[direction] == null) {
gate.setDirection(ForgeDirection.getOrientation(direction));
pipe.gates[direction] = gate;
sideProperties.pluggables[direction] = new ItemGate.GatePluggable(gate);
sideProperties.pluggables[direction] = new GatePluggable(gate);
}
}
@ -972,14 +954,16 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
@Override
public IClientState getStateInstance(byte stateId) {
public ISerializable getStateInstance(byte stateId) {
switch (stateId) {
case 0:
return coreState;
case 1:
return renderState;
case 2:
return (IClientState) pipe;
return pluggableState;
case 3:
return (ISerializable) pipe;
}
throw new RuntimeException("Unknown state requested: " + stateId + " this is a bug!");
}
@ -999,21 +983,6 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
if (pipe == null) {
break;
}
for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
final ItemGate.GatePluggable gatePluggable = coreState.gates[i];
if (gatePluggable == null) {
pipe.gates[i] = null;
continue;
}
Gate gate = pipe.gates[i];
if (gate == null || gate.logic != gatePluggable.logic || gate.material != gatePluggable.material) {
pipe.gates[i] = GateFactory.makeGate(pipe, gatePluggable.material, gatePluggable.logic, ForgeDirection.getOrientation(i));
}
}
syncGateExpansions();
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
break;
@ -1024,6 +993,27 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
break;
}
case 2: {
for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
final IPipePluggable pluggable = getPluggable(ForgeDirection.getOrientation(i));
if (pluggable != null && pluggable instanceof GatePluggable) {
final GatePluggable gatePluggable = (GatePluggable) pluggable;
Gate gate = pipe.gates[i];
if (gate == null || gate.logic != gatePluggable.logic || gate.material != gatePluggable.material) {
pipe.gates[i] = GateFactory.makeGate(pipe, gatePluggable.material, gatePluggable.logic, ForgeDirection.getOrientation(i));
}
} else {
pipe.gates[i] = null;
}
}
syncGateExpansions();
// TODO: Add some kind of isDirty flag? I don't know...
worldObj.markBlockRangeForRenderUpdate(xCoord, yCoord, zCoord, xCoord, yCoord, zCoord);
sideProperties.pluggables = pluggableState.getPluggables();
break;
}
}
}
@ -1031,8 +1021,11 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
resyncGateExpansions = false;
for (int i = 0; i < ForgeDirection.VALID_DIRECTIONS.length; i++) {
Gate gate = pipe.gates[i];
ItemGate.GatePluggable gatePluggable = coreState.gates[i];
if (gate != null && gatePluggable.expansions.length > 0) {
if (gate == null) {
continue;
}
GatePluggable gatePluggable = (GatePluggable) sideProperties.pluggables[i];
if (gatePluggable.expansions.length > 0) {
for (IGateExpansion expansion : gatePluggable.expansions) {
if (expansion != null) {
if (!gate.expansions.containsKey(expansion)) {
@ -1071,28 +1064,20 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
return false;
}
public boolean hasPlug(ForgeDirection side) {
public IPipePluggable getPluggable(ForgeDirection side) {
if (side == null || side == ForgeDirection.UNKNOWN) {
return false;
return null;
}
if (this.worldObj.isRemote) {
return renderState.plugMatrix.isConnected(side);
}
return sideProperties.pluggables[side.ordinal()] instanceof ItemPlug.PlugPluggable;
return sideProperties.pluggables[side.ordinal()];
}
public boolean hasRobotStation(ForgeDirection side) {
public boolean hasPluggable(ForgeDirection side) {
if (side == null || side == ForgeDirection.UNKNOWN) {
return false;
}
if (this.worldObj.isRemote) {
return renderState.robotStationMatrix.isConnected(side);
}
return sideProperties.pluggables[side.ordinal()] instanceof ItemRobotStation.RobotStationPluggable;
return sideProperties.pluggables[side.ordinal()] != null;
}
public Block getBlock() {
@ -1170,10 +1155,25 @@ public class TileGenericPipe extends TileEntity implements IFluidHandler,
}
@Override
public TileEntity getAdjacentTile(ForgeDirection dir) {
public Block getNeighborBlock(ForgeDirection dir) {
return getBlock(dir);
}
@Override
public TileEntity getNeighborTile(ForgeDirection dir) {
return getTile(dir);
}
@Override
public IPipe getNeighborPipe(ForgeDirection dir) {
TileEntity neighborTile = getTile(dir);
if (neighborTile instanceof IPipeContainer) {
return ((IPipeContainer) neighborTile).getPipe();
} else {
return null;
}
}
@Override
public IPipe getPipe() {
return pipe;

View file

@ -0,0 +1,187 @@
package buildcraft.transport.gates;
import java.util.Set;
import io.netty.buffer.ByteBuf;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraft.nbt.NBTTagString;
import net.minecraft.util.AxisAlignedBB;
import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.gates.GateExpansions;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipePluggableRenderer;
import buildcraft.core.CoreConstants;
import buildcraft.core.utils.MatrixTranformations;
import buildcraft.transport.Gate;
import buildcraft.transport.TileGenericPipe;
public class GatePluggable implements IPipePluggable {
public GateDefinition.GateMaterial material;
public GateDefinition.GateLogic logic;
public IGateExpansion[] expansions;
public GatePluggable() {
}
public GatePluggable(Gate gate) {
this.material = gate.material;
this.logic = gate.logic;
Set<IGateExpansion> gateExpansions = gate.expansions.keySet();
this.expansions = gateExpansions.toArray(new IGateExpansion[gateExpansions.size()]);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
nbt.setByte(ItemGate.NBT_TAG_MAT, (byte) material.ordinal());
nbt.setByte(ItemGate.NBT_TAG_LOGIC, (byte) logic.ordinal());
NBTTagList expansionsList = nbt.getTagList(ItemGate.NBT_TAG_EX, Constants.NBT.TAG_STRING);
for (IGateExpansion expansion : expansions) {
expansionsList.appendTag(new NBTTagString(expansion.getUniqueIdentifier()));
}
nbt.setTag(ItemGate.NBT_TAG_EX, expansionsList);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
material = GateDefinition.GateMaterial.fromOrdinal(nbt.getByte(ItemGate.NBT_TAG_MAT));
logic = GateDefinition.GateLogic.fromOrdinal(nbt.getByte(ItemGate.NBT_TAG_LOGIC));
NBTTagList expansionsList = nbt.getTagList(ItemGate.NBT_TAG_EX, Constants.NBT.TAG_STRING);
final int expansionsSize = expansionsList.tagCount();
expansions = new IGateExpansion[expansionsSize];
for (int i = 0; i < expansionsSize; i++) {
expansions[i] = GateExpansions.getExpansion(expansionsList.getStringTagAt(i));
}
}
@Override
public void writeData(ByteBuf buf) {
buf.writeByte(material.ordinal());
buf.writeByte(logic.ordinal());
final int expansionsSize = expansions.length;
buf.writeInt(expansionsSize);
for (IGateExpansion expansion : expansions) {
buf.writeShort(GateExpansions.getExpansionID(expansion));
}
}
@Override
public void readData(ByteBuf buf) {
material = GateDefinition.GateMaterial.fromOrdinal(buf.readByte());
logic = GateDefinition.GateLogic.fromOrdinal(buf.readByte());
final int expansionsSize = buf.readInt();
expansions = new IGateExpansion[expansionsSize];
for (int i = 0; i < expansionsSize; i++) {
expansions[i] = GateExpansions.getExpansionByID(buf.readUnsignedShort());
}
}
@Override
public ItemStack[] getDropItems(IPipeContainer pipe) {
ItemStack gate = ItemGate.makeGateItem(material, logic);
for (IGateExpansion expansion : expansions) {
ItemGate.addGateExpansion(gate, expansion);
}
return new ItemStack[] { gate };
}
@Override
public void onAttachedPipe(IPipeContainer pipe, ForgeDirection direction) {
TileGenericPipe pipeReal = (TileGenericPipe) pipe;
if (!pipeReal.getWorld().isRemote) {
Gate gate = pipeReal.pipe.gates[direction.ordinal()];
if (gate == null || gate.material != material || gate.logic != logic) {
pipeReal.pipe.gates[direction.ordinal()] = GateFactory.makeGate(pipeReal.pipe, material, logic, direction);
pipeReal.scheduleRenderUpdate();
}
}
}
@Override
public void onDetachedPipe(IPipeContainer pipe, ForgeDirection direction) {
TileGenericPipe pipeReal = (TileGenericPipe) pipe;
if (!pipeReal.getWorld().isRemote) {
Gate gate = pipeReal.pipe.gates[direction.ordinal()];
if (gate != null) {
gate.resetGate();
pipeReal.pipe.gates[direction.ordinal()] = null;
}
pipeReal.scheduleRenderUpdate();
}
}
@Override
public boolean isBlocking(IPipeContainer pipe, ForgeDirection direction) {
return true;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof GatePluggable)) {
return false;
}
GatePluggable o = (GatePluggable) obj;
if (o.material.ordinal() != material.ordinal()) {
return false;
}
if (o.logic.ordinal() != logic.ordinal()) {
return false;
}
if (o.expansions.length != expansions.length) {
return false;
}
for (int i = 0; i < expansions.length; i++) {
if (o.expansions[i] != expansions[i]) {
return false;
}
}
return true;
}
@Override
public void invalidate() {
}
@Override
public void validate(IPipeContainer pipe, ForgeDirection direction) {
}
@Override
public AxisAlignedBB getBoundingBox(ForgeDirection side) {
float min = CoreConstants.PIPE_MIN_POS + 0.05F;
float max = CoreConstants.PIPE_MAX_POS - 0.05F;
float[][] bounds = new float[3][2];
// X START - END
bounds[0][0] = min;
bounds[0][1] = max;
// Y START - END
bounds[1][0] = CoreConstants.PIPE_MIN_POS - 0.10F;
bounds[1][1] = CoreConstants.PIPE_MIN_POS;
// Z START - END
bounds[2][0] = min;
bounds[2][1] = max;
MatrixTranformations.transform(bounds, side);
return AxisAlignedBB.getBoundingBox(bounds[0][0], bounds[1][0], bounds[2][0], bounds[0][1], bounds[1][1], bounds[2][1]);
}
// TODO: Port Gates to the Pluggable render system
@Override
public IPipePluggableRenderer getRenderer() {
return null;
}
}

View file

@ -0,0 +1,15 @@
package buildcraft.transport.gates;
import net.minecraft.client.renderer.RenderBlocks;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.render.ITextureStates;
import buildcraft.api.pipes.IPipe;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipePluggableRenderer;
public class GatePluggableRender implements IPipePluggableRenderer {
@Override
public void renderPluggable(RenderBlocks renderblocks, IPipe pipe, ForgeDirection side, IPipePluggable pipePluggable, ITextureStates blockStateMachine, int x, int y, int z) {
}
}

View file

@ -31,9 +31,10 @@ import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.gates.GateExpansions;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.pipes.IPipePluggableRenderer;
import buildcraft.api.statements.StatementManager;
import buildcraft.api.transport.IPipePluggable;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.core.ItemBuildCraft;
import buildcraft.core.inventory.InvUtils;
import buildcraft.core.utils.StringUtils;
@ -43,148 +44,10 @@ import buildcraft.transport.gates.GateDefinition.GateLogic;
import buildcraft.transport.gates.GateDefinition.GateMaterial;
public class ItemGate extends ItemBuildCraft {
public static class GatePluggable implements IPipePluggable {
public GateMaterial material;
public GateLogic logic;
public IGateExpansion[] expansions;
public GatePluggable() {
}
public GatePluggable(Gate gate) {
this.material = gate.material;
this.logic = gate.logic;
Set<IGateExpansion> gateExpansions = gate.expansions.keySet();
this.expansions = gateExpansions.toArray(new IGateExpansion[gateExpansions.size()]);
}
@Override
public void writeToNBT(NBTTagCompound nbt) {
nbt.setByte(NBT_TAG_MAT, (byte) material.ordinal());
nbt.setByte(NBT_TAG_LOGIC, (byte) logic.ordinal());
NBTTagList expansionsList = nbt.getTagList(NBT_TAG_EX, Constants.NBT.TAG_STRING);
for (IGateExpansion expansion : expansions) {
expansionsList.appendTag(new NBTTagString(expansion.getUniqueIdentifier()));
}
nbt.setTag(NBT_TAG_EX, expansionsList);
}
@Override
public void readFromNBT(NBTTagCompound nbt) {
material = GateMaterial.fromOrdinal(nbt.getByte(NBT_TAG_MAT));
logic = GateLogic.fromOrdinal(nbt.getByte(NBT_TAG_LOGIC));
NBTTagList expansionsList = nbt.getTagList(NBT_TAG_EX, Constants.NBT.TAG_STRING);
final int expansionsSize = expansionsList.tagCount();
expansions = new IGateExpansion[expansionsSize];
for (int i = 0; i < expansionsSize; i++) {
expansions[i] = GateExpansions.getExpansion(expansionsList.getStringTagAt(i));
}
}
public void writeToByteBuf(ByteBuf buf) {
buf.writeByte(material.ordinal());
buf.writeByte(logic.ordinal());
final int expansionsSize = expansions.length;
buf.writeInt(expansionsSize);
for (IGateExpansion expansion : expansions) {
buf.writeShort(GateExpansions.getExpansionID(expansion));
}
}
public void readFromByteBuf(ByteBuf buf) {
material = GateMaterial.fromOrdinal(buf.readByte());
logic = GateLogic.fromOrdinal(buf.readByte());
final int expansionsSize = buf.readInt();
expansions = new IGateExpansion[expansionsSize];
for (int i = 0; i < expansionsSize; i++) {
expansions[i] = GateExpansions.getExpansionByID(buf.readUnsignedShort());
}
}
@Override
public ItemStack[] getDropItems(IPipeTile pipe) {
ItemStack gate = makeGateItem(material, logic);
for (IGateExpansion expansion : expansions) {
addGateExpansion(gate, expansion);
}
return new ItemStack[] { gate };
}
@Override
public void onAttachedPipe(IPipeTile pipe, ForgeDirection direction) {
TileGenericPipe pipeReal = (TileGenericPipe) pipe;
if (!pipeReal.getWorld().isRemote) {
Gate gate = pipeReal.pipe.gates[direction.ordinal()];
if (gate == null || gate.material != material || gate.logic != logic) {
pipeReal.pipe.gates[direction.ordinal()] = GateFactory.makeGate(pipeReal.pipe, material, logic, direction);
pipeReal.scheduleRenderUpdate();
}
}
}
@Override
public void onDetachedPipe(IPipeTile pipe, ForgeDirection direction) {
TileGenericPipe pipeReal = (TileGenericPipe) pipe;
if (!pipeReal.getWorld().isRemote) {
Gate gate = pipeReal.pipe.gates[direction.ordinal()];
if (gate != null) {
gate.resetGate();
pipeReal.pipe.gates[direction.ordinal()] = null;
}
pipeReal.scheduleRenderUpdate();
}
}
@Override
public boolean blocking(IPipeTile pipe, ForgeDirection direction) {
return true;
}
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (!(obj instanceof GatePluggable)) {
return false;
}
GatePluggable o = (GatePluggable) obj;
if (o.material.ordinal() != material.ordinal()) {
return false;
}
if (o.logic.ordinal() != logic.ordinal()) {
return false;
}
if (o.expansions.length != expansions.length) {
return false;
}
for (int i = 0; i < expansions.length; i++) {
if (o.expansions[i] != expansions[i]) {
return false;
}
}
return true;
}
@Override
public void invalidate() {
}
@Override
public void validate(IPipeTile pipe, ForgeDirection direction) {
}
}
private static final String NBT_TAG_MAT = "mat";
private static final String NBT_TAG_LOGIC = "logic";
private static final String NBT_TAG_EX = "ex";
protected static final String NBT_TAG_MAT = "mat";
protected static final String NBT_TAG_LOGIC = "logic";
protected static final String NBT_TAG_EX = "ex";
public ItemGate() {
super();

View file

@ -22,13 +22,13 @@ import net.minecraftforge.fluids.IFluidHandler;
import buildcraft.BuildCraftTransport;
import buildcraft.core.GuiIds;
import buildcraft.core.inventory.SimpleInventory;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
import buildcraft.core.utils.FluidUtils;
import buildcraft.core.utils.Utils;
import buildcraft.transport.BlockGenericPipe;
import buildcraft.transport.PipeIconProvider;
public class PipeFluidsEmerald extends PipeFluidsWood implements IClientState {
public class PipeFluidsEmerald extends PipeFluidsWood implements ISerializable {
private SimpleInventory filters = new SimpleInventory(1, "Filters", 1);
public PipeFluidsEmerald(Item item) {

View file

@ -25,15 +25,15 @@ import cofh.api.energy.IEnergyHandler;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.PipeManager;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.PipeManager;
import buildcraft.core.RFBattery;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
import buildcraft.transport.Pipe;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.PipeTransportFluids;
public class PipeFluidsWood extends Pipe<PipeTransportFluids> implements IEnergyHandler, IClientState {
public class PipeFluidsWood extends Pipe<PipeTransportFluids> implements IEnergyHandler, ISerializable {
public int liquidToExtract;
protected int standardIconIndex = PipeIconProvider.TYPE.PipeFluidsWood_Standard.ordinal();
@ -46,7 +46,7 @@ public class PipeFluidsWood extends Pipe<PipeTransportFluids> implements IEnergy
private PipeLogicWood logic = new PipeLogicWood(this) {
@Override
protected boolean isValidConnectingTile(TileEntity tile) {
if (tile instanceof IPipeTile) {
if (tile instanceof IPipeContainer) {
return false;
}
if (!(tile instanceof IFluidHandler)) {

View file

@ -16,7 +16,7 @@ import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.transport.Pipe;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.PipeTransportItems;
@ -49,7 +49,7 @@ public class PipeItemsClay extends Pipe<PipeTransportItems> {
if (!event.item.blacklist.contains(o) && container.pipe.outputOpen(o)) {
if (container.isPipeConnected(o)) {
TileEntity entity = container.getTile(o);
if (entity instanceof IPipeTile) {
if (entity instanceof IPipeContainer) {
pipesList.add(o);
} else {
nonPipesList.add(o);

View file

@ -26,7 +26,7 @@ import buildcraft.api.core.EnumColor;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.tools.IToolWrench;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
import buildcraft.transport.Pipe;
import buildcraft.transport.PipeIconProvider;
import buildcraft.transport.PipeTransportItems;
@ -38,7 +38,7 @@ import buildcraft.transport.pipes.events.PipeEventItem;
import buildcraft.transport.statements.ActionPipeColor;
import buildcraft.transport.statements.ActionPipeDirection;
public class PipeItemsDaizuli extends Pipe<PipeTransportItems> implements IClientState {
public class PipeItemsDaizuli extends Pipe<PipeTransportItems> implements ISerializable {
private int standardIconIndex = PipeIconProvider.TYPE.PipeItemsDaizuli_Black.ordinal();
private int solidIconIndex = PipeIconProvider.TYPE.PipeAllDaizuli_Solid.ordinal();

View file

@ -26,13 +26,13 @@ import buildcraft.core.inventory.InvUtils;
import buildcraft.core.inventory.InventoryWrapper;
import buildcraft.core.inventory.SimpleInventory;
import buildcraft.core.inventory.StackHelper;
import buildcraft.core.network.IClientState;
import buildcraft.api.core.ISerializable;
import buildcraft.core.network.IGuiReturnHandler;
import buildcraft.core.utils.Utils;
import buildcraft.transport.BlockGenericPipe;
import buildcraft.transport.PipeIconProvider;
public class PipeItemsEmerald extends PipeItemsWood implements IClientState, IGuiReturnHandler {
public class PipeItemsEmerald extends PipeItemsWood implements ISerializable, IGuiReturnHandler {
public enum FilterMode {
WHITE_LIST, BLACK_LIST, ROUND_ROBIN

View file

@ -23,10 +23,10 @@ import cofh.api.energy.IEnergyHandler;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.core.Position;
import buildcraft.api.transport.IStripesHandler;
import buildcraft.api.transport.IStripesHandler.StripesHandlerType;
import buildcraft.api.transport.IStripesPipe;
import buildcraft.api.transport.PipeManager;
import buildcraft.api.pipes.IStripesHandler;
import buildcraft.api.pipes.IStripesHandler.StripesHandlerType;
import buildcraft.api.pipes.IStripesPipe;
import buildcraft.api.pipes.PipeManager;
import buildcraft.core.proxy.CoreProxy;
import buildcraft.core.utils.BlockUtils;
import buildcraft.transport.BlockGenericPipe;

View file

@ -25,8 +25,8 @@ import cofh.api.energy.IEnergyHandler;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.core.Position;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.transport.PipeManager;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.api.pipes.PipeManager;
import buildcraft.core.RFBattery;
import buildcraft.core.inventory.InvUtils;
import buildcraft.core.inventory.InventoryWrapper;
@ -46,7 +46,7 @@ public class PipeItemsWood extends Pipe<PipeTransportItems> implements IEnergyHa
private PipeLogicWood logic = new PipeLogicWood(this) {
@Override
protected boolean isValidConnectingTile(TileEntity tile) {
if (tile instanceof IPipeTile) {
if (tile instanceof IPipeContainer) {
return false;
}
if (!(tile instanceof IInventory)) {

View file

@ -17,7 +17,7 @@ import net.minecraftforge.common.util.ForgeDirection;
import cofh.api.energy.IEnergyHandler;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.transport.IPipeTile;
import buildcraft.api.pipes.IPipeContainer;
import buildcraft.core.RFBattery;
import buildcraft.transport.IPipeTransportPowerHook;
import buildcraft.transport.Pipe;
@ -157,7 +157,7 @@ public class PipePowerWood extends Pipe<PipeTransportPower> implements IPipeTran
@Override
public int requestEnergy(ForgeDirection from, int amount) {
if (container.getTile(from) instanceof IPipeTile) {
if (container.getTile(from) instanceof IPipeContainer) {
requestedEnergy += amount;
return amount;
} else {

View file

@ -0,0 +1,34 @@
package buildcraft.transport.pipes.events;
import java.util.List;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
public abstract class PipeEventFluid extends PipeEvent {
public final FluidStack fluidStack;
public PipeEventFluid(FluidStack fluidStack) {
this.fluidStack = fluidStack;
}
public static class FindDest extends PipeEventFluid {
public final List<ForgeDirection> destinations;
public FindDest(FluidStack fluidStack, List<ForgeDirection> destinations) {
super(fluidStack);
this.destinations = destinations;
}
}
public static class Fill extends PipeEventFluid {
public final ForgeDirection from;
public final boolean doAdd;
public Fill(ForgeDirection from, FluidStack fluidStack, boolean doAdd) {
super(fluidStack);
this.from = from;
this.doAdd = doAdd;
}
}
}

View file

@ -0,0 +1,31 @@
package buildcraft.transport.pipes.events;
import net.minecraftforge.common.util.ForgeDirection;
public abstract class PipeEventPower extends PipeEvent {
public final ForgeDirection from;
/**
* The amount of power left after processing.
*/
public int power;
public PipeEventPower(ForgeDirection from, int power) {
this.from = from;
this.power = power;
}
public static class Request extends PipeEventPower {
public Request(ForgeDirection from, int power) {
super(from, power);
}
}
public static class Receive extends PipeEventPower {
public boolean override;
public Receive(ForgeDirection from, int power) {
super(from, power);
this.override = false;
}
}
}

View file

@ -15,7 +15,7 @@ import buildcraft.api.core.JavaTools;
import buildcraft.api.facades.FacadeType;
import buildcraft.api.facades.IFacadeItem;
import buildcraft.api.recipes.CraftingResult;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
import buildcraft.silicon.ItemRedstoneChipset;
import buildcraft.silicon.TileIntegrationTable;
import buildcraft.transport.ItemFacade;

View file

@ -16,6 +16,7 @@ import net.minecraft.util.IIcon;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.render.ITextureStates;
import buildcraft.core.CoreConstants;
import buildcraft.core.utils.MatrixTranformations;
import buildcraft.transport.BlockGenericPipe;

View file

@ -17,6 +17,7 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.render.ITextureStates;
import buildcraft.transport.BlockGenericPipe;

View file

@ -38,8 +38,8 @@ import buildcraft.BuildCraftCore.RenderMode;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.EnumColor;
import buildcraft.api.gates.IGateExpansion;
import buildcraft.api.transport.IPipeTile.PipeType;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.IPipeContainer.PipeType;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.CoreConstants;
import buildcraft.core.DefaultProps;
import buildcraft.core.render.RenderEntityBlock;

View file

@ -17,6 +17,9 @@ import cpw.mods.fml.client.registry.ISimpleBlockRenderingHandler;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftTransport;
import buildcraft.api.core.IIconProvider;
import buildcraft.api.core.render.ITextureStates;
import buildcraft.api.pipes.IPipePluggable;
import buildcraft.api.pipes.IPipePluggableRenderer;
import buildcraft.core.CoreConstants;
import buildcraft.core.utils.ColorUtils;
import buildcraft.core.utils.MatrixTranformations;
@ -110,8 +113,15 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
// Force other opaque renders into pass 0
if (renderPass == 0) {
pipePlugRenderer(renderblocks, fakeBlock, state, x, y, z);
pipeRobotStationRenderer(renderblocks, fakeBlock, state, x, y, z);
for (ForgeDirection dir : ForgeDirection.VALID_DIRECTIONS) {
if (tile.hasPluggable(dir)) {
IPipePluggable p = tile.getPluggable(dir);
IPipePluggableRenderer r = p.getRenderer();
if (r != null) {
r.renderPluggable(renderblocks, tile.getPipe(), dir, p, fakeBlock, x, y, z);
}
}
}
}
}
@ -156,172 +166,6 @@ public class PipeRendererWorld implements ISimpleBlockRenderingHandler {
FacadeRenderHelper.pipeFacadeRenderer(renderblocks, blockStateMachine, state, x, y, z);
}
private void pipePlugRenderer(RenderBlocks renderblocks, ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z) {
float[][] zeroState = new float[3][2];
// X START - END
zeroState[0][0] = 0.25F + zFightOffset;
zeroState[0][1] = 0.75F - zFightOffset;
// Y START - END
zeroState[1][0] = 0.125F;
zeroState[1][1] = 0.251F;
// Z START - END
zeroState[2][0] = 0.25F + zFightOffset;
zeroState[2][1] = 0.75F - zFightOffset;
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
if (state.plugMatrix.isConnected(direction)) {
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, direction);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
}
}
// X START - END
zeroState[0][0] = 0.25F + 0.125F / 2 + zFightOffset;
zeroState[0][1] = 0.75F - 0.125F / 2 + zFightOffset;
// Y START - END
zeroState[1][0] = 0.25F;
zeroState[1][1] = 0.25F + 0.125F;
// Z START - END
zeroState[2][0] = 0.25F + 0.125F / 2;
zeroState[2][1] = 0.75F - 0.125F / 2;
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider.getIcon(PipeIconProvider.TYPE.PipeStructureCobblestone.ordinal())); // Structure Pipe
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
if (state.plugMatrix.isConnected(direction)) {
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, direction);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0], rotated[2][0], rotated[0][1], rotated[1][1], rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
}
}
}
private void pipeRobotStationPartRender(RenderBlocks renderblocks,
ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z,
float xStart, float xEnd, float yStart, float yEnd, float zStart,
float zEnd) {
float[][] zeroState = new float[3][2];
// X START - END
zeroState[0][0] = xStart + zFightOffset;
zeroState[0][1] = xEnd - zFightOffset;
// Y START - END
zeroState[1][0] = yStart;
zeroState[1][1] = yEnd;
// Z START - END
zeroState[2][0] = zStart + zFightOffset;
zeroState[2][1] = zEnd - zFightOffset;
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
if (state.robotStationMatrix.isConnected(direction)) {
switch (state.robotStationMatrix.getState(direction)) {
case None:
case Available:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal()));
break;
case Reserved:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal()));
break;
case Linked:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal()));
break;
}
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, direction);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0],
rotated[2][0], rotated[0][1], rotated[1][1],
rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
}
}
}
private void pipeRobotStationRenderer(RenderBlocks renderblocks, ITextureStates blockStateMachine, PipeRenderState state, int x, int y, int z) {
//float width = 0.075F;
pipeRobotStationPartRender (renderblocks, blockStateMachine, state, x, y, z,
0.45F, 0.55F,
0.0F, 0.224F,
0.45F, 0.55F);
/*pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.25F, 0.75F,
0.025F, 0.224F,
0.25F, 0.25F + width);
pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.25F, 0.75F,
0.025F, 0.224F,
0.75F - width, 0.75F);
pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.25F, 0.25F + width,
0.025F, 0.224F,
0.25F + width, 0.75F - width);
pipeRobotStationPartRender (renderblocks, block, state, x, y, z,
0.75F - width, 0.75F,
0.025F, 0.224F,
0.25F + width, 0.75F - width);*/
float[][] zeroState = new float[3][2];
// X START - END
zeroState[0][0] = 0.25F + zFightOffset;
zeroState[0][1] = 0.75F - zFightOffset;
// Y START - END
zeroState[1][0] = 0.225F;
zeroState[1][1] = 0.251F;
// Z START - END
zeroState[2][0] = 0.25F + zFightOffset;
zeroState[2][1] = 0.75F - zFightOffset;
for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
if (state.robotStationMatrix.isConnected(direction)) {
switch (state.robotStationMatrix.getState(direction)) {
case None:
case Available:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStation.ordinal()));
break;
case Reserved:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationReserved.ordinal()));
break;
case Linked:
blockStateMachine.getTextureState().set(BuildCraftTransport.instance.pipeIconProvider
.getIcon(PipeIconProvider.TYPE.PipeRobotStationLinked.ordinal()));
break;
}
float[][] rotated = MatrixTranformations.deepClone(zeroState);
MatrixTranformations.transform(rotated, direction);
renderblocks.setRenderBounds(rotated[0][0], rotated[1][0],
rotated[2][0], rotated[0][1], rotated[1][1],
rotated[2][1]);
renderblocks.renderStandardBlock(blockStateMachine.getBlock(), x, y, z);
}
}
}
@Override
public void renderInventoryBlock(Block block, int metadata, int modelID, RenderBlocks renderer) {
// TODO Auto-generated method stub

View file

@ -18,7 +18,7 @@ import buildcraft.api.statements.IStatement;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.statements.StatementMouseClick;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.utils.StringUtils;
public class ActionParameterSignal implements IStatementParameter {

View file

@ -14,7 +14,7 @@ import net.minecraft.client.renderer.texture.IIconRegister;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.statements.BCStatement;
import buildcraft.core.utils.StringUtils;
import buildcraft.transport.Gate;

View file

@ -15,7 +15,7 @@ import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.statements.IActionInternal;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.transport.IPipe;
import buildcraft.api.pipes.IPipe;
import buildcraft.core.statements.BCStatement;
import buildcraft.core.statements.StatementParameterDirection;
import buildcraft.core.utils.StringUtils;

View file

@ -18,7 +18,7 @@ import buildcraft.api.statements.IStatement;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.statements.StatementMouseClick;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.utils.StringUtils;
public class TriggerParameterSignal implements IStatementParameter {

View file

@ -15,7 +15,7 @@ import buildcraft.api.gates.IGate;
import buildcraft.api.statements.IStatementContainer;
import buildcraft.api.statements.IStatementParameter;
import buildcraft.api.statements.ITriggerInternal;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
import buildcraft.core.statements.BCStatement;
import buildcraft.core.utils.StringUtils;
import buildcraft.transport.Pipe;

View file

@ -6,8 +6,8 @@ import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IStripesHandler;
import buildcraft.api.transport.IStripesPipe;
import buildcraft.api.pipes.IStripesHandler;
import buildcraft.api.pipes.IStripesPipe;
public class StripesHandlerArrow implements IStripesHandler {

View file

@ -12,9 +12,8 @@ import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidBlock;
import buildcraft.api.transport.IStripesHandler;
import buildcraft.api.transport.IStripesHandler.StripesHandlerType;
import buildcraft.api.transport.IStripesPipe;
import buildcraft.api.pipes.IStripesHandler;
import buildcraft.api.pipes.IStripesPipe;
public class StripesHandlerBucket implements IStripesHandler {
private static final ItemStack emptyBucket = new ItemStack(Items.bucket, 1);

View file

@ -6,9 +6,8 @@ import net.minecraft.item.ItemPotion;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IStripesHandler;
import buildcraft.api.transport.IStripesHandler.StripesHandlerType;
import buildcraft.api.transport.IStripesPipe;
import buildcraft.api.pipes.IStripesHandler;
import buildcraft.api.pipes.IStripesPipe;
public class StripesHandlerRightClick implements IStripesHandler {

View file

@ -7,9 +7,8 @@ import net.minecraft.item.ItemShears;
import net.minecraft.item.ItemStack;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.IStripesHandler;
import buildcraft.api.transport.IStripesHandler.StripesHandlerType;
import buildcraft.api.transport.IStripesPipe;
import buildcraft.api.pipes.IStripesHandler;
import buildcraft.api.pipes.IStripesPipe;
public class StripesHandlerShears implements IStripesHandler {

View file

@ -1,67 +0,0 @@
/**
* Copyright (c) 2011-2014, SpaceToad and the BuildCraft Team
* http://www.mod-buildcraft.com
*
* BuildCraft is distributed under the terms of the Minecraft Mod Public
* License 1.0, or MMPL. Please check the contents of the license located in
* http://www.mod-buildcraft.com/MMPL-1.0.txt
*/
package buildcraft.transport.utils;
import io.netty.buffer.ByteBuf;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.ISerializable;
public class RobotStationMatrix implements ISerializable {
// TODO: All these matrixes should be passed by RPC, instead of having a
// single state carrying everything
private RobotStationState[] states = new RobotStationState[6];
private boolean dirty = false;
public RobotStationMatrix() {
for (int i = 0; i < states.length; ++i) {
states[i] = RobotStationState.None;
}
}
public boolean isConnected(ForgeDirection direction) {
return states[direction.ordinal()] != RobotStationState.None;
}
public void setState(ForgeDirection direction, RobotStationState value) {
if (states[direction.ordinal()] != value) {
states[direction.ordinal()] = value;
dirty = true;
}
}
public RobotStationState getState(ForgeDirection direction) {
return states[direction.ordinal()];
}
public boolean isDirty() {
return dirty;
}
public void clean() {
dirty = false;
}
@Override
public void writeData(ByteBuf data) {
for (int i = 0; i < states.length; i++) {
data.writeByte(states[i].ordinal());
}
}
@Override
public void readData(ByteBuf data) {
for (int i = 0; i < states.length; i++) {
states[i] = RobotStationState.values()[data.readUnsignedByte()];
}
}
}

View file

@ -1,8 +0,0 @@
package buildcraft.transport.utils;
public enum RobotStationState {
None,
Available,
Reserved,
Linked
}

View file

@ -14,7 +14,7 @@ import io.netty.buffer.ByteBuf;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.transport.PipeWire;
import buildcraft.api.pipes.PipeWire;
public class WireMatrix {