diff --git a/block/crafting/BlockCraftingStorage.java b/block/crafting/BlockCraftingStorage.java index a17ea822..af67349d 100644 --- a/block/crafting/BlockCraftingStorage.java +++ b/block/crafting/BlockCraftingStorage.java @@ -17,6 +17,12 @@ public class BlockCraftingStorage extends BlockCraftingUnit setTileEntiy( TileCraftingStorageTile.class ); } + @Override + public Class getItemBlockClass() + { + return ItemCraftingStorage.class; + } + @Override public String getUnlocalizedName(ItemStack is) { diff --git a/block/crafting/ItemCraftingStorage.java b/block/crafting/ItemCraftingStorage.java new file mode 100644 index 00000000..df5f180e --- /dev/null +++ b/block/crafting/ItemCraftingStorage.java @@ -0,0 +1,29 @@ +package appeng.block.crafting; + +import net.minecraft.block.Block; +import net.minecraft.item.ItemStack; +import appeng.api.AEApi; +import appeng.block.AEBaseItemBlock; +import appeng.core.AEConfig; +import appeng.core.features.AEFeature; + +public class ItemCraftingStorage extends AEBaseItemBlock +{ + + public ItemCraftingStorage(Block id) { + super( id ); + } + + @Override + public boolean hasContainerItem() + { + return AEConfig.instance.isFeatureEnabled( AEFeature.enableDisassemblyCrafting ); + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + return AEApi.instance().blocks().blockCraftingUnit.stack( 1 ); + } + +} diff --git a/core/Registration.java b/core/Registration.java index 7b2ed1ae..af09d9e5 100644 --- a/core/Registration.java +++ b/core/Registration.java @@ -139,6 +139,7 @@ import appeng.me.storage.AEExternalHandler; import appeng.parts.PartPlacement; import appeng.recipes.AEItemResolver; import appeng.recipes.RecipeHandler; +import appeng.recipes.game.DisassembleRecipe; import appeng.recipes.game.FacadeRecipe; import appeng.recipes.game.ShapedRecipe; import appeng.recipes.game.ShapelessRecipe; @@ -562,6 +563,9 @@ public class Registration recipeHandler.injectRecipes(); + if ( AEConfig.instance.isFeatureEnabled( AEFeature.enableDisassemblyCrafting ) ) + CraftingManager.getInstance().getRecipeList().add( new DisassembleRecipe() ); + if ( AEConfig.instance.isFeatureEnabled( AEFeature.enableFacadeCrafting ) ) CraftingManager.getInstance().getRecipeList().add( new FacadeRecipe() ); } diff --git a/core/features/AEFeature.java b/core/features/AEFeature.java index 3a95a1ed..3ec29d16 100644 --- a/core/features/AEFeature.java +++ b/core/features/AEFeature.java @@ -52,7 +52,9 @@ public enum AEFeature enableFacadeCrafting("Crafting"), inWorldSingularity("Crafting"), inWorldFluix("Crafting"), inWorldPurification("Crafting"), UpdateLogging("Misc", false), - AlphaPass("Rendering"), PaintBalls("Tools"), PacketLogging("Misc", false), CraftingLog("Misc", false), InterfaceTerminal("Crafting"), LightDetector("Misc"); + AlphaPass("Rendering"), PaintBalls("Tools"), PacketLogging("Misc", false), CraftingLog("Misc", false), InterfaceTerminal("Crafting"), LightDetector("Misc"), + + enableDisassemblyCrafting("Crafting"); String Category; boolean visible = true; diff --git a/items/storage/ItemBasicStorageCell.java b/items/storage/ItemBasicStorageCell.java index b613fc6d..3ec5cfda 100644 --- a/items/storage/ItemBasicStorageCell.java +++ b/items/storage/ItemBasicStorageCell.java @@ -20,6 +20,7 @@ import appeng.api.storage.IMEInventory; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; +import appeng.core.AEConfig; import appeng.core.features.AEFeature; import appeng.core.localization.GuiText; import appeng.items.AEBaseItem; @@ -226,4 +227,17 @@ public class ItemBasicStorageCell extends AEBaseItem implements IStorageCell, II { return dissassembleDrive( stack, world, player ); } + + @Override + public boolean hasContainerItem() + { + return AEConfig.instance.isFeatureEnabled( AEFeature.enableDisassemblyCrafting ); + } + + @Override + public ItemStack getContainerItem(ItemStack itemStack) + { + return AEApi.instance().materials().materialEmptyStorageCell.stack( 1 ); + } + } diff --git a/recipes/game/DisassembleRecipe.java b/recipes/game/DisassembleRecipe.java new file mode 100644 index 00000000..2ec0192b --- /dev/null +++ b/recipes/game/DisassembleRecipe.java @@ -0,0 +1,106 @@ +package appeng.recipes.game; + +import net.minecraft.inventory.InventoryCrafting; +import net.minecraft.item.ItemStack; +import net.minecraft.item.crafting.IRecipe; +import net.minecraft.world.World; +import appeng.api.AEApi; +import appeng.api.definitions.Blocks; +import appeng.api.definitions.Items; +import appeng.api.definitions.Materials; +import appeng.api.storage.IMEInventory; +import appeng.api.storage.StorageChannel; +import appeng.api.storage.data.IAEItemStack; +import appeng.api.storage.data.IItemList; + +public class DisassembleRecipe implements IRecipe +{ + + private Materials mats = AEApi.instance().materials(); + private Items items = AEApi.instance().items(); + private Blocks blks = AEApi.instance().blocks(); + + private ItemStack getOutput(InventoryCrafting inv, boolean createFacade) + { + ItemStack hasCell = null; + + for (int x = 0; x < inv.getSizeInventory(); x++) + { + ItemStack is = inv.getStackInSlot( x ); + if ( is != null ) + { + if ( hasCell != null ) + return null; + + if ( items.itemCell1k.sameAsStack( is ) ) + hasCell = mats.materialCell1kPart.stack( 1 ); + + if ( items.itemCell4k.sameAsStack( is ) ) + hasCell = mats.materialCell4kPart.stack( 1 ); + + if ( items.itemCell16k.sameAsStack( is ) ) + hasCell = mats.materialCell16kPart.stack( 1 ); + + if ( items.itemCell64k.sameAsStack( is ) ) + hasCell = mats.materialCell64kPart.stack( 1 ); + + // make sure the storage cell is empty... + if ( hasCell != null ) + { + IMEInventory cellInv = AEApi.instance().registries().cell().getCellInventory( is, null, StorageChannel.ITEMS ); + if ( cellInv != null ) + { + IItemList list = cellInv.getAvailableItems( StorageChannel.ITEMS.createList() ); + if ( !list.isEmpty() ) + return null; + } + } + + if ( items.itemEncodedPattern.sameAsStack( is ) ) + hasCell = mats.materialBlankPattern.stack( 1 ); + + if ( blks.blockCraftingStorage1k.sameAsStack( is ) ) + hasCell = mats.materialCell1kPart.stack( 1 ); + + if ( blks.blockCraftingStorage4k.sameAsStack( is ) ) + hasCell = mats.materialCell4kPart.stack( 1 ); + + if ( blks.blockCraftingStorage16k.sameAsStack( is ) ) + hasCell = mats.materialCell16kPart.stack( 1 ); + + if ( blks.blockCraftingStorage64k.sameAsStack( is ) ) + hasCell = mats.materialCell64kPart.stack( 1 ); + + if ( hasCell == null ) + return null; + } + } + + return hasCell; + } + + @Override + public boolean matches(InventoryCrafting inv, World w) + { + return getOutput( inv, false ) != null; + } + + @Override + public ItemStack getCraftingResult(InventoryCrafting inv) + { + return getOutput( inv, true ); + } + + @Override + public int getRecipeSize() + { + return 1; + } + + @Override + public ItemStack getRecipeOutput() // no default output.. + { + return null; + } + +} \ No newline at end of file