From 351a46ee177306845a21dda9365c25eb4986c0a0 Mon Sep 17 00:00:00 2001 From: bensuisse Date: Mon, 3 Aug 2026 22:31:13 +0200 Subject: [PATCH] init mining-man system --- .idea/.gitignore | 10 ++ .idea/compiler.xml | 13 ++ .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 25 +++ .idea/material_theme_project_new.xml | 12 ++ .idea/misc.xml | 14 ++ .idea/modules.xml | 8 + .idea/vcs.xml | 6 + LunaraSystem.iml | 13 ++ README.md | 20 +++ dependency-reduced-pom.xml | 63 +++++++ pom.xml | 75 ++++++++ .../ch/bensuisse/miningman/MiningMan.java | 79 ++++++++ .../ch/bensuisse/miningman/api/ColorUtil.java | 31 ++++ .../miningman/commands/SocialCommands.java | 57 ++++++ .../features/announce/AnnounceCommand.java | 140 +++++++++++++++ .../miningman/features/chat/ChatListener.java | 44 +++++ .../features/chat/ClearChatCommand.java | 45 +++++ .../features/general/ConnectionListener.java | 41 +++++ .../features/tablist/TablistService.java | 168 ++++++++++++++++++ .../miningman/managers/JoinManager.java | 18 ++ src/main/resources/plugin.yml | 20 +++ .../ch/bensuisse/miningman/MiningMan.class | Bin 0 -> 3812 bytes .../bensuisse/miningman/api/ColorUtil.class | Bin 0 -> 2631 bytes .../miningman/commands/SocialCommands.class | Bin 0 -> 4136 bytes .../features/announce/AnnounceCommand$1.class | Bin 0 -> 1321 bytes .../features/announce/AnnounceCommand.class | Bin 0 -> 9333 bytes .../features/chat/ChatListener.class | Bin 0 -> 3327 bytes .../features/chat/ClearChatCommand.class | Bin 0 -> 3002 bytes .../features/general/ConnectionListener.class | Bin 0 -> 3179 bytes .../features/tablist/TablistService.class | Bin 0 -> 10309 bytes .../miningman/managers/JoinManager.class | Bin 0 -> 1196 bytes target/classes/plugin.yml | 20 +++ .../compile/default-compile/createdFiles.lst | 10 ++ .../compile/default-compile/inputFiles.lst | 9 + 35 files changed, 948 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/material_theme_project_new.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 LunaraSystem.iml create mode 100644 README.md create mode 100644 dependency-reduced-pom.xml create mode 100644 pom.xml create mode 100644 src/main/java/ch/bensuisse/miningman/MiningMan.java create mode 100644 src/main/java/ch/bensuisse/miningman/api/ColorUtil.java create mode 100644 src/main/java/ch/bensuisse/miningman/commands/SocialCommands.java create mode 100644 src/main/java/ch/bensuisse/miningman/features/announce/AnnounceCommand.java create mode 100644 src/main/java/ch/bensuisse/miningman/features/chat/ChatListener.java create mode 100644 src/main/java/ch/bensuisse/miningman/features/chat/ClearChatCommand.java create mode 100644 src/main/java/ch/bensuisse/miningman/features/general/ConnectionListener.java create mode 100644 src/main/java/ch/bensuisse/miningman/features/tablist/TablistService.java create mode 100644 src/main/java/ch/bensuisse/miningman/managers/JoinManager.java create mode 100644 src/main/resources/plugin.yml create mode 100644 target/classes/ch/bensuisse/miningman/MiningMan.class create mode 100644 target/classes/ch/bensuisse/miningman/api/ColorUtil.class create mode 100644 target/classes/ch/bensuisse/miningman/commands/SocialCommands.class create mode 100644 target/classes/ch/bensuisse/miningman/features/announce/AnnounceCommand$1.class create mode 100644 target/classes/ch/bensuisse/miningman/features/announce/AnnounceCommand.class create mode 100644 target/classes/ch/bensuisse/miningman/features/chat/ChatListener.class create mode 100644 target/classes/ch/bensuisse/miningman/features/chat/ClearChatCommand.class create mode 100644 target/classes/ch/bensuisse/miningman/features/general/ConnectionListener.class create mode 100644 target/classes/ch/bensuisse/miningman/features/tablist/TablistService.class create mode 100644 target/classes/ch/bensuisse/miningman/managers/JoinManager.class create mode 100644 target/classes/plugin.yml create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..ab1f416 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Ignored default folder with query files +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml +# Editor-based HTTP Client requests +/httpRequests/ diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..2371cc6 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..828a0d8 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml new file mode 100644 index 0000000..b9b6d2e --- /dev/null +++ b/.idea/material_theme_project_new.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..d61b968 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,14 @@ + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..a54b4d0 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/LunaraSystem.iml b/LunaraSystem.iml new file mode 100644 index 0000000..3cf00db --- /dev/null +++ b/LunaraSystem.iml @@ -0,0 +1,13 @@ + + + + + + + PAPER + + 1 + + + + \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..47ee314 --- /dev/null +++ b/README.md @@ -0,0 +1,20 @@ +# MiningMan + +Minecraft-Plugin (Paper/Bukkit), benötigt LuckPerms. + +## Funktionen + +- **Join/Quit-Nachrichten** mit LuckPerms-Rangprefix +- **Chat-Formatierung** (`Name: Nachricht`), Highlight für Spieler mit `miningman.chat.highlight` +- `/clearchat` (`/cc`) – Chat leeren — `miningman.clearchat` +- `/announce small ` – kleine Broadcast-Nachricht +- `/announce big ` – große Broadcast-Nachricht als Title + Chat-Banner +- `/announce restart ` – Countdown mit Broadcasts, stoppt den Server danach — `miningman.announce` +- `/discord`, `/dc` – sendet Discord-Invite-Link +- **Tablist**: Gruppierung/Sortierung nach LuckPerms-Rang, Rang-Prefixe vor Namen, Header/Footer mit Spielerzahl + +## Build + +``` +mvn clean package +``` diff --git a/dependency-reduced-pom.xml b/dependency-reduced-pom.xml new file mode 100644 index 0000000..6432b2a --- /dev/null +++ b/dependency-reduced-pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + ch.bensuisse + LunaraSystem + LunaraSystem + 1.0 + + clean package + + + true + src/main/resources + + + + + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + io.papermc.paper + paper-api + 1.21.11-R0.1-SNAPSHOT + provided + + + net.luckperms + api + 5.4 + provided + + + + 21 + UTF-8 + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..a479cff --- /dev/null +++ b/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + ch.bensuisse + MiningMan + 1.0 + jar + + MiningMan + + + 21 + UTF-8 + + + + clean package + + + org.apache.maven.plugins + maven-compiler-plugin + 3.13.0 + + ${java.version} + ${java.version} + + + + org.apache.maven.plugins + maven-shade-plugin + 3.5.3 + + + package + + shade + + + + + + + + src/main/resources + true + + + + + + + papermc-repo + https://repo.papermc.io/repository/maven-public/ + + + + + + io.papermc.paper + paper-api + 1.21.11-R0.1-SNAPSHOT + provided + + + + net.luckperms + api + 5.4 + provided + + + diff --git a/src/main/java/ch/bensuisse/miningman/MiningMan.java b/src/main/java/ch/bensuisse/miningman/MiningMan.java new file mode 100644 index 0000000..a0243ee --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/MiningMan.java @@ -0,0 +1,79 @@ +package ch.bensuisse.miningman; + +import ch.bensuisse.miningman.commands.SocialCommands; +import ch.bensuisse.miningman.features.announce.AnnounceCommand; +import ch.bensuisse.miningman.features.chat.ChatListener; +import ch.bensuisse.miningman.features.chat.ClearChatCommand; +import ch.bensuisse.miningman.features.general.ConnectionListener; +import ch.bensuisse.miningman.features.tablist.TablistService; +import ch.bensuisse.miningman.managers.JoinManager; +import net.luckperms.api.LuckPerms; +import org.bukkit.Bukkit; +import org.bukkit.plugin.RegisteredServiceProvider; +import org.bukkit.plugin.java.JavaPlugin; + +public final class MiningMan extends JavaPlugin { + + private LuckPerms luckPerms; + private TablistService tablistService; + + @Override + public void onEnable() { + if (!setupLuckPerms()) { + getLogger().severe("LuckPerms nicht gefunden! Plugin schaltet ab."); + getServer().getPluginManager().disablePlugin(this); + return; + } + + this.tablistService = new TablistService(this, luckPerms); + + registerListeners(); + registerCommands(); + new JoinManager(this); + + getLogger().info("MiningMan v1.0 erfolgreich gestartet."); + } + + @Override + public void onDisable() { + if (tablistService != null) + tablistService.onDisable(); + } + + private boolean setupLuckPerms() { + RegisteredServiceProvider provider = Bukkit.getServicesManager().getRegistration(LuckPerms.class); + if (provider != null) { + this.luckPerms = provider.getProvider(); + return true; + } + return false; + } + + private void registerListeners() { + var pm = getServer().getPluginManager(); + + pm.registerEvents(new ConnectionListener(luckPerms), this); + pm.registerEvents(new ChatListener(this), this); + pm.registerEvents(this.tablistService, this); + } + + private void registerCommands() { + AnnounceCommand announceCmd = new AnnounceCommand(this); + getCommand("announce").setExecutor(announceCmd); + getCommand("announce").setTabCompleter(announceCmd); + + SocialCommands socialCommands = new SocialCommands(); + getCommand("discord").setExecutor(socialCommands); + getCommand("discord").setTabCompleter(socialCommands); + getCommand("dc").setExecutor(socialCommands); + getCommand("dc").setTabCompleter(socialCommands); + + ClearChatCommand clearChatCommand = new ClearChatCommand(); + getCommand("clearchat").setExecutor(clearChatCommand); + getCommand("clearchat").setTabCompleter(clearChatCommand); + } + + public TablistService getTablistService() { + return tablistService; + } +} diff --git a/src/main/java/ch/bensuisse/miningman/api/ColorUtil.java b/src/main/java/ch/bensuisse/miningman/api/ColorUtil.java new file mode 100644 index 0000000..bf5a438 --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/api/ColorUtil.java @@ -0,0 +1,31 @@ +package ch.bensuisse.miningman.api; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import java.util.ArrayList; +import java.util.List; + +public class ColorUtil { + + public static List createGradient(TextColor start, TextColor end, int steps) { + List colors = new ArrayList<>(); + for (int i = 0; i < steps; i++) { + float ratio = (float) i / (steps - 1); + int r = (int) (start.red() * (1 - ratio) + end.red() * ratio); + int g = (int) (start.green() * (1 - ratio) + end.green() * ratio); + int b = (int) (start.blue() * (1 - ratio) + end.blue() * ratio); + colors.add(TextColor.color(r, g, b)); + } + return colors; + } + + public static Component applyGradient(String text, List colors) { + Component result = Component.empty(); + for (int i = 0; i < text.length(); i++) { + double progress = Math.min(1.0, (double) i / (text.length() - 1)); + int colorIndex = (int) (progress * (colors.size() - 1)); + result = result.append(Component.text(String.valueOf(text.charAt(i))).color(colors.get(colorIndex))); + } + return result; + } +} \ No newline at end of file diff --git a/src/main/java/ch/bensuisse/miningman/commands/SocialCommands.java b/src/main/java/ch/bensuisse/miningman/commands/SocialCommands.java new file mode 100644 index 0000000..a53c941 --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/commands/SocialCommands.java @@ -0,0 +1,57 @@ +package ch.bensuisse.miningman.commands; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.event.ClickEvent; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Sound; +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.Collections; +import java.util.List; + +public class SocialCommands implements CommandExecutor, TabCompleter { + + private static final TextColor THEME_COLOR = TextColor.fromHexString("#56CF94"); + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, + @NotNull String[] args) { + if (!(sender instanceof Player player)) { + return true; + } + + if (command.getName().equalsIgnoreCase("discord") || command.getName().equalsIgnoreCase("dc")) { + sendDiscordMessage(player); + } + + return true; + } + + private void sendDiscordMessage(Player player) { + Component message = Component.text() + .append(Component.newline()) + .append(Component.text("ᴊᴏɪɴ ᴛʜᴇ ʟᴜɴᴀʀᴀᴍᴄ ᴅɪsᴄᴏʀᴅ ᴄᴏᴍᴍᴜɴɪᴛʏ!") + .color(THEME_COLOR)) + .append(Component.newline()) + .append(Component.text("discord.gg/lunaramc") + .color(TextColor.color(255, 255, 255)) + .decorate(TextDecoration.UNDERLINED) + .clickEvent(ClickEvent.openUrl("https://discord.gg/lunaramc"))) + .append(Component.newline()) + .build(); + + player.sendMessage(message); + player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_CHIME, 1.0f, 1.0f); + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { + return Collections.emptyList(); + } +} diff --git a/src/main/java/ch/bensuisse/miningman/features/announce/AnnounceCommand.java b/src/main/java/ch/bensuisse/miningman/features/announce/AnnounceCommand.java new file mode 100644 index 0000000..23f5eaf --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/features/announce/AnnounceCommand.java @@ -0,0 +1,140 @@ +package ch.bensuisse.miningman.features.announce; + +import ch.bensuisse.miningman.MiningMan; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.title.Title; +import org.bukkit.Bukkit; +import org.bukkit.Sound; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class AnnounceCommand implements CommandExecutor, TabCompleter { + + private final MiningMan plugin; + + public AnnounceCommand(MiningMan plugin) { + this.plugin = plugin; + } + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String label, + @NotNull String[] args) { + if (args.length < 2) { + sender.sendMessage(Component.text("ᴜsᴀɢᴇ: /ᴀɴɴᴏᴜɴᴄᴇ <ᴍᴇssᴀɢᴇ>", NamedTextColor.RED)); + return true; + } + + String type = args[0].toLowerCase(); + + if (type.equals("restart")) { + try { + startRestart(Integer.parseInt(args[1])); + } catch (NumberFormatException e) { + sender.sendMessage(Component.text("ᴘʟᴇᴀsᴇ ᴘʀᴏᴠɪᴅᴇ ᴀ ᴠᴀʟɪᴅ ɴᴜᴍʙᴇʀ", NamedTextColor.RED)); + } + return true; + } + + String msg = String.join(" ", Arrays.copyOfRange(args, 1, args.length)); + + switch (type) { + case "small" -> sendSmall(msg); + case "big" -> sendBig(msg); + default -> sender.sendMessage(Component.text("ᴜɴᴋɴᴏᴡɴ ᴛʏᴘᴇ", NamedTextColor.RED)); + } + return true; + } + + private void sendSmall(String msg) { + Component content = Component.text("\n[ᴀɴɴᴏᴜɴᴄᴇᴍᴇɴᴛ] ", NamedTextColor.GOLD, TextDecoration.BOLD) + .append(Component.text(msg, NamedTextColor.WHITE).decoration(TextDecoration.BOLD, false)) + .append(Component.newline()); + Bukkit.broadcast(content); + Bukkit.getOnlinePlayers() + .forEach(p -> p.playSound(p.getLocation(), Sound.ENTITY_EXPERIENCE_ORB_PICKUP, 1f, 1f)); + } + + private void sendBig(String msg) { + Title title = Title.title( + Component.text("ɪᴍᴘᴏʀᴛᴀɴᴛ", NamedTextColor.RED, TextDecoration.BOLD), + Component.text("➤ ʟᴏᴏᴋ ɪɴ ᴛʜᴇ ᴄʜᴀᴛ", NamedTextColor.GRAY, TextDecoration.ITALIC), + Title.Times.times(Duration.ofMillis(500), Duration.ofSeconds(4), Duration.ofMillis(500))); + Bukkit.getServer().showTitle(title); + + Component line = Component.text(" ", NamedTextColor.GOLD, + TextDecoration.STRIKETHROUGH); + Component content = Component.newline().append(line).append(Component.newline()) + .append(Component.text(" » ", NamedTextColor.WHITE, TextDecoration.BOLD)) + .append(Component.text("ɪᴍᴘᴏʀᴛᴀɴᴛ ᴀɴɴᴏᴜɴᴄᴇᴍᴇɴᴛ", NamedTextColor.RED, TextDecoration.BOLD)) + .append(Component.newline()).append(Component.newline()) + .append(Component.text(" » ", NamedTextColor.YELLOW).append(Component.text(msg))) + .append(Component.newline()).append(line).append(Component.newline()); + + Bukkit.broadcast(content); + Bukkit.getOnlinePlayers().forEach(p -> { + p.playSound(p.getLocation(), Sound.ENTITY_ENDER_DRAGON_GROWL, 0.7f, 1.0f); + p.playSound(p.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 0.5f); + }); + } + + private void startRestart(int seconds) { + new BukkitRunnable() { + int remaining = seconds; + + @Override + public void run() { + if (remaining <= 0) { + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "stop"); + cancel(); + return; + } + if (remaining > 60 && remaining % 30 == 0) + broadcastRestart(remaining); + else if (remaining > 10 && remaining % 15 == 0) + broadcastRestart(remaining); + else if (remaining <= 10) + broadcastRestart(remaining); + remaining--; + } + }.runTaskTimer(plugin, 0L, 20L); + } + + private void broadcastRestart(int seconds) { + Component msg = Component.text("sᴇʀᴠᴇʀ ʀᴇsᴛᴀʀᴛ ɪɴ ", NamedTextColor.RED, TextDecoration.BOLD) + .append(Component.text(seconds + " sᴇᴄᴏɴᴅs", NamedTextColor.YELLOW)); + + Title title = Title.title( + Component.text("ʀᴇsᴛᴀʀᴛ", NamedTextColor.RED, TextDecoration.BOLD), + Component.text("ɪɴ " + seconds + " sᴇᴄᴏɴᴅs", NamedTextColor.WHITE), + Title.Times.times(Duration.ofMillis(200), Duration.ofMillis(600), Duration.ofMillis(200))); + + Bukkit.broadcast(msg); + Bukkit.getServer().showTitle(title); + Bukkit.getOnlinePlayers().forEach(p -> p.playSound(p.getLocation(), Sound.BLOCK_NOTE_BLOCK_HARP, 1f, 1f)); + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command cmd, @NotNull String alias, + @NotNull String[] args) { + if (args.length == 1) { + return List.of("small", "restart", "big").stream() + .filter(s -> s.startsWith(args[0].toLowerCase())).toList(); + } else if (args.length == 2 && args[0].equalsIgnoreCase("restart")) { + return List.of("30", "60", "120", "300").stream().filter(s -> s.startsWith(args[1])).toList(); + } else if (args.length == 2) { + return List.of(""); + } + return new ArrayList<>(); + } +} \ No newline at end of file diff --git a/src/main/java/ch/bensuisse/miningman/features/chat/ChatListener.java b/src/main/java/ch/bensuisse/miningman/features/chat/ChatListener.java new file mode 100644 index 0000000..ef5ec3f --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/features/chat/ChatListener.java @@ -0,0 +1,44 @@ +package ch.bensuisse.miningman.features.chat; + +import ch.bensuisse.miningman.MiningMan; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextDecoration; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerChatEvent; + +public class ChatListener implements Listener { + + private static final String HIGHLIGHT_PERMISSION = "miningman.chat.highlight"; + + private final MiningMan plugin; + + public ChatListener(MiningMan plugin) { + this.plugin = plugin; + } + + @EventHandler(priority = EventPriority.HIGHEST) + public void onChat(AsyncPlayerChatEvent event) { + event.setCancelled(true); + Player player = event.getPlayer(); + String message = event.getMessage(); + + Component formatted = player.displayName() + .append(Component.text(": ", NamedTextColor.GRAY).decoration(TextDecoration.BOLD, false)) + .append(Component.text(message, NamedTextColor.WHITE).decoration(TextDecoration.BOLD, false)); + + Bukkit.getScheduler().runTask(plugin, () -> { + if (player.hasPermission(HIGHLIGHT_PERMISSION)) { + Bukkit.broadcast(Component.empty()); + Bukkit.broadcast(formatted); + Bukkit.broadcast(Component.empty()); + } else { + Bukkit.broadcast(formatted); + } + }); + } +} diff --git a/src/main/java/ch/bensuisse/miningman/features/chat/ClearChatCommand.java b/src/main/java/ch/bensuisse/miningman/features/chat/ClearChatCommand.java new file mode 100644 index 0000000..7fa035a --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/features/chat/ClearChatCommand.java @@ -0,0 +1,45 @@ +package ch.bensuisse.miningman.features.chat; + +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.minimessage.MiniMessage; +import org.bukkit.Bukkit; +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.Collections; +import java.util.List; + +public class ClearChatCommand implements CommandExecutor, TabCompleter { + + @Override + public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, + @NotNull String[] args) { + if (!sender.hasPermission("miningman.clearchat")) { + sender.sendMessage(Component.text("No permission.", NamedTextColor.RED)); + return true; + } + + Component blank = Component.empty(); + Component message = MiniMessage.miniMessage() + .deserialize("ᴛʜᴇ ᴄʜᴀᴛ ʜᴀs ʙᴇᴇɴ ᴄʟᴇᴀʀᴇᴅ"); + + for (Player player : Bukkit.getOnlinePlayers()) { + for (int i = 0; i < 100; i++) { + player.sendMessage(blank); + } + player.sendMessage(message); + } + + return true; + } + + @Override + public List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String alias, @NotNull String[] args) { + return Collections.emptyList(); + } +} diff --git a/src/main/java/ch/bensuisse/miningman/features/general/ConnectionListener.java b/src/main/java/ch/bensuisse/miningman/features/general/ConnectionListener.java new file mode 100644 index 0000000..c7f718a --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/features/general/ConnectionListener.java @@ -0,0 +1,41 @@ +package ch.bensuisse.miningman.features.general; + +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.model.user.User; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; + +public class ConnectionListener implements Listener { + + private final LuckPerms luckPerms; + + public ConnectionListener(LuckPerms luckPerms) { + this.luckPerms = luckPerms; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + String prefix = getPrefix(event.getPlayer()); + String msg = "[+] " + prefix + " " + event.getPlayer().getName(); + event.joinMessage(MiniMessage.miniMessage().deserialize(msg)); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + String prefix = getPrefix(event.getPlayer()); + String msg = "[-] " + prefix + " " + event.getPlayer().getName(); + event.quitMessage(MiniMessage.miniMessage().deserialize(msg)); + } + + private String getPrefix(Player player) { + User user = luckPerms.getUserManager().getUser(player.getUniqueId()); + if (user == null) + return ""; + String prefix = user.getCachedData().getMetaData().getPrefix(); + return prefix != null ? prefix : ""; + } +} \ No newline at end of file diff --git a/src/main/java/ch/bensuisse/miningman/features/tablist/TablistService.java b/src/main/java/ch/bensuisse/miningman/features/tablist/TablistService.java new file mode 100644 index 0000000..c946aac --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/features/tablist/TablistService.java @@ -0,0 +1,168 @@ +package ch.bensuisse.miningman.features.tablist; + +import ch.bensuisse.miningman.MiningMan; +import ch.bensuisse.miningman.api.ColorUtil; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.NamedTextColor; +import net.kyori.adventure.text.format.TextColor; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.minimessage.MiniMessage; +import net.luckperms.api.LuckPerms; +import net.luckperms.api.model.group.Group; +import net.luckperms.api.model.user.User; +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; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.scoreboard.Scoreboard; +import org.bukkit.scoreboard.Team; + +import java.util.Comparator; +import java.util.List; + +public class TablistService implements Listener { + + private final MiningMan plugin; + private final LuckPerms luckPerms; + private final List gradientColors; + + public TablistService(MiningMan plugin, LuckPerms luckPerms) { + this.plugin = plugin; + this.luckPerms = luckPerms; + + this.gradientColors = ColorUtil.createGradient(TextColor.fromHexString("#1E8967"), + TextColor.fromHexString("#00FCFC"), 18); + + Bukkit.getScheduler().runTaskTimer(plugin, this::updateAll, 20L, 40L); + } + + public void onDisable() { + Bukkit.getOnlinePlayers().forEach(p -> p.sendPlayerListHeaderAndFooter(Component.empty(), Component.empty())); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Bukkit.getScheduler().runTaskLater(plugin, this::updateSorting, 10L); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + Bukkit.getScheduler().runTaskLater(plugin, this::updateSorting, 5L); + } + + private void updateAll() { + updateSorting(); + for (Player player : Bukkit.getOnlinePlayers()) { + updateHeaderFooter(player); + } + } + + private void updateSorting() { + List groups = luckPerms.getGroupManager().getLoadedGroups().stream() + .sorted(Comparator.comparingInt(g -> ((Group) g).getWeight().orElse(0)).reversed()) + .toList(); + + for (Player viewer : Bukkit.getOnlinePlayers()) { + Scoreboard board = viewer.getScoreboard(); + + for (int i = 0; i < groups.size(); i++) { + Group group = groups.get(i); + String teamName = String.format("%03d_%s", i, group.getName()); + if (teamName.length() > 16) + teamName = teamName.substring(0, 16); + + Team team = board.getTeam(teamName); + if (team == null) + team = board.registerNewTeam(teamName); + + String prefix = group.getCachedData().getMetaData().getPrefix(); + if (prefix != null) { + Component rankComponent = MiniMessage.miniMessage().deserialize(prefix); + + Component separator = Component.text(" ") + .decoration(TextDecoration.BOLD, false) + .color(NamedTextColor.WHITE); + + team.prefix(rankComponent.append(separator)); + } else { + team.prefix(Component.empty()); + } + } + + for (Player target : Bukkit.getOnlinePlayers()) { + User user = luckPerms.getUserManager().getUser(target.getUniqueId()); + if (user == null) + continue; + + String groupName = user.getPrimaryGroup(); + int weightIndex = -1; + for (int i = 0; i < groups.size(); i++) { + if (groups.get(i).getName().equalsIgnoreCase(groupName)) { + weightIndex = i; + break; + } + } + + if (weightIndex != -1) { + String teamName = String.format("%03d_%s", weightIndex, groups.get(weightIndex).getName()); + if (teamName.length() > 16) + teamName = teamName.substring(0, 16); + Team team = board.getTeam(teamName); + if (team != null && !team.hasEntry(target.getName())) { + team.addEntry(target.getName()); + } + } + + updateNametagAboveHead(target, user); + } + } + } + + private void updateNametagAboveHead(Player player, User user) { + String prefix = user.getCachedData().getMetaData().getPrefix(); + Component nameComponent = Component.text(player.getName(), NamedTextColor.WHITE); + + if (prefix != null && !prefix.isEmpty()) { + Component rankComp = MiniMessage.miniMessage().deserialize(prefix); + + Component nameWithSeparator = Component.text(" » ", NamedTextColor.GRAY) + .decoration(TextDecoration.BOLD, false) + .append(Component.text(player.getName(), NamedTextColor.WHITE) + .decoration(TextDecoration.BOLD, false)); + + player.displayName(rankComp.append(nameWithSeparator)); + } else { + player.displayName(nameComponent); + } + } + + private void updateHeaderFooter(Player player) { + Component title = ColorUtil.applyGradient("ʟᴜɴᴀʀᴀᴍᴄ.xʏᴢ", gradientColors) + .decorate(TextDecoration.BOLD); + + int playerCount = Bukkit.getOnlinePlayers().size(); + Component players = Component.text("ᴘʟᴀʏᴇʀs: " + playerCount, TextColor.fromHexString("#A8A8A8")); + + Component header = Component.newline() + .append(title) + .append(Component.newline()) + .append(players) + .append(Component.newline()); + + Component storeLine = Component.text("sᴛᴏʀᴇ: ", TextColor.fromHexString("#FC0000")) + .append(Component.text("ᴄᴏᴍᴍɪɴɢ sᴏᴏɴ", NamedTextColor.WHITE)); + + Component discordLine = Component.text(" ᴅɪsᴄᴏʀᴅ: ", TextColor.fromHexString("#5454FC")) + .append(Component.text("ᴅɪsᴄᴏʀᴅ.ɢɢ/ʟᴜɴᴀʀᴀᴍᴄ ", NamedTextColor.WHITE)); + + Component footer = Component.newline() + .append(storeLine) + .append(Component.newline()) + .append(discordLine) + .append(Component.newline()); + + player.sendPlayerListHeaderAndFooter(header, footer); + } +} \ No newline at end of file diff --git a/src/main/java/ch/bensuisse/miningman/managers/JoinManager.java b/src/main/java/ch/bensuisse/miningman/managers/JoinManager.java new file mode 100644 index 0000000..d9a4b6c --- /dev/null +++ b/src/main/java/ch/bensuisse/miningman/managers/JoinManager.java @@ -0,0 +1,18 @@ +package ch.bensuisse.miningman.managers; + +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.plugin.java.JavaPlugin; + +public class JoinManager implements Listener { + + public JoinManager(JavaPlugin plugin) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + event.getPlayer().setLevel(2026); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml new file mode 100644 index 0000000..f4e290c --- /dev/null +++ b/src/main/resources/plugin.yml @@ -0,0 +1,20 @@ +name: MiningMan +version: '1.0' +main: ch.bensuisse.miningman.MiningMan +api-version: '1.21' +authors: [BenSuisse] +depend: + - LuckPerms + +commands: + announce: + usage: /announce + permission: miningman.announce + discord: + usage: /discord + dc: + usage: /dc + clearchat: + usage: /clearchat + aliases: [cc] + permission: miningman.clearchat diff --git a/target/classes/ch/bensuisse/miningman/MiningMan.class b/target/classes/ch/bensuisse/miningman/MiningMan.class new file mode 100644 index 0000000000000000000000000000000000000000..b68846ff7558d41a83079d1ac6b54d754ce21547 GIT binary patch literal 3812 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 literal 0 HcmV?d00001 diff --git a/target/classes/ch/bensuisse/miningman/features/announce/AnnounceCommand$1.class b/target/classes/ch/bensuisse/miningman/features/announce/AnnounceCommand$1.class new file mode 100644 index 0000000000000000000000000000000000000000..0efda2a4a5eb5698a2d3d253ea2e17fa6ee27366 GIT binary patch literal 1321 zcmbVL-A)rx5dIFWEiDUe`KtBg* zUTNYri6HU92k;4e8snVpYKVH(-R#bs$((OyzM1*{^XoSN>$so75MoKhHJm|$;epZC zn?ibl<#|HyTGEoOE|>bA;C|o=Pv=rPfi#4^9w{46mmJLE5<|joTV8RIQ0jxiR8>C1 z8d69zj2v*g=n2D-rpLf)X=oTtVoXB@S%x{sZRyRR)3JQrGupxoY~kt;L&J6;C2!h- zl3JxA{56JHsl21m$2CkS^pq>QJS;GcDNHAk*Kii+7;>j@`)CZ=mhd+m={dG&2x$tJ zVZKzZpYk;NJm`^EL`&bfI*b{HxaT`P73+eAi@3y)F)gpheWM*YGc1?>4;fM%Vb%Bf z0oQFVTYAHHsXx{7%QV$>S;G}YOTysPA3KdAt|oC!!*!GxRtD_|)!uX+ZW`S4w}t0( z*QZiSwek+bT50e`hXC;n$D|%*>XsB+LANQ~=l!mY*Byh~JKVL@IWor8d@-yJ9JIJp zrE)ff-*(Jr+~r;23zraMZXg*(8$LHWo4gl=OE;XrHN;~}jnU*^^S+?EK$$<1hV6LN zg+8i=dx~u>b zD3h#^_LQXZ%~$4+z$&vxNLIdJq*D2ei>vtdkzMP$jWV*Q{9HVfkjM>$XmKLEQ7JK~Qf`F|aU{{C+zd>@q#fEr2`wVK zjT$WMVjpkNq1Q%$ZdkI`&ps-7iI5VAPZbIih!dt__BQU2jMJjr#d2sVVufUyZYuid F`2|eyN1^}# literal 0 HcmV?d00001 diff --git a/target/classes/ch/bensuisse/miningman/features/announce/AnnounceCommand.class b/target/classes/ch/bensuisse/miningman/features/announce/AnnounceCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..06fe3334a671e83e0c92a47720af17d1b460c5f7 GIT binary patch literal 9333 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 literal 0 HcmV?d00001 diff --git a/target/classes/ch/bensuisse/miningman/features/chat/ChatListener.class b/target/classes/ch/bensuisse/miningman/features/chat/ChatListener.class new file mode 100644 index 0000000000000000000000000000000000000000..a952f02a37aa3cfb3ba58e7b7096cc7bbc3af054 GIT binary patch literal 3327 zcma)8Sz8lV7=BL@7zjf_iYRCm5hW}#TJ2`+0ud!P0VF9XUF=D6NXATN(wPZ0-S>UF z?JwwceOe1%^s*Oy`kVUnJCjHz)j%%h%$zgd`hMH_```P20+_>3VFVCV5K_^BPKN&5 ze2Z%aH}l$Z=C;VX44s#BQ+Hor2u3E?y3vJh1z{CEP#Ml;3tC2)PDOVdp_Pcx%$K;S zZ3^yIY~g6x0(Z3-EeYLmg(+;3S2ikn-DDU`wBSy9a+2JPhVdBs6!fb&fB}XX%g$?= zO0lTBn%EMitCbC26}C3#RL$&)_brtz$bSr~BitA_v%)Y$jv*A;m|T+*2UQ%z5JPuf zxHTq*qmjvkU%Kh)ZdI%O^~^Y|Vi+R~VPZ-O$KiRwFi2bt#8R$J{zrRo6i+BPrs6n8 z84kA+%g~e49qGXmFOjg*B+L}9R;*gKuJN37fjO5-FrWMSnID=V=VoSZd zCX+7d14BOYFk1Vn-!(b92Rt>R2M~4REY2x-QpI^(XagF_eOY8Jo4dM2nHid2PF!vW znr23V=4m{m;8_*V;UWdJB{WUuQcmT3%GV=pLDH}{y0Hf^yFu{cc1gwapi=JS<+3oT zCa&$Ftijrre3_3gsnk;_89UY&PvQoVwR4yuHV*x`h9E^@@mC2dBzZgSrSVMmQ}3a zI>WfngO;{2C}dEYJ4J@;O-9ukA2k)(|DwK9*wxq6gZ{5UilpjKQA^qFw6n6o&KC51 z!Jx;Lt>+aLYglLKEpTT=*d=PsUQ!=?MDa~-$ZEc+Vgs*I)I_Q5RvD)DYD7(`OPw)> z*HyfMThvZ7w#9QSnlV*Ki2f}ZrPm4(%0Je7(sFEI@G z(5tsy@;GLhj>}DVjT;qesHY=iZddv&AGY*CQTI zSrt1guIMr+4)|{~v$AK*h+1H7W!*pBvL`4O8(tH{t~V;)il1$Zv1O*`ghBs*)K?Yg+&e8Y?U=;)M8cW|nI_rR-b(3~i=wE=|;i*5srlx;~ z@~cOmr}Z(S1qKnKD`Yo@P@vsVjT$;`(~kH&sf?r*VbDJ*^DpA)p!bdG&^`1{-^1fc zS`IDE?BEDBniF?%avPI(p#^vFR1iCe25{ysUVP~AVrU!lQ@=r(84lgYB8W5*#CpTR zG4dDWX$OvwB}dVRW3)RC4WpRH7}hcES$&~q&#u)sP=ZM|hp_|;WwN^ualA!%1&MD6 zHXQQ7CE2}1RiS4~;BDOL56c9nt#q?WY!bSOse#oUqyzXF!`ryAjn~$vCt1zp}& zS{;PMbp)NXo+RYPDJrLM2&XA>5n88w7*BYX5h2}qr9BMq(su}f6CslG9(@P!K0ctg ZO8-8kvk&nRJ>Sqtm`=XM_xKUR{{gs#&6fZG literal 0 HcmV?d00001 diff --git a/target/classes/ch/bensuisse/miningman/features/chat/ClearChatCommand.class b/target/classes/ch/bensuisse/miningman/features/chat/ClearChatCommand.class new file mode 100644 index 0000000000000000000000000000000000000000..0d38201d315ccb815394da0d05ba5096a18821ce GIT binary patch literal 3002 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 E3)ql$ApigX literal 0 HcmV?d00001 diff --git a/target/classes/ch/bensuisse/miningman/features/tablist/TablistService.class b/target/classes/ch/bensuisse/miningman/features/tablist/TablistService.class new file mode 100644 index 0000000000000000000000000000000000000000..b8ba4c727f25b9b9d2a749cd56f1aa4e474195fa GIT binary patch literal 10309 zcmcIq33yx8mHv-x>B-V_;@EM5Se=l7mn2F`Hf*-Ui4zAqo1K;Q*?P8xWy#T!g*8AR zPznLc8kRtygodRhb&M63Qc6ReQf6V=nRXV&)0t^Io$0JhXDE>V_dUsy64^2HeG@*c zr~B?b%YT-8?zuYl#gVrGERqjBaG*d#p$;cpf|Bcut%g5jgggDK+O9L(;{w-3!Ei8s ziJ+jeYJCyhDAM53;e{@k-`?eKGsCe&FcvfYJ)9Ws>@mXr4%3JyqGrq=H`+qMSlr)g zf3}#>t-*GaM0-Pt&R|$DwP^$r%@(m{BV4C=j?*z7C4!<*qP=^y8SRM)&T0yqalabq zRReybH|TFlzpitmRG^(ZXX(NV=P&SLBFZ&P(lHsQ398h>?j4b6&~F5`nqeiYKW=W1 z`#U1h9)sfYxjqt#L2?g9^d45wK92S>mjV2Sb8!?NQ=uE{ht0AcYqME5C#QUt(%wm91-nZ2e8N zqh*V!I?ly3iqV-8z!HrHDLHYr2j}5@4V5~oP%W4ciFW$i65ZXwxPP(rA<#R`cuRYi z8AyaoqFq^8)s!_WmVT3(KRmOpl<--bZsIWrmvcH zPBKvcCZ-=My_k!68s_U*fQ2;HSmdOF6t2~Xb+-n4l!7gl+4|X0;9qS8LtQ>GR;(Bm z5JkC8!Cb4O4j0h|#B)_R6bzfIL&gp>O0%3sOf3a1GtyWg#&s|fCWeAbbX#$zn4pI;!uF}G!9GDtY<3wj8Hfh+b;|g3UD9xago$zbBz38dn?}HlHbf#8cxUB+m$SC6 zYP}a-2x_=aM>m*Y&KM=J3dYmLmPI3pUM6RwQ(0yf1wMI6Pb6T5{GDp1KYKnw3L~PS zSH~7`b@kYn+RU3G)GT0;qeztr5O$NJR@JxEZ%-*s0@I+;&2c z^z<4jAJW?+>IG`S8vI!0wJ9{E$nmFQl`6bpN>7apJd_@wSCYxbI`N46fX=s zsN?H+h^Df3gGkhDix^RIRbXeie5^hF%HJ~lNJfv~Q4NpjcpQ7VEoGFkc^1Zk*R$kc z`O>JSKB?m=Jk9UqB`B{7p2cI?Z1j|Y52B| z*KjDObh9TAcDtMrT$rb5xgu-3v1`4wF)fj^nDps5tdMnu%y4JCOYwbO#{iP7$6|># zn%%05s8J4aUm;1q~>}l)WYDMVmJaUiZ5o!hDdjsFo@vh=DK5BN- z>CEU#bDMgppnXrr4{+3Ww0iDOW?+dCHw0gyqn&K-c54PV1H+%0oXUD+^+OD5IHu!A z_<%X^%PkjpY29WsZrB3&$0k5}0l9yOKhp5WI{rktO3fI!r`OVIWW73Sb_BP3@e%$^ z!%uYl6n`$5t;po9V^wY6W5!}k_i89Yo$`&mkYt@VmY7UwhAPY`!{SvSC|^QfISUA5cDTT{c=Q z=Qt1%?vf&1JmOWyLNmUOF+5xy&d8hE?CLPViT;|;dpe18l0xfbUBZMMj&7fjzDHTj|)<%OO^0cKFK~VsF;Zxor~Hc zTTOLz5L`COks;4!c_KtSRmfz#r#x#W^RMur-kC?IF{QXuhGDKdDrjfxGDjW3v|wzh z@@KbPz`R=V?i&@%Lo!d7`6>w&E?c{3lggUESB`g~F10GQyn$e>m**;liCcK8KJ(bV zp}r>v`-b{<9^1)3Lw)xS_3fIq{n(zNzWr?C$R)a5Dm+FPTStXVXJ&amjdKgsF=rQ9 ztV_LcTX3hcHN9m0DDjSyzxTUv=bQRaIK?t2Fh4)zW1uizRE>>2EH3y9HBk||LlN4j2+f;2 zZ*D`qTQ&=3o-}LL;Qqn={=9Z&*NsJasuzU=>4Wv|?8bytRw?AEqfwLVNHc5y;DIq5w;FtASmnf`mSAVt>fj14&f=^9xM*ZmvK-D1 z*h}gJi$`qBsWLL$sXDxQvPq_qTSY4u*0Yzu6xu}3S()f*Goz}Z%#qTjNV^eQ&qK8O zo*FEScLnL03;(bEKmrg6FA2tM7OqHmMMSl#XXNHX3p14^xP#gLp{6ZW!|bT2ZB#w7 z*_?fXwUHiS6^+97W1MyN`d}7reiT%ZiEBuof2wFx+W1M%Tr3K zre!2Om4unuM8@7N7KK9OXY0XQBuBLDz7(Y@ZiyT1-OWaC$~whSBiudg^*rN`>`=qA zNTw)e4mVDmR#QnZJ&)tq+mJQE?mBU;JI>>uO6JO8GNa+6S8WZN z+Z213MVNjuDK`Xm^rpjLLEgyCS081grDE2dHW8Z`VZx?TeoF@aVl_5w8!Es?qzXo_ z?GN=4Ix+LF{f!d3x~x{DvLRbWrV3(vkL7_UV1Hw$!tPT}3K>0Z0b^QD4|dv|6AGF1 zQIOVP;>$5=>JNSAM*qXZq}omgEW`#Ju)8XwT*S=sNF zBji5R_n6v(cB(>R_pzO^+6v*cH$C!}ysgQ1b$Lg=$8&4OXM^Fbk#5u9WTB)^^c_Y! zL1nq_RrTBOw-2%lkJKVt7dv0XrZq((-HG1pONUfEWJO5M!dALg_Vls8v{{b6Hv1AL zMY-Mxg<9BhuOlSi_sDzl15J*qg5-T>jgug;rMGL8hBPRT{r|&|LhTgov=de0?M7pm zn{9o_;MHkNlVeP0C+U>WVw$kqboS^|8FRLIF@+Zc4u}NV&n{J$w!G3RRd=b@C-3q2 zuA9#e3Bd!#vh;8y%#jD7aSgDr`gKTk&0%QOGY+G;x^%(-%1V9wQ&KvBGY(_Q0H)Ve zA3+T-%iy1gIZ0fgVZ&<{)d>Gir3~N=XCW$3M2W`n{%{gGpTW;5yt`U}^QD(FDr|nT zMWXyh&X&AlJt>Km9x=F5@?E69^WC@sTzCW*14%4$uobFwQC!u{Hc*XX)L7JYdv=Pt zNL&(}sWe^1yKgmjG8L)rqn<~wOzE;bi51RlMQoCO3P0N-Imuo&EbwI6D%&XDb`n!! z?%=1$^>V{07_H3DXf7Ge8cD1Vcezhzn_uT1@A?VkK`Dm4TGL6?BoCJLO5&TmdmX?lwVF@s$9GCfo=34yD<~=HM?c33eOeMn9H@2s-0x$Y{rw&5 zJJ)_+3CE<9#E;3j$X9d}7Z2c1eML$91?PB5|7rk#a|nN5kihr*MZ|7QgWF@vD}XNMFsOc<(@Pql{Mv_G$xk*K6k&I@i;hTe$fFG?edWO zN99G1eFzOBR%9bqQ%>D%I5W_Be4b(GJSpfrgo<1gbY7qLD5m)ga2Z{05tB(hgK!CBvjJD}={hXOZZzTn ztiThz9)1DMyd+r(`Zor#hTZVBY#_Jd7rd$cE!N``Y!oLpi5r`xlo!>f;c8ikYh)Gg zSzCF$+kket76EC8DO-4JdN&>OUUsqW=l4f=2l^y^^j(DI14QJf=#?RCk>4TeaAK>Y z7~32r*zPF94l6ABnNfevEOV>e#;o%Rf2VRgpS+a$McE~H(EoSi9=TI?Go!vh+INwg zn^HHjlee20aV>8ozAE=HusWDn)RTw2>#Y?Ya-L?b@KW}-eQ)#M3ek~7KdH-P|uCk&vLaoILIwI8GO-vR+-v=T9-~IKkpik5a4EG6(Y{ds24dkSZ#mQN&wkB&8-h0$0{p4#prG zkQudwGmm29%zp9j#To`B(}RjhXPJEEkj&+T?6}NcI6R(|1zg~&@i|qVP=P87RiJun ze1+CyCOOXMZUWqh3Al;-*)7~%c48iG<4*)`$K}|C&AfuWhMyg@c!Kwz+i^E%++%sk zaw;>AKec$2zTxDI@$wj-TuQ;=4dhlUwW?k1R?E^3a_Y6bq=5X|Xm=sm$70X&5} z@igwoGo0}(zwO6CJcmQPrhSuvcoYXL!(3^@HEe|UQ${F5pX?>z4sv=)o?ws_kl$W; zQW=3+q^K;Q9BN*1HTMyzCQr2C%NVT literal 0 HcmV?d00001 diff --git a/target/classes/ch/bensuisse/miningman/managers/JoinManager.class b/target/classes/ch/bensuisse/miningman/managers/JoinManager.class new file mode 100644 index 0000000000000000000000000000000000000000..a590c659afd11b67dcd027243430e5babc239e7b GIT binary patch literal 1196 zcmb7^Z%-3J5XPUOg@ba17Ab zp_(FJSz_38X%cjrr(Eauc@f|H!q)Bby|^Gjc(P&S%B$ zzS6Z4HZxUR)~2|Y$=HLCndwV!v521r+?&4W$WU^fyGr?y6G>ljnbmZ*38$@fe&eV^ zkH?KrIPeESPrQ~|u~Mo*+qx>$aF?Gm4;#O2y-%XS>js}bBF7e>vhfYn{0d`)B7bR) za3zN?v3rx(Id%gI$n*1Fgo#Z)EhQJRg>61D0v7Hwmhb=%`J2YKdDr+NqgTqtuMw&f kDXjjJ0ZI%kr;x?J$RZx$F$15l*A(whc_%#Mbpkto0E~h{!T + permission: miningman.announce + discord: + usage: /discord + dc: + usage: /dc + clearchat: + usage: /clearchat + aliases: [cc] + permission: miningman.clearchat diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..5b3348a --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,10 @@ +ch\bensuisse\miningman\features\announce\AnnounceCommand.class +ch\bensuisse\miningman\MiningMan.class +ch\bensuisse\miningman\commands\SocialCommands.class +ch\bensuisse\miningman\features\tablist\TablistService.class +ch\bensuisse\miningman\api\ColorUtil.class +ch\bensuisse\miningman\managers\JoinManager.class +ch\bensuisse\miningman\features\chat\ClearChatCommand.class +ch\bensuisse\miningman\features\announce\AnnounceCommand$1.class +ch\bensuisse\miningman\features\chat\ChatListener.class +ch\bensuisse\miningman\features\general\ConnectionListener.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..bb975b2 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,9 @@ +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\api\ColorUtil.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\commands\SocialCommands.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\features\announce\AnnounceCommand.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\features\chat\ChatListener.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\features\chat\ClearChatCommand.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\features\general\ConnectionListener.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\features\tablist\TablistService.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\managers\JoinManager.java +C:\Users\benib\Dev\Intellij\Minecraft\LunaraSystem\src\main\java\ch\bensuisse\miningman\MiningMan.java