From 4e488e43cda24424e00063256043d78a4f0e8c34 Mon Sep 17 00:00:00 2001 From: austin Date: Thu, 15 May 2025 12:57:56 -0400 Subject: [PATCH] explicit ServerState object --- docs/src/progress/renderertodo.md | 1 + .../client/ui/menu/debug/ImGuiPlayerEntity.java | 4 ++-- .../ui/menu/debug/perf/ImGuiNetworkMonitor.java | 4 ++-- .../ui/menu/ingame/MenuGeneratorsInGame.java | 2 +- src/main/java/electrosphere/engine/Globals.java | 16 +++++++++++----- .../engine/loadingthreads/LoadingUtils.java | 8 ++++---- .../engine/loadingthreads/MainMenuLoading.java | 4 ++-- .../engine/threads/ThreadManager.java | 4 ++-- .../java/electrosphere/net/server/Server.java | 2 +- .../net/server/ServerConnectionHandler.java | 6 +++--- .../server/MainServerFunctions.java | 8 ++++---- .../java/electrosphere/server/ServerState.java | 15 +++++++++++++++ .../extensions/StateCleanupCheckerExtension.java | 2 +- .../test/testutils/TestEngineUtils.java | 2 +- .../test/testutils/TestViewportUtils.java | 2 +- 15 files changed, 51 insertions(+), 29 deletions(-) create mode 100644 src/main/java/electrosphere/server/ServerState.java diff --git a/docs/src/progress/renderertodo.md b/docs/src/progress/renderertodo.md index 47b87863..132afac5 100644 --- a/docs/src/progress/renderertodo.md +++ b/docs/src/progress/renderertodo.md @@ -1811,6 +1811,7 @@ Move playerEntity to clientState Move playerCamera to clientState Move global cursor entities into cursorState Move lots of global state to clientState +Create ServerState global diff --git a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiPlayerEntity.java b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiPlayerEntity.java index 9b566b02..d8e252fb 100644 --- a/src/main/java/electrosphere/client/ui/menu/debug/ImGuiPlayerEntity.java +++ b/src/main/java/electrosphere/client/ui/menu/debug/ImGuiPlayerEntity.java @@ -143,8 +143,8 @@ public class ImGuiPlayerEntity { ImGui.text("View yaw (Server): " + ServerPlayerViewDirTree.getTree(serverPlayerEntity).getYaw()); ImGui.text("View pitch (Server): " + ServerPlayerViewDirTree.getTree(serverPlayerEntity).getPitch()); } - if(Globals.server != null && Globals.server.getFirstConnection() != null && Globals.server.getFirstConnection().getPlayer() != null){ - ImGui.text("Player Object World Pos (Server): " + Globals.server.getFirstConnection().getPlayer().getWorldPos()); + if(Globals.serverState.server != null && Globals.serverState.server.getFirstConnection() != null && Globals.serverState.server.getFirstConnection().getPlayer() != null){ + ImGui.text("Player Object World Pos (Server): " + Globals.serverState.server.getFirstConnection().getPlayer().getWorldPos()); } } diff --git a/src/main/java/electrosphere/client/ui/menu/debug/perf/ImGuiNetworkMonitor.java b/src/main/java/electrosphere/client/ui/menu/debug/perf/ImGuiNetworkMonitor.java index cf627830..8ddad3f0 100644 --- a/src/main/java/electrosphere/client/ui/menu/debug/perf/ImGuiNetworkMonitor.java +++ b/src/main/java/electrosphere/client/ui/menu/debug/perf/ImGuiNetworkMonitor.java @@ -54,8 +54,8 @@ public class ImGuiNetworkMonitor { clientNetworkBandwith.draw(); //server network pressure - if(Globals.server != null && Globals.server.getFirstConnection() != null){ - long serverPressureNewTotal = Globals.server.getFirstConnection().getNumBytesRead(); + if(Globals.serverState.server != null && Globals.serverState.server.getFirstConnection() != null){ + long serverPressureNewTotal = Globals.serverState.server.getFirstConnection().getNumBytesRead(); long serverPressureDelta = serverPressureNewTotal - serverPressureLastValue; serverPressureDataset.addPoint(serverPressureDelta); serverPressureLastValue = serverPressureNewTotal; diff --git a/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsInGame.java b/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsInGame.java index 81e8a509..7516c87d 100644 --- a/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsInGame.java +++ b/src/main/java/electrosphere/client/ui/menu/ingame/MenuGeneratorsInGame.java @@ -382,7 +382,7 @@ public class MenuGeneratorsInGame { * @return True if should show button, false otherwise */ private static boolean shouldShowLevelEditor(){ - return Globals.server != null; + return Globals.serverState.server != null; } } diff --git a/src/main/java/electrosphere/engine/Globals.java b/src/main/java/electrosphere/engine/Globals.java index 41bb9569..e20b11cc 100644 --- a/src/main/java/electrosphere/engine/Globals.java +++ b/src/main/java/electrosphere/engine/Globals.java @@ -41,7 +41,6 @@ import electrosphere.engine.time.Timekeeper; import electrosphere.logger.LoggerInterface; import electrosphere.net.config.NetConfig; import electrosphere.net.monitor.NetMonitor; -import electrosphere.net.server.Server; import electrosphere.net.server.player.PlayerManager; import electrosphere.net.synchronization.server.EntityValueTrackingService; import electrosphere.net.synchronization.server.ServerSynchronizationManager; @@ -60,6 +59,7 @@ import electrosphere.renderer.ui.ElementService; import electrosphere.renderer.ui.elements.ImagePanel; import electrosphere.renderer.ui.font.FontManager; import electrosphere.script.ScriptEngine; +import electrosphere.server.ServerState; import electrosphere.server.ai.AIManager; import electrosphere.server.datacell.EntityDataCellMapper; import electrosphere.server.datacell.RealmManager; @@ -166,7 +166,6 @@ public class Globals { // //Server manager thing // - public static Server server; public static ServerSynchronizationManager serverSynchronizationManager; public static boolean RUN_SERVER = true; @@ -352,7 +351,11 @@ public class Globals { * State for the client */ public static ClientState clientState = new ClientState(); - + + /** + * State for the server + */ + public static ServerState serverState = new ServerState(); @@ -415,6 +418,9 @@ public class Globals { //client state Globals.clientState = new ClientState(); + //server state + Globals.serverState = new ServerState(); + //load in default texture map textureMapDefault = TextureMap.construct("Textures/default_texture_map.json"); //load model pretransforms @@ -630,7 +636,7 @@ public class Globals { public static void unloadScene(){ Globals.playerManager = new PlayerManager(); Globals.clientState = new ClientState(); - Globals.server = null; + Globals.serverState = new ServerState(); Globals.serverSynchronizationManager = new ServerSynchronizationManager(); if(Globals.aiManager != null){ Globals.aiManager.shutdown(); @@ -656,13 +662,13 @@ public class Globals { Globals.elementService = null; Globals.realmManager = null; Globals.clientState = null; + Globals.serverState = null; Globals.audioEngine = null; Globals.renderingEngine = null; Globals.threadManager = null; Globals.signalSystem = null; Globals.serviceManager = null; Globals.fileWatcherService = null; - Globals.server = null; Globals.serverSynchronizationManager = null; Globals.aiManager = null; Globals.playerManager = null; diff --git a/src/main/java/electrosphere/engine/loadingthreads/LoadingUtils.java b/src/main/java/electrosphere/engine/loadingthreads/LoadingUtils.java index a011dcd6..7590686c 100644 --- a/src/main/java/electrosphere/engine/loadingthreads/LoadingUtils.java +++ b/src/main/java/electrosphere/engine/loadingthreads/LoadingUtils.java @@ -50,8 +50,8 @@ public class LoadingUtils { static void initServerThread(){ //start server networking if(Globals.RUN_SERVER){ - Globals.server = new Server(NetUtils.getPort()); - Thread serverThread = new Thread(Globals.server); + Globals.serverState.server = new Server(NetUtils.getPort()); + Thread serverThread = new Thread(Globals.serverState.server); Globals.threadManager.start(ThreadLabel.NETWORKING_SERVER, serverThread); } } @@ -88,7 +88,7 @@ public class LoadingUtils { if(runServerThread){ LoadingUtils.initServerThread(); } else { - Globals.server = new Server(NetUtils.getPort()); + Globals.serverState.server = new Server(NetUtils.getPort()); } //client -> server pipe PipedInputStream clientInput = new PipedInputStream(STREAM_BUFFER_SIZE); @@ -98,7 +98,7 @@ public class LoadingUtils { PipedOutputStream clientOutput; clientOutput = new PipedOutputStream(serverInput); //start server communication thread - rVal = Globals.server.addLocalPlayer(serverInput, serverOutput); + rVal = Globals.serverState.server.addLocalPlayer(serverInput, serverOutput); //start client communication thread Globals.clientState.clientConnection = new ClientNetworking(clientInput,clientOutput); Globals.threadManager.start(ThreadLabel.NETWORKING_CLIENT, new Thread(Globals.clientState.clientConnection)); diff --git a/src/main/java/electrosphere/engine/loadingthreads/MainMenuLoading.java b/src/main/java/electrosphere/engine/loadingthreads/MainMenuLoading.java index bebce379..28e0fa5f 100644 --- a/src/main/java/electrosphere/engine/loadingthreads/MainMenuLoading.java +++ b/src/main/java/electrosphere/engine/loadingthreads/MainMenuLoading.java @@ -60,8 +60,8 @@ public class MainMenuLoading { * Resets the server state */ private static void resetServerState(){ - Globals.server.close(); - Globals.server = null; + Globals.serverState.server.close(); + Globals.serverState.server = null; Globals.serverSynchronizationManager = null; Globals.realmManager.reset(); Globals.realmManager = new RealmManager(); diff --git a/src/main/java/electrosphere/engine/threads/ThreadManager.java b/src/main/java/electrosphere/engine/threads/ThreadManager.java index ddae9e9f..07ee947f 100644 --- a/src/main/java/electrosphere/engine/threads/ThreadManager.java +++ b/src/main/java/electrosphere/engine/threads/ThreadManager.java @@ -145,8 +145,8 @@ public class ThreadManager { threadLock.lock(); //for some reason, server must be explicitly closed - if(Globals.server != null){ - Globals.server.close(); + if(Globals.serverState.server != null){ + Globals.serverState.server.close(); } if(Globals.realmManager != null && Globals.realmManager.getRealms() != null){ diff --git a/src/main/java/electrosphere/net/server/Server.java b/src/main/java/electrosphere/net/server/Server.java index 1c8b2a4c..2f8ba6c9 100644 --- a/src/main/java/electrosphere/net/server/Server.java +++ b/src/main/java/electrosphere/net/server/Server.java @@ -119,7 +119,7 @@ public class Server implements Runnable { } this.close(); //null out global state - Globals.server = null; + Globals.serverState.server = null; LoggerInterface.loggerNetworking.INFO("Server socket thread ended"); } diff --git a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java index 0db33bd8..33f97d7b 100644 --- a/src/main/java/electrosphere/net/server/ServerConnectionHandler.java +++ b/src/main/java/electrosphere/net/server/ServerConnectionHandler.java @@ -230,7 +230,7 @@ public class ServerConnectionHandler implements Runnable { initialized = true; - while(Globals.threadManager.shouldKeepRunning() && this.isConnected == true && Globals.server != null && Globals.server.isOpen()){ + while(Globals.threadManager.shouldKeepRunning() && this.isConnected == true && Globals.serverState.server != null && Globals.serverState.server.isOpen()){ boolean receivedMessageThisLoop = false; // @@ -494,8 +494,8 @@ public class ServerConnectionHandler implements Runnable { this.synchronousMessageLock.release(); this.isConnected = false; //add connection to server list of connections to cleanup - if(Globals.server != null){ - Globals.server.addClientToCleanup(this); + if(Globals.serverState.server != null){ + Globals.serverState.server.addClientToCleanup(this); } } diff --git a/src/main/java/electrosphere/server/MainServerFunctions.java b/src/main/java/electrosphere/server/MainServerFunctions.java index 5c1be4ff..6f4b2f5d 100644 --- a/src/main/java/electrosphere/server/MainServerFunctions.java +++ b/src/main/java/electrosphere/server/MainServerFunctions.java @@ -16,15 +16,15 @@ public class MainServerFunctions { // //Cleanup disconnected clients - if(Globals.server != null){ - Globals.server.cleanupDeadConnections(); + if(Globals.serverState.server != null){ + Globals.serverState.server.cleanupDeadConnections(); } // //Synchronous player message parsing\ Globals.profiler.beginCpuSample("MainServerFunctions.simulate - Server synchronous packet parsing"); - if(Globals.server != null){ - Globals.server.synchronousPacketHandling(); + if(Globals.serverState.server != null){ + Globals.serverState.server.synchronousPacketHandling(); } Globals.profiler.endCpuSample(); Globals.profiler.beginCpuSample("MainServerFunctions.simulate - Server process synchronization messages"); diff --git a/src/main/java/electrosphere/server/ServerState.java b/src/main/java/electrosphere/server/ServerState.java new file mode 100644 index 00000000..89f4f16f --- /dev/null +++ b/src/main/java/electrosphere/server/ServerState.java @@ -0,0 +1,15 @@ +package electrosphere.server; + +import electrosphere.net.server.Server; + +/** + * Server state + */ +public class ServerState { + + /** + * Server networking + */ + public Server server; + +} diff --git a/src/test/java/electrosphere/test/template/extensions/StateCleanupCheckerExtension.java b/src/test/java/electrosphere/test/template/extensions/StateCleanupCheckerExtension.java index 9f9639f9..427b126b 100644 --- a/src/test/java/electrosphere/test/template/extensions/StateCleanupCheckerExtension.java +++ b/src/test/java/electrosphere/test/template/extensions/StateCleanupCheckerExtension.java @@ -21,12 +21,12 @@ public class StateCleanupCheckerExtension implements AfterEachCallback { Globals.renderingEngine, Globals.audioEngine, Globals.javaPID, - Globals.server, Globals.serverSynchronizationManager, Globals.playerManager, LoggerInterface.loggerEngine, RenderingEngine.screenFramebuffer, Globals.clientState, + Globals.serverState, }; for(Object object : objectsToCheck){ if(object != null){ diff --git a/src/test/java/electrosphere/test/testutils/TestEngineUtils.java b/src/test/java/electrosphere/test/testutils/TestEngineUtils.java index 6b954d9d..28e448ca 100644 --- a/src/test/java/electrosphere/test/testutils/TestEngineUtils.java +++ b/src/test/java/electrosphere/test/testutils/TestEngineUtils.java @@ -163,7 +163,7 @@ public class TestEngineUtils { */ public static void spawnPlayerEntity(){ ObjectTemplate creatureTemplate = ObjectTemplate.createDefault(EntityType.CREATURE, "human"); - ServerConnectionHandler serverConnection = Globals.server.getFirstConnection(); + ServerConnectionHandler serverConnection = Globals.serverState.server.getFirstConnection(); serverConnection.setCreatureTemplate(creatureTemplate); Character chara = Globals.characterService.createCharacter(creatureTemplate, serverConnection.getPlayerId()); serverConnection.setCharacterId(chara.getId()); diff --git a/src/test/java/electrosphere/test/testutils/TestViewportUtils.java b/src/test/java/electrosphere/test/testutils/TestViewportUtils.java index ac57cf10..2184bca2 100644 --- a/src/test/java/electrosphere/test/testutils/TestViewportUtils.java +++ b/src/test/java/electrosphere/test/testutils/TestViewportUtils.java @@ -34,7 +34,7 @@ public class TestViewportUtils { Entity creature = CreatureUtils.serverSpawnBasicCreature(Globals.realmManager.first(), new Vector3d(0,0,0), creatureType, creatureTemplate); //get required data - ServerConnectionHandler connectionHandler = Globals.server.getFirstConnection(); + ServerConnectionHandler connectionHandler = Globals.serverState.server.getFirstConnection(); Player playerObj = Globals.playerManager.getFirstPlayer(); //attach