implemented requester interface for builder, for #1973
This commit is contained in:
parent
3b9b1af204
commit
66aabc625b
3 changed files with 135 additions and 11 deletions
|
@ -8,6 +8,7 @@
|
|||
*/
|
||||
package buildcraft.builders;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.Iterator;
|
||||
import java.util.LinkedList;
|
||||
|
@ -32,9 +33,13 @@ import buildcraft.BuildCraftBuilders;
|
|||
import buildcraft.api.blueprints.BuildingPermission;
|
||||
import buildcraft.api.blueprints.Translation;
|
||||
import buildcraft.api.core.BlockIndex;
|
||||
import buildcraft.api.core.IInvSlot;
|
||||
import buildcraft.api.core.NetworkData;
|
||||
import buildcraft.api.core.Position;
|
||||
import buildcraft.api.gates.IAction;
|
||||
import buildcraft.api.robots.EntityRobotBase;
|
||||
import buildcraft.api.robots.IRequestProvider;
|
||||
import buildcraft.api.robots.StackRequest;
|
||||
import buildcraft.core.Box;
|
||||
import buildcraft.core.Box.Kind;
|
||||
import buildcraft.core.IMachine;
|
||||
|
@ -47,14 +52,20 @@ import buildcraft.core.blueprints.BptBuilderTemplate;
|
|||
import buildcraft.core.blueprints.BptContext;
|
||||
import buildcraft.core.fluids.Tank;
|
||||
import buildcraft.core.fluids.TankManager;
|
||||
import buildcraft.core.inventory.ITransactor;
|
||||
import buildcraft.core.inventory.InvUtils;
|
||||
import buildcraft.core.inventory.InventoryIterator;
|
||||
import buildcraft.core.inventory.SimpleInventory;
|
||||
import buildcraft.core.inventory.StackHelper;
|
||||
import buildcraft.core.inventory.Transactor;
|
||||
import buildcraft.core.network.RPC;
|
||||
import buildcraft.core.network.RPCHandler;
|
||||
import buildcraft.core.network.RPCMessageInfo;
|
||||
import buildcraft.core.network.RPCSide;
|
||||
import buildcraft.core.robots.ResourceIdRequest;
|
||||
import buildcraft.core.robots.RobotRegistry;
|
||||
|
||||
public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluidHandler {
|
||||
public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluidHandler, IRequestProvider {
|
||||
|
||||
private static int POWER_ACTIVATION = 50;
|
||||
|
||||
|
@ -73,7 +84,7 @@ public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluid
|
|||
private SimpleInventory inv = new SimpleInventory(28, "Builder", 64);
|
||||
private BptBuilderBase bluePrintBuilder;
|
||||
private LinkedList<BlockIndex> path;
|
||||
private LinkedList<ItemStack> requiredToBuild;
|
||||
private ArrayList<ItemStack> requiredToBuild;
|
||||
private NBTTagCompound initNBT = null;
|
||||
private boolean done = true;
|
||||
|
||||
|
@ -638,7 +649,7 @@ public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluid
|
|||
}
|
||||
|
||||
@RPC (RPCSide.CLIENT)
|
||||
public void setItemRequirements(LinkedList<ItemStack> rq, LinkedList<Integer> realSizes) {
|
||||
public void setItemRequirements(ArrayList<ItemStack> rq, ArrayList<Integer> realSizes) {
|
||||
// Item stack serialized are represented through bytes, so 0-255. In
|
||||
// order to get the real amounts, we need to pass the real sizes of the
|
||||
// stacks as a separate list.
|
||||
|
@ -719,15 +730,17 @@ public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluid
|
|||
|
||||
public void updateRequirements () {
|
||||
if (bluePrintBuilder instanceof BptBuilderBlueprint) {
|
||||
LinkedList<Integer> realSize = new LinkedList<Integer>();
|
||||
ArrayList<ItemStack> reqCopy = new ArrayList<ItemStack>();
|
||||
ArrayList<Integer> realSize = new ArrayList<Integer>();
|
||||
|
||||
for (ItemStack stack : ((BptBuilderBlueprint) bluePrintBuilder).neededItems) {
|
||||
realSize.add(stack.stackSize);
|
||||
stack.stackSize = 0;
|
||||
ItemStack newStack = stack.copy();
|
||||
newStack.stackSize = 0;
|
||||
reqCopy.add(newStack);
|
||||
}
|
||||
|
||||
RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setItemRequirements",
|
||||
((BptBuilderBlueprint) bluePrintBuilder).neededItems, realSize);
|
||||
RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setItemRequirements", reqCopy, realSize);
|
||||
} else {
|
||||
RPCHandler.rpcBroadcastWorldPlayers(worldObj, this, "setItemRequirements", null, null);
|
||||
}
|
||||
|
@ -821,4 +834,116 @@ public class TileBuilder extends TileAbstractBuilder implements IMachine, IFluid
|
|||
sendNetworkUpdate();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getNumberOfRequests() {
|
||||
if (bluePrintBuilder == null) {
|
||||
return 0;
|
||||
} else if (!(bluePrintBuilder instanceof BptBuilderBlueprint)) {
|
||||
return 0;
|
||||
} else {
|
||||
BptBuilderBlueprint bpt = (BptBuilderBlueprint) bluePrintBuilder;
|
||||
|
||||
return bpt.neededItems.size();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public StackRequest getAvailableRequest(int i) {
|
||||
if (bluePrintBuilder == null) {
|
||||
return null;
|
||||
} else if (!(bluePrintBuilder instanceof BptBuilderBlueprint)) {
|
||||
return null;
|
||||
} else {
|
||||
BptBuilderBlueprint bpt = (BptBuilderBlueprint) bluePrintBuilder;
|
||||
|
||||
if (bpt.neededItems.size() <= i) {
|
||||
return null;
|
||||
}
|
||||
|
||||
ItemStack requirement = bpt.neededItems.get(i);
|
||||
|
||||
int qty = quantityMissing(requirement);
|
||||
|
||||
if (qty <= 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
StackRequest request = new StackRequest();
|
||||
|
||||
request.index = i;
|
||||
request.requester = this;
|
||||
request.stack = requirement;
|
||||
|
||||
return request;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean takeRequest(int i, EntityRobotBase robot) {
|
||||
if (bluePrintBuilder == null) {
|
||||
return false;
|
||||
} else if (!(bluePrintBuilder instanceof BptBuilderBlueprint)) {
|
||||
return false;
|
||||
} else {
|
||||
return RobotRegistry.getRegistry(worldObj).take(new ResourceIdRequest(this, i), robot);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public ItemStack provideItemsForRequest(int i, ItemStack stack) {
|
||||
if (bluePrintBuilder == null) {
|
||||
return stack;
|
||||
} else if (!(bluePrintBuilder instanceof BptBuilderBlueprint)) {
|
||||
return stack;
|
||||
} else {
|
||||
BptBuilderBlueprint bpt = (BptBuilderBlueprint) bluePrintBuilder;
|
||||
|
||||
if (bpt.neededItems.size() <= i) {
|
||||
return stack;
|
||||
}
|
||||
|
||||
ItemStack requirement = bpt.neededItems.get(i);
|
||||
|
||||
int qty = quantityMissing(requirement);
|
||||
|
||||
if (qty <= 0) {
|
||||
return stack;
|
||||
}
|
||||
|
||||
ItemStack toAdd = stack.copy();
|
||||
|
||||
if (qty < toAdd.stackSize) {
|
||||
toAdd.stackSize = qty;
|
||||
}
|
||||
|
||||
ITransactor t = Transactor.getTransactorFor(this);
|
||||
ItemStack added = t.add(toAdd, ForgeDirection.UNKNOWN, true);
|
||||
|
||||
if (added.stackSize >= stack.stackSize) {
|
||||
return null;
|
||||
} else {
|
||||
stack.stackSize -= added.stackSize;
|
||||
return stack;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private int quantityMissing(ItemStack requirement) {
|
||||
int left = requirement.stackSize;
|
||||
|
||||
for (IInvSlot slot : InventoryIterator.getIterable(this)) {
|
||||
if (slot.getStackInSlot() != null) {
|
||||
if (StackHelper.isMatchingItem(requirement, slot.getStackInSlot())) {
|
||||
if (slot.getStackInSlot().stackSize >= left) {
|
||||
return 0;
|
||||
} else {
|
||||
left -= slot.getStackInSlot().stackSize;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return left;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
*/
|
||||
package buildcraft.core.blueprints;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.HashMap;
|
||||
|
@ -52,7 +53,7 @@ import buildcraft.core.utils.BlockUtil;
|
|||
|
||||
public class BptBuilderBlueprint extends BptBuilderBase {
|
||||
|
||||
public LinkedList<ItemStack> neededItems = new LinkedList<ItemStack>();
|
||||
public ArrayList<ItemStack> neededItems = new ArrayList<ItemStack>();
|
||||
|
||||
protected TreeSet<Integer> builtEntities = new TreeSet<Integer>();
|
||||
|
||||
|
@ -676,8 +677,6 @@ public class BptBuilderBlueprint extends BptBuilderBase {
|
|||
ItemStack newStack = e.getKey().stack.copy();
|
||||
newStack.stackSize = e.getValue();
|
||||
|
||||
|
||||
|
||||
neededItems.add(newStack);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,7 @@ public class AIRobotDeliverRequested extends AIRobot {
|
|||
|
||||
@Override
|
||||
public void delegateAIEnded(AIRobot ai) {
|
||||
if (ai instanceof AIRobotSearchAndGotoStation) {
|
||||
if (ai instanceof AIRobotGotoStation) {
|
||||
if (!ai.success()) {
|
||||
terminate();
|
||||
return;
|
||||
|
|
Loading…
Reference in a new issue