Reworked Imprinter to have an inventory
This commit is contained in:
parent
f58b88d30e
commit
8a561c5921
9 changed files with 288 additions and 220 deletions
|
@ -5,7 +5,6 @@ import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import net.minecraftforge.client.MinecraftForgeClient;
|
import net.minecraftforge.client.MinecraftForgeClient;
|
||||||
import universalelectricity.core.vector.Vector3;
|
|
||||||
import assemblyline.client.gui.GuiEncoder;
|
import assemblyline.client.gui.GuiEncoder;
|
||||||
import assemblyline.client.gui.GuiImprinter;
|
import assemblyline.client.gui.GuiImprinter;
|
||||||
import assemblyline.client.render.BlockRenderingHandler;
|
import assemblyline.client.render.BlockRenderingHandler;
|
||||||
|
@ -24,6 +23,7 @@ import assemblyline.common.machine.armbot.TileEntityArmbot;
|
||||||
import assemblyline.common.machine.belt.TileEntityConveyorBelt;
|
import assemblyline.common.machine.belt.TileEntityConveyorBelt;
|
||||||
import assemblyline.common.machine.detector.TileEntityDetector;
|
import assemblyline.common.machine.detector.TileEntityDetector;
|
||||||
import assemblyline.common.machine.encoder.TileEntityEncoder;
|
import assemblyline.common.machine.encoder.TileEntityEncoder;
|
||||||
|
import assemblyline.common.machine.imprinter.TileEntityImprinter;
|
||||||
import cpw.mods.fml.client.registry.ClientRegistry;
|
import cpw.mods.fml.client.registry.ClientRegistry;
|
||||||
import cpw.mods.fml.client.registry.RenderingRegistry;
|
import cpw.mods.fml.client.registry.RenderingRegistry;
|
||||||
|
|
||||||
|
@ -57,8 +57,8 @@ public class ClientProxy extends CommonProxy
|
||||||
|
|
||||||
switch (ID)
|
switch (ID)
|
||||||
{
|
{
|
||||||
case GUI_STAMPER:
|
case GUI_IMPRINTER:
|
||||||
return new GuiImprinter(player.inventory, world, new Vector3(x, y, z));
|
return new GuiImprinter(player.inventory, (TileEntityImprinter) tileEntity);
|
||||||
case GUI_ENCODER:
|
case GUI_ENCODER:
|
||||||
if (tileEntity != null && tileEntity instanceof TileEntityEncoder)
|
if (tileEntity != null && tileEntity instanceof TileEntityEncoder)
|
||||||
return new GuiEncoder(player.inventory, (TileEntityEncoder) tileEntity);
|
return new GuiEncoder(player.inventory, (TileEntityEncoder) tileEntity);
|
||||||
|
|
|
@ -2,23 +2,22 @@ package assemblyline.client.gui;
|
||||||
|
|
||||||
import net.minecraft.client.gui.inventory.GuiContainer;
|
import net.minecraft.client.gui.inventory.GuiContainer;
|
||||||
import net.minecraft.entity.player.InventoryPlayer;
|
import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.world.World;
|
|
||||||
|
|
||||||
import org.lwjgl.opengl.GL11;
|
import org.lwjgl.opengl.GL11;
|
||||||
|
|
||||||
import universalelectricity.core.vector.Vector3;
|
|
||||||
import universalelectricity.prefab.TranslationHelper;
|
import universalelectricity.prefab.TranslationHelper;
|
||||||
import assemblyline.common.AssemblyLine;
|
import assemblyline.common.AssemblyLine;
|
||||||
import assemblyline.common.machine.imprinter.ContainerImprinter;
|
import assemblyline.common.machine.imprinter.ContainerImprinter;
|
||||||
|
import assemblyline.common.machine.imprinter.TileEntityImprinter;
|
||||||
|
|
||||||
public class GuiImprinter extends GuiContainer
|
public class GuiImprinter extends GuiContainer
|
||||||
{
|
{
|
||||||
private int containerWidth;
|
private int containerWidth;
|
||||||
private int containerHeight;
|
private int containerHeight;
|
||||||
|
|
||||||
public GuiImprinter(InventoryPlayer par1InventoryPlayer, World worldObj, Vector3 position)
|
public GuiImprinter(InventoryPlayer par1InventoryPlayer, TileEntityImprinter tileEntity)
|
||||||
{
|
{
|
||||||
super(new ContainerImprinter(par1InventoryPlayer, worldObj, position));
|
super(new ContainerImprinter(par1InventoryPlayer, tileEntity));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3,7 +3,6 @@ package assemblyline.common;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
import net.minecraft.tileentity.TileEntity;
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import universalelectricity.core.vector.Vector3;
|
|
||||||
import universalelectricity.prefab.multiblock.TileEntityMulti;
|
import universalelectricity.prefab.multiblock.TileEntityMulti;
|
||||||
import assemblyline.common.block.TileEntityCrate;
|
import assemblyline.common.block.TileEntityCrate;
|
||||||
import assemblyline.common.machine.TileEntityManipulator;
|
import assemblyline.common.machine.TileEntityManipulator;
|
||||||
|
@ -14,14 +13,14 @@ import assemblyline.common.machine.detector.TileEntityDetector;
|
||||||
import assemblyline.common.machine.encoder.ContainerEncoder;
|
import assemblyline.common.machine.encoder.ContainerEncoder;
|
||||||
import assemblyline.common.machine.encoder.TileEntityEncoder;
|
import assemblyline.common.machine.encoder.TileEntityEncoder;
|
||||||
import assemblyline.common.machine.imprinter.ContainerImprinter;
|
import assemblyline.common.machine.imprinter.ContainerImprinter;
|
||||||
|
import assemblyline.common.machine.imprinter.TileEntityImprinter;
|
||||||
import cpw.mods.fml.common.network.IGuiHandler;
|
import cpw.mods.fml.common.network.IGuiHandler;
|
||||||
import cpw.mods.fml.common.registry.GameRegistry;
|
import cpw.mods.fml.common.registry.GameRegistry;
|
||||||
|
|
||||||
public class CommonProxy implements IGuiHandler
|
public class CommonProxy implements IGuiHandler
|
||||||
{
|
{
|
||||||
public static final int GUI_STAMPER = 1;
|
public static final int GUI_IMPRINTER = 1;
|
||||||
public static final int GUI_ARCHITECHT_TABLE = 2;
|
public static final int GUI_ENCODER = 2;
|
||||||
public static final int GUI_ENCODER = 3;
|
|
||||||
|
|
||||||
public void preInit()
|
public void preInit()
|
||||||
{
|
{
|
||||||
|
@ -37,6 +36,7 @@ public class CommonProxy implements IGuiHandler
|
||||||
GameRegistry.registerTileEntity(TileEntityDetector.class, "ALDetector");
|
GameRegistry.registerTileEntity(TileEntityDetector.class, "ALDetector");
|
||||||
GameRegistry.registerTileEntity(TileEntityEncoder.class, "ALEncoder");
|
GameRegistry.registerTileEntity(TileEntityEncoder.class, "ALEncoder");
|
||||||
GameRegistry.registerTileEntity(TileEntityArmbot.class, "ALArmbot");
|
GameRegistry.registerTileEntity(TileEntityArmbot.class, "ALArmbot");
|
||||||
|
GameRegistry.registerTileEntity(TileEntityImprinter.class, "ALImprinter");
|
||||||
GameRegistry.registerTileEntity(TileEntityMulti.class, "ALMulti");
|
GameRegistry.registerTileEntity(TileEntityMulti.class, "ALMulti");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,8 +47,8 @@ public class CommonProxy implements IGuiHandler
|
||||||
|
|
||||||
switch (ID)
|
switch (ID)
|
||||||
{
|
{
|
||||||
case GUI_STAMPER:
|
case GUI_IMPRINTER:
|
||||||
return new ContainerImprinter(player.inventory, world, new Vector3(x, y, z));
|
return new ContainerImprinter(player.inventory, (TileEntityImprinter) tileEntity);
|
||||||
case GUI_ENCODER:
|
case GUI_ENCODER:
|
||||||
{
|
{
|
||||||
if (tileEntity != null && tileEntity instanceof TileEntityEncoder)
|
if (tileEntity != null && tileEntity instanceof TileEntityEncoder)
|
||||||
|
|
|
@ -5,6 +5,8 @@ import net.minecraft.entity.player.InventoryPlayer;
|
||||||
import net.minecraft.inventory.Container;
|
import net.minecraft.inventory.Container;
|
||||||
import net.minecraft.inventory.Slot;
|
import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
|
import assemblyline.common.AssemblyLine;
|
||||||
|
import assemblyline.common.machine.imprinter.SlotCustom;
|
||||||
|
|
||||||
public class ContainerEncoder extends Container
|
public class ContainerEncoder extends Container
|
||||||
{
|
{
|
||||||
|
@ -20,7 +22,7 @@ public class ContainerEncoder extends Container
|
||||||
this.tileEntity = encoder;
|
this.tileEntity = encoder;
|
||||||
|
|
||||||
// Disk
|
// Disk
|
||||||
this.addSlotToContainer(new Slot(encoder, 0, 80, 24 + Y_OFFSET));
|
this.addSlotToContainer(new SlotCustom(encoder, 0, 80, 24 + Y_OFFSET, new ItemStack(AssemblyLine.itemDisk)));
|
||||||
|
|
||||||
int var3;
|
int var3;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@ package assemblyline.common.machine.imprinter;
|
||||||
|
|
||||||
import net.minecraft.block.material.Material;
|
import net.minecraft.block.material.Material;
|
||||||
import net.minecraft.entity.player.EntityPlayer;
|
import net.minecraft.entity.player.EntityPlayer;
|
||||||
|
import net.minecraft.tileentity.TileEntity;
|
||||||
import net.minecraft.world.World;
|
import net.minecraft.world.World;
|
||||||
import universalelectricity.prefab.BlockMachine;
|
import universalelectricity.prefab.BlockMachine;
|
||||||
import assemblyline.common.AssemblyLine;
|
import assemblyline.common.AssemblyLine;
|
||||||
|
@ -44,11 +45,16 @@ public class BlockImprinter extends BlockMachine
|
||||||
{
|
{
|
||||||
if (!world.isRemote)
|
if (!world.isRemote)
|
||||||
{
|
{
|
||||||
entityPlayer.openGui(AssemblyLine.instance, CommonProxy.GUI_STAMPER, world, x, y, z);
|
entityPlayer.openGui(AssemblyLine.instance, CommonProxy.GUI_IMPRINTER, world, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TileEntity createNewTileEntity(World var1)
|
||||||
|
{
|
||||||
|
return new TileEntityImprinter();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,13 +14,14 @@ import net.minecraft.item.crafting.ShapedRecipes;
|
||||||
import net.minecraft.item.crafting.ShapelessRecipes;
|
import net.minecraft.item.crafting.ShapelessRecipes;
|
||||||
import net.minecraftforge.oredict.ShapedOreRecipe;
|
import net.minecraftforge.oredict.ShapedOreRecipe;
|
||||||
import net.minecraftforge.oredict.ShapelessOreRecipe;
|
import net.minecraftforge.oredict.ShapelessOreRecipe;
|
||||||
|
import assemblyline.common.AssemblyLine;
|
||||||
import assemblyline.common.Pair;
|
import assemblyline.common.Pair;
|
||||||
import cpw.mods.fml.relauncher.ReflectionHelper;
|
import cpw.mods.fml.relauncher.ReflectionHelper;
|
||||||
|
|
||||||
public class ContainerImprinter extends Container implements ISlotWatcher
|
public class ContainerImprinter extends Container implements ISlotWatcher
|
||||||
{
|
{
|
||||||
private InventoryPlayer inventoryPlayer;
|
private InventoryPlayer inventoryPlayer;
|
||||||
private TileEntityImprinter tileEntity;
|
public TileEntityImprinter tileEntity;
|
||||||
|
|
||||||
public ContainerImprinter(InventoryPlayer inventoryPlayer, TileEntityImprinter tileEntity)
|
public ContainerImprinter(InventoryPlayer inventoryPlayer, TileEntityImprinter tileEntity)
|
||||||
{
|
{
|
||||||
|
@ -28,13 +29,13 @@ public class ContainerImprinter extends Container implements ISlotWatcher
|
||||||
this.inventoryPlayer = inventoryPlayer;
|
this.inventoryPlayer = inventoryPlayer;
|
||||||
|
|
||||||
// Paper Input
|
// Paper Input
|
||||||
this.addSlotToContainer(new SlotImprint(this.tileEntity, 0, 42, 24));
|
this.addSlotToContainer(new SlotCustom(this.tileEntity, 0, 42, 24, new ItemStack(AssemblyLine.itemImprint)));
|
||||||
// Item Stamp
|
// Item Stamp
|
||||||
this.addSlotToContainer(new Slot(this.tileEntity, 1, 78, 24));
|
this.addSlotToContainer(new Slot(this.tileEntity, 1, 78, 24));
|
||||||
// Output Filter
|
// Output Filter
|
||||||
this.addSlotToContainer(new SlotImprintResult(this.tileEntity, 2, 136, 24));
|
this.addSlotToContainer(new SlotImprintResult(this.tileEntity, 2, 136, 24));
|
||||||
// Crafting Slot
|
// Crafting Slot
|
||||||
this.addSlotToContainer(new SlotImprint(this.tileEntity, 3, 78, 53));
|
this.addSlotToContainer(new SlotCustom(this.tileEntity, 3, 78, 53, new ItemStack(AssemblyLine.itemImprint)));
|
||||||
// Crafting Output
|
// Crafting Output
|
||||||
this.addSlotToContainer(new SlotCraftingResult(this, this.tileEntity, 4, 136, 53));
|
this.addSlotToContainer(new SlotCraftingResult(this, this.tileEntity, 4, 136, 53));
|
||||||
|
|
||||||
|
@ -109,204 +110,9 @@ public class ContainerImprinter extends Container implements ISlotWatcher
|
||||||
return copyStack;
|
return copyStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Does this player's inventory contain the required resources to craft this item?
|
|
||||||
*
|
|
||||||
* @return Required Items
|
|
||||||
*/
|
|
||||||
public Pair<ItemStack, ItemStack[]> getIdealRecipe(ItemStack outputItem)
|
|
||||||
{
|
|
||||||
for (Object object : CraftingManager.getInstance().getRecipeList())
|
|
||||||
{
|
|
||||||
if (object instanceof IRecipe)
|
|
||||||
{
|
|
||||||
if (((IRecipe) object).getRecipeOutput() != null)
|
|
||||||
{
|
|
||||||
if (outputItem.isItemEqual(((IRecipe) object).getRecipeOutput()))
|
|
||||||
{
|
|
||||||
if (object instanceof ShapedRecipes)
|
|
||||||
{
|
|
||||||
if (this.hasResource(((ShapedRecipes) object).recipeItems) != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), ((ShapedRecipes) object).recipeItems); }
|
|
||||||
}
|
|
||||||
else if (object instanceof ShapelessRecipes)
|
|
||||||
{
|
|
||||||
if (this.hasResource(((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])) != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), (ItemStack[]) ((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])); }
|
|
||||||
}
|
|
||||||
else if (object instanceof ShapedOreRecipe)
|
|
||||||
{
|
|
||||||
ShapedOreRecipe oreRecipe = (ShapedOreRecipe) object;
|
|
||||||
Object[] oreRecipeInput = (Object[]) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, oreRecipe, "input");
|
|
||||||
|
|
||||||
ArrayList<ItemStack> hasResources = this.hasResource(oreRecipeInput);
|
|
||||||
|
|
||||||
if (hasResources != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); }
|
|
||||||
}
|
|
||||||
else if (object instanceof ShapelessOreRecipe)
|
|
||||||
{
|
|
||||||
ShapelessOreRecipe oreRecipe = (ShapelessOreRecipe) object;
|
|
||||||
ArrayList oreRecipeInput = (ArrayList) ReflectionHelper.getPrivateValue(ShapelessOreRecipe.class, oreRecipe, "input");
|
|
||||||
|
|
||||||
List<ItemStack> hasResources = this.hasResource(oreRecipeInput.toArray());
|
|
||||||
|
|
||||||
if (hasResources != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns if players has the following resource required.
|
|
||||||
*
|
|
||||||
* @param recipeItems - The items to be checked for the recipes.
|
|
||||||
*/
|
|
||||||
private ArrayList<ItemStack> hasResource(Object[] recipeItems)
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* The actual amount of resource required. Each ItemStack will only have stacksize of 1.
|
|
||||||
*/
|
|
||||||
ArrayList<ItemStack> actualResources = new ArrayList<ItemStack>();
|
|
||||||
int itemMatch = 0;
|
|
||||||
|
|
||||||
for (Object obj : recipeItems)
|
|
||||||
{
|
|
||||||
if (obj instanceof ItemStack)
|
|
||||||
{
|
|
||||||
ItemStack recipeItem = (ItemStack) obj;
|
|
||||||
actualResources.add(recipeItem.copy());
|
|
||||||
|
|
||||||
if (recipeItem != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < this.inventoryPlayer.getSizeInventory(); i++)
|
|
||||||
{
|
|
||||||
ItemStack checkStack = this.inventoryPlayer.getStackInSlot(i);
|
|
||||||
|
|
||||||
if (checkStack != null)
|
|
||||||
{
|
|
||||||
if (SlotCraftingResult.isItemEqual(recipeItem, checkStack))
|
|
||||||
{
|
|
||||||
// TODO Do NBT CHecking
|
|
||||||
itemMatch++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (obj instanceof ArrayList)
|
|
||||||
{
|
|
||||||
ArrayList ingredientsList = (ArrayList) obj;
|
|
||||||
Object[] ingredientsArray = ingredientsList.toArray();
|
|
||||||
|
|
||||||
optionsLoop:
|
|
||||||
for (int x = 0; x < ingredientsArray.length; x++)
|
|
||||||
{
|
|
||||||
if (ingredientsArray[x] != null && ingredientsArray[x] instanceof ItemStack)
|
|
||||||
{
|
|
||||||
ItemStack recipeItem = (ItemStack) ingredientsArray[x];
|
|
||||||
actualResources.add(recipeItem.copy());
|
|
||||||
|
|
||||||
if (recipeItem != null)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < this.inventoryPlayer.getSizeInventory(); i++)
|
|
||||||
{
|
|
||||||
ItemStack checkStack = this.inventoryPlayer.getStackInSlot(i);
|
|
||||||
|
|
||||||
if (checkStack != null)
|
|
||||||
{
|
|
||||||
if (SlotCraftingResult.isItemEqual(recipeItem, checkStack))
|
|
||||||
{
|
|
||||||
// TODO Do NBT CHecking
|
|
||||||
itemMatch++;
|
|
||||||
break optionsLoop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return itemMatch >= actualResources.size() ? actualResources : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void slotContentsChanged()
|
public void slotContentsChanged()
|
||||||
{
|
{
|
||||||
/**
|
this.tileEntity.onInventoryChanged();
|
||||||
* Makes the stamping recipe for filters
|
|
||||||
*/
|
|
||||||
boolean didStamp = false;
|
|
||||||
|
|
||||||
if (this.tileEntity.getStackInSlot(0) != null && this.tileEntity.getStackInSlot(1) != null)
|
|
||||||
{
|
|
||||||
if (this.tileEntity.getStackInSlot(0).getItem() instanceof ItemImprinter)
|
|
||||||
{
|
|
||||||
ItemStack outputStack = this.tileEntity.getStackInSlot(0).copy();
|
|
||||||
outputStack.stackSize = 1;
|
|
||||||
ArrayList<ItemStack> filters = ItemImprinter.getFilters(outputStack);
|
|
||||||
boolean filteringItemExists = false;
|
|
||||||
|
|
||||||
for (ItemStack filteredStack : filters)
|
|
||||||
{
|
|
||||||
if (filteredStack.isItemEqual(this.tileEntity.getStackInSlot(1)))
|
|
||||||
{
|
|
||||||
filters.remove(filteredStack);
|
|
||||||
filteringItemExists = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!filteringItemExists)
|
|
||||||
{
|
|
||||||
filters.add(this.tileEntity.getStackInSlot(1));
|
|
||||||
}
|
|
||||||
|
|
||||||
ItemImprinter.setFilters(outputStack, filters);
|
|
||||||
this.tileEntity.setInventorySlotContents(2, outputStack);
|
|
||||||
didStamp = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!didStamp)
|
|
||||||
{
|
|
||||||
this.tileEntity.setInventorySlotContents(2, null);
|
|
||||||
}
|
|
||||||
|
|
||||||
// CRAFTING
|
|
||||||
boolean didCraft = false;
|
|
||||||
|
|
||||||
if (this.tileEntity.getStackInSlot(3) != null)
|
|
||||||
{
|
|
||||||
if (this.tileEntity.getStackInSlot(3).getItem() instanceof ItemImprinter)
|
|
||||||
{
|
|
||||||
ArrayList<ItemStack> filters = ItemImprinter.getFilters(this.tileEntity.getStackInSlot(3));
|
|
||||||
|
|
||||||
if (filters.size() > 0)
|
|
||||||
{
|
|
||||||
ItemStack outputStack = filters.get(0);
|
|
||||||
|
|
||||||
if (outputStack != null)
|
|
||||||
{
|
|
||||||
Pair<ItemStack, ItemStack[]> idealRecipe = this.getIdealRecipe(outputStack);
|
|
||||||
|
|
||||||
if (idealRecipe != null)
|
|
||||||
{
|
|
||||||
this.tileEntity.setInventorySlotContents(4, idealRecipe.getKey());
|
|
||||||
didCraft = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!didCraft)
|
|
||||||
{
|
|
||||||
this.tileEntity.setInventorySlotContents(4, null);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ public class SlotCraftingResult extends Slot
|
||||||
|
|
||||||
if (this.getStack() != null)
|
if (this.getStack() != null)
|
||||||
{
|
{
|
||||||
ItemStack[] requiredItems = this.container.getIdealRecipe(this.getStack()).getValue().clone();
|
ItemStack[] requiredItems = this.container.tileEntity.getIdealRecipe(this.getStack()).getValue().clone();
|
||||||
|
|
||||||
if (requiredItems != null)
|
if (requiredItems != null)
|
||||||
{
|
{
|
||||||
|
@ -63,7 +63,7 @@ public class SlotCraftingResult extends Slot
|
||||||
{
|
{
|
||||||
if (this.getStack() != null)
|
if (this.getStack() != null)
|
||||||
{
|
{
|
||||||
ItemStack[] idealRecipe = this.container.getIdealRecipe(this.getStack()).getValue();
|
ItemStack[] idealRecipe = this.container.tileEntity.getIdealRecipe(this.getStack()).getValue();
|
||||||
if (idealRecipe != null)
|
if (idealRecipe != null)
|
||||||
{
|
{
|
||||||
ItemStack[] requiredItems = idealRecipe.clone();
|
ItemStack[] requiredItems = idealRecipe.clone();
|
||||||
|
|
|
@ -5,17 +5,18 @@ import net.minecraft.inventory.Slot;
|
||||||
import net.minecraft.item.ItemStack;
|
import net.minecraft.item.ItemStack;
|
||||||
import assemblyline.common.AssemblyLine;
|
import assemblyline.common.AssemblyLine;
|
||||||
|
|
||||||
public class SlotImprint extends Slot
|
public class SlotCustom extends Slot
|
||||||
{
|
{
|
||||||
|
private ItemStack itemStack;
|
||||||
|
|
||||||
public SlotImprint(IInventory par1iInventory, int par2, int par3, int par4)
|
public SlotCustom(IInventory par1iInventory, int par2, int par3, int par4, ItemStack itemStack)
|
||||||
{
|
{
|
||||||
super(par1iInventory, par2, par3, par4);
|
super(par1iInventory, par2, par3, par4);
|
||||||
|
this.itemStack = itemStack;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isItemValid(ItemStack itemStack)
|
public boolean isItemValid(ItemStack itemStack)
|
||||||
{
|
{
|
||||||
return itemStack.itemID == AssemblyLine.itemImprint.itemID;
|
return itemStack.isItemEqual(this.itemStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -9,6 +9,8 @@ import net.minecraft.item.crafting.CraftingManager;
|
||||||
import net.minecraft.item.crafting.IRecipe;
|
import net.minecraft.item.crafting.IRecipe;
|
||||||
import net.minecraft.item.crafting.ShapedRecipes;
|
import net.minecraft.item.crafting.ShapedRecipes;
|
||||||
import net.minecraft.item.crafting.ShapelessRecipes;
|
import net.minecraft.item.crafting.ShapelessRecipes;
|
||||||
|
import net.minecraft.nbt.NBTTagCompound;
|
||||||
|
import net.minecraft.nbt.NBTTagList;
|
||||||
import net.minecraftforge.common.ForgeDirection;
|
import net.minecraftforge.common.ForgeDirection;
|
||||||
import net.minecraftforge.common.ISidedInventory;
|
import net.minecraftforge.common.ISidedInventory;
|
||||||
import net.minecraftforge.oredict.ShapedOreRecipe;
|
import net.minecraftforge.oredict.ShapedOreRecipe;
|
||||||
|
@ -25,6 +27,8 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv
|
||||||
*/
|
*/
|
||||||
private ItemStack[] containingItems = new ItemStack[5 + 10];
|
private ItemStack[] containingItems = new ItemStack[5 + 10];
|
||||||
|
|
||||||
|
public static final int START_INVENTORY = 5;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean canUpdate()
|
public boolean canUpdate()
|
||||||
{
|
{
|
||||||
|
@ -134,4 +138,254 @@ public class TileEntityImprinter extends TileEntityAdvanced implements ISidedInv
|
||||||
public void closeChest()
|
public void closeChest()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onInventoryChanged()
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Makes the stamping recipe for filters
|
||||||
|
*/
|
||||||
|
boolean didStamp = false;
|
||||||
|
|
||||||
|
if (this.getStackInSlot(0) != null && this.getStackInSlot(1) != null)
|
||||||
|
{
|
||||||
|
if (this.getStackInSlot(0).getItem() instanceof ItemImprinter)
|
||||||
|
{
|
||||||
|
ItemStack outputStack = this.getStackInSlot(0).copy();
|
||||||
|
outputStack.stackSize = 1;
|
||||||
|
ArrayList<ItemStack> filters = ItemImprinter.getFilters(outputStack);
|
||||||
|
boolean filteringItemExists = false;
|
||||||
|
|
||||||
|
for (ItemStack filteredStack : filters)
|
||||||
|
{
|
||||||
|
if (filteredStack.isItemEqual(this.getStackInSlot(1)))
|
||||||
|
{
|
||||||
|
filters.remove(filteredStack);
|
||||||
|
filteringItemExists = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!filteringItemExists)
|
||||||
|
{
|
||||||
|
filters.add(this.getStackInSlot(1));
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemImprinter.setFilters(outputStack, filters);
|
||||||
|
this.setInventorySlotContents(2, outputStack);
|
||||||
|
didStamp = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!didStamp)
|
||||||
|
{
|
||||||
|
this.setInventorySlotContents(2, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// CRAFTING
|
||||||
|
boolean didCraft = false;
|
||||||
|
|
||||||
|
if (this.getStackInSlot(3) != null)
|
||||||
|
{
|
||||||
|
if (this.getStackInSlot(3).getItem() instanceof ItemImprinter)
|
||||||
|
{
|
||||||
|
ArrayList<ItemStack> filters = ItemImprinter.getFilters(this.getStackInSlot(3));
|
||||||
|
|
||||||
|
if (filters.size() > 0)
|
||||||
|
{
|
||||||
|
ItemStack outputStack = filters.get(0);
|
||||||
|
|
||||||
|
if (outputStack != null)
|
||||||
|
{
|
||||||
|
Pair<ItemStack, ItemStack[]> idealRecipe = this.getIdealRecipe(outputStack);
|
||||||
|
|
||||||
|
if (idealRecipe != null)
|
||||||
|
{
|
||||||
|
this.setInventorySlotContents(4, idealRecipe.getKey());
|
||||||
|
didCraft = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!didCraft)
|
||||||
|
{
|
||||||
|
this.setInventorySlotContents(4, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does this player's inventory contain the required resources to craft this item?
|
||||||
|
*
|
||||||
|
* @return Required Items
|
||||||
|
*/
|
||||||
|
public Pair<ItemStack, ItemStack[]> getIdealRecipe(ItemStack outputItem)
|
||||||
|
{
|
||||||
|
for (Object object : CraftingManager.getInstance().getRecipeList())
|
||||||
|
{
|
||||||
|
if (object instanceof IRecipe)
|
||||||
|
{
|
||||||
|
if (((IRecipe) object).getRecipeOutput() != null)
|
||||||
|
{
|
||||||
|
if (outputItem.isItemEqual(((IRecipe) object).getRecipeOutput()))
|
||||||
|
{
|
||||||
|
if (object instanceof ShapedRecipes)
|
||||||
|
{
|
||||||
|
if (this.hasResource(((ShapedRecipes) object).recipeItems) != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), ((ShapedRecipes) object).recipeItems); }
|
||||||
|
}
|
||||||
|
else if (object instanceof ShapelessRecipes)
|
||||||
|
{
|
||||||
|
if (this.hasResource(((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])) != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), (ItemStack[]) ((ShapelessRecipes) object).recipeItems.toArray(new ItemStack[1])); }
|
||||||
|
}
|
||||||
|
else if (object instanceof ShapedOreRecipe)
|
||||||
|
{
|
||||||
|
ShapedOreRecipe oreRecipe = (ShapedOreRecipe) object;
|
||||||
|
Object[] oreRecipeInput = (Object[]) ReflectionHelper.getPrivateValue(ShapedOreRecipe.class, oreRecipe, "input");
|
||||||
|
|
||||||
|
ArrayList<ItemStack> hasResources = this.hasResource(oreRecipeInput);
|
||||||
|
|
||||||
|
if (hasResources != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); }
|
||||||
|
}
|
||||||
|
else if (object instanceof ShapelessOreRecipe)
|
||||||
|
{
|
||||||
|
ShapelessOreRecipe oreRecipe = (ShapelessOreRecipe) object;
|
||||||
|
ArrayList oreRecipeInput = (ArrayList) ReflectionHelper.getPrivateValue(ShapelessOreRecipe.class, oreRecipe, "input");
|
||||||
|
|
||||||
|
List<ItemStack> hasResources = this.hasResource(oreRecipeInput.toArray());
|
||||||
|
|
||||||
|
if (hasResources != null) { return new Pair<ItemStack, ItemStack[]>(((IRecipe) object).getRecipeOutput().copy(), hasResources.toArray(new ItemStack[1])); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if players has the following resource required.
|
||||||
|
*
|
||||||
|
* @param recipeItems - The items to be checked for the recipes.
|
||||||
|
*/
|
||||||
|
private ArrayList<ItemStack> hasResource(Object[] recipeItems)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The actual amount of resource required. Each ItemStack will only have stacksize of 1.
|
||||||
|
*/
|
||||||
|
ArrayList<ItemStack> actualResources = new ArrayList<ItemStack>();
|
||||||
|
int itemMatch = 0;
|
||||||
|
|
||||||
|
for (Object obj : recipeItems)
|
||||||
|
{
|
||||||
|
if (obj instanceof ItemStack)
|
||||||
|
{
|
||||||
|
ItemStack recipeItem = (ItemStack) obj;
|
||||||
|
actualResources.add(recipeItem.copy());
|
||||||
|
|
||||||
|
if (recipeItem != null)
|
||||||
|
{
|
||||||
|
for (int i = START_INVENTORY; i < this.getSizeInventory(); i++)
|
||||||
|
{
|
||||||
|
ItemStack checkStack = this.getStackInSlot(i);
|
||||||
|
|
||||||
|
if (checkStack != null)
|
||||||
|
{
|
||||||
|
if (SlotCraftingResult.isItemEqual(recipeItem, checkStack))
|
||||||
|
{
|
||||||
|
// TODO Do NBT CHecking
|
||||||
|
itemMatch++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (obj instanceof ArrayList)
|
||||||
|
{
|
||||||
|
ArrayList ingredientsList = (ArrayList) obj;
|
||||||
|
Object[] ingredientsArray = ingredientsList.toArray();
|
||||||
|
|
||||||
|
optionsLoop:
|
||||||
|
for (int x = 0; x < ingredientsArray.length; x++)
|
||||||
|
{
|
||||||
|
if (ingredientsArray[x] != null && ingredientsArray[x] instanceof ItemStack)
|
||||||
|
{
|
||||||
|
ItemStack recipeItem = (ItemStack) ingredientsArray[x];
|
||||||
|
actualResources.add(recipeItem.copy());
|
||||||
|
|
||||||
|
if (recipeItem != null)
|
||||||
|
{
|
||||||
|
for (int i = START_INVENTORY; i < this.getSizeInventory(); i++)
|
||||||
|
{
|
||||||
|
ItemStack checkStack = this.getStackInSlot(i);
|
||||||
|
|
||||||
|
if (checkStack != null)
|
||||||
|
{
|
||||||
|
if (SlotCraftingResult.isItemEqual(recipeItem, checkStack))
|
||||||
|
{
|
||||||
|
// TODO Do NBT CHecking
|
||||||
|
itemMatch++;
|
||||||
|
break optionsLoop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return itemMatch >= actualResources.size() ? actualResources : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* NBT Data
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void readFromNBT(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
super.readFromNBT(nbt);
|
||||||
|
|
||||||
|
NBTTagList var2 = nbt.getTagList("Items");
|
||||||
|
|
||||||
|
this.containingItems = new ItemStack[this.getSizeInventory()];
|
||||||
|
|
||||||
|
for (int var3 = 0; var3 < var2.tagCount(); ++var3)
|
||||||
|
{
|
||||||
|
NBTTagCompound var4 = (NBTTagCompound) var2.tagAt(var3);
|
||||||
|
byte var5 = var4.getByte("Slot");
|
||||||
|
|
||||||
|
if (var5 >= 0 && var5 < this.containingItems.length)
|
||||||
|
{
|
||||||
|
this.containingItems[var5] = ItemStack.loadItemStackFromNBT(var4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Writes a tile entity to NBT.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void writeToNBT(NBTTagCompound nbt)
|
||||||
|
{
|
||||||
|
super.writeToNBT(nbt);
|
||||||
|
|
||||||
|
NBTTagList var2 = new NBTTagList();
|
||||||
|
|
||||||
|
for (int var3 = 0; var3 < this.containingItems.length; ++var3)
|
||||||
|
{
|
||||||
|
if (this.containingItems[var3] != null)
|
||||||
|
{
|
||||||
|
NBTTagCompound var4 = new NBTTagCompound();
|
||||||
|
var4.setByte("Slot", (byte) var3);
|
||||||
|
this.containingItems[var3].writeToNBT(var4);
|
||||||
|
var2.appendTag(var4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
nbt.setTag("Items", var2);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue