Explorar o código

rework game result sending, add more custom result messages

RedstoneFuture %!s(int64=3) %!d(string=hai) anos
pai
achega
643ee96527

+ 14 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/MessageConfig.java

@@ -63,20 +63,30 @@ public class MessageConfig {
         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("title_won", "%team%");
         cfg.addDefault("subtitle_won", "&7has won the game");
+        cfg.addDefault("title_winner", "You");
+        cfg.addDefault("subtitle_winner", "&7have won");
+        cfg.addDefault("title_loser", "You");
+        cfg.addDefault("subtitle_loser", "&7have lost");
+
         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");
@@ -90,12 +100,15 @@ public class MessageConfig {
         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%");
@@ -104,6 +117,7 @@ public class MessageConfig {
         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");

+ 30 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -463,4 +463,34 @@ public class Game {
         players.put(player.getUniqueId(), mwPlayer);
         return mwPlayer;
     }
+
+    public void sendGameResult(Game game) {
+
+        // Send all player of both teams her money, even of offline or online.
+        team1.sendMoney();
+        team2.sendMoney();
+
+        // Send all online players of the game world her own game result message
+        // as title / subtitle.
+        for (Player player : gameWorld.getWorld().getPlayers()) {
+            MWPlayer missileWarsPlayer = game.getPlayer(player);
+
+            if (team1.isMember(missileWarsPlayer)) {
+                team1.sendGameResultTitle(player);
+
+            } else if (team2.isMember(missileWarsPlayer)) {
+                team2.sendGameResultTitle(player);
+
+            } else {
+
+                if (team1.isWon()) {
+                    team1.sendNeutralGameResultTitle(player);
+                } else if (team2.isWon()) {
+                    team2.sendNeutralGameResultTitle(player);
+                }
+
+            }
+        }
+
+    }
 }

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

@@ -109,11 +109,11 @@ public class GameListener extends GameBoundListener {
         if (event.getChangedType() != VersionUtil.getPortal()) return;
         Game game = getGame();
         if (game.getArena().getPlane1().distance(location.toVector()) > game.getArena().getPlane2().distance(location.toVector())) {
-            game.getTeam1().win();
-            game.getTeam2().lose();
+            game.getTeam1().setWon();
+            game.sendGameResult(game);
         } else {
-            game.getTeam2().win();
-            game.getTeam1().lose();
+            game.getTeam2().setWon();
+            game.sendGameResult(game);
         }
         game.setDraw(false);
         game.stopGame();
@@ -304,8 +304,8 @@ public class GameListener extends GameBoundListener {
             if (teamSize == 0) {
                 Bukkit.getScheduler().runTask(MissileWars.getInstance(), () -> {
                     getGame().draw(false);
-                    team.lose();
-                    team.getEnemyTeam().win();
+                    team.getEnemyTeam().setWon();
+                    game.sendGameResult(game);
                     getGame().stopGame();
                 });
                 getGame().broadcast(MessageConfig.getMessage("team_offline").replace("%team%", team.getFullname()));

+ 58 - 17
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/game/Team.java

@@ -160,30 +160,71 @@ public class Team {
         return members.contains(player);
     }
 
-    public void win() {
-        int money = game.getArena().getMoney().getWin();
-        for (MWPlayer player : members) {
-            MoneyUtil.giveMoney(player.getUUID(), money);
+    /**
+     *
+     * @return true, if the team has won the game
+     */
+    public boolean isWon() {
+        return won;
+    }
+
+    /**
+     * This method make the team to the winner.
+     */
+    public void setWon() {
+        this.won = true;
+        Bukkit.getPluginManager().callEvent(new GameEndEvent(game, this));
+    }
+
+    /**
+     * This method send all team players the money for play the game
+     * with a specific amount for win and lose.
+     */
+    public void sendMoney() {
+        int money;
+
+        if (won) {
+            money = game.getArena().getMoney().getWin();
+        } else {
+            money = game.getArena().getMoney().getLoss();
         }
-        for (MWPlayer p : game.getPlayers().values()) {
-            Player player = p.getPlayer();
-            if (player != null && player.isOnline())
-                VersionUtil.sendTitle(player, MessageConfig.getNativeMessage("title_won").replace("%team%", getFullname()),
-                        MessageConfig.getNativeMessage("subtitle_won"));
+
+        for (MWPlayer missileWarsPlayer : members) {
+            MoneyUtil.giveMoney(missileWarsPlayer.getUUID(), money);
         }
-        won = true;
-        Bukkit.getPluginManager().callEvent(new GameEndEvent(game, this));
+
     }
 
-    public void lose() {
-        int money = game.getArena().getMoney().getLoss();
-        for (MWPlayer player : members) {
-            MoneyUtil.giveMoney(player.getUUID(), money);
+    /**
+     * This method send the player the title / subtitle of the
+     * game result to team members.
+     */
+    public void sendGameResultTitle(Player player) {
+        String title;
+        String subTitle;
+
+        if (won) {
+            title = MessageConfig.getNativeMessage("title_winner");
+            subTitle = MessageConfig.getNativeMessage("subtitle_winner");
+
+        } else {
+            title = MessageConfig.getNativeMessage("title_loser");
+            subTitle = MessageConfig.getNativeMessage("subtitle_loser");
         }
+
+        VersionUtil.sendTitle(player, title, subTitle);
+
     }
 
-    public boolean isWon() {
-        return won;
+    /**
+     * This method send the player the title / subtitle of the
+     * game result to players there are not in a team (=spectator).
+     */
+    public void sendNeutralGameResultTitle(Player player) {
+
+        VersionUtil.sendTitle(player, MessageConfig.getNativeMessage("title_won").replace("%team%", getFullname()),
+                MessageConfig.getNativeMessage("subtitle_won"));
+
     }
 
     public void updateIntervals(int newInterval) {