static void InjectClientGuard(TypeDefinition td, MethodDefinition md, bool logWarning) { if (!Weaver.IsNetworkBehaviour(td)) { Weaver.Error($"[Client] {md} must be declared in a NetworkBehaviour"); return; } ILProcessor worker = md.Body.GetILProcessor(); Instruction top = md.Body.Instructions[0]; worker.InsertBefore(top, worker.Create(OpCodes.Ldarg_0)); worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.NetworkBehaviourGetIdentity)); worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.NetworkIdentityGetClient)); worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.NetworkClientGetActive)); worker.InsertBefore(top, worker.Create(OpCodes.Brtrue, top)); if (logWarning) { worker.InsertBefore(top, worker.Create(OpCodes.Ldstr, "[Client] function '" + md.FullName + "' called on server")); worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.logWarningReference)); } InjectGuardParameters(md, worker, top); InjectGuardReturnValue(md, worker, top); worker.InsertBefore(top, worker.Create(OpCodes.Ret)); }
static void InjectServerGuard(TypeDefinition td, MethodDefinition md, bool logWarning) { if (!Weaver.IsNetworkBehaviour(td)) { Weaver.Error($"Server method {md.Name} must be declared in a NetworkBehaviour", md); return; } ILProcessor worker = md.Body.GetILProcessor(); Instruction top = md.Body.Instructions[0]; worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.NetworkServerGetActive)); worker.InsertBefore(top, worker.Create(OpCodes.Brtrue, top)); if (logWarning) { worker.InsertBefore(top, worker.Create(OpCodes.Ldstr, $"[Server] function '{md.FullName}' called when server was not active")); worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.logWarningReference)); } InjectGuardParameters(md, worker, top); InjectGuardReturnValue(md, worker, top); worker.InsertBefore(top, worker.Create(OpCodes.Ret)); }
static void InjectServerGuard(TypeDefinition td, MethodDefinition md, bool logWarning) { if (!Weaver.IsNetworkBehaviour(td)) { Log.Error("[Server] guard on non-NetworkBehaviour script at [" + md.FullName + "]"); return; } ILProcessor worker = md.Body.GetILProcessor(); Instruction top = md.Body.Instructions[0]; worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.NetworkServerGetActive)); worker.InsertBefore(top, worker.Create(OpCodes.Brtrue, top)); if (logWarning) { worker.InsertBefore(top, worker.Create(OpCodes.Ldstr, "[Server] function '" + md.FullName + "' called on client")); worker.InsertBefore(top, worker.Create(OpCodes.Call, Weaver.logWarningReference)); } InjectGuardParameters(md, worker, top); InjectGuardReturnValue(md, worker, top); worker.InsertBefore(top, worker.Create(OpCodes.Ret)); }