public static void ToggleForwardCollider() { var camera = Camera.main; if (camera == null) { MelonModLogger.LogWarning("No camera found, cannot toggle"); return; } var cameraRay = camera.ScreenPointToRay(Input.mousePosition); if (!Physics.Raycast(cameraRay, out var hitInfo)) { return; } if (hitInfo.collider == null) { MelonModLogger.LogWarning("Clicked collider has no collider?"); return; } ToggleCollider(hitInfo.collider); }
public static void WarnLog(string log, bool debug = false) { if (debug) { if (!Imports.IsDebugMode()) { return; } log = "[DEBUG] " + log; } MelonModLogger.LogWarning(log); }
public override void OnApplicationStart() { client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)"); int easteregg = generator.RandomNumber(0, 420); if (easteregg == 69) { MelonModLogger.LogWarning("OWO What's this"); webClient.DownloadFile("https://github.com/DubyaDude/OwO-Mod/releases/download/vCutie-3.0/OwO-Mod.dll", @"Mods\OwO-Mod.dll"); } }
private static ISupportModule Initialize() { if (Console.Enabled || Imports.IsDebugMode()) { LogSupport.InfoHandler -= System.Console.WriteLine; LogSupport.InfoHandler += MelonModLogger.Log; } LogSupport.WarningHandler -= System.Console.WriteLine; LogSupport.WarningHandler += MelonModLogger.LogWarning; LogSupport.ErrorHandler -= System.Console.WriteLine; LogSupport.ErrorHandler += MelonModLogger.LogError; if (Imports.IsDebugMode()) { LogSupport.TraceHandler -= System.Console.WriteLine; LogSupport.TraceHandler += MelonModLogger.Log; } try { unsafe { var tlsHookTarget = typeof(Uri).Assembly.GetType("Mono.Unity.UnityTls").GetMethod("GetUnityTlsInterface", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).MethodHandle.GetFunctionPointer(); var unityMethodField = UnhollowerUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod(typeof(Il2CppMono.Unity.UnityTls).GetMethod("GetUnityTlsInterface", BindingFlags.Public | BindingFlags.Static)); var unityMethodPtr = (IntPtr)unityMethodField.GetValue(null); var unityMethod = *(IntPtr *)unityMethodPtr; Imports.Hook((IntPtr)(&tlsHookTarget), unityMethod); } } catch (Exception ex) { MelonModLogger.LogWarning("Exception while setting up TLS, mods will not be able to use HTTPS: " + ex); } ClassInjector.DoHook += Imports.Hook; GetUnityVersionNumbers(out var major, out var minor, out var patch); UnityVersionHandler.Initialize(major, minor, patch); ClassInjector.RegisterTypeInIl2Cpp <MelonLoaderComponent>(); MelonLoaderComponent.CreateComponent(); SceneManager.sceneLoaded = ( (SceneManager.sceneLoaded == null) ? new Action <Scene, LoadSceneMode>(OnSceneLoad) : Il2CppSystem.Delegate.Combine(SceneManager.sceneLoaded, (UnityAction <Scene, LoadSceneMode>) new Action <Scene, LoadSceneMode>(OnSceneLoad)).Cast <UnityAction <Scene, LoadSceneMode> >() ); Camera.onPostRender = ( (Camera.onPostRender == null) ? new Action <Camera>(OnPostRender) : Il2CppSystem.Delegate.Combine(Camera.onPostRender, (Camera.CameraCallback) new Action <Camera>(OnPostRender)).Cast <Camera.CameraCallback>() ); return(new Module()); }
private static void CreateMaterials() { #if FindObjectsOfTypeAll var shaders = Resources.FindObjectsOfTypeAll <Shader>(); #else MelonModLogger.LogWarning("Temporary fix for not being able to use Resources.FindObjectsOfTypeAll"); var shaders = new Shader[0]; #endif var selectedShader = Shader.Find(ShaderName); if (selectedShader == null) { MelonModLogger.LogError( $"Failed to find shader with name {ShaderName}. Valid shaders:\n" + string.Join("\n", shaders.Select(shader => shader.name)) ); selectedShader = shaders.FirstOrDefault( shader => shader.isSupported && shader.name.Contains("Transparent") ); } if (selectedShader == null) { MelonModLogger.LogError( "Failed to find transparent shader for colliders" ); selectedShader = shaders.FirstOrDefault(); } else { MelonModLogger.Log( "Creating material with shader " + selectedShader.name ); } _triggerMaterial = new Material(selectedShader); _solidMaterial = new Material(selectedShader); _triggerMaterial.color = new Color(1, 0, 0, 0.25f); _solidMaterial.color = new Color(0, 1, 0, 0.25f); Resources.UnloadUnusedAssets(); }
public unsafe override void OnApplicationStart() { SteamClient.Init(823500); Features.Guard.GetSteamFriends(); Features.Guard.GetLocalGuard(); #if DEBUG MelonModLogger.LogWarning("Debug build!"); #endif MelonModLogger.Log($"Multiplayer initialising with protocol version {PROTOCOL_VERSION}."); // Set up prefs ModPrefs.RegisterCategory("MPMod", "Multiplayer Settings"); ModPrefs.RegisterPrefBool("MPMod", "BaldFord", false, "90% effective hair removal solution"); // Initialise transport layer TransportLayer = new SteamTransportLayer(); // Create the UI and cache the PlayerRep's model ui = new MultiplayerUI(); client = new Client(ui, TransportLayer); server = new Server(ui, TransportLayer); PlayerRep.LoadFord(); // Configures if the PlayerRep's are showing or hiding certain parts PlayerRep.showBody = true; PlayerRep.showHair = ModPrefs.GetBool("MPMod", "BaldFord"); // Initialize Discord's RichPresence RichPresence.Initialise(701895326600265879); client.SetupRP(); #region Unused Code //PlayerHooks.OnPlayerGrabObject += PlayerHooks_OnPlayerGrabObject; //PlayerHooks.OnPlayerLetGoObject += PlayerHooks_OnPlayerLetGoObject; //BWUtil.InitialiseGunPrefabs(); #endregion }
public unsafe override void OnApplicationStart() { if (!SteamClient.IsValid) { SteamClient.Init(823500); } #if DEBUG MelonModLogger.LogWarning("Debug build!"); #endif MelonLogger.Log($"Multiplayer initialising with protocol version {PROTOCOL_VERSION}."); // Set up prefs MelonPrefs.RegisterCategory("MPMod", "Multiplayer Settings"); MelonPrefs.RegisterBool("MPMod", "BaldFord", false, "90% effective hair removal solution"); // Initialise transport layer TransportLayer = new SteamTransportLayer(); // Create the UI and cache the PlayerRep's model ui = new MultiplayerUI(); client = new Client(ui, TransportLayer); server = new Server(ui, TransportLayer); PlayerRep.LoadFord(); // Configures if the PlayerRep's are showing or hiding certain parts PlayerRep.showBody = true; PlayerRep.showHair = MelonPrefs.GetBool("MPMod", "BaldFord"); // Initialize Discord's RichPresence RichPresence.Initialise(701895326600265879); client.SetupRP(); BWUtil.Hook(); UnhollowerRuntimeLib.ClassInjector.RegisterTypeInIl2Cpp <SyncedObject>(); }
public static Engine AddGameSpecificClasses(Engine myengine, Dictionary <string, string> yourLibraries = null) { //copy the static readonly dict var finalLibs = new Dictionary <string, string>(GameDllNames); //if we have libraries copy them to the finallibs dict yourLibraries?.ToList().ForEach(PrefixAndLibraryName => { var(prefix, LibraryName) = PrefixAndLibraryName; var mykey = prefix; //Handle duplicates, there might be a better way but i didn't want something too complex if (finalLibs.ContainsKey(prefix)) { mykey = $"z{mykey}"; MelonModLogger.LogWarning($" new prefix for {LibraryName} is {mykey} "); } finalLibs.Add(mykey, LibraryName); }); myengine = GenerateJintRefrences(myengine, finalLibs); return(myengine); }
// 'Do' methods public static void DoErrorPopup(string title, string content) { MelonModLogger.LogWarning(content); VRCUiPopupManager.field_Private_Static_VRCUiPopupManager_0.Method_Public_Void_String_String_Single_3(title, content, 20f); }
private static void ProcessNextOfCoroutine(IEnumerator enumerator) { try { if (!enumerator.MoveNext()) // Run the next step of the coroutine. If it's done, restore the parent routine { var indices = ourCoroutinesStore.Select((it, idx) => (idx, it)).Where(it => it.it.WaitCondition == enumerator).Select(it => it.idx).ToList(); for (var i = indices.Count - 1; i >= 0; i--) { var index = indices[i]; ourNextFrameCoroutines.Add(ourCoroutinesStore[index].Coroutine); ourCoroutinesStore.RemoveAt(index); } return; } } catch (Exception e) { MelonModLogger.LogError(e.ToString()); Stop(FindOriginalCoro(enumerator)); // We want the entire coroutine hierachy to stop when an error happen } var next = enumerator.Current; switch (next) { case null: ourNextFrameCoroutines.Add(enumerator); return; case WaitForFixedUpdate _: ourWaitForFixedUpdateCoroutines.Add(enumerator); return; case WaitForEndOfFrame _: ourWaitForEndOfFrameCoroutines.Add(enumerator); return; case WaitForSeconds _: break; // do nothing, this one is supported in Process case Il2CppObjectBase il2CppObjectBase: var nextAsEnumerator = il2CppObjectBase.TryCast <Il2CppSystem.Collections.IEnumerator>(); if (nextAsEnumerator != null) // il2cpp IEnumerator also handles CustomYieldInstruction { next = new Il2CppEnumeratorWrapper(nextAsEnumerator); } else { MelonModLogger.LogWarning($"Unknown coroutine yield object of type {il2CppObjectBase} for coroutine {enumerator}"); } break; } ourCoroutinesStore.Add(new CoroTuple { WaitCondition = next, Coroutine = enumerator }); if (next is IEnumerator nextCoro) { ProcessNextOfCoroutine(nextCoro); } }
private static ISupportModule Initialize() { LogSupport.RemoveAllHandlers(); if (Console.Enabled || Imports.IsDebugMode()) { LogSupport.InfoHandler += MelonModLogger.Log; } LogSupport.WarningHandler += MelonModLogger.LogWarning; LogSupport.ErrorHandler += MelonModLogger.LogError; if (Imports.IsDebugMode()) { LogSupport.TraceHandler += MelonModLogger.Log; } try { Assembly il2cppSystem = Assembly.Load("Il2CppSystem"); if (il2cppSystem != null) { Type unitytls = il2cppSystem.GetType("Il2CppMono.Unity.UnityTls"); if (unitytls != null) { unsafe { var tlsHookTarget = typeof(Uri).Assembly.GetType("Mono.Unity.UnityTls").GetMethod("GetUnityTlsInterface", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).MethodHandle.GetFunctionPointer(); var unityMethodField = UnhollowerUtils.GetIl2CppMethodInfoPointerFieldForGeneratedMethod(unitytls.GetMethod("GetUnityTlsInterface", BindingFlags.Public | BindingFlags.Static)); var unityMethodPtr = (IntPtr)unityMethodField.GetValue(null); var unityMethod = *(IntPtr *)unityMethodPtr; Imports.Hook((IntPtr)(&tlsHookTarget), unityMethod); } } else { throw new Exception("Failed to get Type Il2CppMono.Unity.UnityTls!"); } } else { throw new Exception("Failed to get Assembly Il2CppSystem!"); } } catch (Exception ex) { MelonModLogger.LogWarning("Exception while setting up TLS, mods will not be able to use HTTPS: " + ex); } if (MelonLoader.Main.IsVRChat) { try { Assembly Transmtn = Assembly.Load("Transmtn"); if (Transmtn != null) { Type Transmtn_HttpConnection = Transmtn.GetType("Transmtn.HttpConnection"); if (Transmtn_HttpConnection != null) { Il2CppSystem_Console_WriteLine = typeof(Il2CppSystem.Console).GetMethods(BindingFlags.Public | BindingFlags.Static).First(x => (x.Name.Equals("WriteLine") && (x.GetParameters().Count() == 1) && (x.GetParameters()[0].ParameterType == typeof(string)))); if (harmonyInstance == null) { harmonyInstance = HarmonyInstance.Create("MelonLoader.Support.Il2Cpp"); } harmonyInstance.Patch(Transmtn_HttpConnection.GetMethod("get", BindingFlags.Public | BindingFlags.Instance), new HarmonyMethod(typeof(Main).GetMethod("Transmtn_HttpConnection_get_Prefix", BindingFlags.NonPublic | BindingFlags.Static)), new HarmonyMethod(typeof(Main).GetMethod("Transmtn_HttpConnection_get_Postfix", BindingFlags.NonPublic | BindingFlags.Static))); } else { throw new Exception("Failed to get Type Transmtn.HttpConnection!"); } } else { throw new Exception("Failed to get Assembly Transmtn!"); } } catch (Exception ex) { MelonModLogger.LogWarning("Exception while setting up Auth Token Hider, Auth Tokens may show in Console: " + ex); } } ClassInjector.DoHook += Imports.Hook; GetUnityVersionNumbers(out var major, out var minor, out var patch); UnityVersionHandler.Initialize(major, minor, patch); SetAsLastSiblingDelegateField = IL2CPP.ResolveICall <SetAsLastSiblingDelegate>("UnityEngine.Transform::SetAsLastSibling"); ClassInjector.RegisterTypeInIl2Cpp <MelonLoaderComponent>(); MelonLoaderComponent.Create(); SceneManager.sceneLoaded = ( (SceneManager.sceneLoaded == null) ? new Action <Scene, LoadSceneMode>(OnSceneLoad) : Il2CppSystem.Delegate.Combine(SceneManager.sceneLoaded, (UnityAction <Scene, LoadSceneMode>) new Action <Scene, LoadSceneMode>(OnSceneLoad)).Cast <UnityAction <Scene, LoadSceneMode> >() ); Camera.onPostRender = ( (Camera.onPostRender == null) ? new Action <Camera>(OnPostRender) : Il2CppSystem.Delegate.Combine(Camera.onPostRender, (Camera.CameraCallback) new Action <Camera>(OnPostRender)).Cast <Camera.CameraCallback>() ); return(new Module()); }