mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-15 06:45:42 -04:00
feat(multiplayer): see lobby members.
This commit is contained in:
parent
fac812f1dd
commit
b556c51307
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user