diff --git a/README.md b/README.md index b2cf084b..7cf03b5d 100644 --- a/README.md +++ b/README.md @@ -89,7 +89,16 @@ builder.onComplete((player, text) -> { return AnvilGUI.Response.text("Incorrect."); } }); -``` +``` + +#### `onPrepare(BiConsumer)` +Takes a `BiConsumer` argument that is called when a player changes the input field of the anvil, i.e. when typing or undoing characters. +It uses the [PrepareAnvilEvent](https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/event/inventory/PrepareAnvilEvent.html), so it will only have an effect on MC versions >= 1.9. +```java +builder.onPrepare((player, text) -> { + player.sendMessage("Current input: " + text); +}); +``` #### `preventClose()` Tells the AnvilGUI to prevent the user from pressing escape to close the inventory. diff --git a/api/pom.xml b/api/pom.xml index e594b91a..b1cbb99e 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -16,7 +16,7 @@ org.spigotmc spigot - 1.8-R0.1-SNAPSHOT + 1.19-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 2cc232cb..162e524c 100644 --- a/api/src/main/java/net/wesjd/anvilgui/AnvilGUI.java +++ b/api/src/main/java/net/wesjd/anvilgui/AnvilGUI.java @@ -1,24 +1,34 @@ package net.wesjd.anvilgui; +import java.util.function.BiConsumer; import java.util.function.BiFunction; import java.util.function.Consumer; import net.wesjd.anvilgui.version.VersionMatcher; import net.wesjd.anvilgui.version.VersionWrapper; +import net.wesjd.anvilgui.version.Wrapper1_7_R4; +import net.wesjd.anvilgui.version.Wrapper1_8_R1; +import net.wesjd.anvilgui.version.Wrapper1_8_R2; +import net.wesjd.anvilgui.version.Wrapper1_8_R3; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.EventException; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryDragEvent; +import org.bukkit.event.inventory.PrepareAnvilEvent; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; +import org.bukkit.plugin.EventExecutor; import org.bukkit.plugin.Plugin; /** @@ -75,6 +85,10 @@ public class AnvilGUI { * An {@link Consumer} that is called when the {@link Slot#INPUT_RIGHT} slot has been clicked */ private final Consumer inputRightClickListener; + /** + * An {@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 @@ -106,7 +120,7 @@ public class AnvilGUI { */ @Deprecated public AnvilGUI(Plugin plugin, Player holder, String insert, BiFunction biFunction) { - this(plugin, holder, "Repair & Name", insert, null, null, false, null, null, null, (player, text) -> { + this(plugin, holder, "Repair & Name", insert, null, null, false, null, null, null, null, (player, text) -> { String response = biFunction.apply(player, text); if (response != null) { return Response.text(response); @@ -126,6 +140,7 @@ public AnvilGUI(Plugin plugin, Player holder, String insert, BiFunction closeListener, Consumer inputLeftClickListener, Consumer inputRightClickListener, + BiConsumer prepareListener, BiFunction completeFunction) { this.plugin = plugin; this.player = player; @@ -149,6 +165,7 @@ private AnvilGUI( this.closeListener = closeListener; this.inputLeftClickListener = inputLeftClickListener; this.inputRightClickListener = inputRightClickListener; + this.prepareListener = prepareListener; this.completeFunction = completeFunction; if (itemText != null) { @@ -171,7 +188,7 @@ private void openInventory() { WRAPPER.handleInventoryCloseEvent(player); WRAPPER.setActiveContainerDefault(player); - Bukkit.getPluginManager().registerEvents(listener, plugin); + this.registerEvents(); final Object container = WRAPPER.newContainerAnvil(player, inventoryTitle); @@ -229,6 +246,41 @@ public Inventory getInventory() { return inventory; } + private void registerEvents() { + 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, + new EventExecutor() { + @Override + public void execute(Listener listener, Event event) throws EventException { + PrepareAnvilEvent prepareEvent = (PrepareAnvilEvent) event; + + if (prepareEvent.getInventory().equals(inventory)) { + Player player = + (Player) prepareEvent.getView().getPlayer(); + if (prepareListener != null) { + prepareListener.accept( + player, + prepareEvent.getInventory().getRenameText()); + } + } + } + }, + plugin); + } + } + /** * Simply holds the listeners for the GUI */ @@ -313,6 +365,10 @@ public static class Builder { * An {@link Consumer} that is called when the {@link Slot#INPUT_RIGHT} slot has been clicked */ private Consumer inputRightClickListener; + /** + * An {@link BiConsumer} that is called when the string of the anvil input has been changed + */ + private BiConsumer prepareListener; /** * An {@link BiFunction} that is called when the anvil output slot has been clicked */ @@ -383,6 +439,17 @@ public Builder onRightInputClick(Consumer inputRightClickListener) { return this; } + /** + * Listens for changes in the input field of the anvil. Ineffective for MC versions 1.7.* and 1.8.* + * + * @param prepareListener An {@link BiConsumer} that is called when the string of the input field is changed + * @return The {@link Builder} instance + */ + public Builder onPrepare(BiConsumer prepareListener) { + this.prepareListener = prepareListener; + return this; + } + /** * Handles the inventory output slot when it is clicked * @@ -494,6 +561,7 @@ public AnvilGUI open(Player player) { closeListener, inputLeftClickListener, inputRightClickListener, + prepareListener, completeFunction); } }