diff --git a/pom.xml b/pom.xml
index 74d6f1e..42e9ab4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -59,6 +59,12 @@
6.5.1.RELEASE
compile
+
+ de.themoep
+ minedown-adventure
+ 1.7.1-SNAPSHOT
+ compile
+
@@ -130,6 +136,10 @@
org.reactivestreams
de.minebench.syncinv.lib.reactivestreams
+
+ de.themoep.minedown
+ de.minebench.syncinv.lib.minedown
+
diff --git a/src/main/java/de/minebench/syncinv/SyncInv.java b/src/main/java/de/minebench/syncinv/SyncInv.java
index df46549..5bfa2b1 100644
--- a/src/main/java/de/minebench/syncinv/SyncInv.java
+++ b/src/main/java/de/minebench/syncinv/SyncInv.java
@@ -18,8 +18,9 @@
import de.minebench.syncinv.messenger.PlayerDataQuery;
import de.minebench.syncinv.messenger.RedisMessenger;
import de.minebench.syncinv.messenger.ServerMessenger;
+import de.themoep.minedown.adventure.MineDown;
import org.apache.maven.artifact.versioning.ComparableVersion;
-import org.bukkit.ChatColor;
+import net.kyori.adventure.text.Component;
import org.bukkit.GameRule;
import org.bukkit.Material;
import org.bukkit.OfflinePlayer;
@@ -288,16 +289,15 @@ public void onEnable() {
if (query.getYoungestServer() == null) {
openInvCommand.onCommand(sender, command, label, args);
} else {
- sender.sendMessage(ChatColor.RED + "Current server does not have newest player data! "
- + ChatColor.GRAY + "Connecting to server " + query.getYoungestServer() + " which has the newest data...");
+ sender.sendMessage(getLang("stale-player-data", "server", query.getYoungestServer()));
connectToServer(((Player) sender).getUniqueId(), query.getYoungestServer());
}
});
if (q == null) {
- sender.sendMessage(ChatColor.RED + "Could not query information from other servers! Take a look at the log for more details.");
+ sender.sendMessage(getLang("query-error"));
}
} else {
- sender.sendMessage(ChatColor.RED + "Player not found!");
+ sender.sendMessage(getLang("player-not-found"));
}
});
return true;
@@ -349,8 +349,11 @@ public void onDisable() {
}
public void loadConfig() {
- saveDefaultConfig();
- reloadConfig();
+ reloadConfig(); // load working config
+
+ // save newly added config options to disk
+ getConfig().options().copyDefaults(true);
+ saveConfig();
debug = getConfig().getBoolean("debug");
@@ -451,7 +454,7 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
if (args.length > 0) {
if ("reload".equalsIgnoreCase(args[0]) && sender.hasPermission("syncing.command.reload")) {
loadConfig();
- sender.sendMessage(ChatColor.YELLOW + "Config reloaded!");
+ sender.sendMessage(getLang("config-reloaded"));
return true;
}
}
@@ -461,15 +464,18 @@ public boolean onCommand(CommandSender sender, Command cmd, String label, String
/**
* Get a language message from the config and replace variables in it
* @param key The key of the message (lang.)
- * @param replacements An array of variables to be replaced with certain strings in the format [var,repl,var,repl,...]
+ * @param replacements An array of String to replace placeholders (uses the % character as placeholder indicators)
+ * in format of [placeholder, repl, placeholder,repl,...]
* @return The message string with colorcodes and variables replaced
*/
- public String getLang(String key, String... replacements) {
- String msg = ChatColor.translateAlternateColorCodes('&', getConfig().getString("lang." + key, getName() + ": &cMissing language key &6" + key));
- for (int i = 0; i + 1 < replacements.length; i += 2) {
- msg = msg.replace("%" + replacements[i] + "%", replacements[i + 1]);
+ public Component getLang(String key, String... replacements) {
+ String rawMsg = getConfig().getString("lang." + key); // use default defined by config (values from the config in jar)
+
+ if (rawMsg == null) { // key is missing
+ return MineDown.parse(getName() + ": &cMissing language key &6" + key);
+ } else {
+ return MineDown.parse(rawMsg, replacements);
}
- return msg;
}
/**
@@ -1197,7 +1203,7 @@ public void kick(UUID playerId, String key) {
runSync(() -> {
Player player = getServer().getPlayer(playerId);
if (player != null) {
- player.kickPlayer(getLang(key));
+ player.kick(getLang(key));
}
});
}
diff --git a/src/main/java/de/minebench/syncinv/listeners/MapCreationListener.java b/src/main/java/de/minebench/syncinv/listeners/MapCreationListener.java
index a653086..10e11c4 100644
--- a/src/main/java/de/minebench/syncinv/listeners/MapCreationListener.java
+++ b/src/main/java/de/minebench/syncinv/listeners/MapCreationListener.java
@@ -2,7 +2,6 @@
import de.minebench.syncinv.SyncInv;
import de.minebench.syncinv.SyncType;
-import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.entity.HumanEntity;
import org.bukkit.event.EventHandler;
@@ -60,7 +59,7 @@ public void onMapScale(PrepareItemCraftEvent event) {
plugin.logDebug(event.getView().getPlayer().getName() + " is not on the world that map " + map.getId() + " is from! (" + mapId + ")");
event.getInventory().setResult(null);
for (HumanEntity viewer : event.getViewers()) {
- viewer.sendMessage(ChatColor.RED + "Please switch to the world where this map was created to scale it!");
+ viewer.sendMessage(plugin.getLang("map-scale-wrong-world"));
}
break;
}
diff --git a/src/main/java/de/minebench/syncinv/listeners/PlayerConnectionValidateLoginListener.java b/src/main/java/de/minebench/syncinv/listeners/PlayerConnectionValidateLoginListener.java
index 455d274..5ed8c99 100644
--- a/src/main/java/de/minebench/syncinv/listeners/PlayerConnectionValidateLoginListener.java
+++ b/src/main/java/de/minebench/syncinv/listeners/PlayerConnectionValidateLoginListener.java
@@ -3,8 +3,6 @@
import de.minebench.syncinv.SyncInv;
import io.papermc.paper.connection.PlayerLoginConnection;
import io.papermc.paper.event.connection.PlayerConnectionValidateLoginEvent;
-import net.kyori.adventure.text.Component;
-import net.kyori.adventure.text.format.NamedTextColor;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -42,12 +40,12 @@ public void onPlayerLogin(PlayerConnectionValidateLoginEvent e) {
if (e.isAllowed() && e.getConnection() instanceof PlayerLoginConnection connection && connection.getUnsafeProfile() != null) {
// Sync login listener for sanity checking as we don't want to allow the player to exist twice
Entity entity = plugin.getServer().getEntity(connection.getUnsafeProfile().getUniqueId());
- if (entity instanceof Player) {
- e.kickMessage(Component.text("A player with your UUID already exists!").color(NamedTextColor.RED));
+ if (entity instanceof Player player) {
+ e.kickMessage(plugin.getLang("login_denied_duplicated_uuid"));
plugin.logDebug("A player object with the same UUID " + connection.getUnsafeProfile().getUniqueId() + " already exists on the server.");
// Kick player. This should do nothing if it's not a real one (e.g. one loaded by OpenInv)
// Removal of such players is up to OpenInv itself
- ((Player) entity).kickPlayer("Login from different location.");
+ player.kick(plugin.getLang("kick_duplicated_uuid"));
} else if (entity != null) {
// Well... this is weird. An entity with the same UUID as the player's exists?!? Removing it just to be sure...
plugin.getLogger().info("A " + entity + " with the same UUID " + connection.getUnsafeProfile().getUniqueId()
diff --git a/src/main/java/de/minebench/syncinv/listeners/PlayerJoinListener.java b/src/main/java/de/minebench/syncinv/listeners/PlayerJoinListener.java
index 58da001..1639473 100644
--- a/src/main/java/de/minebench/syncinv/listeners/PlayerJoinListener.java
+++ b/src/main/java/de/minebench/syncinv/listeners/PlayerJoinListener.java
@@ -2,7 +2,6 @@
import de.minebench.syncinv.PlayerData;
import de.minebench.syncinv.SyncInv;
-import org.bukkit.ChatColor;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
@@ -41,12 +40,12 @@ public void onPlayerPreLogin(AsyncPlayerPreLoginEvent e) {
if (e.getLoginResult() == AsyncPlayerPreLoginEvent.Result.ALLOWED) {
if (plugin.getMessenger() == null) {
e.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER);
- e.setKickMessage(ChatColor.RED + plugin.getName() + " is not enabled! Please contact an administrator!");
+ e.kickMessage(plugin.getLang("login_denied_plugin_invalid_state", "plugin", plugin.getName()));
return;
}
if (plugin.getMessenger().queryData(e.getUniqueId()) == null && (!plugin.getMessenger().isAllowedToBeAlone() || !plugin.getMessenger().isAlone())) {
e.setLoginResult(AsyncPlayerPreLoginEvent.Result.KICK_OTHER);
- e.setKickMessage(ChatColor.RED + "Unable to query player data!");
+ e.kickMessage(plugin.getLang("login_denied_missing_data"));
return;
}
}
diff --git a/src/main/java/de/minebench/syncinv/listeners/PlayerLoginListener.java b/src/main/java/de/minebench/syncinv/listeners/PlayerLoginListener.java
index 9ad57c6..e5d31ab 100644
--- a/src/main/java/de/minebench/syncinv/listeners/PlayerLoginListener.java
+++ b/src/main/java/de/minebench/syncinv/listeners/PlayerLoginListener.java
@@ -1,7 +1,6 @@
package de.minebench.syncinv.listeners;
import de.minebench.syncinv.SyncInv;
-import org.bukkit.ChatColor;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@@ -40,13 +39,13 @@ public void onPlayerLogin(PlayerLoginEvent e) {
if (e.getResult() == PlayerLoginEvent.Result.ALLOWED) {
// Sync login listener for sanity checking as we don't want to allow the player to exist twice
Entity entity = plugin.getServer().getEntity(e.getPlayer().getUniqueId());
- if (entity instanceof Player) {
+ if (entity instanceof Player player) {
e.setResult(PlayerLoginEvent.Result.KICK_OTHER);
- e.setKickMessage(ChatColor.RED + "A player with your UUID already exists!");
+ e.kickMessage(plugin.getLang("login_denied_duplicated_uuid"));
plugin.logDebug("A player object with the same UUID " + e.getPlayer().getUniqueId() + " already exists on the server.");
// Kick player. This should do nothing if it's not a real one (e.g. one loaded by OpenInv)
// Removal of such players is up to OpenInv itself
- ((Player) entity).kickPlayer("Login from different location.");
+ player.kick(plugin.getLang("kick_duplicated_uuid"));
} else if (entity != null) {
// Well... this is weird. An entity with the same UUID as the player's exists?!? Removing it just to be sure...
plugin.getLogger().info("A " + entity + " with the same UUID " + e.getPlayer().getUniqueId()
diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml
index df76314..d55d42e 100644
--- a/src/main/resources/config.yml
+++ b/src/main/resources/config.yml
@@ -107,4 +107,13 @@ lang:
cant-drop-items: "&cYou can only drop items once your player data is loaded!"
cant-move: "&cYou can only move once your player data is loaded!"
wait-for-loading: "&cPlease wait until your player data is loaded!"
- cant-load-data: "&cSorry but the server wasn't able to load your latest player data.\nPlease contact an administrator if this happens often!"
\ No newline at end of file
+ cant-load-data: "&cSorry but the server wasn't able to load your latest player data.\nPlease contact an administrator if this happens often!"
+ config-reloaded: "&eConfig reloaded!"
+ player-not-found: "&cPlayer not found!"
+ query-error : "Could not query information from other servers! Take a look at the log for more details."
+ stale-player-data : "&cCurrent server does not have newest player data! &7Connecting to server %server% which has the newest data..."
+ map-scale-wrong-world : "&cPlease switch to the world where this map was created to scale it!"
+ login_denied_duplicated_uuid : "&cA player with your UUID already exists!"
+ kick_duplicated_uuid : "Login from different location."
+ login_denied_missing_data : "&cUnable to query player data!"
+ login_denied_plugin_invalid_state : "&c %plugin% is not enabled! Please contact an administrator!"
\ No newline at end of file