diff --git a/src/main/java/com/uncreativebunch/magicmod/block/entity/MagicalCrafterBlockEntity.java b/src/main/java/com/uncreativebunch/magicmod/block/entity/MagicalCrafterBlockEntity.java index 257bc4b..a01f6aa 100644 --- a/src/main/java/com/uncreativebunch/magicmod/block/entity/MagicalCrafterBlockEntity.java +++ b/src/main/java/com/uncreativebunch/magicmod/block/entity/MagicalCrafterBlockEntity.java @@ -1,5 +1,6 @@ package com.uncreativebunch.magicmod.block.entity; +import com.uncreativebunch.magicmod.inventory.InputInventory; import com.uncreativebunch.magicmod.inventory.OutputInventory; import com.uncreativebunch.magicmod.recipe.MagicShapedInput; import com.uncreativebunch.magicmod.recipe.ModRecipeTypes; @@ -9,7 +10,6 @@ import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.SimpleInventory; import net.minecraft.recipe.RecipeEntry; import net.minecraft.recipe.ServerRecipeManager; import net.minecraft.screen.NamedScreenHandlerFactory; @@ -27,7 +27,7 @@ public class MagicalCrafterBlockEntity extends BlockEntity implements NamedScree /** * The input inventory for crafting ingredients. It goes in the order core, material, and grip. */ - private final SimpleInventory inputInventory = new SimpleInventory(3); + private final InputInventory inputInventory = new InputInventory(3); /** * The output inventory for crafting ingredients. */ @@ -40,9 +40,9 @@ public class MagicalCrafterBlockEntity extends BlockEntity implements NamedScree /** * Gets the input inventory for this block entity. - * @return A {@link SimpleInventory} that represents the input inventory. + * @return A {@link InputInventory} that represents the input inventory. */ - public SimpleInventory getInputInventory() { return inputInventory; } + public InputInventory getInputInventory() { return inputInventory; } /** * Gets the output inventory for this block entity. diff --git a/src/main/java/com/uncreativebunch/magicmod/inventory/InputInventory.java b/src/main/java/com/uncreativebunch/magicmod/inventory/InputInventory.java new file mode 100644 index 0000000..cc00bea --- /dev/null +++ b/src/main/java/com/uncreativebunch/magicmod/inventory/InputInventory.java @@ -0,0 +1,24 @@ +package com.uncreativebunch.magicmod.inventory; + +import net.minecraft.inventory.SimpleInventory; +import net.minecraft.item.ItemStack; + +public class InputInventory extends SimpleInventory { + public InputInventory(int size) { + super(size); + } + + @Override + public boolean canInsert(ItemStack stack) { + return true; + } + + /** + * Executes basic crafting logic and decrements all input stacks. + */ + public void onCrafted() { + for (var stack : this) { + stack.decrement(1); + } + } +} diff --git a/src/main/java/com/uncreativebunch/magicmod/screen/MagicResultSlot.java b/src/main/java/com/uncreativebunch/magicmod/screen/MagicResultSlot.java new file mode 100644 index 0000000..ca3ba49 --- /dev/null +++ b/src/main/java/com/uncreativebunch/magicmod/screen/MagicResultSlot.java @@ -0,0 +1,42 @@ +package com.uncreativebunch.magicmod.screen; + +import com.uncreativebunch.magicmod.inventory.InputInventory; +import net.minecraft.entity.player.PlayerEntity; +import net.minecraft.inventory.Inventory; +import net.minecraft.item.ItemStack; +import net.minecraft.screen.slot.Slot; + +public class MagicResultSlot extends Slot { + /** + * The crafting input inventory. There is not a current need for custom logic, but this may come in the future. + */ + protected InputInventory inputInventory; + + public MagicResultSlot(InputInventory inputInventory, Inventory outputInventory, int index, int x, int y) { + super(outputInventory, index, x, y); + this.inputInventory = inputInventory; + } + + /** + * Runs when the player takes the item out of the slot. + * This slot will run the crafting logic of the {@link InputInventory}. + * @param player The player that took the item. + * @param stack The item that was taken. + */ + @Override + public void onTakeItem(PlayerEntity player, ItemStack stack) { + this.inputInventory.onCrafted(); + + super.onTakeItem(player, stack); + } + + /** + * Returns false, as the result slot does not allow items to be inserted. + * @param stack The item to insert. + * @return False. + */ + @Override + public boolean canInsert(ItemStack stack) { + return false; + } +} diff --git a/src/main/java/com/uncreativebunch/magicmod/screen/MagicalCraftingScreenHandler.java b/src/main/java/com/uncreativebunch/magicmod/screen/MagicalCraftingScreenHandler.java index a2e2805..e2ad680 100644 --- a/src/main/java/com/uncreativebunch/magicmod/screen/MagicalCraftingScreenHandler.java +++ b/src/main/java/com/uncreativebunch/magicmod/screen/MagicalCraftingScreenHandler.java @@ -1,18 +1,16 @@ package com.uncreativebunch.magicmod.screen; +import com.uncreativebunch.magicmod.inventory.InputInventory; import com.uncreativebunch.magicmod.inventory.OutputInventory; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.inventory.SimpleInventory; import net.minecraft.item.ItemStack; import net.minecraft.screen.ScreenHandler; -import net.minecraft.screen.ScreenHandlerContext; import net.minecraft.screen.slot.Slot; public class MagicalCraftingScreenHandler extends ScreenHandler { - private final SimpleInventory inputInventory; + private final InputInventory inputInventory; private final OutputInventory outputInventory; /** @@ -21,7 +19,7 @@ public class MagicalCraftingScreenHandler extends ScreenHandler { * @param playerInventory The player's inventory. */ public MagicalCraftingScreenHandler(int syncId, PlayerInventory playerInventory) { - this(syncId, playerInventory, new SimpleInventory(3), new OutputInventory(1)); + this(syncId, playerInventory, new InputInventory(3), new OutputInventory(1)); } /** @@ -29,9 +27,10 @@ public class MagicalCraftingScreenHandler extends ScreenHandler { * It handles creating the inventory slots and syncs all information from the server to the client. * @param syncId The sync ID that's sent from the server. * @param playerInventory The player's inventory. - * @param screenHandlerContext The context of the screen handler. Not sure if this is needed anymore. + * @param inputInventory The crafting inventory. + * @param outputInventory The output inventory. */ - public MagicalCraftingScreenHandler(int syncId, PlayerInventory playerInventory, SimpleInventory inputInventory, + public MagicalCraftingScreenHandler(int syncId, PlayerInventory playerInventory, InputInventory inputInventory, OutputInventory outputInventory) { super(ModScreenHandlers.MAGICAL_CRAFTING_SCREEN_HANDLER, syncId); this.inputInventory = inputInventory; @@ -43,6 +42,7 @@ public class MagicalCraftingScreenHandler extends ScreenHandler { // Ensure that the inventory's custom logic runs (if any) inputInventory.onOpen(playerInventory.player); + outputInventory.onOpen(playerInventory.player); // Place all inventory slots within the screen. This piece doesn't actually render the background of the slots, // as this is handled by the client-side application (the Screen), but it does tell the screen where to render. @@ -55,7 +55,7 @@ public class MagicalCraftingScreenHandler extends ScreenHandler { } // TODO I don't actually know where the output slot should be located. Get correct coords. - this.addSlot(new Slot(outputInventory, 0, 80, 35)); + this.addSlot(new MagicResultSlot(inputInventory, outputInventory, 0, 80, 35)); // Add all player inventory slots. Start with the main inventory, then the hotbar. for (m = 0; m < 3; m++) {