Skip to content

Commit

Permalink
Additional work on inventory GUIs
Browse files Browse the repository at this point in the history
  • Loading branch information
fullwall committed Jan 31, 2021
1 parent 3946f3f commit 573e5e3
Show file tree
Hide file tree
Showing 6 changed files with 123 additions and 20 deletions.
@@ -0,0 +1,96 @@
package net.citizensnpcs.api.gui;

import org.bukkit.Material;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.ItemStack;

public class CitizensInventoryClickEvent extends InventoryClickEvent {
private final InventoryClickEvent event;
private final ItemStack result;

public CitizensInventoryClickEvent(InventoryClickEvent event) {
super(event.getView(), event.getSlotType(), event.getSlot(), event.getClick(), event.getAction(),
event.getHotbarButton());
this.event = event;
this.result = getResult(event);
}

@Override
public ItemStack getCurrentItem() {
return event.getCurrentItem() == null || event.getCurrentItem().getType() == Material.AIR ? null
: event.getCurrentItem();
}

public ItemStack getCurrentItemNonNull() {
return event.getCurrentItem() == null ? new ItemStack(Material.AIR, 0) : event.getCurrentItem();
}

@Override
public ItemStack getCursor() {
return event.getCursor() == null || event.getCursor().getType() == Material.AIR ? null : event.getCursor();
}

public ItemStack getCursorNonNull() {
return event.getCursor() == null ? new ItemStack(Material.AIR, 0) : event.getCursor();
}

private ItemStack getResult(InventoryClickEvent event) {
ItemStack stack = event.getCurrentItem() == null ? new ItemStack(event.getCursor().getType(), 0)
: event.getCurrentItem().clone();
switch (event.getAction()) {
case PICKUP_ONE:
stack.setAmount(stack.getAmount() - 1);
break;
case PICKUP_HALF:
stack.setAmount((int) Math.floor(stack.getAmount() / 2.0));
break;
case PICKUP_ALL:
stack = null;
break;
case PLACE_ALL:
stack.setAmount(
Math.min(stack.getAmount() + event.getCursor().getAmount(), stack.getType().getMaxStackSize()));
break;
case PLACE_SOME:
stack.setAmount(Math.min(stack.getAmount(), stack.getType().getMaxStackSize()));
break;
case PLACE_ONE:
stack.setAmount(stack.getAmount() + 1);
break;
default:
event.setCancelled(true);
event.setResult(Result.DENY);
return null;
}
return stack;
}

public ItemStack getResultItem() {
return result;
}

public ItemStack getResultItemNonNull() {
return result == null ? new ItemStack(Material.AIR, 0) : result;
}

@Override
public void setCancelled(boolean cancel) {
event.setCancelled(cancel);
}

@Override
public void setCurrentItem(ItemStack item) {
event.setCurrentItem(item);
}

@Override
@SuppressWarnings("deprecation")
public void setCursor(ItemStack cursor) {
event.setCursor(cursor);
}

@Override
public void setResult(Result result) {
event.setResult(result);
}
}
20 changes: 13 additions & 7 deletions src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java
Expand Up @@ -32,8 +32,9 @@
import com.google.common.collect.Queues;

import net.citizensnpcs.api.util.Colorizer;
import net.citizensnpcs.api.util.Messaging;

