예제 #1
0
        protected virtual void HandleClientCallFunction(LiteNetLibMessageHandler messageHandler)
        {
            var reader = messageHandler.reader;
            FunctionReceivers receivers = (FunctionReceivers)reader.GetByte();
            long connectId = 0;

            if (receivers == FunctionReceivers.Target)
            {
                connectId = (long)reader.GetPackedULong();
            }
            var info = LiteNetLibElementInfo.DeserializeInfo(reader);
            LiteNetLibIdentity identity;

            if (Assets.TryGetSpawnedObject(info.objectId, out identity))
            {
                if (receivers == FunctionReceivers.Server)
                {
                    identity.ProcessNetFunction(info, reader, true);
                }
                else
                {
                    var netFunction = identity.ProcessNetFunction(info, reader, false);
                    if (receivers == FunctionReceivers.Target)
                    {
                        netFunction.Call(connectId);
                    }
                    else
                    {
                        netFunction.Call(receivers);
                    }
                }
            }
        }
예제 #2
0
        protected virtual void HandleClientCallFunction(LiteNetLibMessageHandler messageHandler)
        {
            NetDataReader     reader    = messageHandler.reader;
            FunctionReceivers receivers = (FunctionReceivers)reader.GetByte();
            long connectionId           = -1;

            if (receivers == FunctionReceivers.Target)
            {
                connectionId = (long)reader.GetPackedULong();
            }
            LiteNetLibElementInfo info = LiteNetLibElementInfo.DeserializeInfo(reader);
            LiteNetLibIdentity    identity;

            if (Assets.TryGetSpawnedObject(info.objectId, out identity))
            {
                if (receivers == FunctionReceivers.Server)
                {
                    identity.ProcessNetFunction(info, reader, true);
                }
                else
                {
                    LiteNetLibFunction netFunction = identity.ProcessNetFunction(info, reader, false);
                    // Use call with out parameters set because parameters already set while process net function
                    if (receivers == FunctionReceivers.Target)
                    {
                        netFunction.CallWithoutParametersSet(connectionId);
                    }
                    else
                    {
                        netFunction.CallWithoutParametersSet(DeliveryMethod.ReliableOrdered, receivers);
                    }
                }
            }
        }
예제 #3
0
        protected void SendCall(FunctionReceivers receivers, long connectId)
        {
            var manager = Manager;
            var peers   = manager.Peers;

            if (manager.IsServer)
            {
                switch (receivers)
                {
                case FunctionReceivers.Target:
                    NetPeer targetPeer;
                    if (peers.TryGetValue(connectId, out targetPeer))
                    {
                        SendCallForServer(targetPeer, receivers, connectId);
                    }
                    break;

                case FunctionReceivers.All:
                    foreach (var peer in peers.Values)
                    {
                        SendCallForServer(peer, receivers, connectId);
                    }
                    break;
                }
            }
            else if (manager.IsClientConnected)
            {
                SendCallForClient(receivers, connectId);
            }
        }
 private void SerializeForClientSend(NetDataWriter writer, FunctionReceivers receivers, long connectionId)
 {
     writer.Put((byte)receivers);
     if (receivers == FunctionReceivers.Target)
     {
         writer.PutPackedLong(connectionId);
     }
     SerializeForSend(writer);
 }
        internal void CallWithoutParametersSet(FunctionReceivers receivers)
        {
            if (!CanSync())
            {
                return;
            }

            SendCall(0, DeliveryMethod.ReliableOrdered, receivers, ConnectionId);
        }
        public void CallWithoutParametersSet(DeliveryMethod deliveryMethod, FunctionReceivers receivers)
        {
            if (!ValidateBeforeAccess())
            {
                return;
            }

            SendCall(deliveryMethod, receivers, ConnectionId);
        }
 protected void SerializeForClient(NetDataWriter writer, FunctionReceivers receivers, long connectionId)
 {
     writer.Put((byte)receivers);
     if (receivers == FunctionReceivers.Target)
     {
         writer.PutPackedULong((ulong)connectionId);
     }
     SerializeForSend(writer);
 }
        public void Call(DeliveryMethod deliveryMethod, FunctionReceivers receivers, params object[] parameterValues)
        {
            if (!ValidateBeforeAccess())
            {
                return;
            }

            SetParameters(parameterValues);
            SendCall(deliveryMethod, receivers, ConnectionId);
        }
        internal void Call(byte dataChannel, DeliveryMethod deliveryMethod, FunctionReceivers receivers, params object[] parameterValues)
        {
            if (!CanSync())
            {
                return;
            }

            SetParameters(parameterValues);
            SendCall(dataChannel, deliveryMethod, receivers, ConnectionId);
        }
예제 #10
0
        public void Call(FunctionReceivers receivers, params object[] parameterValues)
        {
            if (!ValidateBeforeAccess())
            {
                return;
            }

            SetParameters(parameterValues);
            SendCall(receivers, Behaviour.ConnectionId);
        }
        protected void SendCall(DeliveryMethod deliveryMethod, FunctionReceivers receivers, long targetConnectionId)
        {
            LiteNetLibGameManager manager = Manager;

            if (manager.IsServer)
            {
                switch (receivers)
                {
                case FunctionReceivers.Target:
                    if (Identity.IsSubscribedOrOwning(targetConnectionId) && manager.ContainsConnectionId(targetConnectionId))
                    {
                        // Send function call message from server to target client by target connection Id
                        ServerSendCall(targetConnectionId, deliveryMethod);
                    }
                    break;

                case FunctionReceivers.All:
                    foreach (long connectionId in manager.GetConnectionIds())
                    {
                        if (Manager.ClientConnectionId == connectionId)
                        {
                            // This is host's networking oject, so hook callback immediately
                            // Don't have to send message to the client, because it is currently run as both server and client
                            HookCallback();
                        }
                        else if (Identity.IsSubscribedOrOwning(connectionId))
                        {
                            // Send message to subscribing clients
                            ServerSendCall(connectionId, deliveryMethod);
                        }
                    }
                    if (!Manager.IsClientConnected)
                    {
                        // It's not a host(client+host), it's just a server
                        // So hook callback immediately to do the function at server
                        HookCallback();
                    }
                    break;

                case FunctionReceivers.Server:
                    // Call server function at server
                    // So hook callback immediately to do the function at server
                    HookCallback();
                    break;
                }
            }
            else if (manager.IsClientConnected)
            {
                // Client send net function call to server
                // Then the server will hook callback or forward message to other clients
                ClientSendCall(deliveryMethod, receivers, targetConnectionId);
            }
        }
예제 #12
0
        protected virtual void HandleClientCallFunction(LiteNetLibMessageHandler messageHandler)
        {
            NetDataReader     reader    = messageHandler.reader;
            FunctionReceivers receivers = (FunctionReceivers)reader.GetByte();
            long connectionId           = -1;

            if (receivers == FunctionReceivers.Target)
            {
                connectionId = reader.GetPackedLong();
            }
            LiteNetLibElementInfo info = LiteNetLibElementInfo.DeserializeInfo(reader);
            LiteNetLibIdentity    identity;

            if (Assets.TryGetSpawnedObject(info.objectId, out identity))
            {
                LiteNetLibFunction netFunction = identity.GetNetFunction(info);
                if (netFunction == null)
                {
                    // There is no net function that player try to call (player may try to hack)
                    return;
                }
                if (!netFunction.CanCallByEveryone && messageHandler.connectionId != identity.ConnectionId)
                {
                    // The function not allowed anyone except owner client to call this net function
                    // And the client is also not the owner client
                    return;
                }
                if (receivers == FunctionReceivers.Server)
                {
                    // Request from client to server, so hook callback at server immediately
                    identity.ProcessNetFunction(netFunction, reader, true);
                }
                else
                {
                    // Request from client to other clients, so hook callback later
                    identity.ProcessNetFunction(netFunction, reader, false);
                    // Use call with out parameters set because parameters already set while process net function
                    if (receivers == FunctionReceivers.Target)
                    {
                        netFunction.CallWithoutParametersSet(connectionId);
                    }
                    else
                    {
                        netFunction.CallWithoutParametersSet(DeliveryMethod.ReliableOrdered, receivers);
                    }
                }
            }
        }
        public void CallNetFunction(string id, DeliveryMethod deliveryMethod, FunctionReceivers receivers, params object[] parameters)
        {
            int elementId;

            if (netFunctionIds.TryGetValue(id, out elementId))
            {
                Identity.netFunctions[elementId].Call(deliveryMethod, receivers, parameters);
            }
            else
            {
                if (Manager.LogError)
                {
                    Debug.LogError("[" + name + "] [" + TypeName + "] cannot call function, function [" + id + "] not found.");
                }
            }
        }
예제 #14
0
        public void CallNetFunction(string id, FunctionReceivers receivers, params object[] parameters)
        {
            ushort elementId;

            if (netFunctionIds.TryGetValue(id, out elementId))
            {
                var syncFunction = netFunctions[elementId];
                syncFunction.Call(receivers, parameters);
            }
            else
            {
                if (Manager.LogError)
                {
                    Debug.LogError("[" + name + "] [" + TypeName + "] cannot call function, function [" + id + "] not found.");
                }
            }
        }
