using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Reflection.Emit; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using CommonAPI; using CommonAPI.Systems; using CommonAPI.Systems.ModLocalization; using HarmonyLib; using UnityEngine; using UnityEngine.UI; using xiaoye97; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyCompany("RebindBuildBar")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+d4abe83355a8a069fdf639551348ae1b14bb56ed")] [assembly: AssemblyProduct("RebindBuildBar")] [assembly: AssemblyTitle("RebindBuildBar")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace RebindBuildBar; [HarmonyPatch] public static class Patches { public delegate bool RefAction(ref T1 arg1, T2 arg2, T3 arg3); public static UIBuildMenu buildMenu; public static ConfigFile customBarBind = new ConfigFile(Paths.ConfigPath + "/RebindBuildBar/CustomBarBind.cfg", true); private static Vector2 pickerPos = new Vector2(-300f, 238f); public static Color textColor = new Color(0.3821f, 0.8455f, 1f, 0.7843f); public static Color lockedTextColor = new Color(0.8f, 0f, 0f, 0.5f); public static Color normalColor = new Color(0.588f, 0.588f, 0.588f, 0.7f); public static Color disabledColor = new Color(0.2f, 0.15f, 0.15f, 0.7f); private static string _lockedText; public static string lockedText { get { if (string.IsNullOrEmpty(_lockedText)) { _lockedText = Localization.Translate("LockedTipText"); if (_lockedText.Length < 10) { int count = (10 - _lockedText.Length) / 2; _lockedText += new string(' ', count); } } return _lockedText; } } [HarmonyPatch(typeof(UIBuildMenu), "_OnCreate")] [HarmonyPostfix] public static void InitResetButton(UIBuildMenu __instance) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Unknown result type (might be due to invalid IL or missing references) buildMenu = __instance; GameObject val = RebindBuildBarPlugin.resources.bundle.LoadAsset("Assets/RebindBuildBar/UI/buildmenu-button.prefab"); GameObject val2 = Object.Instantiate(val, __instance.childGroup.transform, false); ((RectTransform)val2.transform).anchoredPosition = new Vector2(-300f, 5f); UIButton component = val2.GetComponent(); component.onClick += delegate { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Expected O, but got Unknown bool heldCtrl = CustomKeyBindSystem.GetKeyBind("ReassignBuildBar").keyValue; string text = Localization.Translate(heldCtrl ? "ResetBuildMenuQuestion1" : "ResetBuildMenuQuestion2"); UIMessageBox.Show(Localization.Translate("ResetBuildMenuQuestionTitle"), text, Localization.Translate("否"), Localization.Translate("是"), 2, (Response)null, (Response)delegate { //IL_0028: Unknown result type (might be due to invalid IL or missing references) ResetBuildBarItems(heldCtrl); buildMenu.SetCurrentCategory(buildMenu.currentCategory); VFAudio.Create("ui-click-0", (Transform)null, Vector3.zero, true, 0, -1, -1L); }); }; __instance.randRemindTips = Array.Empty(); } public static void ResetBuildBarItems(bool heldCtrl) { UIBuildMenu.staticLoaded = false; if (heldCtrl) { UIBuildMenu.StaticLoad(); MethodInfo methodInfo = AccessTools.Method(typeof(LDBTool), "SetBuildBar", Array.Empty(), (Type[])null); methodInfo.Invoke(null, Array.Empty()); ResetConfigFile(); customBarBind.Save(); } else { ReloadOneCategory(buildMenu.currentCategory); ResetConfigFile(); customBarBind.Save(); } } public static void ReloadOneCategory(int category) { ItemProto[] dataArray = ((ProtoSet)(object)LDB.items).dataArray; foreach (ItemProto val in dataArray) { int buildIndex = val.BuildIndex; if (buildIndex > 0) { int num = buildIndex / 100; int num2 = buildIndex % 100; if (num == category && num <= 15 && num2 <= 12) { UIBuildMenu.protos[num, num2] = val; } } } FieldInfo fieldInfo = AccessTools.Field(typeof(LDBTool), "BuildBarDict"); Dictionary> dictionary = (Dictionary>)fieldInfo.GetValue(null); foreach (KeyValuePair> item in dictionary) { foreach (KeyValuePair item2 in item.Value) { ItemProto val2 = ((ProtoSet)(object)LDB.items).Select(item2.Value); if (val2 != null && item.Key == category) { UIBuildMenu.protos[item.Key, item2.Key] = val2; } } } UIBuildMenu.staticLoaded = true; } [HarmonyPatch(typeof(UIBuildMenu), "SetCurrentCategory")] [HarmonyTranspiler] public static IEnumerable ShowLockedIcons(IEnumerable instructions) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Expected O, but got Unknown //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_0059: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Expected O, but got Unknown //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007f: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[4] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldc_I4_1, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Callvirt, (object)null, (string)null) }).Advance(-2).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldarg_0, (object)null) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldloc_S, (object)4) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { Transpilers.EmitDelegate>((Action)ButtonLogic) }); return val.InstructionEnumeration(); } [HarmonyPatch(typeof(UIBuildMenu), "_OnUpdate")] [HarmonyTranspiler] public static IEnumerable ShowLockedIconsUpdate(IEnumerable instructions) { //IL_0003: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected O, but got Unknown //IL_0044: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: Expected O, but got Unknown //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Expected O, but got Unknown //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Expected O, but got Unknown //IL_0104: Unknown result type (might be due to invalid IL or missing references) //IL_010a: Expected O, but got Unknown //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0132: Expected O, but got Unknown //IL_0161: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Expected O, but got Unknown //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Expected O, but got Unknown //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_01d7: Expected O, but got Unknown //IL_01e7: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Expected O, but got Unknown //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Expected O, but got Unknown //IL_0231: Unknown result type (might be due to invalid IL or missing references) //IL_0237: Expected O, but got Unknown //IL_0245: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Expected O, but got Unknown //IL_026e: Unknown result type (might be due to invalid IL or missing references) //IL_0274: Expected O, but got Unknown //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0293: Expected O, but got Unknown //IL_02ac: Unknown result type (might be due to invalid IL or missing references) //IL_02b2: Expected O, but got Unknown CodeMatcher val = new CodeMatcher(instructions, (ILGenerator)null).MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Ldfld, (object)AccessTools.Field(typeof(Proto), "ID"), (string)null), new CodeMatch((OpCode?)OpCodes.Stloc_S, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldloc_0, (object)null, (string)null) }).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Ldloc_3, (object)null, (string)null) }).Advance(1) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldloc_2, (object)null) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldarg_0, (object)null) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { Transpilers.EmitDelegate>((Func)delegate(bool result, int index, UIBuildMenu that) { if (result) { return true; } if (!GameMain.history.TechUnlocked(1001) || index == 9) { return false; } that.isAnyCategoryUnlocked = true; return true; }) }); val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[3] { new CodeMatch((OpCode?)OpCodes.Ldarg_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Ldc_I4_1, (object)null, (string)null) }).MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(GameHistoryData), "ItemUnlocked", (Type[])null, (Type[])null), (string)null) }); CodeMatcher val2 = val.Clone(); val2.MatchForward(false, (CodeMatch[])(object)new CodeMatch[1] { new CodeMatch((OpCode?)OpCodes.Stfld, (object)AccessTools.Field(typeof(UIButton), "highlighted"), (string)null) }).Advance(1); Label label = (Label)val2.Operand; val.Advance(1).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Pop, (object)null) }).SetInstruction(new CodeInstruction(OpCodes.Br, (object)label)); val.MatchForward(false, (CodeMatch[])(object)new CodeMatch[4] { new CodeMatch((OpCode?)OpCodes.Ldfld, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(Component), "get_gameObject", (Type[])null, (Type[])null), (string)null), new CodeMatch((OpCode?)OpCodes.Ldc_I4_0, (object)null, (string)null), new CodeMatch((OpCode?)OpCodes.Callvirt, (object)AccessTools.Method(typeof(GameObject), "SetActive", (Type[])null, (Type[])null), (string)null) }).Advance(5).InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldarg_0, (object)null) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { new CodeInstruction(OpCodes.Ldloc_S, (object)9) }) .InsertAndAdvance((CodeInstruction[])(object)new CodeInstruction[1] { Transpilers.EmitDelegate>((Action)ButtonLogic) }); return val.InstructionEnumeration(); } private static void ButtonLogic(UIBuildMenu menu, int i) { if (UIBuildMenu.protos[menu.currentCategory, i] != null && (UIBuildMenu.protos[menu.currentCategory, i].IsEntity || UIBuildMenu.protos[menu.currentCategory, i].BuildMode == 4)) { int iD = ((Proto)UIBuildMenu.protos[menu.currentCategory, i]).ID; if (GameMain.history.ItemUnlocked(iD)) { EnableButton(menu, i, iD); } else if (menu.currentCategory == 9) { DisableButton(menu, i); } else { GhostButton(menu, i, iD); } } else if (menu.currentCategory == 9) { DisableButton(menu, i); } else { GhostButton(menu, i, 0); } } private static void GhostButton(UIBuildMenu menu, int i, int itemId) { //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)menu.childButtons[i] == (Object)null) { return; } if (itemId == 0) { ((Behaviour)menu.childIcons[i]).enabled = false; menu.childButtons[i].tips.itemId = 0; } else { ((Behaviour)menu.childIcons[i]).enabled = true; menu.childButtons[i].tips.itemId = itemId; menu.childButtons[i].tips.corner = 8; menu.childButtons[i].tips.delay = 0.2f; menu.childNumTexts[i].text = lockedText; ((Graphic)menu.childNumTexts[i]).color = lockedTextColor; if ((Object)(object)menu.childIcons[i].sprite == (Object)null && UIBuildMenu.protos[menu.currentCategory, i] != null) { menu.childIcons[i].sprite = UIBuildMenu.protos[menu.currentCategory, i].iconSprite; } ((Graphic)menu.childIcons[i]).color = disabledColor; } ((Component)menu.childButtons[i]).gameObject.SetActive(true); ((Selectable)menu.childButtons[i].button).interactable = true; } private static void DisableButton(UIBuildMenu menu, int i) { if (!((Object)(object)menu.childButtons[i] == (Object)null)) { menu.childNumTexts[i].text = ""; menu.childButtons[i].tips.itemId = 0; ((Selectable)menu.childButtons[i].button).interactable = false; ((Component)menu.childButtons[i].button).gameObject.SetActive(false); } } private static void EnableButton(UIBuildMenu menu, int i, int itemId) { //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_017e: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)menu.childButtons[i] == (Object)null)) { StorageComponent package = menu.player.package; ((Behaviour)menu.childIcons[i]).enabled = true; menu.childButtons[i].tips.itemId = itemId; menu.childButtons[i].tips.corner = 8; menu.childButtons[i].tips.delay = 0.2f; ((Component)menu.childButtons[i].button).gameObject.SetActive(true); int num = package.GetItemCount(itemId); bool flag = menu.player.inhandItemId == itemId; if (flag) { num += menu.player.inhandItemCount; } StringBuilderUtility.WriteKMG(menu.strb, 5, (long)num, false, '\u2009', ' '); menu.childNumTexts[i].text = ((num > 0) ? menu.strb.ToString().Trim() : ""); ((Graphic)menu.childNumTexts[i]).color = textColor; ((Selectable)menu.childButtons[i].button).interactable = true; if ((Object)(object)menu.childIcons[i].sprite == (Object)null && UIBuildMenu.protos[menu.currentCategory, i] != null) { menu.childIcons[i].sprite = UIBuildMenu.protos[menu.currentCategory, i].iconSprite; } ((Graphic)menu.childIcons[i]).color = normalColor; ((Graphic)menu.childTips[i]).color = menu.tipTextColor; menu.childButtons[i].highlighted = flag; } } [HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")] [HarmonyPriority(200)] [HarmonyPostfix] public static void LoadBar() { for (int i = 0; i < UIBuildMenu.protos.GetLength(0); i++) { for (int j = 0; j < UIBuildMenu.protos.GetLength(1); j++) { if (i == 0 || j == 0 || i > 8 || j > 10) { continue; } int num = i * 100 + j; ItemProto val = UIBuildMenu.protos[i, j]; if (val != null && ((Proto)val).ID != 0) { ConfigEntry val2 = customBarBind.Bind("BuildBarBinds", num.ToString(), ((Proto)val).ID, "Item: " + Localization.Translate(((Proto)val).Name)); if (val2.Value == 0) { UIBuildMenu.protos[i, j] = null; } else if (val2.Value > 0 && ((ProtoSet)(object)LDB.items).Exist(val2.Value) && val2.Value != ((Proto)val).ID) { UIBuildMenu.protos[i, j] = ((ProtoSet)(object)LDB.items).Select(val2.Value); } } else { ConfigEntry val3 = customBarBind.Bind("BuildBarBinds", num.ToString(), 0, "Unused"); if (val3.Value > 0 && ((ProtoSet)(object)LDB.items).Exist(val3.Value)) { UIBuildMenu.protos[i, j] = ((ProtoSet)(object)LDB.items).Select(val3.Value); } } } } } private static void ResetConfigFile() { for (int i = 0; i < UIBuildMenu.protos.GetLength(0); i++) { for (int j = 0; j < UIBuildMenu.protos.GetLength(1); j++) { if (i != 0 && j != 0 && i <= 8 && j <= 10) { int num = i * 100 + j; ItemProto val = UIBuildMenu.protos[i, j]; if (val != null && ((Proto)val).ID != 0) { ConfigEntry val2 = customBarBind.Bind("BuildBarBinds", num.ToString(), ((Proto)val).ID, "Item: " + Localization.Translate(((Proto)val).Name)); val2.Value = ((Proto)val).ID; UIBuildMenu.protos[i, j] = val; } else { ConfigEntry val3 = customBarBind.Bind("BuildBarBinds", num.ToString(), 0, "Unused"); val3.Value = 0; UIBuildMenu.protos[i, j] = null; } } } } } [HarmonyPatch(typeof(UIBuildMenu), "OnChildButtonClick")] [HarmonyPrefix] public static bool OnChildClick(UIBuildMenu __instance, int index) { //IL_006e: Unknown result type (might be due to invalid IL or missing references) if (!CustomKeyBindSystem.GetKeyBind("ReassignBuildBar").keyValue) { return true; } if (buildMenu.currentCategory < 1 || buildMenu.currentCategory >= 9) { return true; } int buildIndex = buildMenu.currentCategory * 100 + index; UIItemPickerExtension.Popup(pickerPos, (Action)delegate(ItemProto proto) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) if (proto != null && ((Proto)proto).ID != 0) { ConfigEntry val = customBarBind.Bind("BuildBarBinds", buildIndex.ToString(), ((Proto)proto).ID, "Item: " + Localization.Translate(((Proto)proto).Name)); val.Value = ((Proto)proto).ID; UIBuildMenu.protos[buildMenu.currentCategory, index] = proto; buildMenu.SetCurrentCategory(buildMenu.currentCategory); VFAudio.Create("ui-click-0", (Transform)null, Vector3.zero, true, 0, -1, -1L); } }, true, (Func)((ItemProto proto) => proto.ModelIndex != 0 && proto.CanBuild)); UIRoot.instance.uiGame.itemPicker.OnTypeButtonClick(2); return false; } public static void Update() { //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_01bf: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)buildMenu == (Object)null || !buildMenu.childGroup.gameObject.activeSelf || buildMenu.currentCategory < 1 || buildMenu.currentCategory >= 9) { return; } if (CustomKeyBindSystem.GetKeyBind("ClearBuildBar").keyValue) { for (int i = 1; i <= 10; i++) { if (buildMenu.childButtons[i].isPointerEnter) { int num = buildMenu.currentCategory * 100 + i; ConfigEntry val = customBarBind.Bind("BuildBarBinds", num.ToString(), 0, "Cleared by player"); val.Value = 0; UIBuildMenu.protos[buildMenu.currentCategory, i] = null; buildMenu.SetCurrentCategory(buildMenu.currentCategory); VFAudio.Create("ui-click-0", (Transform)null, Vector3.zero, true, 0, -1, -1L); return; } } } if (!CustomKeyBindSystem.GetKeyBind("ReassignBuildBar").keyValue) { return; } for (int j = 1; j <= 10; j++) { if (!Input.GetKeyDown((KeyCode)(282 + (j - 1))) || !VFInput.inScreen || VFInput.inputing) { continue; } int buildIndex = buildMenu.currentCategory * 100 + j; UIItemPickerExtension.Popup(pickerPos, (Action)delegate(ItemProto proto) { //IL_0096: Unknown result type (might be due to invalid IL or missing references) if (proto != null && ((Proto)proto).ID != 0) { ConfigEntry val2 = customBarBind.Bind("BuildBarBinds", buildIndex.ToString(), ((Proto)proto).ID, "Item: " + Localization.Translate(((Proto)proto).Name)); val2.Value = ((Proto)proto).ID; UIBuildMenu.protos[buildMenu.currentCategory, j] = proto; buildMenu.SetCurrentCategory(buildMenu.currentCategory); VFAudio.Create("ui-click-0", (Transform)null, Vector3.zero, true, 0, -1, -1L); } }, true, (Func)((ItemProto proto) => proto.ModelIndex != 0 && proto.CanBuild)); UIRoot.instance.uiGame.itemPicker.OnTypeButtonClick(2); break; } } } [BepInPlugin("org.kremnev8.plugin.RebindBuildBar", "Rebind Build Bar", "1.0.6")] [BepInDependency(/*Could not decode attribute arguments.*/)] [CommonAPISubmoduleDependency(new string[] { "ProtoRegistry", "CustomKeyBindSystem", "PickerExtensionsSystem", "LocalizationModule" })] public class RebindBuildBarPlugin : BaseUnityPlugin { public const string MODNAME = "RebindBuildBar"; public const string MODGUID = "org.kremnev8.plugin.RebindBuildBar"; public const string MOD_DISP_NAME = "Rebind Build Bar"; public const string VERSION = "1.0.6"; public static ManualLogSource logger; public static ResourceData resources; private void Awake() { //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_0105: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0160: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Expected O, but got Unknown logger = ((BaseUnityPlugin)this).Logger; string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); resources = new ResourceData("RebindBuildBar", "RebindBuildBar", directoryName); resources.LoadAssetBundle("rebindbarbundle"); LocalizationModule.RegisterTranslation("ResetBuildMenuTipTitle", "Reset Build Bar item binding"); LocalizationModule.RegisterTranslation("ResetBuildMenuTip", "Pressing this button will reset Build Bar items in current category to their defaults. Holding ctrl (Rebindable) resets all items in all categories."); LocalizationModule.RegisterTranslation("ResetBuildMenuQuestionTitle", "Are you sure?"); LocalizationModule.RegisterTranslation("ResetBuildMenuQuestion1", "This action will reset all Build Bar items in build bar to their defaults"); LocalizationModule.RegisterTranslation("ResetBuildMenuQuestion2", "This action will reset Build Bar items in current category to their defaults"); LocalizationModule.RegisterTranslation("KEYReassignBuildBar", "Reassign Build Bar item"); LocalizationModule.RegisterTranslation("KEYClearBuildBar", "Clear Build Bar item"); LocalizationModule.RegisterTranslation("LockedTipText", "Locked"); CustomKeyBindSystem.RegisterKeyBind(new BuiltinKey { id = 150, key = new CombineKey(0, (byte)2, (ECombineKeyAction)0, false), conflictGroup = 2050, name = "ReassignBuildBar", canOverride = true }); CustomKeyBindSystem.RegisterKeyBind(new BuiltinKey { id = 151, key = new CombineKey(325, (byte)0, (ECombineKeyAction)0, false), conflictGroup = 4098, name = "ClearBuildBar", canOverride = true }); Harmony val = new Harmony("org.kremnev8.plugin.RebindBuildBar"); val.PatchAll(typeof(Patches)); logger.LogInfo((object)"Rebind Build Bar mod is loaded successfully!"); } private void Update() { Patches.Update(); } }