// TODO: class-based injection? runnables? sub-inventory pages
// TODO: class-based injection? runnables? translations for titles/lore etc. sub-inventory pages
/**
* A container class for Inventory GUIs. Expects {@link #onInventoryClick(InventoryClickEvent)} and
* {@link #onInventoryClose(InventoryCloseEvent)} to be called by the user (or registered with the event listener
Expand Down Expand Up @@ -109,7 +110,7 @@ private int getInventorySize(InventoryType type, int[] dim) {
}
dim[0] = Math.min(54, size) / 9;
dim[1] = 9;
return Math.min(54, size);
return Math.max(9, Math.min(54, size));
case ANVIL:
case BLAST_FURNACE:
case CARTOGRAPHY:
Expand Down Expand Up @@ -197,8 +198,8 @@ public void onInventoryClick(InventoryClickEvent event) {
continue;
if (acceptFilter(event.getAction(), invokable.data.filter())) {
try {
// TODO: bind optional args?
invokable.method.invoke(page.page, slot, event);
// TODO: optional args?
invokable.method.invoke(page.page, slot, new CitizensInventoryClickEvent(event));
} catch (Throwable e) {
e.printStackTrace();
}
Expand Down Expand Up @@ -319,17 +320,22 @@ private void transition(InventoryMenuInfo info, InventoryMenuPage instance, Map<
page = new PageContext();
int[] dim = info.menuAnnotation.dimensions();
InventoryType type = info.menuAnnotation.type();
page.page = instance;
if (instance.getInventoryType() != null) {
type = instance.getInventoryType();
}
int size = getInventorySize(type, dim);
Inventory inventory;
if (type == InventoryType.CHEST || type == null) {
inventory = Bukkit.createInventory(null, size, Colorizer.parseColors(info.menuAnnotation.title()));
inventory = Bukkit.createInventory(null, size,
Colorizer.parseColors(Messaging.tryTranslate(info.menuAnnotation.title())));
} else {
inventory = Bukkit.createInventory(null, type, Colorizer.parseColors(info.menuAnnotation.title()));
inventory = Bukkit.createInventory(null, type,
Colorizer.parseColors(Messaging.tryTranslate(info.menuAnnotation.title())));
}
List<InventoryMenuTransition> transitions = Lists.newArrayList();
InventoryMenuSlot[] slots = new InventoryMenuSlot[inventory.getSize()];
page.patterns = new InventoryMenuPattern[info.patterns.length];
page.page = instance;
page.dim = dim;
page.ctx = new MenuContext(this, slots, inventory, context);
for (int i = 0; i < info.slots.length; i++) {
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/net/citizensnpcs/api/gui/InventoryMenuPage.java
Expand Up @@ -2,6 +2,7 @@

import org.bukkit.entity.HumanEntity;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType;

/**
* The concrete page instance representing a single page in a stack of inventory menu GUIs. Injected variables will be
Expand All @@ -10,6 +11,10 @@
* @see InventoryMenu
*/
public abstract class InventoryMenuPage {
public InventoryType getInventoryType() {
return null;
}

public abstract void initialise(MenuContext ctx);

public void onClick(InventoryMenuSlot slot, InventoryClickEvent event) {
Expand Down
9 changes: 5 additions & 4 deletions src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java
Expand Up @@ -14,6 +14,7 @@
import org.bukkit.inventory.meta.ItemMeta;

import net.citizensnpcs.api.util.Colorizer;
import net.citizensnpcs.api.util.Messaging;

/**
* Represents a single inventory slot in a {@link InventoryMenu}.
Expand Down Expand Up @@ -70,11 +71,11 @@ void initialise(MenuSlot data) {
}
if (defaultItem != null) {
ItemMeta meta = defaultItem.getItemMeta();
if (!data.lore().isEmpty()) {
meta.setLore(Arrays.asList(Colorizer.parseColors(data.lore()).split("\\n|\n")));
if (!data.lore().equals("EMPTY")) {
meta.setLore(Arrays.asList(Colorizer.parseColors(Messaging.tryTranslate(data.lore())).split("\\n|\n")));
}
if (!data.title().isEmpty()) {
meta.setDisplayName(Colorizer.parseColors(data.title()));
if (!data.title().equals("EMPTY")) {
meta.setDisplayName(Colorizer.parseColors(Messaging.tryTranslate(data.title())));
}
defaultItem.setItemMeta(meta);
}
Expand Down
4 changes: 2 additions & 2 deletions src/main/java/net/citizensnpcs/api/gui/MenuSlot.java
Expand Up @@ -29,7 +29,7 @@
/**
* The lore of the inventory item, newline-delimited.
*/
String lore() default "";
String lore() default "EMPTY";

/**
* The material to display (defaults to AIR). For extra customisation see {@link InventoryMenuSlot}.
Expand All @@ -49,5 +49,5 @@
/**
* The display name of the inventory item.
*/
String title() default "";
String title() default "EMPTY";
}
9 changes: 2 additions & 7 deletions src/main/java/net/citizensnpcs/api/util/Messaging.java
Expand Up @@ -159,13 +159,7 @@ public static String tryTranslate(Object possible) {
if (possible == null)
return "";
String message = possible.toString();
int count = 0;
for (int i = 0; i < message.length(); i++) {
char c = message.charAt(i);
if (c == '.')
count++;
}
return count >= 2 ? tr(message) : message;
return TRANSLATION_MATCHER.matcher(message).matches() ? tr(message) : message;
}

private static final Pattern CHAT_NEWLINE = Pattern.compile("<br>|\\n", Pattern.MULTILINE);
Expand All @@ -177,4 +171,5 @@ public static String tryTranslate(Object possible) {
private static Logger LOGGER = Logger.getLogger("Citizens");
private static String MESSAGE_COLOUR = ChatColor.GREEN.toString();
private static final Joiner SPACE = Joiner.on(" ").useForNull("null");
private static final Pattern TRANSLATION_MATCHER = Pattern.compile("[a-zA-Z0-9]+\\.[a-zA-Z0-9]+\\.[a-zA-Z0-9.]+");
}

0 comments on commit 573e5e3

Please sign in to comment.