Skip to content

Commit

Permalink
rewrite the robot's request system, fixes #2853
Browse files Browse the repository at this point in the history
  • Loading branch information
hea3ven committed Jul 17, 2015
1 parent 6dad865 commit a5cdd8c
Show file tree
Hide file tree
Showing 16 changed files with 436 additions and 230 deletions.
37 changes: 23 additions & 14 deletions api/buildcraft/api/robots/IRequestProvider.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -10,28 +10,37 @@


import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;



/**
* Provide requests of items that need to be fulfilled.
*
* Requests are organized as an linear array, where null entries mark slots
* without a requests. A request in a slot, or the amount of slots, is allowed
* to change before a call to {@link #offerItem(int, ItemStack)}, but it is not
* recommended that this is frequent, since the request delivery won't fail
* until it is offered the previous request.
*/
public interface IRequestProvider { public interface IRequestProvider {
/** /**
* Return the total number of request slots available from this provider. * Return the total number of request slots available from this provider.
*
* @return
*/ */
int getNumberOfRequests(); int getRequestsCount();

/**
* Return the stack requested in slot i, provided that this request is not
* in process of being provided by a robot.
*/
StackRequest getAvailableRequest(int i);


/** /**
* Allocate the request at slot i to the robot given in parameter, and * Return a stack with the request in the slot.
* return true if the allocation is successful. *
* @param slot
* @return the request in the slot, or null if there's no request.
*/ */
boolean takeRequest(int i, EntityRobotBase robot); ItemStack getRequest(int slot);


/** /**
* Provide a stack to fulfill request at index i. Return the stack minus * Fulfill the request in slot with the stack given and return any excess.
* items that have been taken. *
* @param slot
* @param stack
* @return any excess that was not used to fulfill the request.
*/ */
ItemStack provideItemsForRequest(int i, ItemStack stack); ItemStack offerItem(int slot, ItemStack stack);
} }
41 changes: 0 additions & 41 deletions api/buildcraft/api/robots/ResourceId.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -9,50 +9,17 @@
package buildcraft.api.robots; package buildcraft.api.robots;


import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;

import buildcraft.api.core.BlockIndex;


public abstract class ResourceId { public abstract class ResourceId {


public BlockIndex index = new BlockIndex();
public ForgeDirection side = ForgeDirection.UNKNOWN;
public int localId = 0;

protected ResourceId() { protected ResourceId() {
} }


@Override
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != getClass()) {
return false;
}

ResourceId compareId = (ResourceId) obj;

return index.equals(compareId.index)
&& side == compareId.side
&& localId == compareId.localId;
}

@Override
public int hashCode() {
return (((index != null ? index.hashCode() : 0) * 37) + (side != null ? side.ordinal() : 0) * 37) + localId;
}

public void writeToNBT(NBTTagCompound nbt) { public void writeToNBT(NBTTagCompound nbt) {
NBTTagCompound indexNBT = new NBTTagCompound();
index.writeTo(indexNBT);
nbt.setTag("index", indexNBT);
nbt.setByte("side", (byte) side.ordinal());
nbt.setInteger("localId", localId);
nbt.setString("resourceName", RobotManager.getResourceIdName(getClass())); nbt.setString("resourceName", RobotManager.getResourceIdName(getClass()));
} }


protected void readFromNBT(NBTTagCompound nbt) { protected void readFromNBT(NBTTagCompound nbt) {
index = new BlockIndex(nbt.getCompoundTag("index"));
side = ForgeDirection.values()[nbt.getByte("side")];
localId = nbt.getInteger("localId");
} }


public static ResourceId load(NBTTagCompound nbt) { public static ResourceId load(NBTTagCompound nbt) {
Expand All @@ -75,12 +42,4 @@ public static ResourceId load(NBTTagCompound nbt) {


return null; return null;
} }

public void taken(long robotId) {

}

public void released(long robotId) {

}
} }
39 changes: 39 additions & 0 deletions api/buildcraft/api/robots/ResourceIdBlock.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -8,12 +8,20 @@
*/ */
package buildcraft.api.robots; package buildcraft.api.robots;


import org.apache.commons.lang3.builder.HashCodeBuilder;

import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;


import net.minecraftforge.common.util.ForgeDirection;

import buildcraft.api.core.BlockIndex; import buildcraft.api.core.BlockIndex;


