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 f3354efb3..63c660502 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
@@ -555,10 +555,11 @@ public class HallServer extends AbstractServer {
if (tournament.getInfo().Parameters().requiresDeck) {
lotroDeck = validateUserAndDeck(_formatLibrary.getFormat(tournament.getFormatCode()), player, deckName, tournament.getCollectionType());
}
-
- _tournamentService.recordTournamentPlayer(tournamentId, player.getName(), lotroDeck);
- tournament.issuePlayerMaterial(player.getName());
- result = "Joined tournament " + tournament.getTournamentName() + " successfully.";
+ if (_tournamentService.joinTournamentLate(tournamentId, player.getName(), lotroDeck)) {
+ result = "Joined tournament " + tournament.getTournamentName() + " successfully.";
+ } else {
+ result = "Joining tournament " + tournament.getTournamentName() + " failed.";
+ }
hallChanged();
}
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java
index e7d84faa6..e2fa9de02 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/BaseTournament.java
@@ -536,4 +536,26 @@ public abstract class BaseTournament implements Tournament {
public String getTableDescription() {
return null;
}
+
+ @Override
+ public boolean join(String playerName, LotroDeck lotroDeck) {
+ // Assumes the deck is validated for the tournament or null if the tournament is limited
+ writeLock.lock();
+ try {
+ if (!isJoinable()) {
+ return false;
+ }
+
+ if (_players.contains(playerName)) {
+ return false;
+ }
+ _tournamentService.recordTournamentPlayer(_tournamentId, playerName, lotroDeck);
+ issuePlayerMaterial(playerName);
+ _players.add(playerName);
+ regeneratePlayerList();
+ return true;
+ } 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 863188b82..fef2956bd 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
@@ -206,6 +206,7 @@ public interface Tournament {
TournamentInfo getInfo();
boolean isJoinable();
+ boolean join(String playerName, LotroDeck lotroDeck);
long getSecondsRemaining() throws IllegalStateException;
String getTableDescription();
}
diff --git a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
index 31c0e83da..8f0104e59 100644
--- a/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
+++ b/gemp-lotr/gemp-lotr-server/src/main/java/com/gempukku/lotro/tournament/TournamentService.java
@@ -332,6 +332,15 @@ public class TournamentService {
_tournamentPlayerDao.addPlayer(tournamentId, playerName, deck);
}
+ public boolean joinTournamentLate(String tournamentId, String playerName, LotroDeck deck) {
+ // Assumes the deck is validated for the tournament or null if the tournament is limited
+ Tournament tournament = getTournamentById(tournamentId);
+ if (tournament == null) {
+ return false;
+ }
+ return tournament.join(playerName, deck);
+ }
+
public void recordPlayerTournamentAbandon(String tournamentId, String playerName) {
_tournamentPlayerDao.dropPlayer(tournamentId, playerName);
}