From 889c6b77a51a4ce95aa09097af6459e1c4fed02d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elias=20M=C3=BCller?= Date: Sat, 11 Nov 2023 17:16:55 +0100 Subject: [PATCH] Added base event-system Added Help --- .../java/eu/mhsl/craftattack/spawn/Main.java | 13 +++- .../spawn/appliance/ApplianceCommand.java | 26 +++---- .../spawn/appliance/ApplianceListener.java | 11 +-- .../spawn/appliance/ApplianceSupplier.java | 15 +++- .../spawn/appliance/IApplianceSupplier.java | 5 ++ .../spawn/appliances/debug/Debug.java | 6 +- .../debug/command/AppliancesCommand.java | 30 +++++++ .../spawn/appliances/event/Event.java | 78 +++++++++++++++++++ .../event/command/EventCommand.java | 18 +++++ .../event/command/EventEndSessionCommand.java | 18 +++++ .../command/EventOpenSessionCommand.java | 18 +++++ .../command/MoveEventVillagerCommand.java | 18 +++++ .../spawn/appliances/help/Help.java | 25 ++++++ .../appliances/help/command/HelpCommand.java | 24 ++++++ .../appliances/help/command/SpawnCommand.java | 24 ++++++ .../help/command/TeamspeakCommand.java | 32 ++++++++ .../appliances/worldmuseum/WorldMuseum.java | 37 +++------ .../listener/InventoryOpenListener.java | 16 ---- .../PlayerEntityInteractListener.java | 16 ---- .../spawn/util/DisplayVillager.java | 41 ++++++++++ .../DismissInventoryOpenFromHolder.java | 23 ++++++ .../PlayerInteractAtEntityEventListener.java | 24 ++++++ src/main/resources/config.yml | 17 +++- src/main/resources/plugin.yml | 9 +++ 24 files changed, 458 insertions(+), 86 deletions(-) create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/AppliancesCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventEndSessionCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventOpenSessionCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/MoveEventVillagerCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/help/Help.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/HelpCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/SpawnCommand.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/TeamspeakCommand.java delete mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/InventoryOpenListener.java delete mode 100644 src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/PlayerEntityInteractListener.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/DismissInventoryOpenFromHolder.java create mode 100644 src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/PlayerInteractAtEntityEventListener.java diff --git a/src/main/java/eu/mhsl/craftattack/spawn/Main.java b/src/main/java/eu/mhsl/craftattack/spawn/Main.java index ce063e2..471c5dc 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/Main.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/Main.java @@ -5,6 +5,8 @@ import eu.mhsl.craftattack.spawn.appliances.adminMarker.AdminMarker; import eu.mhsl.craftattack.spawn.appliances.chatMessages.ChatMessages; import eu.mhsl.craftattack.spawn.appliances.countdown.Countdown; import eu.mhsl.craftattack.spawn.appliances.debug.Debug; +import eu.mhsl.craftattack.spawn.appliances.event.Event; +import eu.mhsl.craftattack.spawn.appliances.help.Help; import eu.mhsl.craftattack.spawn.appliances.report.Report; import eu.mhsl.craftattack.spawn.appliances.tablist.Tablist; import eu.mhsl.craftattack.spawn.appliances.titleClear.TitleClear; @@ -35,12 +37,15 @@ public final class Main extends JavaPlugin { new Tablist(), new ChatMessages(), new Report(), + new Event(), + new Help(), new Debug() ); Bukkit.getLogger().info("Loading appliances..."); appliances.forEach(appliance -> { - appliance.initialize(this); + Bukkit.getLogger().info("Enabling " + appliance.getClass().getSimpleName()); appliance.onEnable(); + appliance.initialize(this); }); Bukkit.getLogger().info("Loaded " + appliances.size() + " appliances!"); @@ -49,12 +54,15 @@ public final class Main extends JavaPlugin { @Override public void onDisable() { + Bukkit.getLogger().info("Disabling appliances..."); appliances.forEach(appliance -> { + Bukkit.getLogger().info("Disabling " + appliance.getClass().getSimpleName()); appliance.onDisable(); appliance.destruct(this); }); HandlerList.unregisterAll(this); Bukkit.getScheduler().cancelTasks(this); + Bukkit.getLogger().info("Disabled " + appliances.size() + " appliances!"); } public T getAppliance(Class clazz) { @@ -66,6 +74,9 @@ public final class Main extends JavaPlugin { return (Class) ((ParameterizedType) clazz.getGenericSuperclass()).getActualTypeArguments()[0]; } + public List getAppliances() { + return appliances; + } public static Main instance() { return instance; diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java index 937ad9a..92b4a5b 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceCommand.java @@ -1,6 +1,5 @@ package eu.mhsl.craftattack.spawn.appliance; -import eu.mhsl.craftattack.spawn.Main; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; @@ -18,12 +17,10 @@ import java.util.Optional; /** * Utility class which enables command name definition over a constructor. */ -public abstract class ApplianceCommand implements ApplianceSupplier, TabCompleter, CommandExecutor { +public abstract class ApplianceCommand extends ApplianceSupplier implements TabCompleter, CommandExecutor { public String commandName; - private final T appliance; - protected Component errorMessage = Component.text("Error whilst executing command").color(NamedTextColor.RED); + protected Component errorMessage = Component.text("Fehler: ").color(NamedTextColor.RED); public ApplianceCommand(String command) { - this.appliance = Main.instance().getAppliance(Main.getApplianceType(getClass())); this.commandName = command; } @@ -36,9 +33,11 @@ public abstract class ApplianceCommand implements Appliance public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { try { execute(sender, command, label, args); + } catch (Error e) { + sender.sendMessage(errorMessage.append(Component.text(e.getMessage()))); } catch (Exception e) { - sender.sendMessage(errorMessage); - Bukkit.getLogger().warning("Error executing appliance command " + commandName + " with " + e.getMessage()); + sender.sendMessage(errorMessage.append(Component.text("Interner Fehler"))); + Bukkit.getLogger().warning("Error executing appliance command " + commandName + ": " + e.getMessage()); e.printStackTrace(System.err); return false; } @@ -56,17 +55,12 @@ public abstract class ApplianceCommand implements Appliance protected abstract void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args); - @Override - public T getAppliance() { - return appliance; - } - /** * Utility class for command which can only be used as a Player. You can access the executing player with the getPlayer() method. */ public static abstract class PlayerChecked extends ApplianceCommand { private Player player; - private Component notPlayerMessage = Component.text("This command can only be executed as an Player!").color(NamedTextColor.RED); + private Component notPlayerMessage = Component.text("Dieser Command kann nur von Spielern ausgeführt werden!").color(NamedTextColor.RED); public PlayerChecked(String command) { super(command); } @@ -95,4 +89,10 @@ public abstract class ApplianceCommand implements Appliance return this.player; } } + + public static class Error extends RuntimeException { + public Error(String message) { + super(message); + } + } } \ No newline at end of file diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java index 5203381..b8268fb 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceListener.java @@ -1,6 +1,5 @@ package eu.mhsl.craftattack.spawn.appliance; -import eu.mhsl.craftattack.spawn.Main; import org.bukkit.event.Listener; /** @@ -8,14 +7,6 @@ import org.bukkit.event.Listener; * You can access the appliance with the protected 'appliance' field. * @param the type of your appliance */ -public abstract class ApplianceListener implements ApplianceSupplier, Listener { - private final T appliance; - protected ApplianceListener() { - this.appliance = Main.instance().getAppliance(Main.getApplianceType(getClass())); - } +public abstract class ApplianceListener extends ApplianceSupplier implements Listener { - @Override - public T getAppliance() { - return appliance; - } } \ No newline at end of file diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java index f4094a8..28773d3 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/ApplianceSupplier.java @@ -1,5 +1,16 @@ package eu.mhsl.craftattack.spawn.appliance; -public interface ApplianceSupplier { - T getAppliance(); +import eu.mhsl.craftattack.spawn.Main; + +public class ApplianceSupplier implements IApplianceSupplier { + private final T appliance; + + public ApplianceSupplier() { + this.appliance = Main.instance().getAppliance(Main.getApplianceType(getClass())); + } + + @Override + public T getAppliance() { + return this.appliance; + } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java b/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java new file mode 100644 index 0000000..8c8bbde --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliance/IApplianceSupplier.java @@ -0,0 +1,5 @@ +package eu.mhsl.craftattack.spawn.appliance; + +public interface IApplianceSupplier { + T getAppliance(); +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java index 4b1e94e..1364ac3 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/Debug.java @@ -2,6 +2,7 @@ package eu.mhsl.craftattack.spawn.appliances.debug; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.debug.command.AppliancesCommand; import eu.mhsl.craftattack.spawn.appliances.debug.command.UserInfoCommand; import org.jetbrains.annotations.NotNull; @@ -9,6 +10,9 @@ import java.util.List; public class Debug extends Appliance { @Override protected @NotNull List> commands() { - return List.of(new UserInfoCommand()); + return List.of( + new UserInfoCommand(), + new AppliancesCommand() + ); } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/AppliancesCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/AppliancesCommand.java new file mode 100644 index 0000000..e8e9a60 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/debug/command/AppliancesCommand.java @@ -0,0 +1,30 @@ +package eu.mhsl.craftattack.spawn.appliances.debug.command; + +import eu.mhsl.craftattack.spawn.Main; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.debug.Debug; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.ComponentBuilder; +import net.kyori.adventure.text.TextComponent; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.stream.Collectors; + +public class AppliancesCommand extends ApplianceCommand { + public AppliancesCommand() { + super("appliances"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + ComponentBuilder componentBuilder = Component.text() + .append(Component.text(Main.instance().getAppliances().size())) + .append(Component.text(" appliances loaded:")) + .appendNewline() + .append(Component.text(Main.instance().getAppliances().stream().map(appliance -> appliance.getClass().getSimpleName()).collect(Collectors.joining(", ")))); + + sender.sendMessage(componentBuilder.build()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java new file mode 100644 index 0000000..1b805ce --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/Event.java @@ -0,0 +1,78 @@ +package eu.mhsl.craftattack.spawn.appliances.event; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.event.command.EventCommand; +import eu.mhsl.craftattack.spawn.appliances.event.command.EventEndSessionCommand; +import eu.mhsl.craftattack.spawn.appliances.event.command.EventOpenSessionCommand; +import eu.mhsl.craftattack.spawn.appliances.event.command.MoveEventVillagerCommand; +import eu.mhsl.craftattack.spawn.util.DisplayVillager; +import eu.mhsl.craftattack.spawn.util.PluginMessage; +import eu.mhsl.craftattack.spawn.util.commonListeners.DismissInventoryOpenFromHolder; +import eu.mhsl.craftattack.spawn.util.commonListeners.PlayerInteractAtEntityEventListener; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.entity.Player; +import org.bukkit.entity.Villager; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class Event extends Appliance { + public DisplayVillager.ConfigBound villager; + private boolean isOpen = false; + + public Event() { + super("event"); + } + + @Override + public void onEnable() { + this.villager = new DisplayVillager.ConfigBound( + localConfig(), + villager -> { + villager.customName(Component.text("Events", NamedTextColor.GOLD)); + villager.setProfession(Villager.Profession.LIBRARIAN); + villager.setVillagerType(Villager.Type.SNOW); + } + ); + } + + public void openEvent() { + if(isOpen) throw new ApplianceCommand.Error("Es läuft derzeit bereits ein Event!"); + isOpen = true; + } + + public void joinEvent(Player p) { + if(!isOpen) { + p.sendMessage(Component.text("Zurzeit ist kein Event geöffnet.", NamedTextColor.RED)); + return; + } + + PluginMessage.connect(p, localConfig().getString("connect-server-name")); + } + + public void endEvent() { + if(!isOpen) throw new ApplianceCommand.Error("Es läuft derzeit kein Event!"); + isOpen = false; + } + + @Override + protected @NotNull List> commands() { + return List.of( + new EventCommand(), + new MoveEventVillagerCommand(), + new EventOpenSessionCommand(), + new EventEndSessionCommand() + ); + } + + @Override + protected @NotNull List eventHandlers() { + return List.of( + new PlayerInteractAtEntityEventListener(this.villager.getUniqueId(), playerInteractAtEntityEvent -> joinEvent(playerInteractAtEntityEvent.getPlayer())), + new DismissInventoryOpenFromHolder(this.villager.getUniqueId()) + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventCommand.java new file mode 100644 index 0000000..0473883 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventCommand.java @@ -0,0 +1,18 @@ +package eu.mhsl.craftattack.spawn.appliances.event.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.event.Event; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class EventCommand extends ApplianceCommand.PlayerChecked { + public EventCommand() { + super("event"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + getAppliance().joinEvent(getPlayer()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventEndSessionCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventEndSessionCommand.java new file mode 100644 index 0000000..018bfd0 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventEndSessionCommand.java @@ -0,0 +1,18 @@ +package eu.mhsl.craftattack.spawn.appliances.event.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.event.Event; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class EventEndSessionCommand extends ApplianceCommand { + public EventEndSessionCommand() { + super("eventEndSession"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + getAppliance().endEvent(); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventOpenSessionCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventOpenSessionCommand.java new file mode 100644 index 0000000..be06bb6 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/EventOpenSessionCommand.java @@ -0,0 +1,18 @@ +package eu.mhsl.craftattack.spawn.appliances.event.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.event.Event; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class EventOpenSessionCommand extends ApplianceCommand { + public EventOpenSessionCommand() { + super("eventOpenSession"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + getAppliance().openEvent(); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/MoveEventVillagerCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/MoveEventVillagerCommand.java new file mode 100644 index 0000000..b1f3428 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/event/command/MoveEventVillagerCommand.java @@ -0,0 +1,18 @@ +package eu.mhsl.craftattack.spawn.appliances.event.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.event.Event; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class MoveEventVillagerCommand extends ApplianceCommand.PlayerChecked { + public MoveEventVillagerCommand() { + super("moveEventVillager"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + getAppliance().villager.updateLocation(getPlayer().getLocation()); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/Help.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/Help.java new file mode 100644 index 0000000..2b2bbad --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/Help.java @@ -0,0 +1,25 @@ +package eu.mhsl.craftattack.spawn.appliances.help; + +import eu.mhsl.craftattack.spawn.appliance.Appliance; +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.help.command.HelpCommand; +import eu.mhsl.craftattack.spawn.appliances.help.command.SpawnCommand; +import eu.mhsl.craftattack.spawn.appliances.help.command.TeamspeakCommand; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class Help extends Appliance { + public Help() { + super("help"); + } + + @Override + protected @NotNull List> commands() { + return List.of( + new HelpCommand(), + new SpawnCommand(), + new TeamspeakCommand() + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/HelpCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/HelpCommand.java new file mode 100644 index 0000000..83af74b --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/HelpCommand.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.spawn.appliances.help.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.help.Help; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class HelpCommand extends ApplianceCommand { + public HelpCommand() { + super("help"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + sender.sendMessage( + Component.text("Willkommen auf Craftattack!", NamedTextColor.GOLD) + .appendNewline() + .append(Component.text("Hier ist ein Hilfetext!", NamedTextColor.GRAY)) + ); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/SpawnCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/SpawnCommand.java new file mode 100644 index 0000000..d912e8b --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/SpawnCommand.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.spawn.appliances.help.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.help.Help; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.Objects; + +public class SpawnCommand extends ApplianceCommand { + private static final String spawnKey = "spawn"; + public SpawnCommand() { + super("spawn"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(!getAppliance().localConfig().isString(spawnKey)) throw new ApplianceCommand.Error("Es wurde kein Spawnbereich hinterlegt!"); + sender.sendMessage(Component.text(Objects.requireNonNull(getAppliance().localConfig().getString(spawnKey)), NamedTextColor.GOLD)); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/TeamspeakCommand.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/TeamspeakCommand.java new file mode 100644 index 0000000..6326e7c --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/help/command/TeamspeakCommand.java @@ -0,0 +1,32 @@ +package eu.mhsl.craftattack.spawn.appliances.help.command; + +import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; +import eu.mhsl.craftattack.spawn.appliances.help.Help; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +public class TeamspeakCommand extends ApplianceCommand { + private static final String teamspeakKey = "teamspeak"; + public TeamspeakCommand() { + super("teamspeak"); + } + + @Override + protected void execute(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { + if(!getAppliance().localConfig().isString(teamspeakKey)) throw new ApplianceCommand.Error("Es wurde kein Teamspeak hinterlegt!"); + sender.sendMessage( + Component.text() + .append(Component.text("Joine unserem Teamspeak: ", NamedTextColor.GOLD)) + .append(getTeamspeakIp(getAppliance().localConfig().getString(teamspeakKey))) + ); + } + + private Component getTeamspeakIp(String ip) { + return Component.text() + .append(Component.text(ip, NamedTextColor.AQUA)) + .build(); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java index d0efee6..4d56b63 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/WorldMuseum.java @@ -2,13 +2,11 @@ package eu.mhsl.craftattack.spawn.appliances.worldmuseum; import eu.mhsl.craftattack.spawn.appliance.Appliance; import eu.mhsl.craftattack.spawn.appliance.ApplianceCommand; -import eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener.InventoryOpenListener; -import eu.mhsl.craftattack.spawn.config.ConfigUtil; -import eu.mhsl.craftattack.spawn.config.Configuration; import eu.mhsl.craftattack.spawn.appliances.worldmuseum.command.MoveWorldMuseumVillagerCommand; -import eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener.PlayerEntityInteractListener; import eu.mhsl.craftattack.spawn.util.DisplayVillager; import eu.mhsl.craftattack.spawn.util.PluginMessage; +import eu.mhsl.craftattack.spawn.util.commonListeners.DismissInventoryOpenFromHolder; +import eu.mhsl.craftattack.spawn.util.commonListeners.PlayerInteractAtEntityEventListener; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import org.bukkit.Bukkit; @@ -18,11 +16,9 @@ import org.bukkit.event.Listener; import org.jetbrains.annotations.NotNull; import java.util.List; -import java.util.Objects; -import java.util.UUID; public class WorldMuseum extends Appliance { - public DisplayVillager villager; + public DisplayVillager.ConfigBound villager; public WorldMuseum() { super("worldMuseum"); @@ -30,28 +26,17 @@ public class WorldMuseum extends Appliance { @Override public void onEnable() { - Location location = ConfigUtil.Position.paseLocation(Objects.requireNonNull(localConfig().getConfigurationSection("villagerLocation"))); - this.villager = new DisplayVillager( - UUID.fromString(localConfig().getString("uuid", UUID.randomUUID().toString())), - location, + this.villager = new DisplayVillager.ConfigBound( + localConfig(), villager -> { - localConfig().set("uuid", villager.getUniqueId().toString()); - Configuration.saveChanges(); - - villager.customName(Component.text("Weltenansicht").color(NamedTextColor.GOLD)); - villager.setProfession(Villager.Profession.LIBRARIAN); - villager.setVillagerType(Villager.Type.SAVANNA); + villager.customName(Component.text("Museum der Welten").color(NamedTextColor.GOLD)); + villager.setProfession(Villager.Profession.CARTOGRAPHER); + villager.setVillagerType(Villager.Type.SNOW); } ); } public void updateVillagerPosition(Location location) { - ConfigUtil.Position.writeLocation( - Objects.requireNonNull(localConfig().getConfigurationSection("villagerLocation")), - location - ); - Configuration.saveChanges(); - - this.villager.getVillager().teleport(location); + this.villager.updateLocation(location); } public void handleVillagerInteraction(Player player) { @@ -67,8 +52,8 @@ public class WorldMuseum extends Appliance { @Override protected @NotNull List eventHandlers() { return List.of( - new PlayerEntityInteractListener(), - new InventoryOpenListener() + new PlayerInteractAtEntityEventListener(this.villager.getUniqueId(), playerInteractAtEntityEvent -> handleVillagerInteraction(playerInteractAtEntityEvent.getPlayer())), + new DismissInventoryOpenFromHolder(this.villager.getUniqueId()) ); } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/InventoryOpenListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/InventoryOpenListener.java deleted file mode 100644 index baedf5f..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/InventoryOpenListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener; - -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.worldmuseum.WorldMuseum; -import org.bukkit.entity.Villager; -import org.bukkit.event.EventHandler; -import org.bukkit.event.inventory.InventoryOpenEvent; - -public class InventoryOpenListener extends ApplianceListener { - @EventHandler - public void onInventoryOpen(InventoryOpenEvent event) { - if(event.getInventory().getHolder() instanceof Villager villager) { - event.setCancelled(villager.getUniqueId().equals(getAppliance().villager.getVillager().getUniqueId())); - } - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/PlayerEntityInteractListener.java b/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/PlayerEntityInteractListener.java deleted file mode 100644 index 364e70d..0000000 --- a/src/main/java/eu/mhsl/craftattack/spawn/appliances/worldmuseum/listener/PlayerEntityInteractListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package eu.mhsl.craftattack.spawn.appliances.worldmuseum.listener; - -import eu.mhsl.craftattack.spawn.appliance.ApplianceListener; -import eu.mhsl.craftattack.spawn.appliances.worldmuseum.WorldMuseum; -import org.bukkit.event.EventHandler; -import org.bukkit.event.player.PlayerInteractAtEntityEvent; - -public class PlayerEntityInteractListener extends ApplianceListener { - @EventHandler - public void onInteract(PlayerInteractAtEntityEvent event) { - if (!event.getRightClicked().getUniqueId().equals(getAppliance().villager.getVillager().getUniqueId())) return; - - event.setCancelled(true); - getAppliance().handleVillagerInteraction(event.getPlayer()); - } -} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java b/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java index 3483628..6f62fcc 100644 --- a/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/DisplayVillager.java @@ -1,6 +1,9 @@ package eu.mhsl.craftattack.spawn.util; +import eu.mhsl.craftattack.spawn.config.ConfigUtil; +import eu.mhsl.craftattack.spawn.config.Configuration; import org.bukkit.Location; +import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.EntityType; import org.bukkit.entity.Villager; @@ -43,4 +46,42 @@ public class DisplayVillager { villager.setCustomNameVisible(true); return villager; } + + public static class ConfigBound { + private final DisplayVillager villager; + private final ConfigurationSection config; + public ConfigBound(ConfigurationSection configurationSection, Consumer villagerCreator) { + this.config = configurationSection; + + Location location = ConfigUtil.Position.paseLocation(Objects.requireNonNull(this.config.getConfigurationSection("villagerLocation"))); + this.villager = new DisplayVillager( + UUID.fromString(this.config.getString("uuid", UUID.randomUUID().toString())), + location, + villager -> { + this.config.set("uuid", villager.getUniqueId().toString()); + Configuration.saveChanges(); + + villagerCreator.accept(villager); + } + ); + } + + public void updateLocation(Location location) { + ConfigUtil.Position.writeLocation( + Objects.requireNonNull(this.config.getConfigurationSection("villagerLocation")), + location + ); + Configuration.saveChanges(); + + this.villager.getVillager().teleport(location); + } + + public Villager getVillager() { + return villager.getVillager(); + } + + public UUID getUniqueId() { + return getVillager().getUniqueId(); + } + } } diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/DismissInventoryOpenFromHolder.java b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/DismissInventoryOpenFromHolder.java new file mode 100644 index 0000000..4acf048 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/DismissInventoryOpenFromHolder.java @@ -0,0 +1,23 @@ +package eu.mhsl.craftattack.spawn.util.commonListeners; + +import org.bukkit.entity.Entity; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryOpenEvent; + +import java.util.UUID; + +public class DismissInventoryOpenFromHolder implements Listener { + private final UUID inventoryHolder; + + public DismissInventoryOpenFromHolder(UUID inventoryHolder) { + this.inventoryHolder = inventoryHolder; + } + + @EventHandler + public void onInventoryOpen(InventoryOpenEvent event) { + if(event.getInventory().getHolder() instanceof Entity holder) { + if(holder.getUniqueId().equals(this.inventoryHolder)) event.setCancelled(true); + } + } +} diff --git a/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/PlayerInteractAtEntityEventListener.java b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/PlayerInteractAtEntityEventListener.java new file mode 100644 index 0000000..d9bd98f --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/spawn/util/commonListeners/PlayerInteractAtEntityEventListener.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.spawn.util.commonListeners; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractAtEntityEvent; + +import java.util.UUID; +import java.util.function.Consumer; + +public class PlayerInteractAtEntityEventListener implements Listener { + private final UUID interactableEntityUUID; + private final Consumer callback; + + public PlayerInteractAtEntityEventListener(UUID interactableEntityUUID, Consumer callback) { + this.interactableEntityUUID = interactableEntityUUID; + this.callback = callback; + } + + @EventHandler + public void onInteract(PlayerInteractAtEntityEvent event) { + if (!event.getRightClicked().getUniqueId().equals(this.interactableEntityUUID)) return; + this.callback.accept(event); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 375640f..9a163d5 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,4 @@ worldMuseum: - enabled: false uuid: connect-server-name: worldmuseum villagerLocation: @@ -23,3 +22,19 @@ countdown: report: api: https://mhsl.eu/craftattack/report + +event: + api: http://10.20.0.1/ + connect-server-name: event + uuid: + villagerLocation: + world: world + x: 0 + y: 0 + z: 0 + yaw: 0 + pitch: 0 + +help: + teamspeak: myserver.com + spawn: "Der Weltspawn befindet sich bei x:0 y:0 z:0" \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index dbaee46..f77aa01 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -18,3 +18,12 @@ commands: description: Cancels project countdown projectStartReset: description: Resets project countdown + moveEventVillager: + appliances: + event: + eventOpenSession: + eventEndSession: + help: + spawn: + teamspeak: + aliases: ["ts"]