Added input cancel message

This commit is contained in:
Indyuce 2022-12-23 13:04:15 +01:00
parent bd28cc01df
commit 93d7824590
10 changed files with 75 additions and 42 deletions

View File

@ -1,6 +1,7 @@
package net.Indyuce.mmocore.api.util.input;
import net.Indyuce.mmocore.MMOCore;
import net.Indyuce.mmocore.gui.api.PluginInventory;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -8,36 +9,63 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.inventory.InventoryOpenEvent;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class ChatInput extends PlayerInput {
public ChatInput(Player player, InputType type, Consumer<String> output) {
super(player, output);
private final InputType inputType;
private final PluginInventory lastOpened;
player.closeInventory();
MMOCore.plugin.configManager.getSimpleMessage("player-input.chat." + type.getLowerCaseName()).send(player);
MMOCore.plugin.configManager.getSimpleMessage("player-input.chat.cancel").send(player);
}
@Deprecated
public ChatInput(@NotNull Player player, @NotNull InputType inputType, @NotNull Consumer<String> output) {
this(player, inputType, null, output);
}
@Override
public void close() {
AsyncPlayerChatEvent.getHandlerList().unregister(this);
InventoryOpenEvent.getHandlerList().unregister(this);
}
/**
* Have a player input a string in the global chat
*
* @param player Player requesting chat input
* @param inputType Type of chat input
* @param lastOpened Inventory opened again if 'cancel' is input. Set to null to disable
* @param output What to do when input is detected
*/
public ChatInput(@NotNull Player player, @NotNull InputType inputType, @Nullable PluginInventory lastOpened, @NotNull Consumer<String> output) {
super(player, output);
@EventHandler(priority = EventPriority.LOWEST)
public void a(AsyncPlayerChatEvent event) {
if (event.getPlayer().equals(getPlayer())) {
close();
event.setCancelled(true);
this.inputType = inputType;
this.lastOpened = lastOpened;
if (!event.getMessage().equals("cancel"))
Bukkit.getScheduler().scheduleSyncDelayedTask(MMOCore.plugin, () -> output(event.getMessage()));
}
}
player.closeInventory();
MMOCore.plugin.configManager.getSimpleMessage("player-input.chat." + inputType.getLowerCaseName()).send(player);
MMOCore.plugin.configManager.getSimpleMessage("player-input.chat.cancel").send(player);
}
@EventHandler
public void b(InventoryOpenEvent event) {
if (event.getPlayer().equals(getPlayer()))
close();
}
@Override
public void close() {
AsyncPlayerChatEvent.getHandlerList().unregister(this);
InventoryOpenEvent.getHandlerList().unregister(this);
}
@EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST)
public void registerInput(AsyncPlayerChatEvent event) {
if (event.getPlayer().equals(getPlayer())) {
close();
event.setCancelled(true);
if (event.getMessage().equals("cancel")) {
if (lastOpened != null)
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> lastOpened.open());
MMOCore.plugin.configManager.getSimpleMessage("player-input.chat." + inputType.getLowerCaseName() + "-cancel").send(getPlayer());
} else
// Run sync
Bukkit.getScheduler().runTask(MMOCore.plugin, () -> output(event.getMessage()));
}
}
@EventHandler
public void b(InventoryOpenEvent event) {
if (event.getPlayer().equals(getPlayer()))
close();
}
}

View File

