From 22cf8243d64d60c3c5ea53c96623890068ef68a2 Mon Sep 17 00:00:00 2001 From: fullwall Date: Fri, 18 Dec 2020 00:39:00 +0800 Subject: [PATCH] Begin stubbing menu api --- .../citizensnpcs/api/gui/ClickHandler.java | 20 +++++++++ .../citizensnpcs/api/gui/InventoryMenu.java | 6 +++ .../api/gui/InventoryMenuPattern.java | 6 +++ .../api/gui/InventoryMenuSlot.java | 6 +++ .../api/gui/InventoryMenuTransition.java | 6 +++ .../java/net/citizensnpcs/api/gui/Menu.java | 31 ++++++++++++++ .../net/citizensnpcs/api/gui/MenuContext.java | 41 ++++++++++++++++++ .../net/citizensnpcs/api/gui/MenuPattern.java | 30 +++++++++++++ .../net/citizensnpcs/api/gui/MenuSlot.java | 36 ++++++++++++++++ .../citizensnpcs/api/gui/MenuTransition.java | 42 +++++++++++++++++++ 10 files changed, 224 insertions(+) create mode 100644 src/main/java/net/citizensnpcs/api/gui/ClickHandler.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/InventoryMenuPattern.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/InventoryMenuTransition.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/Menu.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/MenuContext.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/MenuPattern.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/MenuSlot.java create mode 100644 src/main/java/net/citizensnpcs/api/gui/MenuTransition.java diff --git a/src/main/java/net/citizensnpcs/api/gui/ClickHandler.java b/src/main/java/net/citizensnpcs/api/gui/ClickHandler.java new file mode 100644 index 00000000..0f944a47 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/ClickHandler.java @@ -0,0 +1,20 @@ +package net.citizensnpcs.api.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.bukkit.event.inventory.ClickType; + +/** + * Defines a click handler. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.METHOD }) +public @interface ClickHandler { + /** + * An optional filter for specific click types. + */ + ClickType[] value() default {}; +} diff --git a/src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java b/src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java new file mode 100644 index 00000000..aef63376 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/InventoryMenu.java @@ -0,0 +1,6 @@ +package net.citizensnpcs.api.gui; + +public class InventoryMenu { + public InventoryMenu(Menu menu) { + } +} diff --git a/src/main/java/net/citizensnpcs/api/gui/InventoryMenuPattern.java b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuPattern.java new file mode 100644 index 00000000..26e67b41 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuPattern.java @@ -0,0 +1,6 @@ +package net.citizensnpcs.api.gui; + +public class InventoryMenuPattern { + public InventoryMenuPattern(InventoryMenu menu, MenuPattern pattern) { + } +} diff --git a/src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java new file mode 100644 index 00000000..408d6d5c --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuSlot.java @@ -0,0 +1,6 @@ +package net.citizensnpcs.api.gui; + +public class InventoryMenuSlot { + public InventoryMenuSlot(InventoryMenu menu, MenuSlot slot) { + } +} diff --git a/src/main/java/net/citizensnpcs/api/gui/InventoryMenuTransition.java b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuTransition.java new file mode 100644 index 00000000..fd65f61f --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/InventoryMenuTransition.java @@ -0,0 +1,6 @@ +package net.citizensnpcs.api.gui; + +public class InventoryMenuTransition { + public InventoryMenuTransition(InventoryMenu menu, MenuTransition transition) { + } +} diff --git a/src/main/java/net/citizensnpcs/api/gui/Menu.java b/src/main/java/net/citizensnpcs/api/gui/Menu.java new file mode 100644 index 00000000..ffd40675 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/Menu.java @@ -0,0 +1,31 @@ +package net.citizensnpcs.api.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.bukkit.event.inventory.ClickType; + +/** + * Defines a GUI inventory menu. Can be linked to a {@link InventoryMenuPattern} or simply at the class level. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE }) +public @interface Menu { + + /** + * The dimensions of the menu, if supported. + */ + int[] dimensions() default { 3, 3 }; + + /** + * The click types to allow by default. Empty = all allowed + */ + ClickType[] filter() default {}; + + /** + * The menu title. + */ + String title() default ""; +} diff --git a/src/main/java/net/citizensnpcs/api/gui/MenuContext.java b/src/main/java/net/citizensnpcs/api/gui/MenuContext.java new file mode 100644 index 00000000..ff69dc82 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/MenuContext.java @@ -0,0 +1,41 @@ +package net.citizensnpcs.api.gui; + +import java.util.Map; + +import org.bukkit.entity.Entity; +import org.bukkit.inventory.Inventory; + +import com.google.common.collect.Maps; + +/** + * A context class passed into the constructor of a {@link Menu} instance. + */ +public class MenuContext { + private final Map data = Maps.newHashMap(); + private final Inventory inventory; + private final InventoryMenu parent; + private final Entity user; + + public MenuContext(InventoryMenu parent, Inventory inventory, Entity user, Map data) { + this.inventory = inventory; + this.parent = parent; + this.user = user; + this.data.putAll(data); + } + + public Map data() { + return data; + } + + public Inventory getInventory() { + return inventory; + } + + public InventoryMenu getParent() { + return parent; + } + + public Entity getUser() { + return user; + } +} diff --git a/src/main/java/net/citizensnpcs/api/gui/MenuPattern.java b/src/main/java/net/citizensnpcs/api/gui/MenuPattern.java new file mode 100644 index 00000000..dcda1915 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/MenuPattern.java @@ -0,0 +1,30 @@ +package net.citizensnpcs.api.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.bukkit.Material; + +/** + * Defines a pattern of slots. Can be linked to a {@link InventoryMenuPattern} or simply at the class level. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.FIELD }) +public @interface MenuPattern { + /** + * The amount of the itemstacks to display. + */ + int amount() default 1; + + /** + * The material to display (defaults to AIR). + */ + Material material() default Material.AIR; + + /** + * The pattern string. 0 = AIR + */ + String value(); +} diff --git a/src/main/java/net/citizensnpcs/api/gui/MenuSlot.java b/src/main/java/net/citizensnpcs/api/gui/MenuSlot.java new file mode 100644 index 00000000..4ffc4890 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/MenuSlot.java @@ -0,0 +1,36 @@ +package net.citizensnpcs.api.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.bukkit.Material; +import org.bukkit.event.inventory.ClickType; + +/** + * Defines a slot with a certain item. Can be linked to a {@link InventoryMenuSlot} or simply at the class level. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.FIELD }) +public @interface MenuSlot { + /** + * The amount of the itemstack to display. + */ + int amount() default 1; + + /** + * Whitelist the allowed clicktypes (empty = all allowed). + */ + ClickType[] filter() default {}; + + /** + * The material to display (defaults to AIR). For extra customisation see {@link InventoryMenuSlot}. + */ + Material material() default Material.AIR; + + /** + * The position of the slot within the inventory. + */ + int[] value() default { 0, 0 }; +} diff --git a/src/main/java/net/citizensnpcs/api/gui/MenuTransition.java b/src/main/java/net/citizensnpcs/api/gui/MenuTransition.java new file mode 100644 index 00000000..5c8d7ff1 --- /dev/null +++ b/src/main/java/net/citizensnpcs/api/gui/MenuTransition.java @@ -0,0 +1,42 @@ +package net.citizensnpcs.api.gui; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +import org.bukkit.Material; +import org.bukkit.event.inventory.ClickType; + +/** + * Defines a menu transition to a new sub-menu. Can be linked to a {@link InventoryMenuTransition} or simply at the + * class level. + */ +@Retention(RetentionPolicy.RUNTIME) +@Target({ ElementType.TYPE, ElementType.FIELD }) +public @interface MenuTransition { + /** + * The amount of the itemstack to display. + */ + int amount() default 1; + + /** + * Whitelist the allowed clicktypes for transition (empty = all allowed). + */ + ClickType[] filter() default {}; + + /** + * The material to display (defaults to AIR). For extra customisation see {@link InventoryMenuTransition}. + */ + Material material() default Material.AIR; + + /** + * The position of the slot within the inventory. + */ + int[] pos() default { 0, 0 }; + + /** + * The next sub-menu class to transition to. + */ + Class value(); +}