From 27beeb254241ac985cbfaf37141b7756f46fd5ec Mon Sep 17 00:00:00 2001 From: asiekierka Date: Fri, 3 Apr 2015 13:34:25 +0200 Subject: [PATCH] forgot to push new robot API, push new zone planner GUI project --- api/buildcraft/api/robots/DockingStation.java | 197 ++++++++++++++++++ .../api/robots/EntityRobotBase.java | 8 +- .../api/robots/IDockingStation.java | 42 ---- .../api/robots/IDockingStationPluggable.java | 5 - .../api/robots/IDockingStationProvider.java | 8 + api/buildcraft/api/robots/IRobotRegistry.java | 14 +- api/buildcraft/api/robots/StackRequest.java | 2 +- .../buildcraftcore/textures/gui/buttons.png | Bin 8187 -> 8824 bytes .../textures/gui/zone_planner_gui.png | Bin 557 -> 615 bytes 9 files changed, 219 insertions(+), 57 deletions(-) create mode 100755 api/buildcraft/api/robots/DockingStation.java delete mode 100755 api/buildcraft/api/robots/IDockingStation.java delete mode 100644 api/buildcraft/api/robots/IDockingStationPluggable.java create mode 100644 api/buildcraft/api/robots/IDockingStationProvider.java diff --git a/api/buildcraft/api/robots/DockingStation.java b/api/buildcraft/api/robots/DockingStation.java new file mode 100755 index 00000000..2c51b901 --- /dev/null +++ b/api/buildcraft/api/robots/DockingStation.java @@ -0,0 +1,197 @@ +/** + * 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.nbt.NBTTagCompound; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; +import buildcraft.api.core.BlockIndex; +import buildcraft.api.transport.IPipeTile; + +public 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; + private IPipeTile pipe; + + public DockingStation(BlockIndex iIndex, ForgeDirection iSide) { + index = iIndex; + side = iSide; + } + + public DockingStation(IPipeTile iPipe, ForgeDirection iSide) { + index = new BlockIndex(iPipe.x(), iPipe.y(), iPipe.z()); + pipe = iPipe; + side = iSide; + world = iPipe.getWorld(); + } + + public DockingStation() { + } + + public boolean isMainStation() { + return linkIsMain; + } + + public IPipeTile getPipe() { + if (pipe == null) { + pipe = (IPipeTile) world.getTileEntity(index.x, index.y, index.z); + } + + if (pipe == null || ((TileEntity) pipe).isInvalid()) { + // Inconsistency - remove this pipe from the registry. + RobotManager.registryProvider.getRegistry(world).removeStation(this); + pipe = null; + } + + return pipe; + } + + 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(); + getPipe().scheduleRenderUpdate(); + registry.markDirty(); + 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(); + getPipe().scheduleRenderUpdate(); + registry.markDirty(); + 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.markDirty(); + 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; + getPipe().scheduleRenderUpdate(); + } + } + + 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 (isTaken()) { + return robotTaking().getDockingStation() == this; + } else { + return false; + } + } + + public boolean canRelease() { + return !isMainStation() && !linkIsDocked(); + } +} + diff --git a/api/buildcraft/api/robots/EntityRobotBase.java b/api/buildcraft/api/robots/EntityRobotBase.java index efc0ef0f..22d1f888 100755 --- a/api/buildcraft/api/robots/EntityRobotBase.java +++ b/api/buildcraft/api/robots/EntityRobotBase.java @@ -38,7 +38,7 @@ public abstract class EntityRobotBase extends EntityLiving implements IInventory public abstract boolean isMoving(); - public abstract IDockingStation getLinkedStation(); + public abstract DockingStation getLinkedStation(); public abstract RedstoneBoardRobot getBoard(); @@ -48,9 +48,9 @@ public abstract class EntityRobotBase extends EntityLiving implements IInventory public abstract IEnergyStorage getBattery(); - public abstract IDockingStation getDockingStation(); + public abstract DockingStation getDockingStation(); - public abstract void dock(IDockingStation station); + public abstract void dock(DockingStation station); public abstract void undock(); @@ -73,4 +73,6 @@ public abstract class EntityRobotBase extends EntityLiving implements IInventory public abstract void onChunkUnload(); public abstract ItemStack receiveItem(TileEntity tile, ItemStack stack); + + public abstract void setMainStation(DockingStation station); } diff --git a/api/buildcraft/api/robots/IDockingStation.java b/api/buildcraft/api/robots/IDockingStation.java deleted file mode 100755 index 76e04622..00000000 --- a/api/buildcraft/api/robots/IDockingStation.java +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Copyright (c) 2011-2015, 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.robots; - -import net.minecraft.nbt.NBTTagCompound; - -import net.minecraftforge.common.util.ForgeDirection; - -import buildcraft.api.core.BlockIndex; - -public interface IDockingStation { - - int x(); - - int y(); - - int z(); - - ForgeDirection side(); - - EntityRobotBase robotTaking(); - - long robotIdTaking(); - - long linkedId(); - - boolean isTaken(); - - void writeToNBT(NBTTagCompound nbt); - - void readFromNBT(NBTTagCompound nbt); - - BlockIndex index(); - - boolean take(EntityRobotBase robot); -} diff --git a/api/buildcraft/api/robots/IDockingStationPluggable.java b/api/buildcraft/api/robots/IDockingStationPluggable.java deleted file mode 100644 index 71314019..00000000 --- a/api/buildcraft/api/robots/IDockingStationPluggable.java +++ /dev/null @@ -1,5 +0,0 @@ -package buildcraft.api.robots; - -public interface IDockingStationPluggable { - IDockingStation getStation(); -} diff --git a/api/buildcraft/api/robots/IDockingStationProvider.java b/api/buildcraft/api/robots/IDockingStationProvider.java new file mode 100644 index 00000000..608c3b6b --- /dev/null +++ b/api/buildcraft/api/robots/IDockingStationProvider.java @@ -0,0 +1,8 @@ +package buildcraft.api.robots; + +/** + * By default, this can be either an IPipePluggable or a TileEntity. + */ +public interface IDockingStationProvider { + DockingStation getStation(); +} diff --git a/api/buildcraft/api/robots/IRobotRegistry.java b/api/buildcraft/api/robots/IRobotRegistry.java index 1c9bb425..def62db4 100755 --- a/api/buildcraft/api/robots/IRobotRegistry.java +++ b/api/buildcraft/api/robots/IRobotRegistry.java @@ -40,19 +40,21 @@ public interface IRobotRegistry { void releaseResources(EntityRobotBase robot); - IDockingStation getStation(int x, int y, int z, ForgeDirection side); + DockingStation getStation(int x, int y, int z, ForgeDirection side); - Collection getStations(); + Collection getStations(); - void registerStation(IDockingStation station); + void registerStation(DockingStation station); - void removeStation(IDockingStation station); + void removeStation(DockingStation station); - void take(IDockingStation station, long robotId); + void take(DockingStation station, long robotId); - void release(IDockingStation station, long robotId); + void release(DockingStation station, long robotId); void writeToNBT(NBTTagCompound nbt); void readFromNBT(NBTTagCompound nbt); + + void markDirty(); } diff --git a/api/buildcraft/api/robots/StackRequest.java b/api/buildcraft/api/robots/StackRequest.java index e1f5f768..888622dd 100755 --- a/api/buildcraft/api/robots/StackRequest.java +++ b/api/buildcraft/api/robots/StackRequest.java @@ -15,5 +15,5 @@ public class StackRequest { public ItemStack stack; public int index; public TileEntity requester; - public IDockingStation station; + public DockingStation station; } diff --git a/buildcraft_resources/assets/buildcraftcore/textures/gui/buttons.png b/buildcraft_resources/assets/buildcraftcore/textures/gui/buttons.png index 7a53811c57d23b9a2226be24928baeaed4ed19d2..099e297487571cba99fc548c023b3f351ce0a1e5 100755 GIT binary patch delta 8375 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 Tqo@|X!S%Xu= z^(%gS3=K;CVXK$?y)l0;U%>jXRBn$pTLuP^h8Vt%tqspU@yjUGzi0ZZ@WhTGfxBUo z|5L34^F73r6#TC=2r(dlu7dx&iQjmxY`x5s_sTF}#|8PbTNs{k!xWqmpTNloimsE@6EVDB{gnrxbdd^^+k3gF|>xy~B%aKW)(k{oH&| ztpZvJKWZIV6@>HDr`$U(ef7KXpUaQaOjjLW{h)Nu!}FJ?068*HwF%k{ic{o{Ny`~L z-4V&_uEYctpU~mq0&|Jb#WOBj{@nRES&u=1eL@%5r42TMx@Y5 zz%RGlR$JTj_XMUt+Hy^kHi!uEjCe*t%L{^YQmdmF1+ ze}|^5*?Jp}E_q(iHau@h#sU7y+C$qy>?n(+!z8;7h${FW8cV7+^p5s2(ZpBFhYF=CsR!4XIM{7;MSq*eo^5!aDwVrmIeX@% zaE%8)I*wmR_gS_jYH3N0ZQR89A_3_Ks$^I!WUU;c)feakZLMP5$Ej~r*Q3SyLxh20 u4{yR<-s#Eb9nACA|B=(UEX0%H%uv6O+i~3@$y0kk_IbMcxvX