using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Logging; using HarmonyLib; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using Microsoft.CodeAnalysis; 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("FlamelessTorch")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("HP")] [assembly: AssemblyProduct("FlamelessTorch")] [assembly: AssemblyCopyright("Copyright © HP 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("54029edb-b86f-4fd1-9df4-f24b8b22f7e0")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.8.1", FrameworkDisplayName = "")] [assembly: AssemblyVersion("1.0.0.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.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] [Microsoft.CodeAnalysis.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 FlamelessTorch { [BepInPlugin("YouDied.FlamelessTorch", "FlamelessTorch", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInProcess("valheim.exe")] public class FlamelessTorchPlugin : BaseUnityPlugin { public const string ModGUID = "YouDied.FlamelessTorch"; public const string ModName = "FlamelessTorch"; public const string ModVersion = "1.0.0"; internal static ManualLogSource Log; private static Harmony _harmony; internal const string PrefabName = "piece_flamelesstorch"; internal const string LocalizedName = "Flameless Torch"; internal const string LocalizedDesc = "A cold torch without a flicker of light. Surely this is useful for something..."; private void Awake() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001b: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; _harmony = new Harmony("YouDied.FlamelessTorch"); _harmony.PatchAll(); PrefabManager.OnVanillaPrefabsAvailable += RegisterTorch; Log.LogInfo((object)"FlamelessTorch 1.0.0 loaded."); } private void OnDestroy() { Harmony harmony = _harmony; if (harmony != null) { harmony.UnpatchSelf(); } PrefabManager.OnVanillaPrefabsAvailable -= RegisterTorch; } private static void RegisterTorch() { //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Expected I4, but got Unknown //IL_0121: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Expected O, but got Unknown //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: 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) //IL_019a: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Expected O, but got Unknown //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b6: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01c7: Expected O, but got Unknown //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01e2: Expected O, but got Unknown PrefabManager.OnVanillaPrefabsAvailable -= RegisterTorch; try { GameObject prefab = PrefabManager.Instance.GetPrefab("piece_groundtorch_wood"); if ((Object)(object)prefab == (Object)null) { Log.LogError((object)"[FlamelessTorch] piece_groundtorch_wood not found."); return; } GameObject val = PrefabManager.Instance.CreateClonedPrefab("piece_flamelesstorch", prefab); if ((Object)(object)val == (Object)null) { Log.LogError((object)"[FlamelessTorch] CreateClonedPrefab returned null."); return; } Log.LogInfo((object)("[FlamelessTorch] Cloned: " + ((Object)val).name)); StripFireAndLight(val); Piece val2 = val.GetComponent(); if ((Object)(object)val2 == (Object)null) { val2 = val.AddComponent(); } val2.m_name = "Flameless Torch"; val2.m_description = "A cold torch without a flicker of light. Surely this is useful for something..."; val2.m_icon = LoadEmbeddedIcon(); val2.m_enabled = true; val2.m_craftingStation = null; Log.LogInfo((object)$"[FlamelessTorch] Category: {val2.m_category} = {(int)val2.m_category}"); PieceConfig val3 = new PieceConfig(); val3.Name = "Flameless Torch"; val3.Description = "A cold torch without a flicker of light. Surely this is useful for something..."; val3.PieceTable = "Hammer"; val3.Category = "Furniture"; val3.CraftingStation = "piece_workbench"; val3.Icon = val2.m_icon; val3.Requirements = (RequirementConfig[])(object)new RequirementConfig[2] { new RequirementConfig { Item = "Wood", Amount = 2, Recover = true }, new RequirementConfig { Item = "Resin", Amount = 2, Recover = true } }; PieceConfig val4 = val3; PieceManager.Instance.AddPiece(new CustomPiece(val, false, val4)); Log.LogInfo((object)"[FlamelessTorch] Registered. Furniture tab or: spawn piece_flamelesstorch"); } catch (Exception arg) { Log.LogError((object)$"[FlamelessTorch] Registration error: {arg}"); } } private static void StripFireAndLight(GameObject go) { List list = new List(); Light[] componentsInChildren = go.GetComponentsInChildren(true); foreach (Light val in componentsInChildren) { if ((Object)(object)val != (Object)null) { list.Add((Component)(object)val); } } Component[] componentsInChildren2 = go.GetComponentsInChildren(true); foreach (Component val2 in componentsInChildren2) { if ((Object)(object)val2 == (Object)null) { continue; } string fullName = ((object)val2).GetType().FullName; switch (fullName) { default: if (!(fullName == "LightLod")) { continue; } break; case "UnityEngine.ParticleSystem": case "UnityEngine.AudioSource": case "LightFlicker": break; } list.Add(val2); } foreach (Component item in list) { if ((Object)(object)item != (Object)null) { Object.DestroyImmediate((Object)(object)item); } } string[] kws = new string[6] { "fire", "flame", "smoke", "ember", "glow", "spark" }; DeactivateByKeyword(go.transform, kws); Fireplace component = go.GetComponent(); if ((Object)(object)component != (Object)null) { TrySetField(component, "m_enabledObjectMask", 0); TrySetField(component, "m_disabledObjectMask", 0); object? obj = typeof(Fireplace).GetField("m_light", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(component); Light val3 = (Light)((obj is Light) ? obj : null); if (val3 != null) { val3.intensity = 0f; } } } private static void DeactivateByKeyword(Transform t, string[] kws) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown foreach (Transform item in t) { Transform val = item; string text = ((Object)val).name.ToLowerInvariant(); foreach (string value in kws) { if (text.Contains(value)) { ((Component)val).gameObject.SetActive(false); break; } } DeactivateByKeyword(val, kws); } } private static void TrySetField(object obj, string field, object value) { try { obj.GetType().GetField(field, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.SetValue(obj, value); } catch { } } internal static Sprite LoadEmbeddedIcon() { //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00ea: Unknown result type (might be due to invalid IL or missing references) try { Assembly executingAssembly = Assembly.GetExecutingAssembly(); using Stream stream = executingAssembly.GetManifestResourceStream("FlamelessTorch.Assets.flamelesstorch.png"); if (stream == null) { return CreateFallbackSprite(); } byte[] array = new byte[stream.Length]; stream.Read(array, 0, array.Length); Texture2D val = new Texture2D(2, 2); (Type.GetType("UnityEngine.ImageConversion, UnityEngine.CoreModule") ?? Type.GetType("UnityEngine.ImageConversion, UnityEngine.ImageConversionModule"))?.GetMethod("LoadImage", BindingFlags.Static | BindingFlags.Public, null, new Type[2] { typeof(Texture2D), typeof(byte[]) }, null)?.Invoke(null, new object[2] { val, array }); ((Object)val).name = "flamelesstorch_icon"; return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f)); } catch { return CreateFallbackSprite(); } } private static Sprite CreateFallbackSprite() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) Texture2D val = new Texture2D(32, 32); Color[] array = (Color[])(object)new Color[1024]; for (int i = 0; i < array.Length; i++) { array[i] = Color.magenta; } val.SetPixels(array); val.Apply(); return Sprite.Create(val, new Rect(0f, 0f, 32f, 32f), new Vector2(0.5f, 0.5f)); } } [HarmonyPatch(typeof(ZNetScene), "GetPrefabNames")] public static class ZNetScene_GetPrefabNames_Patch { public static void Prefix(ZNetScene __instance) { if (typeof(ZNetScene).GetField("m_namedPrefabs", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)?.GetValue(__instance) is Dictionary dictionary) { List list = new List(); foreach (KeyValuePair item in dictionary) { if ((Object)(object)item.Value == (Object)null) { list.Add(item.Key); } } foreach (int item2 in list) { dictionary.Remove(item2); } } __instance.m_prefabs.RemoveAll((GameObject p) => (Object)(object)p == (Object)null); } } }