From a5aed4266de723eced3c81e1f7c1aadab8c2cb5d Mon Sep 17 00:00:00 2001 From: Ari Vuollet Date: Tue, 12 Mar 2024 21:13:37 +0200 Subject: [PATCH] netcode progress, scene duplication inprog --- Content/Scenes/LocalClientScene.scene | 21 ++++++++ Source/Game/Console/ConsolePlugin.cs | 2 +- Source/Game/GameMode/NetworkManager.cs | 5 ++ Source/Game/GameMode/WorldStateManager.cs | 60 ++++++++++++++++++++--- 4 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 Content/Scenes/LocalClientScene.scene diff --git a/Content/Scenes/LocalClientScene.scene b/Content/Scenes/LocalClientScene.scene new file mode 100644 index 0000000..4cb995a --- /dev/null +++ b/Content/Scenes/LocalClientScene.scene @@ -0,0 +1,21 @@ +{ + "ID": "c095f9ac4989a46afd7fe3821f086e2e", + "TypeName": "FlaxEngine.SceneAsset", + "EngineBuild": 65045, + "Data": [ + { + "ID": "c095f9ac4989a46afd7fe3821f086e2e", + "TypeName": "FlaxEngine.Scene", + "LightmapSettings": { + "IndirectLightingIntensity": 1.0, + "GlobalObjectsScale": 1.0, + "ChartsPadding": 3, + "AtlasSize": 1024, + "BounceCount": 1, + "CompressLightmaps": true, + "UseGeometryWithNoMaterials": true, + "Quality": 10 + } + } + ] +} \ No newline at end of file diff --git a/Source/Game/Console/ConsolePlugin.cs b/Source/Game/Console/ConsolePlugin.cs index 859b609..9b7eb85 100644 --- a/Source/Game/Console/ConsolePlugin.cs +++ b/Source/Game/Console/ConsolePlugin.cs @@ -138,7 +138,7 @@ namespace Game LoadConfig(); //GameMode.Connect(); //WorldStateManager.Init(); - //NetworkManager.StartServer(); + NetworkManager.StartServer(); //GameMode.StartServer(true); } diff --git a/Source/Game/GameMode/NetworkManager.cs b/Source/Game/GameMode/NetworkManager.cs index 351c12b..e4f8693 100644 --- a/Source/Game/GameMode/NetworkManager.cs +++ b/Source/Game/GameMode/NetworkManager.cs @@ -140,6 +140,11 @@ namespace Game clientWorldStateManager.Cleanup(); clientWorldStateManager = null; } + if (serverWorldStateManager != null) + { + serverWorldStateManager.Cleanup(); + serverWorldStateManager = null; + } StopRecording(); diff --git a/Source/Game/GameMode/WorldStateManager.cs b/Source/Game/GameMode/WorldStateManager.cs index 3f1ed6e..bdf11fa 100644 --- a/Source/Game/GameMode/WorldStateManager.cs +++ b/Source/Game/GameMode/WorldStateManager.cs @@ -5,6 +5,7 @@ using System.IO; using System.Linq; using FlaxEngine; using FlaxEngine.Assertions; +using FlaxEngine.Json; using FlaxEngine.Networking; using Console = Game.Console; @@ -54,6 +55,8 @@ namespace Game private WorldState serverWorldState; private WorldState clientWorldState; private GameMode gameMode; + private Scene scene; + private Actor worldSpawn; private ulong lastReceivedServerFrame = 0; public ulong ServerFrame => /*NetworkManager.server != null ? serverWorldState.frame :*/ lastReceivedServerFrame; @@ -94,9 +97,42 @@ namespace Game NetworkManager.RegisterServerMessageCallback(OnMessage); else NetworkManager.RegisterClientMessageCallback(OnMessage); + + if (IsLocalClient) + { + PhysicsScene localPhysicsScene = Physics.FindOrCreateScene("LocalPhysicsScene"); + + Guid localClientSceneGuid = JsonSerializer.ParseID("c095f9ac4989a46afd7fe3821f086e2e"); + + var onSceneLoaded = (Scene loadedScene, Guid id) => + { + if (localClientSceneGuid == id) + { + loadedScene.PhysicsScene = localPhysicsScene; + scene = loadedScene; + } + }; + + try + { + Level.SceneLoaded += onSceneLoaded; + Level.LoadScene(new SceneReference(localClientSceneGuid)); + } + finally + { + Level.SceneLoaded -= onSceneLoaded; + } + } + else + scene = Level.GetScene(0); + Assert.IsTrue(scene); + Level.SceneLoaded += OnLevelLoaded; //Scripting.LateUpdate += OnLateUpdatePre; Scripting.LateFixedUpdate += OnLateUpdatePre; + + worldSpawn = scene.FindActor("WorldSpawn") ?? Level.FindActor("WorldSpawn"); + Assert.IsTrue(worldSpawn); } public void Cleanup() @@ -110,7 +146,8 @@ namespace Game //Scripting.LateUpdate -= OnLateUpdatePre; Scripting.LateFixedUpdate -= OnLateUpdatePre; - foreach (var player in Level.GetActors()) + if (scene) + foreach (var player in scene.GetChildren()) { FlaxEngine.Object.Destroy(player); } @@ -232,7 +269,7 @@ namespace Game // return; if (welcomed) - foreach (PlayerActor playerActor in Level.GetActors()) + foreach (PlayerActor playerActor in scene.GetChildren()) { var playerId = playerActor.PlayerId; if (!clientWorldState.playerFrameHistory.ContainsKey(playerId)) @@ -251,7 +288,7 @@ namespace Game clientWorldState.frame++; - /*PlayerActor playerActor = Level.GetActors().FirstOrDefault(x => + /*PlayerActor playerActor = scene.GetChildren().FirstOrDefault(x => x.GetScript().PlayerId == NetworkManager.LocalPlayerClientId); if (playerActor == null) @@ -445,7 +482,7 @@ namespace Game lastReceivedServerFrame = reportedFrame; //Console.Print($"we drifted, corrected. client frame: {serverWorldState.frame}, server frame: {reportedFrame}"); - PlayerActor playerActor = Level.GetActors().FirstOrDefault(x => + PlayerActor playerActor = scene.GetChildren().FirstOrDefault(x => x.GetScript().PlayerId == reportedPlayerId); @@ -523,7 +560,7 @@ namespace Game if (NetworkManager.LocalPlayerClientId == 0) NetworkManager.LocalPlayerClientId = playerId; - var spawns = Level.GetActors().Where(x => x.Name.StartsWith("PlayerSpawn_")).ToArray(); + var spawns = worldSpawn.GetChildren().Where(x => x.Name.StartsWith("PlayerSpawn_")).ToArray(); Console.Print($"found {spawns.Length} spawns"); var randomSpawn = spawns.First(); @@ -563,8 +600,8 @@ namespace Game if (IsServer && !playerLastFrame.ContainsKey(playerId)) playerLastFrame.Add(playerId, serverWorldState.frame); - if (IsLocalClient && playerId == NetworkManager.LocalPlayerClientId) - return; // Handled by listenserver + //if (IsLocalClient && playerId == NetworkManager.LocalPlayerClientId) + // return; // Handled by listenserver //spawned = true; @@ -573,7 +610,7 @@ namespace Game if (playerPrefab == null) Console.PrintError("GameModeManager: Failed to find PlayerPrefab"); - PlayerActor playerActor = PrefabManager.SpawnPrefab(playerPrefab).As(); + PlayerActor playerActor = SpawnActor(playerPrefab); playerActor.Initialize(playerId, position, eulerAngles); //playerActor.Teleport(position, eulerAngles); @@ -590,6 +627,13 @@ namespace Game } } + private T SpawnActor(Prefab prefab) where T : Actor + { + T actor = PrefabManager.SpawnPrefab(prefab, scene).As(); + actor.PhysicsScene = scene.PhysicsScene; + return actor; + } + private void UpdatePlayerInput(uint playerId, PlayerInputState inputState) { if (playerId == NetworkManager.LocalPlayerClientId)