/// <summary> /// Loads the network intercept system /// </summary> public void Init() { if (_init) { return; } _init = true; if (!ReflectionUnitTest()) { throw new InvalidOperationException("Reflection unit test failed."); } m_typeTable = typeof(MyReplicationLayerBase).GetField(TypeTableField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.ReplicationLayer) as MyTypeTable; //don't bother with nullchecks here, it was all handled in ReflectionUnitTest var transportType = typeof(MySyncLayer).GetField(MyTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance).FieldType; var transportInstance = typeof(MySyncLayer).GetField(MyTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.Static.SyncLayer); var handlers = (Dictionary <MyMessageId, Action <MyPacket> >)transportType.GetField(TransportHandlersField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(transportInstance); //remove Keen's network listener handlers.Remove(MyMessageId.RPC); //replace it with our own handlers.Add(MyMessageId.RPC, ProcessEvent); //PrintDebug(); _log.Debug("Initialized network intercept"); }
private CallSite TryGetStaticCallSite(MethodInfo method) { MyTypeTable typeTable = _typeTableGetter.Invoke(MyMultiplayer.ReplicationLayer); if (!_methodInfoLookupGetter.Invoke(typeTable.StaticEventTable).TryGetValue(method, out CallSite result)) { throw new MissingMemberException("Provided event target not found!"); } return(result); }
public void InitNetworkIntercept() { m_typeTable = typeof(MyReplicationLayerBase).GetField(TypeTableField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.ReplicationLayer) as MyTypeTable; //don't bother with nullchecks here, it was all handled in ReflectionUnitTest var transportType = typeof(MySyncLayer).GetField(MyTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance).FieldType; var transportInstance = typeof(MySyncLayer).GetField(MyTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.Static.SyncLayer); var handlers = (Dictionary <MyMessageId, Action <MyPacket> >)transportType.GetField(TransportHandlersField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(transportInstance); //remove Keen's network listener handlers.Remove(MyMessageId.RPC); //replace it with our own handlers.Add(MyMessageId.RPC, ProcessEvent); //PrintDebug(); ApplicationLog.Info("Initialized network intercept!"); }
private void OnSessionLoaded() { if (_init) { return; } _init = true; if (!ReflectionUnitTest()) { throw new InvalidOperationException("Reflection unit test failed."); } m_typeTable = typeof(MyReplicationLayerBase).GetField(TypeTableField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.ReplicationLayer) as MyTypeTable; //don't bother with nullchecks here, it was all handled in ReflectionUnitTest var transportType = typeof(MySyncLayer).GetField(MyTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance).FieldType; var transportInstance = typeof(MySyncLayer).GetField(MyTransportLayerField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(MyMultiplayer.Static.SyncLayer); var handlers = (IDictionary)transportType.GetField(TransportHandlersField, BindingFlags.NonPublic | BindingFlags.Instance)?.GetValue(transportInstance); var handlerTypeField = handlers.GetType().GenericTypeArguments[0].GetField("messageId"); //Should be MyTransportLayer.HandlerId object id = null; foreach (var key in handlers.Keys) { if ((MyMessageId)handlerTypeField.GetValue(key) != MyMessageId.RPC) { continue; } id = key; break; } if (id == null) { throw new InvalidOperationException("RPC handler not found."); } //remove Keen's network listener handlers.Remove(id); //replace it with our own handlers.Add(id, new Action <MyPacket>(OnEvent)); //PrintDebug(); _log.Debug("Initialized network intercept"); }