From 6b2af8fa75f079e96f5cecb235d6b571454dbb7f Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Mon, 23 Sep 2024 21:42:46 -0500 Subject: [PATCH] Sealed tournament fixes - Fixed sealed tournaments swallowing deck registration during the deck registration phase - Removed the "all players have registered" short-circuit condition, so that players don't get rug-pulled if making last-minute adjustments --- .../src/main/web/js/gemp-022/hallUi.js | 2 +- .../com/gempukku/lotro/hall/HallServer.java | 21 ++++++++++++------- .../tournament/ConstructedTournament.java | 3 ++- .../lotro/tournament/SealedTournament.java | 19 +++++++++-------- .../lotro/tournament/SoloDraftTournament.java | 9 ++++++-- .../gempukku/lotro/tournament/Tournament.java | 2 +- 6 files changed, 35 insertions(+), 21 deletions(-) diff --git a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/hallUi.js b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/hallUi.js index 8a7f44af6..a6a8668e3 100644 --- a/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/hallUi.js +++ b/gemp-lotr/gemp-lotr-async/src/main/web/js/gemp-022/hallUi.js @@ -542,7 +542,7 @@ var GempLotrHallUI = Class.extend({ if (joined == "true") { that.inTournament = true; debugger; - if(type === "sealed" && (stage === "deck-building" || stage === "registering decks")) { + if(type === "sealed" && (stage === "deck-building" || stage === "registering decks" || stage === "awaiting kickoff" || stage === "paused between rounds")) { var but = $(""); $(but).button().click(( function(tourneyInfo) { diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java index a8ac3d611..ff990f61a 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/hall/HallServer.java @@ -528,19 +528,26 @@ public class HallServer extends AbstractServer { String result = ""; var tournament = _tournamentService.getTournamentById(tournamentId); if (tournament != null) { - var stage = tournament.getInfo().Stage; - if(stage == Tournament.Stage.STARTING || stage == Tournament.Stage.DECK_BUILDING || - stage == Tournament.Stage.PAUSED || stage == Tournament.Stage.AWAITING_KICKOFF) { - LotroDeck lotroDeck = validateUserAndDeck(_formatLibrary.getFormat(tournament.getFormatCode()), player, deckName, tournament.getCollectionType()); + LotroDeck lotroDeck = validateUserAndDeck(_formatLibrary.getFormat(tournament.getFormatCode()), player, deckName, tournament.getCollectionType()); + var submitted = tournament.playerSubmittedDeck(player.getName(), lotroDeck); - tournament.playerSubmittedDeck(player.getName(), lotroDeck); + if(submitted) { + result = "Registered deck '" + deckName + "' with tournament " + tournament.getTournamentName() + " successfully." + + "

If you make an update to your deck, you will need to register it here again for any changes to take effect."; + _log.trace("Player '" + player.getName() + "' registered deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "' successfully."); } - result = "Registered deck '" + deckName + "' with tournament " + tournament.getTournamentName() + " successfully." - + "

If you make an update to your deck, you will need to register it here again for any changes to take effect."; + else { + result = "Could not register deck with tournament " + tournament.getTournamentName() + "." + + "

