コード例 #1
0
        public override void OnApplicationStart()
        {
            IkTweaksSettings.RegisterSettings();

            BundleHolder.Init();

            ClassInjector.RegisterTypeInIl2Cpp <VRIK_New>();
            ClassInjector.RegisterTypeInIl2Cpp <TwistRelaxer_New>();

            VrIkHandling.HookVrIkInit(harmonyInstance);
            FullBodyHandling.HookFullBodyController(harmonyInstance);

            Camera.onPreRender = Delegate.Combine(Camera.onPreRender, (Camera.CameraCallback)OnVeryLateUpdate).Cast <Camera.CameraCallback>();

            if (MelonHandler.Mods.Any(it => it.Info.Name == "UI Expansion Kit" && !it.Info.Version.StartsWith("0.1.")))
            {
                AddUixActions();
            }
        }
コード例 #2
0
ファイル: Main.cs プロジェクト: l-404-l/FPSUnlock
        public override void OnApplicationStart()
        {
            Config.LoadConfig();
            Application.targetFrameRate = Config.CFG.TargetedFPS;

            Il2CppSystem.Delegate test = (Il2CppSystem.Action <bool>) new Action <bool>(x =>
            {
                if (x)
                { // Tabbed in
                    Application.targetFrameRate = Config.CFG.TargetedFPS;
                }
                else
                { // Tabbed out
                    Application.targetFrameRate = Config.CFG.TabbedOutFPS;
                }
            });

            Application.focusChanged = Il2CppSystem.Delegate.Combine(Application.focusChanged, test).Cast <Il2CppSystem.Action <bool> >();
        }
コード例 #3
0
ファイル: IceBurn.cs プロジェクト: VRCMG/IceBurn
        public override void VRChat_OnUiManagerInit()
        {
            //Modules.Add(new UIButtons());

            foreach (var item in Modules)
            {
                item.OnStart();
            }

            if (Config.CFG.Custom)
            {
                CustomList = AvatarListApi.Create(Config.CFG.CustomName + " / " + Config.DAvatars.Count, 1);
                CustomList.AList.FirstLoad(Config.DAvatars);


                //New Age - Delegates lol // thanks for the help khan understanding this.
                Il2CppSystem.Delegate test = (Il2CppSystem.Action <string, GameObject, VRCSDK2.Validation.Performance.Stats.AvatarPerformanceStats>) new Action <string, GameObject, VRCSDK2.Validation.Performance.Stats.AvatarPerformanceStats>((x, y, z) =>
                {
                    if (Config.DAvatars.Any(v => v.AvatarID == CustomList.AList.avatarPedestal.field_Internal_ApiAvatar_0.id))
                    {
                        FavoriteButton.Title.text = Config.CFG.RemoveFavoriteTXT;
                        CustomList.ListTitle.text = Config.CFG.CustomName + " / " + Config.DAvatars.Count;
                    }
                    else
                    {
                        FavoriteButton.Title.text = Config.CFG.AddFavoriteTXT;
                        CustomList.ListTitle.text = Config.CFG.CustomName + " / " + Config.DAvatars.Count;
                    }
                });

                //Insane how long this line is LOL;
                CustomList.AList.avatarPedestal.field_Internal_Action_3_String_GameObject_AvatarPerformanceStats_0 = Il2CppSystem.Delegate.Combine(CustomList.AList.avatarPedestal.field_Internal_Action_3_String_GameObject_AvatarPerformanceStats_0, test).Cast <Il2CppSystem.Action <string, GameObject, VRCSDK2.Validation.Performance.Stats.AvatarPerformanceStats> >();


                //Add-Remove Favorite Button
                FavoriteButton = AviPButton.Create(Config.CFG.AddFavoriteTXT, 0f, 2f);
                FavoriteButton.SetAction(() =>
                {
                    var avatar = CustomList.AList.avatarPedestal.field_Internal_ApiAvatar_0;
                    if (avatar.releaseStatus != "private")
                    {
                        if (!Config.DAvatars.Any(v => v.AvatarID == avatar.id))
                        {
                            AvatarListHelper.AvatarListPassthru(avatar);
                            CustomList.AList.Refresh(Config.DAvatars.Select(x => x.AvatarID).Reverse());
                            FavoriteButton.Title.text = Config.CFG.RemoveFavoriteTXT;
                            CustomList.ListTitle.text = Config.CFG.CustomName + " / " + Config.DAvatars.Count;
                        }
                        else
                        {
                            AvatarListHelper.AvatarListPassthru(avatar);
                            CustomList.AList.Refresh(Config.DAvatars.Select(x => x.AvatarID).Reverse());
                            FavoriteButton.Title.text = Config.CFG.AddFavoriteTXT;
                            CustomList.ListTitle.text = Config.CFG.CustomName + " / " + Config.DAvatars.Count;
                        }
                    }
                });

                DownloadButton = AviPButton.Create(Config.CFG.DownloadTXT, 1150f, 9.6f);
                DownloadButton.SetAction(() =>
                {
                    var avatar = CustomList.AList.avatarPedestal.field_Internal_ApiAvatar_0;
                    Process.Start(avatar.assetUrl);
                });

                //Author Button
                var t     = AviPButton.Create("Show Author", 0f, 9.6f);
                var scale = t.GameObj.transform.localScale;
                t.GameObj.transform.localScale = new Vector3(scale.x - 0.1f, scale.y - 0.1f, scale.z - 0.1f);
                t.SetAction(() =>
                {
                    VRCUiManager.prop_VRCUiManager_0.Method_Public_Void_Boolean_0(true);
                    APIUser.FetchUser(CustomList.AList.avatarPedestal.field_Internal_ApiAvatar_0.authorId, new Action <APIUser>(x =>
                    {
                        QuickMenu.prop_QuickMenu_0.prop_APIUser_0 = x;
                        QuickMenu.prop_QuickMenu_0.Method_Public_Void_Int32_Boolean_0(4, false);
                    }), null);
                });
            }
        }
