diff --git a/libs/src/Railcraft_1.7.10-9.12.2.1-src.jar b/libs/src/Railcraft_1.7.10-9.12.2.1-src.jar index 9a464cf5..e8cddbf1 100644 Binary files a/libs/src/Railcraft_1.7.10-9.12.2.1-src.jar and b/libs/src/Railcraft_1.7.10-9.12.2.1-src.jar differ diff --git a/src/main/java/gregtechmod/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java b/src/main/java/gregtechmod/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java index 3d83a610..00cc5d1e 100644 --- a/src/main/java/gregtechmod/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java +++ b/src/main/java/gregtechmod/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java @@ -106,16 +106,11 @@ public void onPostTick() { } boolean succeded = recipeLogic.update(); - - if (bItemTransfer && (mInventory[3] != null || mInventory[4] != null) && getBaseMetaTileEntity().getFrontFacing() != mMainFacing && doesAutoOutput() && (succeded || getBaseMetaTileEntity().hasInventoryBeenModified() || getBaseMetaTileEntity().getTimer()%600 == 0) && getBaseMetaTileEntity().isUniversalEnergyStored(500)) { + if (bItemTransfer && !getOutputItems().isEmpty() && getBaseMetaTileEntity().getFrontFacing() != mMainFacing && doesAutoOutput() && (succeded || getBaseMetaTileEntity().hasInventoryBeenModified() || getBaseMetaTileEntity().getTimer()%600 == 0) && getBaseMetaTileEntity().isUniversalEnergyStored(500)) { TileEntity tTileEntity2 = getBaseMetaTileEntity().getTileEntityAtSide(getBaseMetaTileEntity().getFrontFacing()); int tCost = GT_Utility.moveOneItemStack(getBaseMetaTileEntity(), tTileEntity2, getBaseMetaTileEntity().getFrontFacing(), getBaseMetaTileEntity().getBackFacing(), null, false, (byte)64, (byte)1, (byte)64, (byte)1); if (tCost > 0) { getBaseMetaTileEntity().decreaseStoredEnergyUnits(tCost, true); - tCost = GT_Utility.moveOneItemStack(getBaseMetaTileEntity(), tTileEntity2, getBaseMetaTileEntity().getFrontFacing(), getBaseMetaTileEntity().getBackFacing(), null, false, (byte)64, (byte)1, (byte)64, (byte)1); - if (tCost > 0) { - getBaseMetaTileEntity().decreaseStoredEnergyUnits(tCost, true); - } } } } diff --git a/src/main/java/gregtechmod/api/recipe/RecipeLogic.java b/src/main/java/gregtechmod/api/recipe/RecipeLogic.java index e5a92cd4..80557c00 100644 --- a/src/main/java/gregtechmod/api/recipe/RecipeLogic.java +++ b/src/main/java/gregtechmod/api/recipe/RecipeLogic.java @@ -76,7 +76,7 @@ public boolean update() { } if (progressTime == 0) { - if (base.hasInventoryBeenModified() || base.hasWorkJustBeenEnabled() || success || base.getTimer() % 600 == 0 || wasNoEnergy || isInputNonEmpty()) { + if (base.hasInventoryBeenModified() || base.hasWorkJustBeenEnabled() || success || base.getTimer() % 600 == 0 || wasNoEnergy) {// || isInputNonEmpty()) { if (base.isUniversalEnergyStored(getMachine().getMinimumStoredEU() - 100)) { trySerachRecipe(); wasNoEnergy = false; @@ -149,8 +149,8 @@ protected boolean match(Recipe recipe) { return recipe.matches(false, getMachine().getInputItems()); } - protected void consumeInputs(Recipe recipe) { - recipe.matches(true, getMachine().getInputItems()); + protected boolean consumeInputs(Recipe recipe) { + return recipe.matches(true, getMachine().getInputItems()); } protected void startRecipe(Recipe recipe) { @@ -159,9 +159,17 @@ protected void startRecipe(Recipe recipe) { maxProgressTime = GT_Utility.isDebugItem(getMachine().getStackInSlot(batterySlot)) ? 1 : recipe.getDuration(); progressTime = 1; EUt = recipe.getEUt(); - consumeInputs(recipe); - getMachine().getBaseMetaTileEntity().setActive(true); - getMachine().startProcess(); + if (consumeInputs(recipe)) { + getMachine().getBaseMetaTileEntity().setActive(true); + getMachine().startProcess(); + } else { + GT_Log.log.catching(new IllegalStateException("Error state detected! RecipeMap passed recipe, but it's not matching! Report about this!!!")); + EUt = 0; + progressTime = 0; + maxProgressTime = 0; + previousRecipe = null; + } + } else { getMachine().getBaseMetaTileEntity().setActive(false); } @@ -177,19 +185,24 @@ protected void endRecipe(Recipe recipe) { for (ItemStack recipeOut : recipeOutputs) { int amount = recipeOut.stackSize; - for (int i = 0; i < outputs.size(); i++) { + for (int i = 0; i < outputs.size() && amount > 0; i++) { ItemStack slot = outputs.get(i); - if (slot == null) { - outputs.set(i, recipeOut.copy()); - amount = 0; - } else if (GT_Utility.areStacksEqual(recipeOut, slot)) { + if (GT_Utility.areStacksEqual(recipeOut, slot)) { int newSize = Math.min(slot.getMaxStackSize(), slot.stackSize + amount); + amount -= newSize - slot.stackSize; slot.stackSize = newSize; - amount -= newSize; } - - if (amount <= 0) + } + + for (int i = 0; i < outputs.size() && amount > 0; i++) { + ItemStack slot = outputs.get(i); + if (slot == null) { + ItemStack stack = recipeOut.copy(); + stack.stackSize = amount; + outputs.set(i, stack); + amount = 0; break; + } } if (amount > 0) diff --git a/src/main/java/gregtechmod/api/recipe/RecipeMap.java b/src/main/java/gregtechmod/api/recipe/RecipeMap.java index da519a21..c39da7b5 100644 --- a/src/main/java/gregtechmod/api/recipe/RecipeMap.java +++ b/src/main/java/gregtechmod/api/recipe/RecipeMap.java @@ -65,16 +65,18 @@ public Recipe findRecipe(List input) { if (recipes != null) result = findRecipe(recipes, input); if (result == null && recipesWild != null) - result = findRecipe(recipes, input); + result = findRecipe(recipesWild, input); } - return result; + return result != null && result.enabled ? result : null; } private Recipe findRecipe(List recipes, List input) { - for (Recipe recipe : recipes) { - if (recipe.matches(false, input)) { - return recipe; + if (recipes != null) { + for (Recipe recipe : recipes) { + if (recipe.matches(false, input)) { + return recipe; + } } } diff --git a/src/main/java/gregtechmod/api/util/GT_ModHandler.java b/src/main/java/gregtechmod/api/util/GT_ModHandler.java index e7a45238..917e0bb6 100644 --- a/src/main/java/gregtechmod/api/util/GT_ModHandler.java +++ b/src/main/java/gregtechmod/api/util/GT_ModHandler.java @@ -627,6 +627,39 @@ public static Map getMassFabricatorList() { return sMassfabRecipes; } + public static List getMaceratorResult(ItemStack input) { + try { + ic2.api.recipe.RecipeOutput recipe = ic2.api.recipe.Recipes.macerator.getOutputFor(input, true); + if (recipe != null) { + return GT_Utility.copy(recipe.items); + } + } catch (Throwable e) {} + + return null; + } + + public static List getExtractorResult(ItemStack input) { + try { + ic2.api.recipe.RecipeOutput recipe = ic2.api.recipe.Recipes.extractor.getOutputFor(input, true); + if (recipe != null) { + return GT_Utility.copy(recipe.items); + } + } catch (Throwable e) {} + + return null; + } + + public static List getCompressorResult(ItemStack input) { + try { + ic2.api.recipe.RecipeOutput recipe = ic2.api.recipe.Recipes.compressor.getOutputFor(input, true); + if (recipe != null) { + return GT_Utility.copy(recipe.items); + } + } catch (Throwable e) {} + + return null; + } + /** * IC2-ThermalCentrifuge Recipe. Overloads old Recipes automatically */ diff --git a/src/main/java/gregtechmod/api/util/GT_Utility.java b/src/main/java/gregtechmod/api/util/GT_Utility.java index 7eb1d7a2..0a0c6c0f 100644 --- a/src/main/java/gregtechmod/api/util/GT_Utility.java +++ b/src/main/java/gregtechmod/api/util/GT_Utility.java @@ -361,7 +361,8 @@ public static byte moveStackIntoPipe(IInventory aTileEntity1, Object aTileEntity ItemStack rStack = ((cofh.api.transport.IItemDuct)aTileEntity2).insertItem(ForgeDirection.getOrientation(aPutTo), copy(tStack)); byte tMovedItemCount = (byte)(tStack.stackSize - (rStack == null ? 0 : rStack.stackSize)); if (tMovedItemCount >= 1/*Math.max(aMinMoveAtOnce, aMinTargetStackSize)*/) { - //((cofh.api.transport.IItemConduit)aTileEntity2).insertItem(ForgeDirection.getOrientation(aPutTo), copyAmount(tMovedItemCount, tStack), false); + ItemStack remains = ((cofh.api.transport.IItemDuct)aTileEntity2).insertItem(ForgeDirection.getOrientation(aPutTo), copyAmount(tMovedItemCount, tStack)); + tMovedItemCount = (byte) (tStack.stackSize - remains.stackSize); aTileEntity1.decrStackSize(aGrabSlots[i], tMovedItemCount); aTileEntity1.markDirty(); return tMovedItemCount; @@ -484,13 +485,11 @@ private static byte moveOneItemStack(IInventory aTileEntity1, Object aTileEntity } for (int i = 0; i < tGrabSlots.length; i++) { - for (int j = 0; j < tPutSlots.length; j++) { - if (listContainsItem(aFilter, aTileEntity1.getStackInSlot(tGrabSlots[i]), true, aInvertFilter)) { - if (isAllowedToTakeFromSlot(aTileEntity1, tGrabSlots[i], aGrabFrom, aTileEntity1.getStackInSlot(tGrabSlots[i]))) { - if (isAllowedToPutIntoSlot((IInventory)aTileEntity2, tPutSlots[j], aPutTo, aTileEntity1.getStackInSlot(tGrabSlots[i]))) { - byte tMovedItemCount = moveStackFromSlotAToSlotB(aTileEntity1, (IInventory)aTileEntity2, tGrabSlots[i], tPutSlots[j], aMaxTargetStackSize, aMinTargetStackSize, aMaxMoveAtOnce, aMinMoveAtOnce); - if (tMovedItemCount > 0) return tMovedItemCount; - } + if (listContainsItem(aFilter, aTileEntity1.getStackInSlot(tGrabSlots[i]), true, aInvertFilter) && isAllowedToTakeFromSlot(aTileEntity1, tGrabSlots[i], aGrabFrom, aTileEntity1.getStackInSlot(tGrabSlots[i]))) { + for (int j = 0; j < tPutSlots.length; j++) { + if (isAllowedToPutIntoSlot((IInventory)aTileEntity2, tPutSlots[j], aPutTo, aTileEntity1.getStackInSlot(tGrabSlots[i]))) { + byte tMovedItemCount = moveStackFromSlotAToSlotB(aTileEntity1, (IInventory)aTileEntity2, tGrabSlots[i], tPutSlots[j], aMaxTargetStackSize, aMinTargetStackSize, aMaxMoveAtOnce, aMinMoveAtOnce); + if (tMovedItemCount > 0) return tMovedItemCount; } } } diff --git a/src/main/java/gregtechmod/common/GT_GUIHandler.java b/src/main/java/gregtechmod/common/GT_GUIHandler.java index afcb21c2..4680e77c 100644 --- a/src/main/java/gregtechmod/common/GT_GUIHandler.java +++ b/src/main/java/gregtechmod/common/GT_GUIHandler.java @@ -58,6 +58,7 @@ import gregtechmod.common.containers.GT_Container_TradeOMat_Settings; import gregtechmod.common.containers.GT_Container_Translocator; import gregtechmod.common.containers.GT_Container_VacuumFreezer; +import gregtechmod.common.containers.UniversalMacerator; import gregtechmod.common.gui.GT_GUIContainerMetaID_Machine; import gregtechmod.common.gui.GT_GUIContainer_1by1; import gregtechmod.common.gui.GT_GUIContainer_2by2; @@ -133,6 +134,7 @@ import gregtechmod.common.gui.GT_GUIContainer_TradeOMat_Settings; import gregtechmod.common.gui.GT_GUIContainer_Translocator; import gregtechmod.common.gui.GT_GUIContainer_VacuumFreezer; +import gregtechmod.common.gui.GUI_UniversalMacerator; import gregtechmod.common.tileentities.deprecated.GT_TileEntityMetaID_Machine; import gregtechmod.common.tileentities.deprecated.GT_TileEntity_Sonictron; import net.minecraft.entity.player.EntityPlayer; @@ -207,7 +209,7 @@ public Object getServerGuiElement(int ID, EntityPlayer player, World world, int if (ID == 146) return new GT_Container_Centrifuge (player.inventory, (IGregTechTileEntity) tTileEntity); if (ID == 147) return new GT_Container_RedstoneCircuitBlock (player.inventory, (IGregTechTileEntity) tTileEntity); if (ID == 148) return new GT_Container_BasicMachine (player.inventory, (IGregTechTileEntity) tTileEntity); - if (ID == 149) return new GT_Container_BasicMachine (player.inventory, (IGregTechTileEntity) tTileEntity); + if (ID == 149) return new UniversalMacerator (player.inventory, (IGregTechTileEntity) tTileEntity); if (ID == 150) return new GT_Container_AESU_Meta (player.inventory, (IGregTechTileEntity) tTileEntity); if (ID == 151) return new GT_Container_IDSU_Meta (player.inventory, (IGregTechTileEntity) tTileEntity); if (ID == 152) return new GT_Container_Teleporter (player.inventory, (IGregTechTileEntity) tTileEntity); @@ -306,7 +308,7 @@ public Object getClientGuiElement(int ID, EntityPlayer player, World world, int if (ID == 146) return new GT_GUIContainer_Centrifuge (player.inventory, (IGregTechTileEntity)tTileEntity); if (ID == 147) return new GT_GUIContainer_RedstoneCircuitBlock (player.inventory, (IGregTechTileEntity)tTileEntity); if (ID == 148) return new GT_GUIContainer_BasicMachine_E_Furnace (player.inventory, (IGregTechTileEntity)tTileEntity, "Microwave Oven", "E_Furnace.png"); - if (ID == 149) return new GT_GUIContainer_BasicMachine_Macerator (player.inventory, (IGregTechTileEntity)tTileEntity, "Universal Macerator", "Macerator.png"); + if (ID == 149) return new GUI_UniversalMacerator (player.inventory, (IGregTechTileEntity)tTileEntity, "Universal Macerator", "Macerator.png"); // TODO fix textures for usual macerator if (ID == 150) return new GT_GUIContainer_AESU_Meta (player.inventory, (IGregTechTileEntity)tTileEntity); if (ID == 151) return new GT_GUIContainer_IDSU_Meta (player.inventory, (IGregTechTileEntity)tTileEntity); if (ID == 152) return new GT_GUIContainer_Teleporter (player.inventory, (IGregTechTileEntity)tTileEntity); diff --git a/src/main/java/gregtechmod/common/containers/UniversalMacerator.java b/src/main/java/gregtechmod/common/containers/UniversalMacerator.java new file mode 100644 index 00000000..a6a59d85 --- /dev/null +++ b/src/main/java/gregtechmod/common/containers/UniversalMacerator.java @@ -0,0 +1,117 @@ +package gregtechmod.common.containers; + +import java.util.Iterator; +import java.util.List; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import gregtechmod.api.gui.GT_ContainerMetaTile_Machine; +import gregtechmod.api.gui.GT_Slot_Holo; +import gregtechmod.api.gui.GT_Slot_Output; +import gregtechmod.api.interfaces.IGregTechTileEntity; +import gregtechmod.api.interfaces.IRecipeWorkable; +import gregtechmod.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; + +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.ICrafting; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; + +/** + * @author TheDarkDnKTv + * + */ +public class UniversalMacerator extends GT_ContainerMetaTile_Machine { + + public boolean mOutputting = false, mItemTransfer = false, mSeperatedInputs = false; + + /** + * @param aInventoryPlayer + * @param aTileEntity + */ + public UniversalMacerator(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) { + super(aInventoryPlayer, aTileEntity); + } + + @Override + public void addSlots(InventoryPlayer aInventoryPlayer) { + addSlotToContainer(new Slot(mTileEntity, 1, 35, 25)); + addSlotToContainer(new Slot(mTileEntity, 2, 53, 25)); + addSlotToContainer(new Slot(mTileEntity, 7, 80, 63)); + List outputs = ((IRecipeWorkable) mTileEntity.getMetaTileEntity()).getOutputItems(); + for (int i = 0; i < outputs.size(); i++) { + int xOffset = 18 * (i % 2); + int yOffset = 18 * (i / 2); + + addSlotToContainer(new GT_Slot_Output(mTileEntity, 3 + i, 107 + xOffset, 16 + yOffset)); + } + addSlotToContainer(new GT_Slot_Holo(mTileEntity, 0, 8, 63, false, true, 1)); + addSlotToContainer(new GT_Slot_Holo(mTileEntity, 0, 26, 63, false, true, 1)); + addSlotToContainer(new GT_Slot_Holo(mTileEntity, 0, 44, 63, false, true, 1)); + } + + @Override + public ItemStack slotClick(int aSlotIndex, int aMouseclick, int aShifthold, EntityPlayer aPlayer) { + if (aSlotIndex < 7) return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer); + + Slot tSlot = (Slot)inventorySlots.get(aSlotIndex); + if (tSlot != null) { + if (mTileEntity.getMetaTileEntity() == null) return null; + if (aSlotIndex == 7) { + ((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bOutput = !((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bOutput; + return null; + } + if (aSlotIndex == 8) { + ((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bItemTransfer = !((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bItemTransfer; + return null; + } + if (aSlotIndex == 9) { + ((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bSeperatedInputs = !((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bSeperatedInputs; + return null; + } + } + + return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer); + } + + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + if (mTileEntity.isClientSide() || mTileEntity.getMetaTileEntity() == null) return; + + mOutputting = ((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bOutput; + mItemTransfer = ((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bItemTransfer; + mSeperatedInputs = ((GT_MetaTileEntity_BasicMachine)mTileEntity.getMetaTileEntity()).bSeperatedInputs; + + @SuppressWarnings("rawtypes") + Iterator var2 = this.crafters.iterator(); + while (var2.hasNext()) { + ICrafting var1 = (ICrafting)var2.next(); + var1.sendProgressBarUpdate(this, 101, mOutputting?1:0); + var1.sendProgressBarUpdate(this, 102, mItemTransfer?1:0); + var1.sendProgressBarUpdate(this, 103, mSeperatedInputs?1:0); + } + } + + @Override + @SideOnly(Side.CLIENT) + public void updateProgressBar(int par1, int par2) { + super.updateProgressBar(par1, par2); + switch (par1) { + case 101: mOutputting = (par2 != 0); break; + case 102: mItemTransfer = (par2 != 0); break; + case 103: mSeperatedInputs = (par2 != 0); break; + } + } + + @Override + public int getSlotCount() { + return 7; + } + + @Override + public int getShiftClickSlotCount() { + return 2; + } +} diff --git a/src/main/java/gregtechmod/common/gui/GUI_UniversalMacerator.java b/src/main/java/gregtechmod/common/gui/GUI_UniversalMacerator.java new file mode 100644 index 00000000..9cdbd96d --- /dev/null +++ b/src/main/java/gregtechmod/common/gui/GUI_UniversalMacerator.java @@ -0,0 +1,49 @@ +package gregtechmod.common.gui; + +import gregtechmod.api.GregTech_API; +import gregtechmod.api.gui.GT_GUIContainerMetaTile_Machine; +import gregtechmod.api.interfaces.IGregTechTileEntity; +import gregtechmod.common.containers.UniversalMacerator; +import net.minecraft.entity.player.InventoryPlayer; + +/** + * @author TheDarkDnKTv + * + */ +public class GUI_UniversalMacerator extends GT_GUIContainerMetaTile_Machine { + + private final String mName; + /** + * @param aInventoryPlayer + * @param aTileEntity + * @param aName + * @param aTextureFile + */ + public GUI_UniversalMacerator(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity, String aName, String aTextureFile) { + super(new UniversalMacerator(aInventoryPlayer, aTileEntity), GregTech_API.GUI_PATH + aTextureFile); + mName = aName; + } + + @Override + protected void drawGuiContainerForegroundLayer(int par1, int par2) { + fontRenderer.drawString(mName, 8, 4, 4210752); + } + + @Override + protected void drawGuiContainerBackgroundLayer(float par1, int par2, int par3) { + super.drawGuiContainerBackgroundLayer(par1, par2, par3); + int x = (width - xSize) / 2; + int y = (height - ySize) / 2; + drawTexturedModalRect(x, y, 0, 0, xSize, ySize); + if (mContainer != null) { + if (((UniversalMacerator)mContainer).mOutputting) drawTexturedModalRect(x + 7, y + 62, 176, 18, 18, 18); + if (((UniversalMacerator)mContainer).mItemTransfer) drawTexturedModalRect(x + 25, y + 62, 176, 36, 18, 18); + if (((UniversalMacerator)mContainer).mSeperatedInputs) drawTexturedModalRect(x + 43, y + 62, 176, 54, 18, 18); + + if (mContainer.mMaxProgressTime > 0) { + int tSize = 20, tProgress = Math.max(1, Math.min(tSize, (mContainer.mProgressTime>0?1:0) + (mContainer.mProgressTime * tSize) / mContainer.mMaxProgressTime)) % (tSize+1); + drawTexturedModalRect(x + 78, y + 24, 176, 0, tProgress , 18); + } + } + } +} diff --git a/src/main/java/gregtechmod/common/recipe/ChancedStack.java b/src/main/java/gregtechmod/common/recipe/ChancedStack.java index 8f356c30..f039d8e9 100644 --- a/src/main/java/gregtechmod/common/recipe/ChancedStack.java +++ b/src/main/java/gregtechmod/common/recipe/ChancedStack.java @@ -3,7 +3,11 @@ import java.util.Optional; import java.util.Random; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + import gregtechmod.api.recipe.ChancedOutput; +import gregtechmod.api.util.GT_Utility; import gregtechmod.common.recipe.factory.SimpleRecipeFactory; import net.minecraft.item.ItemStack; @@ -34,4 +38,28 @@ public ItemStack getStack() { public Optional get(Random random) { return Optional.ofNullable(random.nextInt(SimpleRecipeFactory.MAX_CHANCE) <= chance ? stack.copy() : null); } + + @Override + public int hashCode() { + return GT_Utility.stackToInt(stack) + chance; + } + + @Override + public boolean equals(Object o) { + if (o instanceof ChancedOutput) { + ChancedOutput ch = (ChancedOutput) o; + return ch.getStack().isItemEqual(stack) && ch.getChance() == chance; + } + + return false; + } + + @Override + public String toString() { + ToStringBuilder.setDefaultStyle(ToStringStyle.SHORT_PREFIX_STYLE); + return new ToStringBuilder(this) + .append("stack", stack) + .append("chance", (chance * 1.0D / 100) + "%") + .toString(); + } } diff --git a/src/main/java/gregtechmod/common/recipe/RecipeEntry.java b/src/main/java/gregtechmod/common/recipe/RecipeEntry.java index d2965d0b..85a940d2 100644 --- a/src/main/java/gregtechmod/common/recipe/RecipeEntry.java +++ b/src/main/java/gregtechmod/common/recipe/RecipeEntry.java @@ -232,7 +232,7 @@ public String toString() { ToStringBuilder.setDefaultStyle(ToStringStyle.SHORT_PREFIX_STYLE); return new ToStringBuilder(this) .append("count=" + count) - .append("variants=" + Collections2.transform(variants, stack -> stack.getItem())) + .append("variants=" + variants) .append("matches=" + options) .build(); } diff --git a/src/main/java/gregtechmod/common/recipe/RecipeMaps.java b/src/main/java/gregtechmod/common/recipe/RecipeMaps.java index e89807ee..9e52d3f4 100644 --- a/src/main/java/gregtechmod/common/recipe/RecipeMaps.java +++ b/src/main/java/gregtechmod/common/recipe/RecipeMaps.java @@ -4,7 +4,9 @@ import gregtechmod.api.util.GT_ModHandler; import gregtechmod.common.recipe.factory.SimpleRecipeFactory; import gregtechmod.common.recipe.maps.IC2RecipeMap; +import gregtechmod.common.recipe.maps.PulverizerRecipeMap; import gregtechmod.common.recipe.maps.RecyclerRecipeMap; +import gregtechmod.common.recipe.maps.ScannerRecipeMap; /** * @@ -27,12 +29,12 @@ public class RecipeMaps { public static final RecipeMap ALLOY_SMELTING = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); public static final RecipeMap ASSEMBLING = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); public static final RecipeMap CANINNING = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); -// public static final RecipeMap sCNCRecipes = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); public static final RecipeMap LATHE = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); public static final RecipeMap CUTTING = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); public static final RecipeMap EXTRUDING = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); public static final RecipeMap HAMMER = new RecipeMap<>(1, 2, 1, 2, new SimpleRecipeFactory()); public static final RecipeMap PRINTER = new RecipeMap<>(1, 3, 1, 2, new SimpleRecipeFactory()); + public static final PulverizerRecipeMap PULVERIZING = new PulverizerRecipeMap(1, 2, 1, 4); public static final RecipeMap DIESEL_FUELS = new RecipeMap<>(1, 1, 0, 0, new SimpleRecipeFactory()); // TODO generators recipemaps public static final RecipeMap TURBINE_FUELS = new RecipeMap<>(1, 1, 0, 0, new SimpleRecipeFactory()); @@ -42,8 +44,9 @@ public class RecipeMaps { public static final RecipeMap MAGIC_FUELS = new RecipeMap<>(1, 1, 0, 1, new SimpleRecipeFactory()); // Fake RecipeMaps - public static final IC2RecipeMap MACERATION = new IC2RecipeMap(1, 2, 1, 2, GT_ModHandler::getMaceratorRecipeList); - public static final IC2RecipeMap EXTRACTION = new IC2RecipeMap(1, 2, 1, 2, GT_ModHandler::getExtractorRecipeList); - public static final IC2RecipeMap COMPRESSION = new IC2RecipeMap(1, 2, 1, 2, GT_ModHandler::getCompressorRecipeList); - public static final RecyclerRecipeMap RECYCLING = new RecyclerRecipeMap(1, 2, 1, 2); + public static final IC2RecipeMap MACERATION = new IC2RecipeMap(1, 2, 1, 2, GT_ModHandler::getMaceratorResult); + public static final IC2RecipeMap EXTRACTION = new IC2RecipeMap(1, 2, 1, 2, GT_ModHandler::getExtractorResult); + public static final IC2RecipeMap COMPRESSION = new IC2RecipeMap(1, 2, 1, 2, GT_ModHandler::getCompressorResult); + public static final RecyclerRecipeMap RECYCLING = new RecyclerRecipeMap(1, 2, 1, 2); + public static final ScannerRecipeMap SCANNING = new ScannerRecipeMap(1, 2, 1, 2); } diff --git a/src/main/java/gregtechmod/common/recipe/maps/IC2RecipeMap.java b/src/main/java/gregtechmod/common/recipe/maps/IC2RecipeMap.java index 8b9b9deb..07ef3335 100644 --- a/src/main/java/gregtechmod/common/recipe/maps/IC2RecipeMap.java +++ b/src/main/java/gregtechmod/common/recipe/maps/IC2RecipeMap.java @@ -2,17 +2,12 @@ import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.function.Supplier; +import java.util.function.Function; import gregtechmod.api.recipe.Recipe; import gregtechmod.api.util.GT_Utility; import gregtechmod.common.recipe.RecipeEntry; -import ic2.api.recipe.IRecipeInput; -import ic2.api.recipe.RecipeOutput; - import net.minecraft.item.ItemStack; /** A Recipe map for usual IC2 machines, used as adapter @@ -20,11 +15,11 @@ * */ public class IC2RecipeMap extends DummyRecipeMap { - private final Map recipeList; + private final Function> recipeGetter; - public IC2RecipeMap(int minInputs, int maxInputs, int minOutputs, int maxOutputs, Supplier> recipeMapGetter) { + public IC2RecipeMap(int minInputs, int maxInputs, int minOutputs, int maxOutputs, Function> recipeGetter) { super(minInputs, maxInputs, minOutputs, maxOutputs); - this.recipeList = recipeMapGetter.get(); + this.recipeGetter = recipeGetter; } @Override @@ -32,14 +27,13 @@ public Recipe findRecipe(List input) { for (ItemStack in : input) { if (GT_Utility.isStackValid(in)) { ItemStack inValid = in.copy(); - for (Entry e : recipeList.entrySet()) { - if (e.getKey().matches(inValid)) { - inValid.stackSize = e.getKey().getAmount(); - return new Recipe(0, 2, 400, false, - Collections.singleton(RecipeEntry.singleton(inValid)), - e.getValue().items, - Collections.emptyList()); - } + List results = recipeGetter.apply(inValid); + if (results != null && !results.isEmpty()) { + inValid.stackSize = in.stackSize - inValid.stackSize; + return new Recipe(0, 2, 200, false, + Collections.singleton(RecipeEntry.singleton(inValid)), + results, + Collections.emptyList()); } } } diff --git a/src/main/java/gregtechmod/common/recipe/maps/PulverizerRecipeMap.java b/src/main/java/gregtechmod/common/recipe/maps/PulverizerRecipeMap.java new file mode 100644 index 00000000..f2fa7998 --- /dev/null +++ b/src/main/java/gregtechmod/common/recipe/maps/PulverizerRecipeMap.java @@ -0,0 +1,129 @@ +package gregtechmod.common.recipe.maps; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map.Entry; +import java.util.Optional; +import java.util.Random; + +import gregtechmod.api.recipe.ChancedOutput; +import gregtechmod.api.recipe.Recipe; +import gregtechmod.api.recipe.RecipeMap; +import gregtechmod.api.util.GT_Utility; +import gregtechmod.common.recipe.ChancedStack; +import gregtechmod.common.recipe.RecipeEntry; +import gregtechmod.common.recipe.factory.SimpleRecipeFactory; + +import cpw.mods.fml.common.Loader; + +import net.minecraft.item.ItemStack; + +/** + * @author TheDarkDnKTv + * + */ +public class PulverizerRecipeMap extends RecipeMap { + + // Made NOT to spam with throwing exceptions every recipe check + public final static boolean RC = Loader.isModLoaded("Railcraft"), TE = Loader.isModLoaded("ThermalExpansion"); + + public PulverizerRecipeMap(int minInputs, int maxInputs, int minOutputs, int maxOutputs) { + super(minInputs, maxInputs, minOutputs, maxOutputs, new SimpleRecipeFactory()); + } + + @Override + public Recipe findRecipe(List inputs) { + Recipe result = super.findRecipe(inputs); + + for (int i = 0; i < inputs.size() && result == null; i++) { + ItemStack input = inputs.get(i); + if (GT_Utility.isStackValid(input)) { + input = input.copy(); + + if (RC) try { // RailCraft recipes + mods.railcraft.api.crafting.IRockCrusherRecipe recipe = mods.railcraft.api.crafting.RailcraftCraftingManager.rockCrusher.getRecipe(input); + if (recipe != null) { + input.stackSize = recipe.getInput().stackSize; + if (recipe.getPossibleOuputs().size() <= maxOutputs) { + List chanced = new ArrayList<>(); + List outputs = new ArrayList<>(); + + for (Entry e : recipe.getOutputs()) { + if (e.getValue() == 1.0F) { + outputs.add(e.getKey().copy()); + } else { + int chance = (int)(e.getValue() * 10000); // This weird thingy was invented to find duplicates and create PiecedStack + ChancedStack val = new ChancedStack(e.getKey(), chance == 0 ? 1 : chance); + Optional opt = chanced.stream().filter(a -> a.equals(val)).findFirst(); + if (opt.isPresent()) { + ChancedOutput listStack = opt.get(); + chanced.remove(listStack); + ItemStack total = val.getStack(); + total.stackSize += listStack.getStack().stackSize; + chanced.add(new PiecedChancedStack(total, listStack.getChance())); + } else chanced.add(val); + } + } + + return new Recipe(0, 32, 500, false, // 25 seconds per 32 EU/t will be total 16,000EU + Collections.singleton(RecipeEntry.singleton(input)), // In RC Recipe running 5 seconds and with consumption 160RF total 16,000RF = 64,000EU + outputs, + chanced); + } + } + } catch (Throwable e) {} + + try { // IC2 recipes + ItemStack copy2 = input.copy(); + ic2.api.recipe.RecipeOutput recipe = ic2.api.recipe.Recipes.macerator.getOutputFor(copy2, true); + if (recipe != null) { + input.stackSize = input.stackSize - copy2.stackSize; + return new Recipe(0, 2, 400, false, + Collections.singleton(RecipeEntry.singleton(input)), + GT_Utility.copy(recipe.items), + Collections.emptyList()); + } + } catch (Throwable e) {} + + if (TE) try { // ThermalExpansion recipes + cofh.thermalexpansion.api.crafting.recipes.IPulverizerRecipe recipe = cofh.thermalexpansion.util.crafting.PulverizerManager.getRecipe(input); + if (recipe != null) { + ItemStack secondary = recipe.getSecondaryOutput(); + input.stackSize = recipe.getInput().stackSize; + return new Recipe(0, 16, recipe.getEnergy() / 16, false, + Collections.singleton(RecipeEntry.singleton(input)), + Collections.singleton(recipe.getPrimaryOutput()), + secondary == null ? Collections.emptyList() : Collections.singleton(new ChancedStack(secondary, recipe.getSecondaryOutputChance() * 100))); + } + } catch(Throwable e) {} + } + } + + return result; + } + + /** + * Instead of ChancedStack will check chacne for every single item in stack + * @author TheDarkDnKTv + * + */ + private static class PiecedChancedStack extends ChancedStack { + + public PiecedChancedStack(ItemStack stack, int chance) { + super(stack, chance); + } + + @Override + public Optional get(Random random) { + ItemStack stack = this.getStack(); + int amount = stack.stackSize; + stack.stackSize = 0; + for (int i = 0; i < amount; i++) + if (random.nextInt(SimpleRecipeFactory.MAX_CHANCE) <= getChance()) + stack.stackSize++; + + return Optional.ofNullable(stack.stackSize > 0 ? stack : null); + } + } +} diff --git a/src/main/java/gregtechmod/common/recipe/maps/ScannerRecipeMap.java b/src/main/java/gregtechmod/common/recipe/maps/ScannerRecipeMap.java new file mode 100644 index 00000000..a4d5135b --- /dev/null +++ b/src/main/java/gregtechmod/common/recipe/maps/ScannerRecipeMap.java @@ -0,0 +1,51 @@ +package gregtechmod.common.recipe.maps; + +import java.util.Collections; +import java.util.List; + +import gregtechmod.api.enums.GT_Items; +import gregtechmod.api.recipe.Recipe; +import gregtechmod.api.util.GT_Utility; +import gregtechmod.common.recipe.RecipeEntry; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; + +/** + * @author TheDarkDnKTv + * + */ +public class ScannerRecipeMap extends DummyRecipeMap { + + public ScannerRecipeMap(int minInputs, int maxInputs, int minOutputs, int maxOutputs) { + super(minInputs, maxInputs, minOutputs, maxOutputs); + } + + @Override + public Recipe findRecipe(List inputs) { + for (int i = 0; i < inputs.size(); i++) { + ItemStack input = inputs.get(i); + if (GT_Utility.isStackValid(input) && GT_Items.IC2_Crop_Seeds.isStackEqual(input, true, true)) { + NBTTagCompound data = input.getTagCompound(); + if (data == null) return null; // May not work + int dur = 0, eut = 0; + if (data.getByte("scan") < 4) { + data.setByte("scan", (byte)4); + dur = 20; + eut = 500; + } else { + dur = 1; + eut = 1; + } + + ItemStack output = input.copy(); + output.setTagCompound(data); + return new Recipe(0, eut, dur, false, + Collections.singleton(RecipeEntry.singleton(input)), + Collections.singleton(output), + Collections.emptyList()); + } + } + + return null; + } +} diff --git a/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Microwave.java b/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Microwave.java index 4c1231b3..8baaa369 100644 --- a/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Microwave.java +++ b/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Microwave.java @@ -1,5 +1,6 @@ package gregtechmod.common.tileentities.machines.basic; +import java.util.Collections; import java.util.List; import java.util.UUID; @@ -13,8 +14,11 @@ import gregtechmod.api.metatileentity.MetaTileEntity; import gregtechmod.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; import gregtechmod.api.recipe.Recipe; +import gregtechmod.api.recipe.RecipeLogic; +import gregtechmod.api.recipe.RecipeMap; import gregtechmod.api.util.GT_ModHandler; import gregtechmod.api.util.GT_Utility; +import gregtechmod.common.recipe.RecipeEntry; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.init.Blocks; @@ -27,11 +31,11 @@ public class GT_MetaTileEntity_Microwave extends GT_MetaTileEntity_BasicMachine { - public GT_MetaTileEntity_Microwave(int aID, String mName, List recipeMap) { + public GT_MetaTileEntity_Microwave(int aID, String mName, RecipeMap recipeMap) { super(aID, mName, recipeMap); } - public GT_MetaTileEntity_Microwave(List recipeMap) { + public GT_MetaTileEntity_Microwave(RecipeMap recipeMap) { super(recipeMap); } @@ -46,50 +50,57 @@ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { } @Override - public void initRecipeLogic(List recipeMap) { - super.initRecipeLogic(recipeMap); - recipeLogic.setRecipeProvider(() -> { - ItemStack output = null; - if (GT_Utility.isStackValid(mInventory[2]) && (output = checkForExlosion()) != null) { - if (TileEntityFurnace.getItemBurnTime(mInventory[2]) > 0 || TileEntityFurnace.getItemBurnTime(output) > 0) { - mInventory[2] = null; - getBaseMetaTileEntity().setOnFire(); - } else { - ItemStack input = mInventory[2].copy(); - input.stackSize = 1; - return new Recipe(input, null, output, null, null, null, 25, 4, 0, false); + public void initRecipeLogic(RecipeMap recipeMap) { + recipeLogic = new RecipeLogic(recipeMap, this) { + @Override + protected Recipe findRecipe() { + ItemStack output = null; + + List inputs = getInputItems(); + for (int i = 0; i < inputs.size(); i++) { + ItemStack input = inputs.get(i); + if (GT_Utility.isStackValid(input) && (output = checkForExlosion(input, i)) != null) { + if (TileEntityFurnace.getItemBurnTime(input) > 0 || TileEntityFurnace.getItemBurnTime(output) > 0) { + inputs.set(i, null); + getBaseMetaTileEntity().setOnFire(); + } else { + ItemStack input1 = input.copy(); + input1.stackSize = 1; + return new Recipe(0, 4, 25, false, + Collections.singleton(RecipeEntry.singleton(input1)), + Collections.singleton(output.copy()), + Collections.emptyList()); + } + } } + + return null; } - - return null; - }); + }; } - private ItemStack checkForExlosion() { - ItemStack tOutput = GT_ModHandler.getSmeltingOutput(mInventory[2], false, mInventory[3]); - if (mInventory[2].getItem() == GT_Items.Spray_CFoam.getItem() || - GT_Utility.areStacksEqual(mInventory[2], GT_ModHandler.getIC2Item("constructionFoamSprayer", 1, GregTech_API.ITEM_WILDCARD_DAMAGE)) || - GT_Utility.areStacksEqual(mInventory[2], GT_ModHandler.getIC2Item("constructionFoam", 1, GregTech_API.ITEM_WILDCARD_DAMAGE)) || - GT_Utility.areStacksEqual(mInventory[2], GT_ModHandler.getIC2Item("CFCell", 1))) { -// mInventory[2] = null; -// getBaseMetaTileEntity().doExplosion(128); // FIXME get filled sprayer + private ItemStack checkForExlosion(ItemStack input, int inIdx) { + ItemStack tOutput = GT_ModHandler.getSmeltingOutput(input, false, null); + if (input.getItem() == GT_Items.Spray_CFoam.getItem() || + GT_Utility.areStacksEqual(input, GT_ModHandler.getIC2Item("constructionFoamSprayer", 1, GregTech_API.ITEM_WILDCARD_DAMAGE)) || + GT_Utility.areStacksEqual(input, GT_ModHandler.getIC2Item("constructionFoam", 1, GregTech_API.ITEM_WILDCARD_DAMAGE)) || + GT_Utility.areStacksEqual(input, GT_ModHandler.getIC2Item("CFCell", 1))) { + IGregTechTileEntity ent = getBaseMetaTileEntity(); + getInputItems().set(inIdx, null); + ent.doExplosion(128); try { ItemStack foamSprayer = GT_ModHandler.getIC2Item("constructionFoamSprayer", 1, new ItemStack(Blocks.sponge, 1)); NBTTagCompound data = new NBTTagCompound(); NBTTagCompound fluid = new NBTTagCompound(); - fluid.setInteger("Amount", 10000); - fluid.setString("Fluid", "ic2constructionfoam"); + fluid.setInteger("Amount", 32000); + fluid.setString("FluidName", "ic2constructionfoam"); data.setTag("Fluid", fluid); foamSprayer.setTagCompound(data); - - - for (int i = 0; i < 6; i++) { - foamSprayer.getItem().onItemUse(foamSprayer, new FakePlayer((WorldServer) getBaseMetaTileEntity().getWorld(), new GameProfile(UUID.randomUUID(),"Foo")), - getBaseMetaTileEntity().getWorld(), - getBaseMetaTileEntity().getXCoord(), - getBaseMetaTileEntity().getYCoord(), - getBaseMetaTileEntity().getZCoord(), i, 0, 0, 0); + foamSprayer.getItem().onItemUse(foamSprayer, new FakePlayer((WorldServer) ent.getWorld(), new GameProfile(UUID.randomUUID(),"Foo")), ent.getWorld(), + ent.getXCoord(), + ent.getYCoord(), + ent.getZCoord(), i, 0, 0, 0); } } catch (Throwable e) { e.printStackTrace(); @@ -97,15 +108,15 @@ private ItemStack checkForExlosion() { return null; } else { - if (OrePrefixes.ingot.contains(mInventory[2]) + if (OrePrefixes.ingot.contains(input) || OrePrefixes.ingot.contains(tOutput) - || Materials.Netherrack.contains(mInventory[2]) - || Materials.Gunpowder.contains(mInventory[2]) + || Materials.Netherrack.contains(input) + || Materials.Gunpowder.contains(input) || Materials.Gunpowder.contains(tOutput) - || mInventory[2].isItemEqual(new ItemStack(Blocks.netherrack)) - || mInventory[2].getItem() == Items.egg) { + || input.isItemEqual(new ItemStack(Blocks.netherrack)) + || input.getItem() == Items.egg) { - mInventory[2] = null; + getInputItems().set(inIdx, null); getBaseMetaTileEntity().doExplosion(128); return null; } diff --git a/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Pulverizer.java b/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Pulverizer.java index fb5d3f65..3465bd0d 100644 --- a/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Pulverizer.java +++ b/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Pulverizer.java @@ -5,17 +5,18 @@ import gregtechmod.api.interfaces.IGregTechTileEntity; import gregtechmod.api.metatileentity.MetaTileEntity; import gregtechmod.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtechmod.api.recipe.Recipe; - +import gregtechmod.api.recipe.RecipeMap; +import gregtechmod.api.util.ListAdapter; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; public class GT_MetaTileEntity_Pulverizer extends GT_MetaTileEntity_BasicMachine { - public GT_MetaTileEntity_Pulverizer(int aID, String mName, List recipeMap) { + public GT_MetaTileEntity_Pulverizer(int aID, String mName, RecipeMap recipeMap) { super(aID, mName, recipeMap); } - public GT_MetaTileEntity_Pulverizer(List recipeMap) { + public GT_MetaTileEntity_Pulverizer(RecipeMap recipeMap) { super(recipeMap); } @@ -27,82 +28,32 @@ public GT_MetaTileEntity_Pulverizer(List recipeMap) { public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { return new GT_MetaTileEntity_Pulverizer(recipeLogic.recipeMap); } - - public void checkRecipe() { // TODO register new recipe map with pulv recipes & chanded output -// if (mInventory[2] != null) { -// if (mInventory[3] == null && mInventory[4] == null) { -// if (mInventory[2].isItemEqual(new ItemStack(Blocks.gravel, 1))) { -// Object tObject = GT_ModHandler.getPulverizerRecipe(mInventory[2]); -// try { -// if (tObject instanceof GT_PulverizerRecipe) { -// GT_PulverizerRecipe tRecipe = (GT_PulverizerRecipe)tObject; -// if (tRecipe != null && tRecipe.getInput().stackSize <= mInventory[2].stackSize) { -// if ((mOutputItem1 = tRecipe.getPrimaryOutput()) != null) { -// if (getBaseMetaTileEntity().getRandomNumber(100) < tRecipe.getSecondaryOutputChance()) { -// mOutputItem2 = tRecipe.getSecondaryOutput(); -// } -// mInventory[2].stackSize-=tRecipe.getInput().stackSize; -// mMaxProgresstime = 300*tRecipe.getInput().stackSize; -// mEUt = 3; -// return; -// } -// } -// } else { -// IPulverizerRecipe tRecipe = (IPulverizerRecipe)tObject; -// if (tRecipe != null && tRecipe.getInput().stackSize <= mInventory[2].stackSize) { -// if ((mOutputItem1 = tRecipe.getPrimaryOutput()) != null) { -// if (getBaseMetaTileEntity().getRandomNumber(100) < tRecipe.getSecondaryOutputChance()) { -// mOutputItem2 = tRecipe.getSecondaryOutput(); -// } -// mInventory[2].stackSize-=tRecipe.getInput().stackSize; -// mMaxProgresstime = 300*tRecipe.getInput().stackSize; -// mEUt = 3; -// return; -// } -// } -// } -// } catch(Throwable e) {if (GregTech_API.DEBUG_MODE) GT_Log.log.catching(e);} -// } -// try { -// for (ItemStack tOutput : mods.railcraft.api.crafting.RailcraftCraftingManager.rockCrusher.getRecipe(mInventory[2]).getRandomizedOuputs()) { -// if (tOutput != null) { -// if (mOutputItem1 == null) { -// mOutputItem1 = GT_Utility.copy(tOutput); -// continue; -// } -// if (GT_Utility.areStacksEqual(mOutputItem1, tOutput)) { -// mOutputItem1.stackSize += tOutput.stackSize; -// continue; -// } -// if (mOutputItem2 == null) { -// mOutputItem2 = GT_Utility.copy(tOutput); -// continue; -// } -// if (GT_Utility.areStacksEqual(mOutputItem2, tOutput)) { -// mOutputItem2.stackSize += tOutput.stackSize; -// continue; -// } -// } -// } -// if (mOutputItem1 != null) { -// mInventory[2].stackSize--; -// mMaxProgresstime = 300; -// mEUt = 4; -// return; -// } -// } catch(Throwable e) {if (GregTech_API.DEBUG_MODE) GT_Log.log.catching(e);} -// if (null != (mOutputItem1 = GT_ModHandler.getMaceratorOutput(mInventory[2], true, mInventory[3]))) { -// mOutputItem2 = null; -// mMaxProgresstime = 400; -// mEUt = 2; -// return; -// } -// } else { -// bOutputBlocked = true; -// } -// } - } + @Override + public List getInputItems() { + return new ListAdapter<>(mInventory, 1, 2); + } + + @Override + public List getOutputItems() { + return new ListAdapter<>(mInventory, 3, 6); + } + + @Override + public boolean allowPullStack(int aIndex, byte aSide, ItemStack aStack) { + return aSide!=mMainFacing?aIndex>=3||aIndex<8:false; + } + + @Override + public int getInvSize() { + return 8; + } + + @Override + public int dechargerSlotStartIndex() { + return 7; + } + @Override public int getFrontFacingInactive() { return 256; diff --git a/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java b/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java index 83be532b..ab2dca51 100644 --- a/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java +++ b/src/main/java/gregtechmod/common/tileentities/machines/basic/GT_MetaTileEntity_Scanner.java @@ -1,26 +1,23 @@ package gregtechmod.common.tileentities.machines.basic; -import java.util.List; - import gregtechmod.api.GregTech_API; import gregtechmod.api.enums.GT_Items; import gregtechmod.api.interfaces.IGregTechTileEntity; import gregtechmod.api.metatileentity.MetaTileEntity; import gregtechmod.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; -import gregtechmod.api.recipe.Recipe; -import gregtechmod.api.recipe.RecipeLogic; +import gregtechmod.api.recipe.RecipeMap; import gregtechmod.api.util.GT_Utility; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; -import net.minecraft.nbt.NBTTagCompound; public class GT_MetaTileEntity_Scanner extends GT_MetaTileEntity_BasicMachine { - public GT_MetaTileEntity_Scanner(int aID, String aName, List recipeMap) { + public GT_MetaTileEntity_Scanner(int aID, String aName, RecipeMap recipeMap) { super(aID, aName, recipeMap); } - public GT_MetaTileEntity_Scanner(List recipeMap) { + public GT_MetaTileEntity_Scanner(RecipeMap recipeMap) { super(recipeMap); } @@ -36,39 +33,6 @@ public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) { return new GT_MetaTileEntity_Scanner(recipeLogic.recipeMap); } - @Override - public void initRecipeLogic(List recipeMap) { - recipeLogic = new RecipeLogic(recipeMap, this) { - @Override - protected void moveItems() { - GT_Utility.moveStackFromSlotAToSlotB(getBaseMetaTileEntity(), getBaseMetaTileEntity(), 3, 4, (byte)64, (byte)1, (byte)64, (byte)1); - } - - @Override - protected Recipe findRecipe() { - if (GT_Utility.isStackValid(mInventory[1]) && GT_Items.IC2_Crop_Seeds.isStackEqual(mInventory[1], true, true)) { - NBTTagCompound data = mInventory[1].getTagCompound(); - if (data == null) return null; // May not work - int dur = 0, eut = 0; - if (data.getByte("scan") < 4) { - data.setByte("scan", (byte)4); - dur = 20; - eut = 500; - } else { - dur = 1; - eut = 1; - } - - ItemStack output = mInventory[1].copy(); - output.setTagCompound(data); - return new Recipe(mInventory[1].copy(), null, output, null, null, null, dur, eut, 0, false); - } - - return null; - } - }; - } - public boolean allowPutStack(int aIndex, byte aSide, ItemStack aStack) { return super.allowPutStack(aIndex, aSide, aStack) && GT_Items.IC2_Crop_Seeds.isStackEqual(aStack, true, true); } diff --git a/src/main/java/gregtechmod/loaders/preload/GT_MetaTileEntityLoader.java b/src/main/java/gregtechmod/loaders/preload/GT_MetaTileEntityLoader.java index 0bd833f4..ad607634 100644 --- a/src/main/java/gregtechmod/loaders/preload/GT_MetaTileEntityLoader.java +++ b/src/main/java/gregtechmod/loaders/preload/GT_MetaTileEntityLoader.java @@ -1,7 +1,5 @@ package gregtechmod.loaders.preload; -import java.util.Collections; - import gregtechmod.api.enums.GT_Items; import gregtechmod.api.enums.Materials; import gregtechmod.api.enums.OrePrefixes; @@ -74,8 +72,8 @@ public void run() { new GT_MetaTileEntity_Assembler ( 60, "GT_Assembler" , RecipeMaps.ASSEMBLING); new GT_MetaTileEntity_Printer ( 61, "GT_Printer" , RecipeMaps.PRINTER); new GT_MetaTileEntity_Centrifuge ( 62, "GT_Centrifuge"); -// new GT_MetaTileEntity_Microwave ( 63, "GT_Microwave" , Collections.emptyList()); // TODO custom recipes -// new GT_MetaTileEntity_Pulverizer ( 64, "GT_Pulverizer" , Collections.emptyList()); // TODO custom recipes + new GT_MetaTileEntity_Microwave ( 63, "GT_Microwave" , null); + new GT_MetaTileEntity_Pulverizer ( 64, "GT_Pulverizer" , RecipeMaps.PULVERIZING); new GT_MetaTileEntity_RedstoneLamp ( 65, "GT_RedstoneLamp"); new GT_MetaTileEntity_RedstoneNoteBlock ( 66, "GT_RedstoneNoteBlock"); new GT_MetaTileEntity_RedstoneButtonPanel ( 67, "GT_RedstoneButtonPanel"); @@ -124,7 +122,7 @@ public void run() { new GT_MetaTileEntity_Lathe (111, "GT_Lathe" , RecipeMaps.LATHE); new GT_MetaTileEntity_AdvancedCraftingTable (112, "GT_ProjectTable"); new GT_MetaTileEntity_PlateCutter (113, "GT_Cutter" , RecipeMaps.CUTTING); -// new GT_MetaTileEntity_Scanner (114, "GT_Scanner" , Collections.emptyList()); // TODO custom recipes + new GT_MetaTileEntity_Scanner (114, "GT_Scanner" , RecipeMaps.SCANNING); new GT_MetaTileEntity_Extruder (115, "GT_Extruder" , RecipeMaps.EXTRUDING); new GT_MetaTileEntity_ElectricRetrieverAdvanced (116, "GT_RetrieverAdvanced"); diff --git a/src/main/resources/assets/gregtech_addon/textures/gui/Macerator.png b/src/main/resources/assets/gregtech_addon/textures/gui/Macerator.png index fa37877c..b27a9503 100644 Binary files a/src/main/resources/assets/gregtech_addon/textures/gui/Macerator.png and b/src/main/resources/assets/gregtech_addon/textures/gui/Macerator.png differ