diff --git a/client/src/main/java/nl/andrewl/aos2_client/Client.java b/client/src/main/java/nl/andrewl/aos2_client/Client.java index 70f4d38..f891f38 100644 --- a/client/src/main/java/nl/andrewl/aos2_client/Client.java +++ b/client/src/main/java/nl/andrewl/aos2_client/Client.java @@ -1,6 +1,7 @@ package nl.andrewl.aos2_client; import nl.andrewl.aos2_client.config.ClientConfig; +import nl.andrewl.aos2_client.config.ConnectConfig; import nl.andrewl.aos2_client.control.InputHandler; import nl.andrewl.aos2_client.model.Chat; import nl.andrewl.aos2_client.model.ClientPlayer; @@ -26,10 +27,8 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; public class Client implements Runnable { - private final String host; - private final int port; - private final String username; - private final ClientConfig config; + public final ConnectConfig connectConfig; + public final ClientConfig config; private final CommunicationHandler communicationHandler; private final InputHandler inputHandler; @@ -46,11 +45,9 @@ public class Client implements Runnable { private final Chat chat; private final Queue mainThreadActions; - public Client(ClientConfig config, String host, int port, String username) { - this.host = host; - this.port = port; - this.username = username; + public Client(ClientConfig config, ConnectConfig connectConfig) { this.config = config; + this.connectConfig = connectConfig; this.camera = new Camera(); this.players = new ConcurrentHashMap<>(); this.teams = new ConcurrentHashMap<>(); @@ -81,7 +78,7 @@ public class Client implements Runnable { @Override public void run() { try { - communicationHandler.establishConnection(host, port, username); + communicationHandler.establishConnection(); } catch (IOException e) { System.err.println("Couldn't connect to the server: " + e.getMessage()); return; @@ -279,6 +276,7 @@ public class Client implements Runnable { String host = args[0].trim(); int port = Integer.parseInt(args[1]); String username = args[2].trim(); + ConnectConfig connectCfg = new ConnectConfig(host, port, username, false); List configPaths = Config.getCommonConfigPaths(); configPaths.add(0, Path.of("client.yaml")); // Add this first so we create client.yaml if needed. @@ -286,7 +284,7 @@ public class Client implements Runnable { configPaths.add(Path.of(args[3].trim())); } ClientConfig clientConfig = Config.loadConfig(ClientConfig.class, configPaths, new ClientConfig(), "default-config.yaml"); - Client client = new Client(clientConfig, host, port, username); + Client client = new Client(clientConfig, connectCfg); client.run(); } } diff --git a/client/src/main/java/nl/andrewl/aos2_client/CommunicationHandler.java b/client/src/main/java/nl/andrewl/aos2_client/CommunicationHandler.java index 5942aee..8db07a2 100644 --- a/client/src/main/java/nl/andrewl/aos2_client/CommunicationHandler.java +++ b/client/src/main/java/nl/andrewl/aos2_client/CommunicationHandler.java @@ -8,7 +8,8 @@ import nl.andrewl.aos_core.model.Team; import nl.andrewl.aos_core.model.item.ItemStack; import nl.andrewl.aos_core.model.world.World; import nl.andrewl.aos_core.model.world.WorldIO; -import nl.andrewl.aos_core.net.*; +import nl.andrewl.aos_core.net.TcpReceiver; +import nl.andrewl.aos_core.net.UdpReceiver; import nl.andrewl.aos_core.net.connect.ConnectAcceptMessage; import nl.andrewl.aos_core.net.connect.ConnectRejectMessage; import nl.andrewl.aos_core.net.connect.ConnectRequestMessage; @@ -42,18 +43,18 @@ public class CommunicationHandler { this.client = client; } - public void establishConnection(String host, int port, String username) throws IOException { + public void establishConnection() throws IOException { if (socket != null && !socket.isClosed()) { socket.close(); } - InetAddress address = InetAddress.getByName(host); - System.out.printf("Connecting to server at %s, port %d, with username \"%s\"...%n", address, port, username); + InetAddress address = InetAddress.getByName(client.connectConfig.host()); + System.out.printf("Connecting to server at %s, port %d, with username \"%s\"...%n", address, client.connectConfig.port(), client.connectConfig.username()); - socket = new Socket(address, port); + socket = new Socket(address, client.connectConfig.port()); socket.setSoTimeout(1000); in = Net.getInputStream(socket.getInputStream()); out = Net.getOutputStream(socket.getOutputStream()); - Net.write(new ConnectRequestMessage(username, true), out); + Net.write(new ConnectRequestMessage(client.connectConfig.username(), client.connectConfig.spectator()), out); Message response = Net.read(in); socket.setSoTimeout(0); if (response instanceof ConnectRejectMessage rejectMessage) { @@ -61,7 +62,7 @@ public class CommunicationHandler { } if (response instanceof ConnectAcceptMessage acceptMessage) { this.clientId = acceptMessage.clientId(); - client.setMyPlayer(new ClientPlayer(clientId, username)); + client.setMyPlayer(new ClientPlayer(clientId, client.connectConfig.username())); receiveInitialData(); establishDatagramConnection(); new Thread(new TcpReceiver(in, client::onMessageReceived).withShutdownHook(this::shutdown)).start(); diff --git a/client/src/main/java/nl/andrewl/aos2_client/config/ConnectConfig.java b/client/src/main/java/nl/andrewl/aos2_client/config/ConnectConfig.java new file mode 100644 index 0000000..fc6118d --- /dev/null +++ b/client/src/main/java/nl/andrewl/aos2_client/config/ConnectConfig.java @@ -0,0 +1,11 @@ +package nl.andrewl.aos2_client.config; + +/** + * The data that's needed by the client to initially establish a connection. + */ +public record ConnectConfig( + String host, + int port, + String username, + boolean spectator +) {}