From 943e24357346d563fe72354ecc2859572f0d789a Mon Sep 17 00:00:00 2001 From: Bob Date: Sun, 29 May 2022 15:49:14 +0200 Subject: [PATCH] the ferocious crafter --- src/main/java/com/hbm/handler/GUIHandler.java | 1 + .../container/ContainerAutocrafter.java | 11 +- .../container/ContainerCrateBase.java | 57 ++++ .../container/ContainerCrateDesh.java | 43 +-- .../container/ContainerCrateIron.java | 49 +-- .../container/ContainerCrateSteel.java | 43 +-- .../container/ContainerCrateTungsten.java | 43 +-- .../com/hbm/inventory/gui/GUIAutocrafter.java | 12 + .../items/tool/ItemCraftingDegradation.java | 2 + .../machine/TileEntityMachineAutocrafter.java | 295 +++++++++++++++++- .../machine/storage/TileEntityCrateBase.java | 3 +- src/main/resources/assets/hbm/lang/de_DE.lang | 4 + src/main/resources/assets/hbm/lang/en_US.lang | 4 + src/main/resources/assets/hbm/sounds.json | 2 + .../assets/hbm/sounds/block/crateClose.ogg | Bin 0 -> 13373 bytes .../assets/hbm/sounds/block/crateOpen.ogg | Bin 0 -> 12121 bytes .../gui/processing/gui_autocrafter.png | Bin 2444 -> 2376 bytes 17 files changed, 381 insertions(+), 188 deletions(-) create mode 100644 src/main/java/com/hbm/inventory/container/ContainerCrateBase.java create mode 100644 src/main/resources/assets/hbm/sounds/block/crateClose.ogg create mode 100644 src/main/resources/assets/hbm/sounds/block/crateOpen.ogg diff --git a/src/main/java/com/hbm/handler/GUIHandler.java b/src/main/java/com/hbm/handler/GUIHandler.java index f021a75ff..ac2bb4927 100644 --- a/src/main/java/com/hbm/handler/GUIHandler.java +++ b/src/main/java/com/hbm/handler/GUIHandler.java @@ -33,6 +33,7 @@ public class GUIHandler implements IGuiHandler { if(entity instanceof TileEntityCrateSteel) { return new ContainerCrateSteel(player.inventory, (TileEntityCrateSteel) entity); } if(entity instanceof TileEntityCrateDesh) { return new ContainerCrateDesh(player.inventory, (TileEntityCrateDesh) entity); } if(entity instanceof TileEntityCrateTungsten) { return new ContainerCrateTungsten(player.inventory, (TileEntityCrateTungsten) entity); } + if(entity instanceof TileEntitySafe) { return new ContainerSafe(player.inventory, (TileEntitySafe) entity); } if(entity instanceof TileEntityMassStorage) { return new ContainerMassStorage(player.inventory, (TileEntityMassStorage) entity); } if(entity instanceof TileEntityMachineAutocrafter) { return new ContainerAutocrafter(player.inventory, (TileEntityMachineAutocrafter) entity); } diff --git a/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java b/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java index a0a470839..fe0974730 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java +++ b/src/main/java/com/hbm/inventory/container/ContainerAutocrafter.java @@ -19,7 +19,7 @@ public class ContainerAutocrafter extends Container { /* TEMPLATE */ for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) { - this.addSlotToContainer(new SlotPattern(tedf, j + i * 3, 44 + j * 18, 22 + i * 18).disableHover()); + this.addSlotToContainer(new SlotPattern(tedf, j + i * 3, 44 + j * 18, 22 + i * 18)); } } this.addSlotToContainer(new SlotPattern(tedf, 9, 116, 40)); @@ -67,8 +67,15 @@ public class ContainerAutocrafter extends Container { ret = slot.getStack().copy(); //Don't allow any interaction for the template's output - if(index == 9) + if(index == 9) { + + if(button == 1 && mode == 0 && slot.getHasStack()) { + autocrafter.nextTemplate(); + this.detectAndSendChanges(); + } + return ret; + } if(button == 1 && mode == 0 && slot.getHasStack()) { autocrafter.nextMode(index); diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java new file mode 100644 index 000000000..407e44483 --- /dev/null +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateBase.java @@ -0,0 +1,57 @@ +package com.hbm.inventory.container; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +public class ContainerCrateBase extends Container { + + protected IInventory crate; + + public ContainerCrateBase(IInventory tedf) { + crate = tedf; + crate.openInventory(); + } + + @Override + public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { + ItemStack var3 = null; + Slot var4 = (Slot) this.inventorySlots.get(par2); + + if(var4 != null && var4.getHasStack()) { + ItemStack var5 = var4.getStack(); + var3 = var5.copy(); + + if(par2 <= crate.getSizeInventory() - 1) { + if(!this.mergeItemStack(var5, crate.getSizeInventory(), this.inventorySlots.size(), true)) { + return null; + } + } else if(!this.mergeItemStack(var5, 0, crate.getSizeInventory(), false)) { + return null; + } + + if(var5.stackSize == 0) { + var4.putStack((ItemStack) null); + } else { + var4.onSlotChanged(); + } + + var4.onPickupFromSlot(p_82846_1_, var5); + } + + return var3; + } + + @Override + public boolean canInteractWith(EntityPlayer player) { + return crate.isUseableByPlayer(player); + } + + @Override + public void onContainerClosed(EntityPlayer p_75134_1_) { + super.onContainerClosed(p_75134_1_); + this.crate.closeInventory(); + } +} diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateDesh.java b/src/main/java/com/hbm/inventory/container/ContainerCrateDesh.java index bb1c7224e..4a7aec618 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateDesh.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateDesh.java @@ -1,18 +1,13 @@ package com.hbm.inventory.container; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; -public class ContainerCrateDesh extends Container { - - private IInventory diFurnace; +public class ContainerCrateDesh extends ContainerCrateBase { public ContainerCrateDesh(InventoryPlayer invPlayer, IInventory tedf) { - diFurnace = tedf; + super(tedf); for(int i = 0; i < 8; i++) { for(int j = 0; j < 13; j++) { @@ -30,38 +25,4 @@ public class ContainerCrateDesh extends Container { this.addSlotToContainer(new Slot(invPlayer, i, 44 + i * 18, 232)); } } - - @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { - ItemStack var3 = null; - Slot var4 = (Slot) this.inventorySlots.get(par2); - - if(var4 != null && var4.getHasStack()) { - ItemStack var5 = var4.getStack(); - var3 = var5.copy(); - - if(par2 <= diFurnace.getSizeInventory() - 1) { - if(!this.mergeItemStack(var5, diFurnace.getSizeInventory(), this.inventorySlots.size(), true)) { - return null; - } - } else if(!this.mergeItemStack(var5, 0, diFurnace.getSizeInventory(), false)) { - return null; - } - - if(var5.stackSize == 0) { - var4.putStack((ItemStack) null); - } else { - var4.onSlotChanged(); - } - - var4.onPickupFromSlot(p_82846_1_, var5); - } - - return var3; - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return diFurnace.isUseableByPlayer(player); - } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java b/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java index 7f6a92d8a..d91eb1be0 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateIron.java @@ -2,19 +2,14 @@ package com.hbm.inventory.container; import com.hbm.tileentity.machine.storage.TileEntityCrateIron; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; //@invtweaks.api.container.ChestContainer -public class ContainerCrateIron extends Container { - - private TileEntityCrateIron diFurnace; +public class ContainerCrateIron extends ContainerCrateBase { public ContainerCrateIron(InventoryPlayer invPlayer, TileEntityCrateIron tedf) { - diFurnace = tedf; + super(tedf); for(int i = 0; i < 4; i++) { @@ -37,44 +32,4 @@ public class ContainerCrateIron extends Container { this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142 + 20)); } } - - @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) - { - ItemStack var3 = null; - Slot var4 = (Slot) this.inventorySlots.get(par2); - - if (var4 != null && var4.getHasStack()) - { - ItemStack var5 = var4.getStack(); - var3 = var5.copy(); - - if (par2 <= diFurnace.getSizeInventory() - 1) { - if (!this.mergeItemStack(var5, diFurnace.getSizeInventory(), this.inventorySlots.size(), true)) - { - return null; - } - } - else if (!this.mergeItemStack(var5, 0, diFurnace.getSizeInventory(), false)) - { - return null; - } - - if (var5.stackSize == 0) - { - var4.putStack((ItemStack) null); - } - else - { - var4.onSlotChanged(); - } - } - - return var3; - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return diFurnace.isUseableByPlayer(player); - } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateSteel.java b/src/main/java/com/hbm/inventory/container/ContainerCrateSteel.java index c4795966e..3623790f4 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateSteel.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateSteel.java @@ -1,19 +1,14 @@ package com.hbm.inventory.container; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; //@invtweaks.api.container.ChestContainer -public class ContainerCrateSteel extends Container { - - private IInventory diFurnace; +public class ContainerCrateSteel extends ContainerCrateBase { public ContainerCrateSteel(InventoryPlayer invPlayer, IInventory tedf) { - diFurnace = tedf; + super(tedf); for(int i = 0; i < 6; i++) { for(int j = 0; j < 9; j++) { @@ -31,38 +26,4 @@ public class ContainerCrateSteel extends Container { this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 142 + (18 * 3) + 2)); } } - - @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { - ItemStack var3 = null; - Slot var4 = (Slot) this.inventorySlots.get(par2); - - if(var4 != null && var4.getHasStack()) { - ItemStack var5 = var4.getStack(); - var3 = var5.copy(); - - if(par2 <= diFurnace.getSizeInventory() - 1) { - if(!this.mergeItemStack(var5, diFurnace.getSizeInventory(), this.inventorySlots.size(), true)) { - return null; - } - } else if(!this.mergeItemStack(var5, 0, diFurnace.getSizeInventory(), false)) { - return null; - } - - if(var5.stackSize == 0) { - var4.putStack((ItemStack) null); - } else { - var4.onSlotChanged(); - } - - var4.onPickupFromSlot(p_82846_1_, var5); - } - - return var3; - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return diFurnace.isUseableByPlayer(player); - } } diff --git a/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java b/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java index 7103e95e7..8d5843275 100644 --- a/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java +++ b/src/main/java/com/hbm/inventory/container/ContainerCrateTungsten.java @@ -2,19 +2,14 @@ package com.hbm.inventory.container; import com.hbm.tileentity.machine.storage.TileEntityCrateTungsten; -import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; //@invtweaks.api.container.ChestContainer -public class ContainerCrateTungsten extends Container { - - private TileEntityCrateTungsten crate; +public class ContainerCrateTungsten extends ContainerCrateBase { public ContainerCrateTungsten(InventoryPlayer invPlayer, TileEntityCrateTungsten te) { - crate = te; + super(te); for(int i = 0; i < 3; i++) { for(int j = 0; j < 9; j++) { @@ -32,38 +27,4 @@ public class ContainerCrateTungsten extends Container { this.addSlotToContainer(new Slot(invPlayer, i, 8 + i * 18, 90 + (18 * 3))); } } - - @Override - public ItemStack transferStackInSlot(EntityPlayer p_82846_1_, int par2) { - ItemStack var3 = null; - Slot var4 = (Slot) this.inventorySlots.get(par2); - - if(var4 != null && var4.getHasStack()) { - ItemStack var5 = var4.getStack(); - var3 = var5.copy(); - - if(par2 <= crate.getSizeInventory() - 1) { - if(!this.mergeItemStack(var5, crate.getSizeInventory(), this.inventorySlots.size(), true)) { - return null; - } - } else if(!this.mergeItemStack(var5, 0, crate.getSizeInventory(), false)) { - return null; - } - - if(var5.stackSize == 0) { - var4.putStack((ItemStack) null); - } else { - var4.onSlotChanged(); - } - - var4.onPickupFromSlot(p_82846_1_, var5); - } - - return var3; - } - - @Override - public boolean canInteractWith(EntityPlayer player) { - return crate.isUseableByPlayer(player); - } } diff --git a/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java b/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java index 02ae7a1cd..abacfe9d6 100644 --- a/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java +++ b/src/main/java/com/hbm/inventory/gui/GUIAutocrafter.java @@ -31,6 +31,8 @@ public class GUIAutocrafter extends GuiInfoContainer { @Override public void drawScreen(int x, int y, float interp) { super.drawScreen(x, y, interp); + + this.drawElectricityInfo(this, x, y, guiLeft + 17, guiTop + 45, 16, 52, diFurnace.getPower(), diFurnace.getMaxPower()); if(this.mc.thePlayer.inventory.getItemStack() == null) { for(int i = 0; i < 9; ++i) { @@ -49,6 +51,12 @@ public class GUIAutocrafter extends GuiInfoContainer { this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", label }), x, y - 30); } } + + Slot slot = (Slot) this.inventorySlots.inventorySlots.get(9); + + if(this.isMouseOverSlot(slot, x, y) && diFurnace.slots[9] != null) { + this.func_146283_a(Arrays.asList(new String[] { EnumChatFormatting.RED + "Right click to change", EnumChatFormatting.YELLOW + "" + (diFurnace.recipeIndex + 1) + " / " + diFurnace.recipeCount }), x, y - 30); + } } } @@ -65,6 +73,10 @@ public class GUIAutocrafter extends GuiInfoContainer { GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); Minecraft.getMinecraft().getTextureManager().bindTexture(texture); drawTexturedModalRect(guiLeft, guiTop, 0, 0, xSize, ySize); + + int i = (int)(diFurnace.getPower() * 52 / diFurnace.getMaxPower()); + drawTexturedModalRect(guiLeft + 17, guiTop + 97 - i, 176, 52 - i, 16, i); + } /** diff --git a/src/main/java/com/hbm/items/tool/ItemCraftingDegradation.java b/src/main/java/com/hbm/items/tool/ItemCraftingDegradation.java index 53957b239..539edff01 100644 --- a/src/main/java/com/hbm/items/tool/ItemCraftingDegradation.java +++ b/src/main/java/com/hbm/items/tool/ItemCraftingDegradation.java @@ -1,6 +1,7 @@ package com.hbm.items.tool; import com.hbm.lib.RefStrings; +import com.hbm.main.MainRegistry; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; @@ -11,6 +12,7 @@ public class ItemCraftingDegradation extends Item { this.setMaxStackSize(1); this.setMaxDamage(durability); this.setNoRepair(); + this.setCreativeTab(MainRegistry.controlTab); } @Override diff --git a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java index a0bb89507..4d173f8e3 100644 --- a/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java +++ b/src/main/java/com/hbm/tileentity/machine/TileEntityMachineAutocrafter.java @@ -1,22 +1,31 @@ package com.hbm.tileentity.machine; +import java.util.ArrayList; import java.util.List; +import com.hbm.lib.Library; import com.hbm.tileentity.TileEntityMachineBase; import com.hbm.util.ItemStackUtil; +import api.hbm.energy.IEnergyUser; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.Container; import net.minecraft.inventory.IInventory; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.item.crafting.CraftingManager; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.nbt.NBTTagCompound; -public class TileEntityMachineAutocrafter extends TileEntityMachineBase { +public class TileEntityMachineAutocrafter extends TileEntityMachineBase implements IEnergyUser { public static final String MODE_EXACT = "exact"; public static final String MODE_WILDCARD = "wildcard"; public String[] modes = new String[9]; + + public List recipes = new ArrayList(); + public int recipeIndex; + public int recipeCount; public TileEntityMachineAutocrafter() { super(21); @@ -24,6 +33,8 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase { public void initPattern(ItemStack stack, int i) { + if(worldObj.isRemote) return; + if(stack == null) { modes[i] = null; return; @@ -57,6 +68,9 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase { } public void nextMode(int i) { + + if(worldObj.isRemote) return; + ItemStack stack = slots[i]; if(stack == null) { @@ -95,6 +109,22 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase { } } } + + public void nextTemplate() { + + if(worldObj.isRemote) return; + + this.recipeIndex++; + + if(this.recipeIndex >= this.recipes.size()) + this.recipeIndex = 0; + + if(!this.recipes.isEmpty()) { + slots[9] = this.recipes.get(this.recipeIndex).getCraftingResult(getTemplateGrid()); + } else { + slots[9] = null; + } + } @Override public String getName() { @@ -108,31 +138,213 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase { if(!worldObj.isRemote) { - this.craftingInventory.loadIventory(slots, 10); - ItemStack stack = CraftingManager.getInstance().findMatchingRecipe(this.craftingInventory, this.worldObj); + this.power = Library.chargeTEFromItems(slots, 20, power, maxPower); + this.updateStandardConnections(worldObj, this); - if(stack != null) { - slots[19] = stack.copy(); + if(!this.recipes.isEmpty() && this.power >= this.consumption) { + IRecipe recipe = this.recipes.get(recipeIndex); - for(int i = 10; i < 19; i++) { - this.decrStackSize(i, 1); + if(recipe.matches(this.getRecipeGrid(), this.worldObj)) { + ItemStack stack = recipe.getCraftingResult(this.getRecipeGrid()); + + if(stack != null) { + + boolean didCraft = false; + + if(slots[19] == null) { + slots[19] = stack.copy(); + didCraft = true; + } else if(slots[19].isItemEqual(stack) && ItemStack.areItemStackTagsEqual(stack, slots[19]) && slots[19].stackSize + stack.stackSize <= slots[19].getMaxStackSize()) { + slots[19].stackSize += stack.stackSize; + didCraft = true; + } + + if(didCraft) { + for(int i = 10; i < 19; i++) { + + ItemStack ingredient = this.getStackInSlot(i); + + if(ingredient != null) { + this.decrStackSize(i, 1); + + if(ingredient.getItem().hasContainerItem(ingredient)) { + ItemStack container = ingredient.getItem().getContainerItem(ingredient); + + if(container != null && container.isItemStackDamageable() && container.getItemDamage() > container.getMaxDamage()) { + continue; + } + + this.setInventorySlotContents(i, container); + } + } + } + + this.power -= this.consumption; + } + } } } + + NBTTagCompound data = new NBTTagCompound(); + data.setLong("power", power); + for(int i = 0; i < 9; i++) { + if(modes[i] != null) { + data.setString("mode" + i, modes[i]); + } + } + data.setInteger("count", this.recipeCount); + data.setInteger("rec", this.recipeIndex); + this.networkPack(data, 15); } } + @Override + public void networkUnpack(NBTTagCompound data) { + this.power = data.getLong("power"); + + modes = new String[9]; + for(int i = 0; i < 9; i++) { + if(data.hasKey("mode" + i)) { + modes[i] = data.getString("mode" + i); + } + } + this.recipeCount = data.getInteger("count"); + this.recipeIndex = data.getInteger("rec"); + } + public void updateTemplateGrid() { - this.craftingInventory.loadIventory(slots, 0); - ItemStack temp = CraftingManager.getInstance().findMatchingRecipe(this.craftingInventory, this.worldObj); + this.recipes = getMatchingRecipes(this.getTemplateGrid()); + this.recipeCount = recipes.size(); + this.recipeIndex = 0; - if(temp != null) { - slots[9] = temp.copy(); + if(!this.recipes.isEmpty()) { + slots[9] = this.recipes.get(this.recipeIndex).getCraftingResult(getTemplateGrid()); } else { slots[9] = null; } } + public List getMatchingRecipes(InventoryCrafting grid) { + List recipes = new ArrayList(); + + for(Object o : CraftingManager.getInstance().getRecipeList()) { + IRecipe recipe = (IRecipe) o; + + if(recipe.matches(grid, worldObj)) { + recipes.add(recipe); + } + } + + return recipes; + } + + public int[] access = new int[] { 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 }; + + @Override + public int[] getAccessibleSlotsFromSide(int side) { + return access; + } + + @Override + public boolean canExtractItem(int i, ItemStack stack, int j) { + if(i == 19) + return true; + + if(i > 9 && i < 18) { + ItemStack filter = slots[i - 10]; + String mode = modes[i - 10]; + + if(filter == null || mode == null || mode.isEmpty()) return true; + + if(isValidForFilter(filter, mode, stack)) { + return false; + } + + return true; + } + + return false; + } + + @Override + public boolean isItemValidForSlot(int slot, ItemStack stack) { + + //only allow insertion for the nine recipe slots + if(slot < 10 || slot > 18) + return false; + + //is the filter at this space null? no input. + if(slots[slot - 10] == null) + return false; + + //let's find all slots that this item could potentially go in + List validSlots = new ArrayList(); + for(int i = 0; i < 9; i++) { + ItemStack filter = slots[i]; + String mode = modes[i]; + + if(filter == null || mode == null || mode.isEmpty()) continue; + + if(isValidForFilter(filter, mode, stack)) { + validSlots.add(i + 10); + + //if the current slot is valid and has no item in it, shortcut to true [*] + if(i + 10 == slot && slots[slot] == null) { + return true; + } + } + } + + //if the slot we are looking at isn't valid, skip + if(!validSlots.contains(slot)) { + return false; + } + + //assumption from [*]: the slot has to be valid by now, and it cannot be null + int size = slots[slot].stackSize; + + //now we decide based on stacksize, woohoo + for(Integer i : validSlots) { + ItemStack valid = slots[i]; + + if(valid == null) return false; //null? since slots[slot] is not null by now, this other slot needs the item more + if(!(valid.isItemEqual(stack) && ItemStack.areItemStackTagsEqual(valid, stack))) continue; //different item anyway? out with it + + //if there is another slot that actually does need the same item more, cancel + if(valid.stackSize < size) + return false; + } + + //prevent items with containers from stacking + if(stack.getItem().hasContainerItem(stack)) + return false; + + //by now, we either already have filled the slot (if valid by filter and null) or weeded out all other options, which means it is good to go + return true; + } + + private boolean isValidForFilter(ItemStack filter, String mode, ItemStack input) { + + switch(mode) { + case MODE_EXACT: return input.isItemEqual(filter) && ItemStack.areItemStackTagsEqual(input, filter); + case MODE_WILDCARD: return input.getItem() == filter.getItem() && ItemStack.areItemStackTagsEqual(input, filter); + default: + List keys = ItemStackUtil.getOreDictNames(input); + return keys.contains(mode); + } + } + + public InventoryCrafting getTemplateGrid() { + this.craftingInventory.loadIventory(slots, 0); + return this.craftingInventory; + } + + public InventoryCrafting getRecipeGrid() { + this.craftingInventory.loadIventory(slots, 10); + return this.craftingInventory; + } + public static class InventoryCraftingAuto extends InventoryCrafting { public InventoryCraftingAuto(int width, int height) { @@ -147,10 +359,63 @@ public class TileEntityMachineAutocrafter extends TileEntityMachineBase { } public static class ContainerBlank extends Container { - @Override - public void onCraftMatrixChanged(IInventory inventory) { } - @Override - public boolean canInteractWith(EntityPlayer player) { return false; } + @Override public void onCraftMatrixChanged(IInventory inventory) { } + @Override public boolean canInteractWith(EntityPlayer player) { return false; } } } + + public static int consumption = 100; + public static long maxPower = consumption * 100; + public long power; + + @Override + public long getPower() { + return power; + } + + @Override + public long getMaxPower() { + return maxPower; + } + + @Override + public void setPower(long power) { + this.power = power; + } + + @Override + public void readFromNBT(NBTTagCompound nbt) { + super.readFromNBT(nbt); + this.power = nbt.getLong("power"); + + for(int i = 0; i < 9; i++) { + if(nbt.hasKey("mode" + i)) { + modes[i] = nbt.getString("mode" + i); + } + } + + this.recipes = getMatchingRecipes(this.getTemplateGrid()); + this.recipeCount = recipes.size(); + this.recipeIndex = nbt.getInteger("rec"); + + if(!this.recipes.isEmpty()) { + slots[9] = this.recipes.get(this.recipeIndex).getCraftingResult(getTemplateGrid()); + } else { + slots[9] = null; + } + } + + @Override + public void writeToNBT(NBTTagCompound nbt) { + super.writeToNBT(nbt); + nbt.setLong("power", power); + + for(int i = 0; i < 9; i++) { + if(modes[i] != null) { + nbt.setString("mode" + i, modes[i]); + } + } + + nbt.setInteger("rec", this.recipeIndex); + } } diff --git a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java index 1f477ecee..b5c377fd2 100644 --- a/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java +++ b/src/main/java/com/hbm/tileentity/machine/storage/TileEntityCrateBase.java @@ -69,13 +69,14 @@ public abstract class TileEntityCrateBase extends TileEntityLockableBase impleme } } - // You scrubs aren't needed for anything (right now) @Override public void openInventory() { + this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.crateOpen", 1.0F, 1.0F); } @Override public void closeInventory() { + this.worldObj.playSoundEffect(xCoord + 0.5, yCoord + 0.5, zCoord + 0.5, "hbm:block.crateClose", 1.0F, 1.0F); } @Override diff --git a/src/main/resources/assets/hbm/lang/de_DE.lang b/src/main/resources/assets/hbm/lang/de_DE.lang index 6f579507d..a633cadc1 100644 --- a/src/main/resources/assets/hbm/lang/de_DE.lang +++ b/src/main/resources/assets/hbm/lang/de_DE.lang @@ -208,6 +208,7 @@ container.anvil=Stufe %s Amboss container.arcFurnace=Lichtbogenofen container.armorTable=Rüstungsmodifikationstisch container.assembler=Fertigungsmaschine +container.autocrafter=Automatische Werkbank container.barrel=Fass container.bat9000=Big-Ass Tank 9000 container.battery=Energiespeicher @@ -215,6 +216,7 @@ container.bombMulti=Mehrzweckbombe container.centrifuge=Zentrifuge container.chemplant=Chemiewerk container.compactLauncher=Kompakt-Startrampe +container.crateDesh=Deshkiste container.crateIron=Eisenkiste container.crateSteel=Stahlkiste container.crateTungsten=Wolframkiste @@ -3114,6 +3116,7 @@ tile.crashed_bomb.name=Blindgänger tile.crate.name=Vorratskiste tile.crate_ammo.name=Sternenmetallkiste tile.crate_can.name=Konservenkiste +tile.crate_desh.name=Deshkiste tile.crate_iron.name=Eisenkiste tile.crate_jungle.name=Enargitkiste tile.crate_lead.name=Gefahrenstoffkiste @@ -3302,6 +3305,7 @@ tile.machine_arc_furnace_on.name=Lichtbogenofen tile.machine_armor_table.name=Rüstungsmodifikationstisch tile.machine_assembler.name=Fertigungsmaschine tile.machine_assemfac.name=Fertigungsfabrik +tile.machine_autocrafter.name=Automatische Werkbank tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energiespeicherblock tile.machine_battery_potato.name=Kartoffelbatterieblock diff --git a/src/main/resources/assets/hbm/lang/en_US.lang b/src/main/resources/assets/hbm/lang/en_US.lang index 31e3ec3b9..fe780307e 100644 --- a/src/main/resources/assets/hbm/lang/en_US.lang +++ b/src/main/resources/assets/hbm/lang/en_US.lang @@ -384,6 +384,7 @@ container.anvil=Tier %s Anvil container.arcFurnace=Arc Furnace container.armorTable=Armor Modification Table container.assembler=Assembly Machine +container.autocrafter=Automatic Crafting Table container.barrel=Barrel container.bat9000=Big-Ass Tank 9000 container.battery=Energy Storage @@ -391,6 +392,7 @@ container.bombMulti=Multi Purpose Bomb container.centrifuge=Centrifuge container.chemplant=Chemical Plant container.compactLauncher=Compact Launch Pad +container.crateDesh=Desh Crate container.crateIron=Iron Crate container.crateSteel=Steel Crate container.crateTungsten=Tungsten Crate @@ -3506,6 +3508,7 @@ tile.crashed_bomb.name=Dud tile.crate.name=Supply Crate tile.crate_ammo.name=Starmetal Crate tile.crate_can.name=Conserve Crate +tile.crate_desh.name=Desh Crate tile.crate_iron.name=Iron Crate tile.crate_jungle.name=Enargite Crate tile.crate_lead.name=Hazmat Crate @@ -3694,6 +3697,7 @@ tile.machine_arc_furnace_on.name=Arc Furnace tile.machine_armor_table.name=Armor Modification Table tile.machine_assembler.name=Assembly Machine tile.machine_assemfac.name=Assembly Factory +tile.machine_autocrafter.name=Automatic Crafting Table tile.machine_bat9000.name=Big-Ass Tank 9000 tile.machine_battery.name=Energy Storage Block tile.machine_battery_potato.name=Potato Battery Block diff --git a/src/main/resources/assets/hbm/sounds.json b/src/main/resources/assets/hbm/sounds.json index a7f613399..8d4d8faa9 100644 --- a/src/main/resources/assets/hbm/sounds.json +++ b/src/main/resources/assets/hbm/sounds.json @@ -38,6 +38,8 @@ "block.rbmk_az5_cover": {"category": "block", "sounds": [{"name": "block/rbmk_az5_cover", "stream": false}]}, "block.chungusLever": {"category": "block", "sounds": [{"name": "block/chungusLever", "stream": false}]}, "block.bobble": {"category": "block", "sounds": [{"name": "block/bobble", "stream": false}]}, + "block.crateOpen": {"category": "block", "sounds": [{"name": "block/crateOpen", "stream": false}]}, + "block.crateClose": {"category": "block", "sounds": [{"name": "block/crateClose", "stream": false}]}, "door.TransitionSealOpen": {"category": "block", "sounds": [{"name": "block/door/transition_seal_open", "stream": true}]}, diff --git a/src/main/resources/assets/hbm/sounds/block/crateClose.ogg b/src/main/resources/assets/hbm/sounds/block/crateClose.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b1466e5ee9ddd37a9d629f63e3ecbb0d4415e69d GIT binary patch literal 13373 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/assets/hbm/textures/gui/processing/gui_autocrafter.png b/src/main/resources/assets/hbm/textures/gui/processing/gui_autocrafter.png index bffd26401dbfa1f5a67bff41dbc378b7ff604b31..31ee96577c56feb14c501773c9802771d40a92b1 100644 GIT binary patch literal 2376 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 Usr>%7#){qjYj4+57i#i90UYuNSO5S3 literal 2444 zcma)8dpMNa8eiXMFmy0unw`j{)N#;-l3PsU(&HL7g^p`P$|W&UF=p7sX`4Md2Rpe$ zCsS?>Q*KerPPrtPTt{eVlm;PpCNt+#`#fi#r)TeT)<0`~>s{;jzQ6bVe($rcIXPI# zNGnPM0Ay^eEu8^?kR=4r63FBkQ4okss7Q00V`yZ=qEGz|04WO_OS5Aavp){A!j#;; zlNf1bzlm^RG%JlkT^XpMu!rwf@CoH`hB3z&=15!;XAK1o0>y&@kW7x>>~YB>rfpA1 z)904bH*6h zYQD=At#vTuwpX01U!CYm3Qseo8n;OjH5sv@?$URYj#XsQQf1g~o(VZSmvYg|fOEhJ z>XE_%AIc*UkJYHxPU6|OMS&=D6uU2lTOp#8==JM!lL+E&JTV6Y%?=KB%ve{X1}N>g z|5Nu{c{Mm@<1pCvPq;uGpxacwP|>0qBTSK)5RP~MFM~1Mi=3@o&Gi{o^fonrDCuMc zFqug32+pxD;eN@#??1qJe>P2gC{v*v4M)a$8()efNMr-cezVjy;7GZmn?pJ;IN6 z=xW)#zAZNhV8ZfZ95;>dm~vuK;}9O)MlPy@gw{IL>|Spxpf{$OdZ}uxgRpAHl60~I zsDL@jPNd>gs=ZKIbgOMI8U1&oO&D5BM+OS){4-EvVPb$WZ0Z%?urdagULFwgWJS{BeVIW?`^eyhZ9zEdf@$HhOBg z-BA-(lfm60qlofaU2!m}QN=50>XakMx{8&Dy4(0^7%&wNW7SFwJ%i5pYaU6ErZ4XRLOwzKlvL?>gFtsNa zYYNYQmwaT=Fr2OfmGwq>^)Bzb(fYuB+p-HSmcEBjx}KAA8Vg2B z30mSs+EnJ`i-D+wQeNOeY*u@ZvZ*X;Po_urg1HgHsT`v>=vFYG;oxVi>V4lfy|I~TS(~yH{ zRP$oiP9S@9;Wb7fxPeu1-hn)By0DlMWq*0fy-IZM7<|dz8=7)hV*NF!w|a?Ayss=5 znzb7&ExuGLPEpaJ+ZaHhYi5Jl5`SuzQ1QnCGbyN14Zt|KC*n}JdV9`GChuON^oVo; z%CLVY6#jw4RTyuJ|70SF0<;c!YUCr?JnTJtzmHE8lIg_wo1c4%WU0^nMqhv0q_euU zVE_t`iJ7bsZqi-d+KPM>;PzmWCJ})+xxtlvE%z#9I{WBJOIM|-ea5Thee%PJyYETk z0pkOjM4J>dOgE*Dmf%*CXB*j*4w1L&Y=Kh?_*X6iaNi6tV+ zFuI_KK{RD1vu|ObO3LuFqJlgyQ?BKVbB>soA!@Jmm{YCAG>?sAAk2_|>fqS8LOt>LZeF35bEA&t6Jz>SXdE-*dG<}#9OJ!@N~+Z{!x<36Xoj3nj+OQ&%LdepXk%ix2udR4l*mA z%KtCKZ=6j99sc_3mk75v>dJ;@raS9rwcSl~7It1Vvr^-g>$I1tcb=`#Vx&bxN4vdf z;+|~JSHFHfQ`O2UkIxbN-PphJ^ef|TY_nloN&|_6+V3#W`+(L{R*t82e>OCRk2a}% zX|La;;rF06l1C>to{8IbH?mwEQ*LdQ_sJdpcV0QKjuO4%f9if}*uZ4dtlWHgdWY$4 zeExq<{1NVd6@@PylKsBvq;U<5qchn&7V1~l=l~Dl0s0n38qy*M7sxZuub!&JvqO*` yxbJv_ArecuzAKS3t?`$QeVZc=mP~Wsgnt1UZW{pr