Exemplo n.º 1
0
	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();
	}
Exemplo n.º 2
0
	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);
				}
			}
		}
	}