コード例 #1
0
 private bool OnCreatePlayer(NeutronStream.IReader reader, bool isServer, bool isMine, NeutronPlayer player, Neutron instance)
 {
     if (instance.EndPlayer(reader, out var pos, out var rot))
     {
         NeutronSchedule.ScheduleTask(() =>
         {
             Neutron.NetworkSpawn(isServer, false, player, _player, pos, rot, instance);
         });
     }
コード例 #2
0
 private void ProcessMessage(NeutronPlayer player, string message)
 {
     NeutronSchedule.ScheduleTask(() =>
     {
         _rcvField.text += $"{player.Nickname}: {message}\n";
         _rcvField.verticalScrollbar.value = 1;
         //* Move to receive field to last message.
         _rcvField.MoveTextEnd(false);
     });
 }
コード例 #3
0
        /// <summary>
        ///* Post a request to the specified url.<br/>
        /// </summary>
        /// <param name="url">The url to post the request.</param>
        /// <param name="formData">The form data to post the request.</param>
        /// <param name="onResult">The callback to invoke when the request is finished.</param>
        public static void Post(string url, Dictionary <string, string> formData, Action <UnityWebRequest> onResult)
        {
            IEnumerator Request()
            {
                UnityWebRequest request = UnityWebRequest.Post(url, formData);

                yield return(request.SendWebRequest());

                onResult.Invoke(request);
            }

            NeutronSchedule.ScheduleTask(Request());
        }
コード例 #4
0
        /// <summary>
        ///* Get a request to the specified url.<br/>
        /// </summary>
        /// <param name="url">The url to get the request.</param>
        /// <param name="onResult">The callback to invoke when the request is finished.</param>
        public static void Get(string url, Action <UnityWebRequest> onResult)
        {
            IEnumerator Request()
            {
                UnityWebRequest request = UnityWebRequest.Get(url);

                yield return(request.SendWebRequest());

                onResult.Invoke(request);
            }

            NeutronSchedule.ScheduleTask(Request());
        }
コード例 #5
0
        private void OnTeleport(Vector3 position)
        {
            NeutronSchedule.ScheduleTask(() =>
            {
                if (!(Vector3.Distance(transform.localPosition, position) > _teleportMaxDistance))
                {
                    return;
                }

                transform.localPosition = position;
                lock (_bufferLock)
                    Clear();
            });
        }
コード例 #6
0
        /// <summary>
        ///* Post a request to the specified url.<br/>
        /// </summary>
        /// <param name="url">The url to post the request.</param>
        /// <param name="formData">The form data to post the request.</param>
        /// <param name="onAwake">The callback to invoke when the request is initialized.</param>
        /// <param name="onResult">The callback to invoke when the request is finished.</param>
        public static Task PostAsync(string url, Dictionary <string, string> formData, Action <UnityWebRequest> onResult)
        {
            TaskCompletionSource <bool> task = new TaskCompletionSource <bool>();

            IEnumerator Request()
            {
                UnityWebRequest request = UnityWebRequest.Post(url, formData);

                yield return(request.SendWebRequest());

                onResult.Invoke(request);
                task.TrySetResult(true);
            }

            NeutronSchedule.ScheduleTask(Request());
            return(task.Task);
        }
コード例 #7
0
        /// <summary>
        ///* Get a request to the specified url.<br/>
        /// </summary>
        /// <param name="url">The url to get the request.</param>
        /// <param name="onAwake">The callback to invoke when the request is initialized.</param>
        /// <param name="onResult">The callback to invoke when the request is finished.</param>
        public static Task GetAsync(string url, Action <UnityWebRequest> onAwake, Action <UnityWebRequest> onResult)
        {
            TaskCompletionSource <bool> task = new TaskCompletionSource <bool>();

            IEnumerator Request()
            {
                UnityWebRequest request = UnityWebRequest.Get(url);

                onAwake.Invoke(request);
                yield return(request.SendWebRequest());

                onResult.Invoke(request);
                task.TrySetResult(true);
            }

            NeutronSchedule.ScheduleTask(Request());
            return(task.Task);
        }
コード例 #8
0
        private void ClientsProcessingStack()
        {
            CancellationToken token     = TokenSource.Token;
            TcpClient         tcpClient = _acceptedClients.Pull(); //* Take the client from the queue and block the thread if there is no client.

            if (tcpClient != null)
            {
                if (PlayerHelper.GetAvailableID(out int Id))
                {
                    //* Create the player.
                    if (SocketHelper.AllowConnection(tcpClient))
                    {
                        tcpClient.NoDelay           = Helper.GetSettings().GlobalSettings.NoDelay;    //* Set the no delay, fast send.
                        tcpClient.ReceiveBufferSize = Helper.GetConstants().Tcp.TcpReceiveBufferSize; //* Set the receive buffer size.
                        tcpClient.SendBufferSize    = Helper.GetConstants().Tcp.TcpSendBufferSize;    //* Set the send buffer size.
                        var player = new NeutronPlayer(Id, tcpClient, new CancellationTokenSource()); //* Create the player.
                        if (SocketHelper.AddPlayer(player))
                        {
                            Interlocked.Increment(ref _playerCount); //* Increment the player count.

                            #region View
                            NeutronSchedule.ScheduleTask(() =>
                            {
                                GameObject playerGlobalController = GameObject.Instantiate(PlayerGlobalController.gameObject); //* Create the player global controller.
                                playerGlobalController.hideFlags  = HideFlags.HideInHierarchy;                                 //* Hide the player global controller.
                                playerGlobalController.name       = $"Player Global Controller[{player.Id}]";                  //* Set the name of the player global controller.
                                foreach (Component component in playerGlobalController.GetComponents <Component>())
                                {
                                    Type type = component.GetType();
                                    if (type.BaseType != typeof(PlayerGlobalController) && type != typeof(Transform))
                                    {
                                        GameObject.Destroy(component); //* Destroy all components except the player global controller.
                                    }
                                    else
                                    {
                                        if (type.BaseType == typeof(PlayerGlobalController))
                                        {
                                            var controller    = (PlayerGlobalController)component;
                                            controller.Player = player; //* Set the player.
                                        }
                                    }
                                }
                                SceneHelper.MoveToContainer(playerGlobalController, "Server(Container)"); //* Move the player global controller to the container.
                            });
                            #endregion

                            IPEndPoint tcpRemote = (IPEndPoint)player.TcpClient.Client.RemoteEndPoint; //* Get the remote end point.
                            IPEndPoint tcpLocal  = (IPEndPoint)player.TcpClient.Client.LocalEndPoint;  //* Get the local end point.
                            IPEndPoint udpLocal  = (IPEndPoint)player.UdpClient.Client.LocalEndPoint;
                            //***************************************************************************************************************************************************************************************************************************************************************
                            LogHelper.Info($"\r\nIncoming Client -> Ip: [{tcpRemote.Address.ToString().Bold()}] & Port: [Tcp: {tcpRemote.Port.ToString().Bold()} | Udp: {tcpRemote.Port.ToString().Bold()} - {udpLocal.Port.ToString().Bold()}] -> Id: {Id}\r\n");
#if UNITY_EDITOR
                            if (Helper.GetSettings().ServerSettings.FiltersLog)
                            {
                                LogHelper.Info("\r\nFilters(Server->Client): ".Italic() + $"(tcp.SrcPort == {tcpLocal.Port}) or (udp.SrcPort == {udpLocal.Port})".Bold().Color("yellow") + "\r\n");
                                LogHelper.Info("\r\nFilters(Client->Server): ".Italic() + $"(tcp.SrcPort == {tcpRemote.Port}) or (udp.SrcPort == {tcpRemote.Port})".Bold().Color("yellow") + "\r\n");
                                LogHelper.Info("\r\nFilters(Client->Server->Client): ".Italic() + $"((tcp.SrcPort == {tcpRemote.Port}) or (udp.SrcPort == {tcpRemote.Port})) or ((tcp.SrcPort == {tcpLocal.Port}) or (udp.SrcPort == {udpLocal.Port}))".Bold().Color("yellow") + "\r\n");
                            }
                            //***************************************************************************************************************************************************************************************************************************************************************
                            filter_tcp_udp_client_server.Append($"\r\n{((_playerCount > 1) ? " or " : string.Empty)}((tcp.SrcPort == {tcpRemote.Port}) or (udp.SrcPort == {tcpRemote.Port})) or ((tcp.SrcPort == {tcpLocal.Port}) or (udp.SrcPort == {udpLocal.Port}))");
                            filter_udp_client_server.Append($"\r\n{((_playerCount > 1) ? " or " : string.Empty)}((udp.SrcPort == {tcpRemote.Port}) or (udp.SrcPort == {udpLocal.Port}))");
                            filter_tcp_client_server.Append($"\r\n{((_playerCount > 1) ? " or " : string.Empty)}((tcp.SrcPort == {tcpRemote.Port}) or (tcp.SrcPort == {tcpLocal.Port}))");
                            filter_tcp_client.Append($"\r\n{((_playerCount > 1) ? " or " : string.Empty)}(tcp.SrcPort == {tcpRemote.Port})");
                            filter_tcp_server.Append($"\r\n{((_playerCount > 1) ? " or " : string.Empty)}(tcp.SrcPort == {tcpLocal.Port})");
                            filter_udp_client.Append($"\r\n{((_playerCount > 1) ? " or " : string.Empty)}(udp.SrcPort == {tcpRemote.Port})");
                            filter_udp_server.Append($"\r\n{((_playerCount > 1) ? " or " : string.Empty)}(udp.SrcPort == {udpLocal.Port})");
#endif
                            if (!NeutronModule.IsUnityThread)
                            {
                                ThreadPool.QueueUserWorkItem((e) =>
                                {
                                    OnReceivingDataLoop(player.NetworkStream, player, Protocol.Tcp);
                                    OnReceivingDataLoop(player.NetworkStream, player, Protocol.Udp);
                                });
                            }
                        }
                        else
                        {
                            if (!LogHelper.Error("Failed to add Player!"))
                            {
                                player.Dispose();
                            }
                        }
                    }
                    else
                    {
                        if (!LogHelper.Error("Client not allowed!"))
                        {
                            tcpClient.Close();
                        }
                    }
                }
                else
                {
                    if (!LogHelper.Error("Max players reached!"))
                    {
                        tcpClient.Close();
                    }
                }
            }
        }