/// <summary>
 ///     Registers all client side handlers.
 /// </summary>
 public static void RegisterClientHandlers([NotNull] QNetClient client)
 {
     if (client == null)
     {
         throw new ArgumentNullException(nameof(client), "Client is null.");
     }
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.LEVEL_LOADING, QNetHandlerWorldReceiver.OnServerLevelLoading));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.LEVEL_LOAD_ON_FLY_STARTING, QNetHandlerWorldReceiver.OnServerLevelLoadingOnFlyStarting));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.LEVEL_LOAD_ON_FLY_RUN, QNetHandlerWorldReceiver.OnServerLevelLoadingOnFlyRun));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.WORLD_SERIALIZING, QNetHandlerWorldReceiver.OnServerWorldSerializing));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.WORLD_SERIALIZATION, QNetHandlerWorldReceiver.OnServerWorldSerialization));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.OBJECT_CREATE, QNetHandlerObjectReceiver.OnServerObjectCreate));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.OBJECT_DELETE, QNetHandlerObjectReceiver.OnServerObjectDelete));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.OBJECT_STATE, QNetHandlerObjectReceiver.OnServerObjectState));
     client.SetHandler(new QNetMessage(false, (ushort)QNetUnityLocalHeader.ENTITY_QUERY, QNetHandlerObjectReceiver.OnClientEntityQuery));
 }
Beispiel #2
0
 /// <summary>
 ///     Sends message to server.
 /// </summary>
 /// <param name="client">The Client.</param>
 /// <param name="channel">Channel of message.</param>
 /// <param name="method">Method of message sending.</param>
 /// <param name="writer">Message to send.</param>
 public static void Send(this QNetClient client, QNetUnityLocalChannel channel, QNetMessageMethod method,
                         QNetMessageWriter writer)
 {
     client.Send((byte)channel, method, writer);
 }
Beispiel #3
0
 /// <summary>
 ///     Sends message to given connection.
 /// </summary>
 /// <param name="client">The Client.</param>
 /// <param name="channel">Channel of message.</param>
 /// <param name="method">Method of message sending.</param>
 /// <param name="header"></param>
 /// <param name="args">Additional parameters.</param>
 public static void Send(this QNetClient client, QNetLocalChannel channel, QNetMessageMethod method,
                         QNetUnityLocalHeader header, params object[] args)
 {
     client.Send((byte)channel, method, (ushort)header, args);
 }
Beispiel #4
0
 /// <summary>
 ///     Sends message to server.
 /// </summary>
 /// <param name="client">The Client.</param>
 /// <param name="channel">Channel of message.</param>
 /// <param name="method">Method of message sending.</param>
 /// <param name="header">Header.</param>
 public static void Send(this QNetClient client, QNetUnityLocalChannel channel, QNetMessageMethod method,
                         QNetUnityLocalHeader header)
 {
     client.Send((byte)channel, method, (ushort)header);
 }
Beispiel #5
0
        /// <summary>
        ///     Starts client connection.
        /// </summary>
        public static void StartClient([NotNull] string ipAddress, ushort port, string password)
        {
            if (IsClientActive)
            {
                throw new InvalidOperationException(
                          "QNet is unable to start client while there is already active instance of client.");
            }
            if (ipAddress == null)
            {
                throw new ArgumentNullException(nameof(ipAddress));
            }

            var configuration = new QNetConfiguration
            {
                IpAddress      = ipAddress,
                Port           = port,
                MaxConnections = 2
            };

            if (OnClientPrepare == null)
            {
                throw new NullReferenceException("QNet is unable to start client. OnClientPrepare event is not set.");
            }

            Client = new QNetClient();
            Client = InternalStartPeer(Client, configuration, () =>
            {
                QNetHandlerStack.RegisterClientHandlers(Client);
                OnClientRegisterHeaders?.Invoke();
            });
            OnClientPrepare.Invoke(out var nickname, out var token);

            Client.OnMessagePoll += reader =>
            {
                // as the server always send the server frame
                // we need to read that right here
                QNetSimulation.ReceivedServerFrame = reader.ReadUInt32();
                QNetSimulation.AdjustServerFrames  = QNetSimulation.ReceivedServerFrame > QNetTime.ServerFrame;
            };

            Client.OnConnectionReady += (reader, writer) =>
            {
                var tickRate    = reader.ReadInt32();
                var frameNumber = reader.ReadUInt32();

                // set TickRate
                QNetTime.TickRate = tickRate;

                // initialize server frame count
                QNetSimulation.ReceivedServerFrame  = frameNumber;
                QNetSimulation.EstimatedServerFrame = frameNumber;

                // write player data
                writer.WriteString(nickname);
                writer.WriteUInt32(token);
                writer.WriteString(JEMBuild.BuildVersion);
                OnClientReady?.Invoke(reader, writer);
            };

            Client.OnDisconnection += (lostConnection, reason) =>
            {
                // stop peer
                if (InternalRunningPeers.Contains(Client))
                {
                    InternalStopPeer(Client, reason);
                }

                // update active state
                IsClientActive = false;

                // and de-initialize game
                if (!IsHostActive && QNetGameInitializer.GameInitialized && !QNetGameInitializer.GameIsDeInitializing
                    ) // ignore if host, server will de-initialize it anyway
                {
                    QNetGameInitializer.DeInitialize(() =>
                    {
                        OnClientDisconnected?.Invoke(IsHostActive, lostConnection, reason);
                    });
                }
                else
                {
                    if (!QNetGameInitializer.GameInitialized && !QNetGameInitializer.GameIsInitializing)
                    {
                        OnClientDisconnected?.Invoke(IsHostActive, lostConnection, reason);
                    }
                }
            };

            IsClientActive = true;
        }