made progress for robot implementation, #1732

This commit is contained in:
SpaceToad 2014-05-29 11:28:34 +02:00
parent e6ff3d7825
commit e7b680f29e
7 changed files with 171 additions and 40 deletions

View file

@ -0,0 +1,23 @@
/**
* 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;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
public interface IRedstoneBoardNBT {
String getID();
String getName(NBTTagCompound nbt);
IRedstoneBoard create(NBTTagCompound nbt);
IIcon getIcon(NBTTagCompound nbt);
}

View file

@ -8,11 +8,15 @@
*/ */
package buildcraft.api.boards; package buildcraft.api.boards;
import net.minecraft.nbt.NBTTagCompound;
public abstract class RedstoneBoardRegistry { public abstract class RedstoneBoardRegistry {
public static RedstoneBoardRegistry instance; public static RedstoneBoardRegistry instance;
public abstract void registerBoardClass(Class<? extends IRedstoneBoard> boardClass, float probability); public abstract void registerBoardClass(IRedstoneBoardNBT redstoneBoardNBT, float probability);
public abstract IRedstoneBoard createRandomBoard(); public abstract void createRandomBoard(NBTTagCompound nbt);
public abstract IRedstoneBoardNBT getRedstoneBoard(NBTTagCompound nbt);
} }

View file

@ -39,6 +39,7 @@ import buildcraft.core.proxy.CoreProxy;
import buildcraft.core.robots.EntityRobot; import buildcraft.core.robots.EntityRobot;
import buildcraft.core.robots.EntityRobotBuilder; import buildcraft.core.robots.EntityRobotBuilder;
import buildcraft.core.robots.EntityRobotPicker; import buildcraft.core.robots.EntityRobotPicker;
import buildcraft.core.robots.boards.BoardRobotPickerNBT;
import buildcraft.silicon.BlockLaser; import buildcraft.silicon.BlockLaser;
import buildcraft.silicon.BlockLaserTable; import buildcraft.silicon.BlockLaserTable;
import buildcraft.silicon.GuiHandler; import buildcraft.silicon.GuiHandler;
@ -51,6 +52,7 @@ import buildcraft.silicon.TileAdvancedCraftingTable;
import buildcraft.silicon.TileAssemblyTable; import buildcraft.silicon.TileAssemblyTable;
import buildcraft.silicon.TileIntegrationTable; import buildcraft.silicon.TileIntegrationTable;
import buildcraft.silicon.TileLaser; import buildcraft.silicon.TileLaser;
import buildcraft.silicon.boards.BoardRecipe;
import buildcraft.silicon.boards.ImplRedstoneBoardRegistry; import buildcraft.silicon.boards.ImplRedstoneBoardRegistry;
import buildcraft.silicon.network.PacketHandlerSilicon; import buildcraft.silicon.network.PacketHandlerSilicon;
import buildcraft.silicon.recipes.AdvancedFacadeRecipe; import buildcraft.silicon.recipes.AdvancedFacadeRecipe;
@ -114,6 +116,8 @@ public class BuildCraftSilicon extends BuildCraftMod {
CoreProxy.proxy.registerItem(robotBuilderItem); CoreProxy.proxy.registerItem(robotBuilderItem);
RedstoneBoardRegistry.instance = new ImplRedstoneBoardRegistry(); RedstoneBoardRegistry.instance = new ImplRedstoneBoardRegistry();
RedstoneBoardRegistry.instance.registerBoardClass(new BoardRobotPickerNBT(), 10);
} }
@Mod.EventHandler @Mod.EventHandler
@ -215,6 +219,8 @@ public class BuildCraftSilicon extends BuildCraftMod {
'R', redstoneCrystal, 'R', redstoneCrystal,
'C', Chipset.DIAMOND.getStack()); 'C', Chipset.DIAMOND.getStack());
BuildcraftRecipes.assemblyTable.addRecipe(new BoardRecipe());
// REVERSAL RECIPES // REVERSAL RECIPES
EnumSet<GateMaterial> materials = EnumSet.allOf(GateMaterial.class); EnumSet<GateMaterial> materials = EnumSet.allOf(GateMaterial.class);
materials.remove(GateMaterial.REDSTONE); materials.remove(GateMaterial.REDSTONE);

View file

