Explorar el Código

Merge pull request #81 from RedstoneFuture/Improvements/msg-configuration

Improvements/msg configuration
Daniel hace 1 año
padre
commit
7ac991de5e
Se han modificado 21 ficheros con 310 adiciones y 209 borrados
  1. 32 27
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/MWCommands.java
  2. 1 1
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/SetupCommands.java
  3. 4 4
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/StatsCommands.java
  4. 39 33
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/UserCommands.java
  5. 1 0
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/Config.java
  6. 127 75
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/Messages.java
  7. 57 25
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java
  8. 1 1
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/GameWorld.java
  9. 8 8
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Team.java
  10. 3 3
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/misc/RespawnGoldBlock.java
  11. 9 7
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/signs/MWSign.java
  12. 1 1
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/EndTimer.java
  13. 2 2
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/GameTimer.java
  14. 5 5
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/LobbyTimer.java
  15. 1 1
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/inventory/VoteInventory.java
  16. 4 4
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/SignListener.java
  17. 1 1
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/EndListener.java
  18. 6 6
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/GameListener.java
  19. 2 2
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/LobbyListener.java
  20. 3 2
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/MoneyUtil.java
  21. 3 1
      missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/stats/PlayerGuiFactory.java

+ 32 - 27
missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/MWCommands.java

@@ -98,24 +98,24 @@ public class MWCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length < 1) {
-            player.sendMessage(Messages.getPrefix() + "§cMissile needed.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_MISSILE_NEEDED));
             return;
         }
 
         if (args.length > 1) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
         Game game = GameManager.getInstance().getGame(player.getLocation());
         if (game == null) {
-            player.sendMessage(Messages.getMessage("not_in_arena"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
             return;
         }
 
         Missile missile = game.getArena().getMissileConfiguration().getMissileFromName(args[0]);
         if (missile == null) {
-            player.sendMessage(Messages.getPrefix() + "§cUnknown missile.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_MISSILE));
             return;
         }
 
@@ -132,7 +132,7 @@ public class MWCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 1) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
@@ -141,19 +141,19 @@ public class MWCommands extends BaseCommand {
         if (args.length == 1) {
             game = GameManager.getInstance().getGame(args[0]);
             if (game == null) {
-                player.sendMessage(Messages.getPrefix() + "§cGame not found.");
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_GAME));
                 return;
             }
         } else {
             game = GameManager.getInstance().getGame(player.getLocation());
             if (game == null) {
-                player.sendMessage(Messages.getMessage("not_in_arena"));
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
                 return;
             }
         }
 
         if (game.getState() != GameState.LOBBY) {
-            player.sendMessage(Messages.getPrefix() + "§cGame already started");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_ALREADY_STARTET));
             return;
         }
 
@@ -161,7 +161,7 @@ public class MWCommands extends BaseCommand {
             game.startGame();
         else {
             if (game.getLobby().getMapChooseProcedure() != MapChooseProcedure.MAPVOTING && game.getArena() == null) {
-                player.sendMessage(Messages.getPrefix() + "§cGame cannot be started");
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_CAN_NOT_STARTET));
             } else {
                 Map.Entry<String, Integer> mostVotes = null;
                 for (Map.Entry<String, Integer> arena : game.getVotes().entrySet()) {
@@ -175,7 +175,7 @@ public class MWCommands extends BaseCommand {
                 Optional<Arena> arena = Arenas.getFromName(mostVotes.getKey());
                 if (arena.isEmpty()) throw new IllegalStateException("Voted arena is not present");
                 game.setArena(arena.get());
-                player.sendMessage(Messages.getPrefix() + "A map was elected. Use \"/mw start\" again to start the round");
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_MAP_SELECTED));
             }
         }
     }
@@ -189,7 +189,7 @@ public class MWCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 1) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
@@ -198,13 +198,13 @@ public class MWCommands extends BaseCommand {
         if (args.length == 1) {
             game = GameManager.getInstance().getGame(args[0]);
             if (game == null) {
-                player.sendMessage(Messages.getPrefix() + "§cGame not found.");
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_GAME));
                 return;
             }
         } else {
             game = GameManager.getInstance().getGame(player.getLocation());
             if (game == null) {
-                player.sendMessage(Messages.getMessage("not_in_arena"));
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
                 return;
             }
         }
@@ -223,7 +223,7 @@ public class MWCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 1) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
@@ -232,19 +232,19 @@ public class MWCommands extends BaseCommand {
         if (args.length == 1) {
             game = GameManager.getInstance().getGame(args[0]);
             if (game == null) {
-                player.sendMessage(Messages.getPrefix() + "§cGame not found.");
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_GAME));
                 return;
             }
         } else {
             game = GameManager.getInstance().getGame(player.getLocation());
             if (game == null) {
-                player.sendMessage(Messages.getMessage("not_in_arena"));
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
                 return;
             }
         }
 
         GameManager.getInstance().getGames().values().forEach(Game::appendRestart);
-        sender.sendMessage(Messages.getMessage("restart_after_game"));
+        sender.sendMessage(Messages.getMessage(true, Messages.MessageEnum.SERVER_RESTART_AFTER_GAME));
     }
 
     @Subcommand("reload")
@@ -256,14 +256,15 @@ public class MWCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 0) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
         Config.load();
         Messages.load();
         Arenas.load();
-        sender.sendMessage(Messages.getPrefix() + "Reloaded configs");
+        
+        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.DEBUG_RELOAD_CONFIG));
     }
 
     @Subcommand("debug")
@@ -275,7 +276,7 @@ public class MWCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 0) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
@@ -285,7 +286,8 @@ public class MWCommands extends BaseCommand {
             Logger.NORMAL.log("Printing state for arena " + game.getArena().getName() + ". Number: " + i);
             Logger.NORMAL.log(game.toString());
         }
-        sender.sendMessage(Messages.getPrefix() + "Printed debug message into the log file");
+        
+        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.DEBUG_PRINTED_DEBUG_MSG));
     }
 
     @Subcommand("restartall")
@@ -297,19 +299,22 @@ public class MWCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 0) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
-
-        sender.sendMessage(Messages.getPrefix() + "§cWarning - Restarting all games. This may take a while");
+        
+        if (GameManager.getInstance().getGames().size() > 10) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.DEBUG_RESTART_ALL_GAMES_WARN));
+        }
+        
         GameManager.getInstance().restartAll();
-        sender.sendMessage(Messages.getPrefix() + "Restarted all games.");
+        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.DEBUG_RESTART_ALL_GAMES));
     }
 
     static boolean senderIsPlayer(CommandSender sender) {
         if (sender instanceof Player) return true;
-
-        sender.sendMessage(Messages.getPrefix() + "§cYou are not a player");
+        
+        sender.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_ONLY_PLAYERS));
         return false;
     }
 

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/SetupCommands.java

@@ -357,7 +357,7 @@ public class SetupCommands extends BaseCommand {
         } else {
             game = GameManager.getInstance().getGame(player.getLocation());
             if (game == null) {
-                player.sendMessage(Messages.getMessage("not_in_arena"));
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
                 return false;
             }
         }

+ 4 - 4
missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/StatsCommands.java

@@ -182,7 +182,7 @@ public class StatsCommands extends BaseCommand {
 
     private StatsFetcher getFetcher(Player player, String[] args) {
         if (!Config.isFightStatsEnabled()) {
-            player.sendMessage(Messages.getPrefix() + "§cFightStats are not enabled!");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.STATS_NOT_ENABLED));
             return null;
         }
         Date from = new Date(0);
@@ -191,7 +191,7 @@ public class StatsCommands extends BaseCommand {
             try {
                 from = format.parse(args[0]);
             } catch (ParseException e) {
-                player.sendMessage(Messages.getPrefix() + "§cPlease use the date format dd.MM.yyyy");
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.STATS_WRONG_DATE_FORMAT));
                 return null;
             }
             if (args.length > 1) {
@@ -201,10 +201,10 @@ public class StatsCommands extends BaseCommand {
 
         StatsFetcher fetcher = new StatsFetcher(from, arena);
         if (fetcher.getGameCount() < 10) {
-            player.sendMessage(Messages.getPrefix() + "Please play more than 10 games to enable fight stats");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.STATS_TOO_FEW_GAMES));
             return null;
         }
-        player.sendMessage(Messages.getPrefix() + "Loading data...");
+        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.STATS_LOADING_DATA));
         return fetcher;
     }
 }

+ 39 - 33
missilewars-plugin/src/main/java/de/butzlabben/missilewars/commands/UserCommands.java

@@ -50,40 +50,40 @@ public class UserCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 0) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
         Game game = GameManager.getInstance().getGame(player.getLocation());
         if (game == null) {
-            player.sendMessage(Messages.getMessage("not_in_arena"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
             return;
         }
 
         if (game.getState() != GameState.LOBBY) {
-            player.sendMessage(Messages.getPrefix() + "§cThe game is not in the right state to vote right now");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.VOTE_CHANGE_TEAM_NOT_NOW));
             return;
         }
 
         if (game.getLobby().getMapChooseProcedure() != MapChooseProcedure.MAPVOTING) {
-            player.sendMessage(Messages.getPrefix() + "§cYou can't vote in this game");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.VOTE_CANT_VOTE));
             return;
         }
 
         if (game.getArena() != null) {
-            player.sendMessage(Messages.getPrefix() + "§cA map was already elected");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.VOTE_CHANGE_TEAM_NO_LONGER_NOW));
             return;
         }
 
         String arenaName = args[0];
         Optional<Arena> arena = Arenas.getFromName(arenaName);
         if (!game.getVotes().containsKey(arenaName) || arena.isEmpty()) {
-            player.sendMessage(Messages.getPrefix() + "§cNo map with this title was found");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_MAP));
             return;
         }
 
         game.getVotes().put(arenaName, game.getVotes().get(arenaName) + 1);
-        player.sendMessage(Messages.getMessage("vote.success").replace("%map%", arena.get().getDisplayName()));
+        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.VOTE_SUCCESS).replace("%map%", arena.get().getDisplayName()));
     }
 
     @Subcommand("change")
@@ -95,45 +95,51 @@ public class UserCommands extends BaseCommand {
         Player player = (Player) sender;
         
         if (args.length < 1) {
-            player.sendMessage(Messages.getPrefix() + "§cNumber needed.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TEAM_NUMBER_NEEDED));
             return;
         }
 
         if (args.length > 1) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
         Game game = GameManager.getInstance().getGame(player.getLocation());
         if (game == null) {
-            player.sendMessage(Messages.getMessage("not_in_arena"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
             return;
         }
-
+        
         if (game.getState() != GameState.LOBBY) {
-            player.sendMessage(Messages.getPrefix() + "§cThe game is not in the right state to change your team right now");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_CHANGE_TEAM_NOT_NOW));
             return;
         }
-
-        try {
-            MWPlayer mwPlayer = game.getPlayer(player);
-            int teamNumber = Integer.parseInt(args[0]);
-            Team to = teamNumber == 1 ? game.getTeam1() : game.getTeam2();
-            int otherCount = to.getEnemyTeam().getMembers().size() - 1;
-            int toCount = to.getMembers().size() + 1;
-            int diff = toCount - otherCount;
-            if (diff > 1) {
-                player.sendMessage(Messages.getMessage("cannot_change_difference"));
-                return;
-            }
-
-            // Remove the player from the old team and add him to the new team
-            to.addMember(mwPlayer);
-
-            player.sendMessage(Messages.getMessage("team_changed").replace("%team%", to.getFullname()));
-        } catch (NumberFormatException exception) {
-            player.sendMessage(Messages.getPrefix() + "§c/mw change <1|2>");
+        
+        if (!(args[0].equalsIgnoreCase("1") || args[0].equalsIgnoreCase("2"))) {
+            sender.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_TEAM_NUMBER));
+            return;
+        }
+        
+        MWPlayer mwPlayer = game.getPlayer(player);
+        int teamNumber = Integer.parseInt(args[0]);
+        Team to = teamNumber == 1 ? game.getTeam1() : game.getTeam2();
+        
+        // Is the same team?
+        if (to == mwPlayer.getTeam()) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_ALREADY_IN_TEAM));
+            return;
         }
+        
+        // Would the number of team members be too far apart?
+        if (to != game.getNextTeam()) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_UNFAIR_TEAM_SIZE));
+            return;
+        }
+        
+        // Remove the player from the old team and add him to the new team
+        to.addMember(mwPlayer);
+
+        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_TEAM_CHANGED).replace("%team%", to.getFullname()));
     }
 
     @Subcommand("quit|leave")
@@ -145,13 +151,13 @@ public class UserCommands extends BaseCommand {
         Player player = (Player) sender;
 
         if (args.length > 0) {
-            player.sendMessage(Messages.getPrefix() + "§cToo many arguments.");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_TO_MANY_ARGUMENTS));
             return;
         }
 
         Game game = GameManager.getInstance().getGame(player.getLocation());
         if (game == null) {
-            player.sendMessage(Messages.getMessage("not_in_arena"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_IN_GAME_AREA));
             return;
         }
 

