mirror of
https://github.com/HMCL-dev/HMCL.git
synced 2025-09-16 07:16:27 -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);
|
clients.add(event);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
session.getServer().onClientDisconnected().register(event -> {
|
||||||
|
runInFX(() -> {
|
||||||
|
clients.remove(event);
|
||||||
|
});
|
||||||
|
});
|
||||||
initCatoSession(session);
|
initCatoSession(session);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
LOG.log(Level.WARNING, "Failed to create session", 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()),
|
i18n("multiplayer.state.master", control.getSession() == null ? "" : control.getSession().getName(), control.getGamePort()),
|
||||||
control.gamePortProperty(), control.sessionProperty()));
|
control.gamePortProperty(), control.sessionProperty()));
|
||||||
|
|
||||||
|
Label membersLabel = new Label(i18n("multiplayer.session.create.members"));
|
||||||
|
|
||||||
VBox clientsPane = new VBox(8);
|
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);
|
Bindings.bindContent(clientsPane.getChildren(), clients);
|
||||||
|
|
||||||
masterPane.getChildren().setAll(masterHintPane, label, clientsPane);
|
masterPane.getChildren().setAll(masterHintPane, label, membersLabel, clientsPane);
|
||||||
}
|
}
|
||||||
|
|
||||||
BorderPane slavePane = new BorderPane();
|
BorderPane slavePane = new BorderPane();
|
||||||
@ -303,6 +305,7 @@ public class MultiplayerPageSkin extends SkinBase<MultiplayerPage> {
|
|||||||
private static class ClientItem extends StackPane {
|
private static class ClientItem extends StackPane {
|
||||||
ClientItem(MultiplayerChannel.CatoClient client) {
|
ClientItem(MultiplayerChannel.CatoClient client) {
|
||||||
BorderPane pane = new BorderPane();
|
BorderPane pane = new BorderPane();
|
||||||
|
pane.setPadding(new Insets(8));
|
||||||
pane.setLeft(new Label(client.getUsername()));
|
pane.setLeft(new Label(client.getUsername()));
|
||||||
|
|
||||||
RipplerContainer container = new RipplerContainer(pane);
|
RipplerContainer container = new RipplerContainer(pane);
|
||||||
|
@ -36,6 +36,7 @@ public class MultiplayerServer extends Thread {
|
|||||||
private final int gamePort;
|
private final int gamePort;
|
||||||
|
|
||||||
private final EventManager<MultiplayerChannel.CatoClient> onClientAdded = new EventManager<>();
|
private final EventManager<MultiplayerChannel.CatoClient> onClientAdded = new EventManager<>();
|
||||||
|
private final EventManager<MultiplayerChannel.CatoClient> onClientDisconnected = new EventManager<>();
|
||||||
private final EventManager<Event> onKeepAlive = new EventManager<>();
|
private final EventManager<Event> onKeepAlive = new EventManager<>();
|
||||||
|
|
||||||
public MultiplayerServer(int gamePort) {
|
public MultiplayerServer(int gamePort) {
|
||||||
@ -49,6 +50,10 @@ public class MultiplayerServer extends Thread {
|
|||||||
return onClientAdded;
|
return onClientAdded;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EventManager<MultiplayerChannel.CatoClient> onClientDisconnected() {
|
||||||
|
return onClientDisconnected;
|
||||||
|
}
|
||||||
|
|
||||||
public EventManager<Event> onKeepAlive() {
|
public EventManager<Event> onKeepAlive() {
|
||||||
return onKeepAlive;
|
return onKeepAlive;
|
||||||
}
|
}
|
||||||
@ -88,6 +93,7 @@ public class MultiplayerServer extends Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void handleClient(Socket targetSocket) {
|
private void handleClient(Socket targetSocket) {
|
||||||
|
String clientName = null;
|
||||||
LOG.info("Accepted client " + targetSocket.getRemoteSocketAddress());
|
LOG.info("Accepted client " + targetSocket.getRemoteSocketAddress());
|
||||||
try (Socket clientSocket = targetSocket;
|
try (Socket clientSocket = targetSocket;
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
|
BufferedReader reader = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
|
||||||
@ -109,6 +115,7 @@ public class MultiplayerServer extends Thread {
|
|||||||
writer.newLine();
|
writer.newLine();
|
||||||
writer.flush();
|
writer.flush();
|
||||||
|
|
||||||
|
clientName = joinRequest.getUsername();
|
||||||
onClientAdded.fireEvent(new CatoClient(this, joinRequest.getUsername()));
|
onClientAdded.fireEvent(new CatoClient(this, joinRequest.getUsername()));
|
||||||
} else if (request instanceof KeepAliveRequest) {
|
} else if (request instanceof KeepAliveRequest) {
|
||||||
writer.write(JsonUtils.UGLY_GSON.toJson(new KeepAliveResponse(System.currentTimeMillis())));
|
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);
|
LOG.log(Level.WARNING, "Failed to handle client socket.", e);
|
||||||
} catch (JsonParseException e) {
|
} catch (JsonParseException e) {
|
||||||
LOG.log(Level.SEVERE, "Failed to parse client request. This should not happen.", 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