Beispiel #1
0
        protected static Delegate CreatePacketHandlerDelegate(PacketRegistrationType registrationType, Type packetType, MethodInfo handler)
        {
            try
            {
                Type delegateType = null;
                switch (registrationType)
                {
                case PacketRegistrationType.Static:
                    delegateType = typeof(NetworkManager.ReceivePacketStatic <>);
                    break;

                case PacketRegistrationType.Instance:
                    delegateType = typeof(NetworkManager.ReceivePacketInstance <>);
                    break;

                case PacketRegistrationType.Timespan:
                    delegateType = typeof(NetworkManager.ReceivePacketTimespan <>);
                    break;

                default:
                    return(null);
                }
                delegateType = delegateType.MakeGenericType(packetType);
                handler      = handler.MakeGenericMethod(packetType);
                Delegate action = Delegate.CreateDelegate(delegateType, handler);
                return(action);
            }
            catch (Exception ex)
            {
                LogManager.ErrorLog.WriteLine(ex);
                return(null);
            }
        }
 protected static Delegate CreatePacketHandlerDelegate( PacketRegistrationType registrationType, Type packetType, MethodInfo handler )
 {
     try
     {
         Type delegateType = null;
         switch ( registrationType )
         {
             case PacketRegistrationType.Static:
                 delegateType = typeof( ReceivePacketStatic<> );
                 break;
             case PacketRegistrationType.Instance:
                 delegateType = typeof( ReceivePacketInstance<> );
                 break;
             case PacketRegistrationType.Timespan:
                 delegateType = typeof( ReceivePacketTimespan<> );
                 break;
             default:
                 return null;
         }
         delegateType = delegateType.MakeGenericType( packetType );
         handler = handler.MakeGenericMethod( packetType );
         Delegate action = Delegate.CreateDelegate( delegateType, handler );
         return action;
     }
     catch ( Exception ex )
     {
         ApplicationLog.BaseLog.Error( ex );
         return null;
     }
 }
        internal static bool RegisterCustomPacketHandler( PacketRegistrationType registrationType, Type packetType, MethodInfo handler, Type baseNetManagerType )
        {
            try
            {
                if ( m_registerPacketHandlerMethod == null )
                    return false;
                if ( m_registerPacketHandlerMethod2 == null )
                    return false;
                if ( m_registerPacketHandlerMethod3 == null )
                    return false;
                if ( packetType == null )
                    return false;
                if ( handler == null )
                    return false;

                //Find the old packet handler
                Type masterNetManagerType = SandboxGameAssemblyWrapper.Instance.GetAssemblyType( InternalNetManagerNamespace, InternalNetManagerClass );
                FieldInfo packetRegisteryHashSetField = masterNetManagerType.GetField( "9858E5CD512FFA5633683B9551FA4C30", BindingFlags.NonPublic | BindingFlags.Static );
                Object packetRegisteryHashSetRaw = packetRegisteryHashSetField.GetValue( null );
                HashSet<Object> packetRegisteryHashSet = UtilityFunctions.ConvertHashSet( packetRegisteryHashSetRaw );
                if ( packetRegisteryHashSet.Count == 0 )
                    return false;
                Object matchedHandler = null;
                List<Object> matchedHandlerList = new List<object>( );
                List<Type> messageTypes = new List<Type>( );
                foreach ( var entry in packetRegisteryHashSet )
                {
                    FieldInfo delegateField = entry.GetType( ).GetField( "C2AEC105AF9AB1EF82105555583139FC" );
                    Type fieldType = delegateField.FieldType;
                    Type[ ] genericArgs = fieldType.GetGenericArguments( );
                    Type[ ] messageTypeArgs = genericArgs[ 1 ].GetGenericArguments( );
                    Type messageType = messageTypeArgs[ 0 ];
                    if ( messageType == packetType )
                    {
                        matchedHandler = entry;
                        matchedHandlerList.Add( entry );
                    }

                    messageTypes.Add( messageType );
                }

                if ( matchedHandlerList.Count > 1 )
                {
                    ApplicationLog.BaseLog.Warn( "Found more than 1 packet handler match for type '" + packetType.Name + "'" );
                    return false;
                }

                if ( matchedHandler == null )
                    return false;

                FieldInfo field = matchedHandler.GetType( ).GetField( "C2AEC105AF9AB1EF82105555583139FC", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                Object value = field.GetValue( matchedHandler );
                FieldInfo secondaryFlagsField = matchedHandler.GetType( ).GetField( "655022D3B2BE47EBCBA675CCE8B784AD", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                Object secondaryFlags = secondaryFlagsField.GetValue( matchedHandler );
                MulticastDelegate action = (MulticastDelegate)value;
                object target = action.Target;
                FieldInfo field2 = target.GetType( ).GetField( "F774FA5087F549F79181BD64E7B7FF30", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                Object value2 = field2.GetValue( target );
                MulticastDelegate action2 = (MulticastDelegate)value2;
                object target2 = action2.Target;

                string field3Name = "";
                string flagsFieldName = "";
                string serializerFieldName = "";
                switch ( registrationType )
                {
                    case PacketRegistrationType.Static:
                        field3Name = "2919BD18904683E267BFC1B48709D971";
                        flagsFieldName = "0723D9EDBE6B0BE979D08F70F06DA741";
                        serializerFieldName = "9F70C9F89F36D5FC6C1EB816AFF491A9";
                        break;
                    case PacketRegistrationType.Instance:
                        field3Name = "F6EE81B03BFA4E50FF9E5E08DA897D98";
                        flagsFieldName = "A766151383CE73157E57B8ACCB430B04";
                        serializerFieldName = "501AE44AC35E909FEB7EAEE4264D3398";
                        break;
                    case PacketRegistrationType.Timespan:
                        field3Name = "B76A60C8C0680C4AD569366502B8CF47";
                        flagsFieldName = "90FCC62CB555FB7216BD38667979B221";
                        serializerFieldName = "DB0C5A72269DAB99179543BE08EEADAB";
                        break;
                    default:
                        return false;
                }
                FieldInfo field3 = target2.GetType( ).GetField( field3Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                Object value3 = field3.GetValue( target2 );
                MulticastDelegate action3 = (MulticastDelegate)value3;

                FieldInfo flagsField = target2.GetType( ).GetField( flagsFieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                Object flagsValue = flagsField.GetValue( target2 );
                FieldInfo serializerField = target2.GetType( ).GetField( serializerFieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                Object serializerValue = serializerField.GetValue( target2 );

                FieldInfo methodBaseField = action3.GetType( ).GetField( "_methodBase", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                FieldInfo methodPtrField = action3.GetType( ).GetField( "_methodPtr", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );
                FieldInfo methodPtrAuxField = action3.GetType( ).GetField( "_methodPtrAux", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static );

                Delegate handlerAction = CreatePacketHandlerDelegate( registrationType, packetType, handler );

                //Remove the old handler from the registry
                MethodInfo removeMethod = packetRegisteryHashSetRaw.GetType( ).GetMethod( "Remove" );
                removeMethod.Invoke( packetRegisteryHashSetRaw, new object[ ] { matchedHandler } );

                //Update the handler delegate with our new method info
                methodBaseField.SetValue( action3, handlerAction.Method );
                methodPtrField.SetValue( action3, methodPtrField.GetValue( handlerAction ) );
                methodPtrAuxField.SetValue( action3, methodPtrAuxField.GetValue( handlerAction ) );

                if ( baseNetManagerType == null )
                    baseNetManagerType = SandboxGameAssemblyWrapper.Instance.GetAssemblyType( "", "48D79F8E3C8922F14D85F6D98237314C" );

                //Register the new packet handler
                MethodInfo registerMethod = null;
                switch ( registrationType )
                {
                    case PacketRegistrationType.Static:
                        registerMethod = m_registerPacketHandlerMethod.MakeGenericMethod( packetType );
                        registerMethod.Invoke( null, new object[ ] { action3, flagsValue, secondaryFlags, serializerValue } );
                        break;
                    case PacketRegistrationType.Instance:
                        registerMethod = m_registerPacketHandlerMethod2.MakeGenericMethod( baseNetManagerType, packetType );
                        registerMethod.Invoke( null, new object[ ] { action3, flagsValue, secondaryFlags, serializerValue } );
                        break;
                    case PacketRegistrationType.Timespan:
                        registerMethod = m_registerPacketHandlerMethod3.MakeGenericMethod( packetType );
                        registerMethod.Invoke( null, new object[ ] { action3, flagsValue, secondaryFlags, serializerValue } );
                        break;
                    default:
                        return false;
                }
                return true;
            }
            catch ( Exception ex )
            {
                ApplicationLog.BaseLog.Error( ex );
                return false;
            }
        }
Beispiel #4
0
        internal static bool RegisterCustomPacketHandler(PacketRegistrationType registrationType, Type packetType, MethodInfo handler, Type baseNetManagerType)
        {
            try
            {
                if (m_registerPacketHandlerMethod == null)
                {
                    return(false);
                }
                if (m_registerPacketHandlerMethod2 == null)
                {
                    return(false);
                }
                if (m_registerPacketHandlerMethod3 == null)
                {
                    return(false);
                }
                if (packetType == null)
                {
                    return(false);
                }
                if (handler == null)
                {
                    return(false);
                }

                //Find the old packet handler
                Type             masterNetManagerType        = SandboxGameAssemblyWrapper.Instance.GetAssemblyType(NetworkManager.InternalNetManagerNamespace, NetworkManager.InternalNetManagerClass);
                FieldInfo        packetRegisteryHashSetField = masterNetManagerType.GetField("9858E5CD512FFA5633683B9551FA4C30", BindingFlags.NonPublic | BindingFlags.Static);
                Object           packetRegisteryHashSetRaw   = packetRegisteryHashSetField.GetValue(null);
                HashSet <Object> packetRegisteryHashSet      = UtilityFunctions.ConvertHashSet(packetRegisteryHashSetRaw);
                if (packetRegisteryHashSet.Count == 0)
                {
                    return(false);
                }
                Object        matchedHandler     = null;
                List <Object> matchedHandlerList = new List <object>();
                List <Type>   messageTypes       = new List <Type>();
                foreach (var entry in packetRegisteryHashSet)
                {
                    FieldInfo delegateField   = entry.GetType().GetField("C2AEC105AF9AB1EF82105555583139FC");
                    Type      fieldType       = delegateField.FieldType;
                    Type[]    genericArgs     = fieldType.GetGenericArguments();
                    Type[]    messageTypeArgs = genericArgs[1].GetGenericArguments();
                    Type      messageType     = messageTypeArgs[0];
                    if (messageType == packetType)
                    {
                        matchedHandler = entry;
                        matchedHandlerList.Add(entry);
                    }

                    messageTypes.Add(messageType);
                }

                if (matchedHandlerList.Count > 1)
                {
                    LogManager.APILog.WriteLine("Found more than 1 packet handler match for type '" + packetType.Name + "'");
                    return(false);
                }

                if (matchedHandler == null)
                {
                    return(false);
                }

                FieldInfo         field = matchedHandler.GetType().GetField("C2AEC105AF9AB1EF82105555583139FC", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                Object            value = field.GetValue(matchedHandler);
                FieldInfo         secondaryFlagsField = matchedHandler.GetType().GetField("655022D3B2BE47EBCBA675CCE8B784AD", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                Object            secondaryFlags      = secondaryFlagsField.GetValue(matchedHandler);
                MulticastDelegate action  = (MulticastDelegate)value;
                object            target  = action.Target;
                FieldInfo         field2  = target.GetType().GetField("F774FA5087F549F79181BD64E7B7FF30", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                Object            value2  = field2.GetValue(target);
                MulticastDelegate action2 = (MulticastDelegate)value2;
                object            target2 = action2.Target;

                string field3Name          = "";
                string flagsFieldName      = "";
                string serializerFieldName = "";
                switch (registrationType)
                {
                case PacketRegistrationType.Static:
                    field3Name          = "2919BD18904683E267BFC1B48709D971";
                    flagsFieldName      = "0723D9EDBE6B0BE979D08F70F06DA741";
                    serializerFieldName = "9F70C9F89F36D5FC6C1EB816AFF491A9";
                    break;

                case PacketRegistrationType.Instance:
                    field3Name          = "F6EE81B03BFA4E50FF9E5E08DA897D98";
                    flagsFieldName      = "A766151383CE73157E57B8ACCB430B04";
                    serializerFieldName = "501AE44AC35E909FEB7EAEE4264D3398";
                    break;

                case PacketRegistrationType.Timespan:
                    field3Name          = "B76A60C8C0680C4AD569366502B8CF47";
                    flagsFieldName      = "90FCC62CB555FB7216BD38667979B221";
                    serializerFieldName = "DB0C5A72269DAB99179543BE08EEADAB";
                    break;

                default:
                    return(false);
                }
                FieldInfo         field3  = target2.GetType().GetField(field3Name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                Object            value3  = field3.GetValue(target2);
                MulticastDelegate action3 = (MulticastDelegate)value3;

                FieldInfo flagsField      = target2.GetType().GetField(flagsFieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                Object    flagsValue      = flagsField.GetValue(target2);
                FieldInfo serializerField = target2.GetType().GetField(serializerFieldName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                Object    serializerValue = serializerField.GetValue(target2);

                FieldInfo methodBaseField   = action3.GetType().GetField("_methodBase", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                FieldInfo methodPtrField    = action3.GetType().GetField("_methodPtr", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
                FieldInfo methodPtrAuxField = action3.GetType().GetField("_methodPtrAux", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);

                Delegate handlerAction = CreatePacketHandlerDelegate(registrationType, packetType, handler);

                //Remove the old handler from the registry
                MethodInfo removeMethod = packetRegisteryHashSetRaw.GetType().GetMethod("Remove");
                removeMethod.Invoke(packetRegisteryHashSetRaw, new object[] { matchedHandler });

                //Update the handler delegate with our new method info
                methodBaseField.SetValue(action3, handlerAction.Method);
                methodPtrField.SetValue(action3, methodPtrField.GetValue(handlerAction));
                methodPtrAuxField.SetValue(action3, methodPtrAuxField.GetValue(handlerAction));

                if (baseNetManagerType == null)
                {
                    baseNetManagerType = SandboxGameAssemblyWrapper.Instance.GetAssemblyType("", "48D79F8E3C8922F14D85F6D98237314C");
                }

                //Register the new packet handler
                MethodInfo registerMethod = null;
                switch (registrationType)
                {
                case PacketRegistrationType.Static:
                    registerMethod = m_registerPacketHandlerMethod.MakeGenericMethod(packetType);
                    registerMethod.Invoke(null, new object[] { action3, flagsValue, secondaryFlags, serializerValue });
                    break;

                case PacketRegistrationType.Instance:
                    registerMethod = m_registerPacketHandlerMethod2.MakeGenericMethod(baseNetManagerType, packetType);
                    registerMethod.Invoke(null, new object[] { action3, flagsValue, secondaryFlags, serializerValue });
                    break;

                case PacketRegistrationType.Timespan:
                    registerMethod = m_registerPacketHandlerMethod3.MakeGenericMethod(packetType);
                    registerMethod.Invoke(null, new object[] { action3, flagsValue, secondaryFlags, serializerValue });
                    break;

                default:
                    return(false);
                }
                return(true);
            }
            catch (Exception ex)
            {
                LogManager.ErrorLog.WriteLine(ex);
                return(false);
            }
        }