+ 1 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/Config.java

@@ -63,6 +63,7 @@ public class Config {
 
         // re-save the config with only validated options
         SetupUtil.safeFile(FILE, cfg);
+        cfg = SetupUtil.getLoadedConfig(FILE);
     }
 
     private static void addDefaults() {

+ 127 - 75
missilewars-plugin/src/main/java/de/butzlabben/missilewars/configuration/Messages.java

@@ -20,6 +20,7 @@ package de.butzlabben.missilewars.configuration;
 
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.util.SetupUtil;
+import lombok.Getter;
 import org.bukkit.ChatColor;
 import org.bukkit.configuration.file.YamlConfiguration;
 
@@ -53,91 +54,142 @@ public class Messages {
 
         // re-save the config with only validated options
         SetupUtil.safeFile(FILE, cfg);
+        cfg = SetupUtil.getLoadedConfig(FILE);
     }
 
     private static void addDefaults() {
-
-        cfg.addDefault("prefix", "&6•&e● MissileWars &8▎  &7");
-
-        cfg.addDefault("not_in_arena", "&cYou are not in an arena right now");
-        cfg.addDefault("game_quit", "You lef this game");
-        cfg.addDefault("not_enter_arena", "&cYou may not enter this arena right now");
-
-        cfg.addDefault("game_starts_new_in", "Game starts new in &e%seconds% &7seconds");
-        cfg.addDefault("game_ends_in_minutes", "Game ends in &e%minutes% &7minutes");
-        cfg.addDefault("game_ends_in_seconds", "Game ends in &e%seconds% &7seconds");
-        cfg.addDefault("game_starts_in", "Game starts in &e%seconds% &7seconds");
-
-        cfg.addDefault("not_enough_players", "&cThere are not enough players online");
-        cfg.addDefault("teams_unequal", "&cThe teams are unequal distributed");
-        cfg.addDefault("game_starts", "&aThe game starts");
-
-        cfg.addDefault("fall_protection", "&cFall protection inactive in %seconds% seconds");
-        cfg.addDefault("fall_protection_inactive", "&cFall protection inactive");
-        cfg.addDefault("fall_protection_deactivated", "&cFall protection deactivated by sneaking");
-
-        cfg.addDefault("money", "You received &e%money% &7coins");
-        cfg.addDefault("kick_inactivity", "&cYou were inactive on MissileWars");
-
-        cfg.addDefault("game_result.title_won", "&7%team%");
-        cfg.addDefault("game_result.subtitle_won", "&6has won the game!");
-        cfg.addDefault("game_result.title_winner", "&2Your team");
-        cfg.addDefault("game_result.subtitle_winner", "&ahas won!");
-        cfg.addDefault("game_result.title_loser", "&4Your team");
-        cfg.addDefault("game_result.subtitle_loser", "&chas lost!");
-        cfg.addDefault("game_result.title_draw", "&7Draw!");
-        cfg.addDefault("game_result.subtitle_draw", "");
-
-        cfg.addDefault("spectator", "&7You are now a spectator");
-        cfg.addDefault("change_team_not_now", "&cNow you cannot change your team anymore");
-        cfg.addDefault("already_in_team", "&cYou are already in this team");
-        cfg.addDefault("cannot_change_difference", "&cYou cannot change your team");
-        cfg.addDefault("team_changed", "You are now in %team%");
-        cfg.addDefault("team_assigned", "You have been assigned to %team%");
-        cfg.addDefault("lobby_joined", "&e%player% &7joined &8(&7%players%&8/&7%max_players%&8)");
-        cfg.addDefault("not_higher", "&cYou can not go higher");
-        cfg.addDefault("invalid_missile", "&cInvalid missile");
-        cfg.addDefault("hurt_teammates", "&cYou must not hurt your teammates");
-        cfg.addDefault("died", "%player% &7died");
-        cfg.addDefault("died_explosion", "%player% &7was blown up");
-        cfg.addDefault("player_left", "%player% &7left the game");
-
-        cfg.addDefault("team_offline", "Everyone from %team% &7is offline");
-        cfg.addDefault("team_buffed", "%team% &7was buffed as one player left the team");
-        cfg.addDefault("team_nerved", "%team% &7was nerved as one player joined the team");
-
-        cfg.addDefault("restart_after_game", "&7The server will restart after this game");
-        cfg.addDefault("arena_leave", "&cYou are not allowed to leave the arena");
-        cfg.addDefault("missile_place_deny", "&cYou are not allowed to place a missile here");
-
-        cfg.addDefault("sign.0", "•● MissileWars ●•");
-        cfg.addDefault("sign.1", "%state%");
-        cfg.addDefault("sign.2", "%arena%");
-        cfg.addDefault("sign.3", "%players%/%max_players%");
-        cfg.addDefault("sign.state.lobby", "&aLobby");
-        cfg.addDefault("sign.state.ingame", "&bIngame");
-        cfg.addDefault("sign.state.ended", "&cRestarting...");
-        cfg.addDefault("sign.state.error", "&cError...");
-
-        cfg.addDefault("vote.success", "You successfully voted for the map %map%");
-        cfg.addDefault("vote.finished", "The map %map% &7was elected");
-        cfg.addDefault("vote.gui", "Vote for a map");
-
+        
+        for (MessageEnum msg : MessageEnum.values()) {
+            cfg.addDefault(msg.getPath(), msg.getDefaultMsg());
+        }
     }
 
-    public static String getMessage(String path) {
-        return getPrefix() + getNativeMessage(path);
+    public static String getMessage(boolean prefix, MessageEnum msg) {
+        if (prefix) return getPrefix() + getConfigMessage(msg);
+        return getConfigMessage(msg);
     }
 
-    public static String getNativeMessage(String path) {
-        return ChatColor.translateAlternateColorCodes('&', getRawMessage(path));
+    public static String getPrefix() {
+        return getConfigMessage(MessageEnum.PREFIX);
     }
 
-    private static String getRawMessage(String path) {
-        return cfg.getString(path, "&cError while reading from messages.yml: " + path);
+    @Getter
+    public enum MessageEnum {
+        PREFIX("prefix", "&6•&e● MissileWars &8▎ &7"),
+
+        DEBUG_RELOAD_CONFIG("debug.reload_config", "&7Reloaded configs."),
+        DEBUG_RESTART_ALL_GAMES_WARN("debug.restart_all_games_warn", "&cWarning: Restarting all games. This may take a while."),
+        DEBUG_RESTART_ALL_GAMES("debug.restart_all_games", "&7Restarted all games."),
+        DEBUG_PRINTED_DEBUG_MSG("debug.printed_debug_msg", "&7Printed debug message into the log file."),
+
+        SERVER_RESTART_AFTER_GAME("server.restart_after_game", "&7The server will restart after this game."),
+
+        COMMAND_ONLY_PLAYERS("command.only_players", "&cYou are not a player."),
+        COMMAND_TO_MANY_ARGUMENTS("command.to_many_arguments", "&cToo many arguments."),
+        COMMAND_INVALID_MISSILE("command.invalid_missile", "&cThe specified missile was not found."),
+        COMMAND_INVALID_GAME("command.invalid_game", "&cThe specified game was not found."),
+        COMMAND_INVALID_MAP("command.invalid_map", "&cThe specified map was not found."),
+        COMMAND_INVALID_TEAM_NUMBER("command.invalid_team_number", "&cThe team number is invalid. Use \"1\" or \"2\" to specify the target team."),
+        COMMAND_MISSILE_NEEDED("command.missile_needed", "&cPlease specify the missile."),
+        COMMAND_TEAM_NUMBER_NEEDED("command.team_number_needed", "&cPlease specify the team number."),
+
+        GAME_MAP_SELECTED("game.map_selected", "&7A map was selected. Use \"/mw start\" again to start the round."),
+        GAME_PLAYER_JOINED("game.player_joined", "&e%player% &7joined the game (%team%&7)."),
+        GAME_PLAYER_LEFT("game.player_left", "&e%player% &7left the game (%team%&7)."),
+        GAME_LEFT("game.left", "&7You left the running MissileWars game."),
+        GAME_NOT_IN_GAME_AREA("game.not_in_game_area", "&cYou are not in an arena right now."),
+        GAME_NOT_ENTER_ARENA("game.not_enter_arena", "&cYou may not enter this arena right now."),
+        GAME_ALREADY_STARTET("game.already_startet", "&cGame already started."),
+        GAME_CAN_NOT_STARTET("game.can_not_startet", "&cGame cannot be started."),
+
+        LOBBY_TIMER_GAME_STARTS_IN("lobby_timer.game_starts_in", "&7Game starts in &e%seconds% &7seconds."),
+
+        GAME_TIMER_GAME_ENDS_IN_MINUTES("game_timer.game_ends_in_minutes", "&7Game ends in &e%minutes% &7minutes."),
+        GAME_TIMER_GAME_ENDS_IN_SECONDS("game_timer.game_ends_in_seconds", "&7Game ends in &e%seconds% &7seconds."),
+
+        ENDGAME_TIMER_GAME_STARTS_NEW_IN("endgame_timer.game_starts_new_in", "&7Game starts new in &e%seconds% &7seconds."),
+
+        LOBBY_PLAYER_JOINED("lobby.player_joined", "&e%player% &7joined the game &8(&7%players%&8/&7%max_players%&8)"),
+        LOBBY_PLAYER_LEFT("lobby.player_left", "&e%player% &7left the game &8(&7%players%&8/&7%max_players%&8)"),
+        LOBBY_LEFT("lobby.left", "&7You left the MissileWars lobby."),
+        LOBBY_NOT_ENOUGH_PLAYERS("lobby.not_enough_players", "&cThere are not enough players online."),
+        LOBBY_TEAMS_UNEQUAL("lobby.teams_unequal", "&cThe teams are unequal distributed."),
+        LOBBY_GAME_STARTS("lobby.game_starts", "&aThe game starts."),
+
+        TEAM_CHANGE_TEAM_NOT_NOW("team.change_team_not_now", "&cThe game is not in the right state to change your team right now."),
+        TEAM_CHANGE_TEAM_NO_LONGER_NOW("team.change_team_no_longer_now", "&cNow you cannot change your team anymore."),
+        TEAM_ALREADY_IN_TEAM("team.already_in_team", "&cYou are already in this team."),
+        TEAM_UNFAIR_TEAM_SIZE("team.unfair_team_size", "&cChanging the team would make the number of team members more uneven."),
+        TEAM_TEAM_CHANGED("team.team_changed", "&7You are now in %team%&7."),
+        TEAM_TEAM_ASSIGNED("team.team_assigned", "&7You have been assigned to %team%&7."),
+        TEAM_ALL_TEAMMATES_OFFLINE("team.all_teammates_offline", "&7Everyone from %team% &7is offline."),
+        TEAM_TEAM_BUFFED("team.team_buffed", "%team% &7was buffed as one player left the team."),
+        TEAM_TEAM_NERVED("team.team_nerved", "%team% &7was nerved as one player joined the team."),
+        TEAM_HURT_TEAMMATES("team.hurt_teammates", "&cYou must not hurt your teammates."),
+
+        ARENA_SPECTATOR("arena.spectator", "&7You are now a spectator."),
+        ARENA_ARENA_LEAVE("arena.arena_leave", "&cYou are not allowed to leave the arena."),
+        ARENA_MISSILE_PLACE_DENY("arena.missile_place_deny", "&cYou are not allowed to place a missile here."),
+        ARENA_NOT_HIGHER("arena.not_higher", "&cYou can not go higher."),
+        ARENA_KICK_INACTIVITY("arena.kick_inactivity", "&cYou were inactive on MissileWars."),
+
+        DIED_NORMAL("died.normal", "&7%player% &7died."),
+        DIED_EXPLOSION("died.explosion", "&7%player% &7was blown up."),
+
+        FALL_PROTECTION_START("fall_protection.start", "&cFall protection inactive in %seconds% seconds."),
+        FALL_PROTECTION_END("fall_protection.end", "&cFall protection inactive."),
+        FALL_PROTECTION_DEACTIVATED("fall_protection.deactivated", "&cFall protection deactivated by sneaking."),
+
+        GAME_RESULT_TITLE_WON("game_result.title_won", "&7%team%"),
+        GAME_RESULT_SUBTITLE_WON("game_result.subtitle_won", "&6has won the game!"),
+        GAME_RESULT_TITLE_WINNER("game_result.title_winner", "&2Your team"),
+        GAME_RESULT_SUBTITLE_WINNER("game_result.subtitle_winner", "&ahas won!"),
+        GAME_RESULT_TITLE_LOSER("game_result.title_loser", "&4Your team"),
+        GAME_RESULT_SUBTITLE_LOSER("game_result.subtitle_loser", "&chas lost!"),
+        GAME_RESULT_TITLE_DRAW("game_result.title_draw", "&7Draw!"),
+        GAME_RESULT_SUBTITLE_DRAW("game_result.subtitle_draw", ""),
+        GAME_RESULT_MONEY("game_result.money", "&7You received &e%money% &7coins."),
+
+        VOTE_SUCCESS("vote.success", "&7You successfully voted for the map %map%."),
+        VOTE_FINISHED("vote.finished", "&7The map %map% &7was elected."),
+        VOTE_GUI("vote.gui", "Vote for a map"),
+        VOTE_CANT_VOTE("vote.cant_vote", "&cYou can not vote in this game."),
+        VOTE_CHANGE_TEAM_NOT_NOW("vote.change_team_not_now", "&cThe game is not in the right state to vote right now."),
+        VOTE_CHANGE_TEAM_NO_LONGER_NOW("vote.change_team_no_longer_now", "&cA map was already selected."),
+
+        SIGNEDIT_SIGN_CREATED("signedit.sign_created", "&7Sign was successfully created and connected."),
+        SIGNEDIT_SIGN_REMOVED("signedit.sign_removed", "&7You have successfully removed this missilewars sign."),
+        SIGNEDIT_LOBBY_NOT_FOUND("signedit.lobby_not_found", "&cCould not find lobby %input%."),
+        SIGNEDIT_SIGN_REMOVE_DESC("signedit.sign_remove_desc", "&cYou have to be sneaking in order to remove this sign."),
+
+        SIGN_0("sign.0", "•● MissileWars ●•"),
+        SIGN_1("sign.1", "%state%"),
+        SIGN_2("sign.2", "%arena%"),
+        SIGN_3("sign.3", "&7%players%&8/&7%max_players%"),
+        SIGN_STATE_LOBBY("sign.state.lobby", "&aLobby"),
+        SIGN_STATE_INGAME("sign.state.ingame", "&bIngame"),
+        SIGN_STATE_ENDED("sign.state.ended", "&cRestarting..."),
+        SIGN_STATE_ERROR("sign.state.error", "&cError..."),
+
+        STATS_NOT_ENABLED("stats.not_enabled", "&cThe Fight Stats are not enabled!"),
+        STATS_FETCHING_PLAYERS("stats.fetching_players", "Fetching not cached player names: %current_size%/%real_size%"),
+        STATS_LOADING_DATA("stats.loading_data", "Loading data..."),
+        STATS_WRONG_DATE_FORMAT("stats.wrong_date_format", "&cPlease use the date format \"dd.MM.yyyy\"."),
+        STATS_TOO_FEW_GAMES("stats.too_few_games", "&cPlease play more than 10 games to enable the Fight Stats for you.");
+
+        private final String path;
+        private final String defaultMsg;
+
+        MessageEnum(String path, String defaultMsg) {
+            this.path = path;
+            this.defaultMsg = defaultMsg;
+        }
+        
     }
 
-    public static String getPrefix() {
-        return ChatColor.translateAlternateColorCodes('&', cfg.getString("prefix"));
+    private static String getConfigMessage(MessageEnum msg) {
+        return ChatColor.translateAlternateColorCodes('&', cfg.getString(msg.getPath(), 
+                "&cError while reading from messages.yml: '" + msg.getPath() + "'"));
     }
+
 }

+ 57 - 25
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -322,7 +322,7 @@ public class Game {
             Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> teleportToArenaSpectatorSpawn(player), 2);
             Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> player.setGameMode(GameMode.SPECTATOR), 35);
 
-            player.sendMessage(Messages.getMessage("spectator"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_SPECTATOR));
             player.setDisplayName("§7" + player.getName() + "§r");
 
         } else {
@@ -332,12 +332,22 @@ public class Game {
 
             Team team = getNextTeam();
             team.addMember(mwPlayer);
-            player.sendMessage(Messages.getMessage("team_assigned").replace("%team%", team.getFullname()));
-
-            broadcast(Messages.getMessage("lobby_joined")
-                    .replace("%max_players%", Integer.toString(getLobby().getMaxSize()))
-                    .replace("%players%", Integer.toString(getPlayers().values().size()))
-                    .replace("%player%", player.getName()));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_TEAM_ASSIGNED).replace("%team%", team.getFullname()));
+            
+            String message = null;
+            if (state == GameState.LOBBY) {
+                message = Messages.getMessage(true, Messages.MessageEnum.LOBBY_PLAYER_JOINED);
+            } else if (state == GameState.INGAME) {
+                message = Messages.getMessage(true, Messages.MessageEnum.GAME_PLAYER_JOINED);
+            }
+            
+            if (message != null) {
+                broadcast(message.replace("%max_players%", Integer.toString(getLobby().getMaxSize()))
+                        .replace("%players%", Integer.toString(getPlayers().values().size()))
+                        .replace("%player%", player.getName())
+                        .replace("%team%", team.getFullname()));
+            }
+            
         }
 
         player.setScoreboard(getScoreboard());
@@ -368,27 +378,49 @@ public class Game {
     public void playerLeaveFromGame(MWPlayer mwPlayer) {
         Player player = mwPlayer.getPlayer();
         Team team = mwPlayer.getTeam();
+        boolean playerWasTeamMember = false;
 
         if (state == GameState.INGAME) {
             BukkitTask task = getPlayerTasks().get(mwPlayer.getUuid());
             if (task != null) task.cancel();
-
-            if (team != null) {
-                broadcast(Messages.getMessage("player_left")
-                        .replace("%team%", team.getFullname())
-                        .replace("%player%", player.getName()));
-            }
         }
-
+        
         PlayerDataProvider.getInstance().loadInventory(player);
 
         if (team != null) {
+            playerWasTeamMember = true;
             team.removeMember(mwPlayer);
             if (state == GameState.INGAME) checkTeamSize(team);
         }
 
-        player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
         removePlayer(mwPlayer);
+        
+        if (playerWasTeamMember) {
+
+            String message = null;
+            if (state == GameState.LOBBY) {
+                message = Messages.getMessage(true, Messages.MessageEnum.LOBBY_PLAYER_LEFT);
+            } else if (state == GameState.INGAME) {
+                message = Messages.getMessage(true, Messages.MessageEnum.GAME_PLAYER_LEFT);
+            }
+            
+            if (message != null) {
+                broadcast(message.replace("%max_players%", Integer.toString(getLobby().getMaxSize()))
+                        .replace("%players%", Integer.toString(getPlayers().values().size()))
+                        .replace("%player%", player.getName())
+                        .replace("%team%", team.getFullname()));
+            }
+
+        }
+
+        player.setScoreboard(Bukkit.getScoreboardManager().getMainScoreboard());
+
+        if (state == GameState.LOBBY) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.LOBBY_LEFT).replace("%lobby_name%", getLobby().getDisplayName()));
+        } else if (state == GameState.INGAME) {
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_LEFT).replace("%arena_name%", arena.getDisplayName()));
+        }
+        
     }
 
     /**
@@ -411,7 +443,7 @@ public class Game {
                 sendGameResult();
                 stopGame();
             });
-            broadcast(Messages.getMessage("team_offline").replace("%team%", team.getFullname()));
+            broadcast(Messages.getMessage(true, Messages.MessageEnum.TEAM_ALL_TEAMMATES_OFFLINE).replace("%team%", team.getFullname()));
         }
     }
 
@@ -627,14 +659,14 @@ public class Game {
         boolean isOnlyBetweenSpawnPlaceable = this.arena.getMissileConfiguration().isOnlyBetweenSpawnPlaceable();
         if (isOnlyBetweenSpawnPlaceable) {
             if (!isInInnerGameArea(player.getLocation())) {
-                player.sendMessage(Messages.getMessage("missile_place_deny"));
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_MISSILE_PLACE_DENY));
                 return;
             }
         }
 
         Missile missile = this.arena.getMissileConfiguration().getMissileFromName(itemStack.getItemMeta().getDisplayName());
         if (missile == null) {
-            player.sendMessage(Messages.getMessage("invalid_missile"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.COMMAND_INVALID_MISSILE));
             return;
         }
         itemStack.setAmount(itemStack.getAmount() - 1);
@@ -689,7 +721,7 @@ public class Game {
         createInnerGameArea();
 
         if (lobby.getMapChooseProcedure() == MapChooseProcedure.MAPVOTING) {
-            this.broadcast(Messages.getMessage("vote.finished").replace("%map%", this.arena.getDisplayName()));
+            this.broadcast(Messages.getMessage(true, Messages.MessageEnum.VOTE_FINISHED).replace("%map%", this.arena.getDisplayName()));
         }
         applyForAllPlayers(player -> player.getInventory().setItem(4, new ItemStack(Material.AIR)));
 
@@ -782,16 +814,16 @@ public class Game {
         String subTitle;
 
         if (team1.getGameResult() == GameResult.WIN) {
-            title = Messages.getNativeMessage("game_result.title_won").replace("%team%", team1.getName());
-            subTitle = Messages.getNativeMessage("game_result.subtitle_won");
+            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_WON).replace("%team%", team1.getName());
+            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_WON);
 
         } else if (team2.getGameResult() == GameResult.WIN) {
-            title = Messages.getNativeMessage("game_result.title_won").replace("%team%", team2.getName());
-            subTitle = Messages.getNativeMessage("game_result.subtitle_won");
+            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_WON).replace("%team%", team2.getName());
+            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_WON);
 
         } else {
-            title = Messages.getNativeMessage("game_result.title_draw");
-            subTitle = Messages.getNativeMessage("game_result.subtitle_draw");
+            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_DRAW);
+            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_DRAW);
 
         }
         

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/GameWorld.java

@@ -67,7 +67,7 @@ public class GameWorld {
         synchronized (lock) {
             Bukkit.getOnlinePlayers().forEach(p -> {
                 if (p.isDead() && p.getWorld().getName().equals(worldName)) {
-                    p.kickPlayer(Messages.getMessage("kick_inactivity"));
+                    p.kickPlayer(Messages.getMessage(true, Messages.MessageEnum.ARENA_KICK_INACTIVITY));
                 }
             });
         }

+ 8 - 8
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Team.java

@@ -187,16 +187,16 @@ public class Team {
 
         switch (gameResult) {
             case WIN:
-                title = Messages.getNativeMessage("game_result.title_winner");
-                subTitle = Messages.getNativeMessage("game_result.subtitle_winner");
+                title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_WINNER);
+                subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_WINNER);
                 break;
             case LOSE:
-                title = Messages.getNativeMessage("game_result.title_loser");
-                subTitle = Messages.getNativeMessage("game_result.subtitle_loser");
+                title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_LOSER);
+                subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_LOSER);
                 break;
             case DRAW:
-                title = Messages.getNativeMessage("game_result.title_draw");
-                subTitle = Messages.getNativeMessage("game_result.subtitle_draw");
+                title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_DRAW);
+                subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_DRAW);
                 break;
             default:
                 title = null;
@@ -231,10 +231,10 @@ public class Team {
     // TODO Add new team buffer
     public void updateIntervals(int newInterval) {
         if (newInterval < currentInterval && currentInterval != 0) {
-            getGame().broadcast(Messages.getMessage("team_buffed").replace("%team%", getFullname()));
+            getGame().broadcast(Messages.getMessage(true, Messages.MessageEnum.TEAM_TEAM_BUFFED).replace("%team%", getFullname()));
         }
         if (newInterval > currentInterval && currentInterval != 0) {
-            getGame().broadcast(Messages.getMessage("team_nerved").replace("%team%", getFullname()));
+            getGame().broadcast(Messages.getMessage(true, Messages.MessageEnum.TEAM_TEAM_NERVED).replace("%team%", getFullname()));
         }
     }
 

+ 3 - 3
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/misc/RespawnGoldBlock.java

@@ -124,7 +124,7 @@ public class RespawnGoldBlock implements Listener {
             BlockSetterProvider.getBlockDataSetter().setData(loc.getBlock(), map.get(loc).getValue());
         }
         map.clear();
-        player.sendMessage(Messages.getMessage("fall_protection_inactive"));
+        player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.FALL_PROTECTION_END));
         Bukkit.getScheduler().cancelTask(task);
         HandlerList.unregisterAll(this);
     }
@@ -136,7 +136,7 @@ public class RespawnGoldBlock implements Listener {
     private void sendFallProtectionMessage() {
         double seconds = (double) duration / 20;
         if ((seconds == Math.floor(seconds)) && !Double.isInfinite(seconds)) {
-            player.sendMessage(Messages.getMessage("fall_protection").replace("%seconds%", Integer.toString((int) seconds)));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.FALL_PROTECTION_START).replace("%seconds%", Integer.toString((int) seconds)));
         }
     }
 
@@ -151,7 +151,7 @@ public class RespawnGoldBlock implements Listener {
             map.clear();
             Bukkit.getScheduler().cancelTask(task);
             HandlerList.unregisterAll(this);
-            eventPlayer.sendMessage(Messages.getMessage("fall_protection_deactivated"));
+            eventPlayer.sendMessage(Messages.getMessage(true, Messages.MessageEnum.FALL_PROTECTION_DEACTIVATED));
         }
     }
 }

+ 9 - 7
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/signs/MWSign.java

@@ -62,9 +62,11 @@ public class MWSign {
         }
         Game game = GameManager.getInstance().getGame(getLobby());
         List<String> lines = new ArrayList<>();
-        for (int i = 0; i < 4; i++) {
-            lines.add(replace(Messages.getNativeMessage("sign." + i), game));
-        }
+        lines.add(replace(Messages.getMessage(false, Messages.MessageEnum.SIGN_0), game));
+        lines.add(replace(Messages.getMessage(false, Messages.MessageEnum.SIGN_1), game));
+        lines.add(replace(Messages.getMessage(false, Messages.MessageEnum.SIGN_2), game));
+        lines.add(replace(Messages.getMessage(false, Messages.MessageEnum.SIGN_3), game));
+        
         if (game == null) {
             Logger.WARN.log("Could not find specifed arena \"" + getLobby() + "\" for sign at: " + getLocation().toString());
         }
@@ -86,20 +88,20 @@ public class MWSign {
     }
 
     private String replace(String line, Game game) {
-        String state = Messages.getNativeMessage("sign.state.error");
+        String state = Messages.getMessage(false, Messages.MessageEnum.SIGN_STATE_ERROR);
         String name = "No game";
         if (game != null) {
             switch (game.getState()) {
                 case LOBBY:
-                    state = Messages.getNativeMessage("sign.state.lobby");
+                    state = Messages.getMessage(false, Messages.MessageEnum.SIGN_STATE_LOBBY);
                     name = game.getLobby().getDisplayName();
                     break;
                 case INGAME:
-                    state = Messages.getNativeMessage("sign.state.ingame");
+                    state = Messages.getMessage(false, Messages.MessageEnum.SIGN_STATE_INGAME);
                     name = game.getArena().getDisplayName();
                     break;
                 case END:
-                    state = Messages.getNativeMessage("sign.state.ended");
+                    state = Messages.getMessage(false, Messages.MessageEnum.SIGN_STATE_ENDED);
                     name = game.getArena().getDisplayName();
                     break;
             }

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/EndTimer.java

@@ -37,7 +37,7 @@ public class EndTimer extends Timer {
 
         switch(seconds) {
             case 15:
-                broadcast(Messages.getMessage("game_starts_new_in").replace("%seconds%", Integer.toString(seconds)));
+                broadcast(Messages.getMessage(true, Messages.MessageEnum.ENDGAME_TIMER_GAME_STARTS_NEW_IN).replace("%seconds%", Integer.toString(seconds)));
                 break;
             case 0:
                 getGame().reset();

+ 2 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/GameTimer.java

@@ -45,7 +45,7 @@ public class GameTimer extends Timer {
             case 600:
             case 300:
             case 180:
-                broadcast(Messages.getMessage("game_ends_in_minutes").replace("%minutes%", Integer.toString(seconds/60)));
+                broadcast(Messages.getMessage(true, Messages.MessageEnum.GAME_TIMER_GAME_ENDS_IN_MINUTES).replace("%minutes%", Integer.toString(seconds/60)));
                 break;
             case 60:
             case 30:
@@ -55,7 +55,7 @@ public class GameTimer extends Timer {
             case 3:
             case 2:
             case 1:
-                broadcast(Messages.getMessage("game_ends_in_seconds").replace("%seconds%", Integer.toString(seconds)));
+                broadcast(Messages.getMessage(true, Messages.MessageEnum.GAME_TIMER_GAME_ENDS_IN_SECONDS).replace("%seconds%", Integer.toString(seconds)));
                 break;
             case 0:
                 game.sendGameResult();

+ 5 - 5
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/timer/LobbyTimer.java

@@ -67,7 +67,7 @@ public class LobbyTimer extends Timer implements Runnable {
             if (size1 + size2 < getGame().getLobby().getMinSize()) {
                 seconds = startTime;
                 remaining = 90;
-                broadcast(Messages.getMessage("not_enough_players"));
+                broadcast(Messages.getMessage(true, Messages.MessageEnum.LOBBY_NOT_ENOUGH_PLAYERS));
                 return;
             }
         }
@@ -81,22 +81,22 @@ public class LobbyTimer extends Timer implements Runnable {
             case 3:
             case 2:
             case 1:
-                broadcast(Messages.getMessage("game_starts_in").replace("%seconds%", Integer.toString(seconds)));
+                broadcast(Messages.getMessage(true, Messages.MessageEnum.LOBBY_TIMER_GAME_STARTS_IN).replace("%seconds%", Integer.toString(seconds)));
                 playPling();
                 break;
             case 10:
                 checkVote();
-                broadcast(Messages.getMessage("game_starts_in").replace("%seconds%", Integer.toString(seconds)));
+                broadcast(Messages.getMessage(true, Messages.MessageEnum.LOBBY_TIMER_GAME_STARTS_IN).replace("%seconds%", Integer.toString(seconds)));
                 playPling();
                 break;
             case 0:
                 int diff = size1 - size2;
                 if (diff >= 2 || diff <= -2) {
-                    broadcast(Messages.getMessage("teams_unequal"));
+                    broadcast(Messages.getMessage(true, Messages.MessageEnum.LOBBY_TEAMS_UNEQUAL));
                     seconds = startTime;
                     return;
                 }
-                broadcast(Messages.getMessage("game_starts"));
+                broadcast(Messages.getMessage(true, Messages.MessageEnum.LOBBY_GAME_STARTS));
                 playPling();
                 getGame().startGame();
                 return;

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/inventory/VoteInventory.java

@@ -30,7 +30,7 @@ import java.util.Map;
 public class VoteInventory extends OrcInventory {
 
     public VoteInventory(List<Arena> arenas) {
-        super(Messages.getNativeMessage("vote.gui"), (int) Math.ceil(arenas.size() / 9D));
+        super(Messages.getMessage(false, Messages.MessageEnum.VOTE_GUI), (int) Math.ceil(arenas.size() / 9D));
 
         Map<Integer, int[]> map = new HashMap<>();
         map.put(1, new int[] {4});

+ 4 - 4
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/SignListener.java

@@ -80,9 +80,9 @@ public class SignListener implements Listener {
             signRepository.getSigns().add(sign);
             signRepository.saveData();
 
-            player.sendMessage(Messages.getPrefix() + "Sign was successfully created and connected");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.SIGNEDIT_SIGN_CREATED));
         } else {
-            player.sendMessage(Messages.getPrefix() + "§cCould not find lobby \"" + lobbyName + "\"");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.SIGNEDIT_LOBBY_NOT_FOUND).replace("%input%", lobbyName));
             event.setCancelled(true);
         }
     }
@@ -105,9 +105,9 @@ public class SignListener implements Listener {
             repository.getSigns().remove(sign);
             repository.saveData();
 
-            player.sendMessage(Messages.getPrefix() + "You have successfully removed this missilewars sign");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.SIGNEDIT_SIGN_REMOVED));
         } else {
-            player.sendMessage(Messages.getPrefix() + "§cYou have to be sneaking in order to remove this sign");
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.SIGNEDIT_SIGN_REMOVE_DESC));
             event.setCancelled(true);
         }
     }

+ 1 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/EndListener.java

@@ -74,7 +74,7 @@ public class EndListener extends GameBoundListener {
 
         if (getGame().isSpectatorsMax()) {
             event.setCancelled(true);
-            event.getPlayer().sendMessage(Messages.getMessage("not_enter_arena"));
+            event.getPlayer().sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_ENTER_ARENA));
             return;
         }
 

+ 6 - 6
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/GameListener.java

@@ -169,7 +169,7 @@ public class GameListener extends GameBoundListener {
 
         // same team
         if (team == getGame().getPlayer(player).getTeam()) {
-            shooter.sendMessage(Messages.getMessage("hurt_teammates"));
+            shooter.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_HURT_TEAMMATES));
             event.setCancelled(true);
         }
     }
@@ -212,9 +212,9 @@ public class GameListener extends GameBoundListener {
             EntityDamageEvent.DamageCause damageCause = player.getLastDamageCause().getCause();
 
             if (damageCause == EntityDamageEvent.DamageCause.BLOCK_EXPLOSION || damageCause == EntityDamageEvent.DamageCause.ENTITY_EXPLOSION) {
-                deathBroadcast = Messages.getNativeMessage("died_explosion").replace("%player%", player.getDisplayName());
+                deathBroadcast = Messages.getMessage(true, Messages.MessageEnum.DIED_EXPLOSION).replace("%player%", player.getDisplayName());
             } else {
-                deathBroadcast = Messages.getNativeMessage("died").replace("%player%", player.getDisplayName());
+                deathBroadcast = Messages.getMessage(true, Messages.MessageEnum.DIED_NORMAL).replace("%player%", player.getDisplayName());
             }
 
             getGame().broadcast(deathBroadcast);
@@ -254,7 +254,7 @@ public class GameListener extends GameBoundListener {
         int toY = event.getTo().getBlockY();
         if (toY > getGame().getArena().getMaxHeight()) {
             player.teleport(event.getFrom());
-            player.sendMessage(Messages.getMessage("not_higher"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_NOT_HIGHER));
         } else if (toY < getGame().getArena().getDeathHeight()) {
             player.setLastDamageCause(new EntityDamageEvent(player, EntityDamageEvent.DamageCause.FALL, 20));
             player.damage(20.0D);
@@ -265,7 +265,7 @@ public class GameListener extends GameBoundListener {
 
         if (!getGame().isInGameArea(event.getTo())) {
             if (to != null) Game.knockbackEffect(player, from, to);
-            player.sendMessage(Messages.getMessage("arena_leave"));
+            player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.ARENA_ARENA_LEAVE));
         }
     }
 
@@ -278,7 +278,7 @@ public class GameListener extends GameBoundListener {
         if ((!getGame().getLobby().isJoinOngoingGame()) || (getGame().isPlayersMax())) {
             if (getGame().isSpectatorsMax()) {
                 event.setCancelled(true);
-                event.getPlayer().sendMessage(Messages.getMessage("not_enter_arena"));
+                event.getPlayer().sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_ENTER_ARENA));
                 return;
             }
             getGame().playerJoinInGame(player, true);

+ 2 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/listener/game/LobbyListener.java

@@ -70,7 +70,7 @@ public class LobbyListener extends GameBoundListener {
 
             // too late for team change:
             if (getGame().getTimer().getSeconds() < 10) {
-                player.sendMessage(Messages.getMessage("change_team_not_now"));
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.TEAM_CHANGE_TEAM_NO_LONGER_NOW));
                 return;
             }
 
@@ -121,7 +121,7 @@ public class LobbyListener extends GameBoundListener {
 
         if (getGame().isPlayersMax()) {
             event.setCancelled(true);
-            event.getPlayer().sendMessage(Messages.getMessage("not_enter_arena"));
+            event.getPlayer().sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_NOT_ENTER_ARENA));
             return;
         }
 

+ 3 - 2
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/MoneyUtil.java

@@ -20,13 +20,14 @@ package de.butzlabben.missilewars.util;
 
 import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.configuration.Messages;
-import java.util.UUID;
 import net.milkbowl.vault.economy.Economy;
 import net.milkbowl.vault.economy.EconomyResponse;
 import org.bukkit.Bukkit;
 import org.bukkit.OfflinePlayer;
 import org.bukkit.plugin.RegisteredServiceProvider;
 
+import java.util.UUID;
+
 /**
  * @author Butzlabben
  * @since 13.08.2018
@@ -67,7 +68,7 @@ public class MoneyUtil {
             Logger.WARN.log("Message: " + r.errorMessage);
         } else {
             if (Bukkit.getPlayer(uuid) != null)
-                Bukkit.getPlayer(uuid).sendMessage(Messages.getMessage("money").replace("%money%", Integer.toString(money)));
+                Bukkit.getPlayer(uuid).sendMessage(Messages.getMessage(true, Messages.MessageEnum.GAME_RESULT_MONEY).replace("%money%", Integer.toString(money)));
         }
     }
 }

+ 3 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/stats/PlayerGuiFactory.java

@@ -72,7 +72,9 @@ public class PlayerGuiFactory {
         int currentSize = names.size();
         if (realSize > currentSize) {
             if (Config.isContactAuth()) {
-                player.sendMessage(Messages.getPrefix() + "Fetching not cached player names: " + currentSize + "/" + realSize);
+                player.sendMessage(Messages.getMessage(true, Messages.MessageEnum.STATS_FETCHING_PLAYERS)
+                        .replace("%current_size%", Integer.toString(currentSize))
+                        .replace("%real_size%", Integer.toString(realSize)));
                 ForkJoinPool.commonPool().execute(() -> {
                     List<UUID> missing = getMissingUUIDs();
                     int maxFetches = Math.min(missing.size(), MAX_FETCHES);