浏览代码

Moving game-result methods in GameResultManager.java, Adding firework

RedstoneFuture 1 年之前
父节点
当前提交
f12d27ea63

+ 4 - 42
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/Game.java

@@ -619,49 +619,11 @@ public class Game {
      * customized message.
      * customized message.
      */
      */
     public void sendGameResult() {
     public void sendGameResult() {
-
-        for (Player player : gameWorld.getWorld().getPlayers()) {
-            MWPlayer mwPlayer = getPlayer(player);
-            Team team = mwPlayer.getTeam();
-            
-            if (team.getTeamType() == TeamType.PLAYER) {
-                team.sendMoney(mwPlayer);
-                team.sendGameResultTitle(mwPlayer);
-                team.sendGameResultSound(mwPlayer);
-            } else {
-                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 (teamManager.getTeam1().getGameResult() == GameResult.WIN) {
-            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_WON)
-                    .replace("%team%", teamManager.getTeam1().getName());
-            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_WON);
-
-        } else if (teamManager.getTeam2().getGameResult() == GameResult.WIN) {
-            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_WON)
-                    .replace("%team%", teamManager.getTeam2().getName());
-            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_WON);
-
-        } else {
-            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_DRAW);
-            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_DRAW);
-
-        }
-
-        player.sendTitle(title, subTitle);
+        GameResultManager resultManager = new GameResultManager(this);
+        resultManager.executeResult();
+        
     }
     }
-
+    
     /**
     /**
      * This method updates the MissileWars signs and the scoreboard.
      * This method updates the MissileWars signs and the scoreboard.
      */
      */

+ 198 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/game/GameResultManager.java

@@ -0,0 +1,198 @@
+package de.butzlabben.missilewars.game;
+
+import de.butzlabben.missilewars.MissileWars;
+import de.butzlabben.missilewars.configuration.Messages;
+import de.butzlabben.missilewars.game.enums.GameResult;
+import de.butzlabben.missilewars.game.enums.TeamType;
+import de.butzlabben.missilewars.player.MWPlayer;
+import de.butzlabben.missilewars.util.ColorUtil;
+import de.butzlabben.missilewars.util.MoneyUtil;
+import de.butzlabben.missilewars.util.version.ColorConverter;
+import org.bukkit.Bukkit;
+import org.bukkit.Color;
+import org.bukkit.FireworkEffect;
+import org.bukkit.Sound;
+import org.bukkit.entity.Firework;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.meta.FireworkMeta;
+
+import java.util.Random;
+
+public class GameResultManager {
+    
+    private final Game game;
+    private final TeamManager teamManager;
+    
+    public GameResultManager(Game game) {
+        this.game = game;
+        this.teamManager = game.getTeamManager();
+    }
+    
+    public void executeResult() {
+        for (Player player : game.getGameWorld().getWorld().getPlayers()) {
+            MWPlayer mwPlayer = game.getPlayer(player);
+            Team team = mwPlayer.getTeam();
+            
+            if (team.getTeamType() == TeamType.PLAYER) {
+                sendMoney(mwPlayer);
+                sendGameResultTitle(mwPlayer);
+                sendGameResultSound(mwPlayer);
+            } else {
+                sendNeutralGameResultTitle(player);
+            }
+        }
+        
+        Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> spawnSetOfFireworks(20), 10);
+        Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> spawnSetOfFireworks(20), 40);
+        Bukkit.getScheduler().runTaskLater(MissileWars.getInstance(), () -> spawnSetOfFireworks(20), 70);
+        
+    }
+    
+    /**
+     * This method sends all team members the money for playing the game
+     * with a specific amount for win and lose.
+     */
+    public void sendMoney(MWPlayer mwPlayer) {
+        int money;
+
+        switch (mwPlayer.getTeam().getGameResult()) {
+            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;
+        }
+
+        MoneyUtil.giveMoney(mwPlayer.getUuid(), money);
+    }
+
+    /**
+     * This method sends all team members the title / subtitle of the
+     * game result.
+     */
+    public void sendGameResultTitle(MWPlayer mwPlayer) {
+        String title;
+        String subTitle;
+
+        switch (mwPlayer.getTeam().getGameResult()) {
+            case WIN:
+                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.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_LOSER);
+                subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_LOSER);
+                break;
+            case 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;
+                subTitle = null;
+                break;
+        }
+
+        mwPlayer.getPlayer().sendTitle(title, subTitle, 10, 140, 20);
+    }
+
+    /**
+     * This method sends all team members the end-sound of the
+     * game result.
+     */
+    public void sendGameResultSound(MWPlayer mwPlayer) {
+
+        Player player = mwPlayer.getPlayer();
+
+        switch (mwPlayer.getTeam().getGameResult()) {
+            case WIN:
+                player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 100, 3);
+                break;
+            case LOSE:
+            case DRAW:
+                player.playSound(player.getLocation(), Sound.ENTITY_WITHER_DEATH, 100, 0);
+                break;
+            default:
+                break;
+        }
+    }
+    
+    /**
+     * This method sends the players the title / subtitle of the
+     * game result there are not in a team (= spectator).
+     */
+    private void sendNeutralGameResultTitle(Player player) {
+        String title;
+        String subTitle;
+
+        if (teamManager.getTeam1().getGameResult() == GameResult.WIN) {
+            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_WON)
+                    .replace("%team%", teamManager.getTeam1().getName());
+            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_WON);
+
+        } else if (teamManager.getTeam2().getGameResult() == GameResult.WIN) {
+            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_WON)
+                    .replace("%team%", teamManager.getTeam2().getName());
+            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_WON);
+
+        } else {
+            title = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_DRAW);
+            subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_DRAW);
+
+        }
+
+        player.sendTitle(title, subTitle, 10, 140, 20);
+    }
+    
+    private void spawnSetOfFireworks(int amount) {
+        for (int i = 1; i <= amount; i++) {
+            spawnFirework();
+        }
+    }
+    
+    private void spawnFirework() {
+        Color winnerTeamColor = null;
+        
+        if (teamManager.getTeam1().getGameResult() == GameResult.WIN) {
+            winnerTeamColor = ColorConverter.getColorFromCode(teamManager.getTeam1().getColorCode());
+        
+        } else if (teamManager.getTeam2().getGameResult() == GameResult.WIN) {
+            winnerTeamColor = ColorConverter.getColorFromCode(teamManager.getTeam2().getColorCode());
+        
+        }
+        
+        Firework firework = game.getGameWorld().getWorld().spawn(game.getArena().getSpectatorSpawn(), Firework.class);
+        FireworkMeta fireworkMeta = firework.getFireworkMeta();
+        
+        fireworkMeta.clearEffects();
+
+        Random random = new Random();
+        
+        // Create the effect:
+        FireworkEffect.Builder effectBuilder = FireworkEffect.builder()
+                .flicker(true)
+                .trail(true)
+                .with(FireworkEffect.Type.BALL);
+        if (winnerTeamColor != null) {
+            effectBuilder.withColor(ColorUtil.darkenColor(winnerTeamColor, 0.1));
+            effectBuilder.withFade(ColorUtil.darkenColor(winnerTeamColor, 0.5));
+        }
+        
+        // Add the effect. (Multiple effects can be added.)
+        fireworkMeta.addEffect(effectBuilder.build());
+        fireworkMeta.setPower(random.nextInt(1, 10));
+        firework.setFireworkMeta(fireworkMeta);
+        
+        // Flight behavior:
+        firework.setShotAtAngle(false);
+        
+    }
+    
+}

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

