From e790ba6f2516125160ce3a96b61de6d7261cabaa Mon Sep 17 00:00:00 2001 From: Quackster Date: Sat, 29 Jul 2023 12:07:06 +1000 Subject: [PATCH] Make game scores on BattleBall and SnowStorm thread-safe --- .../org/alexdev/havana/game/games/Game.java | 15 +++++---- .../game/games/battleball/BattleBallTask.java | 2 ++ .../havana/game/games/player/GamePlayer.java | 22 ++++++++----- .../havana/game/games/player/GameTeam.java | 32 +++++++++++++------ .../game/games/snowstorm/SnowStormGame.java | 3 +- .../game/games/tasks/GameFinishTask.java | 8 ++--- .../havana/game/games/utils/FinishedGame.java | 2 +- .../messages/outgoing/games/GAMEEND.java | 2 +- .../messages/outgoing/games/GAMESTATUS.java | 2 +- 9 files changed, 56 insertions(+), 32 deletions(-) diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/Game.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/Game.java index 9c4a180..bba5c6c 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/Game.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/Game.java @@ -260,9 +260,11 @@ public void finishGame() { var gameHistoryData = new GameHistoryData(); var gameHistory = new GameHistory(gameHistoryData); + this.teams.values().forEach(GameTeam::calculateScore); + if (this.teams.size() > 0) { - var sortedTeamList = new ArrayList<>(this.teams.values()); - sortedTeamList.sort(Comparator.comparingInt(GameTeam::getScore).reversed()); + List sortedTeamList = new ArrayList<>(this.teams.values()); + sortedTeamList.sort(Comparator.comparingInt(GameTeam::getPoints).reversed()); var winningTeam = sortedTeamList.get(0); @@ -270,13 +272,14 @@ public void finishGame() { for (GameTeam team : sortedTeamList) { for (GamePlayer gamePlayer : team.getPlayers()) { + gamePlayer.calculateScore(); gameHistoryData.addPlayer(gamePlayer.getUserId(), gamePlayer.getScore(), gamePlayer.getTeamId()); } } gameHistory.setName(this.getName()); gameHistory.setWinningTeam(winningTeam.getId()); - gameHistory.setWinningTeamScore(winningTeam.getScore()); + gameHistory.setWinningTeamScore(winningTeam.getPoints()); gameHistory.setGameType(this.gameType); gameHistory.setMapId(this.getMapId()); @@ -769,9 +772,9 @@ public void addPlayerMove(PlayerMoveEvent event) { * Method called when the game initially began */ public void gamePrepare() { - for (GameTeam gameTeam : this.getTeams().values()) { - gameTeam.setScore(0); - } +// for (GameTeam gameTeam : this.getTeams().values()) { +// gameTeam.setScore(0); +// } for (GamePlayer gamePlayer : this.getActivePlayers()) { gamePlayer.setXp(0); diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTask.java index 163a02e..6b30f06 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTask.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/battleball/BattleBallTask.java @@ -10,6 +10,7 @@ import org.alexdev.havana.game.games.battleball.objects.PowerUpUpdateObject; import org.alexdev.havana.game.games.enums.GameState; import org.alexdev.havana.game.games.player.GamePlayer; +import org.alexdev.havana.game.games.player.GameTeam; import org.alexdev.havana.game.pathfinder.Position; import org.alexdev.havana.game.pathfinder.Rotation; import org.alexdev.havana.game.player.Player; @@ -50,6 +51,7 @@ public void run() { this.game.getObjectsQueue().drainTo(objects); this.game.getUpdateTilesQueue().drainTo(updateTiles); this.game.getFillTilesQueue().drainTo(fillTiles); + this.game.getTeams().values().forEach(GameTeam::calculateScore); for (GamePlayer gamePlayer : this.game.getActivePlayers()) { Player player = gamePlayer.getPlayer(); diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GamePlayer.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GamePlayer.java index 2d94fa0..890d1f5 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GamePlayer.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GamePlayer.java @@ -11,6 +11,8 @@ import org.alexdev.havana.game.player.Player; import org.alexdev.havana.game.games.snowstorm.util.SnowStormAttributes; +import java.util.concurrent.atomic.AtomicInteger; + public class GamePlayer { private Player player; private GameObject gameObject; @@ -27,7 +29,7 @@ public class GamePlayer { private GamePlayer harlequinPlayer; private boolean assignedSpawn; - private int score; + private AtomicInteger score; private int xp; private SnowStormAttributes snowStormAttributes; @@ -42,7 +44,7 @@ public GamePlayer(Player player) { this.enteringGame = false; this.clickedRestart = false; this.position = new Position(); - this.score = 0; + this.score = new AtomicInteger(0); this.xp = 0; this.snowStormAttributes = new SnowStormAttributes(); } @@ -53,7 +55,7 @@ public GamePlayer(Player player) { * @param score the score */ public void setScore(int score) { - this.score = score; + this.score.set(score); } /** @@ -61,13 +63,15 @@ public void setScore(int score) { * * @return the score */ - public int getScore() { + public void calculateScore() { if (!this.inGame) { - return 0; + this.score.set(0); + return; } if (this.getGame() instanceof BattleBallGame) { - this.score = 0; + this.score.set(0); + BattleBallGame battleBallGame = (BattleBallGame) this.getGame(); for (BattleBallTile battleBallTile : battleBallGame.getTiles()) { @@ -76,12 +80,14 @@ public int getScore() { continue; } - this.score += scoreReference.getScore(); + this.score.addAndGet(scoreReference.getScore()); } } } + } - return this.score; + public int getScore() { + return score.get(); } /** diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameTeam.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameTeam.java index f80e81b..df178fb 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameTeam.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/player/GameTeam.java @@ -7,19 +7,22 @@ import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; public class GameTeam { private int id; private Game game; private List playerList; - private int score; + + public AtomicInteger points; + public AtomicInteger snowstormPoints; public GameTeam(int id, Game game) { this.id = id; this.game = game; this.playerList = new CopyOnWriteArrayList<>(); - this.score = 0; + this.points = new AtomicInteger(0); } public int getId() { @@ -30,10 +33,10 @@ public List getPlayers() { return playerList; } - public int getScore() { - if (this.game instanceof BattleBallGame) { - this.score = 0; + public void calculateScore() { + this.points.set(0); + if (this.game instanceof BattleBallGame) { BattleBallGame battleBallGame = (BattleBallGame) this.game; for (BattleBallTile battleBallTile : battleBallGame.getTiles()) { @@ -42,18 +45,27 @@ public int getScore() { continue; } - this.score += scoreReference.getScore(); + this.points.addAndGet(scoreReference.getScore()); } } } - - return this.score; + else { + this.points.set(0); + + int totalScore = this.playerList.stream() + .mapToInt(player -> player.getScore()) + .sum(); + + this.points.addAndGet(totalScore); + } } - public void setScore(int score) { - this.score = score; + public int getPoints() { + return points.get(); } + + public List getActivePlayers() { return playerList.stream().filter(GamePlayer::isInGame).collect(Collectors.toList()); } diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormGame.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormGame.java index bdc300c..f14384b 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormGame.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/snowstorm/SnowStormGame.java @@ -116,7 +116,8 @@ public void finishGame() { } for (GameTeam team : this.getTeams().values()) { - team.setScore(team.getPlayers().stream().mapToInt(GamePlayer::getScore).sum()); + team.calculateScore(); + // team.setScore(team.getPlayers().stream().mapToInt(GamePlayer::getScore).sum()); } super.finishGame(); diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/tasks/GameFinishTask.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/tasks/GameFinishTask.java index 0cd0202..e92b680 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/tasks/GameFinishTask.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/tasks/GameFinishTask.java @@ -24,12 +24,12 @@ public class GameFinishTask implements Runnable { private final List players; - private final ArrayList sortedTeamList; + private final List sortedTeamList; private final GameType gameType; private final Game game; private final GameHistory gameHistory; - public GameFinishTask(Game game, GameHistory gameHistory, GameType gameType, ArrayList sortedTeamList, List players) { + public GameFinishTask(Game game, GameHistory gameHistory, GameType gameType, List sortedTeamList, List players) { this.game = game; this.gameHistory = gameHistory; this.gameType = gameType; @@ -58,8 +58,8 @@ public void run() { if (this.game.canIncreasePoints()) { if ((this.sortedTeamList.size() == 1 && this.sortedTeamList.get(0).getPlayers().size() > 1) || (this.sortedTeamList.size() > 1 - && this.sortedTeamList.get(0).getScore() > 0 - && this.sortedTeamList.get(0).getScore() != this.sortedTeamList.get(1).getScore()) && + && this.sortedTeamList.get(0).getPoints() > 0 + && this.sortedTeamList.get(0).getPoints() != this.sortedTeamList.get(1).getPoints()) && this.sortedTeamList.get(0).getPlayers().size() > 0 && this.sortedTeamList.get(1).getPlayers().size() > 0) { diff --git a/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FinishedGame.java b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FinishedGame.java index 7465c0b..494bb72 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FinishedGame.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/game/games/utils/FinishedGame.java @@ -81,7 +81,7 @@ public class FinishedGameTeam { private List> playerScores; private FinishedGameTeam(GameTeam gameTeam) { - this.score = gameTeam.getScore(); + this.score = gameTeam.getPoints(); this.playerScores = new ArrayList<>(); for (var gamePlayer : gameTeam.getPlayers()) { diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEEND.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEEND.java index 081f9aa..9a0332b 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEEND.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMEEND.java @@ -34,7 +34,7 @@ public void compose(NettyResponse response) { response.writeInt(gamePlayer.getScore()); } - response.writeInt(team.getScore()); + response.writeInt(team.getPoints()); } } } diff --git a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTATUS.java b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTATUS.java index 686a87c..7a39d86 100644 --- a/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTATUS.java +++ b/Havana-Server/src/main/java/org/alexdev/havana/messages/outgoing/games/GAMESTATUS.java @@ -83,7 +83,7 @@ public void compose(NettyResponse response) { response.writeInt(this.gameTeams.size()); for (GameTeam team : this.gameTeams) { - response.writeInt(team.getScore()); + response.writeInt(team.getPoints()); } response.writeInt(1);