From 337da83070fc74f0b0063ae1a441ecdd6b5f2e5b Mon Sep 17 00:00:00 2001 From: austin Date: Sat, 24 Aug 2024 17:59:30 -0400 Subject: [PATCH] ability to return to main menu from in game --- docs/src/progress/renderertodo.md | 1 + .../java/electrosphere/engine/Globals.java | 1 + .../java/electrosphere/net/server/Server.java | 16 ++++++++++++++++ .../net/server/ServerConnectionHandler.java | 18 +++--------------- .../net/server/player/Player.java | 19 ++++++++++++++----- 5 files changed, 35 insertions(+), 20 deletions(-) diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index ce2fef6a..3da8833e 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -654,6 +654,7 @@ Bug Fixes - Calculate bounding sphere for meshes by deforming vertices with bone default pose instead of no bone deform - Fix character creation menu - Fix text input collapsing while typing + - Fix threads not synchronizing when returning to main menu (rendering still running when player entity deleted, race condition) Startup Performance - Cache loaded typescript diff --git a/src/main/java/electrosphere/engine/Globals.java b/src/main/java/electrosphere/engine/Globals.java index cb4aad1d..b8372a02 100644 --- a/src/main/java/electrosphere/engine/Globals.java +++ b/src/main/java/electrosphere/engine/Globals.java @@ -596,6 +596,7 @@ public class Globals { Globals.playerCamera = null; Globals.firstPersonEntity = null; Globals.clientPlayer = null; + Globals.playerManager = new PlayerManager(); clientScene = new Scene(); clientSceneWrapper = new ClientSceneWrapper(clientScene, new CollisionEngine()); } diff --git a/src/main/java/electrosphere/net/server/Server.java b/src/main/java/electrosphere/net/server/Server.java index 1b77b205..9dcbfadb 100644 --- a/src/main/java/electrosphere/net/server/Server.java +++ b/src/main/java/electrosphere/net/server/Server.java @@ -25,6 +25,9 @@ import java.util.concurrent.Semaphore; * Lowest level networking class for the server */ public class Server implements Runnable { + + //tracks whether the server is open or not + private boolean isOpen = false; //the port the server is running on int port; @@ -70,6 +73,7 @@ public class Server implements Runnable { if(port == 0){ NetUtils.setPort(serverSocket.getLocalPort()); } + this.isOpen = true; } catch(BindException ex){ LoggerInterface.loggerNetworking.ERROR("Failed to bind server socket!",ex); } catch (IOException ex) { @@ -92,6 +96,7 @@ public class Server implements Runnable { LoggerInterface.loggerNetworking.ERROR("Socket error on client socket!",ex); } } + this.isOpen = false; LoggerInterface.loggerNetworking.WARNING("Server socket thread ended"); } @@ -114,6 +119,7 @@ public class Server implements Runnable { if(serverSocket != null){ serverSocket.close(); } + this.isOpen = false; } catch (IOException ex) { ex.printStackTrace(); } @@ -173,4 +179,14 @@ public class Server implements Runnable { } this.connectListLock.release(); } + + /** + * Gets whether the server is open or not + * @return true if is open, false otherwise + */ + public boolean isOpen(){ + return isOpen; + } + + } diff --git a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java index 4cd7e990..ed91eba4 100644 --- a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java +++ b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java @@ -24,9 +24,6 @@ import java.util.concurrent.TimeUnit; * A connection to the server */ public class ServerConnectionHandler implements Runnable { - - //the player id associated with this connection - static int playerIdIncrementer = 0; //local carrier variables boolean local = false; @@ -96,7 +93,7 @@ public class ServerConnectionHandler implements Runnable { */ public ServerConnectionHandler(Socket socket) { this.socket = socket; - playerID = getNewPlayerID(); + this.playerID = Player.getNewId(); LoggerInterface.loggerNetworking.INFO("Player ID: " + playerID); this.messageProtocol = new MessageProtocol(this); } @@ -108,7 +105,7 @@ public class ServerConnectionHandler implements Runnable { */ public ServerConnectionHandler(InputStream serverInputStream, OutputStream serverOutputStream){ this.local = true; - playerID = getNewPlayerID(); + this.playerID = Player.getNewId(); LoggerInterface.loggerNetworking.INFO("Player ID: " + playerID); inputStream = serverInputStream; outputStream = serverOutputStream; @@ -192,7 +189,7 @@ public class ServerConnectionHandler implements Runnable { initialized = true; - while(Globals.threadManager.shouldKeepRunning() && this.isConnected == true){ + while(Globals.threadManager.shouldKeepRunning() && this.isConnected == true && Globals.server != null && Globals.server.isOpen()){ // // Main Loop @@ -318,19 +315,10 @@ public class ServerConnectionHandler implements Runnable { public void handleSynchronousPacketQueue(){ this.messageProtocol.handleSyncMessages(); } - - public void setPlayerId(int id){ - playerID = id; - } public int getPlayerId(){ return playerID; } - - static int getNewPlayerID(){ - playerIdIncrementer++; - return playerIdIncrementer; - } public void setPlayerEntityId(int id){ LoggerInterface.loggerNetworking.DEBUG("Set player(" + this.playerID + ")'s entity ID to be " + id); diff --git a/src/main/java/electrosphere/net/server/player/Player.java b/src/main/java/electrosphere/net/server/player/Player.java index 5dce9041..63b0e9c1 100644 --- a/src/main/java/electrosphere/net/server/player/Player.java +++ b/src/main/java/electrosphere/net/server/player/Player.java @@ -24,11 +24,7 @@ public class Player { public Player(ServerConnectionHandler connectionHandler){ this.connectionHandler = connectionHandler; - idIncrementerLock.acquireUninterruptibly(); - id = idIncrementer; - idIncrementer++; - idIncrementerLock.release(); - connectionHandler.setPlayerId(id); + id = connectionHandler.getPlayerId(); this.simulationRadius = Globals.userSettings.getGameplayPhysicsCellRadius(); } @@ -71,6 +67,19 @@ public class Player { public void setPlayerEntity(Entity playerEntity) { this.playerEntity = playerEntity; } + + /** + * Gets the next available id + * @return The id + */ + public static int getNewId(){ + int rVal = -1; + idIncrementerLock.acquireUninterruptibly(); + rVal = idIncrementer; + idIncrementer++; + idIncrementerLock.release(); + return rVal; + } }