using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Text; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; [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("BuffsTimer")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.1.2.0")] [assembly: AssemblyInformationalVersion("1.1.2+a20da1e04cd8f2eae27dd43288f4eed370f046a5")] [assembly: AssemblyProduct("Buffs Timer")] [assembly: AssemblyTitle("BuffsTimer")] [assembly: AssemblyVersion("1.1.2.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [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 BuffsTimer { public static class BuffNames { public static Dictionary Dict; static BuffNames() { Dict = new Dictionary { { "addJump", "Jump higher" }, { "addSpeed", "Run faster" }, { "addClimb", "Climb faster" }, { "addGripStrength", "Increased grip strength" }, { "pilled", "Decreased stamina consumption" }, { "addStrike", "Increased melee damage" }, { "addHammer", "Increased piton-hammering ability" }, { "gripResist", "Reduced grip loss" }, { "damageResist", "Increased damage resist" }, { "regenerateGripStrength", "Increased stamina regeneration" }, { "addClimbSpeed", "Climb faster" }, { "roided", "Climb faster (???)" }, { "grabAnything", "Grab any surface" }, { "addStaminaRegen", "Stamina regen faster" }, { "addReach", "Long arm" }, { "boosted", "Boosted (How?)" }, { "divideJumpStrain", "Divides climb-jumps cost" }, { "addGravity", "Gravity changed" }, { "addExtraJumps", "Extra jump" } }; } } public class BuffsMonitorComponent : MonoBehaviour { private Text _targetText; public void Setup(Text targetText) { _targetText = targetText; } private void FixedUpdate() { StringBuilder stringBuilder = new StringBuilder(); if (Plugin.Buffs.Count > 0) { foreach (ItemBuff buff in Plugin.Buffs) { if (buff.IsBuffEnded()) { return; } stringBuilder.AppendLine(buff.ToString()); List buffs = buff.GetBuffs(); foreach (BuffStat item in buffs.Where((BuffStat b) => Math.Round(b.Amount, 2) != 0.0)) { if (BuffNames.Dict.TryGetValue(item.BuffId, out string value)) { stringBuilder.AppendLine($"\t{value} {item.Amount:F2} ({item.MaxAmount:F2})"); } } } } _targetText.text = stringBuilder.ToString(); } } [HarmonyPatch(typeof(HandItem_Buff))] public class HandItem_BuffP { [HarmonyPostfix] [HarmonyPatch("Activate")] public static void Postfix(HandItem_Buff __instance) { string prefabName = ((HandItem)__instance).item.prefabName; Plugin.Logger.LogInfo((object)prefabName); BuffContainer buff = __instance.buff; if (Plugin.Buffs.Any((ItemBuff b) => b.ItemPrefabName.Equals(prefabName))) { Plugin.Buffs.FirstOrDefault((ItemBuff b) => b.ItemPrefabName.Equals(prefabName))?.Buffs.Add(buff); } else { Plugin.AddBuff(prefabName, buff); } } } [HarmonyPatch(typeof(HandItem_Buff_Grub))] public class HandItem_Buff_GrubP { [HarmonyPostfix] [HarmonyPatch("Activate")] public static void Postfix(HandItem_Buff_Grub __instance) { if (!__instance.CanPet()) { return; } string prefabName = ((HandItem)__instance).item.prefabName; BuffContainer buffContainer = __instance.grubPetBuff; ItemBuff itemBuff = Plugin.Buffs.FirstOrDefault((ItemBuff b) => b.Buffs.Any((BuffContainer bc) => bc.id == buffContainer.id)); if (itemBuff == null) { Plugin.AddBuff(prefabName, buffContainer); } } } [HarmonyPatch(typeof(HandItem_Food))] public class HandItem_FoodP { [HarmonyPostfix] [HarmonyPatch("Eat")] public static void Postfix(HandItem_Food __instance) { if (!__instance.useBuff) { return; } string prefabName = ((HandItem)__instance).item.prefabName; if (Plugin.Buffs.Any((ItemBuff b) => (b.ItemPrefabName.Contains("Item_Milk") && prefabName.Contains("Item_Cocoa")) || (b.ItemPrefabName.Contains("Item_Cocoa") && prefabName.Contains("Item_Milk")))) { return; } BuffContainer buff = __instance.buff; ItemBuff itemBuff = Plugin.Buffs.FirstOrDefault((ItemBuff b) => b.ItemPrefabName.Equals("Item_Beans_Periphery")); if (itemBuff != null) { itemBuff.Buffs[0] = buff; } else if (Plugin.Buffs.Any((ItemBuff b) => b.ItemPrefabName.Equals(prefabName))) { Plugin.Buffs.FirstOrDefault((ItemBuff b) => b.ItemPrefabName.Equals(prefabName))?.Buffs.Add(buff); } else { Plugin.AddBuff(prefabName, buff); } } } public class ItemBuff { private readonly string _itemNameFormated; public string ItemPrefabName { get; } public List Buffs { get; } public ItemBuff(string itemName, BuffContainer buff) { ItemPrefabName = itemName; _itemNameFormated = ItemPrefabName.Replace('_', ' ').Replace("Item", "").Replace("Denizen", "") .Replace("Empty", ""); Buffs = new List(1) { buff }; } public override string ToString() { float timer = GetTimer(); return $"{_itemNameFormated}: {timer:F2}s"; } public bool IsBuffEnded() { if (!((double)GetTimer() <= 0.01)) { return false; } Plugin.RemoveBuff(this); return true; } private float GetTimer() { float buff = ((GameEntity)ENT_Player.playerObject).curBuffs.GetBuff("buffTimeMult"); float num = 1f / Mathf.Max(1f + buff, 0.1f); return Buffs.Last().buffTime / (Buffs.Last().loseRate * num); } public List GetBuffs() { List list = new List(); foreach (Buff hiddenBuff in Buffs.SelectMany((BuffContainer buff) => buff.buffs)) { BuffStat buffStat = list.FirstOrDefault((BuffStat b) => b.BuffId == hiddenBuff.id); if (buffStat != null) { buffStat.Amount += hiddenBuff.amount; buffStat.MaxAmount += hiddenBuff.maxAmount; } else { list.Add(new BuffStat(hiddenBuff.id, hiddenBuff.amount, hiddenBuff.maxAmount)); } } return list; } } public class BuffStat(string buffId, float amount, float maxAmount) { public string BuffId { get; } = buffId; public float Amount { get; set; } = amount; public float MaxAmount { get; set; } = maxAmount; } [BepInPlugin("com.crusifixknight.whiteknuckle-buffstimer", "Buffs Timer", "1.1.2")] public class Plugin : BaseUnityPlugin { private Harmony _harmony; private static readonly List _buffs = new List(); internal static ManualLogSource Logger { get; private set; } = null; public static IReadOnlyList Buffs => _buffs; private void Awake() { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown Logger = ((BaseUnityPlugin)this).Logger; _harmony = new Harmony("com.crusifixknight.whiteknuckle-buffstimer.harmony"); _harmony.PatchAll(); Logger.LogInfo((object)"Plugin Buffs Timer is loaded!"); ((Object)((Component)this).gameObject).hideFlags = (HideFlags)4; SceneManager.sceneLoaded += OnSceneLoaded; } private void OnDestroy() { _harmony.UnpatchSelf(); } private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Expected O, but got Unknown //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.Find("GameManager/Canvas/Game UI/GameStateTrackers"); if ((Object)(object)val != (Object)null) { _buffs.Clear(); GameObject val2 = new GameObject("BuffTimer"); val2.transform.SetParent(val.transform, false); Text val3 = val2.AddComponent(); val3.font = Resources.GetBuiltinResource("Arial.ttf"); val3.fontSize = 18; ((Graphic)val3).color = Color.white; ((Graphic)val3).raycastTarget = false; RectTransform component = val2.GetComponent(); Vector2 val4 = default(Vector2); ((Vector2)(ref val4))..ctor(0f, 1f); component.pivot = val4; Vector2 anchorMin = (component.anchorMax = val4); component.anchorMin = anchorMin; component.sizeDelta = new Vector2(400f, 700f); val2.AddComponent().Setup(val3); } } public static void AddBuff(string prefabName, BuffContainer buffContainer) { _buffs.Add(new ItemBuff(prefabName, buffContainer)); } public static void RemoveBuff(ItemBuff buff) { _buffs.Remove(buff); } } internal static class MyPluginInfo { public const string PLUGIN_GUID = "com.crusifixknight.whiteknuckle-buffstimer"; public const string PLUGIN_NAME = "Buffs Timer"; public const string PLUGIN_VERSION = "1.1.2"; } }