Skip to content

Commit

Permalink
Add setting SlotSettings in masks to enable greater control over affe…
Browse files Browse the repository at this point in the history
…cted slots

SlotSettings allows for also defining ClickOptions and ClickHandlers in addition to a simple item,
enabling finer controls on affected slots in menus modified by masks.
  • Loading branch information
sainttx committed Sep 4, 2021
1 parent 9da3692 commit 0d90f14
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 26 deletions.
32 changes: 22 additions & 10 deletions src/main/java/org/ipvp/canvas/mask/BinaryMask.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
import org.bukkit.inventory.ItemStack;
import org.ipvp.canvas.Menu;
import org.ipvp.canvas.slot.Slot;
import org.ipvp.canvas.slot.SlotSettings;
import org.ipvp.canvas.template.ItemStackTemplate;
import org.ipvp.canvas.template.StaticItemTemplate;

Expand All @@ -46,12 +47,12 @@ public class BinaryMask implements Mask {

private final Menu.Dimension dimension;
private List<Integer> mask;
private ItemStackTemplate item;
private SlotSettings settings;

BinaryMask(Menu.Dimension dimension, List<Integer> mask, ItemStackTemplate item) {
BinaryMask(Menu.Dimension dimension, List<Integer> mask, SlotSettings settings) {
this.dimension = dimension;
this.mask = Collections.unmodifiableList(mask);
this.item = item;
this.settings = settings;
}

@Override
Expand Down Expand Up @@ -81,7 +82,7 @@ public boolean contains(int row, int column) {
public void apply(Menu menu) {
for (int slot : getSlots()) {
Slot affected = menu.getSlot(slot);
affected.setItemTemplate(item);
affected.setSettings(settings);
}
}

Expand Down Expand Up @@ -139,7 +140,7 @@ public static class BinaryMaskBuilder implements Mask.Builder {
private Menu.Dimension dimensions;
private int row;
private int[][] mask;
private ItemStackTemplate item;
private SlotSettings settings;

BinaryMaskBuilder(Menu.Dimension dimensions) {
this.dimensions = dimensions;
Expand Down Expand Up @@ -187,20 +188,31 @@ public BinaryMaskBuilder item(ItemStack item) {
}

/**
* Sets the item that the mask will apply to an
* inventory.
* Sets the item that the mask will apply to affected
* slots within a target inventory.
*
* @param item item
* @return fluent pattern
*/
public BinaryMaskBuilder item(ItemStackTemplate item) {
this.item = item;
return item(SlotSettings.builder().itemTemplate(item).build());
}

/**
* Sets the item/slot settings the mask will apply
* to affected slots within a target inventory.
*
* @param settings slot settings
* @return fluent pattern
*/
public BinaryMaskBuilder item(SlotSettings settings) {
this.settings = settings;
return this;
}

@Override
public BinaryMaskBuilder nextRow() throws IllegalStateException {
if (row == mask.length){
if (row == mask.length) {
throw new IllegalStateException("Current line is the last row");
}
++row;
Expand Down Expand Up @@ -246,7 +258,7 @@ public BinaryMask build() {
}
}
}
return new BinaryMask(dimensions, slots, item);
return new BinaryMask(dimensions, slots, settings);
}
}
}
43 changes: 27 additions & 16 deletions src/main/java/org/ipvp/canvas/mask/RecipeMask.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,14 +27,11 @@
import org.bukkit.inventory.ShapedRecipe;
import org.ipvp.canvas.Menu;
import org.ipvp.canvas.slot.Slot;
import org.ipvp.canvas.slot.SlotSettings;
import org.ipvp.canvas.template.ItemStackTemplate;
import org.ipvp.canvas.template.StaticItemTemplate;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.*;

/**
* A mask that accepts maps items to specific characters,
Expand Down Expand Up @@ -62,12 +59,12 @@ public class RecipeMask implements Mask {

private final Menu.Dimension dimension;
private Map<Integer, Character> mask;
private Map<Character, ItemStackTemplate> items;
private Map<Character, SlotSettings> settings;

RecipeMask(Menu.Dimension dimension, Map<Integer, Character> mask, Map<Character, ItemStackTemplate> items) {
RecipeMask(Menu.Dimension dimension, Map<Integer, Character> mask, Map<Character, SlotSettings> settings) {
this.dimension = dimension;
this.mask = Collections.unmodifiableMap(mask);
this.items = Collections.unmodifiableMap(items);
this.settings = Collections.unmodifiableMap(settings);
}

@Override
Expand Down Expand Up @@ -96,9 +93,9 @@ public boolean contains(int row, int column) {
@Override
public void apply(Menu menu) {
mask.forEach((slot, character) -> {
ItemStackTemplate item = items.get(character);
SlotSettings settings = this.settings.get(character);
Slot affected = menu.getSlot(slot);
affected.setItemTemplate(item);
affected.setSettings(settings);
});
}

Expand Down Expand Up @@ -156,7 +153,7 @@ public static class RecipeMaskBuilder implements Builder {
private Menu.Dimension dimensions;
private int row;
private char[][] mask;
private Map<Character, ItemStackTemplate> items = new HashMap<>();
private Map<Character, SlotSettings> settings = new HashMap<>();

RecipeMaskBuilder(Menu.Dimension dimensions) {
this.dimensions = dimensions;
Expand Down Expand Up @@ -188,14 +185,15 @@ public RecipeMaskBuilder row(int row) throws IllegalStateException {
if (row < 1 || row > dimensions.getRows()) {
throw new IllegalStateException("Row must be a value from 1 to " + rows());
}
this.row = row -1;
this.row = row - 1;
return this;
}

/**
* Sets the item that the mask will apply to an
* inventory.
*
* @param character target character to fill within the pattern
* @param item item
* @return fluent pattern
*/
Expand All @@ -207,14 +205,27 @@ public RecipeMaskBuilder item(char character, ItemStack item) {
* Sets the item that the mask will apply to an
* inventory.
*
* @param character target character to fill within the pattern
* @param item item
* @return fluent pattern
*/
public RecipeMaskBuilder item(char character, ItemStackTemplate item) {
if (item == null) {
items.remove(character);
return item(character, SlotSettings.builder().itemTemplate(item).build());
}

/**
* Sets the item/slot settings that the mask will apply
* to affected slots within a targeted inventory.
*
* @param character target character to fill within the pattern
* @param settings slot settings
* @return fluent pattern
*/
public RecipeMaskBuilder item(char character, SlotSettings settings) {
if (settings == null) {
this.settings.remove(character);
} else {
items.put(character, item);
this.settings.put(character, settings);
}
return this;
}
Expand Down Expand Up @@ -264,7 +275,7 @@ public RecipeMask build() {
slots.put(r * columns() + c, character);
}
}
return new RecipeMask(dimensions, slots, items);
return new RecipeMask(dimensions, slots, settings);
}
}
}

0 comments on commit 0d90f14

Please sign in to comment.