diff --git a/src/main/java/com/mviper/zenithjoin/listeners/ActionBarListener.java b/src/main/java/com/mviper/zenithjoin/listeners/ActionBarListener.java new file mode 100644 index 0000000..95024fb --- /dev/null +++ b/src/main/java/com/mviper/zenithjoin/listeners/ActionBarListener.java @@ -0,0 +1,52 @@ +package com.mviper.zenithjoin.listeners; + +import com.mviper.zenithjoin.Main; +import com.mviper.zenithjoin.config.ConfigManager; +import com.mviper.zenithjoin.config.MessagesManager; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class ActionBarListener implements Listener { + + private final Main plugin; + + public ActionBarListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + ConfigManager configManager = plugin.getConfigManager(); + MessagesManager messagesManager = plugin.getMessagesManager(); + + FileConfiguration config = configManager.getConfig(); + FileConfiguration messages = messagesManager.getMessages(); + + if (config.getBoolean("ActionBar.EnabledActionBar") && player.hasPermission("zenithjoin.actionbar")) { + String actionBarMessage = PlaceholderAPI.setPlaceholders(player, + ChatColor.translateAlternateColorCodes('&', + messages.getString("ActionBar.Message") + .replace("{player}", player.getName()))); + + int duration = config.getInt("ActionBar.Duration"); + + // Erstelle den /title Befehl für die Action-Bar + // JSON-Format wird benötigt, um Farben korrekt darzustellen + String jsonMessage = "{\"text\":\"" + actionBarMessage.replace("\"", "\\\"") + "\"}"; + String command = "title " + player.getName() + " actionbar " + jsonMessage; + + // Sende den Befehl über die Konsole + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), command); + + // Da der /title Befehl eine eingebaute Dauer hat, + // ist kein separater Scheduler mehr nötig. + } + } +} \ No newline at end of file diff --git a/src/main/java/com/mviper/zenithjoin/listeners/FirstJoinListener.java b/src/main/java/com/mviper/zenithjoin/listeners/FirstJoinListener.java new file mode 100644 index 0000000..da600f6 --- /dev/null +++ b/src/main/java/com/mviper/zenithjoin/listeners/FirstJoinListener.java @@ -0,0 +1,71 @@ +package com.mviper.zenithjoin.listeners; + +import com.mviper.zenithjoin.Main; +import com.mviper.zenithjoin.config.ConfigManager; +import com.mviper.zenithjoin.config.MessagesManager; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class FirstJoinListener implements Listener { + + private final Main plugin; + + public FirstJoinListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onFirstJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + ConfigManager configManager = plugin.getConfigManager(); + MessagesManager messagesManager = plugin.getMessagesManager(); + + // Prüfen, ob der Spieler neu ist + if (!player.hasPlayedBefore()) { + FileConfiguration config = configManager.getConfig(); + FileConfiguration messages = messagesManager.getMessages(); + + // Erste Beitrittsnachricht in der Konsole + if (config.getBoolean("FirstJoin.EnabledFirstJoinMessage")) { + // KORREKTUR: Die Reihenfolge ist entscheidend! + // 1. Hole die rohe Nachricht. + String rawMessage = messages.getString("FirstJoin.JoinMessage"); + // 2. Ersetze die Platzhalter (z.B. %luckperms_prefix%). + String messageWithPlaceholders = PlaceholderAPI.setPlaceholders(player, rawMessage); + // 3. Übersetze ALLE Farbcodes (&a, &4, etc.) in das finale Format. + String finalMessage = ChatColor.translateAlternateColorCodes('&', messageWithPlaceholders); + + finalMessage = finalMessage + .replace("{displayname}", player.getDisplayName()) + .replace("{player}", player.getName()) + .replace("{>}", "»") + .replace("{<}", "«"); + event.setJoinMessage(finalMessage); + return; // Verhindert, dass die normale Join-Nachricht auch gesendet wird + } + + // Titel beim ersten Beitritt + if (config.getBoolean("FirstJoin.SendTitleOnFirstJoin") && player.hasPermission("zenithjoin.title")) { + String title = ChatColor.translateAlternateColorCodes('&', + messages.getString("FirstJoin.Title") + .replace("{player}", player.getName())); + String subtitle = ChatColor.translateAlternateColorCodes('&', + messages.getString("FirstJoin.SubTitle") + .replace("{player}", player.getName())); + player.sendTitle(title, subtitle); + } + + // Feuerwerk beim ersten Beitritt + if (config.getBoolean("FirstJoin.SendFireworkOnFirstJoin") && player.hasPermission("zenithjoin.firework")) { + // Hier könntest du ein spezielles Feuerwerk entfachen lassen + // oder einfach das normale Feuerwerk auslösen, indem du das Event neu feuerts. + // Für den Moment lassen wir es so, wie es ist. + } + } + } +} \ No newline at end of file diff --git a/src/main/java/com/mviper/zenithjoin/listeners/JoinFireworkListener.java b/src/main/java/com/mviper/zenithjoin/listeners/JoinFireworkListener.java new file mode 100644 index 0000000..31bb407 --- /dev/null +++ b/src/main/java/com/mviper/zenithjoin/listeners/JoinFireworkListener.java @@ -0,0 +1,97 @@ +package com.mviper.zenithjoin.listeners; + +import com.mviper.zenithjoin.Main; +import com.mviper.zenithjoin.config.ConfigManager; +import org.bukkit.Color; +import org.bukkit.FireworkEffect; +import org.bukkit.Location; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Firework; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.inventory.meta.FireworkMeta; + +import java.util.ArrayList; +import java.util.List; + +public class JoinFireworkListener implements Listener { + + private final Main plugin; + + public JoinFireworkListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + ConfigManager configManager = plugin.getConfigManager(); + FileConfiguration config = configManager.getConfig(); + + Player player = event.getPlayer(); + + if (config.getBoolean("JoinFirework.EnabledFirework") && + player.hasPermission("zenithjoin.firework")) { + + int amount = config.getInt("JoinFirework.AmountFirework"); + + for (int i = 0; i < amount; i++) { + Location location = player.getLocation(); + // ÄNDERUNG: FIREWORK wurde zu FIREWORK_ROCKET + Firework firework = (Firework) player.getWorld().spawnEntity(location, EntityType.FIREWORK_ROCKET); + FireworkMeta meta = firework.getFireworkMeta(); + + meta.setPower(config.getInt("JoinFirework.Firework.Power")); + + ArrayList colors = new ArrayList<>(); + ArrayList fadeColors = new ArrayList<>(); + + List colorList = config.getStringList("JoinFirework.Firework.Colors"); + List fadeColorList = config.getStringList("JoinFirework.Firework.FadeColor"); + + for (String colorName : colorList) { + colors.add(getColor(colorName)); + } + + for (String colorName : fadeColorList) { + fadeColors.add(getColor(colorName)); + } + + meta.addEffect(FireworkEffect.builder() + .flicker(config.getBoolean("JoinFirework.Flicker")) + .trail(config.getBoolean("JoinFirework.Trail")) + .with(FireworkEffect.Type.valueOf(config.getString("JoinFirework.Type"))) + .withColor(colors) + .withFade(fadeColors) + .build()); + + firework.setFireworkMeta(meta); + } + } + } + + private Color getColor(String name) { + switch (name.toUpperCase()) { + case "AQUA": return Color.AQUA; + case "BLACK": return Color.BLACK; + case "BLUE": return Color.BLUE; + case "FUCHSIA": return Color.FUCHSIA; + case "GRAY": return Color.GRAY; + case "GREEN": return Color.GREEN; + case "LIME": return Color.LIME; + case "MAROON": return Color.MAROON; + case "NAVY": return Color.NAVY; + case "OLIVE": return Color.OLIVE; + case "ORANGE": return Color.ORANGE; + case "PURPLE": return Color.PURPLE; + case "RED": return Color.RED; + case "SILVER": return Color.SILVER; + case "TEAL": return Color.TEAL; + case "WHITE": return Color.WHITE; + case "YELLOW": return Color.YELLOW; + default: return Color.WHITE; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/mviper/zenithjoin/listeners/JoinLinksListener.java b/src/main/java/com/mviper/zenithjoin/listeners/JoinLinksListener.java new file mode 100644 index 0000000..fb40ed5 --- /dev/null +++ b/src/main/java/com/mviper/zenithjoin/listeners/JoinLinksListener.java @@ -0,0 +1,118 @@ +package com.mviper.zenithjoin.listeners; + +import com.mviper.zenithjoin.Main; +import com.mviper.zenithjoin.config.ConfigManager; +import com.mviper.zenithjoin.config.MessagesManager; +import com.mviper.zenithjoin.utils.ChatUtils; // WICHTIG: Import der neuen Hilfsklasse +import me.clip.placeholderapi.PlaceholderAPI; +import net.md_5.bungee.api.chat.ClickEvent; +import net.md_5.bungee.api.chat.ComponentBuilder; +import net.md_5.bungee.api.chat.HoverEvent; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +import java.util.List; + +public class JoinLinksListener implements Listener { + + private final Main plugin; + + public JoinLinksListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + ConfigManager configManager = plugin.getConfigManager(); + MessagesManager messagesManager = plugin.getMessagesManager(); + + FileConfiguration config = configManager.getConfig(); + FileConfiguration messages = messagesManager.getMessages(); + + if (config.getBoolean("PlayerJoin.MessageJoin") && player.hasPermission("zenithjoin.welcomemessage")) { + // Erste Willkommensnachricht senden + List welcomeMessages = messages.getStringList("ZenithJoin.FirstWelcomeMessage"); + for (String message : welcomeMessages) { + String formattedMessage = formatString(player, message); + // Nachricht zentrieren und senden + player.sendMessage(ChatUtils.centerText(formattedMessage)); + } + + // Klickbare Links als eine zentrierte Zeile senden + TextComponent website = createLinkComponent(messages, "ZenithJoin.ServerLinks.website", player); + TextComponent store = createLinkComponent(messages, "ZenithJoin.ServerLinks.store", player); + TextComponent twitter = createLinkComponent(messages, "ZenithJoin.ServerLinks.twitter", player); + TextComponent discord = createLinkComponent(messages, "ZenithJoin.ServerLinks.discord", player); + + // Erstellen einer Komponente, die alle Links enthält + TextComponent line = new TextComponent(); + + // Den gesamten Text der Links für die Zentrierung zusammenfügen + String fullLinkText = website.getText() + store.getText() + twitter.getText() + discord.getText(); + + // Den zusammengesetzten Text zentrieren + String centeredFullLinkText = ChatUtils.centerText(fullLinkText); + + // Die Anzahl der führenden Leerzeichen ermitteln + String strippedCenteredText = ChatColor.stripColor(centeredFullLinkText); + String strippedFullText = ChatColor.stripColor(fullLinkText); + int leadingSpaces = strippedCenteredText.length() - strippedCenteredText.trim().length() - (strippedFullText.length() - strippedFullText.trim().length()); + + // Füge die Leerzeichen als "unformatierten" Text hinzu + line.addExtra(new TextComponent(" ".repeat(Math.max(0, leadingSpaces)))); + + // Füge die eigentlichen Link-Komponenten hinzu + line.addExtra(website); + line.addExtra(store); + line.addExtra(twitter); + line.addExtra(discord); + + player.spigot().sendMessage(line); + + // Zweite Willkommensnachricht senden + List secondWelcomeMessages = messages.getStringList("ZenithJoin.SecondWelcomeMessage"); + for (String message : secondWelcomeMessages) { + String formattedMessage = formatString(player, message); + // Nachricht zentrieren und senden + player.sendMessage(ChatUtils.centerText(formattedMessage)); + } + } + } + + /** + * Hilfsmethode zum Formatieren eines Strings mit Platzhaltern und Farbcodes. + */ + private String formatString(Player player, String message) { + return PlaceholderAPI.setPlaceholders(player, + ChatColor.translateAlternateColorCodes('&', message) + .replace("{player}", player.getName()) + .replace("<1>", "»") + .replace("<3>", "«") + .replace("<2>", "◀ ▶") + .replace("<4>", "◉") + .replace("<5>", "❤") + .replace("<6>", "▋")); + } + + /** + * Erstellt eine klickbare TextComponent für einen Link. + */ + private TextComponent createLinkComponent(FileConfiguration messages, String path, Player player) { + String name = formatString(player, messages.getString(path + ".name")); + String url = messages.getString(path + ".pagelink"); + String hoverText = formatString(player, messages.getString(path + ".description")); + + TextComponent component = new TextComponent(name); + component.setClickEvent(new ClickEvent(ClickEvent.Action.OPEN_URL, url)); + component.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder(hoverText).create())); + + return component; + } +} \ No newline at end of file diff --git a/src/main/java/com/mviper/zenithjoin/listeners/JoinMessageListener.java b/src/main/java/com/mviper/zenithjoin/listeners/JoinMessageListener.java new file mode 100644 index 0000000..8097e91 --- /dev/null +++ b/src/main/java/com/mviper/zenithjoin/listeners/JoinMessageListener.java @@ -0,0 +1,55 @@ +package com.mviper.zenithjoin.listeners; + +import com.mviper.zenithjoin.Main; +import com.mviper.zenithjoin.config.ConfigManager; +import com.mviper.zenithjoin.config.MessagesManager; +import com.mviper.zenithjoin.utils.ChatUtils; // WICHTIG: Import der neuen Hilfsklasse +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class JoinMessageListener implements Listener { + + private final Main plugin; + + public JoinMessageListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + ConfigManager configManager = plugin.getConfigManager(); + MessagesManager messagesManager = plugin.getMessagesManager(); + + FileConfiguration config = configManager.getConfig(); + FileConfiguration messages = messagesManager.getMessages(); + + Player player = event.getPlayer(); + + // Standard-Join-Nachricht leeren + event.setJoinMessage(""); + + // Benutzerdefinierte Join-Nachricht senden, wenn aktiviert + if (config.getBoolean("PlayerJoinMessage.PlayerJoin") && + player.hasPermission("zenithjoin.joinmessage")) { + + String rawMessage = messages.getString("PlayerJoinMessage.Join"); + String messageWithPlaceholders = PlaceholderAPI.setPlaceholders(player, rawMessage); + String finalMessage = ChatColor.translateAlternateColorCodes('&', messageWithPlaceholders); + + finalMessage = finalMessage + .replace("{displayname}", player.getDisplayName()) + .replace("{player}", player.getName()) + .replace("{>}", "»") + .replace("{<}", "«"); + + // Nachricht zentrieren und setzen + String centeredMessage = ChatUtils.centerText(finalMessage); + event.setJoinMessage(centeredMessage); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/mviper/zenithjoin/listeners/LeaveMessageListener.java b/src/main/java/com/mviper/zenithjoin/listeners/LeaveMessageListener.java new file mode 100644 index 0000000..4419c81 --- /dev/null +++ b/src/main/java/com/mviper/zenithjoin/listeners/LeaveMessageListener.java @@ -0,0 +1,53 @@ +package com.mviper.zenithjoin.listeners; + +import com.mviper.zenithjoin.Main; +import com.mviper.zenithjoin.config.ConfigManager; +import com.mviper.zenithjoin.config.MessagesManager; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +public class LeaveMessageListener implements Listener { + + private final Main plugin; + + public LeaveMessageListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onLeave(PlayerQuitEvent event) { + ConfigManager configManager = plugin.getConfigManager(); + MessagesManager messagesManager = plugin.getMessagesManager(); + + FileConfiguration config = configManager.getConfig(); + FileConfiguration messages = messagesManager.getMessages(); + + Player player = event.getPlayer(); + + // Clear default leave message + event.setQuitMessage(""); + + // Send custom leave message if enabled + if (config.getBoolean("PlayerLeaveMessage.PlayerLeave") && + player.hasPermission("zenithjoin.leavemessage")) { + + // KORREKTUR: Die Reihenfolge ist entscheidend! + String rawMessage = messages.getString("PlayerLeaveMessage.Leave"); + String messageWithPlaceholders = PlaceholderAPI.setPlaceholders(player, rawMessage); + String finalMessage = ChatColor.translateAlternateColorCodes('&', messageWithPlaceholders); + + finalMessage = finalMessage + .replace("{displayname}", player.getDisplayName()) + .replace("{player}", player.getName()) + .replace("{>}", "»") + .replace("{<}", "«"); + + event.setQuitMessage(finalMessage); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/mviper/zenithjoin/listeners/TitleListener.java b/src/main/java/com/mviper/zenithjoin/listeners/TitleListener.java new file mode 100644 index 0000000..40a5ac5 --- /dev/null +++ b/src/main/java/com/mviper/zenithjoin/listeners/TitleListener.java @@ -0,0 +1,43 @@ +package com.mviper.zenithjoin.listeners; + +import com.mviper.zenithjoin.Main; +import com.mviper.zenithjoin.config.ConfigManager; +import com.mviper.zenithjoin.config.MessagesManager; +import org.bukkit.ChatColor; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class TitleListener implements Listener { + + private final Main plugin; + + public TitleListener(Main plugin) { + this.plugin = plugin; + } + + @EventHandler + public void onJoin(PlayerJoinEvent event) { + ConfigManager configManager = plugin.getConfigManager(); + MessagesManager messagesManager = plugin.getMessagesManager(); + + FileConfiguration config = configManager.getConfig(); + FileConfiguration messages = messagesManager.getMessages(); + + if (config.getBoolean("TitlesEnabled.PlayerJoinTitle") && event.getPlayer().hasPermission("zenithjoin.title")) { + Player player = event.getPlayer(); + + String title = ChatColor.translateAlternateColorCodes('&', + messages.getString("JoinTitle.Title") + .replace("{player}", player.getName())); + + String subtitle = ChatColor.translateAlternateColorCodes('&', + messages.getString("JoinTitle.SubTitle") + .replace("{player}", player.getName())); + + player.sendTitle(title, subtitle); + } + } +} \ No newline at end of file