コード例 #4
0
        public static TIl2Cpp ConvertDelegate <TIl2Cpp>(Delegate @delegate) where TIl2Cpp : Il2CppObjectBase
        {
            if (@delegate == null)
            {
                return(null);
            }

            if (!typeof(Il2CppSystem.Delegate).IsAssignableFrom(typeof(TIl2Cpp)))
            {
                throw new ArgumentException($"{typeof(TIl2Cpp)} is not a delegate");
            }

            var managedInvokeMethod = @delegate.GetType().GetMethod("Invoke") !;
            var parameterInfos      = managedInvokeMethod.GetParameters();

            foreach (var parameterInfo in parameterInfos)
            {
                var parameterType = parameterInfo.ParameterType;
                if (parameterType.IsGenericParameter)
                {
                    throw new ArgumentException($"Delegate has unsubstituted generic parameter ({parameterType}) which is not supported");
                }

                if (parameterType.BaseType == typeof(ValueType))
                {
                    throw new ArgumentException($"Delegate has parameter of type {parameterType} (non-blittable struct) which is not supported");
                }
            }

            var classTypePtr = Il2CppClassPointerStore <TIl2Cpp> .NativeClassPtr;

            if (classTypePtr == IntPtr.Zero)
            {
                throw new ArgumentException($"Type {typeof(TIl2Cpp)} has uninitialized class pointer");
            }

            if (Il2CppClassPointerStore <Il2CppToMonoDelegateReference> .NativeClassPtr == IntPtr.Zero)
            {
                ClassInjector.RegisterTypeInIl2Cpp <Il2CppToMonoDelegateReference>();
            }

            var il2CppDelegateType         = Il2CppSystem.Type.internal_from_handle(IL2CPP.il2cpp_class_get_type(classTypePtr));
            var nativeDelegateInvokeMethod = il2CppDelegateType.GetMethod("Invoke");

            var nativeParameters = nativeDelegateInvokeMethod.GetParameters();

            if (nativeParameters.Count != parameterInfos.Length)
            {
                throw new ArgumentException($"Managed delegate has {parameterInfos.Length} parameters, native has {nativeParameters.Count}, these should match");
            }

            for (var i = 0; i < nativeParameters.Count; i++)
            {
                var nativeType  = nativeParameters[i].ParameterType;
                var managedType = parameterInfos[i].ParameterType;

                if (nativeType.IsPrimitive || managedType.IsPrimitive)
                {
                    if (nativeType.FullName != managedType.FullName)
                    {
                        throw new ArgumentException($"Parameter type mismatch at parameter {i}: {nativeType.FullName} != {managedType.FullName}");
                    }

                    continue;
                }

                var classPointerFromManagedType = (IntPtr)typeof(Il2CppClassPointerStore <>).MakeGenericType(managedType)
                                                  .GetField(nameof(Il2CppClassPointerStore <int> .NativeClassPtr)).GetValue(null);

                var classPointerFromNativeType = IL2CPP.il2cpp_class_from_type(nativeType._impl.value);

                if (classPointerFromManagedType != classPointerFromNativeType)
                {
                    throw new ArgumentException($"Parameter type at {i} has mismatched native type pointers; types: {nativeType.FullName} != {managedType.FullName}");
                }

                if (nativeType.IsByRef || managedType.IsByRef)
                {
                    throw new ArgumentException($"Parameter at {i} is passed by reference, this is not supported");
                }
            }

            var signature         = new MethodSignature(nativeDelegateInvokeMethod, true);
            var managedTrampoline =
                GetOrCreateNativeToManagedTrampoline(signature, nativeDelegateInvokeMethod, managedInvokeMethod);

            var nativeDelegatePtr = IL2CPP.il2cpp_object_new(classTypePtr);
            var converted         = new Il2CppSystem.Delegate(nativeDelegatePtr);

            converted.method_ptr  = Marshal.GetFunctionPointerForDelegate(managedTrampoline);
            converted.method_info = nativeDelegateInvokeMethod; // todo: is this truly a good hack?
            var methodInfoSize    = Marshal.SizeOf <Il2CppMethodInfo>();
            var methodInfoPointer = Marshal.AllocHGlobal(methodInfoSize);
            var methodInfo        = (Il2CppMethodInfo *)methodInfoPointer;

            *methodInfo = default; // zero out everything
            converted.method = methodInfoPointer;

            methodInfo->methodPointer    = converted.method_ptr;
            methodInfo->invoker_method   = IntPtr.Zero;
            methodInfo->parameters_count = (byte)parameterInfos.Length;
            methodInfo->slot             = ushort.MaxValue;
            methodInfo->extra_flags      = MethodInfoExtraFlags.is_marshalled_from_native;

            converted.m_target = new Il2CppToMonoDelegateReference(@delegate, methodInfoPointer);

            return(converted.Cast <TIl2Cpp>());
        }
