Beispiel #1
0
		public void Patch()
		{
			HelperClass.SetLogger(null);
			//foreach RPC method in ConnectionManager
			foreach (MethodDefinition mdef in HelperClass.findMembers<MethodDefinition>(module, "ConnectionManager", HelperClass.MemberCustomAttributeComparer<MethodDefinition>("UnityEngine.RPC")))
			{
				if (mdef.HasBody)
				{
					Mono.Collections.Generic.Collection<ParameterDefinition> _params = mdef.Parameters;
					if (_params.Count == 0 || !_params[_params.Count - 1].ParameterType.FullName.Equals("UnityEngine.NetworkMessageInfo"))
					{
						ParameterDefinition messageInfoPardef = new ParameterDefinition("_messageInfo", ParameterAttributes.None,
							mdef.DeclaringType.Module.Import(unityModule.GetType("UnityEngine.NetworkMessageInfo")));
						mdef.Parameters.Add(messageInfoPardef);
					}

					ILProcessor proc = mdef.Body.GetILProcessor();
					List<Instruction[]> argLoaders = new List<Instruction[]>();
					argLoaders.Add(new Instruction[] {
						proc.Create(OpCodes.Ldc_I4_0),
						proc.Create(OpCodes.Box, module.Import(mscorlibModule.GetType("System.Boolean"))),
					});
					argLoaders.Add(new Instruction[] {
						proc.Create(OpCodes.Ldstr, mdef.Name),
					});
					List<Instruction> instrTmp = new List<Instruction>();
					for (int i = 0; i < _params.Count; i++)
					{
						ParameterDefinition param = _params[i];
						instrTmp.Clear();
						instrTmp.Add(proc.Create(OpCodes.Ldarg, param));
						if (param.ParameterType.IsValueType)
						{
							instrTmp.Add(proc.Create(OpCodes.Box, module.Import(param.ParameterType)));
						}
						argLoaders.Add(instrTmp.ToArray());
					}

					List<Instruction> hook = HookHelper.Instance.prepareEventHook(mdef, "RPCEvent", argLoaders.ToArray());
					for (int i = 0; i < _params.Count; i++)
					{
						ParameterDefinition param = _params[i];
						hook.Add(proc.Create(OpCodes.Dup));
						hook.Add(proc.Create(OpCodes.Ldc_I4, i + 2));
						hook.Add(proc.Create(OpCodes.Ldelem_Ref));
						if (param.ParameterType.IsValueType)
						{
							hook.Add(proc.Create(OpCodes.Unbox_Any, module.Import(param.ParameterType)));
						}
						else
						{
							hook.Add(proc.Create(OpCodes.Castclass, module.Import(param.ParameterType)));
						}
						hook.Add(proc.Create(OpCodes.Starg, param));
					}
					hook.Add(proc.Create(OpCodes.Ldc_I4_0));
					hook.Add(proc.Create(OpCodes.Ldelem_Ref));
					hook.Add(proc.Create(OpCodes.Unbox_Any, module.Import(mscorlibModule.GetType("System.Boolean"))));
					hook.Add(proc.Create(OpCodes.Brfalse, mdef.Body.Instructions[0]));
					hook.Add(proc.Create(OpCodes.Ret));
					HookHelper.insertAt(mdef.Body, 0, hook.ToArray());
				}
			}
		}