예제 #15
0
        protected void SendCall(FunctionReceivers receivers, long targetConnectionId)
        {
            var manager = Manager;

            if (manager.IsServer)
            {
                switch (receivers)
                {
                case FunctionReceivers.Target:
                    if (Behaviour.Identity.IsSubscribedOrOwning(targetConnectionId) && manager.ContainsConnectionId(targetConnectionId))
                    {
                        ServerSendCall(targetConnectionId, receivers, targetConnectionId);
                    }
                    break;

                case FunctionReceivers.All:
                    foreach (var connectionId in manager.GetConnectionIds())
                    {
                        if (Behaviour.Identity.IsSubscribedOrOwning(connectionId))
                        {
                            ServerSendCall(connectionId, receivers, targetConnectionId);
                        }
                    }
                    if (!Manager.IsClientConnected)
                    {
                        HookCallback();
                    }
                    break;

                case FunctionReceivers.Server:
                    HookCallback();
                    break;
                }
            }
            else if (manager.IsClientConnected)
            {
                ClientSendCall(receivers, targetConnectionId);
            }
        }
        protected void SendCall(DeliveryMethod deliveryMethod, FunctionReceivers receivers, long targetConnectionId)
        {
            LiteNetLibGameManager manager = Manager;

            if (manager.IsServer)
            {
                switch (receivers)
                {
                case FunctionReceivers.Target:
                    if (Identity.IsSubscribedOrOwning(targetConnectionId) && manager.ContainsConnectionId(targetConnectionId))
                    {
                        ServerSendCall(targetConnectionId, deliveryMethod, receivers, targetConnectionId);
                    }
                    break;

                case FunctionReceivers.All:
                    foreach (long connectionId in manager.GetConnectionIds())
                    {
                        if (Identity.IsSubscribedOrOwning(connectionId))
                        {
                            ServerSendCall(connectionId, deliveryMethod, receivers, targetConnectionId);
                        }
                    }
                    if (!Manager.IsClientConnected)
                    {
                        HookCallback();
                    }
                    break;

                case FunctionReceivers.Server:
                    HookCallback();
                    break;
                }
            }
            else if (manager.IsClientConnected)
            {
                ClientSendCall(deliveryMethod, receivers, targetConnectionId);
            }
        }
예제 #17
0
 public void CallNetFunction <T1, T2>(NetFunctionDelegate <T1, T2> func, FunctionReceivers receivers, T1 param1, T2 param2)
 {
     CallNetFunction(func.Method.Name, DeliveryMethod.ReliableOrdered, receivers, param1, param2);
 }
 protected void ServerSendCall(long connectionId, DeliveryMethod deliveryMethod, FunctionReceivers receivers, long targetConnectionId)
 {
     SendingConnectionId = connectionId;
     Manager.ServerSendPacket(connectionId, deliveryMethod, LiteNetLibGameManager.GameMsgTypes.CallFunction, (writer) => SerializeForSend(writer));
 }
 protected void ClientSendCall(DeliveryMethod deliveryMethod, FunctionReceivers receivers, long targetConnectionId)
 {
     Manager.ClientSendPacket(deliveryMethod, LiteNetLibGameManager.GameMsgTypes.CallFunction, (writer) => SerializeForClient(writer, receivers, targetConnectionId));
 }
예제 #20
0
 protected void ClientSendCall(FunctionReceivers receivers, long targetConnectionId)
 {
     Manager.ClientSendPacket(SendOptions.ReliableOrdered, LiteNetLibGameManager.GameMsgTypes.ClientCallFunction, (writer) => SerializeForClient(writer, receivers, targetConnectionId));
 }
예제 #21
0
 protected void ServerSendCall(long connectionId, FunctionReceivers receivers, long targetConnectionId)
 {
     Manager.ServerSendPacket(connectionId, SendOptions.ReliableOrdered, LiteNetLibGameManager.GameMsgTypes.ServerCallFunction, (writer) => SerializeForSend(writer));
 }