@ -0,0 +1,46 @@
/**
* 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.core.robots.boards;
import net.minecraft.client.Minecraft;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon;
import buildcraft.api.boards.IRedstoneBoard;
import buildcraft.api.boards.IRedstoneBoardNBT;
public class BoardRobotPickerNBT implements IRedstoneBoardNBT {
public IIcon icon;
@Override
public String getID() {
return "buildcraft:boardRobotPicker";
}
@Override
public String getName(NBTTagCompound nbt) {
return getID();
}
@Override
public IRedstoneBoard create(NBTTagCompound nbt) {
return new BoardRobotPicker();
}
@Override
public IIcon getIcon(NBTTagCompound nbt) {
if (icon == null) {
icon = Minecraft.getMinecraft().getTextureMapBlocks().registerIcon("buildcraft:board_green");
}
return icon;
}
}

View file

@ -10,18 +10,20 @@ package buildcraft.silicon;
import net.minecraft.client.renderer.texture.IIconRegister; import net.minecraft.client.renderer.texture.IIconRegister;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.IIcon; import net.minecraft.util.IIcon;
import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly; import cpw.mods.fml.relauncher.SideOnly;
import buildcraft.api.boards.RedstoneBoardRegistry;
import buildcraft.core.ItemBuildCraft; import buildcraft.core.ItemBuildCraft;
import buildcraft.core.utils.NBTUtils; import buildcraft.core.utils.NBTUtils;
public class ItemRedstoneBoard extends ItemBuildCraft { public class ItemRedstoneBoard extends ItemBuildCraft {
public IIcon cleanBoard; public IIcon cleanBoard;
public IIcon usedBoard; public IIcon unknownBoard;
public ItemRedstoneBoard() { public ItemRedstoneBoard() {
super(); super();
@ -29,15 +31,19 @@ public class ItemRedstoneBoard extends ItemBuildCraft {
@Override @Override
public int getItemStackLimit(ItemStack stack) { public int getItemStackLimit(ItemStack stack) {
return NBTUtils.getItemData(stack).hasKey("kind") ? 1 : 16; return NBTUtils.getItemData(stack).hasKey("id") ? 1 : 16;
} }
@Override @Override
public IIcon getIconIndex(ItemStack stack) { public IIcon getIconIndex(ItemStack stack) {
if (!NBTUtils.getItemData(stack).hasKey("kind")) { NBTTagCompound cpt = NBTUtils.getItemData(stack);
if (!cpt.hasKey("id")) {
itemIcon = cleanBoard; itemIcon = cleanBoard;
} else if (cpt.getString("id").equals("<unknown>")) {
itemIcon = unknownBoard;
} else { } else {
itemIcon = usedBoard; itemIcon = RedstoneBoardRegistry.instance.getRedstoneBoard(cpt).getIcon(cpt);
} }
return itemIcon; return itemIcon;
@ -47,7 +53,7 @@ public class ItemRedstoneBoard extends ItemBuildCraft {
@SideOnly(Side.CLIENT) @SideOnly(Side.CLIENT)
public void registerIcons(IIconRegister par1IconRegister) { public void registerIcons(IIconRegister par1IconRegister) {
cleanBoard = par1IconRegister.registerIcon("buildcraft:board_clean"); cleanBoard = par1IconRegister.registerIcon("buildcraft:board_clean");
usedBoard = par1IconRegister.registerIcon("buildcraft:board_used"); unknownBoard = par1IconRegister.registerIcon("buildcraft:board_unknown");
} }
} }

View file

@ -11,31 +11,42 @@ package buildcraft.silicon.boards;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraftforge.common.util.ForgeDirection;
import buildcraft.BuildCraftSilicon; import buildcraft.BuildCraftSilicon;
import buildcraft.api.boards.RedstoneBoardRegistry;
import buildcraft.api.core.IInvSlot;
import buildcraft.api.recipes.IAssemblyRecipe; import buildcraft.api.recipes.IAssemblyRecipe;
import buildcraft.api.transport.PipeWire; import buildcraft.core.inventory.ITransactor;
import buildcraft.core.inventory.InventoryIterator;
import buildcraft.core.inventory.Transactor;
import buildcraft.core.inventory.filters.ArrayStackFilter;
import buildcraft.core.utils.NBTUtils;
public class BoardRecipe implements IAssemblyRecipe { public class BoardRecipe implements IAssemblyRecipe {
private Object[] inputs; private ItemStack[] inputs;
private ItemStack output;
public BoardRecipe () { public BoardRecipe () {
inputs = new Object[] { inputs = new ItemStack[] {
new ItemStack(BuildCraftSilicon.redstoneBoard, 1, 0), new ItemStack(BuildCraftSilicon.redstoneBoard)};
PipeWire.RED.getStack(1),
PipeWire.BLUE.getStack(1), output = new ItemStack(BuildCraftSilicon.redstoneBoard);
PipeWire.YELLOW.getStack(1), NBTUtils.getItemData(output).setString("id", "<unknown>");
PipeWire.GREEN.getStack(1)};
} }
@Override @Override
public ItemStack getOutput() { public ItemStack getOutput() {
return new ItemStack(BuildCraftSilicon.redstoneBoard, 1, 1); return output;
} }
@Override @Override
public ItemStack makeOutput() { public ItemStack makeOutput() {
return null; ItemStack stack = new ItemStack(BuildCraftSilicon.redstoneBoard);
RedstoneBoardRegistry.instance.createRandomBoard(stack.stackTagCompound);
return stack;
} }
@Override @Override
@ -48,16 +59,53 @@ public class BoardRecipe implements IAssemblyRecipe {
return 10; return 10;
} }
// FIXME: canBeDone and useItems could use some improvements and
// factorization. See AssemblyRecipe as well.
@Override @Override
public boolean canBeDone(IInventory inv) { public boolean canBeDone(IInventory inv) {
// TODO Auto-generated method stub for (ItemStack requirement : inputs) {
if (requirement == null) {
continue;
}
int found = 0; // Amount of ingredient found in inventory
int expected = requirement.stackSize;
for (IInvSlot slot : InventoryIterator.getIterable(inv, ForgeDirection.UNKNOWN)) {
ItemStack item = slot.getStackInSlot();
if (item == null) {
continue;
}
if (item.isItemEqual(requirement)) {
found += item.stackSize; // Adds quantity of stack to
// amount found
}
if (found >= expected) {
break;
}
}
// Return false if the amount of ingredient found
// is not enough
if (found < expected) {
return false; return false;
} }
}
return true;
}
@Override @Override
public void useItems(IInventory inv) { public void useItems(IInventory inv) {
// TODO Auto-generated method stub ITransactor tran = Transactor.getTransactorFor(inv);
for (ItemStack requirement : inputs) {
for (int num = 0; num < requirement.stackSize; num++) {
tran.remove(new ArrayStackFilter(requirement), ForgeDirection.UNKNOWN, true);
}
}
} }
} }

View file

@ -8,57 +8,55 @@
*/ */
package buildcraft.silicon.boards; package buildcraft.silicon.boards;
import java.util.ArrayList; import java.util.HashMap;
import java.util.Random; import java.util.Random;
import buildcraft.api.boards.IRedstoneBoard; import net.minecraft.nbt.NBTTagCompound;
import buildcraft.api.boards.IRedstoneBoardNBT;
import buildcraft.api.boards.RedstoneBoardRegistry; import buildcraft.api.boards.RedstoneBoardRegistry;
public class ImplRedstoneBoardRegistry extends RedstoneBoardRegistry { public class ImplRedstoneBoardRegistry extends RedstoneBoardRegistry {
private static class BoardFactory { private static class BoardFactory {
public Class<? extends IRedstoneBoard> clas; public IRedstoneBoardNBT boardNBT;
public float probability; public float probability;
} }
private float totalProbability; private float totalProbability;
private ArrayList<BoardFactory> boards = new ArrayList<BoardFactory>(); private HashMap<String, BoardFactory> boards = new HashMap<String, BoardFactory>();
private Random rand = new Random(); private Random rand = new Random();
@Override @Override
public void registerBoardClass(Class<? extends IRedstoneBoard> boardClass, float probability) { public void registerBoardClass(IRedstoneBoardNBT redstoneBoardNBT, float probability) {
BoardFactory factory = new BoardFactory(); BoardFactory factory = new BoardFactory();
factory.clas = boardClass; factory.boardNBT = redstoneBoardNBT;
factory.probability = probability; factory.probability = probability;
totalProbability += probability; totalProbability += probability;
boards.add(factory); boards.put(redstoneBoardNBT.getID(), factory);
} }
@Override @Override
public IRedstoneBoard createRandomBoard() { public void createRandomBoard(NBTTagCompound nbt) {
float value = rand.nextFloat() * totalProbability; float value = rand.nextFloat() * totalProbability;
float accumulatedSearch = 0; float accumulatedSearch = 0;
for (BoardFactory f : boards) { for (BoardFactory f : boards.values()) {
accumulatedSearch += f.probability; accumulatedSearch += f.probability;
if (accumulatedSearch < value) { if (accumulatedSearch < value) {
try { nbt.setString("id", f.boardNBT.getID());
return f.clas.newInstance(); return;
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
} }
} }
return null; @Override
public IRedstoneBoardNBT getRedstoneBoard(NBTTagCompound nbt) {
return boards.get(nbt.getString("id")).boardNBT;
} }
} }