浏览代码

Merge pull request #11 from RedstoneFuture/improvement/game-end-message

Improvement/game end message
Daniel 3 年之前
父节点
当前提交
f85c0e863a

+ 19 - 3
missilewars-plugin/src/main/java/de/butzlabben/missilewars/MessageConfig.java

@@ -78,20 +78,32 @@ 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("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");
@@ -105,12 +117,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%");
@@ -119,6 +134,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");

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

@@ -31,7 +31,6 @@ import de.butzlabben.missilewars.listener.EndListener;
 import de.butzlabben.missilewars.listener.GameBoundListener;
 import de.butzlabben.missilewars.listener.GameListener;
 import de.butzlabben.missilewars.listener.LobbyListener;
-import de.butzlabben.missilewars.util.MoneyUtil;
 import de.butzlabben.missilewars.util.MotdManager;
 import de.butzlabben.missilewars.util.ScoreboardManager;
 import de.butzlabben.missilewars.util.serialization.Serializer;
@@ -40,14 +39,12 @@ import de.butzlabben.missilewars.wrapper.abstracts.Arena;
 import de.butzlabben.missilewars.wrapper.abstracts.GameWorld;
 import de.butzlabben.missilewars.wrapper.abstracts.Lobby;
 import de.butzlabben.missilewars.wrapper.abstracts.MapChooseProcedure;
-import de.butzlabben.missilewars.wrapper.event.GameEndEvent;
 import de.butzlabben.missilewars.wrapper.event.GameStartEvent;
 import de.butzlabben.missilewars.wrapper.event.PlayerArenaJoinEvent;
 import de.butzlabben.missilewars.wrapper.game.Team;
 import de.butzlabben.missilewars.wrapper.player.MWPlayer;
 import de.butzlabben.missilewars.wrapper.stats.FightStats;
 import lombok.Getter;
-import lombok.Setter;
 import lombok.ToString;
 import org.bukkit.*;
 import org.bukkit.enchantments.Enchantment;