コード例 #5
0
        public static TIl2Cpp ConvertDelegate <TIl2Cpp>(Delegate @delegate) where TIl2Cpp : Il2CppObjectBase
        {
            if (@delegate == null)
            {
                return(null);
            }

            if (!typeof(Il2CppSystem.Delegate).IsAssignableFrom(typeof(TIl2Cpp)))
            {
                throw new ArgumentException($"{typeof(TIl2Cpp)} is not a delegate");
            }

            var managedInvokeMethod = @delegate.GetType().GetMethod("Invoke") !;
            var parameterInfos      = managedInvokeMethod.GetParameters();

            foreach (var parameterInfo in parameterInfos)
            {
                var parameterType = parameterInfo.ParameterType;
                if (parameterType.IsGenericParameter)
                {
                    throw new ArgumentException($"Delegate has unsubstituted generic parameter ({parameterType}) which is not supported");
                }

                if (parameterType.BaseType == typeof(ValueType))
                {
                    throw new ArgumentException($"Delegate has parameter of type {parameterType} (non-blittable struct) which is not supported");
                }
            }

            var classTypePtr = Il2CppClassPointerStore <TIl2Cpp> .NativeClassPtr;

            if (classTypePtr == IntPtr.Zero)
            {
                throw new ArgumentException($"Type {typeof(TIl2Cpp)} has uninitialized class pointer");
            }

            if (Il2CppClassPointerStore <Il2CppToMonoDelegateReference> .NativeClassPtr == IntPtr.Zero)
            {
                ClassInjector.RegisterTypeInIl2Cpp <Il2CppToMonoDelegateReference>();
            }

            var il2CppDelegateType         = Il2CppSystem.Type.internal_from_handle(IL2CPP.il2cpp_class_get_type(classTypePtr));
            var nativeDelegateInvokeMethod = il2CppDelegateType.GetMethod("Invoke");

            var nativeParameters = nativeDelegateInvokeMethod.GetParameters();

            if (nativeParameters.Count != parameterInfos.Length)
            {
                throw new ArgumentException($"Managed delegate has {parameterInfos.Length} parameters, native has {nativeParameters.Count}, these should match");
            }

            for (var i = 0; i < nativeParameters.Count; i++)
            {
                var nativeType  = nativeParameters[i].ParameterType;
                var managedType = parameterInfos[i].ParameterType;

                if (nativeType.IsPrimitive || managedType.IsPrimitive)
                {
                    if (nativeType.FullName != managedType.FullName)
                    {
                        throw new ArgumentException($"Parameter type mismatch at parameter {i}: {nativeType.FullName} != {managedType.FullName}");
                    }

                    continue;
                }

                var classPointerFromManagedType = (IntPtr)typeof(Il2CppClassPointerStore <>).MakeGenericType(managedType)
                                                  .GetField(nameof(Il2CppClassPointerStore <int> .NativeClassPtr)).GetValue(null);

                var classPointerFromNativeType = IL2CPP.il2cpp_class_from_type(nativeType._impl.value);

                if (classPointerFromManagedType != classPointerFromNativeType)
                {
                    throw new ArgumentException($"Parameter type at {i} has mismatched native type pointers; types: {nativeType.FullName} != {managedType.FullName}");
                }

                if (nativeType.IsByRef || managedType.IsByRef)
                {
                    throw new ArgumentException($"Parameter at {i} is passed by reference, this is not supported");
                }
            }

            var signature         = new MethodSignature(nativeDelegateInvokeMethod, true);
            var managedTrampoline =
                GetOrCreateNativeToManagedTrampoline(signature, nativeDelegateInvokeMethod, managedInvokeMethod);

            var methodInfo = UnityVersionHandler.NewMethod();

            methodInfo.MethodPointer          = Marshal.GetFunctionPointerForDelegate(managedTrampoline);
            methodInfo.ParametersCount        = (byte)parameterInfos.Length;
            methodInfo.Slot                   = ushort.MaxValue;
            methodInfo.IsMarshalledFromNative = true;

            var delegateReference = new Il2CppToMonoDelegateReference(@delegate, methodInfo.Pointer);

            Il2CppSystem.Delegate converted;
            if (UnityVersionHandler.MustUseDelegateConstructor)
            {
                converted = ((TIl2Cpp)Activator.CreateInstance(typeof(TIl2Cpp), delegateReference.Cast <Object>(), methodInfo.Pointer)).Cast <Il2CppSystem.Delegate>();
            }
            else
            {
                var nativeDelegatePtr = IL2CPP.il2cpp_object_new(classTypePtr);
                converted = new Il2CppSystem.Delegate(nativeDelegatePtr);
            }

            converted.method_ptr  = methodInfo.MethodPointer;
            converted.method_info = nativeDelegateInvokeMethod; // todo: is this truly a good hack?
            converted.method      = methodInfo.Pointer;
            converted.m_target    = delegateReference;

            if (UnityVersionHandler.MustUseDelegateConstructor)
            { // U2021.2.0+ hack in case the constructor did the wrong thing anyway
                converted.invoke_impl = converted.method_ptr;
                converted.method_code = converted.m_target.Pointer;
            }

            return(converted.Cast <TIl2Cpp>());
        }
