Beispiel #1
0
    //Send RPC to server
    public static void SendRPC(uint viewID, string methodname, RPCTarget target, params NGAny[] parameters)
    {
        SendMessage message = new SendMessage();

        message.MsgType              = MessageType.Rpc;
        message.RpcParams            = new RPCParams();
        message.RpcParams.MethodName = methodname;
        message.RpcParams.Target     = target;
        message.RpcParams.ViewID     = viewID;
        message.RpcParams.Parameters.AddRange(parameters);

        var buf = NGMessageCodec.Encode(message.ToByteArray());

        NGNetwork.Socket.Send(buf);
    }
        /// <summary>
        /// Sends the RPC.
        /// </summary>
        /// <param name="stream">The stream.</param>
        /// <param name="target">The target.</param>
        /// <param name="caller">The caller.</param>
        /// <param name="rpcMethodIndex">Index of the RPC method.</param>
        public virtual void SendRPC(NetDataWriter stream, RPCTarget target, RPCCallers caller, int rpcMethodIndex)
        {
            if (target == RPCTarget.ClientOwner)
            {
                if (!isServer || _netIdentity.hasAuthority)
                {
                    //We are not the server or we are the owner, so we can't or have no need to replicate
                    return;
                }
            }
            else if (target == RPCTarget.Server)
            {
                if (isServer)
                {
                    //We are the server, no need to replicate
                    return;
                }
            }
            else if (target == RPCTarget.Everyone)
            {
                if (!isServer)
                {
                    //We are not the server, we don't have a connection to everyone
                    return;
                }
            }

            switch (target)
            {
            case RPCTarget.Server:
                TinyNetClient.instance.SendRPCToServer(stream, rpcMethodIndex, this);
                return;

            case RPCTarget.ClientOwner:
                TinyNetServer.instance.SendRPCToClientOwner(stream, rpcMethodIndex, this);
                return;

            case RPCTarget.Everyone:
                TinyNetServer.instance.SendRPCToAllClients(stream, rpcMethodIndex, this);
                return;
            }
        }
Beispiel #3
0
 public RPCMethodInfo(string rpcName, RPCTarget nTarget, RPCCallers nCaller)
 {
     name   = rpcName;
     target = nTarget;
     caller = nCaller;
 }
Beispiel #4
0
 public TinyNetRPC(RPCTarget newTargets, RPCCallers newCallers)
 {
     targets = newTargets;
     callers = newCallers;
 }
Beispiel #5
0
 public static void AddRPCMethodNameToType(string rpcName, RPCTarget nTarget, RPCCallers nCaller, Type type)
 {
     rpcMethods[type].Add(new RPCMethodInfo(rpcName, nTarget, nCaller));
 }
Beispiel #6
0
        // Send to all connected clients
        public static void RPC(DnlUdpPeer serverPeer, SendPacket packet, int senderNetworkId, RPCTarget peerTarget)
        {
            if (serverPeer == null)
            {
                throw new ArgumentNullException("DnlUdpClient", "Server must be an already initialized DnlUdpClient");
            }
            if (packet == null)
            {
                throw new ArgumentNullException("SendPacket", "Packet must be initialized in order to send to remote clients");
            }
            if (senderNetworkId > 0 && senderNetworkId < MaxNumberOfConnections)
            {
                throw new ArgumentNullException("SenderNetworkId", "Invalid networkid. Ensure sender has registered network id.");
            }

            lock (connectionLock)
            {
                for (int i = 0; i < MaxNumberOfConnections; i++)
                {
                    if (RemoteClients[i] != null && RemoteClients[i].IsConnected)
                    {
                        if (RemoteClients[i].NetworkID == senderNetworkId && peerTarget == RPCTarget.Others)
                        {
                            continue;
                        }
                        else
                        {
                            packet.Send(serverPeer, RemoteClients[i]);
                        }
                    }
                }
            }
        }