Please contact an administrator if you think this was in error."; + + _log.trace("Player '" + player.getName() + "' failed to register deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "'."); + } + hallChanged(); } else { result = "Registration for that tournament has already closed."; + _log.trace("Player '" + player.getName() + "' attempted to register deck '" + deckName + "' for tournament '" + tournament.getTournamentName() + "' after registration closed."); } return result; diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ConstructedTournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ConstructedTournament.java index f60a5f3d2..58f519a4f 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ConstructedTournament.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/ConstructedTournament.java @@ -39,8 +39,9 @@ public class ConstructedTournament extends BaseTournament implements Tournament } @Override - public void playerSubmittedDeck(String player, LotroDeck deck) { + public boolean playerSubmittedDeck(String player, LotroDeck deck) { //Constructed has all decks submitted upon signup, so nothing to do here + return false; } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SealedTournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SealedTournament.java index 79a2cadec..0459471ea 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SealedTournament.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SealedTournament.java @@ -37,13 +37,18 @@ public class SealedTournament extends BaseTournament implements Tournament { @Override - public void playerSubmittedDeck(String player, LotroDeck deck) { + public boolean playerSubmittedDeck(String player, LotroDeck deck) { writeLock.lock(); try { - if (getTournamentStage() == Stage.DECK_BUILDING && _players.contains(player)) { + var stage = getTournamentStage(); + if ((stage == Stage.DECK_BUILDING || stage == Stage.DECK_REGISTRATION || + stage == Tournament.Stage.PAUSED || stage == Tournament.Stage.AWAITING_KICKOFF) + && _players.contains(player)) { _tournamentService.updateRecordedPlayerDeck(_tournamentId, player, deck); _playerDecks.put(player, deck); + return true; } + return false; } finally { writeLock.unlock(); } @@ -150,7 +155,7 @@ public class SealedTournament extends BaseTournament implements Tournament { + "

Remember to return to the game hall and register your deck before " + DateUtils.FormatTime(_sealedInfo.RegistrationDeadline) + ".")); } else if (getTournamentStage() == Stage.DECK_BUILDING) { - if (DateUtils.Now().isAfter(_sealedInfo.DeckbuildingDeadline) && _playerDecks.values().stream().anyMatch(x -> StringUtils.isEmpty(x.getDeckName()))) { + if (DateUtils.Now().isAfter(_sealedInfo.DeckbuildingDeadline)) { _tournamentInfo.Stage = Stage.DECK_REGISTRATION; _tournamentService.recordTournamentStage(_tournamentId, getTournamentStage()); @@ -158,16 +163,12 @@ public class SealedTournament extends BaseTournament implements Tournament { result.add(new BroadcastAction("Deck building in tournament " + getTournamentName() + " has finished. Players now have " + duration + " to finish registering their decks. Any player who has not turned in their deck by the deadline at " + DateUtils.FormatTime(_sealedInfo.RegistrationDeadline) + " will be auto-disqualified." - + "

Once all players have turned in decks or the deadline has passed, the tournament will begin.")); - } - else if (DateUtils.Now().isAfter(_sealedInfo.DeckbuildingDeadline) && _playerDecks.values().stream().noneMatch(x -> StringUtils.isEmpty(x.getDeckName()))) { - _tournamentInfo.Stage = _sealedInfo.PostRegistrationStage(); - _tournamentService.recordTournamentStage(_tournamentId, getTournamentStage()); + + "

Once the deadline has passed, the tournament will begin.")); } } if (getTournamentStage() == Stage.DECK_REGISTRATION) { - if (DateUtils.Now().isAfter(_sealedInfo.RegistrationDeadline) || _playerDecks.values().stream().noneMatch(x -> StringUtils.isEmpty(x.getDeckName()))) { + if (DateUtils.Now().isAfter(_sealedInfo.RegistrationDeadline)) { disqualifyUnregisteredPlayers(); _tournamentInfo.Stage = _sealedInfo.PostRegistrationStage(); diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SoloDraftTournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SoloDraftTournament.java index d6e5ac4c6..d3e41e3ba 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SoloDraftTournament.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/SoloDraftTournament.java @@ -35,13 +35,18 @@ public class SoloDraftTournament extends BaseTournament implements Tournament { @Override - public void playerSubmittedDeck(String player, LotroDeck deck) { + public boolean playerSubmittedDeck(String player, LotroDeck deck) { writeLock.lock(); try { - if (getTournamentStage() == Stage.DECK_BUILDING && _players.contains(player)) { + var stage = getTournamentStage(); + if ((stage == Tournament.Stage.DECK_BUILDING || stage == Tournament.Stage.DECK_REGISTRATION || + stage == Tournament.Stage.PAUSED || stage == Tournament.Stage.AWAITING_KICKOFF) + && _players.contains(player)) { _tournamentService.updateRecordedPlayerDeck(_tournamentId, player, deck); _playerDecks.put(player, deck); + return true; } + return false; } finally { writeLock.unlock(); } diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java index a0571dfdf..3e0009063 100644 --- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java +++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/Tournament.java @@ -180,7 +180,7 @@ public interface Tournament { void reportGameFinished(String winner, String loser); void playerChosenCard(String playerName, String cardId); - void playerSubmittedDeck(String player, LotroDeck deck); + boolean playerSubmittedDeck(String player, LotroDeck deck); void issuePlayerMaterial(String player); LotroDeck getPlayerDeck(String player); String dropPlayer(String player);