@@ -84,7 +81,6 @@ public class Game {
     private GameState state = GameState.LOBBY;
     private Team team1;
     private Team team2;
-    @Setter private boolean draw = true;
     private boolean ready = false;
     private boolean restart = false;
     private GameWorld gameWorld;
@@ -246,48 +242,39 @@ public class Game {
         }
 
         Logger.DEBUG.log("Stopping for players");
-        int money = arena.getMoney().getDraw();
-        for (Player all : Bukkit.getOnlinePlayers()) {
-            if (!isIn(all.getLocation()))
-                continue;
-            Logger.DEBUG.log("Stopping for: " + all.getName());
+        for (Player player : gameWorld.getWorld().getPlayers()) {
 
-            all.setGameMode(GameMode.SPECTATOR);
-            all.teleport(arena.getSpectatorSpawn());
-            all.setHealth(all.getMaxHealth());
+            Logger.DEBUG.log("Stopping for: " + player.getName());
+            player.setGameMode(GameMode.SPECTATOR);
+            player.teleport(arena.getSpectatorSpawn());
+            player.setHealth(player.getMaxHealth());
 
-            VersionUtil.playDraw(all);
-            if (draw) {
-                if (getPlayer(all).getTeam() == null)
-                    continue;
-                MoneyUtil.giveMoney(all.getUniqueId(), money);
-            }
         }
 
         stopTimer();
-
         HandlerList.unregisterAll(listener);
         GameBoundListener listener = new EndListener(this);
+
         try {
             Bukkit.getPluginManager().registerEvents(listener, MissileWars.getInstance());
         } catch (Exception ignored) {
         }
+
         this.listener = listener;
 
         timer = new EndTimer(this);
         bt = Bukkit.getScheduler().runTaskTimer(MissileWars.getInstance(), timer, 5, 20);
 
         // Change MOTD
-        if (!Config.isMultipleLobbies())
+        if (!Config.isMultipleLobbies()) {
             MotdManager.getInstance().updateMOTD(this);
+        }
 
         if (getArena().isSaveStatistics()) {
             FightStats stats = new FightStats(this);
             stats.insert();
         }
 
-        if (draw) Bukkit.getPluginManager().callEvent(new GameEndEvent(this, null));
-
         Logger.DEBUG.log("Stopped completely");
     }
 
@@ -307,11 +294,25 @@ public class Game {
         restart = true;
     }
 
-    public void draw(boolean draw) {
-        this.draw = draw;
+    public void disableGameOnServerStop() {
+        sendPlayerToFallbackSpawn();
+        gameWorld.unload();
     }
 
-    public void disable() {
+    private void sendPlayerToFallbackSpawn() {
+
+        for (Player player : Bukkit.getOnlinePlayers()) {
+            if (!isIn(player.getLocation())) continue;
+
+            player.teleport(Config.getFallbackSpawn());
+
+            player.getInventory().clear();
+            player.setFoodLevel(20);
+            player.setHealth(player.getMaxHealth());
+        }
+    }
+
+    public void resetGame() {
         if (state == GameState.INGAME) stopGame();
 
         HandlerList.unregisterAll(listener);
@@ -523,4 +524,65 @@ public class Game {
         players.put(player.getUniqueId(), mwPlayer);
         return mwPlayer;
     }
+
+    /**
+     * This method manages the message output of the game result.
+     * Each player who is currently in the arena world gets a
+     * customized message.
+     */
+    public void sendGameResult() {
+
+        for (Player player : gameWorld.getWorld().getPlayers()) {
+            MWPlayer missileWarsPlayer = getPlayer(player);
+
+            // team member of team 1
+            if (team1.isMember(missileWarsPlayer)) {
+                team1.sendMoney(missileWarsPlayer);
+                team1.sendGameResultTitle(missileWarsPlayer);
+                team1.sendGameResultSound(missileWarsPlayer);
+                continue;
+            }
+
+            // team member of team 2
+            if (team2.isMember(missileWarsPlayer)) {
+                team2.sendMoney(missileWarsPlayer);
+                team2.sendGameResultTitle(missileWarsPlayer);
+                team2.sendGameResultSound(missileWarsPlayer);
+                continue;
+            }
+
+            // spectator
+            if (player.isOnline()) {
+                sendNeutralGameResultTitle(player);
+            }
+
+        }
+    }
+
+
+    /**
+     * This method sends the players the title / subtitle of the
+     * game result there are not in a team (= spectator).
+     */
+    public void sendNeutralGameResultTitle(Player player) {
+        String title;
+        String subTitle;
+
+        if (team1.getGameResult() == GameResult.WIN) {
+            title = MessageConfig.getNativeMessage("game_result.title_won").replace("%team%", team1.getName());
+            subTitle = MessageConfig.getNativeMessage("game_result.subtitle_won");
+
+        } else if (team2.getGameResult() == GameResult.WIN) {
+            title = MessageConfig.getNativeMessage("game_result.title_won").replace("%team%", team2.getName());
+            subTitle = MessageConfig.getNativeMessage("game_result.subtitle_won");
+
+        } else {
+            title = MessageConfig.getNativeMessage("game_result.title_draw");
+            subTitle = MessageConfig.getNativeMessage("game_result.subtitle_draw");
+
+        }
+
+        VersionUtil.sendTitle(player, title, subTitle);
+    }
+
 }

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

@@ -24,13 +24,14 @@ import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.util.serialization.Serializer;
 import de.butzlabben.missilewars.wrapper.abstracts.Lobby;
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
 import lombok.Getter;
 import org.bukkit.Bukkit;
 import org.bukkit.Location;
 
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+
 @Getter
 public class GameManager {
 
@@ -40,7 +41,7 @@ public class GameManager {
 
 
     public void disableAll() {
-        games.values().forEach(Game::disable);
+        games.values().forEach(Game::disableGameOnServerStop);
         games.clear();
     }
 
@@ -76,7 +77,6 @@ public class GameManager {
     }
 
     private void loadGames(File[] files) {
-        disableAll();
 
         for (File game : files) {
             if (game == null)
@@ -110,7 +110,7 @@ public class GameManager {
         Game game = getGame(name);
         if (game == null)
             return;
-        game.disable();
+        game.resetGame();
         games.remove(name);
     }
 

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

@@ -0,0 +1,30 @@
+/*
+ * This file is part of MissileWars (https://github.com/Butzlabben/missilewars).
+ * Copyright (c) 2018-2021 Daniel Nägele.
+ *
+ * MissileWars is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * MissileWars is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with MissileWars.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package de.butzlabben.missilewars.game;
+
+/**
+ * @author Butzlabben
+ * @since 01.01.2018
+ */
+public enum GameResult {
+
+    WIN,
+    LOSE,
+    DRAW
+}

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

@@ -36,7 +36,7 @@ public class EndTimer extends Timer {
     public void tick() {
 
         switch(seconds) {
-            case 20:
+            case 15:
                 broadcast(MessageConfig.getMessage("game_starts_new_in").replace("%seconds%", Integer.toString(seconds)));
                 break;
             case 0:

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

@@ -21,6 +21,7 @@ package de.butzlabben.missilewars.listener;
 import de.butzlabben.missilewars.MessageConfig;
 import de.butzlabben.missilewars.MissileWars;
 import de.butzlabben.missilewars.game.Game;
+import de.butzlabben.missilewars.game.GameResult;
 import de.butzlabben.missilewars.util.PlayerDataProvider;
 import de.butzlabben.missilewars.util.version.VersionUtil;
 import de.butzlabben.missilewars.wrapper.abstracts.arena.FallProtectionConfiguration;
@@ -90,24 +91,26 @@ public class GameListener extends GameBoundListener {
         if (!isInGameWorld(e.getLocation())) return;
 
         Game game = getGame();
+
         if (e.getEntity().getType() == EntityType.FIREBALL && !game.getArena().getFireballConfiguration().isDestroysPortal())
             e.blockList().removeIf(b -> b.getType() == VersionUtil.getPortal());
     }
 
     @EventHandler
-    public void on(BlockPhysicsEvent event) {
+    public void onBlockPhysics(BlockPhysicsEvent event) {
         Location location = event.getBlock().getLocation();
         if (!isInGameWorld(location)) return;
         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().setGameResult(GameResult.WIN);
+            game.getTeam2().setGameResult(GameResult.LOSE);
         } else {
-            game.getTeam2().win();
-            game.getTeam1().lose();
+            game.getTeam1().setGameResult(GameResult.LOSE);
+            game.getTeam2().setGameResult(GameResult.WIN);
         }
-        game.setDraw(false);
+        game.sendGameResult();
         game.stopGame();
     }
 
@@ -221,10 +224,10 @@ public class GameListener extends GameBoundListener {
     }
 
     @EventHandler
-    public void onDmg(EntityDamageByEntityEvent e) {
+    public void onDamage(EntityDamageByEntityEvent e) {
         if (!isInGameWorld(e.getEntity().getLocation())) return;
         if (!(e.getEntity() instanceof Player)) return;
-
+      
         Player p = (Player) e.getEntity();
         if (e.getDamager() instanceof Projectile) {
             Projectile pj = (Projectile) e.getDamager();
@@ -324,9 +327,9 @@ public class GameListener extends GameBoundListener {
             int teamSize = team.getMembers().size();
             if (teamSize == 0) {
                 Bukkit.getScheduler().runTask(MissileWars.getInstance(), () -> {
-                    getGame().draw(false);
-                    team.lose();
-                    team.getEnemyTeam().win();
+                    team.getEnemyTeam().setGameResult(GameResult.WIN);
+                    team.setGameResult(GameResult.LOSE);
+                    game.sendGameResult();
                     getGame().stopGame();
                 });
                 getGame().broadcast(MessageConfig.getMessage("team_offline").replace("%team%", team.getFullname()));
@@ -338,7 +341,7 @@ public class GameListener extends GameBoundListener {
 
     // TODO - Analyse, Ingame Check and Crop Cancel Analytic
     @EventHandler
-    public void onClick(InventoryClickEvent event) {
+    public void onInventoryClick(InventoryClickEvent event) {
         if (!(event.getWhoClicked() instanceof Player)) return;
         Player p = (Player) event.getWhoClicked();
         if (!isInGameWorld(p.getLocation())) return;

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

@@ -51,7 +51,7 @@ public class LobbyListener extends GameBoundListener {
     }
 
     @EventHandler
-    public void onClick(PlayerInteractEvent e) {
+    public void onInteract(PlayerInteractEvent e) {
         if (!isInLobbyArea(e.getPlayer().getLocation())) return;
 
         Player p = e.getPlayer();
@@ -137,21 +137,21 @@ public class LobbyListener extends GameBoundListener {
     }
 
     @EventHandler
-    public void on(EntityDamageEvent e) {
+    public void onDamage(EntityDamageEvent e) {
         if (isInLobbyArea(e.getEntity().getLocation())) {
             e.setCancelled(true);
         }
     }
 
     @EventHandler
-    public void on(PlayerRespawnEvent e) {
+    public void onRespawn(PlayerRespawnEvent e) {
         if (isInLobbyArea(e.getPlayer().getLocation())) {
             e.setRespawnLocation(getGame().getLobby().getSpawnPoint());
         }
     }
 
     @EventHandler
-    public void onClick(InventoryClickEvent e) {
+    public void onInventoryClick(InventoryClickEvent e) {
         if (!(e.getWhoClicked() instanceof Player)) return;
 
         Player p = (Player) e.getWhoClicked();

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

@@ -62,14 +62,14 @@ public class PlayerListener implements Listener {
     }
 
     @EventHandler
-    public void on(FoodLevelChangeEvent e) {
+    public void onFoodLevelChange(FoodLevelChangeEvent e) {
         Game game = getGame(e.getEntity().getLocation());
         if (game != null)
             e.setCancelled(true);
     }
 
     @EventHandler
-    public void on(BlockPlaceEvent e) {
+    public void onBlockPlace(BlockPlaceEvent e) {
         Game game = getGame(e.getPlayer().getLocation());
         if (game != null && e.getPlayer().getGameMode() != GameMode.CREATIVE)
             e.setBuild(false);
@@ -83,14 +83,14 @@ public class PlayerListener implements Listener {
     }
 
     @EventHandler
-    public void onDrop(PlayerPickupItemEvent e) {
+    public void onPickup(PlayerPickupItemEvent e) {
         Game game = getGame(e.getPlayer().getLocation());
         if (game != null)
             e.setCancelled(true);
     }
 
     @EventHandler
-    public void on(PlayerQuitEvent e) {
+    public void onQuit(PlayerQuitEvent e) {
         Player p = e.getPlayer();
 
         Game game = getGame(p.getLocation());
@@ -104,7 +104,7 @@ public class PlayerListener implements Listener {
     }
 
     @EventHandler
-    public void on(PlayerJoinEvent event) {
+    public void onJoin(PlayerJoinEvent event) {
         Player p = event.getPlayer();
 
         Game game = getGame(p.getLocation());
@@ -225,7 +225,7 @@ public class PlayerListener implements Listener {
 
     // Internal stuff
     @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
-    public void on(PrePlayerArenaJoinEvent event) {
+    public void onPreJoin(PrePlayerArenaJoinEvent event) {
         Logger.DEBUG.log("PrePlayerArenaJoinEvent: " + event.getPlayer().getName());
         Bukkit.getScheduler().runTask(MissileWars.getInstance(), () -> Bukkit.getPluginManager().callEvent(new PlayerArenaJoinEvent(event.getPlayer(), event.getGame())));
     }

+ 7 - 1
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/ScoreboardManager.java

@@ -20,6 +20,7 @@ package de.butzlabben.missilewars.util;
 
 import de.butzlabben.missilewars.Config;
 import de.butzlabben.missilewars.game.Game;
+import de.butzlabben.missilewars.game.GameState;
 import de.butzlabben.missilewars.wrapper.abstracts.Arena;
 import de.butzlabben.missilewars.wrapper.game.Team;
 import de.butzlabben.missilewars.wrapper.player.MWPlayer;
@@ -227,7 +228,12 @@ public class ScoreboardManager {
      */
     private String replaceScoreboardPlaceholders(String text) {
 
-        String time = Integer.toString(game.getTimer().getSeconds() / 60);
+        String time;
+        if (game.getState() == GameState.LOBBY) {
+            time = Integer.toString(game.getArena().getGameDuration());
+        } else {
+            time = Integer.toString(game.getTimer().getSeconds() / 60);
+        }
 
 
         text = ChatColor.translateAlternateColorCodes('&', text);

+ 1 - 5
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/event/GameEndEvent.java

@@ -19,8 +19,6 @@
 package de.butzlabben.missilewars.wrapper.event;
 
 import de.butzlabben.missilewars.game.Game;
-import de.butzlabben.missilewars.wrapper.game.Team;
-import java.util.Optional;
 import lombok.Getter;
 import org.bukkit.event.HandlerList;
 
@@ -28,11 +26,9 @@ import org.bukkit.event.HandlerList;
 public class GameEndEvent extends GameEvent {
 
     public final static HandlerList handlers = new HandlerList();
-    private final Optional<Team> winningTeam;
 
-    public GameEndEvent(Game game, Team winningTeam) {
+    public GameEndEvent(Game game) {
         super(game);
-        this.winningTeam = Optional.ofNullable(winningTeam);
     }
 
     public static HandlerList getHandlerList() {

+ 70 - 21
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/game/Team.java

@@ -21,10 +21,10 @@ package de.butzlabben.missilewars.wrapper.game;
 import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.MessageConfig;
 import de.butzlabben.missilewars.game.Game;
+import de.butzlabben.missilewars.game.GameResult;
 import de.butzlabben.missilewars.util.MoneyUtil;
 import de.butzlabben.missilewars.util.version.ColorConverter;
 import de.butzlabben.missilewars.util.version.VersionUtil;
-import de.butzlabben.missilewars.wrapper.event.GameEndEvent;
 import de.butzlabben.missilewars.wrapper.player.MWPlayer;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
@@ -55,8 +55,7 @@ public class Team {
     private final Game game;
     private final transient ArrayList<MWPlayer> members = new ArrayList<>();
     @Setter private Location spawn;
-    private transient boolean won;
-    private transient org.bukkit.scoreboard.Team scoreboardTeam;
+    @Setter private transient GameResult gameResult = GameResult.DRAW;
     private transient int currentInterval = 0;
     ItemStack[] teamArmor;
 
@@ -160,32 +159,81 @@ 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);
-        }
-        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"));
+    /**
+     * This method sends all team members the money for playing the game
+     * with a specific amount for win and lose.
+     */
+    public void sendMoney(MWPlayer missileWarsPlayer) {
+        int money;
+
+        switch (gameResult) {
+            case WIN:
+                money = game.getArena().getMoney().getWin();
+                break;
+            case LOSE:
+                money = game.getArena().getMoney().getLoss();
+                break;
+            case DRAW:
+                money = game.getArena().getMoney().getDraw();
+                break;
+            default:
+                money = 0;
+                break;
         }
-        won = true;
-        Bukkit.getPluginManager().callEvent(new GameEndEvent(game, this));
+
+        MoneyUtil.giveMoney(missileWarsPlayer.getUUID(), money);
     }
 
-    public void lose() {
-        int money = game.getArena().getMoney().getLoss();
-        for (MWPlayer player : members) {
-            MoneyUtil.giveMoney(player.getUUID(), money);
+    /**
+     * This method sends all team members the title / subtitle of the
+     * game result.
+     */
+    public void sendGameResultTitle(MWPlayer missileWarsPlayer) {
+        String title;
+        String subTitle;
+
+        switch (gameResult) {
+            case WIN:
+                title = MessageConfig.getNativeMessage("game_result.title_winner");
+                subTitle = MessageConfig.getNativeMessage("game_result.subtitle_winner");
+                break;
+            case LOSE:
+                title = MessageConfig.getNativeMessage("game_result.title_loser");
+                subTitle = MessageConfig.getNativeMessage("game_result.subtitle_loser");
+                break;
+            case DRAW:
+                title = MessageConfig.getNativeMessage("game_result.title_draw");
+                subTitle = MessageConfig.getNativeMessage("game_result.subtitle_draw");
+                break;
+            default:
+                title = null;
+                subTitle = null;
+                break;
         }
+
+        VersionUtil.sendTitle(missileWarsPlayer.getPlayer(), title, subTitle);
     }
 
-    public boolean isWon() {
-        return won;
+    /**
+     * This method sends all team members the end-sound of the
+     * game result.
+     */
+    public void sendGameResultSound(MWPlayer missileWarsPlayer) {
+
+        switch (gameResult) {
+            case WIN:
+                VersionUtil.playPling(missileWarsPlayer.getPlayer());
+                break;
+            case LOSE:
+            case DRAW:
+                VersionUtil.playDraw(missileWarsPlayer.getPlayer());
+                break;
+            default:
+                break;
+        }
     }
 
+
     public void updateIntervals(int newInterval) {
         if (newInterval < currentInterval && currentInterval != 0) {
             getGame().broadcast(MessageConfig.getMessage("team_buffed").replace("%team%", getFullname()));
@@ -198,4 +246,5 @@ public class Team {
         }
         currentInterval = newInterval;
     }
+
 }

+ 18 - 7
missilewars-plugin/src/main/java/de/butzlabben/missilewars/wrapper/stats/FightStats.java

@@ -20,13 +20,15 @@ package de.butzlabben.missilewars.wrapper.stats;
 
 import de.butzlabben.missilewars.Config;
 import de.butzlabben.missilewars.game.Game;
+import de.butzlabben.missilewars.game.GameResult;
 import de.butzlabben.missilewars.util.ConnectionHolder;
 import de.butzlabben.missilewars.wrapper.player.MWPlayer;
+import lombok.RequiredArgsConstructor;
+
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.Collection;
-import lombok.RequiredArgsConstructor;
 
 @RequiredArgsConstructor
 public class FightStats {
@@ -43,16 +45,25 @@ public class FightStats {
         arenaName = game.getArena().getName();
         timeStart = game.getTimestart();
         timeElapsed = System.currentTimeMillis() - timeStart;
-        if (game.getTeam1().isWon())
-            teamWon = 1;
-        else if (game.getTeam2().isWon())
-            teamWon = 2;
-        else
-            teamWon = 0;
+        teamWon = getGameResultCode();
         players = game.getPlayers().values();
     }
 
 
+    /**
+     * This method returns the game result code for the database.
+     */
+    private int getGameResultCode() {
+
+        if (game.getTeam1().getGameResult() == GameResult.WIN) {
+            return 1;
+        } else if (game.getTeam2().getGameResult() == GameResult.WIN) {
+            return 2;
+        }
+
+        return 0;
+    }
+
     public static void checkTables() {
         if (!Config.isFightStatsEnabled())
             return;