using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("BossComfort")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("BossComfort")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("c575be0d-d860-49eb-b521-92e2d44465cf")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyVersion("1.0.0.0")] namespace BossComfort; [BepInPlugin("linken.bosscomfort", "Boss Comfort", "1.0.0")] public class Plugin : BaseUnityPlugin { public const string ModGUID = "linken.bosscomfort"; public const string ModName = "Boss Comfort"; public const string ModVersion = "1.0.0"; public static ConfigEntry ComfortRadius; public static ConfigEntry TrophyValues; public static ConfigEntry CacheRefreshInterval; private Harmony harmony; private void Awake() { //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_007d: Expected O, but got Unknown ComfortRadius = ((BaseUnityPlugin)this).Config.Bind("General", "ComfortRadius", 15f, "Distance in meters to detect trophies on item stands"); CacheRefreshInterval = ((BaseUnityPlugin)this).Config.Bind("General", "CacheRefreshInterval", 5f, "How often (in seconds) to refresh the list of nearby item stands."); TrophyValues = ((BaseUnityPlugin)this).Config.Bind("Trophies", "TrophyValues", "TrophyEikthyr:1,TrophyTheElder:1,TrophyBonemass:1,TrophyDragonQueen:1,TrophyGoblinKing:1,TrophySeekerQueen:1,TrophyFader:1,TrophyBjorn:1,TrophySkeletonHildir:1,TrophySerpent:1,TrophyAbomination:1,TrophyCultist:1,TrophySGolem:1,TrophyCultist_Hildir:1,TrophyBjornUndead:1,TrophyGoblinBruteBrosShaman:1,TrophyGoblinBruteBrosBrute:1,TrophyTick:1,TrophyFallenValkyrie:1,TrophyMorgen:1", "Comma-separated list of trophy prefab names and their comfort values. Format: PrefabName:ComfortValue"); harmony = new Harmony("linken.bosscomfort"); harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Boss Comfort loaded!"); } } public static class TrophyComfortManager { public static Dictionary ParseTrophies() { Dictionary dictionary = new Dictionary(); string[] array = Plugin.TrophyValues.Value.Split(new char[1] { ',' }); string[] array2 = array; foreach (string text in array2) { string[] array3 = text.Split(new char[1] { ':' }); if (array3.Length == 2) { string key = array3[0].Trim(); if (int.TryParse(array3[1].Trim(), out var result)) { dictionary[key] = result; } } } return dictionary; } } [HarmonyPatch(typeof(Player), "GetComfortLevel")] public static class ComfortPatch { private static ItemStand[] cachedStands = (ItemStand[])(object)new ItemStand[0]; private static float lastCacheTime = -999f; private static int cachedExtraComfort = 0; private static float lastComfortCalcTime = -999f; private static readonly float COMFORT_COOLDOWN = 4f; private static readonly float CACHE_COOLDOWN_DEFAULT = 5f; private static void Postfix(Player __instance, ref int __result) { if ((Object)(object)__instance == (Object)null) { return; } float realtimeSinceStartup = Time.realtimeSinceStartup; if (realtimeSinceStartup - lastComfortCalcTime < COMFORT_COOLDOWN) { __result += cachedExtraComfort; return; } float num = ((Plugin.CacheRefreshInterval != null) ? Plugin.CacheRefreshInterval.Value : CACHE_COOLDOWN_DEFAULT); if (realtimeSinceStartup - lastCacheTime > num) { cachedStands = Object.FindObjectsByType((FindObjectsSortMode)0); lastCacheTime = realtimeSinceStartup; } lastComfortCalcTime = realtimeSinceStartup; cachedExtraComfort = CalculateExtraComfort(__instance); __result += cachedExtraComfort; } private static int CalculateExtraComfort(Player player) { //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) Dictionary dictionary = TrophyComfortManager.ParseTrophies(); int num = 0; HashSet hashSet = new HashSet(); ItemStand[] array = cachedStands; foreach (ItemStand val in array) { if ((Object)(object)val == (Object)null) { continue; } float num2 = Vector3.Distance(((Component)val).transform.position, ((Component)player).transform.position); if (num2 > Plugin.ComfortRadius.Value) { continue; } ZNetView component = ((Component)val).GetComponent(); if ((Object)(object)component == (Object)null || !component.IsValid()) { continue; } ZDO zDO = component.GetZDO(); if (zDO == null) { continue; } string @string = zDO.GetString("item", ""); if (string.IsNullOrEmpty(@string)) { @string = zDO.GetString("itemPrefab", ""); } if (!string.IsNullOrEmpty(@string)) { @string = @string.Replace("(Clone)", "").Trim(); if (!hashSet.Contains(@string) && dictionary.ContainsKey(@string)) { num += dictionary[@string]; hashSet.Add(@string); } } } return num; } }