/// <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)); }
/// <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); }
/// <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); }
/// <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); }
/// <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; }