diff --git a/api/pom.xml b/api/pom.xml
index 3bc2e68f..6c34f8a6 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -16,7 +16,7 @@
org.spigotmc
spigot
- 1.8-R0.1-SNAPSHOT
+ 1.9-R0.1-SNAPSHOT
provided
diff --git a/api/src/main/java/net/wesjd/anvilgui/AnvilGUI.java b/api/src/main/java/net/wesjd/anvilgui/AnvilGUI.java
index 1aab4e5f..cfd04c1d 100644
--- a/api/src/main/java/net/wesjd/anvilgui/AnvilGUI.java
+++ b/api/src/main/java/net/wesjd/anvilgui/AnvilGUI.java
@@ -13,16 +13,14 @@
import java.util.function.Function;
import java.util.logging.Level;
import net.md_5.bungee.api.chat.BaseComponent;
-import net.wesjd.anvilgui.version.VersionMatcher;
-import net.wesjd.anvilgui.version.VersionWrapper;
+import net.wesjd.anvilgui.version.*;
import org.apache.commons.lang.Validate;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.entity.Player;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
+import org.bukkit.event.*;
import org.bukkit.event.inventory.*;
+import org.bukkit.event.inventory.PrepareAnvilEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
@@ -98,6 +96,8 @@ private static ItemStack itemNotNull(ItemStack stack) {
private final boolean concurrentClickHandlerExecution;
/** An {@link BiFunction} that is called when a slot is clicked */
private final ClickHandler clickHandler;
+ /** A {@link BiConsumer} that is called when the string of the anvil input has been changed. */
+ private final BiConsumer prepareListener;
/**
* The container id of the inventory, used for NMS methods
@@ -136,6 +136,7 @@ private static ItemStack itemNotNull(ItemStack stack) {
* @param closeListener A {@link Consumer} when the inventory closes
* @param concurrentClickHandlerExecution Flag to allow concurrent execution of the click handler
* @param clickHandler A {@link ClickHandler} that is called when the player clicks a slot
+ * @param prepareListener A {@link BiConsumer} that is called when the string of the anvil input has been changed.
*/
private AnvilGUI(
Plugin plugin,
@@ -148,7 +149,8 @@ private AnvilGUI(
Set interactableSlots,
Consumer closeListener,
boolean concurrentClickHandlerExecution,
- ClickHandler clickHandler) {
+ ClickHandler clickHandler,
+ BiConsumer prepareListener) {
this.plugin = plugin;
this.player = player;
this.mainThreadExecutor = mainThreadExecutor;
@@ -160,13 +162,14 @@ private AnvilGUI(
this.closeListener = closeListener;
this.concurrentClickHandlerExecution = concurrentClickHandlerExecution;
this.clickHandler = clickHandler;
+ this.prepareListener = prepareListener;
}
/**
* Opens the anvil GUI
*/
private void openInventory() {
- Bukkit.getPluginManager().registerEvents(listener, plugin);
+ registerEvents(listener, plugin);
container = WRAPPER.newContainerAnvil(player, titleComponent);
@@ -293,6 +296,41 @@ public Inventory getInventory() {
return inventory;
}
+ public void registerEvents(Listener listener, Plugin plugin) {
+ Bukkit.getPluginManager().registerEvents(listener, plugin);
+
+ // registering the AnvilPrepareEvent listener externally since this event is not
+ // available for MC 1.7 and 1.8.
+ if (!(WRAPPER.getClass() == Wrapper1_7_R4.class
+ || WRAPPER.getClass() == Wrapper1_8_R1.class
+ || WRAPPER.getClass() == Wrapper1_8_R2.class
+ || WRAPPER.getClass() == Wrapper1_8_R3.class)) {
+
+ Bukkit.getPluginManager()
+ .registerEvent(
+ PrepareAnvilEvent.class,
+ listener,
+ EventPriority.NORMAL,
+ (listener1, event) -> {
+ PrepareAnvilEvent prepareEvent = (PrepareAnvilEvent) event;
+
+ if (prepareEvent.getInventory().equals(inventory)) {
+ Player player =
+ (Player) prepareEvent.getView().getPlayer();
+ if (prepareListener != null) {
+ prepareListener.accept(
+ player,
+ prepareEvent
+ .getResult()
+ .getItemMeta()
+ .getDisplayName());
+ }
+ }
+ },
+ plugin);
+ }
+ }
+
/**
* Simply holds the listeners for the GUI
*/
@@ -416,6 +454,8 @@ public static class Builder {
private boolean concurrentClickHandlerExecution = false;
/** An {@link Function} that is called when a slot in the inventory has been clicked */
private ClickHandler clickHandler;
+ /** A {@link BiConsumer} that is called when the string of the anvil input has been changed. */
+ private BiConsumer textChangeListener;
/** A state that decides where the anvil GUI is able to be closed by the user */
private boolean preventClose = false;
/** A state that determines whether support for Geyser software is enabled */
@@ -642,6 +682,17 @@ public Builder itemOutput(ItemStack item) {
return this;
}
+ /**
+ * Listens for changes in the text input field of the anvil. Ineffective for MC versions 1.7.* and 1.8.*
+ *
+ * @param textChangeListener An {@link BiConsumer} that is called when the string of the input field is changed
+ * @return The {@link Builder} instance
+ */
+ public Builder onTextChange(BiConsumer textChangeListener) {
+ this.textChangeListener = textChangeListener;
+ return this;
+ }
+
/**
* Creates the anvil GUI and opens it for the player
*
@@ -680,7 +731,8 @@ public AnvilGUI open(Player player) {
interactableSlots,
closeListener,
concurrentClickHandlerExecution,
- clickHandler);
+ clickHandler,
+ textChangeListener);
anvilGUI.openInventory();
return anvilGUI;
}