public class ResourceIdBlock extends ResourceId { public class ResourceIdBlock extends ResourceId {


public BlockIndex index = new BlockIndex();
public ForgeDirection side = ForgeDirection.UNKNOWN;

public ResourceIdBlock() { public ResourceIdBlock() {


} }
Expand All @@ -30,4 +38,35 @@ public ResourceIdBlock(TileEntity tile) {
index = new BlockIndex(tile); index = new BlockIndex(tile);
} }


@Override
public boolean equals(Object obj) {
if (obj == null || obj.getClass() != getClass()) {
return false;
}

ResourceIdBlock compareId = (ResourceIdBlock) obj;

return index.equals(compareId.index) && side == compareId.side;
}

@Override
public int hashCode() {
return new HashCodeBuilder().append(index.hashCode()).append(side != null ? side.ordinal() : 0).build();
}

@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
NBTTagCompound indexNBT = new NBTTagCompound();
index.writeTo(indexNBT);
nbt.setTag("index", indexNBT);
nbt.setByte("side", (byte) side.ordinal());
}

@Override
protected void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
index = new BlockIndex(nbt.getCompoundTag("index"));
side = ForgeDirection.values()[nbt.getByte("side")];
}
} }
48 changes: 43 additions & 5 deletions api/buildcraft/api/robots/ResourceIdRequest.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -8,19 +8,57 @@
*/ */
package buildcraft.api.robots; package buildcraft.api.robots;


import net.minecraft.tileentity.TileEntity; import org.apache.commons.lang3.builder.HashCodeBuilder;

import net.minecraft.nbt.NBTTagCompound;

import net.minecraftforge.common.util.ForgeDirection;


import buildcraft.api.core.BlockIndex; import buildcraft.api.core.BlockIndex;


public class ResourceIdRequest extends ResourceId { public class ResourceIdRequest extends ResourceId {


public ResourceIdRequest() { private BlockIndex index;
private ForgeDirection side;
private int slot;


public ResourceIdRequest(DockingStation station, int slot) {
index = station.index();
side = station.side();
this.slot = slot;
} }


public ResourceIdRequest(TileEntity tile, int i) { @Override
index = new BlockIndex(tile); public boolean equals(Object obj) {
localId = i; if (obj == null || obj.getClass() != getClass()) {
return false;
}

ResourceIdRequest compareId = (ResourceIdRequest) obj;

return index.equals(compareId.index) && side.equals(compareId.side) && slot == compareId.slot;
} }


@Override
public int hashCode() {
return new HashCodeBuilder().append(index.hashCode()).append(side.hashCode()).append(slot).build();
}

@Override
public void writeToNBT(NBTTagCompound nbt) {
super.writeToNBT(nbt);
NBTTagCompound indexNBT = new NBTTagCompound();
index.writeTo(indexNBT);
nbt.setTag("index", indexNBT);
nbt.setByte("side", (byte) side.ordinal());
nbt.setInteger("localId", slot);
}

@Override
protected void readFromNBT(NBTTagCompound nbt) {
super.readFromNBT(nbt);
index = new BlockIndex(nbt.getCompoundTag("index"));
side = ForgeDirection.getOrientation(nbt.getByte("side"));
slot = nbt.getInteger("localId");
}
} }
19 changes: 0 additions & 19 deletions api/buildcraft/api/robots/StackRequest.java

This file was deleted.

5 changes: 4 additions & 1 deletion buildcraft_resources/changelog/7.1.0
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -15,4 +15,7 @@ Improvements:
* Fluid pipe capacity and extraction rate now scales with the base flow multiplier. (asie) * Fluid pipe capacity and extraction rate now scales with the base flow multiplier. (asie)
* Debugger support for fluid pipes (asie) * Debugger support for fluid pipes (asie)
* Add events for robot interaction and removal (asie) * Add events for robot interaction and removal (asie)

* Rewritten robots request system (hea3ven)
- Changed the IRequestProvider api to be independent of robots.
- Carrier robots can now carry more than an item at a time.
- Builders and requesters now request more than one item at a time.
43 changes: 12 additions & 31 deletions common/buildcraft/builders/TileBuilder.java
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -23,7 +23,9 @@
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.AxisAlignedBB;
import net.minecraft.world.WorldSettings.GameType; import net.minecraft.world.WorldSettings.GameType;

import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;

import net.minecraftforge.common.util.Constants; import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.Fluid;
Expand All @@ -32,18 +34,13 @@
import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.FluidTankInfo;
import net.minecraftforge.fluids.IFluidHandler; import net.minecraftforge.fluids.IFluidHandler;