예제 #22
0
 public void CallNetFunction(NetFunctionDelegate func, FunctionReceivers receivers)
 {
     CallNetFunction(func.Method.Name, DeliveryMethod.ReliableOrdered, receivers);
 }
        protected void SendCall(byte dataChannel, DeliveryMethod deliveryMethod, FunctionReceivers receivers, long targetConnectionId)
        {
            LiteNetLibGameManager manager = Manager;
            LiteNetLibServer      server  = manager.Server;
            LiteNetLibClient      client  = manager.Client;

            if (manager.IsServer)
            {
                switch (receivers)
                {
                case FunctionReceivers.Target:
                    if (Identity.HasSubscriberOrIsOwning(targetConnectionId) && manager.ContainsConnectionId(targetConnectionId))
                    {
                        // Prepare packet
                        TransportHandler.WritePacket(ServerWriter, GameMsgTypes.CallFunction);
                        SerializeForSend(ServerWriter);
                        // Send function call message from server to target client by target connection Id
                        server.SendMessage(targetConnectionId, dataChannel, deliveryMethod, ServerWriter);
                    }
                    break;

                case FunctionReceivers.All:
                    // Send to all connections
                    foreach (long connectionId in manager.GetConnectionIds())
                    {
                        if (manager.ClientConnectionId == connectionId)
                        {
                            // This is host's networking oject, so hook callback immediately
                            // Don't have to send message to the client, because it is currently run as both server and client
                            HookCallback();
                        }
                        else if (Identity.HasSubscriberOrIsOwning(connectionId))
                        {
                            // Prepare packet
                            TransportHandler.WritePacket(ServerWriter, GameMsgTypes.CallFunction);
                            SerializeForSend(ServerWriter);
                            // Send message to subscribing clients
                            server.SendMessage(connectionId, dataChannel, deliveryMethod, ServerWriter);
                        }
                    }
                    if (!manager.IsClientConnected)
                    {
                        // It's not a host(client+host), it's just a server
                        // So hook callback immediately to do the function at server
                        HookCallback();
                    }
                    break;

                case FunctionReceivers.Server:
                    // Call server function at server
                    // So hook callback immediately to do the function at server
                    HookCallback();
                    break;
                }
            }
            else if (manager.IsClientConnected)
            {
                // Prepare packet
                TransportHandler.WritePacket(ClientWriter, GameMsgTypes.CallFunction);
                SerializeForClientSend(ClientWriter, receivers, targetConnectionId);
                // Client send net function call to server
                // Then the server will hook callback or forward message to other clients
                client.SendMessage(dataChannel, deliveryMethod, ClientWriter);
            }
        }
예제 #24
0
 public void CallNetFunction <T1, T2, T3, T4, T5, T6>(NetFunctionDelegate <T1, T2, T3, T4, T5, T6> func, DeliveryMethod deliveryMethod, FunctionReceivers receivers, T1 param1, T2 param2, T3 param3, T4 param4, T5 param5, T6 param6)
 {
     CallNetFunction(func.Method.Name, deliveryMethod, receivers, param1, param2, param3, param4, param5, param6);
 }
예제 #25
0
 public void CallNetFunction <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(NetFunctionDelegate <T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> func, DeliveryMethod deliveryMethod, FunctionReceivers receivers, T1 param1, T2 param2, T3 param3, T4 param4, T5 param5, T6 param6, T7 param7, T8 param8, T9 param9, T10 param10)
 {
     CallNetFunction(func.Method.Name, deliveryMethod, receivers, param1, param2, param3, param4, param5, param6, param7, param8, param9, param10);
 }
예제 #26
0
 public void CallNetFunction <T1, T2, T3>(NetFunctionDelegate <T1, T2, T3> func, DeliveryMethod deliveryMethod, FunctionReceivers receivers, T1 param1, T2 param2, T3 param3)
 {
     CallNetFunction(func.Method.Name, deliveryMethod, receivers, param1, param2, param3);
 }
예제 #27
0
 public void CallNetFunction <T1>(NetFunctionDelegate <T1> func, DeliveryMethod deliveryMethod, FunctionReceivers receivers, T1 param1)
 {
     CallNetFunction(func.Method.Name, deliveryMethod, receivers, param1);
 }
예제 #28
0
 public void CallNetFunction(NetFunctionDelegate func, DeliveryMethod deliveryMethod, FunctionReceivers receivers)
 {
     CallNetFunction(func.Method.Name, deliveryMethod, receivers);
 }
예제 #29
0
 public void CallNetFunction <T1, T2, T3, T4, T5, T6, T7, T8, T9>(NetFunctionDelegate <T1, T2, T3, T4, T5, T6, T7, T8, T9> func, FunctionReceivers receivers, T1 param1, T2 param2, T3 param3, T4 param4, T5 param5, T6 param6, T7 param7, T8 param8, T9 param9)
 {
     CallNetFunction(func.Method.Name, DeliveryMethod.ReliableOrdered, receivers, param1, param2, param3, param4, param5, param6, param7, param8, param9);
 }
예제 #30
0
 public void CallNetFunction <T1, T2, T3, T4, T5>(NetFunctionDelegate <T1, T2, T3, T4, T5> func, FunctionReceivers receivers, T1 param1, T2 param2, T3 param3, T4 param4, T5 param5)
 {
     CallNetFunction(func.Method.Name, DeliveryMethod.ReliableOrdered, receivers, param1, param2, param3, param4, param5);
 }