mirror of
https://github.com/michaelrausch/Party-Parrots-At-Sea.git
synced 2026-05-09 14:28:43 +00:00
Finished implementing room codes.
- Fixed bug where room code wasn't parsed correctly - Added room code selection to server list screen. - Added room code to hosts lobby. - Implemented communication protocols on the game client. Tags: #story[1281]
This commit is contained in:
@@ -3,6 +3,8 @@ package seng302.gameServer;
|
||||
import com.sun.org.apache.xpath.internal.operations.Bool;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import seng302.serverRepository.ServerListing;
|
||||
import seng302.serverRepository.ServerRepositoryClient;
|
||||
|
||||
import javax.jmdns.JmDNS;
|
||||
import javax.jmdns.ServiceInfo;
|
||||
@@ -31,17 +33,20 @@ public class ServerAdvertiser {
|
||||
*/
|
||||
private static String SERVICE = "_partyatsea";
|
||||
private static String PROTOCOL = "_tcp";
|
||||
public static String SERVICE_TYPE = SERVICE + "." + PROTOCOL + ".homekit.bonjour.michaelrausch.nz.";
|
||||
public static String SERVICE_TYPE = SERVICE + "." + PROTOCOL + ".local.";
|
||||
|
||||
private static ServerAdvertiser instance = null;
|
||||
private static JmDNS jmdnsInstance = null;
|
||||
private ServiceInfo serviceInfo; // Note: Whenever this is changed, our service will be re-registered on the network.
|
||||
private ServerRepositoryClient repositoryClient;
|
||||
|
||||
private Hashtable<String ,String> props;
|
||||
|
||||
private ServerAdvertiser() throws IOException{
|
||||
jmdnsInstance = JmDNS.create(InetAddress.getByName(getLocalHostIp()));
|
||||
|
||||
repositoryClient = new ServerRepositoryClient();
|
||||
|
||||
props = new Hashtable<>();
|
||||
props.put("map", "");
|
||||
props.put("spacesLeft", "0");
|
||||
@@ -130,6 +135,9 @@ public class ServerAdvertiser {
|
||||
}
|
||||
}
|
||||
}, 0);
|
||||
|
||||
ServerListing serverListing = new ServerListing(serverName, props.get("map"), getLocalHostIp(), portNo, Integer.parseInt(props.get("capacity")));
|
||||
repositoryClient.register(serverListing);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,13 +1,32 @@
|
||||
package seng302.gameServer.messages;
|
||||
|
||||
import seng302.serverRepository.ServerListing;
|
||||
|
||||
public class ServerRegistrationMessage extends Message {
|
||||
private int size;
|
||||
|
||||
public ServerRegistrationMessage(ServerListing serverListing) {
|
||||
String serverName = serverListing.getServerName();
|
||||
String mapName = serverListing.getMapName();
|
||||
String address = serverListing.getAddress();
|
||||
int port = serverListing.getPortNumber();
|
||||
int players = serverListing.getPortNumber();
|
||||
int capacity = serverListing.getCapacity();
|
||||
String roomCode = serverListing.getRoomCode();
|
||||
|
||||
createMessage(serverName, mapName, address, port, players, capacity, roomCode);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getSize() {
|
||||
return size;
|
||||
}
|
||||
|
||||
public ServerRegistrationMessage(String serverName, String mapName, String address, int port, int players, int capacity, String roomCode){
|
||||
createMessage(serverName, mapName, address, port, players, capacity, roomCode);
|
||||
}
|
||||
|
||||
private void createMessage(String serverName, String mapName, String address, int port, int players, int capacity, String roomCode){
|
||||
size = serverName.getBytes().length + mapName.length() + address.length() + roomCode.length() + 36;
|
||||
|
||||
setHeader(new Header(MessageType.REPO_REGISTRATION_REQUEST, 0x01, (short) getSize()));
|
||||
@@ -37,4 +56,5 @@ public class ServerRegistrationMessage extends Message {
|
||||
writeCRC();
|
||||
rewind();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -57,9 +57,9 @@ public class ServerRepoStreamParser {
|
||||
}
|
||||
|
||||
private String parseRoomCodeRequest(byte[] payload) {
|
||||
int roomCodeLength = (int) Message.bytesToLong(Arrays.copyOfRange(payload, 0 ,4));
|
||||
int roomCodeLength = (int) Message.bytesToLong(Arrays.copyOfRange(payload, 0 ,6));
|
||||
|
||||
return new String(Arrays.copyOfRange(payload, 4, 4+roomCodeLength));
|
||||
return new String(Arrays.copyOfRange(payload, 6, 6+roomCodeLength));
|
||||
}
|
||||
|
||||
public static ServerListing parseServerRegistration(byte[] payload) {
|
||||
|
||||
@@ -20,17 +20,20 @@ public class ServerRepository {
|
||||
ServerSocket serverSocket = new ServerSocket(9999);
|
||||
|
||||
|
||||
// TODO Remove later, this is for testing
|
||||
new Timer().schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
new ServerRepositoryClient();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}, 5000);
|
||||
// // TODO Remove later, this is for testing
|
||||
// new Timer().schedule(new TimerTask() {
|
||||
// @Override
|
||||
// public void run() {
|
||||
// try {
|
||||
// System.out.println("Starting repo client");
|
||||
// new ServerRepositoryClient();
|
||||
// } catch (Exception e) {
|
||||
// e.printStackTrace();
|
||||
// }
|
||||
// }
|
||||
// }, 5000);
|
||||
|
||||
|
||||
|
||||
while (true){
|
||||
Socket clientSocket = serverSocket.accept();
|
||||
|
||||
@@ -1,36 +1,67 @@
|
||||
package seng302.serverRepository;
|
||||
|
||||
import com.sun.xml.internal.ws.api.message.Packet;
|
||||
import seng302.gameServer.messages.Message;
|
||||
import seng302.gameServer.messages.RoomCodeRequest;
|
||||
import seng302.gameServer.messages.ServerRegistrationMessage;
|
||||
import seng302.model.stream.packets.PacketType;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.Socket;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
public class ServerRepositoryClient {
|
||||
|
||||
private String roomCode = "0";
|
||||
private static String roomCode = null;
|
||||
private Timer serverListingUpdateTimer;
|
||||
|
||||
public ServerRepositoryClient() throws Exception {
|
||||
new Timer().schedule(new TimerTask() {
|
||||
public ServerRepositoryClient() {
|
||||
|
||||
}
|
||||
|
||||
public void register(ServerListing serverListing){
|
||||
serverListingUpdateTimer = new Timer();
|
||||
|
||||
serverListingUpdateTimer.schedule(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
sendUpdate();
|
||||
sendRegistrationUpdate(serverListing);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
e.printStackTrace();//todo proper error handling
|
||||
}
|
||||
}
|
||||
}, 0, 5000);
|
||||
}
|
||||
|
||||
private void sendUpdate() throws Exception {
|
||||
public void unregister(){
|
||||
serverListingUpdateTimer.cancel();
|
||||
}
|
||||
|
||||
public ServerListing getServerForRoomCode(String roomCode) throws Exception {
|
||||
// TODO replace localhost with server
|
||||
Socket socket = new Socket("localhost", 9999);
|
||||
ServerRepoStreamParser parser = new ServerRepoStreamParser(socket.getInputStream());
|
||||
Message req = new ServerRegistrationMessage("asdf", "Asdf", "asdf", 6969, 1, 20, "4949");
|
||||
|
||||
Message request = new RoomCodeRequest(roomCode); //roomCode);
|
||||
socket.getOutputStream().write(request.getBuffer());
|
||||
|
||||
PacketType packetType = parser.parse();
|
||||
|
||||
if (packetType != PacketType.SERVER_REGISTRATION){
|
||||
System.out.println("Wrong packet type");
|
||||
return null;
|
||||
}
|
||||
|
||||
socket.close();
|
||||
|
||||
return parser.getServerListing();
|
||||
}
|
||||
|
||||
private void sendRegistrationUpdate(ServerListing serverListing) throws Exception {
|
||||
Socket socket = new Socket("localhost", 9999);
|
||||
ServerRepoStreamParser parser = new ServerRepoStreamParser(socket.getInputStream());
|
||||
|
||||
Message req = new ServerRegistrationMessage(serverListing);
|
||||
|
||||
socket.getOutputStream().write(req.getBuffer());
|
||||
|
||||
@@ -42,13 +73,15 @@ public class ServerRepositoryClient {
|
||||
|
||||
String roomCode = parser.getRoomCode();
|
||||
|
||||
if (roomCode.equals("0")){
|
||||
return;
|
||||
if (roomCode.length() != 0){
|
||||
ServerRepositoryClient.roomCode = roomCode;
|
||||
}
|
||||
|
||||
this.roomCode = roomCode;
|
||||
|
||||
socket.close();
|
||||
}
|
||||
|
||||
public static String getRoomCode(){
|
||||
return roomCode;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ import seng302.model.RaceState;
|
||||
import seng302.model.mark.CompoundMark;
|
||||
import seng302.model.mark.Corner;
|
||||
import seng302.model.stream.xml.parser.RaceXMLData;
|
||||
import seng302.serverRepository.ServerRepositoryClient;
|
||||
import seng302.utilities.Sounds;
|
||||
import seng302.visualiser.GameView;
|
||||
import seng302.visualiser.controllers.cells.PlayerCell;
|
||||
@@ -29,10 +30,7 @@ import seng302.visualiser.controllers.dialogs.BoatCustomizeController;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.URL;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.*;
|
||||
|
||||
public class LobbyController implements Initializable {
|
||||
|
||||
@@ -85,6 +83,10 @@ public class LobbyController implements Initializable {
|
||||
serverName.setText(ViewManager.getInstance().getProperty("serverName"));
|
||||
mapName.setText(ViewManager.getInstance().getProperty("mapName"));
|
||||
|
||||
if (ServerRepositoryClient.getRoomCode() != null){
|
||||
setRoomCode(ServerRepositoryClient.getRoomCode());
|
||||
}
|
||||
|
||||
ViewManager.getInstance().getPlayerList().addListener((ListChangeListener<String>) c -> Platform.runLater(this::refreshPlayerList));
|
||||
|
||||
ViewManager.getInstance().getPlayerList().setAll(ViewManager.getInstance().getPlayerList().sorted());
|
||||
@@ -242,4 +244,8 @@ public class LobbyController implements Initializable {
|
||||
public void closeCustomizationDialog() {
|
||||
customizationDialog.close();
|
||||
}
|
||||
|
||||
public void setRoomCode(String roomCode) {
|
||||
serverName.setText(serverName.getText() + " ( " + roomCode +" )");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,6 +23,8 @@ import javafx.scene.layout.VBox;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import seng302.gameServer.ServerDescription;
|
||||
import seng302.serverRepository.ServerListing;
|
||||
import seng302.serverRepository.ServerRepositoryClient;
|
||||
import seng302.utilities.Sounds;
|
||||
import seng302.visualiser.ServerListener;
|
||||
import seng302.visualiser.ServerListenerDelegate;
|
||||
@@ -51,6 +53,10 @@ public class ServerListController implements Initializable, ServerListenerDelega
|
||||
private JFXTextField serverHostName;
|
||||
@FXML
|
||||
private JFXTextField serverPortNumber;
|
||||
@FXML
|
||||
private JFXButton roomConnectButton;
|
||||
@FXML
|
||||
private JFXTextField roomNumber;
|
||||
//---------FXML END---------//
|
||||
|
||||
private Label noServersFound;
|
||||
@@ -64,6 +70,17 @@ public class ServerListController implements Initializable, ServerListenerDelega
|
||||
// Set Event Bindings
|
||||
connectButton.setOnMouseEntered(event -> Sounds.playHoverSound());
|
||||
serverListHostButton.setOnMouseEntered(event -> Sounds.playHoverSound());
|
||||
|
||||
roomConnectButton.setOnMouseReleased(event -> {
|
||||
connectToRoomCode(roomNumber.getText());
|
||||
Sounds.playButtonClick();
|
||||
});
|
||||
roomNumber.setOnKeyPressed(event -> {
|
||||
if (event.getCode().equals(KeyCode.ENTER)) {
|
||||
connectToRoomCode(roomNumber.getText());
|
||||
}
|
||||
});
|
||||
|
||||
connectButton.setOnMouseReleased(event -> {
|
||||
attemptToDirectConnect();
|
||||
Sounds.playButtonClick();
|
||||
@@ -150,6 +167,15 @@ public class ServerListController implements Initializable, ServerListenerDelega
|
||||
return hostNameValid && portNumberValid;
|
||||
}
|
||||
|
||||
private void connectToRoomCode(String roomCode){
|
||||
try {
|
||||
ServerListing serverListing = new ServerRepositoryClient().getServerForRoomCode(roomCode);
|
||||
ViewManager.getInstance().getGameClient().runAsClient(serverListing.getAddress(), serverListing.getPortNumber());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Connects the user to a lobby via the Direct Connect form.
|
||||
*/
|
||||
|
||||
@@ -20,6 +20,7 @@ import javafx.stage.Stage;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import seng302.gameServer.ServerAdvertiser;
|
||||
import seng302.serverRepository.ServerRepositoryClient;
|
||||
import seng302.utilities.BonjourInstallChecker;
|
||||
import seng302.utilities.Sounds;
|
||||
import seng302.visualiser.GameClient;
|
||||
@@ -233,8 +234,9 @@ public class ViewManager {
|
||||
logger.error("Could not load lobby view");
|
||||
}
|
||||
|
||||
LobbyController lobbyController = loader.getController();
|
||||
|
||||
if (disableReadyButton) {
|
||||
LobbyController lobbyController = loader.getController();
|
||||
lobbyController.disableReadyButton();
|
||||
}
|
||||
|
||||
@@ -245,7 +247,6 @@ public class ViewManager {
|
||||
* Sets up the view for the race. Creating a new decorator and destroying the old one.
|
||||
* @return A RaceViewController for the race view screen.
|
||||
*/
|
||||
|
||||
public RaceViewController loadRaceView() {
|
||||
FXMLLoader loader = loadFxml("/views/RaceView.fxml");
|
||||
// have to create a new stage and set the race view maximized as JFoenix decorator has
|
||||
|
||||
Reference in New Issue
Block a user