protected override void OnUpdate() { base.OnUpdate(); var maxId = 0; foreach (var entity in resourceSet.GetEntities()) { maxId = Math.Max(maxId, entity.Get <AudioResource>().Id); } // for memory usage, don't put this call into the foreach since stackalloc is only freed when this method itself is finished Span <Entity> clientUpdated = stackalloc Entity[resourceSet.Count]; foreach (var(featureEntity, feature) in Features) { var update = false; var previousId = 0; if (!clientLastMaxId.TryGetValue(feature, out var clientMaxId) || clientMaxId < maxId) { previousId = clientMaxId; clientLastMaxId[feature] = maxId; update = true; } if (update) { var updatedCount = 0; foreach (var entity in resourceSet.GetEntities()) { if (entity.Get <AudioResource>().Id > previousId) { clientUpdated[updatedCount++] = entity; } } using var writer = new DataBufferWriter(updatedCount); writer.WriteInt((int)EAudioSendType.RegisterResource); writer.WriteInt(updatedCount); foreach (var entity in clientUpdated.Slice(0, updatedCount)) { writer.WriteInt(entity.Get <AudioResource>().Id); var typeMarker = writer.WriteInt(0); if (entity.TryGet(out AudioBytesData bytesData)) { writer.WriteInt((int)EAudioRegisterResourceType.Bytes, typeMarker); writer.WriteInt(bytesData.Value.Length); writer.WriteDataSafe(bytesData.Value.AsSpan(), default); } } if (feature.Driver.Broadcast(feature.PreferredChannel, writer.Span) < 0) { throw new InvalidOperationException("Couldn't send data!"); } } } }
public void Send(TransportConnection connection, int resource, ref Wav wav) { using var writer = new DataBufferWriter(0); writer.WriteInt((int)EAudioSendType.SendReplyResourceData); writer.WriteInt(resource); writer.WriteValue((double)wav.getLength()); foreach (var(_, feature) in Features) { feature.Driver.Send(default, connection, writer.Span);
public void SerializeBoard(ref DataBufferWriter buffer, GameWorld world, Span <GameEntityHandle> entities, ComponentBoardBase board) { Passed = 0; foreach (var entity in entities) { if (world.HasComponent <IntComponent>(entity)) { Passed++; } } }
public void Serialize <T>(Entity entity, T data) where T : ITransportableData { entity.Set(new TransportableDataType(typeof(T))); var buffer = new DataBufferWriter(data.GetCapacity()); buffer.WriteStaticString(typeof(T).AssemblyQualifiedName); data.Serialize(ref buffer); entity.Set(buffer); }
public override void OnBackendSet() { base.OnBackendSet(); connector = Backend.DstEntityManager.World .GetExistingSystem <GameHostConnector>(); Attach(connector.GetNotificationEvent <NoticeRpc>(), notice => { playButton.GetComponentInChildren <TextMeshProUGUI>().text = notice.IsConnectedToServer ? "Disconnect" : "Connect"; }); OnClick(playButton, async() => { var gameHostConnector = Backend.DstEntityManager.World .GetExistingSystem <GameHostConnector>(); using var buffer = new DataBufferWriter(128, Allocator.Temp); // TODO: REMAKE WITH NEW RPC SYSTEM /*if (noticeRpc.Notice.IsConnectedToServer) * { * gameHostConnector.BroadcastRequest("disconnect_from_server", buffer); * } * else * { * IsHidden = true; * * var endPoint = CreateIPEndPoint(inputField.text); * * buffer.WriteStaticString(JsonConvert.SerializeObject(new * { * Host = endPoint.Address.ToString(), * Port = (ushort) endPoint.Port * })); * * gameHostConnector.BroadcastRequest("connect_to_server", buffer); * }*/ });
protected override void OnUpdate() { base.OnUpdate(); if (withoutIdSet.Count > 0) { Span <Entity> entities = stackalloc Entity[withoutIdSet.Count]; withoutIdSet.GetEntities().CopyTo(entities); foreach (ref readonly var entity in entities) { entity.Set(new AudioPlayerId(selfLastMaxId++)); } } var maxId = 0; foreach (var entity in playerSet.GetEntities()) { maxId = Math.Max(maxId, entity.Get <AudioPlayerId>().Id); } // for memory usage, don't put this call into the foreach since stackalloc is only freed when this method itself is finished Span <Entity> clientUpdated = stackalloc Entity[playerSet.Count]; foreach (var(featureEntity, feature) in Features) { var update = false; var previousId = 0; if (!clientLastMaxId.TryGetValue(feature, out var clientMaxId) || clientMaxId < maxId) { previousId = clientMaxId; clientLastMaxId[feature] = maxId; update = true; } if (update) { var updatedCount = 0; foreach (var entity in playerSet.GetEntities()) { if (entity.Get <AudioPlayerId>().Id > previousId) { clientUpdated[updatedCount++] = entity; } } using var writer = new DataBufferWriter(updatedCount); writer.WriteInt((int)EAudioSendType.RegisterPlayer); writer.WriteInt(updatedCount); foreach (var entity in clientUpdated.Slice(0, updatedCount)) { writer.WriteInt(entity.Get <AudioPlayerId>().Id); writer.WriteStaticString(TypeExt.GetFriendlyName(entity.Get <AudioPlayerType>().Type)); } if (feature.Driver.Broadcast(feature.PreferredChannel, writer.Span) < 0) { throw new InvalidOperationException("Couldn't send data!"); } } } }
protected override void OnUpdate() { foreach (ref readonly var entity in playerSet.GetEntities()) { if (entity.TryGet(out AudioStartTime startTime)) { entity.Set(new AudioCurrentPlayTime(worldTime.Total - startTime.Value)); } } foreach (ref readonly var entity in playAudioSet.GetEntities()) { var resource = entity.Get <ResourceHandle <AudioResource> >(); if (!resource.IsLoaded) { continue; } var volume = 1f; if (entity.TryGet(out AudioVolumeComponent volumeComponent)) { volume = volumeComponent.Volume; } var delay = TimeSpan.Zero; if (entity.TryGet(out AudioDelayComponent delayComponent)) { delay = delayComponent.Delay; } using var writer = new DataBufferWriter(16 + Unsafe.SizeOf <SControllerEvent>()); writer.WriteValue((int)EAudioSendType.SendAudioPlayerData); writer.WriteStaticString(typeName); writer.WriteValue(new SControllerEvent { State = SControllerEvent.EState.Play, ResourceId = entity.Get <ResourceHandle <AudioResource> >().Result.Id, Player = entity.Get <AudioPlayerId>().Id, Volume = volume, Delay = delay }); entity.Set(new AudioStartTime { Value = worldTime.Total + delay }); foreach (var(_, feature) in Features) { unsafe { feature.Driver.Broadcast(feature.PreferredChannel, new Span <byte>((void *)writer.GetSafePtr(), writer.Length)); } } } foreach (ref readonly var entity in stopAudioSet.GetEntities()) { var delay = TimeSpan.Zero; if (entity.TryGet(out AudioDelayComponent delayComponent)) { delay = delayComponent.Delay; } using var writer = new DataBufferWriter(16 + Unsafe.SizeOf <SControllerEvent>()); writer.WriteValue((int)EAudioSendType.SendAudioPlayerData); writer.WriteStaticString(typeName); writer.WriteValue(new SControllerEvent { State = SControllerEvent.EState.Stop, Player = entity.Get <AudioPlayerId>().Id, Delay = delay }); foreach (var(_, feature) in Features) { unsafe { feature.Driver.Broadcast(feature.PreferredChannel, new Span <byte>((void *)writer.GetSafePtr(), writer.Length)); } } } playAudioSet.Remove <PlayAudioRequest>(); playAudioSet.Remove <StopAudioRequest>(); toDisposeSet.DisposeAllEntities(); }