From d9c2df91cde371103721d410a741993b7417eced Mon Sep 17 00:00:00 2001 From: ridriss56 Date: Sat, 23 May 2026 16:16:09 +0200 Subject: [PATCH 1/2] Added join/leave messages with configurable toggles. --- .../pikzstudios/listener/PlayerJoinListener.java | 16 ++++++++++++++++ .../pikzstudios/listener/PlayerQuitListener.java | 13 +++++++++++++ .../java/net/pikzstudios/utils/ConfigUtil.java | 8 ++++++++ src/main/resources/config.yml | 3 +++ src/main/resources/lang.yml | 3 +++ 5 files changed, 43 insertions(+) diff --git a/src/main/java/net/pikzstudios/listener/PlayerJoinListener.java b/src/main/java/net/pikzstudios/listener/PlayerJoinListener.java index b9e1fdc..15fa1d0 100644 --- a/src/main/java/net/pikzstudios/listener/PlayerJoinListener.java +++ b/src/main/java/net/pikzstudios/listener/PlayerJoinListener.java @@ -1,5 +1,10 @@ package net.pikzstudios.listener; +import net.kyori.adventure.text.Component; +import net.pikzstudios.utils.ConfigUtil; +import net.pikzstudios.utils.MessageUtil; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; @@ -7,6 +12,8 @@ import net.pikzstudios.LobbyCore; +import java.util.Map; + public class PlayerJoinListener implements Listener { public PlayerJoinListener() { @@ -15,5 +22,14 @@ public PlayerJoinListener() { @EventHandler public void onPlayerJoin(final @NotNull PlayerJoinEvent event) { + final var player = event.getPlayer(); + + event.joinMessage(Component.empty()); + + if (ConfigUtil.joinEnabled()) { + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + MessageUtil.send(onlinePlayer, "player-join", Map.of("%player%", player.getName())); + } + } } } diff --git a/src/main/java/net/pikzstudios/listener/PlayerQuitListener.java b/src/main/java/net/pikzstudios/listener/PlayerQuitListener.java index 6274ea0..433f572 100644 --- a/src/main/java/net/pikzstudios/listener/PlayerQuitListener.java +++ b/src/main/java/net/pikzstudios/listener/PlayerQuitListener.java @@ -1,6 +1,10 @@ package net.pikzstudios.listener; import io.papermc.paper.event.player.AsyncChatEvent; +import net.pikzstudios.utils.ConfigUtil; +import net.pikzstudios.utils.MessageUtil; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; @@ -9,6 +13,8 @@ import net.pikzstudios.LobbyCore; +import java.util.Map; + public class PlayerQuitListener implements Listener { public PlayerQuitListener() { @@ -17,6 +23,13 @@ public PlayerQuitListener() { @EventHandler public void onPlayerQuit(final @NotNull PlayerQuitEvent event) { + final var player = event.getPlayer(); + + if (ConfigUtil.leaveEnabled()) { + for (Player onlinePlayer : Bukkit.getOnlinePlayers()) { + MessageUtil.send(onlinePlayer, "player-quit", Map.of("%player%", player.getName())); + } + } } @EventHandler(priority = EventPriority.HIGHEST) diff --git a/src/main/java/net/pikzstudios/utils/ConfigUtil.java b/src/main/java/net/pikzstudios/utils/ConfigUtil.java index 4cb9b2e..61a6931 100644 --- a/src/main/java/net/pikzstudios/utils/ConfigUtil.java +++ b/src/main/java/net/pikzstudios/utils/ConfigUtil.java @@ -35,6 +35,14 @@ public static boolean discordEnabled() { return config().getBoolean("settings.discord-enabled", true); } + public static boolean joinEnabled() { + return config().getBoolean("settings.join-enabled", true); + } + + public static boolean leaveEnabled() { + return config().getBoolean("settings.leave-enabled", true); + } + public static boolean commandEnabled(final @NotNull String command) { return config().getBoolean("commands." + command + ".enabled", true); } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index e6c1d8d..137aeab 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -4,6 +4,9 @@ settings: metrics: true # anonymous stats discord-enabled: true # discord checker in discord.yml + join-enabled: true # displays player joins + leave-enabled: true # displays player quits + commands: lobbycore: enabled: true diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index 6caddc3..a9d1f01 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -16,6 +16,9 @@ usage: "&fUsage: �C6FB/lobbycore " reload-success: "&fThe Configuration has been reloaded!" reload-failed: "&fError whilst reloading the config &7(%error%)" +player-join: "AFF78%player% &fhas joined the server." +player-quit: "�FF00%player% &fhas joined the server." + # ========================================================================== # Store & Discord Commands # ========================================================================== From 301c02a35727c8bf3ea1754771b9f3a2210b3dc0 Mon Sep 17 00:00:00 2001 From: ridriss56 Date: Sat, 23 May 2026 19:13:56 +0200 Subject: [PATCH 2/2] Implemented Lobby System with setting it and teleporting to it --- src/main/java/net/pikzstudios/LobbyCore.java | 8 ++ .../net/pikzstudios/command/LobbyCommand.java | 73 ++++++----------- .../pikzstudios/command/LobbyCoreCommand.java | 82 +++++++++++++++++++ .../command/admin/SetLobbyCommand.java | 48 +++++++++++ .../net/pikzstudios/manager/LobbyManager.java | 46 +++++++++++ .../net/pikzstudios/utils/LocationUtil.java | 36 ++++++++ src/main/resources/config.yml | 7 ++ src/main/resources/lang.yml | 9 +- src/main/resources/lobby.yml | 3 + src/main/resources/plugin.yml | 2 + 10 files changed, 264 insertions(+), 50 deletions(-) create mode 100644 src/main/java/net/pikzstudios/command/LobbyCoreCommand.java create mode 100644 src/main/java/net/pikzstudios/command/admin/SetLobbyCommand.java create mode 100644 src/main/java/net/pikzstudios/manager/LobbyManager.java create mode 100644 src/main/java/net/pikzstudios/utils/LocationUtil.java create mode 100644 src/main/resources/lobby.yml diff --git a/src/main/java/net/pikzstudios/LobbyCore.java b/src/main/java/net/pikzstudios/LobbyCore.java index 316a018..867a286 100644 --- a/src/main/java/net/pikzstudios/LobbyCore.java +++ b/src/main/java/net/pikzstudios/LobbyCore.java @@ -5,8 +5,11 @@ import lombok.SneakyThrows; import net.pikzstudios.command.DiscordCommand; import net.pikzstudios.command.LobbyCommand; +import net.pikzstudios.command.LobbyCoreCommand; import net.pikzstudios.command.StoreCommand; +import net.pikzstudios.command.admin.SetLobbyCommand; import net.pikzstudios.manager.DiscordManager; +import net.pikzstudios.manager.LobbyManager; import net.pikzstudios.utils.ConfigUtil; import net.pikzstudios.utils.FileUtil; import net.pikzstudios.utils.PlaceholderUtil; @@ -31,14 +34,19 @@ public void onEnable() { FileUtil.load("config.yml"); FileUtil.load("discord.yml"); FileUtil.load("lang.yml"); + FileUtil.load("lobby.yml"); if (ConfigUtil.devMode()) { getLogger().info("Developer mode is enabled!"); } + new LobbyManager(); + this.foliaLib = new FoliaLib(this); this.discordManager = new DiscordManager(); + new LobbyCoreCommand(); + new SetLobbyCommand(); new LobbyCommand(); new DiscordCommand(); new StoreCommand(); diff --git a/src/main/java/net/pikzstudios/command/LobbyCommand.java b/src/main/java/net/pikzstudios/command/LobbyCommand.java index 989e8f2..168958d 100644 --- a/src/main/java/net/pikzstudios/command/LobbyCommand.java +++ b/src/main/java/net/pikzstudios/command/LobbyCommand.java @@ -1,82 +1,57 @@ package net.pikzstudios.command; import net.pikzstudios.LobbyCore; +import net.pikzstudios.manager.LobbyManager; import net.pikzstudios.utils.ConfigUtil; -import net.pikzstudios.utils.FileUtil; import net.pikzstudios.utils.MessageUtil; +import org.bukkit.Location; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Map; import java.util.Objects; -public class LobbyCommand implements CommandExecutor, TabCompleter { +/** + * LobbyCommand + * + * @author Kai + * @since 5/23/2026 + */ +public class LobbyCommand implements CommandExecutor { - private static final List SUBCOMMANDS = List.of("reload"); + private final LobbyManager lobbyManager = LobbyManager.getInstance(); public LobbyCommand() { - Objects.requireNonNull(LobbyCore.getInstance().getCommand("lobbycore")).setExecutor(this); + Objects.requireNonNull(LobbyCore.getInstance().getCommand("lobby")).setExecutor(this); } @Override - public boolean onCommand(final @NotNull CommandSender sender, final @NotNull Command command, final @NotNull String label, final @NotNull String[] args) { - if (!ConfigUtil.commandEnabled("lobbycore")) return true; + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, @NotNull String @NotNull [] args) { + if (!ConfigUtil.commandEnabled("lobby")) return true; + if (!(sender instanceof final Player player)) return false; - final String permission = ConfigUtil.commandPermission("lobbycore"); + final String permission = ConfigUtil.commandPermission("lobby"); if (!permission.isEmpty() && !sender.hasPermission(permission)) { MessageUtil.send(sender, "no-permission"); return true; } - if (args.length == 0) { - MessageUtil.send(sender, "usage"); + final Location lobbyLocation = lobbyManager.getLobbyLocation(); + + if (lobbyLocation == null) { + MessageUtil.send(sender, "no-lobby-location"); return true; } - if (args[0].equalsIgnoreCase("reload")) { - handleReload(sender); + if (args.length == 0) { + player.teleport(lobbyLocation); + MessageUtil.send(player, "teleport-success"); return true; } - MessageUtil.send(sender, "usage"); + MessageUtil.send(player, "teleport-usage"); return true; } - - private void handleReload(final @NotNull CommandSender sender) { - final long start = System.currentTimeMillis(); - - try { - FileUtil.reloadAll(); - LobbyCore.getInstance().getDiscordManager().reload(); - } catch (Exception e) { - MessageUtil.send(sender, "reload-failed", Map.of("%error%", String.valueOf(e.getMessage()))); - return; - } - - final long took = System.currentTimeMillis() - start; - MessageUtil.send(sender, "reload-success", Map.of("%time%", String.valueOf(took))); - } - - @Override - public @NotNull List onTabComplete(final @NotNull CommandSender sender, final @NotNull Command command, final @NotNull String label, final @NotNull String[] args) { - final String permission = ConfigUtil.commandPermission("lobbycore"); - if (!permission.isEmpty() && !sender.hasPermission(permission)) return List.of(); - - if (args.length == 1) { - final String partial = args[0].toLowerCase(Locale.ROOT); - final List result = new ArrayList<>(); - for (final String sub : SUBCOMMANDS) { - if (sub.startsWith(partial)) result.add(sub); - } - return result; - } - - return List.of(); - } } \ No newline at end of file diff --git a/src/main/java/net/pikzstudios/command/LobbyCoreCommand.java b/src/main/java/net/pikzstudios/command/LobbyCoreCommand.java new file mode 100644 index 0000000..56715f4 --- /dev/null +++ b/src/main/java/net/pikzstudios/command/LobbyCoreCommand.java @@ -0,0 +1,82 @@ +package net.pikzstudios.command; + +import net.pikzstudios.LobbyCore; +import net.pikzstudios.utils.ConfigUtil; +import net.pikzstudios.utils.FileUtil; +import net.pikzstudios.utils.MessageUtil; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Objects; + +public class LobbyCoreCommand implements CommandExecutor, TabCompleter { + + private static final List SUBCOMMANDS = List.of("reload"); + + public LobbyCoreCommand() { + Objects.requireNonNull(LobbyCore.getInstance().getCommand("lobbycore")).setExecutor(this); + } + + @Override + public boolean onCommand(final @NotNull CommandSender sender, final @NotNull Command command, final @NotNull String label, final @NotNull String[] args) { + if (!ConfigUtil.commandEnabled("lobbycore")) return true; + + final String permission = ConfigUtil.commandPermission("lobbycore"); + if (!permission.isEmpty() && !sender.hasPermission(permission)) { + MessageUtil.send(sender, "no-permission"); + return true; + } + + if (args.length == 0) { + MessageUtil.send(sender, "usage"); + return true; + } + + if (args[0].equalsIgnoreCase("reload")) { + handleReload(sender); + return true; + } + + MessageUtil.send(sender, "usage"); + return true; + } + + private void handleReload(final @NotNull CommandSender sender) { + final long start = System.currentTimeMillis(); + + try { + FileUtil.reloadAll(); + LobbyCore.getInstance().getDiscordManager().reload(); + } catch (Exception e) { + MessageUtil.send(sender, "reload-failed", Map.of("%error%", String.valueOf(e.getMessage()))); + return; + } + + final long took = System.currentTimeMillis() - start; + MessageUtil.send(sender, "reload-success", Map.of("%time%", String.valueOf(took))); + } + + @Override + public @NotNull List onTabComplete(final @NotNull CommandSender sender, final @NotNull Command command, final @NotNull String label, final @NotNull String[] args) { + final String permission = ConfigUtil.commandPermission("lobbycore"); + if (!permission.isEmpty() && !sender.hasPermission(permission)) return List.of(); + + if (args.length == 1) { + final String partial = args[0].toLowerCase(Locale.ROOT); + final List result = new ArrayList<>(); + for (final String sub : SUBCOMMANDS) { + if (sub.startsWith(partial)) result.add(sub); + } + return result; + } + + return List.of(); + } +} \ No newline at end of file diff --git a/src/main/java/net/pikzstudios/command/admin/SetLobbyCommand.java b/src/main/java/net/pikzstudios/command/admin/SetLobbyCommand.java new file mode 100644 index 0000000..3ba2145 --- /dev/null +++ b/src/main/java/net/pikzstudios/command/admin/SetLobbyCommand.java @@ -0,0 +1,48 @@ +package net.pikzstudios.command.admin; + +import net.pikzstudios.LobbyCore; +import net.pikzstudios.manager.LobbyManager; +import net.pikzstudios.utils.ConfigUtil; +import net.pikzstudios.utils.MessageUtil; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.Map; +import java.util.Objects; + +/** + * SetLobbyCommand + * + * @author Kai + * @since 5/23/2026 + */ +public class SetLobbyCommand implements CommandExecutor { + + public SetLobbyCommand() { + Objects.requireNonNull(LobbyCore.getInstance().getCommand("setlobby")).setExecutor(this); + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, @NotNull String @NotNull [] args) { + if (!ConfigUtil.commandEnabled("setlobby")) return true; + if (!(sender instanceof final Player player)) return false; + + final String permission = ConfigUtil.commandPermission("setlobby"); + if (!permission.isEmpty() && !sender.hasPermission(permission)) { + MessageUtil.send(sender, "no-permission"); + return true; + } + + if (args.length == 0) { + LobbyManager.getInstance().saveLobby(player); + MessageUtil.send(sender, "lobby-set-success"); + return true; + } + + MessageUtil.send(sender, "setlobby-usage"); + return true; + } + } \ No newline at end of file diff --git a/src/main/java/net/pikzstudios/manager/LobbyManager.java b/src/main/java/net/pikzstudios/manager/LobbyManager.java new file mode 100644 index 0000000..da07884 --- /dev/null +++ b/src/main/java/net/pikzstudios/manager/LobbyManager.java @@ -0,0 +1,46 @@ +package net.pikzstudios.manager; + +import lombok.Getter; +import net.pikzstudios.utils.FileUtil; +import net.pikzstudios.utils.LocationUtil; +import org.bukkit.Location; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + +/** + * MapManager + * + * @author Kai + * @since 5/23/2026 + */ +@Getter +public class LobbyManager { + + @Getter + private static LobbyManager instance; + private Location lobbyLocation; + + public LobbyManager() { + instance = this; + lobbyLocation = load("lobby"); + } + + private Location load(String path) { + final FileConfiguration spawnConfig = FileUtil.get("lobby.yml"); + final String serialized = spawnConfig.getString(path); + + if (serialized == null || serialized.isEmpty()) return null; + return LocationUtil.fromString(serialized); + } + + public void saveLobby(Player player) { + lobbyLocation = player.getLocation(); + save("lobby", lobbyLocation); + } + + private void save(String path, Location loc) { + final FileConfiguration spawnConfig = FileUtil.get("lobby.yml"); + spawnConfig.set(path, LocationUtil.toString(loc)); + FileUtil.save("lobby.yml"); + } +} \ No newline at end of file diff --git a/src/main/java/net/pikzstudios/utils/LocationUtil.java b/src/main/java/net/pikzstudios/utils/LocationUtil.java new file mode 100644 index 0000000..e61e7f0 --- /dev/null +++ b/src/main/java/net/pikzstudios/utils/LocationUtil.java @@ -0,0 +1,36 @@ +package net.pikzstudios.utils; + +import lombok.experimental.UtilityClass; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.jetbrains.annotations.NotNull; + +/** + * LocationUtil + * + * @author Kai + * @since 5/23/2026 + */ +@UtilityClass +public class LocationUtil { + + @NotNull + public Location fromString(final @NotNull String input) { + final String[] parts = input.split("/"); + return new Location( + Bukkit.getWorld(parts[0]), + Double.parseDouble(parts[1]), + Double.parseDouble(parts[2]), + Double.parseDouble(parts[3]) + ); + } + + @NotNull + public String toString(final @NotNull Location location) { + return location.getWorld().getName() + "/" + + (location.getBlockX() + 0.5) + "/" + + location.getBlockY() + "/" + + (location.getBlockZ() + 0.5); + } + +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 137aeab..0128acd 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -17,5 +17,12 @@ commands: store: enabled: true permission: "" + setlobby: + enabled: true + permission: "lobbycore.admin" + lobby: + enabled: true + permission: "" + config-version: 1 # don't touch \ No newline at end of file diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index a9d1f01..9210c96 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -11,11 +11,18 @@ prefix: "�C6FBLobby &7⏵ " # Command Messages # ========================================================================== no-permission: "&fYou don't have permissions for that." -usage: "&fUsage: �C6FB/lobbycore " +admin-usage: "&fUsage: �C6FB/lobbycore " reload-success: "&fThe Configuration has been reloaded!" reload-failed: "&fError whilst reloading the config &7(%error%)" +lobby-set-usage: "&fUsage: �C6FB/setlobby" +lobby-set-success: "AFF78Successfully &fset the lobby point." + +no-lobby-location: "&cLobby location has not been set yet." +teleport-usage: "&fUsage: �C6FB/lobby" +teleport-success: "AFF78Successfully &fteleported to the lobby point." + player-join: "AFF78%player% &fhas joined the server." player-quit: "�FF00%player% &fhas joined the server." diff --git a/src/main/resources/lobby.yml b/src/main/resources/lobby.yml new file mode 100644 index 0000000..e698c81 --- /dev/null +++ b/src/main/resources/lobby.yml @@ -0,0 +1,3 @@ +# This file stores the lobby spawn location +# Format: world,x,y,z,yaw,pitch +lobby: "" \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 7fa1e01..0b15dbb 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -11,6 +11,8 @@ commands: lobbycore: discord: store: + setlobby: + lobby: permissions: lobbycore.admin: