Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions forge-gui/res/languages/en-US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -3031,6 +3031,8 @@ lblNetworkPickTimerPrompt=Pick timer (seconds per pick):
lblNetworkGraceTimerPromptLine1=Grace period on disconnect
lblNetworkGraceTimerPromptLine2=(seconds, 0 to disable):
lblNetworkDraftTimersTitle=Draft Timers
lblMobileLimitedUnsupportedTitle=Mobile client joined Limited lobby
lblMobileLimitedUnsupportedMessage=Draft and Sealed are not yet supported on network play for mobile. {0} will not be able to participate in this lobby.
lblDraftCompletePoolSaved=Draft complete! Your pool has been saved as ''{0}''.
#FDraftOverlay.java
lblDraftOverlayPackOfN=Pack {0} of {1}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import forge.gamemodes.net.server.FServerManager;
import forge.gamemodes.net.server.ServerGameLobby;
import forge.localinstance.properties.ForgeNetPreferences;
import forge.gui.FThreads;
import forge.gui.GuiBase;
import forge.gui.interfaces.IGuiGame;
import forge.gui.interfaces.ILobbyView;
Expand Down Expand Up @@ -58,6 +59,11 @@ public void draftAutoPicked(int seatIndex, forge.item.PaperCard card, int packNu
public void receiveEventPool(String eventId, forge.deck.Deck pool) {
view.onReceiveEventPool(eventId, pool);
}
@Override
public void lobbyAlert(final String title, final String message) {
FThreads.invokeInBackgroundThread(() ->
SOptionPane.showMessageDialog(message, title, SOptionPane.WARNING_ICON));
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,11 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) throw
listener.draftSeatPicked(event.getSeatIndex(), event.getSeatQueueDepths());
}
return;
} else if (msg instanceof LobbyAlertEvent event) {
for (final ILobbyListener listener : lobbyListeners) {
listener.lobbyAlert(event.getTitle(), event.getMessage());
}
return;
}
super.channelRead(ctx, msg);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package forge.gamemodes.net.event;

public final class LobbyAlertEvent implements NetEvent {
private static final long serialVersionUID = 1L;

private final String title;
private final String message;

public LobbyAlertEvent(final String title, final String message) {
this.title = title;
this.message = message;
}

public String getTitle() {
return title;
}

public String getMessage() {
return message;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,21 @@ public void broadcast(final NetEvent event) {
broadcastTo(event, clients.values());
}

// TODO: remove when mobile supports online draft/sealed
public void broadcastMobileLimitedAlert() {
final List<String> mobileNames = new ArrayList<>();
for (final RemoteClient client : clients.values()) {
if (client.isLibgdx()) {
mobileNames.add(client.getUsername());
}
}
if (mobileNames.isEmpty()) return;
final Localizer loc = Localizer.getInstance();
broadcast(new LobbyAlertEvent(
loc.getMessage("lblMobileLimitedUnsupportedTitle"),
loc.getMessage("lblMobileLimitedUnsupportedMessage", String.join(", ", mobileNames))));
}

/**
* Dispatch a broadcast event to the host's local listener — the host does
* not receive its own broadcasts over the network, so we mirror them here.
Expand All @@ -304,6 +319,8 @@ private void dispatchToLocalListener(final NetEvent event) {
e.getPackNumber(), e.getPickNumber(), e.getTimerDurationSeconds());
} else if (event instanceof DraftSeatPickedEvent e) {
lobbyListener.draftSeatPicked(e.getSeatIndex(), e.getSeatQueueDepths());
} else if (event instanceof LobbyAlertEvent e) {
lobbyListener.lobbyAlert(e.getTitle(), e.getMessage());
}
}

Expand Down Expand Up @@ -1006,6 +1023,13 @@ public void channelRead(final ChannelHandlerContext ctx, final Object msg) throw
broadcastTo(new MessageEvent(formatAfkTimeoutMessage()),
Collections.singleton(client));
}
// TODO: remove when mobile supports online draft/sealed
if (event.isLibgdx() && localLobby.getData().isLimitedMode()) {
final Localizer loc = Localizer.getInstance();
broadcast(new LobbyAlertEvent(
loc.getMessage("lblMobileLimitedUnsupportedTitle"),
loc.getMessage("lblMobileLimitedUnsupportedMessage", event.getUsername())));
}
// Warn if client version differs from host
final String clientVersion = event.getVersion();
final String hostVersion = BuildInfo.getVersionString();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,13 @@ protected void updateView(boolean fullUpdate) {

/** Set the lobby's declared mode (Constructed / Limited) and broadcast to clients. */
public void setLimitedMode(boolean limited) {
final boolean wasLimited = getData().isLimitedMode();
getData().setLimitedMode(limited);
updateView(true);
// TODO: remove when mobile supports online draft/sealed
if (limited && !wasLimited) {
FServerManager.getInstance().broadcastMobileLimitedAlert();
}
}

public ServerGameLobby() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ default void draftPackArrived(int seatIndex, List<PaperCard> pack,
default void draftSeatPicked(int seatIndex, int[] seatQueueDepths) { }
default void draftAutoPicked(int seatIndex, PaperCard card, int packNumber, int pickInPack) { }
default void receiveEventPool(String eventId, Deck pool) { }
default void lobbyAlert(String title, String message) { }
}
Loading