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(); } }
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> >(); }
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); }); } }
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>()); }
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>()); }
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 + ")"; } } }); }