Ejemplo n.º 1
0
        /// <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");
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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!");
        }
Ejemplo n.º 4
0
        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");
        }