netcode progress, scene duplication inprog
This commit is contained in:
21
Content/Scenes/LocalClientScene.scene
Normal file
21
Content/Scenes/LocalClientScene.scene
Normal 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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -138,7 +138,7 @@ namespace Game
|
||||
LoadConfig();
|
||||
//GameMode.Connect();
|
||||
//WorldStateManager.Init();
|
||||
//NetworkManager.StartServer();
|
||||
NetworkManager.StartServer();
|
||||
|
||||
//GameMode.StartServer(true);
|
||||
}
|
||||
|
||||
@@ -140,6 +140,11 @@ namespace Game
|
||||
clientWorldStateManager.Cleanup();
|
||||
clientWorldStateManager = null;
|
||||
}
|
||||
if (serverWorldStateManager != null)
|
||||
{
|
||||
serverWorldStateManager.Cleanup();
|
||||
serverWorldStateManager = null;
|
||||
}
|
||||
|
||||
StopRecording();
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user