示例#1
0
        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);
示例#3
0
 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++;
         }
     }
 }
示例#4
0
        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);
                 * }*/
            });
示例#6
0
        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();
        }