From 261e25b2efc4c6b2ce0020e784784094ca42d153 Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Sat, 12 Aug 2023 14:59:24 +0530 Subject: [PATCH 1/6] added action delay --- .../api/interaction/InteractionAction.java | 8 ++++++- .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 2 +- .../conversion/znpcs/ZNpcImporter.java | 12 +++++----- .../interaction/InteractionActionImpl.java | 4 ++-- .../InteractionPacketListener.java | 22 ++++++++++++++----- .../consolecommand/ConsoleCommandAction.java | 6 ++--- .../ConsoleCommandActionType.java | 10 +++++---- .../interaction/message/MessageAction.java | 6 ++--- .../message/MessageActionType.java | 10 +++++---- .../playerchat/PlayerChatAction.java | 6 ++--- .../playerchat/PlayerChatActionType.java | 10 +++++---- .../playercommand/PlayerCommandAction.java | 6 ++--- .../PlayerCommandActionType.java | 10 +++++---- .../switchserver/SwitchServerAction.java | 6 ++--- .../switchserver/SwitchServerActionType.java | 10 +++++---- 15 files changed, 77 insertions(+), 51 deletions(-) diff --git a/api/src/main/java/lol/pyr/znpcsplus/api/interaction/InteractionAction.java b/api/src/main/java/lol/pyr/znpcsplus/api/interaction/InteractionAction.java index 87deb20..6d9668a 100644 --- a/api/src/main/java/lol/pyr/znpcsplus/api/interaction/InteractionAction.java +++ b/api/src/main/java/lol/pyr/znpcsplus/api/interaction/InteractionAction.java @@ -6,12 +6,14 @@ import java.util.UUID; public abstract class InteractionAction { private final UUID id; + private final long cooldown; private final long delay; private final InteractionType interactionType; - protected InteractionAction(long delay, InteractionType interactionType) { + protected InteractionAction(long cooldown, long delay, InteractionType interactionType) { this.interactionType = interactionType; this.id = UUID.randomUUID(); + this.cooldown = cooldown; this.delay = delay; } @@ -20,6 +22,10 @@ public abstract class InteractionAction { } public long getCooldown() { + return cooldown; + } + + public long getDelay() { return delay; } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index a136171..902f6e5 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -149,7 +149,7 @@ public class ZNpcsPlus extends JavaPlugin { typeRegistry.registerDefault(packetEvents, propertyRegistry); actionRegistry.registerTypes(scheduler, adventure, bungeeConnector, textSerializer); - packetEvents.getEventManager().registerListener(new InteractionPacketListener(userManager, npcRegistry), PacketListenerPriority.MONITOR); + packetEvents.getEventManager().registerListener(new InteractionPacketListener(userManager, npcRegistry, scheduler), PacketListenerPriority.MONITOR); new Metrics(this, 18244); pluginManager.registerEvents(new UserListener(userManager), this); getServer().getMessenger().registerOutgoingPluginChannel(this, "BungeeCord"); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java index e733538..ef48f1f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/conversion/znpcs/ZNpcImporter.java @@ -153,18 +153,18 @@ public class ZNpcImporter implements DataImporter { throw new IllegalArgumentException("Couldn't adapt znpcs click type: " + clickType); } - private InteractionActionImpl adaptAction(String type, InteractionType clickType, String parameter, int delay) { + private InteractionActionImpl adaptAction(String type, InteractionType clickType, String parameter, int cooldown) { switch (type.toLowerCase()) { case "cmd": - return new PlayerCommandAction(taskScheduler, parameter, clickType, delay * 1000L); + return new PlayerCommandAction(taskScheduler, parameter, clickType, cooldown * 1000L, 0); case "console": - return new ConsoleCommandAction(taskScheduler, parameter, clickType, delay * 1000L); + return new ConsoleCommandAction(taskScheduler, parameter, clickType, cooldown * 1000L, 0); case "chat": - return new PlayerChatAction(taskScheduler, parameter, clickType, delay * 1000L); + return new PlayerChatAction(taskScheduler, parameter, clickType, cooldown * 1000L, 0); case "message": - return new MessageAction(adventure, parameter, clickType, textSerializer, delay * 1000L); + return new MessageAction(adventure, parameter, clickType, textSerializer, cooldown * 1000L, 0); case "server": - return new SwitchServerAction(bungeeConnector, parameter, clickType, delay * 1000L); + return new SwitchServerAction(bungeeConnector, parameter, clickType, cooldown * 1000L, 0); } throw new IllegalArgumentException("Couldn't adapt znpcs click action: " + type); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionActionImpl.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionActionImpl.java index d59035a..ed7539e 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionActionImpl.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionActionImpl.java @@ -6,8 +6,8 @@ import lol.pyr.znpcsplus.api.interaction.InteractionType; import net.kyori.adventure.text.Component; public abstract class InteractionActionImpl extends InteractionAction { - protected InteractionActionImpl(long delay, InteractionType interactionType) { - super(delay, interactionType); + protected InteractionActionImpl(long cooldown, long delay, InteractionType interactionType) { + super(cooldown, delay, interactionType); } public abstract Component getInfo(String id, int index, CommandContext context); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java index 1f59e15..bf4736d 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java @@ -10,6 +10,7 @@ import lol.pyr.znpcsplus.api.interaction.InteractionType; import lol.pyr.znpcsplus.npc.NpcEntryImpl; import lol.pyr.znpcsplus.npc.NpcImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.user.User; import lol.pyr.znpcsplus.user.UserManager; import org.bukkit.Bukkit; @@ -18,10 +19,12 @@ import org.bukkit.entity.Player; public class InteractionPacketListener implements PacketListener { private final UserManager userManager; private final NpcRegistryImpl npcRegistry; + private final TaskScheduler scheduler; - public InteractionPacketListener(UserManager userManager, NpcRegistryImpl npcRegistry) { + public InteractionPacketListener(UserManager userManager, NpcRegistryImpl npcRegistry, TaskScheduler scheduler) { this.userManager = userManager; this.npcRegistry = npcRegistry; + this.scheduler = scheduler; } @Override @@ -43,11 +46,18 @@ public class InteractionPacketListener implements PacketListener { Bukkit.getPluginManager().callEvent(interactEvent); if (interactEvent.isCancelled()) return; - for (InteractionAction action : npc.getActions()) { - if (action.getInteractionType() != InteractionType.ANY_CLICK && action.getInteractionType() != type) continue; - if (action.getCooldown() > 0 && !user.actionCooldownCheck(action)) continue; - action.run(player); - } + scheduler.runSyncGlobal(() -> { + for (InteractionAction action : npc.getActions()) { + if (action.getInteractionType() != InteractionType.ANY_CLICK && action.getInteractionType() != type) continue; + if (action.getCooldown() > 0 && !user.actionCooldownCheck(action)) continue; + action.run(user.getPlayer()); + try { + Thread.sleep(action.getDelay()); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + }); } private InteractionType wrapClickType(WrapperPlayClientInteractEntity.InteractAction action) { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java index 83b6a1f..2153beb 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java @@ -16,8 +16,8 @@ public class ConsoleCommandAction extends InteractionActionImpl { private final TaskScheduler scheduler; private final String command; - public ConsoleCommandAction(TaskScheduler scheduler, String command, InteractionType interactionType, long delay) { - super(delay, interactionType); + public ConsoleCommandAction(TaskScheduler scheduler, String command, InteractionType interactionType, long cooldown, long delay) { + super(cooldown, delay, interactionType); this.scheduler = scheduler; this.command = command; } @@ -35,7 +35,7 @@ public class ConsoleCommandAction extends InteractionActionImpl { .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to edit this action", NamedTextColor.GRAY))) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.SUGGEST_COMMAND, - "/" + context.getLabel() + " action edit " + id + " " + index + " consolecommand " + getInteractionType().name() + " " + getCooldown()/1000 + " " + command)) + "/" + context.getLabel() + " action edit " + id + " " + index + " consolecommand " + getInteractionType().name() + " " + getCooldown()/1000 + " " + getDelay() + " " + command)) .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("[DELETE]", NamedTextColor.RED) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandActionType.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandActionType.java index 4f8c631..2461dc1 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandActionType.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandActionType.java @@ -22,14 +22,14 @@ public class ConsoleCommandActionType implements InteractionActionType 2 ? InteractionType.valueOf(split[2]) : InteractionType.ANY_CLICK; - return new ConsoleCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, Long.parseLong(split[1])); + return new ConsoleCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, Long.parseLong(split[1]), Long.parseLong(split.length > 3 ? split[3] : "0")); } @Override @@ -44,21 +44,23 @@ public class ConsoleCommandActionType implements InteractionActionType "); + context.setUsage(context.getUsage() + " " + getSubcommandName() + " "); } @Override public InteractionActionImpl parse(CommandContext context) throws CommandExecutionException { InteractionType type = context.parse(InteractionType.class); long cooldown = (long) (context.parse(Double.class) * 1000D); + long delay = (long) (context.parse(Integer.class) * 1D); String command = context.dumpAllArgs(); - return new ConsoleCommandAction(scheduler, command, type, cooldown); + return new ConsoleCommandAction(scheduler, command, type, cooldown, delay); } @Override public List suggest(CommandContext context) throws CommandExecutionException { if (context.argSize() == 1) return context.suggestEnum(InteractionType.values()); if (context.argSize() == 2) return context.suggestLiteral("1"); + if (context.argSize() == 3) return context.suggestLiteral("0"); return Collections.emptyList(); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java index d44b38b..3122f55 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java @@ -17,8 +17,8 @@ public class MessageAction extends InteractionActionImpl { private final String message; private final LegacyComponentSerializer textSerializer; - public MessageAction(BukkitAudiences adventure, String message, InteractionType interactionType, LegacyComponentSerializer textSerializer, long delay) { - super(delay, interactionType); + public MessageAction(BukkitAudiences adventure, String message, InteractionType interactionType, LegacyComponentSerializer textSerializer, long cooldown, long delay) { + super(cooldown, delay, interactionType); this.adventure = adventure; this.message = message; this.textSerializer = textSerializer; @@ -38,7 +38,7 @@ public class MessageAction extends InteractionActionImpl { .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to edit this action", NamedTextColor.GRAY))) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.SUGGEST_COMMAND, - "/" + context.getLabel() + " action edit " + id + " " + index + " message " + getInteractionType().name() + " " + getCooldown()/1000 + " " + message)) + "/" + context.getLabel() + " action edit " + id + " " + index + " message " + getInteractionType().name() + " " + getCooldown()/1000 + " " + getDelay() + " " + message)) .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("[DELETE]", NamedTextColor.RED) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageActionType.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageActionType.java index 35fc3c4..5a004ac 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageActionType.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageActionType.java @@ -25,14 +25,14 @@ public class MessageActionType implements InteractionActionType, @Override public String serialize(MessageAction obj) { - return Base64.getEncoder().encodeToString(obj.getMessage().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown() + ";" + obj.getInteractionType().name(); + return Base64.getEncoder().encodeToString(obj.getMessage().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown() + ";" + obj.getInteractionType().name() + ";" + obj.getDelay(); } @Override public MessageAction deserialize(String str) { String[] split = str.split(";"); InteractionType type = split.length > 2 ? InteractionType.valueOf(split[2]) : InteractionType.ANY_CLICK; - return new MessageAction(adventure, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, textSerializer, Long.parseLong(split[1])); + return new MessageAction(adventure, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, textSerializer, Long.parseLong(split[1]), Long.parseLong(split.length > 3 ? split[3] : "0")); } @Override @@ -47,21 +47,23 @@ public class MessageActionType implements InteractionActionType, @Override public void appendUsage(CommandContext context) { - context.setUsage(context.getUsage() + " " + getSubcommandName() + " "); + context.setUsage(context.getUsage() + " " + getSubcommandName() + " "); } @Override public InteractionActionImpl parse(CommandContext context) throws CommandExecutionException { InteractionType type = context.parse(InteractionType.class); long cooldown = (long) (context.parse(Double.class) * 1000D); + long delay = (long) (context.parse(Integer.class) * 1D); String message = context.dumpAllArgs(); - return new MessageAction(adventure, message, type, textSerializer, cooldown); + return new MessageAction(adventure, message, type, textSerializer, cooldown, delay); } @Override public List suggest(CommandContext context) throws CommandExecutionException { if (context.argSize() == 1) return context.suggestEnum(InteractionType.values()); if (context.argSize() == 2) return context.suggestLiteral("1"); + if (context.argSize() == 3) return context.suggestLiteral("0"); return Collections.emptyList(); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java index 0b30ae0..122f450 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java @@ -14,8 +14,8 @@ public class PlayerChatAction extends InteractionActionImpl { private final String message; private final TaskScheduler scheduler; - public PlayerChatAction(TaskScheduler scheduler, String message, InteractionType interactionType, long delay) { - super(delay, interactionType); + public PlayerChatAction(TaskScheduler scheduler, String message, InteractionType interactionType, long cooldown, long delay) { + super(cooldown, delay, interactionType); this.message = message; this.scheduler = scheduler; } @@ -33,7 +33,7 @@ public class PlayerChatAction extends InteractionActionImpl { .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to edit this action", NamedTextColor.GRAY))) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.SUGGEST_COMMAND, - "/" + context.getLabel() + " action edit " + id + " " + index + " playerchat " + getInteractionType().name() + " " + getCooldown()/1000 + " " + message)) + "/" + context.getLabel() + " action edit " + id + " " + index + " playerchat " + getInteractionType().name() + " " + getCooldown()/1000 + " " + getDelay() + " " + message)) .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("[DELETE]", NamedTextColor.RED) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatActionType.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatActionType.java index 069c2c2..c21ef83 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatActionType.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatActionType.java @@ -22,13 +22,13 @@ public class PlayerChatActionType implements InteractionActionType 3 ? split[3] : "0")); } @Override @@ -43,21 +43,23 @@ public class PlayerChatActionType implements InteractionActionType "); + context.setUsage(context.getUsage() + " " + getSubcommandName() + " "); } @Override public InteractionActionImpl parse(CommandContext context) throws CommandExecutionException { InteractionType type = context.parse(InteractionType.class); long cooldown = (long) (context.parse(Double.class) * 1000D); + long delay = (long) (context.parse(Integer.class) * 1D); String message = context.dumpAllArgs(); - return new PlayerChatAction(scheduler, message, type, cooldown); + return new PlayerChatAction(scheduler, message, type, cooldown, delay); } @Override public List suggest(CommandContext context) throws CommandExecutionException { if (context.argSize() == 1) return context.suggestEnum(InteractionType.values()); if (context.argSize() == 2) return context.suggestLiteral("1"); + if (context.argSize() == 3) return context.suggestLiteral("0"); return Collections.emptyList(); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java index f94751b..a67c668 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java @@ -15,8 +15,8 @@ public class PlayerCommandAction extends InteractionActionImpl { private final TaskScheduler scheduler; private final String command; - public PlayerCommandAction(TaskScheduler scheduler, String command, InteractionType interactionType, long delay) { - super(delay, interactionType); + public PlayerCommandAction(TaskScheduler scheduler, String command, InteractionType interactionType, long cooldown, long delay) { + super(cooldown, delay, interactionType); this.scheduler = scheduler; this.command = command; } @@ -34,7 +34,7 @@ public class PlayerCommandAction extends InteractionActionImpl { .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to edit this action", NamedTextColor.GRAY))) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.SUGGEST_COMMAND, - "/" + context.getLabel() + " action edit " + id + " " + index + " playercommand " + getInteractionType().name() + " " + getCooldown()/1000 + " " + command)) + "/" + context.getLabel() + " action edit " + id + " " + index + " playercommand " + getInteractionType().name() + " " + getCooldown()/1000 + " " + getDelay() + " " + command)) .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("[DELETE]", NamedTextColor.RED) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandActionType.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandActionType.java index 76fc400..d42e3af 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandActionType.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandActionType.java @@ -22,14 +22,14 @@ public class PlayerCommandActionType implements InteractionActionType 2 ? InteractionType.valueOf(split[2]) : InteractionType.ANY_CLICK; - return new PlayerCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, Long.parseLong(split[1])); + return new PlayerCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, Long.parseLong(split[1]), Long.parseLong(split.length > 3 ? split[3] : "0")); } @Override @@ -44,21 +44,23 @@ public class PlayerCommandActionType implements InteractionActionType "); + context.setUsage(context.getUsage() + " " + getSubcommandName() + " "); } @Override public InteractionActionImpl parse(CommandContext context) throws CommandExecutionException { InteractionType type = context.parse(InteractionType.class); long cooldown = (long) (context.parse(Double.class) * 1000D); + long delay = (long) (context.parse(Integer.class) * 1D); String command = context.dumpAllArgs(); - return new PlayerCommandAction(scheduler, command, type, cooldown); + return new PlayerCommandAction(scheduler, command, type, cooldown, delay); } @Override public List suggest(CommandContext context) throws CommandExecutionException { if (context.argSize() == 1) return context.suggestEnum(InteractionType.values()); if (context.argSize() == 2) return context.suggestLiteral("1"); + if (context.argSize() == 3) return context.suggestLiteral("0"); return Collections.emptyList(); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java index acc9c12..be4edab 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java @@ -14,8 +14,8 @@ public class SwitchServerAction extends InteractionActionImpl { private final BungeeConnector bungeeConnector; private final String server; - public SwitchServerAction(BungeeConnector bungeeConnector, String server, InteractionType interactionType, long delay) { - super(delay, interactionType); + public SwitchServerAction(BungeeConnector bungeeConnector, String server, InteractionType interactionType, long cooldown, long delay) { + super(cooldown, delay, interactionType); this.bungeeConnector = bungeeConnector; this.server = server; } @@ -32,7 +32,7 @@ public class SwitchServerAction extends InteractionActionImpl { .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, Component.text("Click to edit this action", NamedTextColor.GRAY))) .clickEvent(ClickEvent.clickEvent(ClickEvent.Action.SUGGEST_COMMAND, - "/" + context.getLabel() + " action edit " + id + " " + index + " switcserver " + getInteractionType().name() + " " + getCooldown()/1000 + " " + server)) + "/" + context.getLabel() + " action edit " + id + " " + index + " switcserver " + getInteractionType().name() + " " + getCooldown()/1000 + " " + getDelay() + " " + server)) .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("[DELETE]", NamedTextColor.RED) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerActionType.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerActionType.java index 272aad7..dd9522b 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerActionType.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerActionType.java @@ -22,14 +22,14 @@ public class SwitchServerActionType implements InteractionActionType 2 ? InteractionType.valueOf(split[2]) : InteractionType.ANY_CLICK; - return new SwitchServerAction(bungeeConnector, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, Long.parseLong(split[1])); + return new SwitchServerAction(bungeeConnector, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), type, Long.parseLong(split[1]), Long.parseLong(split.length > 3 ? split[3] : "0")); } @Override @@ -44,21 +44,23 @@ public class SwitchServerActionType implements InteractionActionType "); + context.setUsage(context.getUsage() + " " + getSubcommandName() + " "); } @Override public InteractionActionImpl parse(CommandContext context) throws CommandExecutionException { InteractionType type = context.parse(InteractionType.class); long cooldown = (long) (context.parse(Double.class) * 1000D); + long delay = (long) (context.parse(Integer.class) * 1D); String server = context.dumpAllArgs(); - return new SwitchServerAction(bungeeConnector, server, type, cooldown); + return new SwitchServerAction(bungeeConnector, server, type, cooldown, delay); } @Override public List suggest(CommandContext context) throws CommandExecutionException { if (context.argSize() == 1) return context.suggestEnum(InteractionType.values()); if (context.argSize() == 2) return context.suggestLiteral("1"); + if (context.argSize() == 3) return context.suggestLiteral("0"); return Collections.emptyList(); } } From 16e3207aaae2bd1ed0e6ff901b5aa8325cf87eeb Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Sat, 12 Aug 2023 23:10:48 +0530 Subject: [PATCH 2/6] small skin cache fix --- .../main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java index 8df8bcc..1f40f50 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java @@ -42,7 +42,7 @@ public class MojangSkinCache { Player player = Bukkit.getPlayerExact(name); if (player != null && player.isOnline()) return CompletableFuture.completedFuture(getFromPlayer(player)); - if (cache.containsKey(name.toLowerCase())) return fetchByUUID(idCache.get(name.toLowerCase()).getId()); + if (idCache.containsKey(name.toLowerCase())) return fetchByUUID(idCache.get(name.toLowerCase()).getId()); return CompletableFuture.supplyAsync(() -> { URL url = parseUrl("https://api.mojang.com/users/profiles/minecraft/" + name); From af286d685ded5eb04a287bbf6d52362d7dc80d73 Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Sun, 13 Aug 2023 11:12:27 +0530 Subject: [PATCH 3/6] added fallback server for fetching skin --- .../znpcsplus/skin/cache/MojangSkinCache.java | 47 +++++++++++++++++-- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java b/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java index 1f40f50..170e8ad 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/skin/cache/MojangSkinCache.java @@ -52,14 +52,52 @@ public class MojangSkinCache { connection.setRequestMethod("GET"); try (Reader reader = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)) { JsonObject obj = JsonParser.parseReader(reader).getAsJsonObject(); - if (obj.has("errorMessage")) return null; + if (obj.has("errorMessage")) return fetchByNameFallback(name).join(); String id = obj.get("id").getAsString(); idCache.put(name.toLowerCase(), new CachedId(id)); - return fetchByUUID(id).join(); + Skin skin = fetchByUUID(id).join(); + if (skin == null) return fetchByNameFallback(name).join(); + return skin; } } catch (IOException exception) { if (!configManager.getConfig().disableSkinFetcherWarnings()) { - logger.warning("Failed to get uuid from player name:"); + logger.warning("Failed to get uuid from player name, trying to use fallback server:"); + exception.printStackTrace(); + } + return fetchByNameFallback(name).join(); + } finally { + if (connection != null) connection.disconnect(); + } + }); + } + + public CompletableFuture fetchByNameFallback(String name) { + Player player = Bukkit.getPlayerExact(name); + if (player != null && player.isOnline()) return CompletableFuture.completedFuture(getFromPlayer(player)); + + if (idCache.containsKey(name.toLowerCase())) return fetchByUUID(idCache.get(name.toLowerCase()).getId()); + + return CompletableFuture.supplyAsync(() -> { + URL url = parseUrl("https://api.ashcon.app/mojang/v2/user/" + name); + HttpURLConnection connection = null; + try { + connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + try (Reader reader = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)) { + JsonObject obj = JsonParser.parseReader(reader).getAsJsonObject(); + if (obj.has("error")) return null; + String uuid = obj.get("uuid").getAsString(); + idCache.put(name.toLowerCase(), new CachedId(uuid)); + JsonObject textures = obj.get("textures").getAsJsonObject(); + String value = textures.get("raw").getAsJsonObject().get("value").getAsString(); + String signature = textures.get("raw").getAsJsonObject().get("signature").getAsString(); + Skin skin = new Skin(value, signature); + cache.put(uuid, skin); + return skin; + } + } catch (IOException exception) { + if (!configManager.getConfig().disableSkinFetcherWarnings()) { + logger.warning("Failed to fetch skin from fallback server:"); exception.printStackTrace(); } } finally { @@ -105,13 +143,14 @@ public class MojangSkinCache { connection.setRequestMethod("GET"); try (Reader reader = new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8)) { JsonObject obj = JsonParser.parseReader(reader).getAsJsonObject(); + if (obj.has("errorMessage")) return null; Skin skin = new Skin(obj); cache.put(uuid, skin); return skin; } } catch (IOException exception) { if (!configManager.getConfig().disableSkinFetcherWarnings()) { - logger.warning("Failed to fetch skin:"); + logger.warning("Failed to fetch skin, trying to use fallback server:"); exception.printStackTrace(); } } finally { From 12e2c2963db2956cdab1bcb6379aab8964f621dd Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Sun, 13 Aug 2023 12:08:48 +0530 Subject: [PATCH 4/6] Added async task scheduling --- .../java/lol/pyr/znpcsplus/reflection/Reflections.java | 8 ++++++++ .../lol/pyr/znpcsplus/scheduling/FoliaScheduler.java | 10 ++++++++++ .../lol/pyr/znpcsplus/scheduling/SpigotScheduler.java | 5 +++++ .../lol/pyr/znpcsplus/scheduling/TaskScheduler.java | 1 + 4 files changed, 24 insertions(+) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java b/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java index 5521938..04fc347 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/reflection/Reflections.java @@ -169,6 +169,14 @@ public final class Reflections { .setStrict(FoliaUtil.isFolia()) .toMethodReflection(); + public static final ReflectionLazyLoader FOLIA_RUN_NOW_ASYNC = + new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) + .withMethodName("runNow") + .withParameterTypes(Plugin.class, Consumer.class) + .withExpectResult(SCHEDULED_TASK_CLASS) + .setStrict(FoliaUtil.isFolia()) + .toMethodReflection(); + public static final ReflectionLazyLoader FOLIA_RUN_DELAYED_ASYNC = new ReflectionBuilder(ASYNC_SCHEDULER_CLASS) .withMethodName("runDelayed") diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java index f5575de..0436b39 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/FoliaScheduler.java @@ -43,6 +43,16 @@ public class FoliaScheduler extends TaskScheduler { } } + @Override + public void runAsyncGlobal(Runnable runnable) { + try { + Object scheduler = Reflections.FOLIA_GET_ASYNC_SCHEDULER.get().invoke(null); + Reflections.FOLIA_RUN_NOW_ASYNC.get().invoke(scheduler, plugin, (Consumer) o -> runnable.run()); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } + @Override public void runLaterAsync(Runnable runnable, long delay) { try { diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java index 3af2e68..949218a 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/SpigotScheduler.java @@ -24,6 +24,11 @@ public class SpigotScheduler extends TaskScheduler { Bukkit.getScheduler().runTask(plugin, runnable); } + @Override + public void runAsyncGlobal(Runnable runnable) { + Bukkit.getScheduler().runTaskAsynchronously(plugin, runnable); + } + @Override public void runLaterAsync(Runnable runnable, long delay) { Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, runnable, delay); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java index cf6d19d..fca0bf0 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/scheduling/TaskScheduler.java @@ -13,6 +13,7 @@ public abstract class TaskScheduler { public abstract void schedulePlayerChat(Player player, String message); public abstract void schedulePlayerCommand(Player player, String command); public abstract void runSyncGlobal(Runnable runnable); + public abstract void runAsyncGlobal(Runnable runnable); public abstract void runLaterAsync(Runnable runnable, long delay); public abstract void runDelayedTimerAsync(Runnable runnable, long delay, long interval); public abstract void cancelAll(); From 1e0739e73fe8f7ee0931a8ca591b2828e5e36a90 Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Sun, 13 Aug 2023 12:30:58 +0530 Subject: [PATCH 5/6] changed how action delay works --- .../interaction/InteractionPacketListener.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java index bf4736d..c27f3b6 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java @@ -46,18 +46,11 @@ public class InteractionPacketListener implements PacketListener { Bukkit.getPluginManager().callEvent(interactEvent); if (interactEvent.isCancelled()) return; - scheduler.runSyncGlobal(() -> { - for (InteractionAction action : npc.getActions()) { - if (action.getInteractionType() != InteractionType.ANY_CLICK && action.getInteractionType() != type) continue; - if (action.getCooldown() > 0 && !user.actionCooldownCheck(action)) continue; - action.run(user.getPlayer()); - try { - Thread.sleep(action.getDelay()); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - }); + for (InteractionAction action : npc.getActions()) { + if (action.getInteractionType() != InteractionType.ANY_CLICK && action.getInteractionType() != type) continue; + if (action.getCooldown() > 0 && !user.actionCooldownCheck(action)) continue; + scheduler.runLaterAsync(() -> action.run(player), action.getDelay()); + } } private InteractionType wrapClickType(WrapperPlayClientInteractEntity.InteractAction action) { From 15e342564cb38115318cf5519c7c56c671dfcdfc Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Sun, 13 Aug 2023 12:38:56 +0530 Subject: [PATCH 6/6] added delay info in hover of action list --- .../interaction/consolecommand/ConsoleCommandAction.java | 2 +- .../lol/pyr/znpcsplus/interaction/message/MessageAction.java | 2 +- .../pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java | 2 +- .../interaction/playercommand/PlayerCommandAction.java | 2 +- .../znpcsplus/interaction/switchserver/SwitchServerAction.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java index 2153beb..1b0b040 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java @@ -45,7 +45,7 @@ public class ConsoleCommandAction extends InteractionActionImpl { .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("Console Command: ", NamedTextColor.GREEN) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, - Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000, NamedTextColor.GREEN)))) + Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000 + " Delay: " + getDelay(), NamedTextColor.GRAY)))) .append(Component.text(command, NamedTextColor.WHITE))); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java index 3122f55..2382275 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java @@ -48,7 +48,7 @@ public class MessageAction extends InteractionActionImpl { .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("Message: ", NamedTextColor.GREEN) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, - Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000, NamedTextColor.GREEN)))) + Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000 + " Delay: " + getDelay(), NamedTextColor.GRAY)))) .append(Component.text(message, NamedTextColor.WHITE))); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java index 122f450..ab3ffe0 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playerchat/PlayerChatAction.java @@ -43,7 +43,7 @@ public class PlayerChatAction extends InteractionActionImpl { .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("Player Chat: ", NamedTextColor.GREEN) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, - Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000, NamedTextColor.GREEN)))) + Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000 + " Delay: " + getDelay(), NamedTextColor.GRAY)))) .append(Component.text(message, NamedTextColor.WHITE))); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java index a67c668..65ab64f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java @@ -44,7 +44,7 @@ public class PlayerCommandAction extends InteractionActionImpl { .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("Player Command: ", NamedTextColor.GREEN) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, - Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000, NamedTextColor.GREEN)))) + Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000 + " Delay: " + getDelay(), NamedTextColor.GRAY)))) .append(Component.text(command, NamedTextColor.WHITE))); } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java index be4edab..de9561e 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java @@ -42,7 +42,7 @@ public class SwitchServerAction extends InteractionActionImpl { .append(Component.text(" | ", NamedTextColor.GRAY)) .append(Component.text("Switch Server: ", NamedTextColor.GREEN) .hoverEvent(HoverEvent.hoverEvent(HoverEvent.Action.SHOW_TEXT, - Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000, NamedTextColor.GREEN)))) + Component.text("Click Type: " + getInteractionType().name() + " Cooldown: " + getCooldown()/1000 + " Delay: " + getDelay(), NamedTextColor.GRAY)))) .append(Component.text(server, NamedTextColor.WHITE))); }