diff --git a/FuckCohtml/FuckCohtml.csproj b/FuckCohtml/FuckCohtml.csproj
new file mode 100644
index 0000000..cf3b530
--- /dev/null
+++ b/FuckCohtml/FuckCohtml.csproj
@@ -0,0 +1,43 @@
+
+
+
+
+ net472
+ enable
+ latest
+ false
+
+
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\MelonLoader\0Harmony.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Assembly-CSharp-firstpass.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\cohtml.Net.dll
+
+
+ ..\..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\Cohtml.Runtime.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\MelonLoader\MelonLoader.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.CoreModule.dll
+
+
+ C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\ChilloutVR_Data\Managed\UnityEngine.InputLegacyModule.dll
+
+
+
+
+
+
+
+
+
diff --git a/FuckCohtml/FuckCohtml.sln b/FuckCohtml/FuckCohtml.sln
new file mode 100644
index 0000000..eb1c8a7
--- /dev/null
+++ b/FuckCohtml/FuckCohtml.sln
@@ -0,0 +1,25 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio Version 17
+VisualStudioVersion = 17.2.32630.192
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FuckCohtml", "FuckCohtml.csproj", "{D3BA0B4E-9DE9-4AD4-91E2-0A18D0283754}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Release|Any CPU = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {D3BA0B4E-9DE9-4AD4-91E2-0A18D0283754}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D3BA0B4E-9DE9-4AD4-91E2-0A18D0283754}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D3BA0B4E-9DE9-4AD4-91E2-0A18D0283754}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D3BA0B4E-9DE9-4AD4-91E2-0A18D0283754}.Release|Any CPU.Build.0 = Release|Any CPU
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ SolutionGuid = {A63345C7-1CD9-4EA0-B891-8CE1CEB97C8B}
+ EndGlobalSection
+EndGlobal
diff --git a/FuckCohtml/HarmonyPatches.cs b/FuckCohtml/HarmonyPatches.cs
new file mode 100644
index 0000000..83a8cd7
--- /dev/null
+++ b/FuckCohtml/HarmonyPatches.cs
@@ -0,0 +1,57 @@
+using ABI_RC.Core.InteractionSystem;
+using ABI_RC.Core.IO;
+using cohtml;
+using HarmonyLib;
+using System.Reflection;
+using UnityEngine;
+
+namespace NAK.Melons.FuckCohtml.HarmonyPatches;
+
+public static class CohtmlViewPatches
+{
+ private static CohtmlView _quickMenuView;
+ private static CohtmlView _gameMenuView;
+ private static Traverse _quickMenuOpenTraverse;
+ private static Traverse _gameMenuOpenTraverse;
+ private static readonly FieldInfo m_UISystemFieldInfo = AccessTools.Field(typeof(CohtmlView), "m_UISystem");
+
+ private static void CohtmlAdvanceView(CohtmlView cohtmlView, Traverse menuOpenTraverse)
+ {
+ if (!FuckCohtmlMod.EntryEnabled.Value) return;
+
+ // Don't execute if menu is open
+ if (cohtmlView == null || menuOpenTraverse.GetValue()) return;
+
+ // Disable cohtmlView (opening should enable)
+ cohtmlView.enabled = false;
+
+ // Death
+ try
+ {
+ CohtmlUISystem cohtmlUISystem = (CohtmlUISystem)m_UISystemFieldInfo.GetValue(cohtmlView);
+ if (cohtmlUISystem != null) cohtmlView.View.Advance(cohtmlUISystem.Id, (double)Time.unscaledTime * 1000.0);
+ }
+ catch (Exception e)
+ {
+ FuckCohtmlMod.Logger.Error($"An exception was thrown while calling CohtmlView.Advance(). Error message: {e.Message}");
+ }
+ }
+
+ [HarmonyPostfix]
+ [HarmonyPatch(typeof(CVR_MenuManager), "Start")]
+ private static void Postfix_CVR_MenuManager_Start(ref CVR_MenuManager __instance, ref CohtmlView ___quickMenu)
+ {
+ _quickMenuView = ___quickMenu;
+ _quickMenuOpenTraverse = Traverse.Create(__instance).Field("_quickMenuOpen");
+ SchedulerSystem.AddJob(new SchedulerSystem.Job(() => CohtmlAdvanceView(_quickMenuView, _quickMenuOpenTraverse)), 15f, 6f, -1);
+ }
+
+ [HarmonyPostfix]
+ [HarmonyPatch(typeof(ViewManager), "Start")]
+ private static void Postfix_ViewManager_Start(ref ViewManager __instance, ref CohtmlView ___gameMenuView)
+ {
+ _gameMenuView = ___gameMenuView;
+ _gameMenuOpenTraverse = Traverse.Create(__instance).Field("_gameMenuOpen");
+ SchedulerSystem.AddJob(new SchedulerSystem.Job(() => CohtmlAdvanceView(_gameMenuView, _gameMenuOpenTraverse)), 12f, 6f, -1);
+ }
+}
\ No newline at end of file
diff --git a/FuckCohtml/Main.cs b/FuckCohtml/Main.cs
new file mode 100644
index 0000000..b8ecbeb
--- /dev/null
+++ b/FuckCohtml/Main.cs
@@ -0,0 +1,32 @@
+using MelonLoader;
+
+namespace NAK.Melons.FuckCohtml;
+
+public class FuckCohtmlMod : MelonMod
+{
+ public static MelonLogger.Instance Logger;
+ public const string SettingsCategory = "FuckCohtml";
+ public static readonly MelonPreferences_Category CategoryFuckCohtml = MelonPreferences.CreateCategory(SettingsCategory);
+
+ public static readonly MelonPreferences_Entry EntryEnabled =
+ CategoryFuckCohtml.CreateEntry("Enabled", true, description: "Enable FuckCohtml. This forces Cohtml to update at intervals instead of every frame while closed.");
+
+ public override void OnInitializeMelon()
+ {
+ Logger = LoggerInstance;
+ ApplyPatches(typeof(HarmonyPatches.CohtmlViewPatches));
+ }
+
+ private void ApplyPatches(Type type)
+ {
+ try
+ {
+ HarmonyInstance.PatchAll(type);
+ }
+ catch (Exception e)
+ {
+ Logger.Msg($"Failed while patching {type.Name}!");
+ Logger.Error(e);
+ }
+ }
+}
\ No newline at end of file
diff --git a/FuckCohtml/Properties/AssemblyInfo.cs b/FuckCohtml/Properties/AssemblyInfo.cs
new file mode 100644
index 0000000..6cb02b9
--- /dev/null
+++ b/FuckCohtml/Properties/AssemblyInfo.cs
@@ -0,0 +1,31 @@
+using MelonLoader;
+using NAK.Melons.FuckCohtml.Properties;
+using System.Reflection;
+
+
+[assembly: AssemblyVersion(AssemblyInfoParams.Version)]
+[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)]
+[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)]
+[assembly: AssemblyTitle(nameof(NAK.Melons.FuckCohtml))]
+[assembly: AssemblyCompany(AssemblyInfoParams.Author)]
+[assembly: AssemblyProduct(nameof(NAK.Melons.FuckCohtml))]
+
+[assembly: MelonInfo(
+ typeof(NAK.Melons.FuckCohtml.FuckCohtmlMod),
+ nameof(NAK.Melons.FuckCohtml),
+ AssemblyInfoParams.Version,
+ AssemblyInfoParams.Author,
+ downloadLink: "https://github.com/NotAKidOnSteam/FuckCohtml"
+)]
+
+[assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")]
+[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
+[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
+[assembly: HarmonyDontPatchAll]
+
+namespace NAK.Melons.FuckCohtml.Properties;
+internal static class AssemblyInfoParams
+{
+ public const string Version = "1.0.0";
+ public const string Author = "NotAKidoS";
+}
\ No newline at end of file
diff --git a/FuckCohtml/format.json b/FuckCohtml/format.json
new file mode 100644
index 0000000..9af422b
--- /dev/null
+++ b/FuckCohtml/format.json
@@ -0,0 +1,24 @@
+{
+ "_id": -1,
+ "name": "FuckCohtml",
+ "modversion": "1.0.0",
+ "gameversion": "2022r170",
+ "loaderversion": "0.5.7",
+ "modtype": "Mod",
+ "author": "NotAKidoS",
+ "description": "This mod disables the CohtmlView components on the menus and forces them to render at an interval while closed, helping alleviate hitching and performance issues.\n\nHelps with FPS drop while unmuted in online instances.",
+ "searchtags": [
+ "cohtml",
+ "menus",
+ "quick",
+ "fps",
+ "performance"
+ ],
+ "requirements": [
+ "None"
+ ],
+ "downloadlink": "https://github.com/NotAKidOnSteam/FuckCohtml/releases/download/v1.0.0/FuckCohtml.dll",
+ "sourcelink": "https://github.com/NotAKidOnSteam/FuckCohtml/",
+ "changelog": "- Initial Release",
+ "embedcolor": "#8ed6fb"
+}
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..f9b3d4b
--- /dev/null
+++ b/README.md
@@ -0,0 +1,31 @@
+# FuckToes
+Prevents VRIK from autodetecting toes in HalfbodyIK.
+
+Optionally can be applied in FBT, but toes in FBT are nice so you are a monster if so.
+
+
+
+---
+
+Here is the block of text where I tell you this mod is not affiliated or endorsed by ABI.
+https://documentation.abinteractive.net/official/legal/tos/#7-modding-our-games
+
+> I am not affiliated with ABI in any official capacity, these mods are not endorsed or outright permitted by ABI and are subject to scrutiny.
+
+> Neither I nor these mods are in any way affiliated with Alpha Blend Interactive and/or ChilloutVR. Using these modifications might cause issues with the performance, security or stability of the game. Use at your own risk.
+
+> Any modifications that are not approved can get your ABI account terminated and such this modification is following the "modding guidelines" at the best it could be.
+> They reserve the right to punish users using my mod.
+> If you are scared of using modifications in your game do not install mods.
+
+> I do not affiliate ABI and the mod is not supported by ABI.
+
+> Me and this modification are in no affiliation with ABI and not supported by ABI.
+
+> This mod is not affiliated with Alpha Blend Interactive. The mod comes with no warranty. Use at your own risk, as I am not responsible for any misuse.
+
+> I'm not affiliated with Alpha Blend Interactive and this mod is not officially supported by the game.
+
+> When releasing mods to the public, it is required to state, that the mod authors and modification are in no affiliation with ABI and not supported by ABI. :trollface:
+
+> i ran out of places to steal disclaimers from