mirror of
https://github.com/magefree/mage.git
synced 2025-12-20 02:30:08 -08:00
server, refactor: added client side info about current table and parent table (tourney's sub-tables with matches);
This commit is contained in:
parent
bd7aaa34ee
commit
7916af0e52
21 changed files with 315 additions and 161 deletions
|
|
@ -37,7 +37,7 @@ import java.util.concurrent.ScheduledFuture;
|
|||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* @author BetaSteward_at_googlemail.com
|
||||
* @author BetaSteward_at_googlemail.com, JayDi85
|
||||
*/
|
||||
public class TableController {
|
||||
|
||||
|
|
@ -204,7 +204,7 @@ public class TableController {
|
|||
if (seat.getPlayer().isHuman()) {
|
||||
seat.getPlayer().setUserData(user.getUserData());
|
||||
user.addTable(player.getId(), table);
|
||||
user.ccJoinedTable(table.getRoomId(), table.getId(), true);
|
||||
user.ccJoinedTable(table.getRoomId(), table.getId(), table.getParentTableId(), true);
|
||||
userPlayerMap.put(userId, player.getId());
|
||||
}
|
||||
|
||||
|
|
@ -394,7 +394,7 @@ public class TableController {
|
|||
if (!table.isTournamentSubTable()) {
|
||||
user.addTable(player.getId(), table);
|
||||
}
|
||||
user.ccJoinedTable(table.getRoomId(), table.getId(), false);
|
||||
user.ccJoinedTable(table.getRoomId(), table.getId(), table.getParentTableId(), false);
|
||||
userPlayerMap.put(userId, player.getId());
|
||||
}
|
||||
|
||||
|
|
@ -524,7 +524,7 @@ public class TableController {
|
|||
|
||||
public boolean watchTable(UUID userId) {
|
||||
if (table.isTournament()) {
|
||||
managerFactory.userManager().getUser(userId).ifPresent(user -> user.ccShowTournament(table.getTournament().getId()));
|
||||
managerFactory.userManager().getUser(userId).ifPresent(user -> user.ccShowTournament(table.getId(), table.getTournament().getId()));
|
||||
return true;
|
||||
} else {
|
||||
if (table.isTournamentSubTable() && !table.getTournament().getOptions().isWatchingAllowed()) {
|
||||
|
|
@ -541,7 +541,7 @@ public class TableController {
|
|||
if (!_user.isPresent()) {
|
||||
return false;
|
||||
}
|
||||
return _user.get().ccWatchGame(match.getGame().getId());
|
||||
return _user.get().ccWatchGame(table.getId(), table.getParentTableId(), match.getGame().getId());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -685,7 +685,7 @@ public class TableController {
|
|||
Optional<User> _user = managerFactory.userManager().getUser(entry.getKey());
|
||||
if (_user.isPresent()) {
|
||||
User user = _user.get();
|
||||
user.ccGameStarted(match.getGame().getId(), entry.getValue());
|
||||
user.ccGameStarted(table.getId(), table.getParentTableId(), match.getGame().getId(), entry.getValue());
|
||||
|
||||
if (creator == null) {
|
||||
creator = user.getName();
|
||||
|
|
@ -744,7 +744,7 @@ public class TableController {
|
|||
for (Entry<UUID, UUID> entry : userPlayerMap.entrySet()) {
|
||||
managerFactory.userManager().getUser(entry.getKey()).ifPresent(user -> {
|
||||
logger.info(new StringBuilder("User ").append(user.getName()).append(" tournament started: ").append(tournament.getId()).append(" userId: ").append(user.getId()));
|
||||
user.ccTournamentStarted(tournament.getId(), entry.getValue());
|
||||
user.ccTournamentStarted(table.getId(), tournament.getId(), entry.getValue());
|
||||
});
|
||||
}
|
||||
ServerMessagesUtil.instance.incTournamentsStarted();
|
||||
|
|
@ -757,13 +757,13 @@ public class TableController {
|
|||
}
|
||||
|
||||
public void startDraft(Draft draft) {
|
||||
table.initDraft();
|
||||
table.initDraft(draft);
|
||||
managerFactory.draftManager().createDraftSession(draft, userPlayerMap, table.getId());
|
||||
for (Entry<UUID, UUID> entry : userPlayerMap.entrySet()) {
|
||||
Optional<User> user = managerFactory.userManager().getUser(entry.getKey());
|
||||
if (user.isPresent()) {
|
||||
logger.info(new StringBuilder("User ").append(user.get().getName()).append(" draft started: ").append(draft.getId()).append(" userId: ").append(user.get().getId()));
|
||||
user.get().ccDraftStarted(draft.getId(), entry.getValue());
|
||||
user.get().ccDraftStarted(table.getId(), draft.getId(), entry.getValue());
|
||||
} else {
|
||||
logger.fatal(new StringBuilder("Start draft user not found userId: ").append(entry.getKey()));
|
||||
}
|
||||
|
|
@ -776,7 +776,7 @@ public class TableController {
|
|||
if (entry.getValue().equals(playerId)) {
|
||||
Optional<User> user = managerFactory.userManager().getUser(entry.getKey());
|
||||
int remaining = (int) futureTimeout.getDelay(TimeUnit.SECONDS);
|
||||
user.ifPresent(user1 -> user1.ccSideboard(deck, table.getId(), remaining, options.isLimited()));
|
||||
user.ifPresent(user1 -> user1.ccSideboard(deck, table.getId(), table.getParentTableId(), remaining, options.isLimited()));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import mage.interfaces.callback.ClientCallback;
|
|||
import mage.interfaces.callback.ClientCallbackMethod;
|
||||
import mage.players.net.UserData;
|
||||
import mage.server.draft.DraftSession;
|
||||
import mage.server.game.GameController;
|
||||
import mage.server.game.GameSessionPlayer;
|
||||
import mage.server.managers.ManagerFactory;
|
||||
import mage.server.rating.GlickoRating;
|
||||
|
|
@ -262,41 +263,77 @@ public class User {
|
|||
}
|
||||
}
|
||||
|
||||
public void ccJoinedTable(final UUID roomId, final UUID tableId, boolean isTournament) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.JOINED_TABLE, tableId, new TableClientMessage(roomId, tableId, isTournament)));
|
||||
public void ccJoinedTable(final UUID roomId, final UUID currentTableId, final UUID parentTableId, boolean isTournament) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.JOINED_TABLE,
|
||||
currentTableId,
|
||||
new TableClientMessage().withRoom(roomId).withTable(currentTableId, parentTableId).withFlag(isTournament)
|
||||
));
|
||||
}
|
||||
|
||||
public void ccGameStarted(final UUID gameId, final UUID playerId) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.START_GAME, gameId, new TableClientMessage(gameId, playerId)));
|
||||
public void ccGameStarted(final UUID currentTableId, final UUID parentTableId, final UUID gameId, final UUID playerId) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.START_GAME,
|
||||
gameId,
|
||||
new TableClientMessage().withTable(currentTableId, parentTableId).withGame(gameId).withPlayer(playerId)
|
||||
));
|
||||
}
|
||||
|
||||
public void ccDraftStarted(final UUID draftId, final UUID playerId) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.START_DRAFT, draftId, new TableClientMessage(draftId, playerId)));
|
||||
public void ccDraftStarted(final UUID tableId, final UUID draftId, final UUID playerId) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.START_DRAFT,
|
||||
draftId,
|
||||
new TableClientMessage().withTable(tableId, null).withPlayer(playerId)
|
||||
));
|
||||
}
|
||||
|
||||
public void ccTournamentStarted(final UUID tournamentId, final UUID playerId) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.START_TOURNAMENT, tournamentId, new TableClientMessage(tournamentId, playerId)));
|
||||
public void ccTournamentStarted(final UUID tableID, final UUID tournamentId, final UUID playerId) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.START_TOURNAMENT,
|
||||
tournamentId,
|
||||
new TableClientMessage().withTable(tableID, null).withPlayer(playerId)
|
||||
));
|
||||
}
|
||||
|
||||
public void ccSideboard(final Deck deck, final UUID tableId, final int time, boolean limited) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.SIDEBOARD, tableId, new TableClientMessage(deck, tableId, time, limited)));
|
||||
sideboarding.put(tableId, deck);
|
||||
public void ccSideboard(final Deck deck, final UUID currentTableId, final UUID parentTableId, final int time, boolean limited) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.SIDEBOARD,
|
||||
currentTableId,
|
||||
new TableClientMessage().withDeck(deck).withTable(currentTableId, parentTableId).withTime(time).withFlag(limited)
|
||||
));
|
||||
sideboarding.put(currentTableId, deck);
|
||||
}
|
||||
|
||||
public void ccViewLimitedDeck(final Deck deck, final UUID tableId, final int time, boolean limited) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.VIEW_LIMITED_DECK, tableId, new TableClientMessage(deck, tableId, time, limited)));
|
||||
public void ccViewLimitedDeck(final Deck deck, final UUID currentTableId, final UUID parentTableId, final int time, boolean limited) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.VIEW_LIMITED_DECK,
|
||||
currentTableId,
|
||||
new TableClientMessage().withDeck(deck).withTable(currentTableId, parentTableId).withTime(time).withFlag(limited)
|
||||
));
|
||||
}
|
||||
|
||||
public void ccViewSideboard(final UUID tableId, final UUID gameId, final UUID targetPlayerId) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.VIEW_SIDEBOARD, tableId, new TableClientMessage(gameId, targetPlayerId)));
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.VIEW_SIDEBOARD,
|
||||
tableId,
|
||||
new TableClientMessage().withGame(gameId).withPlayer(targetPlayerId)
|
||||
));
|
||||
}
|
||||
|
||||
public void ccConstruct(final Deck deck, final UUID tableId, final int time) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.CONSTRUCT, tableId, new TableClientMessage(deck, tableId, time)));
|
||||
public void ccConstruct(final Deck deck, final UUID currentTableId, final UUID parentTableId, final int time) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.CONSTRUCT,
|
||||
currentTableId,
|
||||
new TableClientMessage().withDeck(deck).withTable(currentTableId, parentTableId).withTime(time)
|
||||
));
|
||||
}
|
||||
|
||||
public void ccShowTournament(final UUID tournamentId) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.SHOW_TOURNAMENT, tournamentId));
|
||||
public void ccShowTournament(final UUID tableId, final UUID tournamentId) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.SHOW_TOURNAMENT,
|
||||
tournamentId,
|
||||
new TableClientMessage().withTable(tableId, null)
|
||||
));
|
||||
}
|
||||
|
||||
public void showUserMessage(final String title, String message) {
|
||||
|
|
@ -306,8 +343,12 @@ public class User {
|
|||
fireCallback(new ClientCallback(ClientCallbackMethod.SHOW_USERMESSAGE, null, messageData));
|
||||
}
|
||||
|
||||
public boolean ccWatchGame(final UUID gameId) {
|
||||
fireCallback(new ClientCallback(ClientCallbackMethod.WATCHGAME, gameId));
|
||||
public boolean ccWatchGame(final UUID currentTableId, final UUID parentTableId, final UUID gameId) {
|
||||
fireCallback(new ClientCallback(
|
||||
ClientCallbackMethod.WATCHGAME,
|
||||
gameId,
|
||||
new TableClientMessage().withTable(currentTableId, parentTableId)
|
||||
));
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
@ -367,7 +408,7 @@ public class User {
|
|||
|
||||
// active tables
|
||||
for (Entry<UUID, Table> entry : tables.entrySet()) {
|
||||
ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().isTournament());
|
||||
ccJoinedTable(entry.getValue().getRoomId(), entry.getValue().getId(), entry.getValue().getParentTableId(), entry.getValue().isTournament());
|
||||
}
|
||||
|
||||
// active tourneys
|
||||
|
|
@ -375,7 +416,7 @@ public class User {
|
|||
Entry<UUID, UUID> next = iterator.next();
|
||||
Optional<TournamentController> tournamentController = managerFactory.tournamentManager().getTournamentController(next.getValue());
|
||||
if (tournamentController.isPresent()) {
|
||||
ccTournamentStarted(next.getValue(), next.getKey());
|
||||
ccTournamentStarted(tournamentController.get().getTableId(), next.getValue(), next.getKey());
|
||||
tournamentController.get().rejoin(next.getKey());
|
||||
} else {
|
||||
iterator.remove(); // tournament has ended meanwhile
|
||||
|
|
@ -384,14 +425,20 @@ public class User {
|
|||
|
||||
// active games
|
||||
for (Entry<UUID, GameSessionPlayer> entry : gameSessions.entrySet()) {
|
||||
ccGameStarted(entry.getValue().getGameId(), entry.getKey());
|
||||
entry.getValue().init();
|
||||
managerFactory.gameManager().sendPlayerString(entry.getValue().getGameId(), userId, "");
|
||||
GameController gameController = managerFactory.gameManager().getGameController().getOrDefault(entry.getValue().getGameId(), null);
|
||||
if (gameController != null) {
|
||||
Table table = managerFactory.tableManager().getTable(gameController.getTableId());
|
||||
if (table != null) {
|
||||
ccGameStarted(table.getId(), table.getParentTableId(), entry.getValue().getGameId(), entry.getKey());
|
||||
entry.getValue().init();
|
||||
managerFactory.gameManager().sendPlayerString(entry.getValue().getGameId(), userId, "");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// active drafts
|
||||
for (Entry<UUID, DraftSession> entry : draftSessions.entrySet()) {
|
||||
ccDraftStarted(entry.getValue().getDraftId(), entry.getKey());
|
||||
ccDraftStarted(entry.getValue().getDraft().getTableId(), entry.getValue().getDraft().getId(), entry.getKey());
|
||||
entry.getValue().init();
|
||||
entry.getValue().update();
|
||||
}
|
||||
|
|
@ -403,9 +450,9 @@ public class User {
|
|||
|
||||
// active sideboarding
|
||||
for (Entry<UUID, Deck> entry : sideboarding.entrySet()) {
|
||||
Optional<TableController> controller = managerFactory.tableManager().getController(entry.getKey());
|
||||
if (controller.isPresent()) {
|
||||
ccSideboard(entry.getValue(), entry.getKey(), controller.get().getRemainingTime(), controller.get().getOptions().isLimited());
|
||||
TableController controller = managerFactory.tableManager().getController(entry.getKey()).orElse(null);
|
||||
if (controller != null) {
|
||||
ccSideboard(entry.getValue(), controller.getTable().getId(), controller.getTable().getParentTableId(), controller.getRemainingTime(), controller.getOptions().isLimited());
|
||||
} else {
|
||||
// Table is missing after connection was lost during sideboard.
|
||||
// Means other players were removed or conceded the game?
|
||||
|
|
|
|||
|
|
@ -156,8 +156,8 @@ public class DraftSession {
|
|||
return new DraftPickView(draft.getPlayer(playerId), timeout);
|
||||
}
|
||||
|
||||
public UUID getDraftId() {
|
||||
return draft.getId();
|
||||
public Draft getDraft() {
|
||||
return draft;
|
||||
}
|
||||
|
||||
public UUID getMarkedCard() {
|
||||
|
|
|
|||
|
|
@ -378,9 +378,14 @@ public class GameController implements GameCallback {
|
|||
if (session != null) {
|
||||
problemPlayerFixes = "re-send start game event";
|
||||
logger.warn("Send forced game start event for player " + player.getName() + " in gameId: " + game.getId());
|
||||
user.ccGameStarted(session.getGameId(), player.getId());
|
||||
session.init();
|
||||
managerFactory.gameManager().sendPlayerString(session.getGameId(), user.getId(), "");
|
||||
Table table = managerFactory.tableManager().getTable(this.tableId);
|
||||
if (table != null) {
|
||||
user.ccGameStarted(table.getId(), table.getParentTableId(), session.getGameId(), player.getId());
|
||||
session.init();
|
||||
managerFactory.gameManager().sendPlayerString(session.getGameId(), user.getId(), "");
|
||||
} else {
|
||||
logger.error("Can't find table on fix and re-send start game event: " + this.tableId);
|
||||
}
|
||||
} else {
|
||||
throw new IllegalStateException("Wrong code usage: session can't be null cause it created in forced joinGame already");
|
||||
//player.leave();
|
||||
|
|
@ -735,9 +740,9 @@ public class GameController implements GameCallback {
|
|||
|
||||
if (isSideboardOnly) {
|
||||
// sideboard data already sent in PlayerView, so no need to re-sent it TODO: re-sent deck instead?
|
||||
user.ccViewSideboard(tableId, game.getId(), targetPlayerId);
|
||||
user.ccViewSideboard(table.getId(), game.getId(), targetPlayerId);
|
||||
} else {
|
||||
user.ccViewLimitedDeck(deckSource.getDeckForViewer(), tableId, requestsOpen, true);
|
||||
user.ccViewLimitedDeck(deckSource.getDeckForViewer(), table.getId(), table.getParentTableId(), requestsOpen, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1410,4 +1415,8 @@ public class GameController implements GameCallback {
|
|||
|
||||
return fixedAlready;
|
||||
}
|
||||
|
||||
public UUID getTableId() {
|
||||
return tableId;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -224,7 +224,7 @@ public class TournamentController {
|
|||
try {
|
||||
TableManager tableManager = managerFactory.tableManager();
|
||||
Table table = tableManager.createTable(managerFactory.gamesRoomManager().getMainRoomId(), matchOptions);
|
||||
table.setTournamentSubTable(true);
|
||||
table.setTournamentSubTable(this.tableId);
|
||||
table.setTournament(tournament);
|
||||
table.setState(TableState.WAITING);
|
||||
TournamentPlayer player1 = pair.getPlayer1();
|
||||
|
|
@ -267,7 +267,7 @@ public class TournamentController {
|
|||
try {
|
||||
TableManager tableManager = managerFactory.tableManager();
|
||||
Table table = tableManager.createTable(managerFactory.gamesRoomManager().getMainRoomId(), matchOptions);
|
||||
table.setTournamentSubTable(true);
|
||||
table.setTournamentSubTable(this.tableId);
|
||||
table.setTournament(tournament);
|
||||
table.setState(TableState.WAITING);
|
||||
if (round.getAllPlayers().stream().allMatch(tournamentPlayer -> getPlayerUserId(tournamentPlayer.getPlayer().getId()).isPresent())) {
|
||||
|
|
@ -397,7 +397,7 @@ public class TournamentController {
|
|||
} else {
|
||||
managerFactory.draftManager().getController(tableId).ifPresent(draftController -> {
|
||||
draftController.getDraftSession(playerId).ifPresent(draftSession
|
||||
-> managerFactory.draftManager().kill(draftSession.getDraftId(), userId));
|
||||
-> managerFactory.draftManager().kill(draftSession.getDraft().getId(), userId));
|
||||
|
||||
});
|
||||
}
|
||||
|
|
@ -526,4 +526,8 @@ public class TournamentController {
|
|||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public UUID getTableId() {
|
||||
return tableId;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@ public class TournamentSession {
|
|||
setupTimeout(timeout);
|
||||
managerFactory.userManager().getUser(userId).ifPresent(user -> {
|
||||
int remaining = (int) futureTimeout.getDelay(TimeUnit.SECONDS);
|
||||
user.ccConstruct(tournament.getPlayer(playerId).getDeck(), tableId, remaining);
|
||||
user.ccConstruct(tournament.getPlayer(playerId).getDeck(), tableId, null, remaining);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue