netcode progress, scene duplication inprog

This commit is contained in:
2024-03-12 21:13:37 +02:00
parent 2900fae101
commit a5aed4266d
4 changed files with 79 additions and 9 deletions

View File

@@ -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
}
}
]
}

View File

@@ -138,7 +138,7 @@ namespace Game
LoadConfig();
//GameMode.Connect();
//WorldStateManager.Init();
//NetworkManager.StartServer();
NetworkManager.StartServer();
//GameMode.StartServer(true);
}

View File

@@ -140,6 +140,11 @@ namespace Game
clientWorldStateManager.Cleanup();
clientWorldStateManager = null;
}
if (serverWorldStateManager != null)
{
serverWorldStateManager.Cleanup();
serverWorldStateManager = null;
}
StopRecording();

View File

@@ -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<PlayerActor>())
if (scene)
foreach (var player in scene.GetChildren<PlayerActor>())
{
FlaxEngine.Object.Destroy(player);
}
@@ -232,7 +269,7 @@ namespace Game
// return;
if (welcomed)
foreach (PlayerActor playerActor in Level.GetActors<PlayerActor>())
foreach (PlayerActor playerActor in scene.GetChildren<PlayerActor>())
{
var playerId = playerActor.PlayerId;
if (!clientWorldState.playerFrameHistory.ContainsKey(playerId))
@@ -251,7 +288,7 @@ namespace Game
clientWorldState.frame++;
/*PlayerActor playerActor = Level.GetActors<PlayerActor>().FirstOrDefault(x =>
/*PlayerActor playerActor = scene.GetChildren<PlayerActor>().FirstOrDefault(x =>
x.GetScript<PlayerMovement>().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<PlayerActor>().FirstOrDefault(x =>
PlayerActor playerActor = scene.GetChildren<PlayerActor>().FirstOrDefault(x =>
x.GetScript<PlayerMovement>().PlayerId == reportedPlayerId);
@@ -523,7 +560,7 @@ namespace Game
if (NetworkManager.LocalPlayerClientId == 0)
NetworkManager.LocalPlayerClientId = playerId;
var spawns = Level.GetActors<Actor>().Where(x => x.Name.StartsWith("PlayerSpawn_")).ToArray();
var spawns = worldSpawn.GetChildren<Actor>().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 playerActor = SpawnActor<PlayerActor>(playerPrefab);
playerActor.Initialize(playerId, position, eulerAngles);
//playerActor.Teleport(position, eulerAngles);
@@ -590,6 +627,13 @@ namespace Game
}
}
private T SpawnActor<T>(Prefab prefab) where T : Actor
{
T actor = PrefabManager.SpawnPrefab(prefab, scene).As<T>();
actor.PhysicsScene = scene.PhysicsScene;
return actor;
}
private void UpdatePlayerInput(uint playerId, PlayerInputState inputState)
{
if (playerId == NetworkManager.LocalPlayerClientId)