made progress with robot recipes and boards, #1732

This commit is contained in:
SpaceToad 2014-05-27 00:25:39 +02:00
parent 379ea6e278
commit 7acb8b4592
14 changed files with 396 additions and 163 deletions

View file

@ -0,0 +1,15 @@
/**
* 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.api.boards;
public interface IRedstoneBoard<T> {
void updateBoard(T container);
}

View file

@ -0,0 +1,18 @@
/**
* 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.api.boards;
public abstract class RedstoneBoardRegistry {
public static RedstoneBoardRegistry instance;
public abstract void registerBoardClass(Class<? extends IRedstoneBoard> boardClass, float probability);
public abstract IRedstoneBoard createRandomBoard();
}

View file

@ -0,0 +1,27 @@
/**
* 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.api.recipes;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
public interface IAssemblyRecipe {
ItemStack getOutput();
ItemStack makeOutput();
Object[] getInputs();
double getEnergyCost();
boolean canBeDone(IInventory inv);
public void useItems(IInventory inv);
}

View file

@ -14,18 +14,9 @@ import net.minecraft.item.ItemStack;
public interface IAssemblyRecipeManager {
public interface IAssemblyRecipe {
ItemStack getOutput();
Object[] getInputs();
double getEnergyCost();
}
/**
* Add an Assembly Table recipe.
*
*
* @param input
* Object... containing either an ItemStack, or a paired string
* and integer(ex: "dyeBlue", 1)
@ -36,5 +27,7 @@ public interface IAssemblyRecipeManager {
*/
void addRecipe(double energyCost, ItemStack output, Object... input);
void addRecipe(IAssemblyRecipe recipe);
List<? extends IAssemblyRecipe> getRecipes();
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 251 B

View file

