feat(multiplayer): see lobby members.

This commit is contained in:
huanghongxun 2021-09-28 02:13:33 +08:00
parent fac812f1dd
commit b556c51307
3 changed files with 21 additions and 2 deletions

View File

@ -186,6 +186,11 @@ public class MultiplayerPage extends Control implements DecoratorPage, PageAware
clients.add(event);
});
});
session.getServer().onClientDisconnected().register(event -> {
runInFX(() -> {
clients.remove(event);
});
});
initCatoSession(session);
} catch (Exception e) {
LOG.log(Level.WARNING, "Failed to create session", e);

View File

@ -182,11 +182,13 @@ public class MultiplayerPageSkin extends SkinBase<MultiplayerPage> {
i18n("multiplayer.state.master", control.getSession() == null ? "" : control.getSession().getName(), control.getGamePort()),
control.gamePortProperty(), control.sessionProperty()));
Label membersLabel = new Label(i18n("multiplayer.session.create.members"));
VBox clientsPane = new VBox(8);
clients = MappedObservableList.create(control.getClients(), client -> new ClientItem(client));
clients = MappedObservableList.create(control.getClients(), ClientItem::new);
Bindings.bindContent(clientsPane.getChildren(), clients);
masterPane.getChildren().setAll(masterHintPane, label, clientsPane);
masterPane.getChildren().setAll(masterHintPane, label, membersLabel, clientsPane);
}
BorderPane slavePane = new BorderPane();
@ -303,6 +305,7 @@ public class MultiplayerPageSkin extends SkinBase<MultiplayerPage> {
private static class ClientItem extends StackPane {
ClientItem(MultiplayerChannel.CatoClient client) {
BorderPane pane = new BorderPane();
pane.setPadding(new Insets(8));
pane.setLeft(new Label(client.getUsername()));
RipplerContainer container = new RipplerContainer(pane);

View File

@ -36,6 +36,7 @@ public class MultiplayerServer extends Thread {
private final int gamePort;
private final EventManager<MultiplayerChannel.CatoClient> onClientAdded = new EventManager<>();
private final EventManager<MultiplayerChannel.CatoClient> onClientDisconnected = new EventManager<>();
private final EventManager<Event> onKeepAlive = new EventManager<>();
public MultiplayerServer(int gamePort) {
@ -49,6 +50,10 @@ public class MultiplayerServer extends Thread {
return onClientAdded;
}
public EventManager<MultiplayerChannel.CatoClient> onClientDisconnected() {
return onClientDisconnected;
}
public EventManager<Event> onKeepAlive() {
return onKeepAlive;
}
@ -88,6 +93,7 @@ public class MultiplayerServer extends Thread {
}
private void handleClient(Socket targetSocket) {
String clientName = null;
LOG.info("Accepted client " + targetSocket.getRemoteSocketAddress());
try (Socket clientSocket = targetSocket;
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
@ -109,6 +115,7 @@ public class MultiplayerServer extends Thread {
writer.newLine();
writer.flush();
clientName = joinRequest.getUsername();
onClientAdded.fireEvent(new CatoClient(this, joinRequest.getUsername()));
} else if (request instanceof KeepAliveRequest) {
writer.write(JsonUtils.UGLY_GSON.toJson(new KeepAliveResponse(System.currentTimeMillis())));
@ -124,6 +131,10 @@ public class MultiplayerServer extends Thread {
LOG.log(Level.WARNING, "Failed to handle client socket.", e);
} catch (JsonParseException e) {
LOG.log(Level.SEVERE, "Failed to parse client request. This should not happen.", e);
} finally {
if (clientName != null) {
onClientDisconnected.fireEvent(new CatoClient(this, clientName));
}
}
}
}