コード例 #6
0
        public static void setup_fav_plus()
        {
            hashmod.fav_list = avatar_ui.setup("Favs+ (" + avatar_config.avatar_list.Count + ")", 1, "Favs v2");
            avatar_utils.setup(avatar_config.avatar_list, hashmod.fav_list.listing_avatars);
            for (var c = 0; c < avatar_config.avatar_list.Count(); c++)
            {
                var x      = avatar_config.avatar_list[c];
                var avatar = new ApiAvatar()
                {
                    id = x.avatar_ident, name = x.avatar_name, thumbnailImageUrl = x.avatar_preview
                };
                if (!hashmod.fav_list.listing_avatars.field_Private_Dictionary_2_String_ApiAvatar_0.ContainsKey(x.avatar_ident))
                {
                    hashmod.fav_list.listing_avatars.field_Private_Dictionary_2_String_ApiAvatar_0.Add(x.avatar_ident, avatar);
                }
            }

            hashmod.fav_list.listing_avatars.specificListIds = avatar_config.avatar_list.Select(x => x.avatar_ident).ToArray();
            Il2CppSystem.Delegate test = (Il2CppSystem.Action <string, GameObject, VRCSDK2.Validation.Performance.Stats.AvatarPerformanceStats>) new Action <string, GameObject, VRCSDK2.Validation.Performance.Stats.AvatarPerformanceStats>((x, y, z) =>
            {
                if (avatar_config.avatar_list.Any(v => v.avatar_ident == hashmod.fav_list.listing_avatars.avatarPedestal.field_Internal_ApiAvatar_0.id))
                {
                    hashmod.fav_btn.ui_avatar_text.text = "Remove from Fav+";
                    hashmod.fav_list.listing_text.text  = "Fav+ " + " Total (" + avatar_config.avatar_list.Count + ")";
                }
                else
                {
                    hashmod.fav_btn.ui_avatar_text.text = "Add to Fav+";
                    hashmod.fav_list.listing_text.text  = "Fav+ " + " Total (" + avatar_config.avatar_list.Count + ")";
                }
            });

            hashmod.fav_list.listing_avatars.avatarPedestal.field_Internal_Action_3_String_GameObject_AvatarPerformanceStats_0 = Il2CppSystem.Delegate.Combine(hashmod.fav_list.listing_avatars.avatarPedestal.field_Internal_Action_3_String_GameObject_AvatarPerformanceStats_0, test).Cast <Il2CppSystem.Action <string, GameObject, VRCSDK2.Validation.Performance.Stats.AvatarPerformanceStats> >();
            hashmod.fav_btn = avatar_ui_button.setup("Add to Fav+", 0f, 9.6f);

            hashmod.fav_btn.set_action(() =>
            {
                var avatar = hashmod.fav_list.listing_avatars.avatarPedestal.field_Internal_ApiAvatar_0;

                if (avatar.releaseStatus == null || hashmod.fav_list.listing_avatars.avatarPedestal.field_Internal_ApiAvatar_0 == null || avatar.releaseStatus == "private")
                {
                    //should delete broken and unavailable avis
                    avatar_config.avatar_list.RemoveAll(x => x.avatar_ident == avatar.id);
                    avatar_utils.update_list(avatar_config.avatar_list.Select(x => x.avatar_ident), hashmod.fav_list.listing_avatars);

                    hashmod.fav_list.listing_text.text = "Fav+ " + " Total (" + avatar_config.avatar_list.Count + ")";
                }
                if (avatar.releaseStatus == "public")
                {
                    if (!avatar_config.avatar_list.Any(v => v.avatar_ident == avatar.id))
                    {
                        avatar_utils.add_to_list(avatar);
                        avatar_utils.update_list(avatar_config.avatar_list.Select(x => x.avatar_ident), hashmod.fav_list.listing_avatars);
                        hashmod.fav_btn.ui_avatar_text.text = "Remove from Fav+";
                        hashmod.fav_list.listing_text.text  = "Fav+ " + " Total (" + avatar_config.avatar_list.Count + ")";
                    }
                    else
                    {
                        avatar_utils.add_to_list(avatar);
                        avatar_utils.update_list(avatar_config.avatar_list.Select(x => x.avatar_ident), hashmod.fav_list.listing_avatars);
                        hashmod.fav_btn.ui_avatar_text.text = "Add to Fav+";
                        hashmod.fav_list.listing_text.text  = "Fav+ " + " Total (" + avatar_config.avatar_list.Count + ")";
                    }
                }
            });
        }