public void ReplicateRPC(SerializableObject context, int rpcID, ObjectRPCSerializer serializer, params object[] args) { if (!_connection.isValid) { return; } Perf.Begin("ActorReplicationChannel.ReplicateRPC"); if (isServer) { if (!didHandshake) { // client hasn't finished connecting Perf.End(); return; } if ((clientLevel == null) || (clientLevel != _connection.world.currentLevel)) { Perf.End(); return; } } else if (_connection.world.isTraveling) { Perf.End(); return; } if (context.internal_GetReplicator(connection) == null) { // has not been replicated. Perf.End(); return; } var actor = context as Actor; if ((actor != null) && isServer && serializer.rpcInfo.CheckRelevancy && !actor.IsNetRelevantFor(this)) { // not relevant Perf.End(); return; } Assert.IsFalse((actor != null) ? actor.netTornOff : false); objectRefs.Clear(); var netMsg = NetMsgs.ReplicatedObjectRPC.New(context.netID, (ushort)rpcID); serializer.Write(netMsg.archive, this, args); if (_connection.world is Server.ServerWorld) { // send objects in the argument list first ReplicateDependencies(); } else { objectRefs.Clear(); } _connection.SendReliable(netMsg); Perf.End(); }
void AddRPCMethods(Type t, BindingFlags flags) { var typeMethods = t.GetMethods(flags); foreach (var minfo in typeMethods) { var rpcAttrs = minfo.GetCustomAttributes(typeof(RPC), false); if (rpcAttrs.Length == 1) { var actualMethod = minfo.GetBaseDefinition(); var sig = GenerateMethodSignature(actualMethod); if (!methods.ContainsKey(sig)) { int rpcID = methods.Count; methods.Add(sig, rpcID); var actorRPC = new ObjectRPCSerializer(rpcAttrs[0] as RPC, actualMethod); rpcIDToRPC.Add(rpcID, actorRPC); } } } }