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 PitConfortavel v1.0.0
PitConfortavel.dll
Decompiled a month agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using System.Text; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using PitConfortavel.Configuration; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("PitConfortavel")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyDescription("Mod para Valheim que personaliza o alcance e exibe informações de itens de conforto")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("PitConfortavel")] [assembly: AssemblyTitle("PitConfortavel")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [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 PitConfortavel { [BepInPlugin("com.marce.pitconfortavel", "PitConfortavel", "1.0.0")] public class PitConfortavelPlugin : BaseUnityPlugin { public const string ModGUID = "com.marce.pitconfortavel"; public const string ModName = "PitConfortavel"; public const string ModVersion = "1.0.0"; internal static ManualLogSource Log; private Harmony _harmony; private void Awake() { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ModConfig.Initialize(((BaseUnityPlugin)this).Config); _harmony = new Harmony("com.marce.pitconfortavel"); _harmony.PatchAll(); Log.LogInfo((object)"============================================================="); Log.LogInfo((object)" PitConfortavel v1.0.0 carregado com sucesso!"); Log.LogInfo((object)$" Raio de conforto configurado: {ModConfig.ComfortRadius.Value}m (Original: 10m)"); Log.LogInfo((object)"============================================================="); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } } namespace PitConfortavel.Patches { [HarmonyPatch(typeof(Hud), "SetupPieceInfo")] public static class BuildHudPatch { [HarmonyPostfix] public static void Postfix(Hud __instance, Piece piece) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) if (ModConfig.ShowComfortInBuildHud.Value && !((Object)(object)__instance == (Object)null) && !((Object)(object)__instance.m_pieceDescription == (Object)null) && !((Object)(object)piece == (Object)null)) { if (piece.m_comfort > 0) { string friendlyGroupName = GetFriendlyGroupName(piece.m_comfortGroup); string text = ((ModConfig.ShowComfortGroup.Value && !string.IsNullOrEmpty(friendlyGroupName)) ? (" <color=#CCCCCC>(" + friendlyGroupName + ")</color>") : ""); string text2 = (ModConfig.ShowConfiguredRadiusInHud.Value ? $" <color=#70C0FF>[Raio: {ModConfig.ComfortRadius.Value:0.#}m]</color>" : ""); string text3 = (((Object)(object)piece.m_comfortObject != (Object)null) ? "\n<color=#FFA24C>⚠ Requer fogo/aceso para conceder conforto</color>" : ""); TMP_Text pieceDescription = __instance.m_pieceDescription; pieceDescription.text += $"\n\n<color=#FFD700>★ Conforto: +{piece.m_comfort}</color>{text}{text2}{text3}"; } else if (ModConfig.ShowNonComfortItems.Value) { TMP_Text pieceDescription2 = __instance.m_pieceDescription; pieceDescription2.text += "\n\n<color=#888888>○ Não concede conforto</color>"; } } } private unsafe static string GetFriendlyGroupName(ComfortGroup group) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Expected I4, but got Unknown return (int)group switch { 2 => "Cama", 4 => "Cadeira/Trono", 5 => "Mesa", 1 => "Fogo/Fogueira", 3 => "Estandarte", 6 => "Tapete", 7 => "Expositor", 8 => "Decoração", 9 => "Guirlanda", 10 => "Lanterna", 11 => "Lazer/Jacuzzi", 0 => "Sem Grupo (Acumula)", _ => ((object)(*(ComfortGroup*)(&group))/*cast due to .constrained prefix*/).ToString(), }; } } [HarmonyPatch(typeof(SE_Rested), "GetNearbyComfortPieces")] public static class ComfortRangePatch { private static readonly List<Piece> CustomComfortPieces = new List<Piece>(); [HarmonyPrefix] public static bool Prefix(Vector3 point, ref List<Piece> __result) { //IL_0023: Unknown result type (might be due to invalid IL or missing references) CustomComfortPieces.Clear(); float num = ModConfig.ComfortRadius.Value; if (num <= 0f) { num = 10f; } Piece.GetAllComfortPiecesInRadius(point, num, CustomComfortPieces); __result = CustomComfortPieces; return false; } } [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ComfortScannerPatch { private class ComfortItemInfo { public string PrefabName; public string DisplayName; public int ComfortValue; public ComfortGroup Group; public bool RequiresFire; } private static bool _alreadyScanned; [HarmonyPostfix] public static void Postfix(ZNetScene __instance) { if (_alreadyScanned || !ModConfig.ExportComfortItemsList.Value || (Object)(object)__instance == (Object)null || __instance.m_prefabs == null) { return; } try { ScanAndExportComfortItems(__instance.m_prefabs); _alreadyScanned = true; } catch (Exception arg) { PitConfortavelPlugin.Log.LogError((object)$"Erro ao escanear e exportar itens de conforto: {arg}"); } } private static void ScanAndExportComfortItems(List<GameObject> prefabs) { //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cc: Unknown result type (might be due to invalid IL or missing references) //IL_02e1: Unknown result type (might be due to invalid IL or missing references) List<ComfortItemInfo> list = new List<ComfortItemInfo>(); foreach (GameObject prefab in prefabs) { if ((Object)(object)prefab == (Object)null) { continue; } Piece component = prefab.GetComponent<Piece>(); if (!((Object)(object)component != (Object)null) || component.m_comfort <= 0) { continue; } string text = component.m_name; try { if (Localization.instance != null && !string.IsNullOrEmpty(component.m_name)) { text = Localization.instance.Localize(component.m_name); } } catch { text = ((Object)prefab).name; } list.Add(new ComfortItemInfo { PrefabName = ((Object)prefab).name, DisplayName = (string.IsNullOrEmpty(text) ? ((Object)prefab).name : text), ComfortValue = component.m_comfort, Group = component.m_comfortGroup, RequiresFire = ((Object)(object)component.m_comfortObject != (Object)null) }); } list = (from i in list group i by i.PrefabName into g select g.First() into i orderby ((object)Unsafe.As<ComfortGroup, ComfortGroup>(ref i.Group)/*cast due to .constrained prefix*/).ToString(), i.ComfortValue descending, i.DisplayName select i).ToList(); PitConfortavelPlugin.Log.LogInfo((object)$"[PitConfortavel] Foram identificados {list.Count} itens de conforto no Valheim!"); string text2 = Path.Combine(Paths.ConfigPath, "PitConfortavel_Itens.txt"); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("========================================================================"); stringBuilder.AppendLine(" PIT CONFORTÁVEL - ITENS DE CONFORTO "); stringBuilder.AppendLine("========================================================================"); stringBuilder.AppendLine($"Total de itens de conforto encontrados: {list.Count}"); stringBuilder.AppendLine($"Alcance de conforto configurado no mod: {ModConfig.ComfortRadius.Value} metros"); stringBuilder.AppendLine(); stringBuilder.AppendLine("DICA SOBRE O CONFORTO NO VALHEIM:"); stringBuilder.AppendLine("- Itens do MESMO grupo não acumulam conforto entre si (apenas o maior valor conta)."); stringBuilder.AppendLine("- Itens 'Sem Grupo' acumulam livremente com qualquer outro item."); stringBuilder.AppendLine("- Peças com aviso de fogo requerem estar acesas para fornecer conforto."); stringBuilder.AppendLine("========================================================================"); stringBuilder.AppendLine(); foreach (IGrouping<ComfortGroup, ComfortItemInfo> item in from i in list group i by i.Group) { stringBuilder.AppendLine($"--- GRUPO: {item.Key} ---"); foreach (ComfortItemInfo item2 in item) { string text3 = (item2.RequiresFire ? " [Requer Fogo Aceso]" : ""); stringBuilder.AppendLine($" • {item2.DisplayName,-25} | Conforto: +{item2.ComfortValue} | Prefab: {item2.PrefabName}{text3}"); } stringBuilder.AppendLine(); } File.WriteAllText(text2, stringBuilder.ToString(), Encoding.UTF8); PitConfortavelPlugin.Log.LogInfo((object)("[PitConfortavel] Lista detalhada exportada com sucesso para: " + text2)); } } } namespace PitConfortavel.Configuration { public static class ModConfig { public static ConfigEntry<float> ComfortRadius { get; private set; } public static ConfigEntry<bool> ShowComfortInBuildHud { get; private set; } public static ConfigEntry<bool> ShowNonComfortItems { get; private set; } public static ConfigEntry<bool> ShowComfortGroup { get; private set; } public static ConfigEntry<bool> ShowConfiguredRadiusInHud { get; private set; } public static ConfigEntry<bool> ExportComfortItemsList { get; private set; } public static void Initialize(ConfigFile config) { ComfortRadius = config.Bind<float>("Geral", "ComfortRadius", 100f, "Raio de alcance em metros para detectar itens de conforto ao redor do jogador (Padrão original do jogo: 10 metros)."); ShowComfortInBuildHud = config.Bind<bool>("Interface (HUD de Construção)", "ShowComfortInBuildHud", true, "Exibe no canto inferior direito se a peça selecionada no modo build concede conforto ou não."); ShowNonComfortItems = config.Bind<bool>("Interface (HUD de Construção)", "ShowNonComfortItems", true, "Exibe uma indicação ('Sem bônus de conforto') quando a peça selecionada não concede conforto."); ShowComfortGroup = config.Bind<bool>("Interface (HUD de Construção)", "ShowComfortGroup", true, "Exibe o grupo do item (ex: Cadeira, Mesa, Cama, Fogueira). Lembre-se: itens do mesmo grupo não acumulam conforto entre si no Valheim."); ShowConfiguredRadiusInHud = config.Bind<bool>("Interface (HUD de Construção)", "ShowConfiguredRadiusInHud", true, "Exibe o alcance configurado de conforto diretamente no HUD da peça (ex: [Alcance: 100m])."); ExportComfortItemsList = config.Bind<bool>("Exportação", "ExportComfortItemsList", true, "Exporta automaticamente um arquivo de texto formatado (PitConfortavel_Itens.txt) na pasta BepInEx/config listando todos os itens de conforto existentes no jogo."); } } }