diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java index a5b94106..f05c1dd5 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/util/input/ChatInput.java @@ -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 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 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 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(); + } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java index 7f5fd539..8629991d 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/InventoryClickContext.java @@ -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; } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java index 9c903580..0e088fd4 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/api/PluginInventory.java @@ -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 } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java index 6e1ead1e..c5dbb078 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/friend/EditableFriendList.java @@ -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); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java index 9d55ebba..22405b53 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildAdmin.java @@ -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); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java index e0cf3930..7be41f1e 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildCreation.java @@ -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()); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java index b86701bc..e36f48f8 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/guild/EditableGuildView.java @@ -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); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java index fc2b5f30..e593b862 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/gui/social/party/EditablePartyView.java @@ -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); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index babc8ded..2ffe1464 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java @@ -139,7 +139,7 @@ public class ConfigManager { @Deprecated public PlayerInput newPlayerInput(Player player, InputType type, Consumer output) { - return new ChatInput(player, type, output); + return new ChatInput(player, type, null, output); } public void loadDefaultFile(String name) { diff --git a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java index 67e33c7b..4cef1d12 100644 --- a/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java +++ b/MMOCore-Dist/src/main/java/net/Indyuce/mmocore/listener/PlayerListener.java @@ -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())); } /**