using Common; using RpcComponents; using Unity.Burst; using Unity.Collections; using Unity.Entities; using Unity.Mathematics; using Unity.NetCode; using Unity.Rendering; using Unity.Transforms; using UnityEngine; namespace Server { [WorldSystemFilter(WorldSystemFilterFlags.ServerSimulation)] public partial struct ServerProcessGameEntryRequestSystem : ISystem { public void OnCreate(ref SystemState state) { state.RequireForUpdate(); var builder = new EntityQueryBuilder(Allocator.Temp).WithAll(); state.RequireForUpdate(state.GetEntityQuery(builder)); } public void OnUpdate(ref SystemState state) { var ecb = new EntityCommandBuffer(Allocator.Temp); var characterPrefab = SystemAPI.GetSingleton().Character; foreach (var (teamRequest, requestSource, requestEntity) in SystemAPI.Query().WithEntityAccess()) { //destroy request entity that only holds request ecb.DestroyEntity(requestEntity); //sync server connection entity with client connection entity ecb.AddComponent(requestSource.SourceConnection); var requestedTeam = teamRequest.Value; var requestedColor = teamRequest.Color; float3 spawnPosition = float3.zero; var clientId = SystemAPI.GetComponent(requestSource.SourceConnection).Value; switch (clientId) { case 1: spawnPosition = new float3(0f, 1f, 0f); break; case 2: spawnPosition = new float3(2f, 1f, 0f); break; } Debug.Log($"Server is assigning ClientId {clientId} to team {requestedTeam}"); var newCharacter = ecb.Instantiate(characterPrefab); ecb.SetName(newCharacter, "Character"); var newTransform = LocalTransform.FromPosition(spawnPosition); ecb.SetComponent(newCharacter, newTransform); ecb.SetComponent(newCharacter, new GhostOwner { NetworkId = clientId}); ecb.SetComponent(newCharacter, new TdTeam { Value = requestedTeam }); ecb.SetComponent(newCharacter, new CharacterConfig { Color = requestedColor }); //Destroy character prefab, when client disconnects ecb.AppendToBuffer(requestSource.SourceConnection, new LinkedEntityGroup{Value = newCharacter}); } ecb.Playback(state.EntityManager); } } }