8 Commits
1.0 ... 1.1

6 changed files with 702 additions and 420 deletions

18
LICENSE
View File

@@ -1,18 +0,0 @@
MIT License
Copyright (c) 2025 M_Viper
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the
following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE.

22
pom.xml
View File

@@ -7,7 +7,7 @@
<groupId>de.viper</groupId> <groupId>de.viper</groupId>
<artifactId>globalchat</artifactId> <artifactId>globalchat</artifactId>
<version>1.3-SNAPSHOT</version> <version>1.1</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>GlobalChat</name> <name>GlobalChat</name>
@@ -18,14 +18,30 @@
<maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.target>1.8</maven.compiler.target>
</properties> </properties>
<repositories>
<!-- LuckPerms Repository -->
<repository>
<id>luck-repo</id>
<url>https://repo.lucko.me/</url>
</repository>
</repositories>
<dependencies> <dependencies>
<!-- BungeeCord API für Minecraft 1.21.x --> <!-- BungeeCord API -->
<dependency> <dependency>
<groupId>net.md-5</groupId> <groupId>net.md-5</groupId>
<artifactId>bungeecord-api</artifactId> <artifactId>bungeecord-api</artifactId>
<version>1.21-R0.1-SNAPSHOT</version> <version>1.21-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- LuckPerms API -->
<dependency>
<groupId>net.luckperms</groupId>
<artifactId>api</artifactId>
<version>5.4</version>
<scope>provided</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
@@ -41,7 +57,7 @@
</configuration> </configuration>
</plugin> </plugin>
<!-- Shade Plugin für fertiges JAR --> <!-- Shade Plugin -->
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>

View File

