diff --git a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java index 345412b8..2521d2ab 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java +++ b/src/main/java/com/minelittlepony/unicopia/container/SpellbookScreenHandler.java @@ -70,9 +70,9 @@ public class SpellbookScreenHandler extends ScreenHandler { inventory = inv; this.context = context; - List grid = new ArrayList<>(); - List gemPos = new ArrayList<>(); - SpellbookCraftingGrid.createGrid(grid, gemPos); + List grid = new ArrayList<>(); + List gemPos = new ArrayList<>(); + HexagonalCraftingGrid.create(34, 65, 3, grid, gemPos); MAX_INGREDIENTS = grid.size(); GEM_SLOT_INDEX = MAX_INGREDIENTS; diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/HexagonalCraftingGrid.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/HexagonalCraftingGrid.java new file mode 100644 index 00000000..5a4aeaee --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/HexagonalCraftingGrid.java @@ -0,0 +1,57 @@ +package com.minelittlepony.unicopia.container.inventory; + +import java.util.List; + +public interface HexagonalCraftingGrid { + int SPACING = 23; + + /** + * Creates a hexagonal crafting grid. + * @param grid Output for normal slot positions. + * @param gemPos Output for the gem slot position. + */ + static void create(int top, int left, int rings, List grid, List gemPos) { + rings++; + + final int ROWS = (rings * 2) - 1; + final int INFLECTION_POINT = ROWS / 2; + + int cols = rings; + + for (int y = 0; y < ROWS; y++) { + for (int x = 0; x < cols; x++) { + (y == 3 && x == 3 ? gemPos : grid).add(new Slot( + left + (x * SPACING), + top, + getWeight(x, y, cols, ROWS) + )); + } + + int change = y >= INFLECTION_POINT ? -1 : 1; + + top += SPACING * 0.9; + left -= (SPACING / 2) * change; + cols += change; + } + } + + static float getWeight(int x, int y, int cols, int rows) { + if (y == 3 && x == 3) { + return SpellbookSlot.CENTER_FACTOR; + } + + if (y == 0 || y == (rows - 1) || x == 0 || x == (cols - 1)) { + return SpellbookSlot.FAR_FACTOR; + } + if (y == 1 || y == (rows - 2) || x == 1 || x == (cols - 2)) { + return SpellbookSlot.MIDDLE_FACTOR; + } + return SpellbookSlot.NEAR_FACTOR; + } + + record Slot ( + int left, + int top, + float weight + ) {} +} diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/IngredientSlot.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/IngredientSlot.java index 840ce603..337becd0 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/IngredientSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/IngredientSlot.java @@ -8,12 +8,12 @@ import net.minecraft.screen.slot.Slot; public class IngredientSlot extends Slot implements SpellbookSlot { private final SpellbookScreenHandler handler; - private final int ring; + private final float weight; - public IngredientSlot(SpellbookScreenHandler handler, Inventory inventory, int index, int[] params) { - super(inventory, index, params[0], params[1]); + public IngredientSlot(SpellbookScreenHandler handler, Inventory inventory, int index, HexagonalCraftingGrid.Slot params) { + super(inventory, index, params.left(), params.top()); this.handler = handler; - ring = params[2]; + weight = params.weight(); } @Override @@ -27,8 +27,8 @@ public class IngredientSlot extends Slot implements SpellbookSlot { } @Override - public int getRing() { - return ring; + public float getWeight() { + return weight; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/InputSlot.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/InputSlot.java index d7939afd..6d0f9e4c 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/InputSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/InputSlot.java @@ -7,12 +7,12 @@ import net.minecraft.screen.slot.Slot; public class InputSlot extends Slot implements SpellbookSlot { private final SpellbookScreenHandler handler; - private final int ring; + private final float weight; - public InputSlot(SpellbookScreenHandler handler, Inventory inventory, int index, int[] params) { - super(inventory, index, params[0], params[1]); + public InputSlot(SpellbookScreenHandler handler, Inventory inventory, int index, HexagonalCraftingGrid.Slot params) { + super(inventory, index, params.left(), params.top()); this.handler = handler; - this.ring = params[2]; + this.weight = params.weight(); } @Override @@ -21,8 +21,8 @@ public class InputSlot extends Slot implements SpellbookSlot { } @Override - public int getRing() { - return ring; + public float getWeight() { + return weight; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/InventorySlot.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/InventorySlot.java index 8531b3ff..2aa68b12 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/InventorySlot.java +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/InventorySlot.java @@ -13,11 +13,6 @@ public class InventorySlot extends Slot implements SpellbookSlot { this.handler = handler; } - @Override - public int getRing() { - return 0; - } - @Override public boolean isEnabled() { return handler.canShowSlots.test(SlotType.INVENTORY); diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/OutputSlot.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/OutputSlot.java index 5847f96b..766cbdaa 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/OutputSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/OutputSlot.java @@ -19,14 +19,14 @@ public class OutputSlot extends CraftingResultSlot implements SpellbookSlot { private final PlayerEntity player; private final SpellbookInventory input; - private final int ring; + private final float weight; - public OutputSlot(SpellbookScreenHandler spellbookScreenHandler, PlayerEntity player, SpellbookInventory input, Inventory inventory, int index, int[] params) { - super(player, input, inventory, index, params[0], params[1]); + public OutputSlot(SpellbookScreenHandler spellbookScreenHandler, PlayerEntity player, SpellbookInventory input, Inventory inventory, int index, HexagonalCraftingGrid.Slot params) { + super(player, input, inventory, index, params.left(), params.top()); handler = spellbookScreenHandler; this.player = player; this.input = input; - this.ring = params[2]; + this.weight = params.weight(); } @Override @@ -40,8 +40,8 @@ public class OutputSlot extends CraftingResultSlot implements SpellbookSlot { } @Override - public int getRing() { - return ring; + public float getWeight() { + return weight; } @Override diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookCraftingGrid.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookCraftingGrid.java deleted file mode 100644 index 88d4c270..00000000 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookCraftingGrid.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.minelittlepony.unicopia.container.inventory; - -import java.util.List; - -public interface SpellbookCraftingGrid { - - /** - * Creates a hexagonal crafting grid. - * @param grid Output for normal slot positions. - * @param gemPos Output for the gem slot position. - */ - static void createGrid(List grid, List gemPos) { - int cols = 4; - int spacing = 23; - - int top = 34; - int left = 65; - - for (int row = 0; row < 7; row++) { - for (int i = 0; i < cols; i++) { - - int ring = 3; - if (row == 0 || row == 6) { - ring = 1; - } else if ((row == 1 || row == 5) && i > 0 && i < cols - 1) { - ring = 2; - } else { - if (i == 0 || i == cols - 1) { - ring = 1; - } else if (i == 1 || i == cols - 2) { - ring = 2; - } - } - - (row == 3 && i == 3 ? gemPos : grid).add(new int[] { - left + (i * spacing), - top, - row == 3 && i == 3 ? 4 : ring - }); - } - top += spacing * 0.9; - left -= (spacing / 2) * (row > 2 ? -1 : 1); - cols += row > 2 ? -1 : 1; - } - } - -} diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java index 1195948e..10a8816d 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookInventory.java @@ -29,24 +29,15 @@ public class SpellbookInventory extends CraftingInventory { return false; } - public int getRing(int slot) { + public float getFactor(int slot) { Slot s = handler.slots.get(slot); - return s instanceof SpellbookSlot ? ((SpellbookSlot)s).getRing() : 0; + return s instanceof SpellbookSlot ? ((SpellbookSlot)s).getWeight() : 0; } public SpellTraits getTraits() { return SpellTraits.union(InventoryUtil.slots(this) - .map(slot -> SpellTraits.of(getStack(slot)).multiply(getRingFactor(getRing(slot)))) + .map(slot -> SpellTraits.of(getStack(slot)).multiply(getFactor(slot))) .toArray(SpellTraits[]::new) ); } - - public static float getRingFactor(int ring) { - switch (ring) { - case 1: return 1; - case 2: return 0.6F; - case 3: return 0.3F; - default: return 0; - } - } } \ No newline at end of file diff --git a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookSlot.java b/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookSlot.java index 233a8ed7..c5ccd1bb 100644 --- a/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookSlot.java +++ b/src/main/java/com/minelittlepony/unicopia/container/inventory/SpellbookSlot.java @@ -1,5 +1,12 @@ package com.minelittlepony.unicopia.container.inventory; public interface SpellbookSlot { - int getRing(); + float CENTER_FACTOR = 0; + float NEAR_FACTOR = 1; + float MIDDLE_FACTOR = 0.6F; + float FAR_FACTOR = 0.3F; + + default float getWeight() { + return CENTER_FACTOR; + } } \ No newline at end of file