Please disclose if your mod was created primarily 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 LastUsedWeapons v2.0.1
LastUsedWeapons.dll
Decompiled 2 years agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: AssemblyTitle("LastUsedWeapons")] [assembly: AssemblyDescription("Adds new shortcut to equip items you last held in your hands. Think 'Q' in CS.")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("bakaspaceman")] [assembly: AssemblyProduct("LastUsedWeapons")] [assembly: AssemblyCopyright("Copyright © bakaspaceman 2021-2023")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("840eefbf-ed22-45a8-9db3-b7e50d11d3fa")] [assembly: AssemblyFileVersion("2.0.1")] [assembly: TargetFramework(".NETFramework,Version=v4.6.2", FrameworkDisplayName = ".NET Framework 4.6.2")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("2.0.1.0")] [module: UnverifiableCode] public class BepInPluginTemplate : BaseUnityPlugin { public enum LogMessageType { LogInfo, LogMessage, LogDebug, LogWarning, LogError, LogFatal } public static ConfigEntry<bool> enableLogging; public static ConfigEntry<bool> enableTranspilerLogging; protected BepInPlugin BepInAttr { get; set; } protected static Harmony harmonyInst { get; set; } protected static BepInPluginTemplate modInst { get; set; } protected static ManualLogSource Logger { get; set; } public static void DebugTranspilerLog(object message, LogMessageType msgType = LogMessageType.LogInfo) { DebugLog(message, msgType, transpilerlogs: true); } public static void DebugLog(object message, LogMessageType msgType = LogMessageType.LogInfo, bool transpilerlogs = false) { if (enableLogging != null && enableLogging.Value && (!transpilerlogs || enableTranspilerLogging == null || enableTranspilerLogging.Value)) { switch (msgType) { case LogMessageType.LogMessage: Logger.LogMessage(message); break; case LogMessageType.LogDebug: Logger.LogDebug(message); break; case LogMessageType.LogWarning: Logger.LogWarning(message); break; case LogMessageType.LogError: Logger.LogError(message); break; case LogMessageType.LogFatal: Logger.LogFatal(message); break; default: Logger.LogInfo(message); break; } } } public static void PrintOutInstructions(List<CodeInstruction> instructions) { DebugTranspilerLog(""); DebugTranspilerLog("#############################################################"); DebugTranspilerLog($"######## MODIFIED INSTRUCTIONS - {instructions.Count} ########"); DebugTranspilerLog("#############################################################"); DebugTranspilerLog(""); for (int i = 0; i < instructions.Count; i++) { CodeInstruction arg = instructions[i]; DebugTranspilerLog($"{i} {arg}"); } } protected virtual void Awake() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_0050: Expected O, but got Unknown modInst = this; BepInAttr = (BepInPlugin)Attribute.GetCustomAttribute(((object)this).GetType(), typeof(BepInPlugin)); Logger = Logger.CreateLogSource(BepInAttr.Name); harmonyInst = new Harmony(BepInAttr.GUID); DebugLog("Loading.."); } protected virtual void OnDestroy() { if (harmonyInst != null) { harmonyInst.UnpatchSelf(); } DebugLog("Unloading.."); Logger.Sources.Remove((ILogSource)(object)Logger); } } internal static class BepInExHelpers { public static ObjectDB FindObjectDB() { GameObject val = GameObject.Find("_GameMain"); if ((Object)(object)val != (Object)null) { ObjectDB component = val.GetComponent<ObjectDB>(); if ((Object)(object)component != (Object)null) { return component; } } return null; } } public static class MathUtils { public static string ColorRGBToHexString(int r, int g, int b) { return $"#{r:X2}{g:X2}{b:X2}"; } public static float ConvertRange(float originalStart, float originalEnd, float newStart, float newEnd, float value) { double num = (double)(newEnd - newStart) / (double)(originalEnd - originalStart); return (float)((double)newStart + (double)(value - originalStart) * num); } public static float Clamp(float value, float min, float max) { if (!(value < min)) { if (!(value > max)) { return value; } return max; } return min; } } public static class EasingFunctions { public enum Ease { EaseInQuad, EaseOutQuad, EaseInOutQuad, EaseInCubic, EaseOutCubic, EaseInOutCubic, EaseInQuart, EaseOutQuart, EaseInOutQuart, EaseInQuint, EaseOutQuint, EaseInOutQuint, EaseInSine, EaseOutSine, EaseInOutSine, EaseInExpo, EaseOutExpo, EaseInOutExpo, EaseInCirc, EaseOutCirc, EaseInOutCirc, Linear, Spring, EaseInBounce, EaseOutBounce, EaseInOutBounce, EaseInBack, EaseOutBack, EaseInOutBack, EaseInElastic, EaseOutElastic, EaseInOutElastic } public delegate float Function(float s, float e, float v); private const float NATURAL_LOG_OF_2 = 0.6931472f; public static float Linear(float start, float end, float value) { return Mathf.Lerp(start, end, value); } public static float Spring(float start, float end, float value) { value = Mathf.Clamp01(value); value = (Mathf.Sin(value * (float)Math.PI * (0.2f + 2.5f * value * value * value)) * Mathf.Pow(1f - value, 2.2f) + value) * (1f + 1.2f * (1f - value)); return start + (end - start) * value; } public static float EaseInQuad(float start, float end, float value) { end -= start; return end * value * value + start; } public static float EaseOutQuad(float start, float end, float value) { end -= start; return (0f - end) * value * (value - 2f) + start; } public static float EaseInOutQuad(float start, float end, float value) { value /= 0.5f; end -= start; if (value < 1f) { return end * 0.5f * value * value + start; } value -= 1f; return (0f - end) * 0.5f * (value * (value - 2f) - 1f) + start; } public static float EaseInCubic(float start, float end, float value) { end -= start; return end * value * value * value + start; } public static float EaseOutCubic(float start, float end, float value) { value -= 1f; end -= start; return end * (value * value * value + 1f) + start; } public static float EaseInOutCubic(float start, float end, float value) { value /= 0.5f; end -= start; if (value < 1f) { return end * 0.5f * value * value * value + start; } value -= 2f; return end * 0.5f * (value * value * value + 2f) + start; } public static float EaseInQuart(float start, float end, float value) { end -= start; return end * value * value * value * value + start; } public static float EaseOutQuart(float start, float end, float value) { value -= 1f; end -= start; return (0f - end) * (value * value * value * value - 1f) + start; } public static float EaseInOutQuart(float start, float end, float value) { value /= 0.5f; end -= start; if (value < 1f) { return end * 0.5f * value * value * value * value + start; } value -= 2f; return (0f - end) * 0.5f * (value * value * value * value - 2f) + start; } public static float EaseInQuint(float start, float end, float value) { end -= start; return end * value * value * value * value * value + start; } public static float EaseOutQuint(float start, float end, float value) { value -= 1f; end -= start; return end * (value * value * value * value * value + 1f) + start; } public static float EaseInOutQuint(float start, float end, float value) { value /= 0.5f; end -= start; if (value < 1f) { return end * 0.5f * value * value * value * value * value + start; } value -= 2f; return end * 0.5f * (value * value * value * value * value + 2f) + start; } public static float EaseInSine(float start, float end, float value) { end -= start; return (0f - end) * Mathf.Cos(value * ((float)Math.PI / 2f)) + end + start; } public static float EaseOutSine(float start, float end, float value) { end -= start; return end * Mathf.Sin(value * ((float)Math.PI / 2f)) + start; } public static float EaseInOutSine(float start, float end, float value) { end -= start; return (0f - end) * 0.5f * (Mathf.Cos((float)Math.PI * value) - 1f) + start; } public static float EaseInExpo(float start, float end, float value) { end -= start; return end * Mathf.Pow(2f, 10f * (value - 1f)) + start; } public static float EaseOutExpo(float start, float end, float value) { end -= start; return end * (0f - Mathf.Pow(2f, -10f * value) + 1f) + start; } public static float EaseInOutExpo(float start, float end, float value) { value /= 0.5f; end -= start; if (value < 1f) { return end * 0.5f * Mathf.Pow(2f, 10f * (value - 1f)) + start; } value -= 1f; return end * 0.5f * (0f - Mathf.Pow(2f, -10f * value) + 2f) + start; } public static float EaseInCirc(float start, float end, float value) { end -= start; return (0f - end) * (Mathf.Sqrt(1f - value * value) - 1f) + start; } public static float EaseOutCirc(float start, float end, float value) { value -= 1f; end -= start; return end * Mathf.Sqrt(1f - value * value) + start; } public static float EaseInOutCirc(float start, float end, float value) { value /= 0.5f; end -= start; if (value < 1f) { return (0f - end) * 0.5f * (Mathf.Sqrt(1f - value * value) - 1f) + start; } value -= 2f; return end * 0.5f * (Mathf.Sqrt(1f - value * value) + 1f) + start; } public static float EaseInBounce(float start, float end, float value) { end -= start; float num = 1f; return end - EaseOutBounce(0f, end, num - value) + start; } public static float EaseOutBounce(float start, float end, float value) { value /= 1f; end -= start; if (value < 0.36363637f) { return end * (7.5625f * value * value) + start; } if (value < 0.72727275f) { value -= 0.54545456f; return end * (7.5625f * value * value + 0.75f) + start; } if ((double)value < 0.9090909090909091) { value -= 0.8181818f; return end * (7.5625f * value * value + 0.9375f) + start; } value -= 21f / 22f; return end * (7.5625f * value * value + 63f / 64f) + start; } public static float EaseInOutBounce(float start, float end, float value) { end -= start; float num = 1f; if (value < num * 0.5f) { return EaseInBounce(0f, end, value * 2f) * 0.5f + start; } return EaseOutBounce(0f, end, value * 2f - num) * 0.5f + end * 0.5f + start; } public static float EaseInBack(float start, float end, float value) { end -= start; value /= 1f; float num = 1.70158f; return end * value * value * ((num + 1f) * value - num) + start; } public static float EaseOutBack(float start, float end, float value) { float num = 1.70158f; end -= start; value -= 1f; return end * (value * value * ((num + 1f) * value + num) + 1f) + start; } public static float EaseInOutBack(float start, float end, float value) { float num = 1.70158f; end -= start; value /= 0.5f; if (value < 1f) { num *= 1.525f; return end * 0.5f * (value * value * ((num + 1f) * value - num)) + start; } value -= 2f; num *= 1.525f; return end * 0.5f * (value * value * ((num + 1f) * value + num) + 2f) + start; } public static float EaseInElastic(float start, float end, float value) { end -= start; float num = 1f; float num2 = num * 0.3f; float num3 = 0f; if (value == 0f) { return start; } if ((value /= num) == 1f) { return start + end; } float num4; if (num3 == 0f || num3 < Mathf.Abs(end)) { num3 = end; num4 = num2 / 4f; } else { num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3); } return 0f - num3 * Mathf.Pow(2f, 10f * (value -= 1f)) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2) + start; } public static float EaseOutElastic(float start, float end, float value) { end -= start; float num = 1f; float num2 = num * 0.3f; float num3 = 0f; if (value == 0f) { return start; } if ((value /= num) == 1f) { return start + end; } float num4; if (num3 == 0f || num3 < Mathf.Abs(end)) { num3 = end; num4 = num2 * 0.25f; } else { num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3); } return num3 * Mathf.Pow(2f, -10f * value) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2) + end + start; } public static float EaseInOutElastic(float start, float end, float value) { end -= start; float num = 1f; float num2 = num * 0.3f; float num3 = 0f; if (value == 0f) { return start; } if ((value /= num * 0.5f) == 2f) { return start + end; } float num4; if (num3 == 0f || num3 < Mathf.Abs(end)) { num3 = end; num4 = num2 / 4f; } else { num4 = num2 / ((float)Math.PI * 2f) * Mathf.Asin(end / num3); } if (value < 1f) { return -0.5f * (num3 * Mathf.Pow(2f, 10f * (value -= 1f)) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2)) + start; } return num3 * Mathf.Pow(2f, -10f * (value -= 1f)) * Mathf.Sin((value * num - num4) * ((float)Math.PI * 2f) / num2) * 0.5f + end + start; } public static Function GetEasingFunction(Ease easingFunction) { return easingFunction switch { Ease.EaseInQuad => EaseInQuad, Ease.EaseOutQuad => EaseOutQuad, Ease.EaseInOutQuad => EaseInOutQuad, Ease.EaseInCubic => EaseInCubic, Ease.EaseOutCubic => EaseOutCubic, Ease.EaseInOutCubic => EaseInOutCubic, Ease.EaseInQuart => EaseInQuart, Ease.EaseOutQuart => EaseOutQuart, Ease.EaseInOutQuart => EaseInOutQuart, Ease.EaseInQuint => EaseInQuint, Ease.EaseOutQuint => EaseOutQuint, Ease.EaseInOutQuint => EaseInOutQuint, Ease.EaseInSine => EaseInSine, Ease.EaseOutSine => EaseOutSine, Ease.EaseInOutSine => EaseInOutSine, Ease.EaseInExpo => EaseInExpo, Ease.EaseOutExpo => EaseOutExpo, Ease.EaseInOutExpo => EaseInOutExpo, Ease.EaseInCirc => EaseInCirc, Ease.EaseOutCirc => EaseOutCirc, Ease.EaseInOutCirc => EaseInOutCirc, Ease.Linear => Linear, Ease.Spring => Spring, Ease.EaseInBounce => EaseInBounce, Ease.EaseOutBounce => EaseOutBounce, Ease.EaseInOutBounce => EaseInOutBounce, Ease.EaseInBack => EaseInBack, Ease.EaseOutBack => EaseOutBack, Ease.EaseInOutBack => EaseInOutBack, Ease.EaseInElastic => EaseInElastic, Ease.EaseOutElastic => EaseOutElastic, Ease.EaseInOutElastic => EaseInOutElastic, _ => null, }; } } namespace LastUsedWeapons; [BepInPlugin("bakaSpaceman.LastUsedWeapons", "Last Used Weapons", "2.0.1")] public class LastUsedWeapons : BepInPluginTemplate { public static ConfigEntry<int> nexusID; private ConfigEntry<KeyboardShortcut> toggleLastEquippedShortcut; public static ConfigEntry<bool> autoEquipAfterSwimming; private static MethodInfo _toggleEquipedMethod = typeof(Humanoid).GetMethod("ToggleEquipped", BindingFlags.Instance | BindingFlags.NonPublic); private static MethodInfo _takeInputMethod = typeof(Player).GetMethod("TakeInput", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo _hiddenRightItemField = typeof(Humanoid).GetField("m_hiddenRightItem", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo _hiddenLeftItemField = typeof(Humanoid).GetField("m_hiddenLeftItem", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo _rightItemField = typeof(Humanoid).GetField("m_rightItem", BindingFlags.Instance | BindingFlags.NonPublic); private static FieldInfo _leftItemField = typeof(Humanoid).GetField("m_leftItem", BindingFlags.Instance | BindingFlags.NonPublic); private static ItemData _lastRightItem = null; private static ItemData _lastLeftItem = null; private static ItemData _equippedRightItem = null; private static ItemData _equippedLeftItem = null; private static bool _cacheLastitems = true; private static bool _hiddenItemsForSwimming = false; private void SetupConfig() { //IL_003c: Unknown result type (might be due to invalid IL or missing references) nexusID = ((BaseUnityPlugin)this).Config.Bind<int>("General", "NexusID", 259, "Nexus mod ID for updates"); toggleLastEquippedShortcut = ((BaseUnityPlugin)this).Config.Bind<KeyboardShortcut>("Key Bindings", "ToggleLastUsedWeapons", new KeyboardShortcut((KeyCode)116, Array.Empty<KeyCode>()), "Equips previous set of weapons"); autoEquipAfterSwimming = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "AutoEquipOnLeavingWater", true, "Will automatically restore weapons that were unequipped on entering water"); } protected override void Awake() { base.Awake(); SetupConfig(); BepInPluginTemplate.harmonyInst.PatchAll(typeof(LastUsedWeapons)); } private void Update() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0034: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)Player.m_localPlayer != (Object)null)) { return; } if ((bool)_takeInputMethod.Invoke(Player.m_localPlayer, new object[0])) { KeyboardShortcut value = toggleLastEquippedShortcut.Value; if (Input.GetKeyDown(((KeyboardShortcut)(ref value)).MainKey)) { ToggleLastEquippedItems(); } } if (autoEquipAfterSwimming.Value && (!((Character)Player.m_localPlayer).IsSwimming() || ((Character)Player.m_localPlayer).IsOnGround())) { if (_hiddenItemsForSwimming) { ((Humanoid)Player.m_localPlayer).ShowHandItems(); } _hiddenItemsForSwimming = false; } } private static void SetLastRightItem(ItemData newRightItem) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Invalid comparison between Unknown and I4 //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Invalid comparison between Unknown and I4 //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Invalid comparison between Unknown and I4 string name = new StackFrame(1).GetMethod().Name; _lastRightItem = newRightItem; if (_lastRightItem != null) { BepInPluginTemplate.DebugLog($"SetLastRightItem: ({name}) set - {_lastRightItem.m_shared.m_name}, type - {_lastRightItem.m_shared.m_itemType}"); } else { BepInPluginTemplate.DebugLog("SetLastRightItem: (" + name + ") set to empty."); } if ((_lastRightItem != null && (int)_lastRightItem.m_shared.m_itemType == 14) || (_lastRightItem != null && (int)_lastRightItem.m_shared.m_itemType == 19) || (_lastLeftItem != null && (int)_lastLeftItem.m_shared.m_itemType == 4)) { _lastLeftItem = null; BepInPluginTemplate.DebugLog("SetLastRightItem: (" + name + ") last LEFT set to empty."); } } private static void SetLastLeftItem(ItemData newLeftItem) { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Unknown result type (might be due to invalid IL or missing references) //IL_0083: Invalid comparison between Unknown and I4 //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Invalid comparison between Unknown and I4 //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Invalid comparison between Unknown and I4 string name = new StackFrame(1).GetMethod().Name; _lastLeftItem = newLeftItem; if (_lastLeftItem != null) { BepInPluginTemplate.DebugLog($"SetLastLeftItem: ({name}) set - {_lastLeftItem.m_shared.m_name}, type - {_lastLeftItem.m_shared.m_itemType}"); } else { BepInPluginTemplate.DebugLog("SetLastLeftItem: (" + name + ") set to empty."); } if ((_lastLeftItem != null && (int)_lastLeftItem.m_shared.m_itemType == 4) || (_lastRightItem != null && ((int)_lastRightItem.m_shared.m_itemType == 14 || (int)_lastRightItem.m_shared.m_itemType == 19))) { _lastRightItem = null; BepInPluginTemplate.DebugLog("SetLastLeftItem: (" + name + ") last RIGHT set to empty."); } } [HarmonyPatch(typeof(Humanoid), "UnequipItem")] [HarmonyPrefix] private static bool UnequipItem_Prefix(Humanoid __instance, ItemData item, bool triggerEquipEffects = true) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return true; } if (!_cacheLastitems) { return true; } if (item != null && item.m_shared != null) { BepInPluginTemplate.DebugLog($"UnequipItem_Prefix: item - {item.m_shared.m_name}, type - {item.m_shared.m_itemType}"); return CacheCurrentlyEquippedItems(__instance, ref _equippedRightItem, ref _equippedLeftItem); } return true; } [HarmonyPatch(typeof(Humanoid), "UnequipItem")] [HarmonyPostfix] private static void UnequipItem_Postfix(Humanoid __instance, ItemData item, bool triggerEquipEffects = true) { //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Invalid comparison between O and Unknown //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Invalid comparison between O and Unknown if (!_cacheLastitems || item == null || item.m_shared == null) { return; } BepInPluginTemplate.DebugLog($"UnequipItem_Postfix: item - {item.m_shared.m_name}, type - {item.m_shared.m_itemType}"); if (!((Object)(object)Player.m_localPlayer != (Object)(object)__instance)) { if ((object)_equippedRightItem != (object)(ItemData)_rightItemField.GetValue(__instance)) { SetLastRightItem(_equippedRightItem); } if ((object)_equippedLeftItem != (object)(ItemData)_leftItemField.GetValue(__instance)) { SetLastLeftItem(_equippedLeftItem); } _equippedRightItem = null; _equippedLeftItem = null; } } [HarmonyPatch(typeof(Humanoid), "EquipItem")] [HarmonyPrefix] private static bool EquipItem_Prefix(Humanoid __instance, ItemData item, bool triggerEquipEffects = true) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006f: Invalid comparison between Unknown and I4 //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Expected O, but got Unknown //IL_00d5: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Invalid comparison between Unknown and I4 //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Invalid comparison between Unknown and I4 //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009a: Invalid comparison between Unknown and I4 //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Invalid comparison between Unknown and I4 //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Invalid comparison between Unknown and I4 if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return true; } BepInPluginTemplate.DebugLog(""); if (item != null && item.m_shared != null) { BepInPluginTemplate.DebugLog($"EquipItem_Prefix: item - {item.m_shared.m_name}, type - {item.m_shared.m_itemType}"); if ((int)item.m_shared.m_itemType == 19 || (int)item.m_shared.m_itemType == 15 || (int)item.m_shared.m_itemType == 3 || (int)item.m_shared.m_itemType == 5 || (int)item.m_shared.m_itemType == 4 || (int)item.m_shared.m_itemType == 14) { ItemData val = (ItemData)_hiddenLeftItemField.GetValue(__instance); ItemData val2 = (ItemData)_hiddenRightItemField.GetValue(__instance); if (val2 != null) { SetLastRightItem(val2); } if (val != null) { SetLastLeftItem(val); } } return true; } BepInPluginTemplate.DebugLog("EquipItem_Prefix: item - NULL"); return true; } [HarmonyPatch(typeof(Humanoid), "HideHandItems")] [HarmonyPrefix] private static bool HideHandItems_Prefix(Humanoid __instance) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)__instance != (Object)(object)Player.m_localPlayer) { return true; } if (((Character)__instance).IsSwimming() && !((Character)__instance).IsOnGround() && ((int)(ItemData)_rightItemField.GetValue(__instance) != 0 || (int)(ItemData)_leftItemField.GetValue(__instance) != 0)) { _hiddenItemsForSwimming = true; } _cacheLastitems = false; return true; } [HarmonyPatch(typeof(Humanoid), "HideHandItems")] [HarmonyPostfix] private static void HideHandItems_Postfix(Humanoid __instance) { if (!((Object)(object)__instance != (Object)(object)Player.m_localPlayer)) { _cacheLastitems = true; } } private void ToggleLastEquippedItems() { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Invalid comparison between Unknown and I4 //IL_028a: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_0180: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_0147: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Invalid comparison between Unknown and I4 //IL_0203: Unknown result type (might be due to invalid IL or missing references) //IL_0323: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player.m_localPlayer == (Object)null || ((Character)Player.m_localPlayer).IsRunning()) { return; } if ((int)(ItemData)_hiddenLeftItemField.GetValue(Player.m_localPlayer) != 0 || (int)(ItemData)_hiddenRightItemField.GetValue(Player.m_localPlayer) != 0) { if (!((Character)Player.m_localPlayer).IsSwimming() || ((Character)Player.m_localPlayer).IsOnGround()) { BepInPluginTemplate.DebugLog(""); BepInPluginTemplate.DebugLog("--- [Toggle Last Equipped] START ---"); ((Humanoid)Player.m_localPlayer).ShowHandItems(); BepInPluginTemplate.DebugLog("ShowHandItems() instead"); BepInPluginTemplate.DebugLog(""); } return; } BepInPluginTemplate.DebugLog(""); BepInPluginTemplate.DebugLog("--- [Toggle Last Equipped] START ---"); _cacheLastitems = false; ItemData rightItem = null; ItemData leftItem = null; CacheCurrentlyEquippedItems((Humanoid)(object)Player.m_localPlayer, ref rightItem, ref leftItem); bool flag = false; bool flag2 = false; bool flag3 = leftItem != null && _lastRightItem != null && (int)_lastRightItem.m_shared.m_itemType == 19; if (_lastRightItem != null) { if (rightItem != null && _lastRightItem.m_shared.m_name == rightItem.m_shared.m_name) { _lastRightItem = null; BepInPluginTemplate.DebugLog("ToggleLastEquippedItems: last RIGHT item is same as current equipped one. Setting to empty."); } else { if (_lastLeftItem != null && (int)_lastLeftItem.m_shared.m_itemType == 15) { _lastLeftItem = null; BepInPluginTemplate.DebugLog("ToggleLastEquippedItems: last LEFT set to empty because its a torch."); } BepInPluginTemplate.DebugLog($"Trying to equip {_lastRightItem.m_shared.m_name}({_lastRightItem.m_shared.m_itemType}) to right arm"); _ = _lastRightItem.m_shared.m_itemType; flag = (bool)_toggleEquipedMethod.Invoke(Player.m_localPlayer, new object[1] { _lastRightItem }); if (flag) { BepInPluginTemplate.DebugLog("Successful"); _lastRightItem = rightItem; if (_lastRightItem != null) { BepInPluginTemplate.DebugLog($"ToggleLastEquippedItems: last RIGHT set - {_lastRightItem.m_shared.m_name}, type - {_lastRightItem.m_shared.m_itemType}"); } else { BepInPluginTemplate.DebugLog("ToggleLastEquippedItems: last RIGHT set to empty."); } } } } if (_lastLeftItem != null) { if (leftItem != null && _lastLeftItem.m_shared.m_name == leftItem.m_shared.m_name) { _lastLeftItem = null; BepInPluginTemplate.DebugLog("ToggleLastEquippedItems: last LEFT item is same as current equipped one. Setting to empty."); } else { BepInPluginTemplate.DebugLog($"Trying to equip {_lastLeftItem.m_shared.m_name}({_lastLeftItem.m_shared.m_itemType}) to left arm"); _ = _lastLeftItem.m_shared.m_itemType; if ((!flag) ? ((bool)_toggleEquipedMethod.Invoke(Player.m_localPlayer, new object[1] { _lastLeftItem })) : ((Humanoid)Player.m_localPlayer).EquipItem(_lastLeftItem, true)) { BepInPluginTemplate.DebugLog("Successful"); _lastLeftItem = leftItem; if (_lastLeftItem != null) { BepInPluginTemplate.DebugLog($"ToggleLastEquippedItems: last LEFT set - {_lastLeftItem.m_shared.m_name}, type - {_lastLeftItem.m_shared.m_itemType}"); } else { BepInPluginTemplate.DebugLog("ToggleLastEquippedItems: last LEFT set to empty."); } } } } else if (flag3) { _lastLeftItem = leftItem; } _cacheLastitems = true; BepInPluginTemplate.DebugLog("--- [Toggle Last Equipped] END ---"); BepInPluginTemplate.DebugLog(""); } private static bool CacheCurrentlyEquippedItems(Humanoid __instance, ref ItemData rightItem, ref ItemData leftItem) { //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Expected O, but got Unknown //IL_008b: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)Player.m_localPlayer != (Object)(object)__instance || (Object)(object)__instance == (Object)null) { return true; } if (_rightItemField != null) { rightItem = (ItemData)_rightItemField.GetValue(__instance); if (rightItem != null && rightItem.m_shared != null) { BepInPluginTemplate.DebugLog($"Currently equipped RIGHT item - {rightItem.m_shared.m_name}, type - {rightItem.m_shared.m_itemType}"); } } if (_leftItemField != null) { leftItem = (ItemData)_leftItemField.GetValue(__instance); if (leftItem != null && leftItem.m_shared != null) { BepInPluginTemplate.DebugLog($"Currently equipped LEFT item - {leftItem.m_shared.m_name}, type - {leftItem.m_shared.m_itemType}"); } } return true; } }