Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,16 @@ builder.onComplete((player, text) -> {
return AnvilGUI.Response.text("Incorrect.");
}
});
```
```

#### `onPrepare(BiConsumer<Player, String>)`
Takes a `BiConsumer<Player, String>` 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.
Expand Down
2 changes: 1 addition & 1 deletion api/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
<dependency>
<groupId>org.spigotmc</groupId>
<artifactId>spigot</artifactId>
<version>1.8-R0.1-SNAPSHOT</version>
<version>1.19-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
Expand Down
72 changes: 70 additions & 2 deletions api/src/main/java/net/wesjd/anvilgui/AnvilGUI.java
Original file line number Diff line number Diff line change
@@ -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;

/**
Expand Down Expand Up @@ -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<Player> inputRightClickListener;
/**
* An {@link BiConsumer} that is called when the string of the anvil input has been changed.
*/
private final BiConsumer<Player, String> prepareListener;

/**
* The container id of the inventory, used for NMS methods
Expand Down Expand Up @@ -106,7 +120,7 @@ public class AnvilGUI {
*/
@Deprecated
public AnvilGUI(Plugin plugin, Player holder, String insert, BiFunction<Player, String, String> 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);
Expand All @@ -126,6 +140,7 @@ public AnvilGUI(Plugin plugin, Player holder, String insert, BiFunction<Player,
* @param inputLeft The material of the item in the first slot of the anvilGUI
* @param preventClose Whether to prevent the inventory from closing
* @param closeListener A {@link Consumer} when the inventory closes
* @param prepareListener A {@link BiConsumer} that is called when the player changes the text of the item name field
* @param completeFunction A {@link BiFunction} that is called when the player clicks the {@link Slot#OUTPUT} slot
*/
private AnvilGUI(
Expand All @@ -139,6 +154,7 @@ private AnvilGUI(
Consumer<Player> closeListener,
Consumer<Player> inputLeftClickListener,
Consumer<Player> inputRightClickListener,
BiConsumer<Player, String> prepareListener,
BiFunction<Player, String, Response> completeFunction) {
this.plugin = plugin;
this.player = player;
Expand All @@ -149,6 +165,7 @@ private AnvilGUI(
this.closeListener = closeListener;
this.inputLeftClickListener = inputLeftClickListener;
this.inputRightClickListener = inputRightClickListener;
this.prepareListener = prepareListener;
this.completeFunction = completeFunction;

if (itemText != null) {
Expand All @@ -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);

Expand Down Expand Up @@ -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
*/
Expand Down Expand Up @@ -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<Player> inputRightClickListener;
/**
* An {@link BiConsumer} that is called when the string of the anvil input has been changed
*/
private BiConsumer<Player, String> prepareListener;
/**
* An {@link BiFunction} that is called when the anvil output slot has been clicked
*/
Expand Down Expand Up @@ -383,6 +439,17 @@ public Builder onRightInputClick(Consumer<Player> 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<Player, String> prepareListener) {
this.prepareListener = prepareListener;
return this;
}

/**
* Handles the inventory output slot when it is clicked
*
Expand Down Expand Up @@ -494,6 +561,7 @@ public AnvilGUI open(Player player) {
closeListener,
inputLeftClickListener,
inputRightClickListener,
prepareListener,
completeFunction);
}
}
Expand Down