Progress network character controls

This commit is contained in:
Lauchstange committed 2025-02-12 21:59:30 +01:00
1 parent 01f38a19a1
commit 0cb70d4042
51 files changed
+297 -2093

No files matched your search

@@ -11,6 +11,7 @@ namespace Client
{
private EntityQuery _pendingNetworkIdQuery;
[BurstCompile]
public void OnCreate(ref SystemState state)
{
//Get all entities connected to the server (having networkID), but not in game yet (no NetworkStreamInGame)
@@ -22,11 +23,16 @@ namespace Client
state.RequireForUpdate<ClientTeamRequest>();
}
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
//Get Requested team and all network ids that want to join
var teamrequest = SystemAPI.GetSingleton<ClientTeamRequest>();
var ecb = new EntityCommandBuffer(Allocator.Temp);
var ecb = SystemAPI.GetSingletonRW<EndSimulationEntityCommandBufferSystem.Singleton>().ValueRW
.CreateCommandBuffer(state.WorldUnmanaged);
var pendingNetworkIds = _pendingNetworkIdQuery.ToEntityArray(Allocator.Temp);
foreach (var pendingNetworkId in pendingNetworkIds)
@@ -49,9 +55,6 @@ namespace Client
TargetConnection = pendingNetworkId
});
}
//Broadcast Rpc - playback disposes of ecb
ecb.Playback(state.EntityManager);
}
}
}
@@ -14,6 +14,7 @@ namespace Server
[WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)]
public partial struct ServerProcessGameEntryRequestSystem : ISystem
{
[BurstCompile]
public void OnCreate(ref SystemState state)
{
state.RequireForUpdate<TdPrefabs>();
@@ -22,21 +23,19 @@ namespace Server
}
[BurstCompile]
public void OnUpdate(ref SystemState state)
{
var ecb = new EntityCommandBuffer(Allocator.Temp);
// var ecb = new EntityCommandBuffer(Allocator.Temp);
var ecb = SystemAPI.GetSingletonRW<EndSimulationEntityCommandBufferSystem.Singleton>().ValueRW
.CreateCommandBuffer(state.WorldUnmanaged);
var tdPrefabs = SystemAPI.GetSingleton<TdPrefabs>();
var characterPrefab = tdPrefabs.Character;
var fpsPlayerPrefab = tdPrefabs.FPSPlayer;
foreach (var (teamRequest, requestSource, requestEntity) in SystemAPI.Query<TdTeamRequest, ReceiveRpcCommandRequest>().WithEntityAccess())
{
//destroy request entity that only holds request
ecb.DestroyEntity(requestEntity);
//sync server connection entity with client connection entity
ecb.AddComponent<NetworkStreamInGame>(requestSource.SourceConnection);
var requestedTeam = teamRequest.Value;
var requestedColor = teamRequest.Color;
@@ -54,37 +53,47 @@ namespace Server
break;
}
Debug.Log($"Server is assigning ClientId {clientId} to team {requestedTeam}");
var newCharacter = ecb.Instantiate(characterPrefab);
var newFPSPlayer = ecb.Instantiate(fpsPlayerPrefab);
ecb.SetName(newCharacter, "Character");
//instantiate prefab
var characterEntity = ecb.Instantiate(tdPrefabs.Character);
var playerEntity = ecb.Instantiate(tdPrefabs.FPSPlayer);
//Destroy character prefab, when client disconnects
ecb.AppendToBuffer(requestSource.SourceConnection, new LinkedEntityGroup{Value = characterEntity});
ecb.AppendToBuffer(requestSource.SourceConnection, new LinkedEntityGroup{Value = playerEntity});
//Setup ghost owner
ecb.SetComponent(characterEntity, new GhostOwner { NetworkId = clientId});
ecb.SetComponent(playerEntity, new GhostOwner { NetworkId = clientId});
ecb.SetName(characterEntity, "Character");
//Set position
var newTransform = LocalTransform.FromPosition(spawnPosition);
ecb.SetComponent(newCharacter, newTransform);
ecb.SetComponent(characterEntity, newTransform);
ecb.SetComponent(newCharacter, new GhostOwner { NetworkId = clientId});
ecb.SetComponent(newFPSPlayer, new GhostOwner { NetworkId = clientId});
ecb.SetComponent(newCharacter, new TdTeam { Value = requestedTeam });
//Set config and Team
ecb.SetComponent(characterEntity, new TdTeam { Value = requestedTeam });
ecb.SetComponent(newCharacter, new CharacterConfig
ecb.SetComponent(characterEntity, new CharacterConfig
{
Color = requestedColor
});
//Setup connection
FirstPersonPlayer playerComponent = SystemAPI.GetComponent<FirstPersonPlayer>(tdPrefabs.FPSPlayer);
playerComponent.ControlledCharacter = newCharacter;
ecb.SetComponent(newFPSPlayer, playerComponent);
playerComponent.ControlledCharacter = characterEntity;
ecb.SetComponent(playerEntity, playerComponent);
//Destroy character prefab, when client disconnects
ecb.AppendToBuffer(requestSource.SourceConnection, new LinkedEntityGroup{Value = newCharacter});
ecb.AppendToBuffer(requestSource.SourceConnection, new LinkedEntityGroup{Value = newFPSPlayer});
//sync server connection entity with client connection entity
ecb.AddComponent<NetworkStreamInGame>(requestSource.SourceConnection);
//destroy request entity that only holds request
ecb.DestroyEntity(requestEntity);
}
ecb.Playback(state.EntityManager);
}
}
}