diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionAddCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionAddCommand.java new file mode 100644 index 0000000..e70b8cf --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionAddCommand.java @@ -0,0 +1,43 @@ +package lol.pyr.znpcsplus.commands.action; + +import lol.pyr.director.adventure.command.CommandContext; +import lol.pyr.director.adventure.command.CommandHandler; +import lol.pyr.director.common.command.CommandExecutionException; +import lol.pyr.znpcsplus.interaction.ActionRegistry; +import lol.pyr.znpcsplus.interaction.InteractionCommandHandler; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +public class ActionAddCommand implements CommandHandler { + private final ActionRegistry actionRegistry; + + public ActionAddCommand(ActionRegistry actionRegistry) { + this.actionRegistry = actionRegistry; + } + + @Override + public void run(CommandContext context) throws CommandExecutionException { + List commands = actionRegistry.getCommands(); + context.setUsage(context.getLabel() + " action add "); + String sub = context.popString(); + for (InteractionCommandHandler command : commands) if (command.getSubcommandName().equalsIgnoreCase(sub)) { + command.run(context); + return; + } + context.send(Component.text("Invalid action type, available action types:\n" + + commands.stream().map(InteractionCommandHandler::getSubcommandName).collect(Collectors.joining(", ")), NamedTextColor.RED)); + } + + @Override + public List suggest(CommandContext context) throws CommandExecutionException { + List commands = actionRegistry.getCommands(); + if (context.argSize() == 1) return context.suggestStream(commands.stream().map(InteractionCommandHandler::getSubcommandName)); + String sub = context.popString(); + for (InteractionCommandHandler command : commands) if (command.getSubcommandName().equalsIgnoreCase(sub)) return command.suggest(context); + return Collections.emptyList(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionDeleteCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionDeleteCommand.java new file mode 100644 index 0000000..769571e --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionDeleteCommand.java @@ -0,0 +1,40 @@ +package lol.pyr.znpcsplus.commands.action; + +import lol.pyr.director.adventure.command.CommandContext; +import lol.pyr.director.adventure.command.CommandHandler; +import lol.pyr.director.common.command.CommandExecutionException; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Stream; + +public class ActionDeleteCommand implements CommandHandler { + private final NpcRegistryImpl npcRegistry; + + public ActionDeleteCommand(NpcRegistryImpl npcRegistry) { + this.npcRegistry = npcRegistry; + } + + @Override + public void run(CommandContext context) throws CommandExecutionException { + NpcImpl npc = context.parse(NpcEntryImpl.class).getNpc(); + int index = context.parse(Integer.class); + if (index >= npc.getActions().size() || index < 0) context.halt(Component.text("That npc doesn't have any action with the index " + index, NamedTextColor.RED)); + npc.removeAction(index); + context.send(Component.text("Removed action with index " + index, NamedTextColor.GREEN)); + } + + @Override + public List suggest(CommandContext context) throws CommandExecutionException { + if (context.argSize() == 1) return context.suggestCollection(npcRegistry.modifiableIds()); + if (context.argSize() == 2) return context.suggestStream(Stream.iterate(0, n -> n + 1) + .limit(context.suggestionParse(0, NpcEntryImpl.class).getNpc().getActions().size()) + .map(String::valueOf)); + return Collections.emptyList(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/commands/ActionCommand.java b/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionListCommand.java similarity index 54% rename from plugin/src/main/java/lol/pyr/znpcsplus/commands/ActionCommand.java rename to plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionListCommand.java index 5598f59..72caa0f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/commands/ActionCommand.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/commands/action/ActionListCommand.java @@ -1,20 +1,19 @@ -package lol.pyr.znpcsplus.commands; +package lol.pyr.znpcsplus.commands.action; import lol.pyr.director.adventure.command.CommandContext; import lol.pyr.director.adventure.command.CommandHandler; import lol.pyr.director.common.command.CommandExecutionException; -import java.util.Collections; import java.util.List; -public class ActionCommand implements CommandHandler { +public class ActionListCommand implements CommandHandler { @Override - public void run(CommandContext context) throws CommandExecutionException { - context.send("Not implemented yet."); + public void run(CommandContext commandContext) throws CommandExecutionException { + } @Override public List suggest(CommandContext context) throws CommandExecutionException { - return Collections.emptyList(); + return CommandHandler.super.suggest(context); } } diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/ActionRegistry.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/ActionRegistry.java index f812c8a..98b72ae 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/ActionRegistry.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/ActionRegistry.java @@ -1,31 +1,48 @@ package lol.pyr.znpcsplus.interaction; -import lol.pyr.znpcsplus.interaction.serialization.ConsoleCommandActionSerializer; -import lol.pyr.znpcsplus.interaction.serialization.MessageActionSerializer; -import lol.pyr.znpcsplus.interaction.serialization.PlayerCommandActionSerializer; -import lol.pyr.znpcsplus.interaction.serialization.SwitchServerActionSerializer; -import lol.pyr.znpcsplus.interaction.types.*; +import lol.pyr.znpcsplus.interaction.consolecommand.ConsoleCommandActionType; +import lol.pyr.znpcsplus.interaction.message.MessageActionType; +import lol.pyr.znpcsplus.interaction.playercommand.PlayerCommandActionType; +import lol.pyr.znpcsplus.interaction.switchserver.SwitchServerActionType; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.util.BungeeUtil; import lol.pyr.znpcsplus.util.StringSerializer; import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; +import java.util.stream.Collectors; public class ActionRegistry { - private final Map, StringSerializer> serializerMap = new HashMap<>(); + private final Map, InteractionActionType> serializerMap = new HashMap<>(); - public ActionRegistry(TaskScheduler taskScheduler, BukkitAudiences adventure, BungeeUtil bungeeUtil) { - register(ConsoleCommandAction.class, new ConsoleCommandActionSerializer(taskScheduler)); - register(PlayerCommandAction.class, new PlayerCommandActionSerializer(taskScheduler)); - register(SwitchServerAction.class, new SwitchServerActionSerializer(bungeeUtil)); - register(MessageAction.class, new MessageActionSerializer(adventure)); + public ActionRegistry() { } - public void register(Class clazz, StringSerializer serializer) { - serializerMap.put(clazz, serializer); + public void registerTypes(NpcRegistryImpl npcRegistry, TaskScheduler taskScheduler, BukkitAudiences adventure, BungeeUtil bungeeUtil, LegacyComponentSerializer textSerializer) { + register(new ConsoleCommandActionType(taskScheduler, npcRegistry)); + register(new PlayerCommandActionType(taskScheduler, npcRegistry)); + register(new SwitchServerActionType(bungeeUtil, npcRegistry)); + register(new MessageActionType(adventure, textSerializer, npcRegistry)); + } + + public void register(InteractionActionType type) { + serializerMap.put(type.getActionClass(), type); + } + + public void unregister(Class clazz) { + serializerMap.remove(clazz); + } + + public List getCommands() { + return serializerMap.values().stream() + .filter(type -> type instanceof InteractionCommandHandler) + .map(type -> (InteractionCommandHandler) type) + .collect(Collectors.toList()); } @SuppressWarnings("unchecked") diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionActionType.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionActionType.java new file mode 100644 index 0000000..d8b6303 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionActionType.java @@ -0,0 +1,7 @@ +package lol.pyr.znpcsplus.interaction; + +public interface InteractionActionType { + String serialize(T obj); + T deserialize(String str); + Class getActionClass(); +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionCommandHandler.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionCommandHandler.java new file mode 100644 index 0000000..ad704c6 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionCommandHandler.java @@ -0,0 +1,7 @@ +package lol.pyr.znpcsplus.interaction; + +import lol.pyr.director.adventure.command.CommandHandler; + +public interface InteractionCommandHandler extends CommandHandler { + String getSubcommandName(); +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/ConsoleCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java similarity index 94% rename from plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/ConsoleCommandAction.java rename to plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java index 9d8b32f..e71ad5d 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/ConsoleCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandAction.java @@ -1,4 +1,4 @@ -package lol.pyr.znpcsplus.interaction.types; +package lol.pyr.znpcsplus.interaction.consolecommand; import lol.pyr.znpcsplus.interaction.InteractionAction; import lol.pyr.znpcsplus.scheduling.TaskScheduler; 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 new file mode 100644 index 0000000..bcfd345 --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/consolecommand/ConsoleCommandActionType.java @@ -0,0 +1,64 @@ +package lol.pyr.znpcsplus.interaction.consolecommand; + +import lol.pyr.director.adventure.command.CommandContext; +import lol.pyr.director.common.command.CommandExecutionException; +import lol.pyr.znpcsplus.interaction.InteractionActionType; +import lol.pyr.znpcsplus.interaction.InteractionCommandHandler; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import lol.pyr.znpcsplus.scheduling.TaskScheduler; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Collections; +import java.util.List; + +public class ConsoleCommandActionType implements InteractionActionType, InteractionCommandHandler { + private final TaskScheduler scheduler; + private final NpcRegistryImpl npcRegistry; + + public ConsoleCommandActionType(TaskScheduler scheduler, NpcRegistryImpl npcRegistry) { + this.scheduler = scheduler; + this.npcRegistry = npcRegistry; + } + + @Override + public String serialize(ConsoleCommandAction obj) { + return Base64.getEncoder().encodeToString(obj.getCommand().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); + } + + @Override + public ConsoleCommandAction deserialize(String str) { + String[] split = str.split(";"); + return new ConsoleCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), Long.parseLong(split[1])); + } + + @Override + public Class getActionClass() { + return ConsoleCommandAction.class; + } + + @Override + public String getSubcommandName() { + return "consolecommand"; + } + + @Override + public void run(CommandContext context) throws CommandExecutionException { + context.setUsage(context.getUsage() + " consolecommand "); + NpcEntryImpl entry = context.parse(NpcEntryImpl.class); + long cooldown = (long) (context.parse(Double.class) * 1000D); + String command = context.dumpAllArgs(); + entry.getNpc().addAction(new ConsoleCommandAction(scheduler, command, cooldown)); + context.send(Component.text("Added a console command action to the npc with the command " + command, NamedTextColor.GREEN)); + } + + @Override + public List suggest(CommandContext context) throws CommandExecutionException { + if (context.argSize() == 1) return context.suggestCollection(npcRegistry.modifiableIds()); + if (context.argSize() == 2) return context.suggestLiteral("1"); + return Collections.emptyList(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/MessageAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java similarity index 93% rename from plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/MessageAction.java rename to plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java index 0db8de6..e62da50 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/MessageAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageAction.java @@ -1,4 +1,4 @@ -package lol.pyr.znpcsplus.interaction.types; +package lol.pyr.znpcsplus.interaction.message; import lol.pyr.znpcsplus.interaction.InteractionAction; import net.kyori.adventure.platform.bukkit.BukkitAudiences; 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 new file mode 100644 index 0000000..18d447d --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/message/MessageActionType.java @@ -0,0 +1,68 @@ +package lol.pyr.znpcsplus.interaction.message; + +import lol.pyr.director.adventure.command.CommandContext; +import lol.pyr.director.common.command.CommandExecutionException; +import lol.pyr.znpcsplus.interaction.InteractionActionType; +import lol.pyr.znpcsplus.interaction.InteractionCommandHandler; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import net.kyori.adventure.platform.bukkit.BukkitAudiences; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Collections; +import java.util.List; + +public class MessageActionType implements InteractionActionType, InteractionCommandHandler { + private final BukkitAudiences adventure; + private final LegacyComponentSerializer textSerializer; + private final NpcRegistryImpl npcRegistry; + + public MessageActionType(BukkitAudiences adventure, LegacyComponentSerializer textSerializer, NpcRegistryImpl npcRegistry) { + this.adventure = adventure; + this.textSerializer = textSerializer; + this.npcRegistry = npcRegistry; + } + + @Override + public String serialize(MessageAction obj) { + return Base64.getEncoder().encodeToString(MiniMessage.miniMessage().serialize(obj.getMessage()).getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); + } + + @Override + public MessageAction deserialize(String str) { + String[] split = str.split(";"); + return new MessageAction(adventure, MiniMessage.miniMessage().deserialize(new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8)), Long.parseLong(split[1])); + } + + @Override + public Class getActionClass() { + return MessageAction.class; + } + + @Override + public String getSubcommandName() { + return "message"; + } + + @Override + public void run(CommandContext context) throws CommandExecutionException { + context.setUsage(context.getUsage() + " consolecommand "); + NpcEntryImpl entry = context.parse(NpcEntryImpl.class); + long cooldown = (long) (context.parse(Double.class) * 1000D); + Component message = textSerializer.deserialize(context.dumpAllArgs()); + entry.getNpc().addAction(new MessageAction(adventure, message, cooldown)); + context.send(Component.text("Added a message action to the npc with the message ", NamedTextColor.GREEN).append(message)); + } + + @Override + public List suggest(CommandContext context) throws CommandExecutionException { + if (context.argSize() == 1) return context.suggestCollection(npcRegistry.modifiableIds()); + if (context.argSize() == 2) return context.suggestLiteral("1"); + return Collections.emptyList(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/PlayerCommandAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java similarity index 94% rename from plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/PlayerCommandAction.java rename to plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java index 27b968c..26c5514 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/PlayerCommandAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandAction.java @@ -1,4 +1,4 @@ -package lol.pyr.znpcsplus.interaction.types; +package lol.pyr.znpcsplus.interaction.playercommand; import lol.pyr.znpcsplus.interaction.InteractionAction; import lol.pyr.znpcsplus.scheduling.TaskScheduler; 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 new file mode 100644 index 0000000..25a13ce --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/playercommand/PlayerCommandActionType.java @@ -0,0 +1,64 @@ +package lol.pyr.znpcsplus.interaction.playercommand; + +import lol.pyr.director.adventure.command.CommandContext; +import lol.pyr.director.common.command.CommandExecutionException; +import lol.pyr.znpcsplus.interaction.InteractionActionType; +import lol.pyr.znpcsplus.interaction.InteractionCommandHandler; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import lol.pyr.znpcsplus.scheduling.TaskScheduler; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Collections; +import java.util.List; + +public class PlayerCommandActionType implements InteractionActionType, InteractionCommandHandler { + private final TaskScheduler scheduler; + private final NpcRegistryImpl npcRegistry; + + public PlayerCommandActionType(TaskScheduler scheduler, NpcRegistryImpl npcRegistry) { + this.scheduler = scheduler; + this.npcRegistry = npcRegistry; + } + + @Override + public String serialize(PlayerCommandAction obj) { + return Base64.getEncoder().encodeToString(obj.getCommand().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); + } + + @Override + public PlayerCommandAction deserialize(String str) { + String[] split = str.split(";"); + return new PlayerCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), Long.parseLong(split[1])); + } + + @Override + public Class getActionClass() { + return PlayerCommandAction.class; + } + + @Override + public String getSubcommandName() { + return "playercommand"; + } + + @Override + public void run(CommandContext context) throws CommandExecutionException { + context.setUsage(context.getUsage() + " playercommand "); + NpcEntryImpl entry = context.parse(NpcEntryImpl.class); + long cooldown = (long) (context.parse(Double.class) * 1000D); + String command = context.dumpAllArgs(); + entry.getNpc().addAction(new PlayerCommandAction(scheduler, command, cooldown)); + context.send(Component.text("Added a player command action to the npc with the command " + command, NamedTextColor.GREEN)); + } + + @Override + public List suggest(CommandContext context) throws CommandExecutionException { + if (context.argSize() == 1) return context.suggestCollection(npcRegistry.modifiableIds()); + if (context.argSize() == 2) return context.suggestLiteral("1"); + return Collections.emptyList(); + } +} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/ConsoleCommandActionSerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/ConsoleCommandActionSerializer.java deleted file mode 100644 index f2cc94a..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/ConsoleCommandActionSerializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package lol.pyr.znpcsplus.interaction.serialization; - -import lol.pyr.znpcsplus.interaction.types.ConsoleCommandAction; -import lol.pyr.znpcsplus.scheduling.TaskScheduler; -import lol.pyr.znpcsplus.util.StringSerializer; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -public class ConsoleCommandActionSerializer implements StringSerializer { - private final TaskScheduler scheduler; - - public ConsoleCommandActionSerializer(TaskScheduler scheduler) { - this.scheduler = scheduler; - } - - @Override - public String serialize(ConsoleCommandAction obj) { - return Base64.getEncoder().encodeToString(obj.getCommand().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); - } - - @Override - public ConsoleCommandAction deserialize(String str) { - String[] split = str.split(";"); - return new ConsoleCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), Long.parseLong(split[1])); - } -} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/MessageActionSerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/MessageActionSerializer.java deleted file mode 100644 index 3154a3f..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/MessageActionSerializer.java +++ /dev/null @@ -1,28 +0,0 @@ -package lol.pyr.znpcsplus.interaction.serialization; - -import lol.pyr.znpcsplus.interaction.types.MessageAction; -import lol.pyr.znpcsplus.util.StringSerializer; -import net.kyori.adventure.platform.bukkit.BukkitAudiences; -import net.kyori.adventure.text.minimessage.MiniMessage; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -public class MessageActionSerializer implements StringSerializer { - private final BukkitAudiences adventure; - - public MessageActionSerializer(BukkitAudiences adventure) { - this.adventure = adventure; - } - - @Override - public String serialize(MessageAction obj) { - return Base64.getEncoder().encodeToString(MiniMessage.miniMessage().serialize(obj.getMessage()).getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); - } - - @Override - public MessageAction deserialize(String str) { - String[] split = str.split(";"); - return new MessageAction(adventure, MiniMessage.miniMessage().deserialize(new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8)), Long.parseLong(split[1])); - } -} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/PlayerCommandActionSerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/PlayerCommandActionSerializer.java deleted file mode 100644 index a4f0912..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/PlayerCommandActionSerializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package lol.pyr.znpcsplus.interaction.serialization; - -import lol.pyr.znpcsplus.interaction.types.PlayerCommandAction; -import lol.pyr.znpcsplus.scheduling.TaskScheduler; -import lol.pyr.znpcsplus.util.StringSerializer; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -public class PlayerCommandActionSerializer implements StringSerializer { - private final TaskScheduler scheduler; - - public PlayerCommandActionSerializer(TaskScheduler scheduler) { - this.scheduler = scheduler; - } - - @Override - public String serialize(PlayerCommandAction obj) { - return Base64.getEncoder().encodeToString(obj.getCommand().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); - } - - @Override - public PlayerCommandAction deserialize(String str) { - String[] split = str.split(";"); - return new PlayerCommandAction(scheduler, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), Long.parseLong(split[1])); - } -} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/SwitchServerActionSerializer.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/SwitchServerActionSerializer.java deleted file mode 100644 index e04be57..0000000 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/serialization/SwitchServerActionSerializer.java +++ /dev/null @@ -1,27 +0,0 @@ -package lol.pyr.znpcsplus.interaction.serialization; - -import lol.pyr.znpcsplus.interaction.types.SwitchServerAction; -import lol.pyr.znpcsplus.util.BungeeUtil; -import lol.pyr.znpcsplus.util.StringSerializer; - -import java.nio.charset.StandardCharsets; -import java.util.Base64; - -public class SwitchServerActionSerializer implements StringSerializer { - private final BungeeUtil bungeeUtil; - - public SwitchServerActionSerializer(BungeeUtil bungeeUtil) { - this.bungeeUtil = bungeeUtil; - } - - @Override - public String serialize(SwitchServerAction obj) { - return Base64.getEncoder().encodeToString(obj.getServer().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); - } - - @Override - public SwitchServerAction deserialize(String str) { - String[] split = str.split(";"); - return new SwitchServerAction(bungeeUtil, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), Long.parseLong(split[1])); - } -} diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/SwitchServerAction.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java similarity index 92% rename from plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/SwitchServerAction.java rename to plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java index fc34c19..be7351f 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/types/SwitchServerAction.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerAction.java @@ -1,4 +1,4 @@ -package lol.pyr.znpcsplus.interaction.types; +package lol.pyr.znpcsplus.interaction.switchserver; import lol.pyr.znpcsplus.interaction.InteractionAction; import lol.pyr.znpcsplus.util.BungeeUtil; 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 new file mode 100644 index 0000000..1dcf45c --- /dev/null +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/switchserver/SwitchServerActionType.java @@ -0,0 +1,64 @@ +package lol.pyr.znpcsplus.interaction.switchserver; + +import lol.pyr.director.adventure.command.CommandContext; +import lol.pyr.director.common.command.CommandExecutionException; +import lol.pyr.znpcsplus.interaction.InteractionActionType; +import lol.pyr.znpcsplus.interaction.InteractionCommandHandler; +import lol.pyr.znpcsplus.npc.NpcEntryImpl; +import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import lol.pyr.znpcsplus.util.BungeeUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; + +import java.nio.charset.StandardCharsets; +import java.util.Base64; +import java.util.Collections; +import java.util.List; + +public class SwitchServerActionType implements InteractionActionType, InteractionCommandHandler { + private final BungeeUtil bungeeUtil; + private final NpcRegistryImpl npcRegistry; + + public SwitchServerActionType(BungeeUtil bungeeUtil, NpcRegistryImpl npcRegistry) { + this.bungeeUtil = bungeeUtil; + this.npcRegistry = npcRegistry; + } + + @Override + public String serialize(SwitchServerAction obj) { + return Base64.getEncoder().encodeToString(obj.getServer().getBytes(StandardCharsets.UTF_8)) + ";" + obj.getCooldown(); + } + + @Override + public SwitchServerAction deserialize(String str) { + String[] split = str.split(";"); + return new SwitchServerAction(bungeeUtil, new String(Base64.getDecoder().decode(split[0]), StandardCharsets.UTF_8), Long.parseLong(split[1])); + } + + @Override + public Class getActionClass() { + return SwitchServerAction.class; + } + + @Override + public String getSubcommandName() { + return "switchserver"; + } + + @Override + public void run(CommandContext context) throws CommandExecutionException { + context.setUsage(context.getUsage() + " switchserver "); + NpcEntryImpl entry = context.parse(NpcEntryImpl.class); + long cooldown = (long) (context.parse(Double.class) * 1000D); + String server = context.dumpAllArgs(); + entry.getNpc().addAction(new SwitchServerAction(bungeeUtil, server, cooldown)); + context.send(Component.text("Added a switch server action to the npc with the server " + server, NamedTextColor.GREEN)); + } + + @Override + public List suggest(CommandContext context) throws CommandExecutionException { + if (context.argSize() == 1) return context.suggestCollection(npcRegistry.modifiableIds()); + if (context.argSize() == 2) return context.suggestLiteral("1"); + return Collections.emptyList(); + } +}