import buildcraft.BuildCraftBuilders;
import buildcraft.BuildCraftCore; import buildcraft.BuildCraftCore;
import buildcraft.api.core.BCLog; import buildcraft.api.core.BCLog;
import buildcraft.api.core.BlockIndex; import buildcraft.api.core.BlockIndex;
import buildcraft.api.core.IInvSlot; import buildcraft.api.core.IInvSlot;
import buildcraft.api.core.IPathProvider; import buildcraft.api.core.IPathProvider;
import buildcraft.api.core.Position; import buildcraft.api.core.Position;
import buildcraft.api.robots.EntityRobotBase;
import buildcraft.api.robots.IRequestProvider; import buildcraft.api.robots.IRequestProvider;
import buildcraft.api.robots.ResourceIdRequest;
import buildcraft.api.robots.RobotManager;
import buildcraft.api.robots.StackRequest;
import buildcraft.api.tiles.IControllable; import buildcraft.api.tiles.IControllable;
import buildcraft.api.tiles.IHasWork; import buildcraft.api.tiles.IHasWork;
import buildcraft.builders.blueprints.RecursiveBlueprintBuilder; import buildcraft.builders.blueprints.RecursiveBlueprintBuilder;
Expand Down Expand Up @@ -839,7 +836,7 @@ public FluidTankInfo[] getTankInfo(ForgeDirection from) {
} }


@Override @Override
public int getNumberOfRequests() { public int getRequestsCount() {
if (currentBuilder == null) { if (currentBuilder == null) {
return 0; return 0;
} else if (!(currentBuilder instanceof BptBuilderBlueprint)) { } else if (!(currentBuilder instanceof BptBuilderBlueprint)) {
Expand All @@ -852,61 +849,45 @@ public int getNumberOfRequests() {
} }


@Override @Override
public StackRequest getAvailableRequest(int i) { public ItemStack getRequest(int slot) {
if (currentBuilder == null) { if (currentBuilder == null) {
return null; return null;
} else if (!(currentBuilder instanceof BptBuilderBlueprint)) { } else if (!(currentBuilder instanceof BptBuilderBlueprint)) {
return null; return null;
} else { } else {
BptBuilderBlueprint bpt = (BptBuilderBlueprint) currentBuilder; BptBuilderBlueprint bpt = (BptBuilderBlueprint) currentBuilder;


if (bpt.neededItems.size() <= i) { if (bpt.neededItems.size() <= slot) {
return null; return null;
} }


RequirementItemStack requirement = bpt.neededItems.get(i); RequirementItemStack requirement = bpt.neededItems.get(slot);


int qty = quantityMissing(requirement.stack, requirement.size); int qty = quantityMissing(requirement.stack, requirement.size);


if (qty <= 0) { if (qty <= 0) {
return null; return null;
} }

ItemStack requestStack = requirement.stack.copy();
StackRequest request = new StackRequest(); requestStack.stackSize = qty;

return requestStack;
request.index = i;
request.requester = this;
request.stack = requirement.stack;

return request;
}
}

@Override
public boolean takeRequest(int i, EntityRobotBase robot) {
if (currentBuilder == null) {
return false;
} else if (!(currentBuilder instanceof BptBuilderBlueprint)) {
return false;
} else {
return RobotManager.registryProvider.getRegistry(worldObj).take(new ResourceIdRequest(this, i), robot);
} }
} }


@Override @Override
public ItemStack provideItemsForRequest(int i, ItemStack stack) { public ItemStack offerItem(int slot, ItemStack stack) {
if (currentBuilder == null) { if (currentBuilder == null) {
return stack; return stack;
} else if (!(currentBuilder instanceof BptBuilderBlueprint)) { } else if (!(currentBuilder instanceof BptBuilderBlueprint)) {
return stack; return stack;
} else { } else {
BptBuilderBlueprint bpt = (BptBuilderBlueprint) currentBuilder; BptBuilderBlueprint bpt = (BptBuilderBlueprint) currentBuilder;


if (bpt.neededItems.size() <= i) { if (bpt.neededItems.size() <= slot) {
return stack; return stack;
} }


RequirementItemStack requirement = bpt.neededItems.get(i); RequirementItemStack requirement = bpt.neededItems.get(slot);


int qty = quantityMissing(requirement.stack, requirement.size); int qty = quantityMissing(requirement.stack, requirement.size);


Expand Down

0 comments on commit a5cdd8c

Please sign in to comment.