Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of Risk of Rain 2 Ukrainian v1.4.11
plugins/Risk_of_Rain_2_Ukrainian.dll
Decompiled 6 months agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Logging; using Microsoft.CodeAnalysis; using MonoMod.RuntimeDetour; using On.RoR2; using On.RoR2.UI; using RoR2; using RoR2.UI; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("Risk_of_Rain_2_Ukrainian")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyDescription("Adds UA localization to Risk of Rain 2 and mods")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+3be9312624a1301550407e68d5df62a7ef219d5b")] [assembly: AssemblyProduct("Risk_of_Rain_2_Ukrainian")] [assembly: AssemblyTitle("Risk_of_Rain_2_Ukrainian")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace Risk_of_Rain_2_Ukrainian { public class FontManager { public static AssetBundle assetBundle = AssetBundle.LoadFromStream(Assembly.GetExecutingAssembly().GetManifestResourceStream("Risk_of_Rain_2_Ukrainian.ukrainianfont")); public static TMP_FontAsset fontBomb; public static TMP_FontAsset fontBombDefault; public static TMP_FontAsset fontDamage; public static TMP_FontAsset fontDamageDefault; public FontManager() { //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Expected O, but got Unknown //IL_009e: Unknown result type (might be due to invalid IL or missing references) fontBomb = assetBundle.LoadAsset<TMP_FontAsset>("Assets/BOMBARD+Ukrainian.asset"); fontBombDefault = Resources.Load<TMP_FontAsset>("TmpFonts/Bombardier/tmpBombDropShadow"); fontDamageDefault = ((TMP_Text)((Component)Resources.Load<GameObject>("Prefabs/Effects/BearProc").transform.Find("TextCamScaler/TextRiser/TextMeshPro")).gameObject.GetComponent<TextMeshPro>()).font; HGTextMeshProUGUI.OnCurrentLanguageChanged += new hook_OnCurrentLanguageChanged(HGTextMeshProUGUI_OnCurrentLanguageChanged); new Hook((MethodBase)typeof(TextMeshProUGUI).GetMethod("LoadFontAsset", (BindingFlags)(-1)), (Delegate)(Action<Action<TextMeshProUGUI>, TextMeshProUGUI>)delegate(Action<TextMeshProUGUI> orig, TextMeshProUGUI self) { orig(self); if ((Object)(object)((TMP_Text)self).font == (Object)(object)fontBombDefault) { ((TMP_Text)self).font = fontBomb; } }); } public void HGTextMeshProUGUI_OnCurrentLanguageChanged(orig_OnCurrentLanguageChanged orig) { orig.Invoke(); if (Object.op_Implicit((Object)(object)fontBomb)) { HGTextMeshProUGUI.defaultLanguageFont = fontBomb; } } } public class GrammaticalGenderManager { public const string FemaleGenderToken = "<жр>"; public const string UaLangName = "uk"; public HashSet<string> FemaleGenderTokensCollection = new HashSet<string>(); public GrammaticalGenderManager() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Expected O, but got Unknown //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown Language.LoadAllTokensFromFolder += new hook_LoadAllTokensFromFolder(LanguageOnLoadAllTokensFromFolder); Util.GetBestBodyName += new hook_GetBestBodyName(UtilOnGetBestBodyName); } private void LanguageOnLoadAllTokensFromFolder(orig_LoadAllTokensFromFolder orig, string folder, List<KeyValuePair<string, string>> output) { if (!folder.StartsWith(RiskOfRain2UaPlugin.LocationDir)) { orig.Invoke(folder, output); return; } List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>(3500); orig.Invoke(folder, list); for (int i = 0; i < list.Count; i++) { KeyValuePair<string, string> keyValuePair = list[i]; if (keyValuePair.Value.StartsWith("<жр>")) { list[i] = new KeyValuePair<string, string>(keyValuePair.Key, keyValuePair.Value.Substring("<жр>".Length)); FemaleGenderTokensCollection.Add(keyValuePair.Key); } } RiskOfRain2UaPlugin.Log.LogInfo((object)$"Found {FemaleGenderTokensCollection.Count} grammatical female gender tokens."); output.AddRange(list); } private string UtilOnGetBestBodyName(orig_GetBestBodyName orig, GameObject bodyObject) { if (!Language.currentLanguage.name.Equals("uk", StringComparison.OrdinalIgnoreCase)) { return orig.Invoke(bodyObject); } return CustomGetBestBodyNameImpl(bodyObject); } private string CustomGetBestBodyNameImpl(GameObject bodyObject) { //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) CharacterBody val = null; string text = "???"; bool isGrammaticallyFemale = false; if (Object.op_Implicit((Object)(object)bodyObject)) { val = bodyObject.GetComponent<CharacterBody>(); } if (Object.op_Implicit((Object)(object)val)) { text = val.GetUserName(); if (FemaleGenderTokensCollection.Contains(val.baseNameToken)) { isGrammaticallyFemale = true; } } else { IDisplayNameProvider component = bodyObject.GetComponent<IDisplayNameProvider>(); if (component != null) { text = component.GetDisplayName(); } } string text2 = text; if (Object.op_Implicit((Object)(object)val)) { if (val.isElite) { BuffIndex[] eliteBuffIndices = BuffCatalog.eliteBuffIndices; foreach (BuffIndex val2 in eliteBuffIndices) { if (val.HasBuff(val2)) { string modifierToken = BuffCatalog.GetBuffDef(val2).eliteDef.modifierToken; text2 = GetStringFormatted(modifierToken, isGrammaticallyFemale, text2); } } } if (Object.op_Implicit((Object)(object)val.inventory)) { if (val.inventory.GetItemCount(Items.InvadingDoppelganger) > 0) { text2 = GetStringFormatted("BODY_MODIFIER_DOPPELGANGER", isGrammaticallyFemale, text2); } if (val.inventory.GetItemCount(Items.GummyCloneIdentifier) > 0) { text2 = GetStringFormatted("BODY_MODIFIER_GUMMYCLONE", isGrammaticallyFemale, text2); } } } return text2; } private string GetStringFormatted(string token, bool isGrammaticallyFemale, params object[] args) { if (isGrammaticallyFemale) { string text = token + "__F"; if (Language.currentLanguage.TokenIsRegistered(text)) { token = text; } } return Language.GetStringFormatted(token, args); } } [BepInPlugin("Risk_of_Rain_2_Ukrainian", "Risk_of_Rain_2_Ukrainian", "1.0.0")] public class RiskOfRain2UaPlugin : BaseUnityPlugin { public static RiskOfRain2UaPlugin Instance; public static string LocationDir; public GrammaticalGenderManager GrammaticalGenderManager; public FontManager FontManager; public static ManualLogSource Log => ((BaseUnityPlugin)Instance).Logger; private void Awake() { Instance = this; LocationDir = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location); Language.collectLanguageRootFolders += LanguageOnCollectLanguageRootFolders; GrammaticalGenderManager = new GrammaticalGenderManager(); FontManager = new FontManager(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin Risk_of_Rain_2_Ukrainian is loaded!"); } private void LanguageOnCollectLanguageRootFolders(List<string> folders) { folders.Add(Path.Combine(LocationDir, "Localization")); } } public static class MyPluginInfo { public const string PLUGIN_GUID = "Risk_of_Rain_2_Ukrainian"; public const string PLUGIN_NAME = "Risk_of_Rain_2_Ukrainian"; public const string PLUGIN_VERSION = "1.0.0"; } }