@ -9,29 +9,27 @@ import org.jetbrains.annotations.Nullable;
public class InventoryClickContext {
private final int slot;
private final ClickType clickType;
private final Cancellable event;
@Nullable
private final ItemStack currentItem;
@NotNull
private final ClickType clickType;
@NotNull
private final Cancellable event;
@Nullable
private final Inventory inv;
private final PluginInventory invHolder;
public InventoryClickContext(int slot, ItemStack currentItem, ClickType clickType, Cancellable event) {
this(slot, currentItem, clickType, event, null);
this(slot, currentItem, clickType, event, null, null);
}
public InventoryClickContext(int slot, ItemStack currentItem, ClickType clickType, Cancellable event, Inventory inv) {
public InventoryClickContext(int slot, @Nullable ItemStack currentItem, ClickType clickType, Cancellable event, @Nullable Inventory inv, @Nullable PluginInventory invHolder) {
this.slot = slot;
this.currentItem = currentItem;
this.clickType = clickType;
this.event = event;
this.inv = inv;
this.invHolder = invHolder;
}
public void setCancelled(boolean val) {
@ -66,6 +64,11 @@ public class InventoryClickContext {
return inv;
}
@Nullable
public PluginInventory getInventoryHolder() {
return invHolder;
}
public boolean isClassic() {
return inv != null;
}

View File

@ -11,7 +11,8 @@ public abstract class PluginInventory implements InventoryHolder {
public PluginInventory(Player player) {
this.player = player;
this.playerData = player.getOpenInventory() != null && player.getOpenInventory().getTopInventory().getHolder() instanceof PluginInventory ? ((PluginInventory) player.getOpenInventory().getTopInventory().getHolder()).playerData : PlayerData.get(player);
this.playerData = player.getOpenInventory() != null && player.getOpenInventory().getTopInventory().getHolder() instanceof PluginInventory ?
((PluginInventory) player.getOpenInventory().getTopInventory().getHolder()).playerData : PlayerData.get(player);
}
public PluginInventory(PlayerData playerData) {
@ -34,5 +35,6 @@ public abstract class PluginInventory implements InventoryHolder {
public abstract void whenClicked(InventoryClickContext context);
public void whenClosed(InventoryCloseEvent event) {
// Nothing by default
}
}

View File

@ -192,7 +192,7 @@ public class EditableFriendList extends EditableInventory {
return;
}
new ChatInput(player, InputType.FRIEND_REQUEST, (input) -> {
new ChatInput(player, InputType.FRIEND_REQUEST, context.getInventoryHolder(), input -> {
Player target = Bukkit.getPlayer(input);
if (target == null) {
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);

View File

@ -152,7 +152,7 @@ public class EditableGuildAdmin extends EditableInventory {
return;
}
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, (input) -> {
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, context.getInventoryHolder(), input -> {
Player target = Bukkit.getPlayer(input);
if (target == null) {
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);

View File

@ -38,14 +38,14 @@ public class EditableGuildCreation extends EditableInventory {
public void whenClicked(InventoryClickContext context, InventoryItem item) {
if (item.getFunction().equals("create")) {
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_TAG, (input) -> {
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_TAG, context.getInventoryHolder(), input -> {
if(MMOCore.plugin.dataProvider.getGuildManager().getConfig().shouldUppercaseTags())
input = input.toUpperCase();
if(check(player, input, MMOCore.plugin.dataProvider.getGuildManager().getConfig().getTagRules())) {
String tag = input;
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_NAME, (name) -> {
new ChatInput(player, PlayerInput.InputType.GUILD_CREATION_NAME, context.getInventoryHolder(), name -> {
if(check(player, name, MMOCore.plugin.dataProvider.getGuildManager().getConfig().getNameRules())) {
MMOCore.plugin.dataProvider.getGuildManager().newRegisteredGuild(playerData.getUniqueId(), name, tag);
MMOCore.plugin.dataProvider.getGuildManager().getGuild(tag.toLowerCase()).addMember(playerData.getUniqueId());

View File

@ -201,7 +201,7 @@ public class EditableGuildView extends EditableInventory {
* Sound.ENTITY_VILLAGER_NO, 1, 1); return; }
*/
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, (input) -> {
new ChatInput(player, PlayerInput.InputType.GUILD_INVITE, context.getInventoryHolder(), input -> {
Player target = Bukkit.getPlayer(input);
if (target == null) {
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);

View File

@ -149,7 +149,7 @@ public class EditablePartyView extends EditableInventory {
return;
}
new ChatInput(player, PlayerInput.InputType.PARTY_INVITE, input -> {
new ChatInput(player, PlayerInput.InputType.PARTY_INVITE, context.getInventoryHolder(), input -> {
Player target = Bukkit.getPlayer(input);
if (target == null) {
MMOCore.plugin.configManager.getSimpleMessage("not-online-player", "player", input).send(player);

View File

@ -139,7 +139,7 @@ public class ConfigManager {
@Deprecated
public PlayerInput newPlayerInput(Player player, InputType type, Consumer<String> output) {
return new ChatInput(player, type, output);
return new ChatInput(player, type, null, output);
}
public void loadDefaultFile(String name) {

View File

@ -38,7 +38,7 @@ public class PlayerListener implements Listener {
@EventHandler
public void b(InventoryClickEvent event) {
if (event.getInventory().getHolder() instanceof PluginInventory)
((PluginInventory) event.getInventory().getHolder()).whenClicked(new InventoryClickContext(event.getRawSlot(), event.getCurrentItem(), event.getClick(), event, event.getInventory()));
((PluginInventory) event.getInventory().getHolder()).whenClicked(new InventoryClickContext(event.getRawSlot(), event.getCurrentItem(), event.getClick(), event, event.getInventory(), (PluginInventory) event.getInventory().getHolder()));
}
/**