From a789ba4db158b1c9c350e4b1d32f9727074e8ef8 Mon Sep 17 00:00:00 2001
From: SFGrenade <25555417+SFGrenade@users.noreply.github.com>
Date: Tue, 16 Dec 2025 20:16:24 +0100
Subject: [PATCH 01/10] add changes to make compilable for hk 1.5.12301
---
Assembly-CSharp/Assembly-CSharp.csproj | 47 ++-----------------
Assembly-CSharp/Menu/MenuUtils.cs | 2 +-
Assembly-CSharp/Mod.cs | 1 +
Assembly-CSharp/ModHooks.cs | 12 ++---
Assembly-CSharp/ModListMenu.cs | 2 +-
Assembly-CSharp/Patches/GameManager.cs | 1 +
Assembly-CSharp/Patches/HeroController.cs | 3 +-
Assembly-CSharp/Patches/Language.cs | 55 ++++++++++++-----------
8 files changed, 45 insertions(+), 78 deletions(-)
diff --git a/Assembly-CSharp/Assembly-CSharp.csproj b/Assembly-CSharp/Assembly-CSharp.csproj
index 337c16c9..d9493277 100644
--- a/Assembly-CSharp/Assembly-CSharp.csproj
+++ b/Assembly-CSharp/Assembly-CSharp.csproj
@@ -148,7 +148,7 @@
..\override\mscorlib.dll
-
+
../Vanilla/netstandard.dll
@@ -158,47 +158,8 @@
../Vanilla/PlayMaker.dll
False
-
- ../Vanilla/UnityEngine.dll
-
-
- ../Vanilla/UnityEngine.AnimationModule.dll
-
-
- ../Vanilla/UnityEngine.AssetBundleModule.dll
-
-
- ../Vanilla/UnityEngine.AudioModule.dll
-
-
- ../Vanilla/UnityEngine.CoreModule.dll
-
-
- ../Vanilla/UnityEngine.ImageConversionModule.dll
-
-
- ../Vanilla/UnityEngine.IMGUIModule.dll
-
-
- ../Vanilla/UnityEngine.InputLegacyModule.dll
-
-
- ../Vanilla/UnityEngine.JSONSerializeModule.dll
-
-
- ../Vanilla/UnityEngine.ParticleSystemModule.dll
-
-
- ../Vanilla/UnityEngine.Physics2DModule.dll
-
-
- ../Vanilla/UnityEngine.TextRenderingModule.dll
-
-
- ../Vanilla/UnityEngine.UI.dll
-
-
- ../Vanilla/UnityEngine.UIModule.dll
-
+
+
+
diff --git a/Assembly-CSharp/Menu/MenuUtils.cs b/Assembly-CSharp/Menu/MenuUtils.cs
index af0a1de8..0bd47d9a 100644
--- a/Assembly-CSharp/Menu/MenuUtils.cs
+++ b/Assembly-CSharp/Menu/MenuUtils.cs
@@ -8,7 +8,7 @@
using UnityEngine;
using UnityEngine.UI;
using Patch = Modding.Patches;
-using Lang = Language.Language;
+using Lang = TeamCherry.Localization.Language;
namespace Modding.Menu
diff --git a/Assembly-CSharp/Mod.cs b/Assembly-CSharp/Mod.cs
index 3e476940..c64f4abf 100644
--- a/Assembly-CSharp/Mod.cs
+++ b/Assembly-CSharp/Mod.cs
@@ -10,6 +10,7 @@
using MonoMod.Utils;
using System.Linq;
using Newtonsoft.Json.Linq;
+using Language = TeamCherry.Localization;
// ReSharper disable file UnusedMember.Global
diff --git a/Assembly-CSharp/ModHooks.cs b/Assembly-CSharp/ModHooks.cs
index 1ba7815f..1364fc68 100644
--- a/Assembly-CSharp/ModHooks.cs
+++ b/Assembly-CSharp/ModHooks.cs
@@ -61,10 +61,10 @@ static ModHooks()
{
string[] versionNums = Constants.GAME_VERSION.Split('.');
- gameVersion.major = Convert.ToInt32(versionNums[0]);
- gameVersion.minor = Convert.ToInt32(versionNums[1]);
- gameVersion.revision = Convert.ToInt32(versionNums[2]);
- gameVersion.package = Convert.ToInt32(versionNums[3]);
+ gameVersion.major = versionNums.Length > 0 ? Convert.ToInt32(versionNums[0]) : 0;
+ gameVersion.minor = versionNums.Length > 1 ? Convert.ToInt32(versionNums[1]) : 0;
+ gameVersion.revision = versionNums.Length > 2 ? Convert.ToInt32(versionNums[2]) : 0;
+ gameVersion.package = versionNums.Length > 3 ? Convert.ToInt32(versionNums[3]) : 0;
}
catch (Exception e)
{
@@ -225,7 +225,9 @@ internal static void LogConsole(string message, LogLevel level)
/// N/A
internal static string LanguageGet(string key, string sheet)
{
- string res = Patches.Language.GetInternal(key, sheet);
+ // todo: fixme: yea i think you know what would need fixing
+ // string res = Patches.Language.GetInternal(key, sheet);
+ string res = TeamCherry.Localization.Language.Get(key, sheet);
if (LanguageGetHook == null)
return res;
diff --git a/Assembly-CSharp/ModListMenu.cs b/Assembly-CSharp/ModListMenu.cs
index fec0f388..0a7b6082 100644
--- a/Assembly-CSharp/ModListMenu.cs
+++ b/Assembly-CSharp/ModListMenu.cs
@@ -6,7 +6,7 @@
using UnityEngine.UI;
using static Modding.ModLoader;
using Patch = Modding.Patches;
-using Lang = Language.Language;
+using Lang = TeamCherry.Localization.Language;
namespace Modding
{
diff --git a/Assembly-CSharp/Patches/GameManager.cs b/Assembly-CSharp/Patches/GameManager.cs
index 9510c2d5..90e6d013 100644
--- a/Assembly-CSharp/Patches/GameManager.cs
+++ b/Assembly-CSharp/Patches/GameManager.cs
@@ -8,6 +8,7 @@
using Newtonsoft.Json;
using UnityEngine;
using UnityEngine.SceneManagement;
+using Encryption = TeamCherry.SharedUtils.Encryption;
// ReSharper disable all
#pragma warning disable 1591, 649, 414, 169, CS0108, CS0626
diff --git a/Assembly-CSharp/Patches/HeroController.cs b/Assembly-CSharp/Patches/HeroController.cs
index 8d9bee86..cf98aec6 100644
--- a/Assembly-CSharp/Patches/HeroController.cs
+++ b/Assembly-CSharp/Patches/HeroController.cs
@@ -528,6 +528,7 @@ private void LookForQueueInput()
[MonoModIgnore]
public event HeroController.TakeDamageEvent OnTakenDamage;
+ // todo: fixme: this had changes in the method, check if more shit changed
[MonoModReplace]
public void TakeDamage(GameObject go, CollisionSide damageSide, int damageAmount, int hazardType)
{
@@ -667,7 +668,7 @@ public void TakeDamage(GameObject go, CollisionSide damageSide, int damageAmount
if (this.cState.wallSliding)
{
this.cState.wallSliding = false;
- this.wallSlideVibrationPlayer.Stop();
+ this.vibrationCtrl.StopWallSlide();
}
if (this.cState.touchingWall)
diff --git a/Assembly-CSharp/Patches/Language.cs b/Assembly-CSharp/Patches/Language.cs
index 5fbd34c2..093f62b9 100644
--- a/Assembly-CSharp/Patches/Language.cs
+++ b/Assembly-CSharp/Patches/Language.cs
@@ -7,31 +7,32 @@
namespace Modding.Patches
{
- [MonoModPatch("global::Language.Language")]
- public static class Language
- {
- [MonoModIgnore]
- private static Dictionary> currentEntrySheets;
-
- public static string GetInternal(string key, string sheetTitle)
- {
- if (currentEntrySheets == null || !currentEntrySheets.ContainsKey(sheetTitle))
- {
- Debug.LogError($"The sheet with title \"{sheetTitle}\" does not exist!");
- return string.Empty;
- }
-
- if (currentEntrySheets[sheetTitle].ContainsKey(key))
- {
- return currentEntrySheets[sheetTitle][key];
- }
-
- return "#!#" + key + "#!#";
- }
-
- public static string Get(string key, string sheetTitle)
- {
- return ModHooks.LanguageGet(key, sheetTitle);
- }
- }
+ // todo: fixme: yea i think you know what would need fixing
+// [MonoModPatch("global::Language.Language")]
+// public static class Language
+// {
+// [MonoModIgnore]
+// private static Dictionary> currentEntrySheets;
+//
+// public static string GetInternal(string key, string sheetTitle)
+// {
+// if (currentEntrySheets == null || !currentEntrySheets.ContainsKey(sheetTitle))
+// {
+// Debug.LogError($"The sheet with title \"{sheetTitle}\" does not exist!");
+// return string.Empty;
+// }
+//
+// if (currentEntrySheets[sheetTitle].ContainsKey(key))
+// {
+// return currentEntrySheets[sheetTitle][key];
+// }
+//
+// return "#!#" + key + "#!#";
+// }
+//
+// public static string Get(string key, string sheetTitle)
+// {
+// return ModHooks.LanguageGet(key, sheetTitle);
+// }
+// }
}
\ No newline at end of file
From ad0ffab370efc022b69ebdc1b49fcbb68816e40b Mon Sep 17 00:00:00 2001
From: SFGrenade <25555417+SFGrenade@users.noreply.github.com>
Date: Tue, 16 Dec 2025 20:35:55 +0100
Subject: [PATCH 02/10] it wasn't public, it was private
---
Assembly-CSharp/Patches/HeroController.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Assembly-CSharp/Patches/HeroController.cs b/Assembly-CSharp/Patches/HeroController.cs
index cf98aec6..2ad6fffe 100644
--- a/Assembly-CSharp/Patches/HeroController.cs
+++ b/Assembly-CSharp/Patches/HeroController.cs
@@ -668,7 +668,7 @@ public void TakeDamage(GameObject go, CollisionSide damageSide, int damageAmount
if (this.cState.wallSliding)
{
this.cState.wallSliding = false;
- this.vibrationCtrl.StopWallSlide();
+ ReflectionHelper.GetField("vibrationCtrl").StopWallSlide();
}
if (this.cState.touchingWall)
From bad9b709332acd10f980fe626af145e85668a9ba Mon Sep 17 00:00:00 2001
From: SFGrenade <25555417+SFGrenade@users.noreply.github.com>
Date: Tue, 16 Dec 2025 22:05:39 +0100
Subject: [PATCH 03/10] do fancy private stuff
---
Assembly-CSharp/Patches/HeroController.cs | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/Assembly-CSharp/Patches/HeroController.cs b/Assembly-CSharp/Patches/HeroController.cs
index 2ad6fffe..c4926810 100644
--- a/Assembly-CSharp/Patches/HeroController.cs
+++ b/Assembly-CSharp/Patches/HeroController.cs
@@ -528,6 +528,9 @@ private void LookForQueueInput()
[MonoModIgnore]
public event HeroController.TakeDamageEvent OnTakenDamage;
+ [MonoModIgnore]
+ private HeroVibrationController vibrationCtrl;
+
// todo: fixme: this had changes in the method, check if more shit changed
[MonoModReplace]
public void TakeDamage(GameObject go, CollisionSide damageSide, int damageAmount, int hazardType)
@@ -668,7 +671,7 @@ public void TakeDamage(GameObject go, CollisionSide damageSide, int damageAmount
if (this.cState.wallSliding)
{
this.cState.wallSliding = false;
- ReflectionHelper.GetField("vibrationCtrl").StopWallSlide();
+ this.vibrationCtrl.StopWallSlide();
}
if (this.cState.touchingWall)
From dcfaa9f4e8ebcbc2737d928421a684eb49642d24 Mon Sep 17 00:00:00 2001
From: SFGrenade <25555417+SFGrenade@users.noreply.github.com>
Date: Wed, 17 Dec 2025 01:55:53 +0100
Subject: [PATCH 04/10] language doesn't need to get patched if it doesn't
exist in the first place, so it can just be created - no clue what to do with
`Language.Language.Get(key)` though
---
Assembly-CSharp/Language/Language.cs | 33 ++++++++++++++++++++++++
Assembly-CSharp/Menu/MenuUtils.cs | 2 +-
Assembly-CSharp/Mod.cs | 1 -
Assembly-CSharp/ModHooks.cs | 4 +--
Assembly-CSharp/ModListMenu.cs | 2 +-
Assembly-CSharp/Patches/Language.cs | 38 ----------------------------
6 files changed, 36 insertions(+), 44 deletions(-)
create mode 100644 Assembly-CSharp/Language/Language.cs
delete mode 100644 Assembly-CSharp/Patches/Language.cs
diff --git a/Assembly-CSharp/Language/Language.cs b/Assembly-CSharp/Language/Language.cs
new file mode 100644
index 00000000..763b59cd
--- /dev/null
+++ b/Assembly-CSharp/Language/Language.cs
@@ -0,0 +1,33 @@
+using System.Collections.Generic;
+using Modding;
+using TeamCherry.Localization;
+using UnityEngine;
+using UObject = UnityEngine.Object;
+using TLLanguage = TeamCherry.Localization.Language;
+
+namespace Language;
+
+public static class Language
+{
+ public static void LoadLanguage() => TLLanguage.LoadLanguage();
+ public static void LoadAvailableLanguages() => TLLanguage.LoadAvailableLanguages();
+ public static string[] GetLanguages() => TLLanguage.GetLanguages();
+ public static bool SwitchLanguage(string langCode) => TLLanguage.SwitchLanguage(langCode);
+ public static bool SwitchLanguage(LanguageCode code) => TLLanguage.SwitchLanguage(code);
+ public static UObject GetAsset(string name) => TLLanguage.GetAsset(name);
+ public static LanguageCode CurrentLanguage() => TLLanguage.CurrentLanguage();
+ public static string Get(string key) => TLLanguage.Get(key);
+ //public static string Get(string key, string sheetTitle) => TLLanguage.Get(key, sheetTitle);
+ public static IEnumerable GetSheets() => TLLanguage.GetSheets();
+ public static IEnumerable GetKeys(string sheetTitle) => TLLanguage.GetKeys(sheetTitle);
+ public static bool Has(string key) => TLLanguage.Has(key);
+ public static bool Has(string key, string sheet) => TLLanguage.Has(key, sheet);
+ public static bool HasSheet(string sheet) => TLLanguage.HasSheet(sheet);
+ public static LanguageCode LanguageNameToCode(SystemLanguage name) => TLLanguage.LanguageNameToCode(name);
+
+ public static string GetInternal(string key, string sheetTitle) => TLLanguage.Get(key, sheetTitle);
+ public static string Get(string key, string sheetTitle)
+ {
+ return ModHooks.LanguageGet(key, sheetTitle);
+ }
+}
diff --git a/Assembly-CSharp/Menu/MenuUtils.cs b/Assembly-CSharp/Menu/MenuUtils.cs
index 0bd47d9a..af0a1de8 100644
--- a/Assembly-CSharp/Menu/MenuUtils.cs
+++ b/Assembly-CSharp/Menu/MenuUtils.cs
@@ -8,7 +8,7 @@
using UnityEngine;
using UnityEngine.UI;
using Patch = Modding.Patches;
-using Lang = TeamCherry.Localization.Language;
+using Lang = Language.Language;
namespace Modding.Menu
diff --git a/Assembly-CSharp/Mod.cs b/Assembly-CSharp/Mod.cs
index c64f4abf..3e476940 100644
--- a/Assembly-CSharp/Mod.cs
+++ b/Assembly-CSharp/Mod.cs
@@ -10,7 +10,6 @@
using MonoMod.Utils;
using System.Linq;
using Newtonsoft.Json.Linq;
-using Language = TeamCherry.Localization;
// ReSharper disable file UnusedMember.Global
diff --git a/Assembly-CSharp/ModHooks.cs b/Assembly-CSharp/ModHooks.cs
index 1364fc68..0ea986d3 100644
--- a/Assembly-CSharp/ModHooks.cs
+++ b/Assembly-CSharp/ModHooks.cs
@@ -225,9 +225,7 @@ internal static void LogConsole(string message, LogLevel level)
/// N/A
internal static string LanguageGet(string key, string sheet)
{
- // todo: fixme: yea i think you know what would need fixing
- // string res = Patches.Language.GetInternal(key, sheet);
- string res = TeamCherry.Localization.Language.Get(key, sheet);
+ string res = Language.Language.GetInternal(key, sheet);
if (LanguageGetHook == null)
return res;
diff --git a/Assembly-CSharp/ModListMenu.cs b/Assembly-CSharp/ModListMenu.cs
index 0a7b6082..fec0f388 100644
--- a/Assembly-CSharp/ModListMenu.cs
+++ b/Assembly-CSharp/ModListMenu.cs
@@ -6,7 +6,7 @@
using UnityEngine.UI;
using static Modding.ModLoader;
using Patch = Modding.Patches;
-using Lang = TeamCherry.Localization.Language;
+using Lang = Language.Language;
namespace Modding
{
diff --git a/Assembly-CSharp/Patches/Language.cs b/Assembly-CSharp/Patches/Language.cs
deleted file mode 100644
index 093f62b9..00000000
--- a/Assembly-CSharp/Patches/Language.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System.Collections.Generic;
-using MonoMod;
-using UnityEngine;
-
-// ReSharper disable All
-#pragma warning disable 1591, CS0649
-
-namespace Modding.Patches
-{
- // todo: fixme: yea i think you know what would need fixing
-// [MonoModPatch("global::Language.Language")]
-// public static class Language
-// {
-// [MonoModIgnore]
-// private static Dictionary> currentEntrySheets;
-//
-// public static string GetInternal(string key, string sheetTitle)
-// {
-// if (currentEntrySheets == null || !currentEntrySheets.ContainsKey(sheetTitle))
-// {
-// Debug.LogError($"The sheet with title \"{sheetTitle}\" does not exist!");
-// return string.Empty;
-// }
-//
-// if (currentEntrySheets[sheetTitle].ContainsKey(key))
-// {
-// return currentEntrySheets[sheetTitle][key];
-// }
-//
-// return "#!#" + key + "#!#";
-// }
-//
-// public static string Get(string key, string sheetTitle)
-// {
-// return ModHooks.LanguageGet(key, sheetTitle);
-// }
-// }
-}
\ No newline at end of file
From e4e10bc77adb57fcb5d8b5c647cb7692e120d111 Mon Sep 17 00:00:00 2001
From: SFGrenade <25555417+SFGrenade@users.noreply.github.com>
Date: Thu, 18 Dec 2025 18:35:05 +0100
Subject: [PATCH 05/10] use `MonoMod.MonoModLinkFrom` - but that requires all
`TeamCherry.Localization.Language` to be done dynamically, via strings, as
*all* references to it are replaced, even ones manually written here
---
Assembly-CSharp/Language/Language.cs | 95 +++++++++++++++++++++-------
1 file changed, 71 insertions(+), 24 deletions(-)
diff --git a/Assembly-CSharp/Language/Language.cs b/Assembly-CSharp/Language/Language.cs
index 763b59cd..00f8bdc1 100644
--- a/Assembly-CSharp/Language/Language.cs
+++ b/Assembly-CSharp/Language/Language.cs
@@ -1,33 +1,80 @@
+using System;
using System.Collections.Generic;
-using Modding;
-using TeamCherry.Localization;
-using UnityEngine;
+using System.Reflection;
using UObject = UnityEngine.Object;
-using TLLanguage = TeamCherry.Localization.Language;
+using USystemLanguage = UnityEngine.SystemLanguage;
namespace Language;
+// for backwards compatibility
+[MonoMod.MonoModLinkFrom("TeamCherry.Localization.Language")]
public static class Language
{
- public static void LoadLanguage() => TLLanguage.LoadLanguage();
- public static void LoadAvailableLanguages() => TLLanguage.LoadAvailableLanguages();
- public static string[] GetLanguages() => TLLanguage.GetLanguages();
- public static bool SwitchLanguage(string langCode) => TLLanguage.SwitchLanguage(langCode);
- public static bool SwitchLanguage(LanguageCode code) => TLLanguage.SwitchLanguage(code);
- public static UObject GetAsset(string name) => TLLanguage.GetAsset(name);
- public static LanguageCode CurrentLanguage() => TLLanguage.CurrentLanguage();
- public static string Get(string key) => TLLanguage.Get(key);
- //public static string Get(string key, string sheetTitle) => TLLanguage.Get(key, sheetTitle);
- public static IEnumerable GetSheets() => TLLanguage.GetSheets();
- public static IEnumerable GetKeys(string sheetTitle) => TLLanguage.GetKeys(sheetTitle);
- public static bool Has(string key) => TLLanguage.Has(key);
- public static bool Has(string key, string sheet) => TLLanguage.Has(key, sheet);
- public static bool HasSheet(string sheet) => TLLanguage.HasSheet(sheet);
- public static LanguageCode LanguageNameToCode(SystemLanguage name) => TLLanguage.LanguageNameToCode(name);
-
- public static string GetInternal(string key, string sheetTitle) => TLLanguage.Get(key, sheetTitle);
- public static string Get(string key, string sheetTitle)
+ static Language()
{
- return ModHooks.LanguageGet(key, sheetTitle);
+ TllType = Type.GetType("TeamCherry.Localization.Language, TeamCherry.Localization, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null");
+ TllLoadLanguage = TllType.GetMethod("LoadLanguage", BindingFlags.Public | BindingFlags.Static, null, Array.Empty(), Array.Empty());
+ TllLoadAvailableLanguages = TllType.GetMethod("LoadAvailableLanguages", BindingFlags.Public | BindingFlags.Static, null, Array.Empty(), Array.Empty());
+ TllGetLanguages = TllType.GetMethod("GetLanguages", BindingFlags.Public | BindingFlags.Static, null, Array.Empty(), Array.Empty());
+ TllSwitchLanguageStr = TllType.GetMethod("SwitchLanguage", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string) }, Array.Empty());
+ TllSwitchLanguageLc = TllType.GetMethod("SwitchLanguage", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(TeamCherry.Localization.LanguageCode) }, Array.Empty());
+ TllGetAsset = TllType.GetMethod("GetAsset", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string) }, Array.Empty());
+ TllCurrentLanguage = TllType.GetMethod("CurrentLanguage", BindingFlags.Public | BindingFlags.Static, null, Array.Empty(), Array.Empty());
+ TllGet1 = TllType.GetMethod("Get", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string) }, Array.Empty());
+ TllGetSheets = TllType.GetMethod("GetSheets", BindingFlags.Public | BindingFlags.Static, null, Array.Empty(), Array.Empty());
+ TllGetKeys = TllType.GetMethod("GetKeys", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string) }, Array.Empty());
+ TllHas1 = TllType.GetMethod("Has", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string) }, Array.Empty());
+ TllHas2 = TllType.GetMethod("Has", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string), typeof(string) }, Array.Empty());
+ TllHasSheet = TllType.GetMethod("HasSheet", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string) }, Array.Empty());
+ TllLanguageNameToCode = TllType.GetMethod("LanguageNameToCode", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(USystemLanguage) }, Array.Empty());
+ TllGet2 = TllType.GetMethod("Get", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(string), typeof(string) }, Array.Empty());
}
-}
+ private static readonly Type TllType;
+
+ private static readonly MethodInfo TllLoadLanguage;
+ public static void LoadLanguage() => TllLoadLanguage.Invoke(null, Array.Empty