/** * Copyright (c) 2011-2015, 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.api.robots; import net.minecraft.inventory.IInventory; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.IFluidHandler; import buildcraft.api.core.BlockIndex; import buildcraft.api.statements.StatementSlot; import buildcraft.api.transport.IInjectable; public abstract class DockingStation { public ForgeDirection side; public World world; private long robotTakingId = EntityRobotBase.NULL_ROBOT_ID; private EntityRobotBase robotTaking; private boolean linkIsMain = false; private BlockIndex index; public DockingStation(BlockIndex iIndex, ForgeDirection iSide) { index = iIndex; side = iSide; } public DockingStation() { } public boolean isMainStation() { return linkIsMain; } public int x() { return index.x; } public int y() { return index.y; } public int z() { return index.z; } public ForgeDirection side() { return side; } public EntityRobotBase robotTaking() { if (robotTakingId == EntityRobotBase.NULL_ROBOT_ID) { return null; } else if (robotTaking == null) { robotTaking = RobotManager.registryProvider.getRegistry(world).getLoadedRobot( robotTakingId); } return robotTaking; } public void invalidateRobotTakingEntity() { robotTaking = null; } public long linkedId() { return robotTakingId; } public boolean takeAsMain(EntityRobotBase robot) { if (robotTakingId == EntityRobotBase.NULL_ROBOT_ID) { IRobotRegistry registry = RobotManager.registryProvider.getRegistry(world); linkIsMain = true; robotTaking = robot; robotTakingId = robot.getRobotId(); registry.registryMarkDirty(); robot.setMainStation(this); registry.take(this, robot.getRobotId()); return true; } else { return robotTakingId == robot.getRobotId(); } } public boolean take(EntityRobotBase robot) { if (robotTaking == null) { IRobotRegistry registry = RobotManager.registryProvider.getRegistry(world); linkIsMain = false; robotTaking = robot; robotTakingId = robot.getRobotId(); registry.registryMarkDirty(); registry.take(this, robot.getRobotId()); return true; } else { return robot.getRobotId() == robotTakingId; } } public void release(EntityRobotBase robot) { if (robotTaking == robot && !linkIsMain) { IRobotRegistry registry = RobotManager.registryProvider.getRegistry(world); unsafeRelease(robot); registry.registryMarkDirty(); registry.release(this, robot.getRobotId()); } } /** * Same a release but doesn't clear the registry (presumably called from the * registry). */ public void unsafeRelease(EntityRobotBase robot) { if (robotTaking == robot) { linkIsMain = false; robotTaking = null; robotTakingId = EntityRobotBase.NULL_ROBOT_ID; } } public void writeToNBT(NBTTagCompound nbt) { NBTTagCompound indexNBT = new NBTTagCompound(); index.writeTo(indexNBT); nbt.setTag("index", indexNBT); nbt.setByte("side", (byte) side.ordinal()); nbt.setBoolean("isMain", linkIsMain); nbt.setLong("robotId", robotTakingId); } public void readFromNBT(NBTTagCompound nbt) { index = new BlockIndex(nbt.getCompoundTag("index")); side = ForgeDirection.values()[nbt.getByte("side")]; linkIsMain = nbt.getBoolean("isMain"); robotTakingId = nbt.getLong("robotId"); } public boolean isTaken() { return robotTakingId != EntityRobotBase.NULL_ROBOT_ID; } public long robotIdTaking() { return robotTakingId; } public BlockIndex index() { return index; } @Override public String toString() { return "{" + index.x + ", " + index.y + ", " + index.z + ", " + side + " :" + robotTakingId + "}"; } public boolean linkIsDocked() { if (robotTaking() != null) { return robotTaking().getDockingStation() == this; } else { return false; } } public boolean canRelease() { return !isMainStation() && !linkIsDocked(); } public boolean isInitialized() { return true; } public abstract Iterable<StatementSlot> getActiveActions(); public IInjectable getItemOutput() { return null; } public ForgeDirection getItemOutputSide() { return ForgeDirection.UNKNOWN; } public IInventory getItemInput() { return null; } public ForgeDirection getItemInputSide() { return ForgeDirection.UNKNOWN; } public IFluidHandler getFluidOutput() { return null; } public ForgeDirection getFluidOutputSide() { return ForgeDirection.UNKNOWN; } public IFluidHandler getFluidInput() { return null; } public ForgeDirection getFluidInputSide() { return ForgeDirection.UNKNOWN; } public boolean providesPower() { return false; } public IRequestProvider getRequestProvider() { return null; } public void onChunkUnload() { } }