@@ -20,13 +20,11 @@ package de.butzlabben.missilewars.game;
 
 
 import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.Logger;
 import de.butzlabben.missilewars.configuration.Config;
 import de.butzlabben.missilewars.configuration.Config;
-import de.butzlabben.missilewars.configuration.Messages;
 import de.butzlabben.missilewars.game.enums.GameResult;
 import de.butzlabben.missilewars.game.enums.GameResult;
 import de.butzlabben.missilewars.game.enums.TeamType;
 import de.butzlabben.missilewars.game.enums.TeamType;
 import de.butzlabben.missilewars.game.misc.TeamSpawnProtection;
 import de.butzlabben.missilewars.game.misc.TeamSpawnProtection;
 import de.butzlabben.missilewars.menus.MenuItem;
 import de.butzlabben.missilewars.menus.MenuItem;
 import de.butzlabben.missilewars.player.MWPlayer;
 import de.butzlabben.missilewars.player.MWPlayer;
-import de.butzlabben.missilewars.util.MoneyUtil;
 import de.butzlabben.missilewars.util.PlayerUtil;
 import de.butzlabben.missilewars.util.PlayerUtil;
 import de.butzlabben.missilewars.util.version.ColorConverter;
 import de.butzlabben.missilewars.util.version.ColorConverter;
 import lombok.Getter;
 import lombok.Getter;
@@ -36,7 +34,6 @@ import lombok.ToString;
 import org.bukkit.Color;
 import org.bukkit.Color;
 import org.bukkit.Location;
 import org.bukkit.Location;
 import org.bukkit.Material;
 import org.bukkit.Material;
-import org.bukkit.Sound;
 import org.bukkit.entity.Player;
 import org.bukkit.entity.Player;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.ItemStack;
 import org.bukkit.inventory.meta.LeatherArmorMeta;
 import org.bukkit.inventory.meta.LeatherArmorMeta;