@@ -1,12 +1,21 @@
package de.viper.globalchat; package de.viper.globalchat;
import net.luckperms.api.LuckPerms;
import net.luckperms.api.LuckPermsProvider;
import net.luckperms.api.model.user.User;
import net.luckperms.api.cacheddata.CachedMetaData;
import net.md_5.bungee.api.ChatColor;
import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.chat.ComponentBuilder; import net.md_5.bungee.api.chat.ComponentBuilder;
import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.HoverEvent;
import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.chat.TextComponent;
import net.md_5.bungee.api.chat.HoverEvent.Action; import net.md_5.bungee.api.chat.HoverEvent.Action;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.ChatEvent; import net.md_5.bungee.api.event.ChatEvent;
import net.md_5.bungee.api.event.ServerConnectEvent;
import net.md_5.bungee.api.event.ServerSwitchEvent;
import net.md_5.bungee.api.plugin.Command; import net.md_5.bungee.api.plugin.Command;
import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Listener;
import net.md_5.bungee.api.plugin.Plugin; import net.md_5.bungee.api.plugin.Plugin;
@@ -19,47 +28,118 @@ import java.util.*;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/**
* GlobalChat - Bungee Plugin
* - Filter (filter.yml)
* - Logs (plugins/GlobalChat/logs/YYYY-MM-DD.log)
* - /support, /reply, /info
* - Prefix/Suffix via LuckPerms (Proxy-side)
* - ServerSwitch announcement (sends message to chat when a player switches from one server to another)
* - Attempts to suppress Spigot join/quit messages during server switch
*/
public class GlobalChat extends Plugin implements Listener { public class GlobalChat extends Plugin implements Listener {
private static final String CHANNEL_CONTROL = "global:control";
private List<String> badWords = new ArrayList<>(); private List<String> badWords = new ArrayList<>();
private File logFolder; private File logFolder;
private boolean chatMuted = false; // Globaler Mute-Status private boolean chatMuted = false;
// Spieler-UUID -> isOp (vom Spigot gemeldet) // Optional: falls Spigot-Server OP-Info per PluginMessage sendet
private final Map<UUID, Boolean> playerIsOp = new ConcurrentHashMap<>(); private final Map<UUID, Boolean> playerIsOp = new ConcurrentHashMap<>();
// Letzte Support-Kontakte (staff UUID -> target UUID)
// Letzte Support-Kontakte für /reply
private final Map<UUID, UUID> lastSupportContact = new ConcurrentHashMap<>(); private final Map<UUID, UUID> lastSupportContact = new ConcurrentHashMap<>();
// Tracking für unterdrückte Join-/Quit-Nachrichten
private final Set<UUID> suppressJoinQuit = ConcurrentHashMap.newKeySet();
// ===========================
// Neu: Welcome-Nachrichten
// ===========================
private List<String> welcomeMessages = new ArrayList<>();
private void loadWelcomeMessages() {
File file = new File(getDataFolder(), "welcome.yml");
if (!file.exists()) {
try {
getDataFolder().mkdirs();
file.createNewFile();
try (PrintWriter out = new PrintWriter(file)) {
out.println("welcome-messages:");
out.println(" - \"&aWillkommen, %player%! Viel Spaß auf unserem Server!\"");
out.println(" - \"&aHey %player%, schön dich hier zu sehen! Los geht's!\"");
out.println(" - \"&a%player%, dein Abenteuer beginnt jetzt! Viel Spaß!\"");
out.println(" - \"&aWillkommen an Bord, %player%! Entdecke den Server!\"");
out.println(" - \"&a%player%, herzlich willkommen! Lass uns loslegen!\"");
}
} catch (IOException e) {
e.printStackTrace();
}
}
try {
List<String> lines = Files.readAllLines(file.toPath());
welcomeMessages.clear();
for (String line : lines) {
line = line.trim();
if (line.startsWith("-")) welcomeMessages.add(line.substring(1).trim());
}
getLogger().info("§eGeladene Welcome-Nachrichten: " + welcomeMessages.size());
} catch (IOException e) {
e.printStackTrace();
}
}
private void sendRandomWelcomeMessage(ProxiedPlayer player) {
if (welcomeMessages.isEmpty()) return;
Random rand = new Random();
String message = welcomeMessages.get(rand.nextInt(welcomeMessages.size()));
message = message.replace("%player%", player.getName());
message = ChatColor.translateAlternateColorCodes('&', message);
player.sendMessage(new TextComponent(message));
}
@Override @Override
public void onEnable() { public void onEnable() {
// Plugin channel registrieren (für Steuer-Nachrichten an Spigot)
try {
getProxy().registerChannel(CHANNEL_CONTROL);
} catch (Throwable ignored) {
getLogger().warning("Konnte Kanal " + CHANNEL_CONTROL + " nicht registrieren.");
}
getProxy().getPluginManager().registerListener(this, this); getProxy().getPluginManager().registerListener(this, this);
// Filter laden
loadFilter(); loadFilter();
loadWelcomeMessages();
// Log-Ordner erstellen
logFolder = new File(getDataFolder(), "logs"); logFolder = new File(getDataFolder(), "logs");
if (!logFolder.exists()) logFolder.mkdirs(); if (!logFolder.exists()) logFolder.mkdirs();
cleanupOldLogs(); cleanupOldLogs();
// Befehle registrieren (Support & Info sind für alle verfügbar) // Befehle registrieren
getProxy().getPluginManager().registerCommand(this, new ReloadCommand()); getProxy().getPluginManager().registerCommand(this, new ReloadCommand());
getProxy().getPluginManager().registerCommand(this, new MuteCommand()); getProxy().getPluginManager().registerCommand(this, new MuteCommand());
getProxy().getPluginManager().registerCommand(this, new SupportCommand()); getProxy().getPluginManager().registerCommand(this, new SupportCommand());
getProxy().getPluginManager().registerCommand(this, new ReplyCommand()); getProxy().getPluginManager().registerCommand(this, new ReplyCommand());
getProxy().getPluginManager().registerCommand(this, new InfoCommand()); getProxy().getPluginManager().registerCommand(this, new InfoCommand());
getLogger().info("§aGlobalChat mit Zensur, Logs, Reload, Mute, Support, Reply & Info aktiviert!"); getLogger().info("§aGlobalChat aktiviert (Zensur, Logs, Reload, Mute, Support, Reply & Info)!");
} }
@Override @Override
public void onDisable() { public void onDisable() {
getLogger().info("§cGlobalChat deaktiviert!"); getLogger().info("§cGlobalChat deaktiviert!");
try {
getProxy().unregisterChannel(CHANNEL_CONTROL);
} catch (Throwable ignored) {
getLogger().warning("Konnte Kanal " + CHANNEL_CONTROL + " nicht deregistrieren.");
}
} }
// =========================== // ===========================
// Chatfilter & Logging // Chatfilter & Global-Chat
// =========================== // ===========================
@EventHandler @EventHandler
public void onChat(ChatEvent e) { public void onChat(ChatEvent e) {
@@ -68,16 +148,27 @@ public class GlobalChat extends Plugin implements Listener {
ProxiedPlayer player = (ProxiedPlayer) e.getSender(); ProxiedPlayer player = (ProxiedPlayer) e.getSender();
String originalMsg = e.getMessage(); String originalMsg = e.getMessage();
String censoredMsg = originalMsg;
// Globaler Mute check // Debugging: Logge alle Chat-Nachrichten, um zu prüfen, ob Join-/Quit-Nachrichten ankommen
getLogger().info("ChatEvent: Spieler=" + player.getName() + ", Nachricht=" + originalMsg);
// Versuche, Join-/Quit-Nachrichten zu filtern
if (suppressJoinQuit.contains(player.getUniqueId()) &&
(originalMsg.contains("joined the Game") || originalMsg.contains("left the Game"))) {
getLogger().info("Unterdrücke Join-/Quit-Nachricht für " + player.getName() + ": " + originalMsg);
e.setCancelled(true);
return;
}
// Globaler Mute
if (chatMuted && !player.hasPermission("globalchat.bypass")) { if (chatMuted && !player.hasPermission("globalchat.bypass")) {
player.sendMessage(new TextComponent("§cDer globale Chat ist derzeit deaktiviert!")); player.sendMessage(new TextComponent("§cDer globale Chat ist derzeit deaktiviert!"));
e.setCancelled(true); e.setCancelled(true);
return; return;
} }
// Badword-Zensur // Badword-Zensur (nur für Chat-Ausgabe; Log bleibt unzensiert)
String censoredMsg = originalMsg;
for (String bad : badWords) { for (String bad : badWords) {
if (bad == null || bad.trim().isEmpty()) continue; if (bad == null || bad.trim().isEmpty()) continue;
censoredMsg = censoredMsg.replaceAll("(?i)" + Pattern.quote(bad), repeat("*", bad.length())); censoredMsg = censoredMsg.replaceAll("(?i)" + Pattern.quote(bad), repeat("*", bad.length()));
@@ -86,15 +177,153 @@ public class GlobalChat extends Plugin implements Listener {
e.setCancelled(true); e.setCancelled(true);
String serverName = player.getServer().getInfo().getName(); String serverName = player.getServer().getInfo().getName();
String chatOut = "§7[" + serverName + "] §b" + player.getName() + "§f: " + censoredMsg;
// Prefix/Suffix holen (LuckPerms Proxy-side)
String[] ps = getPrefixSuffix(player);
String prefix = ps[0] == null ? "" : ps[0].trim();
String suffix = ps[1] == null ? "" : ps[1].trim();
// Entscheide: zeige entweder Prefix (falls vorhanden) oder, falls kein Prefix, das Suffix.
String displayTag = "";
if (!prefix.isEmpty()) {
displayTag = prefix;
} else if (!suffix.isEmpty()) {
displayTag = suffix;
}
// saubere Leerzeichen um displayTag
if (!displayTag.isEmpty() && !displayTag.endsWith(" ")) displayTag = displayTag + " ";
// Format: [Server] <tag>Name: Nachricht
StringBuilder out = new StringBuilder();
out.append("§7[").append(serverName).append("] ");
if (!displayTag.isEmpty()) out.append(displayTag);
out.append(player.getName());
out.append("§f: ").append(censoredMsg);
String chatOut = out.toString();
for (ProxiedPlayer p : getProxy().getPlayers()) { for (ProxiedPlayer p : getProxy().getPlayers()) {
p.sendMessage(new TextComponent(chatOut)); p.sendMessage(new TextComponent(chatOut));
} }
logMessage("[" + serverName + "] " + player.getName() + ": " + originalMsg); // Log unzensiert (ohne color codes)
String logEntry = "[" + serverName + "] " +
(displayTag.isEmpty() ? "" : stripColor(displayTag) + " ") +
player.getName() +
": " + originalMsg;
logMessage(logEntry);
} }
// ===========================
// Server connect (pre-switch suppression)
// ===========================
@EventHandler
public void onServerConnect(ServerConnectEvent e) {
if (e.isCancelled()) return;
ProxiedPlayer player = e.getPlayer();
ServerInfo target = e.getTarget();
ServerInfo from = player.getServer() != null ? player.getServer().getInfo() : null;
if (from == null || from.equals(target)) return;
// Markiere Spieler für Unterdrückung
suppressJoinQuit.add(player.getUniqueId());
getLogger().info("Markiert " + player.getName() + " für Join-/Quit-Unterdrückung");
// Suppress quit on old server
try {
sendSuppressJoinQuit(from, player.getUniqueId());
getLogger().info("Sent suppress quit message for " + player.getName() + " to server " + from.getName());
} catch (Throwable ex) {
getLogger().warning("Fehler beim Senden der Quit-Unterdrückung an " + from.getName() + ": " + ex.getMessage());
}
// Suppress join on new server
try {
sendSuppressJoinQuit(target, player.getUniqueId());
getLogger().info("Sent suppress join message for " + player.getName() + " to server " + target.getName());
} catch (Throwable ex) {
getLogger().warning("Fehler beim Senden der Join-Unterdrückung an " + target.getName() + ": " + ex.getMessage());
}
// Entferne Unterdrückung nach kurzer Zeit (2 Sekunden)
getProxy().getScheduler().schedule(this, () -> {
suppressJoinQuit.remove(player.getUniqueId());
getLogger().info("Entfernte Unterdrückung für " + player.getName());
}, 2, java.util.concurrent.TimeUnit.SECONDS);
}
// ===========================
// Server switch announcement
// ===========================
@EventHandler
public void onServerSwitch(ServerSwitchEvent e) {
ProxiedPlayer player = e.getPlayer();
ServerInfo from = e.getFrom(); // kann null sein beim ersten Join
ServerInfo to = player.getServer() != null ? player.getServer().getInfo() : null;
if (to == null) return;
// Wenn from == null -> erster Join, keine Nachricht senden
if (from == null) return;
// Nur senden, wenn Server wirklich gewechselt wurde
if (from.getName().equalsIgnoreCase(to.getName())) return;
String fromName = from.getName();
String toName = to.getName();
// Prefix/Suffix für Anzeige (show either prefix or suffix)
String[] ps = getPrefixSuffix(player);
String prefix = ps[0] == null ? "" : ps[0].trim();
String suffix = ps[1] == null ? "" : ps[1].trim();
String displayTag = "";
if (!prefix.isEmpty()) displayTag = prefix;
else if (!suffix.isEmpty()) displayTag = suffix;
if (!displayTag.isEmpty() && !displayTag.endsWith(" ")) displayTag = displayTag + " ";
StringBuilder msg = new StringBuilder();
msg.append("§7[").append(toName).append("] ");
if (!displayTag.isEmpty()) msg.append(displayTag);
msg.append(player.getName());
msg.append(" §7hat den Server gewechselt: §e")
.append(fromName).append(" §7→ §e").append(toName).append("§7.");
String finalMsg = msg.toString();
// An alle Spieler senden (sichtbar im Chat)
for (ProxiedPlayer p : getProxy().getPlayers()) {
p.sendMessage(new TextComponent(finalMsg));
}
// Log (ohne Farb-Codes)
String logEntry = "[" + toName + "] " +
(displayTag.isEmpty() ? "" : stripColor(displayTag) + " ") +
player.getName() + " hat den Server gewechselt: " + fromName + " -> " + toName + ".";
logMessage(logEntry);
}
/**
* Sendet an den Ziel-Server eine PluginMessage mit dem Befehl, Join/Quit für den Spieler zu unterdrücken.
* Format: writeUTF("suppress"); writeUTF(playerUUID)
*/
private void sendSuppressJoinQuit(ServerInfo server, UUID playerId) {
if (server == null) return;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
DataOutputStream out = new DataOutputStream(baos)) {
out.writeUTF("suppress");
out.writeUTF(playerId.toString());
server.sendData(CHANNEL_CONTROL, baos.toByteArray());
} catch (IOException ex) {
getLogger().warning("Fehler beim Senden der suppress-Nachricht an " + server.getName() + ": " + ex.getMessage());
}
}
// Java8-kompatible repeat
private String repeat(String str, int count) { private String repeat(String str, int count) {
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for (int i = 0; i < count; i++) sb.append(str); for (int i = 0; i < count; i++) sb.append(str);
@@ -102,7 +331,59 @@ public class GlobalChat extends Plugin implements Listener {
} }
// =========================== // ===========================
// Filter laden // Prefix/Suffix via LuckPerms (Proxy-side)
// ===========================
private String[] getPrefixSuffix(ProxiedPlayer player) {
String prefix = "";
String suffix = "";
try {
LuckPerms lp = LuckPermsProvider.get();
if (lp != null) {
// Versuche schnell aus dem Cache zu holen
User user = lp.getUserManager().getUser(player.getUniqueId());
// Falls nicht im Cache: synchrones Laden (Fallback) — kann blockieren, aber stellt Prefix sicher
if (user == null) {
try {
user = lp.getUserManager().loadUser(player.getUniqueId()).join();
} catch (Exception ignored) {
user = null;
}
}
if (user != null) {
CachedMetaData meta = user.getCachedData().getMetaData();
if (meta != null) {
String p = meta.getPrefix();
String s = meta.getSuffix();
if (p != null) prefix = p;
if (s != null) suffix = s;
}
}
}
} catch (Throwable ignored) {
// LuckPerms nicht vorhanden oder andere Fehler -> kein Prefix/Suffix
}
// Farbcodes übersetzen (& -> §)
if (prefix != null && !prefix.isEmpty()) prefix = ChatColor.translateAlternateColorCodes('&', prefix);
if (suffix != null && !suffix.isEmpty()) suffix = ChatColor.translateAlternateColorCodes('&', suffix);
if (prefix == null) prefix = "";
if (suffix == null) suffix = "";
return new String[]{prefix, suffix};
}
// Entfernt Bungee-Farbcodes aus Strings (für saubere Logs)
private String stripColor(String s) {
if (s == null) return "";
return ChatColor.stripColor(s);
}
// ===========================
// Filter einlesen
// =========================== // ===========================
private void loadFilter() { private void loadFilter() {
File file = new File(getDataFolder(), "filter.yml"); File file = new File(getDataFolder(), "filter.yml");
@@ -134,6 +415,9 @@ public class GlobalChat extends Plugin implements Listener {
} }
} }
// ===========================
// Logs aufräumen / schreiben
// ===========================
private void cleanupOldLogs() { private void cleanupOldLogs() {
File[] files = logFolder.listFiles(); File[] files = logFolder.listFiles();
if (files == null) return; if (files == null) return;
@@ -162,7 +446,7 @@ public class GlobalChat extends Plugin implements Listener {
} }
// =========================== // ===========================
// Staff-Check // Staff-Check (Op / team perms)
// =========================== // ===========================
private boolean isStaff(ProxiedPlayer p) { private boolean isStaff(ProxiedPlayer p) {
if (p == null) return false; if (p == null) return false;
@@ -208,8 +492,8 @@ public class GlobalChat extends Plugin implements Listener {
} }
} }
// /support <msg>
public class SupportCommand extends Command { public class SupportCommand extends Command {
// kein Permission-Parameter -> für alle verfügbar
public SupportCommand() { super("support"); } public SupportCommand() { super("support"); }
@Override @Override
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
@@ -227,19 +511,11 @@ public class GlobalChat extends Plugin implements Listener {
String msg = String.join(" ", args); String msg = String.join(" ", args);
String serverName = player.getServer().getInfo().getName(); String serverName = player.getServer().getInfo().getName();
TextComponent supportMsg = new TextComponent("§7[Support] §b" + player.getName() + TextComponent supportMsg = new TextComponent("§7[Support] §b" + player.getName() + " §7vom Server §e" + serverName + " §7: §f" + msg);
" §7vom Server §e" + serverName + " §7: §f" + msg); supportMsg.setHoverEvent(new HoverEvent(Action.SHOW_TEXT, new ComponentBuilder("Klicke, um /reply " + player.getName() + " zu schreiben").create()));
supportMsg.setClickEvent(new net.md_5.bungee.api.chat.ClickEvent(net.md_5.bungee.api.chat.ClickEvent.Action.SUGGEST_COMMAND, "/reply " + player.getName() + " "));
// Hover-Text
supportMsg.setHoverEvent(new HoverEvent(Action.SHOW_TEXT,
new ComponentBuilder("Klicke, um /reply " + player.getName() + " zu schreiben").create()));
// Klick-Event (füllt die Chatbox mit /reply <Name> )
supportMsg.setClickEvent(new net.md_5.bungee.api.chat.ClickEvent(
net.md_5.bungee.api.chat.ClickEvent.Action.SUGGEST_COMMAND,
"/reply " + player.getName() + " "
));
// an alle Staff
for (ProxiedPlayer p : getProxy().getPlayers()) { for (ProxiedPlayer p : getProxy().getPlayers()) {
if (isStaff(p)) { if (isStaff(p)) {
p.sendMessage(supportMsg); p.sendMessage(supportMsg);
@@ -252,6 +528,7 @@ public class GlobalChat extends Plugin implements Listener {
} }
} }
// /reply <msg>
public class ReplyCommand extends Command { public class ReplyCommand extends Command {
public ReplyCommand() { super("reply"); } public ReplyCommand() { super("reply"); }
@Override @Override
@@ -282,10 +559,9 @@ public class GlobalChat extends Plugin implements Listener {
} }
} }
// /info
public class InfoCommand extends Command { public class InfoCommand extends Command {
// kein Permission-Parameter -> für alle verfügbar
public InfoCommand() { super("info"); } public InfoCommand() { super("info"); }
@Override @Override
public void execute(CommandSender sender, String[] args) { public void execute(CommandSender sender, String[] args) {
sender.sendMessage(new TextComponent("§8§m------------------------------")); sender.sendMessage(new TextComponent("§8§m------------------------------"));

View File

@@ -1,7 +1,9 @@
name: GlobalChat name: GlobalChat
main: de.viper.globalchat.GlobalChat main: de.viper.globalchat.GlobalChat
version: 1.0 version: 1.1
author: M_Viper author: M_Viper
depend: [LuckPerms]
commands: commands:
globalreload: globalreload:
description: Lädt den Filter neu description: Lädt den Filter neu

View File

@@ -1,6 +1,6 @@
name: GlobalChatSpigot name: GlobalChatSpigot
main: de.viper.globalchat.GlobalChatSpigot main: de.viper.globalchat.GlobalChatSpigot
version: 1.0 version: 1.1
api-version: 1.13 api-version: 1.13
description: Spigot helper for GlobalChat Bungee (sends coords, handles teleport requests) description: Spigot helper for GlobalChat Bungee (sends coords, handles teleport requests)
authors: [M_Viper] authors: [M_Viper]

View File

@@ -0,0 +1,6 @@
welcome-messages:
- "&aWillkommen, %player%! Viel Spaß auf unserem Server!"
- "&aHey %player%, schön dich hier zu sehen! Los geht's!"
- "&a%player%, dein Abenteuer beginnt jetzt! Viel Spaß!"
- "&aWillkommen an Bord, %player%! Entdecke den Server!"
- "&a%player%, herzlich willkommen! Lass uns loslegen!"