// InvokeCmd/Rpc/SyncEventDelegate can all use the same function here internal bool InvokeHandlerDelegate(int cmdHash, MirrorInvokeType invokeType, NetworkReader reader) { if (GetInvokerForHash(cmdHash, invokeType, out var invoker) && invoker.invokeClass.IsInstanceOfType(this)) { invoker.invokeFunction(this, reader); return(true); } return(false); }
//CUSTOM UNITYSTATION CODE// // InvokeCmd/Rpc Delegate can all use the same function here internal static bool InvokeHandlerDelegate(int cmdHash, MirrorInvokeType invokeType, NetworkReader reader, NetworkBehaviour invokingType, NetworkConnectionToClient senderConnection = null) { if (GetInvokerForHash(cmdHash, invokeType, out Invoker invoker) && invoker.invokeClass.IsInstanceOfType(invokingType)) { mirrorProcessingCMD = true; mirrorLastInvoker = invoker; invoker.invokeFunction(invokingType, reader, senderConnection); mirrorProcessingCMD = false; return(true); } return(false); }
static bool GetInvokerForHash(int cmdHash, MirrorInvokeType invokeType, out Invoker invoker) { if (cmdHandlerDelegates.TryGetValue(cmdHash, out invoker) && invoker != null && invoker.invokeType == invokeType) { return(true); } // debug message if not found, or null, or mismatched type // (no need to throw an error, an attacker might just be trying to // call an cmd with an rpc's hash) // Debug.Log("GetInvokerForHash hash:" + cmdHash + " not found"); return(false); }
static bool CheckIfDeligateExists(Type invokeClass, MirrorInvokeType invokerType, CmdDelegate func, int cmdHash) { if (cmdHandlerDelegates.ContainsKey(cmdHash)) { // something already registered this hash Invoker oldInvoker = cmdHandlerDelegates[cmdHash]; if (oldInvoker.AreEqual(invokeClass, invokerType, func)) { // it's all right, it was the same function return(true); } Debug.LogError($"Function {oldInvoker.invokeClass}.{oldInvoker.invokeFunction.GetMethodName()} and {invokeClass}.{func.GetMethodName()} have the same hash. Please rename one of them"); } return(false); }
public bool AreEqual(Type invokeClass, MirrorInvokeType invokeType, CmdDelegate invokeFunction) { return(this.invokeClass == invokeClass && this.invokeType == invokeType && this.invokeFunction == invokeFunction); }