@ -26,6 +26,7 @@ import cpw.mods.fml.common.network.NetworkRegistry;
import net.minecraftforge.oredict.OreDictionary;
import buildcraft.api.blueprints.SchematicRegistry;
import buildcraft.api.boards.RedstoneBoardRegistry;
import buildcraft.api.recipes.BuildcraftRecipes;
import buildcraft.api.transport.PipeWire;
import buildcraft.builders.schematics.SchematicRotateMeta;
@ -50,6 +51,7 @@ import buildcraft.silicon.TileAdvancedCraftingTable;
import buildcraft.silicon.TileAssemblyTable;
import buildcraft.silicon.TileIntegrationTable;
import buildcraft.silicon.TileLaser;
import buildcraft.silicon.boards.ImplRedstoneBoardRegistry;
import buildcraft.silicon.network.PacketHandlerSilicon;
import buildcraft.silicon.recipes.AdvancedFacadeRecipe;
import buildcraft.silicon.recipes.GateExpansionRecipe;
@ -110,6 +112,8 @@ public class BuildCraftSilicon extends BuildCraftMod {
robotBuilderItem = new ItemRobot(EntityRobotBuilder.class).setUnlocalizedName("robotBuilder");
CoreProxy.proxy.registerItem(robotBuilderItem);
RedstoneBoardRegistry.instance = new ImplRedstoneBoardRegistry();
}
@Mod.EventHandler
@ -192,6 +196,25 @@ public class BuildCraftSilicon extends BuildCraftMod {
addGateRecipe(40000, GateMaterial.GOLD, Chipset.GOLD, PipeWire.RED, PipeWire.BLUE, PipeWire.GREEN);
addGateRecipe(80000, GateMaterial.DIAMOND, Chipset.DIAMOND, PipeWire.RED, PipeWire.BLUE, PipeWire.GREEN, PipeWire.YELLOW);
// ROBOTS AND BOARDS
BuildcraftRecipes.assemblyTable.addRecipe(100000, new ItemStack(redstoneCrystal), new ItemStack(
Blocks.redstone_block));
CoreProxy.proxy.addCraftingRecipe(new ItemStack(redstoneBoard),
"PPP",
"PRP",
"PPP",
'R', Items.redstone,
'P', Items.paper);
CoreProxy.proxy.addCraftingRecipe(new ItemStack(robotBaseItem),
"PPP",
"PRP",
"C C",
'P', Items.iron_ingot,
'R', redstoneCrystal,
'C', Chipset.DIAMOND.getStack());
// REVERSAL RECIPES
EnumSet<GateMaterial> materials = EnumSet.allOf(GateMaterial.class);
materials.remove(GateMaterial.REDSTONE);

View file

@ -21,6 +21,7 @@ import net.minecraftforge.oredict.OreDictionary;
import buildcraft.BuildCraftCore;
import buildcraft.api.core.IInvSlot;
import buildcraft.api.recipes.IAssemblyRecipe;
import buildcraft.api.recipes.IAssemblyRecipeManager;
import buildcraft.core.inventory.ITransactor;
import buildcraft.core.inventory.InventoryIterator;
@ -30,7 +31,7 @@ import buildcraft.core.inventory.filters.ArrayStackFilter;
public class AssemblyRecipeManager implements IAssemblyRecipeManager {
public static final AssemblyRecipeManager INSTANCE = new AssemblyRecipeManager();
private List<AssemblyRecipe> assemblyRecipes = new LinkedList<AssemblyRecipe>();
private List<IAssemblyRecipe> assemblyRecipes = new LinkedList<IAssemblyRecipe>();
@Override
public void addRecipe(double energyCost, ItemStack output, Object... input) {
@ -44,7 +45,12 @@ public class AssemblyRecipeManager implements IAssemblyRecipeManager {
}
@Override
public List<AssemblyRecipe> getRecipes() {
public void addRecipe(IAssemblyRecipe recipe) {
assemblyRecipes.add(recipe);
}
@Override
public List<IAssemblyRecipe> getRecipes() {
return assemblyRecipes;
}
@ -93,6 +99,7 @@ public class AssemblyRecipeManager implements IAssemblyRecipeManager {
return energyCost;
}
@Override
public boolean canBeDone(IInventory inv) {
for (int i = 0; i < processedInput.length; i++) {
if (processedInput[i] == null) {
@ -158,6 +165,7 @@ public class AssemblyRecipeManager implements IAssemblyRecipeManager {
return true;
}
@Override
public void useItems(IInventory inv) {
ITransactor tran = Transactor.getTransactorFor(inv);
Object[] input = processedInput;
@ -183,5 +191,10 @@ public class AssemblyRecipeManager implements IAssemblyRecipeManager {
}
}
}
@Override
public ItemStack makeOutput() {
return getOutput().copy();
}
}
}

View file

@ -37,7 +37,7 @@ public class EntityRobot extends EntityLiving implements
public DockingStation dockingStation = new DockingStation();
public boolean isDocked = false;
protected RobotAIBase currentAI;
public RobotAIBase currentAI;
protected RobotAIBase nextAI;
private boolean needsUpdate = false;

View file

@ -8,11 +8,6 @@
*/
package buildcraft.core.robots;
import java.util.HashSet;
import java.util.Set;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
@ -20,34 +15,22 @@ import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.core.SafeTimeTracker;
import buildcraft.api.boards.IRedstoneBoard;
import buildcraft.core.DefaultProps;
import buildcraft.core.inventory.TransactorSimple;
import buildcraft.transport.PipeTransportItems;
import buildcraft.transport.TileGenericPipe;
import buildcraft.transport.TravelingItem;
import buildcraft.core.robots.boards.BoardRobotPicker;
public class EntityRobotPicker extends EntityRobot implements IInventory {
private static ResourceLocation texture = new ResourceLocation("buildcraft", DefaultProps.TEXTURE_PATH_ENTITIES + "/robot_picker.png");
private static Set<Integer> targettedItems = new HashSet<Integer>();
SafeTimeTracker scanTracker = new SafeTimeTracker(40, 10);
SafeTimeTracker pickTracker = new SafeTimeTracker(20, 0);
SafeTimeTracker unloadTracker = new SafeTimeTracker(20, 0);
TransactorSimple inventoryInsert = new TransactorSimple(this);
int pickTime = -1;
ItemStack[] inv = new ItemStack[6];
private EntityItem target;
private IRedstoneBoard<EntityRobotPicker> board;
public EntityRobotPicker(World par1World) {
super(par1World);
board = new BoardRobotPicker();
}
@Override
@ -59,102 +42,7 @@ public class EntityRobotPicker extends EntityRobot implements IInventory {
public void onUpdate () {
super.onUpdate();
if (worldObj.isRemote) {
return;
}
if (target != null) {
if (target.isDead) {
targettedItems.remove(target.getEntityId());
target = null;
setMainAI(new RobotAIReturnToDock(this));
hideLaser();
scan ();
} else if (pickTime == -1) {
if (currentAI.isDone()) {
setLaserDestination((float) target.posX, (float) target.posY, (float) target.posZ);
showLaser();
pickTracker = new SafeTimeTracker (200);
pickTime = 0;
}
} else {
pickTime++;
if (pickTime > 20) {
target.getEntityItem().stackSize -= inventoryInsert.inject(
target.getEntityItem(), ForgeDirection.UNKNOWN,
true);
if (target.getEntityItem().stackSize <= 0) {
target.setDead();
}
}
}
} else {
if (isDocked) {
TileGenericPipe pipe = (TileGenericPipe) worldObj
.getTileEntity(dockingStation.x, dockingStation.y,
dockingStation.z);
if (pipe != null && pipe.pipe.transport instanceof PipeTransportItems) {
if (unloadTracker.markTimeIfDelay(worldObj)) {
for (int i = 0; i < inv.length; ++i) {
if (inv[i] != null) {
float cx = dockingStation.x + 0.5F + 0.2F * dockingStation.side.offsetX;
float cy = dockingStation.y + 0.5F + 0.2F * dockingStation.side.offsetY;
float cz = dockingStation.z + 0.5F + 0.2F * dockingStation.side.offsetZ;
TravelingItem item = TravelingItem.make(cx, cy,
cz, inv[i]);
((PipeTransportItems) pipe.pipe.transport)
.injectItem(item, dockingStation.side.getOpposite());
inv[i] = null;
break;
}
}
}
}
}
if (scanTracker.markTimeIfDelay(worldObj)) {
scan ();
}
}
}
public void scan () {
for (Object o : worldObj.loadedEntityList) {
Entity e = (Entity) o;
if (!e.isDead && e instanceof EntityItem && !targettedItems.contains(e.getEntityId())) {
double dx = e.posX - posX;
double dy = e.posY - posY;
double dz = e.posZ - posZ;
double sqrDistance = dx * dx + dy * dy + dz * dz;
double maxDistance = 100 * 100;
if (sqrDistance <= maxDistance) {
EntityItem item = (EntityItem) e;
if (inventoryInsert.inject(item.getEntityItem(),
ForgeDirection.UNKNOWN, false) > 0) {
target = item;
targettedItems.add(e.getEntityId());
isDocked = false;
setMainAI(new RobotAIMoveTo(this, (float) e.posX,
(float) e.posY, (float) e.posZ));
pickTime = -1;
break;
}
}
}
}
board.updateBoard(this);
}
@Override

View file

@ -0,0 +1,134 @@
package buildcraft.core.robots.boards;
import java.util.HashSet;
import java.util.Set;
import net.minecraft.entity.Entity;
import net.minecraft.entity.item.EntityItem;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.api.boards.IRedstoneBoard;
import buildcraft.api.core.SafeTimeTracker;
import buildcraft.core.inventory.TransactorSimple;
import buildcraft.core.robots.EntityRobotPicker;
import buildcraft.core.robots.RobotAIMoveTo;
import buildcraft.core.robots.RobotAIReturnToDock;
import buildcraft.transport.PipeTransportItems;
import buildcraft.transport.TileGenericPipe;
import buildcraft.transport.TravelingItem;
public class BoardRobotPicker implements IRedstoneBoard<EntityRobotPicker> {
private static Set<Integer> targettedItems = new HashSet<Integer>();
SafeTimeTracker scanTracker = new SafeTimeTracker(40, 10);
SafeTimeTracker pickTracker = new SafeTimeTracker(20, 0);
SafeTimeTracker unloadTracker = new SafeTimeTracker(20, 0);
private EntityItem target;
int pickTime = -1;
@Override
public void updateBoard(EntityRobotPicker robot) {
TransactorSimple inventoryInsert = new TransactorSimple(robot);
if (robot.worldObj.isRemote) {
return;
}
if (target != null) {
if (target.isDead) {
targettedItems.remove(target.getEntityId());
target = null;
robot.setMainAI(new RobotAIReturnToDock(robot));
scan(robot);
} else if (pickTime == -1) {
if (robot.currentAI.isDone()) {
robot.setLaserDestination((float) target.posX, (float) target.posY, (float) target.posZ);
pickTracker = new SafeTimeTracker(200);
pickTime = 0;
}
} else {
pickTime++;
if (pickTime > 20) {
target.getEntityItem().stackSize -= inventoryInsert.inject(
target.getEntityItem(), ForgeDirection.UNKNOWN,
true);
if (target.getEntityItem().stackSize <= 0) {
target.setDead();
}
}
}
} else {
if (robot.isDocked) {
TileGenericPipe pipe = (TileGenericPipe) robot.worldObj
.getTileEntity(robot.dockingStation.x, robot.dockingStation.y,
robot.dockingStation.z);
if (pipe != null && pipe.pipe.transport instanceof PipeTransportItems) {
if (unloadTracker.markTimeIfDelay(robot.worldObj)) {
for (int i = 0; i < robot.getSizeInventory(); ++i) {
if (robot.getStackInSlot(i) != null) {
float cx = robot.dockingStation.x + 0.5F + 0.2F * robot.dockingStation.side.offsetX;
float cy = robot.dockingStation.y + 0.5F + 0.2F * robot.dockingStation.side.offsetY;
float cz = robot.dockingStation.z + 0.5F + 0.2F * robot.dockingStation.side.offsetZ;
TravelingItem item = TravelingItem.make(cx, cy,
cz, robot.getStackInSlot(i));
((PipeTransportItems) pipe.pipe.transport)
.injectItem(item, robot.dockingStation.side.getOpposite());
robot.setInventorySlotContents(i, null);
break;
}
}
}
}
}
if (scanTracker.markTimeIfDelay(robot.worldObj)) {
scan(robot);
}
}
}
public void scan(EntityRobotPicker robot) {
TransactorSimple inventoryInsert = new TransactorSimple(robot);
for (Object o : robot.worldObj.loadedEntityList) {
Entity e = (Entity) o;
if (!e.isDead && e instanceof EntityItem && !targettedItems.contains(e.getEntityId())) {
double dx = e.posX - robot.posX;
double dy = e.posY - robot.posY;
double dz = e.posZ - robot.posZ;
double sqrDistance = dx * dx + dy * dy + dz * dz;
double maxDistance = 100 * 100;
if (sqrDistance <= maxDistance) {
EntityItem item = (EntityItem) e;
if (inventoryInsert.inject(item.getEntityItem(),
ForgeDirection.UNKNOWN, false) > 0) {
target = item;
targettedItems.add(e.getEntityId());
robot.isDocked = false;
robot.setMainAI(new RobotAIMoveTo(robot, (float) e.posX,
(float) e.posY, (float) e.posZ));
pickTime = -1;
break;
}
}
}
}
}
}

View file

@ -26,20 +26,20 @@ import net.minecraftforge.common.util.Constants;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftSilicon;
import buildcraft.api.recipes.IAssemblyRecipe;
import buildcraft.core.DefaultProps;
import buildcraft.core.IMachine;
import buildcraft.core.network.PacketIds;
import buildcraft.core.network.PacketNBT;
import buildcraft.core.recipes.AssemblyRecipeManager;
import buildcraft.core.recipes.AssemblyRecipeManager.AssemblyRecipe;
import buildcraft.core.triggers.ActionMachineControl;
import buildcraft.core.utils.StringUtils;
import buildcraft.core.utils.Utils;
public class TileAssemblyTable extends TileLaserTableBase implements IMachine, IInventory {
public AssemblyRecipe currentRecipe;
private Set<AssemblyRecipe> plannedOutput = new LinkedHashSet<AssemblyRecipe>();
public IAssemblyRecipe currentRecipe;
private Set<IAssemblyRecipe> plannedOutput = new LinkedHashSet<IAssemblyRecipe>();
public static class SelectionMessage {
@ -62,10 +62,10 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
}
}
public List<AssemblyRecipe> getPotentialOutputs() {
List<AssemblyRecipe> result = new LinkedList<AssemblyRecipe>();
public List<IAssemblyRecipe> getPotentialOutputs() {
List<IAssemblyRecipe> result = new LinkedList<IAssemblyRecipe>();
for (AssemblyRecipe recipe : AssemblyRecipeManager.INSTANCE.getRecipes()) {
for (IAssemblyRecipe recipe : AssemblyRecipeManager.INSTANCE.getRecipes()) {
if (recipe.canBeDone(this)) {
result.add(recipe);
}
@ -98,10 +98,9 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
setEnergy(0);
if (currentRecipe.canBeDone(this)) {
currentRecipe.useItems(this);
ItemStack remaining = currentRecipe.output.copy();
ItemStack remaining = currentRecipe.makeOutput();
remaining.stackSize -= Utils.addToRandomInventoryAround(worldObj, xCoord, yCoord, zCoord, remaining);
if (remaining.stackSize > 0) {
@ -109,7 +108,8 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
}
if (remaining.stackSize > 0) {
EntityItem entityitem = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.7, zCoord + 0.5, currentRecipe.output.copy());
EntityItem entityitem = new EntityItem(worldObj, xCoord + 0.5, yCoord + 0.7, zCoord + 0.5,
remaining);
worldObj.spawnEntityInWorld(entityitem);
}
@ -153,8 +153,9 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
continue;
}
for (AssemblyRecipe r : AssemblyRecipeManager.INSTANCE.getRecipes()) {
if (r.output.getItem() == stack.getItem() && r.output.getItemDamage() == stack.getItemDamage()) {
for (IAssemblyRecipe r : AssemblyRecipeManager.INSTANCE.getRecipes()) {
if (r.getOutput().getItem() == stack.getItem()
&& r.getOutput().getItemDamage() == stack.getItemDamage()) {
plannedOutput.add(r);
break;
}
@ -164,8 +165,9 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
if (nbt.hasKey("recipe")) {
ItemStack stack = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("recipe"));
for (AssemblyRecipe r : plannedOutput) {
if (r.output.getItem() == stack.getItem() && r.output.getItemDamage() == stack.getItemDamage()) {
for (IAssemblyRecipe r : plannedOutput) {
if (r.getOutput().getItem() == stack.getItem()
&& r.getOutput().getItemDamage() == stack.getItemDamage()) {
setCurrentRecipe(r);
break;
}
@ -179,9 +181,9 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
NBTTagList list = new NBTTagList();
for (AssemblyRecipe recipe : plannedOutput) {
for (IAssemblyRecipe recipe : plannedOutput) {
NBTTagCompound cpt = new NBTTagCompound();
recipe.output.writeToNBT(cpt);
recipe.getOutput().writeToNBT(cpt);
list.appendTag(cpt);
}
@ -189,12 +191,12 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
if (currentRecipe != null) {
NBTTagCompound recipe = new NBTTagCompound();
currentRecipe.output.writeToNBT(recipe);
currentRecipe.getOutput().writeToNBT(recipe);
nbt.setTag("recipe", recipe);
}
}
public boolean isPlanned(AssemblyRecipe recipe) {
public boolean isPlanned(IAssemblyRecipe recipe) {
if (recipe == null) {
return false;
}
@ -202,11 +204,11 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
return plannedOutput.contains(recipe);
}
public boolean isAssembling(AssemblyRecipe recipe) {
public boolean isAssembling(IAssemblyRecipe recipe) {
return recipe != null && recipe == currentRecipe;
}
private void setCurrentRecipe(AssemblyRecipe recipe) {
private void setCurrentRecipe(IAssemblyRecipe recipe) {
this.currentRecipe = recipe;
}
@ -218,7 +220,7 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
return 0;
}
public void planOutput(AssemblyRecipe recipe) {
public void planOutput(IAssemblyRecipe recipe) {
if (recipe != null && !isPlanned(recipe)) {
plannedOutput.add(recipe);
@ -228,7 +230,7 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
}
}
public void cancelPlanOutput(AssemblyRecipe recipe) {
public void cancelPlanOutput(IAssemblyRecipe recipe) {
if (isAssembling(recipe)) {
setCurrentRecipe(null);
}
@ -243,7 +245,7 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
public void setNextCurrentRecipe() {
boolean takeNext = false;
for (AssemblyRecipe recipe : plannedOutput) {
for (IAssemblyRecipe recipe : plannedOutput) {
if (recipe == currentRecipe) {
takeNext = true;
} else if (takeNext && recipe.canBeDone(this)) {
@ -252,7 +254,7 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
}
}
for (AssemblyRecipe recipe : plannedOutput) {
for (IAssemblyRecipe recipe : plannedOutput) {
if (recipe.canBeDone(this)) {
setCurrentRecipe(recipe);
return;
@ -263,8 +265,9 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
}
public void handleSelectionMessage(SelectionMessage message) {
for (AssemblyRecipe recipe : AssemblyRecipeManager.INSTANCE.getRecipes()) {
if (recipe.output.isItemEqual(message.stack) && ItemStack.areItemStackTagsEqual(recipe.output, message.stack)) {
for (IAssemblyRecipe recipe : AssemblyRecipeManager.INSTANCE.getRecipes()) {
if (recipe.getOutput().isItemEqual(message.stack)
&& ItemStack.areItemStackTagsEqual(recipe.getOutput(), message.stack)) {
if (message.select) {
planOutput(recipe);
} else {
@ -277,10 +280,10 @@ public class TileAssemblyTable extends TileLaserTableBase implements IMachine, I
}
public void sendSelectionTo(EntityPlayer player) {
for (AssemblyRecipe recipe : AssemblyRecipeManager.INSTANCE.getRecipes()) {
for (IAssemblyRecipe recipe : AssemblyRecipeManager.INSTANCE.getRecipes()) {
SelectionMessage message = new SelectionMessage();
message.stack = recipe.output;
message.stack = recipe.getOutput();
if (isPlanned(recipe)) {
message.select = true;

View file

@ -0,0 +1,55 @@
package buildcraft.silicon.boards;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import buildcraft.BuildCraftSilicon;
import buildcraft.api.recipes.IAssemblyRecipe;
import buildcraft.api.transport.PipeWire;
public class BoardRecipe implements IAssemblyRecipe {
private Object[] inputs;
public BoardRecipe () {
inputs = new Object[] {
new ItemStack(BuildCraftSilicon.redstoneBoard, 1, 0),
PipeWire.RED.getStack(1),
PipeWire.BLUE.getStack(1),
PipeWire.YELLOW.getStack(1),
PipeWire.GREEN.getStack(1)};
}
@Override
public ItemStack getOutput() {
return new ItemStack(BuildCraftSilicon.redstoneBoard, 1, 1);
}
@Override
public ItemStack makeOutput() {
return null;
}
@Override
public Object[] getInputs() {
return inputs;
}
@Override
public double getEnergyCost() {
return 10;
}
@Override
public boolean canBeDone(IInventory inv) {
// TODO Auto-generated method stub
return false;
}
@Override
public void useItems(IInventory inv) {
// TODO Auto-generated method stub
}
}

View file

@ -0,0 +1,64 @@
/**
* 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.silicon.boards;
import java.util.ArrayList;
import java.util.Random;
import buildcraft.api.boards.IRedstoneBoard;
import buildcraft.api.boards.RedstoneBoardRegistry;
public class ImplRedstoneBoardRegistry extends RedstoneBoardRegistry {
private static class BoardFactory {
public Class<? extends IRedstoneBoard> clas;
public float probability;
}
private float totalProbability;
private ArrayList<BoardFactory> boards = new ArrayList<BoardFactory>();
private Random rand = new Random();
@Override
public void registerBoardClass(Class<? extends IRedstoneBoard> boardClass, float probability) {
BoardFactory factory = new BoardFactory();
factory.clas = boardClass;
factory.probability = probability;
totalProbability += probability;
boards.add(factory);
}
@Override
public IRedstoneBoard createRandomBoard() {
float value = rand.nextFloat() * totalProbability;
float accumulatedSearch = 0;
for (BoardFactory f : boards) {
accumulatedSearch += f.probability;
if (accumulatedSearch < value) {
try {
return f.clas.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}

View file

@ -21,6 +21,7 @@ import net.minecraft.util.ResourceLocation;
import buildcraft.BuildCraftCore;
import buildcraft.BuildCraftSilicon;
import buildcraft.api.recipes.IAssemblyRecipe;
import buildcraft.core.CoreIconProvider;
import buildcraft.core.DefaultProps;
import buildcraft.core.gui.AdvancedSlot;
@ -28,7 +29,6 @@ import buildcraft.core.gui.GuiAdvancedInterface;
import buildcraft.core.network.PacketCoordinates;
import buildcraft.core.network.PacketIds;
import buildcraft.core.network.PacketNBT;
import buildcraft.core.recipes.AssemblyRecipeManager.AssemblyRecipe;
import buildcraft.core.utils.StringUtils;
import buildcraft.silicon.TileAssemblyTable;
import buildcraft.silicon.TileAssemblyTable.SelectionMessage;
@ -81,7 +81,7 @@ public class GuiAssemblyTable extends GuiAdvancedInterface {
class RecipeSlot extends AdvancedSlot {
public AssemblyRecipe recipe;
public IAssemblyRecipe recipe;
public RecipeSlot(int x, int y) {
super(GuiAssemblyTable.this, x, y);
@ -125,8 +125,8 @@ public class GuiAssemblyTable extends GuiAdvancedInterface {
}
public void updateRecipes() {
List<AssemblyRecipe> potentialRecipes = table.getPotentialOutputs();
Iterator<AssemblyRecipe> cur = potentialRecipes.iterator();
List<IAssemblyRecipe> potentialRecipes = table.getPotentialOutputs();
Iterator<IAssemblyRecipe> cur = potentialRecipes.iterator();
for (int p = 0; p < 8; ++p) {
if (cur.hasNext()) {
@ -199,7 +199,7 @@ public class GuiAssemblyTable extends GuiAdvancedInterface {
message.select = true;
}
message.stack = slot.recipe.output;
message.stack = slot.recipe.getOutput();
if (table.getWorldObj().isRemote) {
PacketNBT packet = new PacketNBT(PacketIds.SELECTION_ASSEMBLY, message.getNBT(), table.xCoord, table.yCoord, table.zCoord);