public static bool ReadArguments(MethodDefinition method, Readers readers, Logger Log, ILProcessor worker, RemoteCallType callType, ref bool WeavingFailed) { // read each argument // example result /* * CallCmdDoSomething(reader.ReadPackedInt32(), reader.ReadNetworkIdentity()); */ bool skipFirst = callType == RemoteCallType.TargetRpc && TargetRpcProcessor.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 Command if (IsSenderConnection(param, callType)) { argNum += 1; continue; } MethodReference readFunc = readers.GetReadFunc(param.ParameterType, ref WeavingFailed); if (readFunc == null) { Log.Error($"{method.Name} has invalid parameter {param}. Unsupported type {param.ParameterType}, use a supported Mirror type instead", method); WeavingFailed = true; return(false); } worker.Emit(OpCodes.Ldarg_1); worker.Emit(OpCodes.Call, readFunc); // conversion.. is this needed? if (param.ParameterType.Is <float>()) { worker.Emit(OpCodes.Conv_R4); } else if (param.ParameterType.Is <double>()) { worker.Emit(OpCodes.Conv_R8); } } return(true); }
public static bool WriteArguments(ILProcessor worker, Writers writers, Logger Log, MethodDefinition method, RemoteCallType callType, ref bool WeavingFailed) { // write each argument // example result /* * writer.WritePackedInt32(someNumber); * writer.WriteNetworkIdentity(someTarget); */ bool skipFirst = callType == RemoteCallType.TargetRpc && TargetRpcProcessor.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 Command if (IsSenderConnection(param, callType)) { argNum += 1; continue; } MethodReference writeFunc = writers.GetWriteFunc(param.ParameterType, ref WeavingFailed); if (writeFunc == null) { Log.Error($"{method.Name} has invalid parameter {param}", method); WeavingFailed = true; return(false); } // use built-in writer func on writer object // NetworkWriter object worker.Emit(OpCodes.Ldloc_0); // add argument to call worker.Emit(OpCodes.Ldarg, argNum); // call writer extension method worker.Emit(OpCodes.Call, writeFunc); argNum += 1; } return(true); }