private void LoadBuiltinMessages() { IEnumerable <Type> types = typeof(NetworkReaderExtensions).Module.GetTypes().Where(t => t.GetCustomAttribute <NetworkMessageAttribute>() != null); foreach (Type type in types) { TypeReference typeReference = module.ImportReference(type); writers.GetWriteFunc(typeReference, null); readers.GetReadFunc(typeReference, null); messages.Add(typeReference); } }
public bool WriteArguments(ILProcessor worker, MethodDefinition method, VariableDefinition writer, RemoteCallType callType) { // write each argument // example result /* * writer.WritePackedInt32(someNumber); * writer.WriteNetworkIdentity(someTarget); */ bool skipFirst = callType == RemoteCallType.ClientRpc && HasNetworkConnectionParameter(method); // arg of calling function, arg 0 is "this" so start counting at 1 int argNum = 1; foreach (ParameterDefinition param in method.Parameters) { // NetworkConnection is not sent via the NetworkWriter so skip it here // skip first for NetworkConnection in TargetRpc if (argNum == 1 && skipFirst) { argNum += 1; continue; } // skip SenderConnection in ServerRpc if (IsNetworkConnection(param.ParameterType)) { argNum += 1; continue; } MethodReference writeFunc = writers.GetWriteFunc(param.ParameterType, method.DebugInformation.SequencePoints.FirstOrDefault()); if (writeFunc == null) { logger.Error($"{method.Name} has invalid parameter {param}", method, method.DebugInformation.SequencePoints.FirstOrDefault()); return(false); } // use built-in writer func on writer object // NetworkWriter object worker.Append(worker.Create(OpCodes.Ldloc, writer)); // add argument to call worker.Append(worker.Create(OpCodes.Ldarg, argNum)); // call writer extension method worker.Append(worker.Create(OpCodes.Call, writeFunc)); argNum += 1; } return(true); }
/// <summary> /// Generates serialization methods for synclists /// </summary> /// <param name="td">The synclist class</param> /// <param name="mirrorBaseType">the base SyncObject td inherits from</param> void GenerateReadersAndWriters(TypeReference tr) { if (tr is GenericInstanceType genericInstance) { foreach (TypeReference argument in genericInstance.GenericArguments) { if (!argument.IsGenericParameter) { readers.GetReadFunc(argument, null); writers.GetWriteFunc(argument, null); } } } if (tr != null) { GenerateReadersAndWriters(tr.Resolve().BaseType); } }