@@ -174,82 +171,6 @@ public class Team {
     public boolean isMember(MWPlayer mwPlayer) {
     public boolean isMember(MWPlayer mwPlayer) {
         return members.contains(mwPlayer);
         return members.contains(mwPlayer);
     }
     }
-
-    /**
-     * This method sends all team members the money for playing the game
-     * with a specific amount for win and lose.
-     */
-    public void sendMoney(MWPlayer mwPlayer) {
-        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;
-        }
-
-        MoneyUtil.giveMoney(mwPlayer.getUuid(), money);
-    }
-
-    /**
-     * This method sends all team members the title / subtitle of the
-     * game result.
-     */
-    public void sendGameResultTitle(MWPlayer mwPlayer) {
-        String title;
-        String subTitle;
-
-        switch (gameResult) {
-            case WIN:
-                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.getMessage(false, Messages.MessageEnum.GAME_RESULT_TITLE_LOSER);
-                subTitle = Messages.getMessage(false, Messages.MessageEnum.GAME_RESULT_SUBTITLE_LOSER);
-                break;
-            case 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;
-                subTitle = null;
-                break;
-        }
-
-        mwPlayer.getPlayer().sendTitle(title, subTitle);
-    }
-
-    /**
-     * This method sends all team members the end-sound of the
-     * game result.
-     */
-    public void sendGameResultSound(MWPlayer mwPlayer) {
-
-        Player player = mwPlayer.getPlayer();
-
-        switch (gameResult) {
-            case WIN:
-                player.playSound(player.getLocation(), Sound.BLOCK_NOTE_BLOCK_PLING, 100, 3);
-                break;
-            case LOSE:
-            case DRAW:
-                player.playSound(player.getLocation(), Sound.ENTITY_WITHER_DEATH, 100, 0);
-                break;
-            default:
-                break;
-        }
-    }
     
     
     public void teleportToTeamSpawn(Player player) {
     public void teleportToTeamSpawn(Player player) {
         TeamSpawnProtection.regenerateSpawn(this);
         TeamSpawnProtection.regenerateSpawn(this);

+ 79 - 0
missilewars-plugin/src/main/java/de/butzlabben/missilewars/util/ColorUtil.java

@@ -0,0 +1,79 @@
+package de.butzlabben.missilewars.util;
+
+import org.bukkit.Color;
+
+public class ColorUtil {
+    
+    /**
+     * This method lightens a given org.bukkit.Color by a specified fraction.
+     *
+     * @param color the original color to be lightened
+     * @param fraction the fraction by which to lighten the color (e.g., 0.3 for 30%)
+     * @return a new Color object representing the lightened color
+     */
+    public static Color lightenColor(Color color, double fraction) {
+        int red = color.getRed();
+        int green = color.getGreen();
+        int blue = color.getBlue();
+
+        // Calculate the new lighter values for each color component
+        red = lightenColorComponent(red, fraction);
+        green = lightenColorComponent(green, fraction);
+        blue = lightenColorComponent(blue, fraction);
+
+        // Create and return the new lightened color
+        return Color.fromRGB(red, green, blue);
+    }
+
+    /**
+     * This method darkens a given org.bukkit.Color by a specified fraction.
+     *
+     * @param color the original color to be darkened
+     * @param fraction the fraction by which to darken the color (e.g., 0.3 for 30%)
+     * @return a new Color object representing the darkened color
+     */
+    public static Color darkenColor(Color color, double fraction) {
+        int red = color.getRed();
+        int green = color.getGreen();
+        int blue = color.getBlue();
+
+        // Calculate the new darker values for each color component
+        red = darkenColorComponent(red, fraction);
+        green = darkenColorComponent(green, fraction);
+        blue = darkenColorComponent(blue, fraction);
+
+        // Create and return the new darkened color
+        return Color.fromRGB(red, green, blue);
+    }
+
+    /**
+     * This method lightens a single color component (R/G/B) by a specified percentage.
+     *
+     * @param colorComponent the original value of the color component (0-255)
+     * @param fraction the fraction by which to lighten the color component (e.g., 0.3 for 30%)
+     * @return the new lightened value of the color component, ensuring it stays within the valid range (0-255)
+     */
+    private static int lightenColorComponent(int colorComponent, double fraction) {
+        // Increase the color component by the given fraction towards 255
+        int newValue = (int) (colorComponent + (255 - colorComponent) * fraction);
+
+        // Ensure the new value is within the valid range (0-255)
+        return Math.min(255, Math.max(0, newValue));
+    }
+
+    /**
+     * This method darkens a single color component (R/G/B) by a specified percentage.
+     *
+     * @param colorComponent the original value of the color component (0-255)
+     * @param fraction the fraction by which to darken the color component (e.g., 0.3 for 30%)
+     * @return the new darkened value of the color component, ensuring it stays within the valid range (0-255)
+     */
+    private static int darkenColorComponent(int colorComponent, double fraction) {
+        // Decrease the color component by the given fraction towards 0
+        int newValue = (int) (colorComponent - (colorComponent * fraction));
+
+        // Ensure the new value is within the valid range (0-255)
+        return Math.min(255, Math.max(0, newValue));
+    }
+    
+}