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 MarsarahBuildPieces v1.0.0
MarsarahBuildPieces.dll
Decompiled a week ago
The result has been truncated due to the large size, download it to view full contents!
using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Runtime.Versioning; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using HarmonyLib; using JetBrains.Annotations; using Jotunn.Configs; using Jotunn.Entities; using Jotunn.Managers; using MarsarahBuildPieces.Managers; using MarsarahBuildPieces.Patches.BuildPieces; using Microsoft.CodeAnalysis; using ServerSync; using Splatform; using TMPro; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: TargetFramework(".NETFramework,Version=v4.8", FrameworkDisplayName = ".NET Framework 4.8")] [assembly: AssemblyCompany("MarsarahBuildPieces")] [assembly: AssemblyConfiguration("Debug")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+b66ebd77b6e264e1455cfb6c29d1ba2ab114ea09")] [assembly: AssemblyProduct("MarsarahBuildPieces")] [assembly: AssemblyTitle("MarsarahBuildPieces")] [assembly: AssemblyVersion("1.0.0.0")] [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 MarsarahBuildPieces { [BepInPlugin("Marsarah.MarsarahBuildPieces", "MarsarahBuildPieces", "1.0.0")] [BepInDependency(/*Could not decode attribute arguments.*/)] [BepInDependency(/*Could not decode attribute arguments.*/)] public class MarsarahBuildPieces : BaseUnityPlugin { internal const string ModName = "MarsarahBuildPieces"; internal const string ModVersion = "1.0.0"; internal const string Author = "Marsarah"; public const string ModGUID = "Marsarah.MarsarahBuildPieces"; private readonly Harmony harmony = new Harmony("Marsarah.MarsarahBuildPieces"); private static readonly LogManager log = new LogManager("MarsarahBuildPieces", LogManager.LogLevel.Warning); private void Awake() { LogManager.SetGlobalLogLevel(LogManager.LogLevel.Info); ConfigManager.Init(((BaseUnityPlugin)this).Config); CompatibilityManager.Initialize(); log.Info("MarsarahBuildPieces 1.0.0 loaded."); harmony.PatchAll(); } private void OnDestroy() { ((BaseUnityPlugin)this).Config.Save(); } } } namespace MarsarahBuildPieces.Patches.BuildPieces { internal static class BuildPieceController { [HarmonyPatch(typeof(Player), "OnSpawned")] internal static class Player_OnSpawned_Patch { private static void Postfix() { bool flag = true; flag &= PocketPortal.TogglePocketPortalVisibility(); flag &= GlacialStonePortal.TogglePortalVisibility(); flag &= MysticalLightWard.ToggleVisibility(); flag &= SilverSconce.ToggleVisibility(); flag &= ColoredDvergrLanterns.ToggleVisibility(); flag &= GreenStandingBrazier.ToggleVisibility(); if (flag & SilverHangingBrazier.ToggleVisibility()) { log.Info("Initial build piece visibility toggled."); } else { log.Info("Initial build piece visibility not ready."); } } } private static readonly LogManager log = new LogManager("Build Piece Controller", LogManager.LogLevel.Warning); public static void ConfigurePiece(GameObject prefab, string category, RequirementConfig[] requirements) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Expected O, but got Unknown if ((Object)(object)prefab == (Object)null) { log.Warn("Cannot configure null prefab."); return; } PieceConfig pieceConfig = new PieceConfig { PieceTable = "Hammer", Category = category, Requirements = requirements }; MPrefabManager.AddToBuildMenu(prefab, pieceConfig); log.Info("Registered prefab '" + ((Object)prefab).name + "' in build menu under '" + category + "'."); } public static RequirementConfig MakeRequirement(string item, int amount, bool recover = true) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Expected O, but got Unknown return new RequirementConfig(item, amount, 0, recover); } public static void RefreshPieceRequirements(Piece piece, Dictionary<string, int> amounts) { if ((Object)(object)piece == (Object)null) { log.Warn("Cannot configure a null piece."); return; } if (piece.m_resources == null) { log.Warn("Resources for piece '" + ((Object)piece).name + "' are null."); return; } for (int i = 0; i < piece.m_resources.Length; i++) { Requirement val = piece.m_resources[i]; if (!((Object)(object)val?.m_resItem == (Object)null)) { string name = ((Object)val.m_resItem).name; if (amounts.TryGetValue(name, out var value)) { val.m_amount = value; log.Info($"Updated resource {name}: {value} for piece '{((Object)piece).name}'."); } } } } public static bool TogglePiece(Piece piece, bool enabled, LogManager specificLog) { if ((Object)(object)piece == (Object)null) { return false; } if ((Object)(object)ObjectDB.instance == (Object)null) { specificLog.Info("ObjectDB is not ready yet."); return false; } GameObject itemPrefab = ObjectDB.instance.GetItemPrefab("Hammer"); if ((Object)(object)itemPrefab == (Object)null) { return false; } PieceTable val = itemPrefab.GetComponent<ItemDrop>()?.m_itemData?.m_shared?.m_buildPieces; if ((Object)(object)val == (Object)null) { return false; } piece.m_enabled = enabled; if (enabled) { if (!val.m_pieces.Contains(((Component)piece).gameObject)) { val.m_pieces.Add(((Component)piece).gameObject); } } else if (val.m_pieces.Contains(((Component)piece).gameObject)) { val.m_pieces.Remove(((Component)piece).gameObject); } return true; } } internal static class ColoredDvergrLanterns { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { private static void Postfix(ZNetScene __instance) { if (!((Object)(object)__instance == (Object)null) && !initialized) { initialized = true; CreateColoredDvergrLanterns(); } } } private static readonly LogManager log = new LogManager("Colored Dverger Lanterns", LogManager.LogLevel.Warning); private static bool initialized = false; private static GameObject DvergrLanternPrefabBlue; private static GameObject DvergrLanternPrefabGreen; private static GameObject DvergrLanternPolePrefabBlue; private static GameObject DvergrLanternPolePrefabGreen; private static void CreateColoredDvergrLanterns() { //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_016b: 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_0185: 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_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e4: Unknown result type (might be due to invalid IL or missing references) //IL_01ff: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0282: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)MPrefabManager.GetPrefab("piece_dvergr_lantern_blue") != (Object)null && (Object)(object)MPrefabManager.GetPrefab("piece_dvergr_lantern_green") != (Object)null && (Object)(object)MPrefabManager.GetPrefab("piece_dvergr_lantern_pole_blue") != (Object)null && (Object)(object)MPrefabManager.GetPrefab("piece_dvergr_lantern_pole_green") != (Object)null) { return; } DvergrLanternPrefabBlue = CloneDvergrLanternPrefab("piece_dvergr_lantern", "piece_dvergr_lantern_blue"); if ((Object)(object)DvergrLanternPrefabBlue == (Object)null) { return; } DvergrLanternPrefabGreen = CloneDvergrLanternPrefab("piece_dvergr_lantern", "piece_dvergr_lantern_green"); if ((Object)(object)DvergrLanternPrefabGreen == (Object)null) { return; } DvergrLanternPolePrefabBlue = CloneDvergrLanternPrefab("piece_dvergr_lantern_pole", "piece_dvergr_lantern_pole_blue"); if (!((Object)(object)DvergrLanternPolePrefabBlue == (Object)null)) { DvergrLanternPolePrefabGreen = CloneDvergrLanternPrefab("piece_dvergr_lantern_pole", "piece_dvergr_lantern_pole_green"); if (!((Object)(object)DvergrLanternPolePrefabGreen == (Object)null)) { SetupColoredDvergrLanternDefaults(DvergrLanternPrefabBlue, "Blue-colored Dvergr Wall Lantern", "blackforge"); SetupColoredDvergrLanternDefaults(DvergrLanternPrefabGreen, "Green-colored Dvergr Wall Lantern", "blackforge"); SetupColoredDvergrLanternDefaults(DvergrLanternPolePrefabBlue, "Blue-colored Dvergr Pole Lantern", "blackforge"); SetupColoredDvergrLanternDefaults(DvergrLanternPolePrefabGreen, "Green-colored Dvergr Pole Lantern", "blackforge"); Color emissionColor = new Color(0f, 0.23529412f, 1f) * 21f; ModifyLightSettings(DvergrLanternPrefabBlue, new Color(0.2f, 0.6f, 1f), emissionColor); ModifyLightSettings(DvergrLanternPolePrefabBlue, new Color(0.2f, 0.6f, 1f), emissionColor); Color emissionColor2 = new Color(0f, 0.7490196f, 4f / 51f) * 4.5f; ModifyLightSettings(DvergrLanternPrefabGreen, new Color(0.4f, 1f, 0.4f), emissionColor2); ModifyLightSettings(DvergrLanternPolePrefabGreen, new Color(0.4f, 1f, 0.4f), emissionColor2); UpdateColoredDvergrLanternsIntensity(); ModifyColoredDvergrLanternIcon(DvergrLanternPrefabBlue, new Color(0.3f, 0.85f, 1f)); ModifyColoredDvergrLanternIcon(DvergrLanternPrefabGreen, new Color(0.2f, 1f, 0.4f)); ModifyColoredDvergrLanternIcon(DvergrLanternPolePrefabBlue, new Color(0.3f, 0.85f, 1f)); ModifyColoredDvergrLanternIcon(DvergrLanternPolePrefabGreen, new Color(0.2f, 1f, 0.4f)); MPrefabManager.RegisterToZNetScene(DvergrLanternPrefabBlue); MPrefabManager.RegisterToZNetScene(DvergrLanternPrefabGreen); MPrefabManager.RegisterToZNetScene(DvergrLanternPolePrefabBlue); MPrefabManager.RegisterToZNetScene(DvergrLanternPolePrefabGreen); BuildPieceController.ConfigurePiece(DvergrLanternPrefabBlue, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 1 : 2), BuildPieceController.MakeRequirement("Lantern", 1), BuildPieceController.MakeRequirement("Chain", 1) }); BuildPieceController.ConfigurePiece(DvergrLanternPrefabGreen, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 1 : 2), BuildPieceController.MakeRequirement("Lantern", 1), BuildPieceController.MakeRequirement("Chain", 1) }); BuildPieceController.ConfigurePiece(DvergrLanternPolePrefabBlue, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 2 : 3), BuildPieceController.MakeRequirement("Lantern", 1), BuildPieceController.MakeRequirement("Chain", 1) }); BuildPieceController.ConfigurePiece(DvergrLanternPolePrefabGreen, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 2 : 3), BuildPieceController.MakeRequirement("Lantern", 1), BuildPieceController.MakeRequirement("Chain", 1) }); DvergrLanternPrefabBlue.SetActive(true); DvergrLanternPrefabGreen.SetActive(true); DvergrLanternPolePrefabBlue.SetActive(true); DvergrLanternPolePrefabGreen.SetActive(true); log.Info("Colored Dvergr Lanterns registered and ready."); } } } private static GameObject CloneDvergrLanternPrefab(string sourcePrefabName, string newPrefabName) { GameObject val = MPrefabManager.ClonePrefab(sourcePrefabName, newPrefabName); if ((Object)(object)val == (Object)null) { log.Error("Cloning of " + sourcePrefabName + " failed."); } return val; } private static void SetupColoredDvergrLanternDefaults(GameObject prefab, string name, string craftingStation = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) ZNetView component = prefab.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null) { component.m_persistent = true; component.m_distant = false; component.m_type = (ObjectType)0; component.m_syncInitialScale = true; } Piece component2 = prefab.GetComponent<Piece>(); if (!((Object)(object)component2 != (Object)null)) { return; } component2.m_enabled = true; component2.m_name = name; component2.m_description = ""; GameObject prefab2 = MPrefabManager.GetPrefab(craftingStation); if ((Object)(object)prefab2 != (Object)null) { CraftingStation component3 = prefab2.GetComponent<CraftingStation>(); if ((Object)(object)component3 != (Object)null) { component2.m_craftingStation = component3; log.Info("Crafting station set to " + ((Object)component3).name + " for piece " + ((Object)component2).name); } } } private static void ModifyLightSettings(GameObject prefab, Color targetColor, Color emissionColor) { //IL_01d1: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0165: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_025c: Unknown result type (might be due to invalid IL or missing references) //IL_025d: Unknown result type (might be due to invalid IL or missing references) //IL_026d: Unknown result type (might be due to invalid IL or missing references) //IL_026f: Unknown result type (might be due to invalid IL or missing references) //IL_02fb: Unknown result type (might be due to invalid IL or missing references) //IL_031b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)prefab == (Object)null) { log.Warn("ModifyLightSettings called with null prefab"); return; } log.Info("Modifying light settings for " + ((Object)prefab).name + "..."); string[] array = new string[3] { "New", "Worn", "Broken" }; Renderer val3 = default(Renderer); Light val6 = default(Light); ParticleSystem val8 = default(ParticleSystem); Renderer val10 = default(Renderer); foreach (string text in array) { Transform val = prefab.transform.Find(text); if ((Object)(object)val == (Object)null) { log.Warn("State '" + text + "' not found on " + ((Object)prefab).name); continue; } Transform val2 = val.Find("default"); if ((Object)(object)val2 != (Object)null && ((Component)val2).TryGetComponent<Renderer>(ref val3)) { Material[] materials = val3.materials; foreach (Material val4 in materials) { if (((Object)val4).name.Contains("DvergrTownLantern_mat")) { if (val4.HasProperty("_Color")) { val4.SetColor("_Color", targetColor); } if (val4.HasProperty("_EmissionColor")) { val4.SetColor("_EmissionColor", emissionColor); val4.globalIlluminationFlags = (MaterialGlobalIlluminationFlags)1; DynamicGI.SetEmissive(val3, emissionColor); } log.Info("Changed emissive material for " + text + " on " + ((Object)prefab).name); } } } Transform val5 = val.Find("Point Light"); if ((Object)(object)val5 != (Object)null && ((Component)val5).TryGetComponent<Light>(ref val6)) { val6.color = targetColor; log.Info("Set Point Light color for " + text + " on " + ((Object)prefab).name); } else { log.Warn("No Point Light found under " + text + " on " + ((Object)prefab).name); } Transform val7 = val.Find("flare"); if ((Object)(object)val7 != (Object)null) { if (((Component)val7).TryGetComponent<ParticleSystem>(ref val8)) { MainModule main = val8.main; Color val9 = targetColor; val9.a = 0.1f; ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(val9); log.Info("Set ParticleSystem flare color for " + text + " on " + ((Object)prefab).name + " (alpha reduced)"); } if (!((Component)val7).TryGetComponent<Renderer>(ref val10)) { continue; } Material[] materials2 = val10.materials; foreach (Material val11 in materials2) { if (val11.HasProperty("_Color")) { val11.SetColor("_Color", targetColor); } if (val11.HasProperty("_EmissionColor")) { val11.SetColor("_EmissionColor", targetColor); } } log.Info("Set Renderer flare color for " + text + " on " + ((Object)prefab).name); } else { log.Warn("No flare found under " + text + " on " + ((Object)prefab).name); } } } private static Sprite ModifyColoredDvergrLanternIcon(GameObject prefab, Color targetTint) { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0262: Unknown result type (might be due to invalid IL or missing references) //IL_0271: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01d6: Unknown result type (might be due to invalid IL or missing references) //IL_01df: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_01f8: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Unknown result type (might be due to invalid IL or missing references) Piece component = prefab.GetComponent<Piece>(); if ((Object)(object)component == (Object)null) { log.Warn("Piece prefab is null."); return null; } Sprite icon = component.m_icon; if ((Object)(object)icon == (Object)null) { log.Warn("Piece '" + ((Object)component).name + "' has no icon assigned."); return null; } if ((Object)(object)icon.texture == (Object)null) { log.Warn("Original icon texture is null for piece '" + ((Object)component).name + "'."); return null; } Rect textureRect = icon.textureRect; Texture2D val = new Texture2D((int)((Rect)(ref textureRect)).width, (int)((Rect)(ref textureRect)).height, (TextureFormat)4, false); RenderTexture temporary = RenderTexture.GetTemporary(((Texture)icon.texture).width, ((Texture)icon.texture).height, 0, (RenderTextureFormat)0); Graphics.Blit((Texture)(object)icon.texture, temporary); RenderTexture.active = temporary; val.ReadPixels(textureRect, 0, 0); val.Apply(); Color[] pixels = val.GetPixels(); for (int i = 0; i < pixels.Length; i++) { Color val2 = pixels[i]; bool flag = false; if (val2.r > 0.6f && val2.g > 0.3f && val2.b < 0.4f) { flag = true; } else if (val2.r > 0.6f && val2.g < 0.35f && val2.b < 0.35f) { flag = true; } if (flag) { float num = val2.r * 0.299f + val2.g * 0.587f + val2.b * 0.114f; pixels[i] = new Color(targetTint.r * num, targetTint.g * num, targetTint.b * num, val2.a); } else { pixels[i] = val2; } } val.SetPixels(pixels); val.Apply(); RenderTexture.ReleaseTemporary(temporary); RenderTexture.active = null; Sprite result = (component.m_icon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), icon.pixelsPerUnit)); log.Info("Icon changed for " + ((Object)prefab).name); return result; } public static bool ToggleVisibility() { bool value = ConfigManager.BuildPiecesLightingEnabled.Value; bool flag = true; bool num = flag; GameObject dvergrLanternPrefabBlue = DvergrLanternPrefabBlue; flag = num & BuildPieceController.TogglePiece((dvergrLanternPrefabBlue != null) ? dvergrLanternPrefabBlue.GetComponent<Piece>() : null, value, log); bool num2 = flag; GameObject dvergrLanternPrefabGreen = DvergrLanternPrefabGreen; flag = num2 & BuildPieceController.TogglePiece((dvergrLanternPrefabGreen != null) ? dvergrLanternPrefabGreen.GetComponent<Piece>() : null, value, log); bool num3 = flag; GameObject dvergrLanternPolePrefabBlue = DvergrLanternPolePrefabBlue; flag = num3 & BuildPieceController.TogglePiece((dvergrLanternPolePrefabBlue != null) ? dvergrLanternPolePrefabBlue.GetComponent<Piece>() : null, value, log); bool num4 = flag; GameObject dvergrLanternPolePrefabGreen = DvergrLanternPolePrefabGreen; return num4 & BuildPieceController.TogglePiece((dvergrLanternPolePrefabGreen != null) ? dvergrLanternPolePrefabGreen.GetComponent<Piece>() : null, value, log); } public static void RefreshColoredDvergrLanternsRequirements() { BuildPieceController.RefreshPieceRequirements(DvergrLanternPrefabBlue.GetComponent<Piece>(), new Dictionary<string, int> { { "Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 1 : 2 } }); BuildPieceController.RefreshPieceRequirements(DvergrLanternPrefabGreen.GetComponent<Piece>(), new Dictionary<string, int> { { "Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 1 : 2 } }); BuildPieceController.RefreshPieceRequirements(DvergrLanternPolePrefabBlue.GetComponent<Piece>(), new Dictionary<string, int> { { "Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 2 : 3 } }); BuildPieceController.RefreshPieceRequirements(DvergrLanternPolePrefabGreen.GetComponent<Piece>(), new Dictionary<string, int> { { "Copper", CompatibilityManager.BuildPieceAmountsEnabled ? 2 : 3 } }); } public static void UpdateColoredDvergrLanternsIntensity() { UpdateLightIntensity(DvergrLanternPrefabBlue); UpdateLightIntensity(DvergrLanternPrefabGreen); UpdateLightIntensity(DvergrLanternPolePrefabBlue); UpdateLightIntensity(DvergrLanternPolePrefabGreen); } private static void UpdateLightIntensity(GameObject prefab) { float num = 1.5f; float num2 = 6f; float num3 = 0.1f; float num4 = 10f; float num5 = 2f; float num6 = (((Object)prefab).name.Contains("pole") ? 15f : 9f); float num7 = 0.05f; float num8 = 5f; Light componentInChildren = prefab.GetComponentInChildren<Light>(); LightFlicker componentInChildren2 = prefab.GetComponentInChildren<LightFlicker>(); if (CompatibilityManager.BrighterLanternsEnabled) { if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.intensity = num5; componentInChildren.range = num6; log.Info($"Set intensity {num5} and range {num6} for {((Object)prefab).name}"); } if ((Object)(object)componentInChildren2 != (Object)null) { componentInChildren2.m_flickerIntensity = num7; componentInChildren2.m_flickerSpeed = num8; log.Info($"Set flicker intensity {num7} and speed {num8} for {((Object)prefab).name}"); } } else { if ((Object)(object)componentInChildren != (Object)null) { componentInChildren.intensity = num; componentInChildren.range = num2; log.Info($"Reverted intensity {num} and range {num2} for {((Object)prefab).name}"); } if ((Object)(object)componentInChildren2 != (Object)null) { componentInChildren2.m_flickerIntensity = num3; componentInChildren2.m_flickerSpeed = num4; log.Info($"Reverted flicker intensity {num3} and speed {num4} for {((Object)prefab).name}"); } } } } internal static class GlacialStonePortal { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { private static void Postfix(ZNetScene __instance) { if (!((Object)(object)__instance == (Object)null) && !initialized) { initialized = true; CreateGlacialPortal(); } } } [HarmonyPatch(typeof(Game), "Awake")] public static class EarlyPortalPrefabRegister { private static void Prefix(Game __instance) { int stableHashCode = StringExtensionMethods.GetStableHashCode("portal_glacial"); if (!__instance.PortalPrefabHash.Contains(stableHashCode)) { __instance.PortalPrefabHash.Add(stableHashCode); log.Info($"Registered portal_glacial prefab hash early: {stableHashCode}"); } } } [HarmonyPatch(typeof(Game), "ConnectPortals")] public static class Game_ConnectPortals_Patch { private static void Prefix(Game __instance) { if ((Object)(object)GlacialPortalPrefab == (Object)null) { log.Info("ConnectPortals patch: Glacial Portal prefab not ready yet."); } else if (!__instance.m_portalPrefabs.Contains(GlacialPortalPrefab)) { __instance.m_portalPrefabs.Add(GlacialPortalPrefab); int stableHashCode = StringExtensionMethods.GetStableHashCode("portal_glacial"); if (!__instance.PortalPrefabHash.Contains(stableHashCode)) { __instance.PortalPrefabHash.Add(stableHashCode); } log.Info("Registered 'portal_glacial' in Game.m_portalPrefabs via ConnectPortals."); } } } private static readonly LogManager log = new LogManager("Glacial Stone Portal", LogManager.LogLevel.Warning); private static bool initialized; private static GameObject GlacialPortalPrefab; private static void CreateGlacialPortal() { if (!((Object)(object)MPrefabManager.GetPrefab("portal_glacial") != (Object)null)) { GlacialPortalPrefab = ClonePortalPrefab("portal", "portal_glacial"); if (!((Object)(object)GlacialPortalPrefab == (Object)null)) { SetupGlacialPortalDefaults(GlacialPortalPrefab, "Glacial Stone Portal", "piece_stonecutter"); MPrefabManager.RegisterToZNetScene(GlacialPortalPrefab); ConfigureGlacialPortalPieceData(GlacialPortalPrefab, "Stone", "FreezeGland", "SurtlingCore"); TogglePortalVisibility(); GlacialPortalPrefab.SetActive(true); log.Info("Glacial Portal registered and ready."); } } } private static GameObject ClonePortalPrefab(string sourcePrefabName, string newPrefabName) { GameObject val = MPrefabManager.ClonePrefab(sourcePrefabName, newPrefabName); if ((Object)(object)val == (Object)null) { log.Error("Cloning of " + sourcePrefabName + " failed."); } return val; } private static void SetupGlacialPortalDefaults(GameObject prefab, string name, string craftingStation = null) { //IL_0026: Unknown result type (might be due to invalid IL or missing references) ZNetView component = prefab.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null) { component.m_persistent = true; component.m_distant = false; component.m_type = (ObjectType)2; component.m_syncInitialScale = false; } Piece component2 = prefab.GetComponent<Piece>(); if ((Object)(object)component2 == (Object)null) { return; } component2.m_enabled = true; component2.m_name = name; component2.m_description = ""; GameObject prefab2 = MPrefabManager.GetPrefab(craftingStation); if (!((Object)(object)prefab2 == (Object)null)) { CraftingStation component3 = prefab2.GetComponent<CraftingStation>(); if (!((Object)(object)component3 == (Object)null)) { component2.m_craftingStation = component3; log.Info("Crafting station set to " + ((Object)component3).name + " for piece " + ((Object)component2).name + "."); } } } private static void ConfigureGlacialPortalPieceData(GameObject prefab, string resource1, string resource2, string resource3) { List<RequirementConfig> list = new List<RequirementConfig>(); if (!string.IsNullOrEmpty(resource1)) { list.Add(BuildPieceController.MakeRequirement(resource1, 6)); } if (!string.IsNullOrEmpty(resource2)) { list.Add(BuildPieceController.MakeRequirement(resource2, 2)); } if (!string.IsNullOrEmpty(resource3)) { list.Add(BuildPieceController.MakeRequirement(resource3, 2)); } BuildPieceController.ConfigurePiece(prefab, "Misc", list.ToArray()); } public static bool TogglePortalVisibility() { bool value = ConfigManager.GlacialStonePortalEnabled.Value; GameObject glacialPortalPrefab = GlacialPortalPrefab; return BuildPieceController.TogglePiece((glacialPortalPrefab != null) ? glacialPortalPrefab.GetComponent<Piece>() : null, value, log); } } internal static class GreenStandingBrazier { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { private static void Postfix(ZNetScene __instance) { if (!((Object)(object)__instance == (Object)null) && !initialized) { initialized = true; CreateGreenBrazier(); } } } private static readonly LogManager log = new LogManager("Green Standing Brazier", LogManager.LogLevel.Warning); private static bool initialized = false; private static GameObject GreenBrazierPrefab; private static void CreateGreenBrazier() { if (!((Object)(object)MPrefabManager.GetPrefab("piece_brazierfloor03") != (Object)null)) { GreenBrazierPrefab = CloneGreenBrazierPrefab(); if (!((Object)(object)GreenBrazierPrefab == (Object)null)) { SetupGreenBrazierDefaults(); ModifyBrazierFuel(); ModifyCoalMaterials(); ModifyLightSettings(); ModifyGreenBrazierIcon(); MPrefabManager.RegisterToZNetScene(GreenBrazierPrefab); BuildPieceController.ConfigurePiece(GreenBrazierPrefab, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Bronze", CompatibilityManager.BuildPieceAmountsEnabled ? 3 : 5), BuildPieceController.MakeRequirement("Guck", CompatibilityManager.PermanentLightsEnabled ? 5 : 2, recover: false), BuildPieceController.MakeRequirement("WolfClaw", 3) }); GreenBrazierPrefab.SetActive(true); log.Info("Green Brazier registered and ready."); } } } private static GameObject CloneGreenBrazierPrefab() { GameObject val = MPrefabManager.ClonePrefab("piece_brazierfloor01", "piece_brazierfloor03"); if ((Object)(object)val == (Object)null) { log.Error("Cloning of 'piece_brazierfloor01' failed."); } return val; } private static void SetupGreenBrazierDefaults() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) ZNetView component = GreenBrazierPrefab.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null) { component.m_persistent = true; component.m_distant = false; component.m_type = (ObjectType)2; component.m_syncInitialScale = false; } Piece component2 = GreenBrazierPrefab.GetComponent<Piece>(); if (!((Object)(object)component2 != (Object)null)) { return; } component2.m_enabled = true; component2.m_name = "Green Standing Brazier"; component2.m_description = ""; string name = "forge"; GameObject prefab = MPrefabManager.GetPrefab(name); if ((Object)(object)prefab != (Object)null) { CraftingStation component3 = prefab.GetComponent<CraftingStation>(); if ((Object)(object)component3 != (Object)null) { component2.m_craftingStation = component3; log.Info("Crafting station set to " + ((Object)component3).name + " for piece " + ((Object)component2).name); } } } private static void ModifyBrazierFuel() { Fireplace component = GreenBrazierPrefab.GetComponent<Fireplace>(); if ((Object)(object)component == (Object)null) { log.Error("No Fireplace component found on " + ((Object)GreenBrazierPrefab).name); return; } string text = "Guck"; GameObject prefab = MPrefabManager.GetPrefab(text); if ((Object)(object)prefab == (Object)null) { log.Error("Could not find fuel item '" + text + "' for " + ((Object)GreenBrazierPrefab).name); return; } component.m_fuelItem = prefab.GetComponent<ItemDrop>(); log.Info("Set fuel for " + ((Object)GreenBrazierPrefab).name + " to " + text); } private static void ModifyCoalMaterials() { //IL_005e: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_010d: Unknown result type (might be due to invalid IL or missing references) //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0214: Unknown result type (might be due to invalid IL or missing references) log.Info("Replacing coal materials for green brazier..."); Transform val = GreenBrazierPrefab.transform.Find("_enabled"); if ((Object)(object)val == (Object)null) { log.Warn("_enabled not found in brazier prefab."); return; } MeshRenderer val3 = default(MeshRenderer); MeshRenderer val5 = default(MeshRenderer); foreach (Transform item in val) { Transform val2 = item; if (((Object)val2).name.StartsWith("Coal")) { if (!((Component)val2).TryGetComponent<MeshRenderer>(ref val3)) { continue; } Material[] materials = ((Renderer)val3).materials; for (int i = 0; i < materials.Length; i++) { if (((Object)materials[i]).name.StartsWith("glowing_coal")) { Material val4 = Object.Instantiate<Material>(materials[i]); ((Object)val4).name = "glowing_coal_green"; if (val4.HasProperty("_EmissionColor")) { val4.SetColor("_EmissionColor", new Color(0f, 1f, 0.2f) * 1.5f); log.Info("Set emission color for " + ((Object)val2).name + " to green."); } materials[i] = val4; } } ((Renderer)val3).materials = materials; } else { if (!((Object)val2).name.StartsWith("Quad") || !((Component)val2).TryGetComponent<MeshRenderer>(ref val5)) { continue; } Material[] materials2 = ((Renderer)val5).materials; for (int j = 0; j < materials2.Length; j++) { if (((Object)materials2[j]).name.StartsWith("fireplace_ash_glowing")) { Material val6 = Object.Instantiate<Material>(materials2[j]); ((Object)val6).name = "fireplace_ash_glowing_green"; if (val6.HasProperty("_EmissionColor")) { val6.SetColor("_EmissionColor", new Color(0f, 1f, 0.2f) * 1.5f); log.Info("Set emission color for " + ((Object)val2).name + " to green."); } materials2[j] = val6; } } ((Renderer)val5).materials = materials2; } } } private static void ModifyLightSettings() { //IL_0076: Unknown result type (might be due to invalid IL or missing references) //IL_00f3: Unknown result type (might be due to invalid IL or missing references) //IL_00fa: Expected O, but got Unknown //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_0145: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_0211: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) log.Info("Modifying light settings for green brazier..."); Transform val = GreenBrazierPrefab.transform.Find("_enabled_high"); if ((Object)(object)val == (Object)null) { log.Warn("Could not find _enabled_high in brazier prefab."); return; } Transform val2 = val.Find("Point light"); if ((Object)(object)val2 != (Object)null) { Light val3 = default(Light); if (((Component)val2).TryGetComponent<Light>(ref val3)) { val3.color = Color.green; log.Info("Point Light color set to green."); } else { log.Warn("Point Light missing Light component"); } } else { log.Warn("Point Light not found."); } Transform val4 = val.Find("fx_Brazier_flames"); if ((Object)(object)val4 != (Object)null) { ParticleSystem val6 = default(ParticleSystem); foreach (Transform item in val4) { Transform val5 = item; if (((Component)val5).TryGetComponent<ParticleSystem>(ref val6)) { MainModule main = val6.main; if (((Object)val5).name.Contains("low_flames")) { ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0.1f, 1f, 0.1f, 0.8f)); log.Info("Recolored flame particle system '" + ((Object)val5).name + "' to green."); } else if (((Object)val5).name.Contains("flames (1)")) { ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0.3f, 1f, 0.3f, 1f)); log.Info("Recolored flame particle system '" + ((Object)val5).name + "' to green."); } else if (((Object)val5).name.Equals("flare", StringComparison.OrdinalIgnoreCase)) { ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0f, 0.8f, 0f, 0.2f)); log.Info("Recolored flare particle system to green."); } } } return; } log.Warn("fx_Brazier_flames not found."); } private static Sprite ModifyGreenBrazierIcon() { //IL_00c3: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00e1: Expected O, but got Unknown //IL_0117: Unknown result type (might be due to invalid IL or missing references) //IL_013c: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_0223: Unknown result type (might be due to invalid IL or missing references) //IL_0232: Unknown result type (might be due to invalid IL or missing references) //IL_0151: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_01cb: Unknown result type (might be due to invalid IL or missing references) //IL_01cd: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0198: Unknown result type (might be due to invalid IL or missing references) //IL_01a5: Unknown result type (might be due to invalid IL or missing references) //IL_01b2: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: 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) log.Info("Modifying icon for green brazier..."); Piece component = GreenBrazierPrefab.GetComponent<Piece>(); if ((Object)(object)component == (Object)null) { log.Warn("Piece prefab is null."); return null; } Sprite icon = component.m_icon; if ((Object)(object)icon == (Object)null) { log.Warn("Piece '" + ((Object)component).name + "' has no icon assigned."); return null; } if ((Object)(object)icon.texture == (Object)null) { log.Warn("Original icon texture is null for piece '" + ((Object)component).name + "'."); return null; } Rect textureRect = icon.textureRect; Texture2D val = new Texture2D((int)((Rect)(ref textureRect)).width, (int)((Rect)(ref textureRect)).height, (TextureFormat)4, false); RenderTexture temporary = RenderTexture.GetTemporary(((Texture)icon.texture).width, ((Texture)icon.texture).height, 0, (RenderTextureFormat)0); Graphics.Blit((Texture)(object)icon.texture, temporary); RenderTexture.active = temporary; val.ReadPixels(textureRect, 0, 0); val.Apply(); Color[] pixels = val.GetPixels(); for (int i = 0; i < pixels.Length; i++) { Color val2 = pixels[i]; if (val2.r > 0.5f && val2.r > val2.g + 0.1f && val2.r > val2.b + 0.1f) { pixels[i] = new Color(val2.r * 0.2f, val2.r * 1f, val2.r * 0.2f, val2.a); } else { pixels[i] = val2; } } val.SetPixels(pixels); val.Apply(); RenderTexture.ReleaseTemporary(temporary); RenderTexture.active = null; Sprite result = (component.m_icon = Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f), icon.pixelsPerUnit)); log.Info("Icon changed for " + ((Object)GreenBrazierPrefab).name); return result; } public static bool ToggleVisibility() { bool value = ConfigManager.BuildPiecesLightingEnabled.Value; bool flag = true; GameObject greenBrazierPrefab = GreenBrazierPrefab; return flag & BuildPieceController.TogglePiece((greenBrazierPrefab != null) ? greenBrazierPrefab.GetComponent<Piece>() : null, value, log); } public static void RefreshGreenBrazierRequirements() { if (!((Object)(object)GreenBrazierPrefab == (Object)null)) { BuildPieceController.RefreshPieceRequirements(GreenBrazierPrefab.GetComponent<Piece>(), new Dictionary<string, int> { { "Bronze", CompatibilityManager.BuildPieceAmountsEnabled ? 3 : 5 }, { "Guck", CompatibilityManager.PermanentLightsEnabled ? 5 : 2 } }); } } } internal static class MysticalLightWard { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { private static void Postfix(ZNetScene __instance) { if (!((Object)(object)__instance == (Object)null) && !initialized) { initialized = true; CreateMysticalWard(); } } } [HarmonyPatch(typeof(Fireplace), "UpdateFireplace")] private static class Fireplace_UpdateFireplace_Patch { private static void Postfix(Fireplace __instance, ref ZNetView ___m_nview) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)___m_nview == (Object)null) && ___m_nview.IsOwner() && IsInsideActiveWard(((Component)__instance).transform.position)) { ZDO zDO = ___m_nview.GetZDO(); if (zDO != null) { zDO.Set("fuel", __instance.m_maxFuel); } } } } [HarmonyPatch(typeof(Player), "SetupPlacementGhost")] private static class Player_SetupPlacementGhost_Patch { private static void Postfix(GameObject ___m_placementGhost) { if (!((Object)(object)___m_placementGhost == (Object)null) && ((Object)___m_placementGhost).name.StartsWith("mystical_ward")) { SetupPlacementRadius(___m_placementGhost); } } } private static readonly LogManager log = new LogManager("Mystical Light Ward", LogManager.LogLevel.Warning); private static bool initialized; private static GameObject MysticalWardPrefab; private static readonly HashSet<MysticalLightWardArea> activeWards = new HashSet<MysticalLightWardArea>(); private static readonly Color MysticalGlowColor = new Color(0.25f, 0.55f, 1f, 1f); internal static float EffectRadius => ConfigManager.MysticalLightWardRadius.Value; private static void CreateMysticalWard() { if (!((Object)(object)MPrefabManager.GetPrefab("mystical_ward") != (Object)null)) { MysticalWardPrefab = MPrefabManager.ClonePrefab("guard_stone", "mystical_ward"); if ((Object)(object)MysticalWardPrefab == (Object)null) { log.Error("Failed to clone guard_stone."); return; } RemoveWardBehavior(MysticalWardPrefab); MysticalWardPrefab.AddComponent<MysticalLightWardArea>(); SetupMysticalWardDefaults(MysticalWardPrefab); ScaleMysticalWard(MysticalWardPrefab); ApplyMysticalGlow(MysticalWardPrefab); SetRadiusMarker(MysticalWardPrefab); HideRadiusMarker(MysticalWardPrefab); MPrefabManager.RegisterToZNetScene(MysticalWardPrefab); BuildPieceController.ConfigurePiece(MysticalWardPrefab, "Misc", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("FineWood", 2), BuildPieceController.MakeRequirement("Silver", 1), BuildPieceController.MakeRequirement("Obsidian", 2) }); ToggleVisibility(); MysticalWardPrefab.SetActive(true); log.Info("Mystical Light Ward registered and ready."); } } private static void RemoveWardBehavior(GameObject prefab) { PrivateArea component = prefab.GetComponent<PrivateArea>(); if ((Object)(object)component != (Object)null) { Object.DestroyImmediate((Object)(object)component); } GuidePoint[] componentsInChildren = prefab.GetComponentsInChildren<GuidePoint>(true); foreach (GuidePoint val in componentsInChildren) { Object.DestroyImmediate((Object)(object)val); } log.Info("Removed normal Ward behavior and tutorial from Mystical Light Ward."); } private static void SetupMysticalWardDefaults(GameObject prefab) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) ZNetView component = prefab.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null) { component.m_persistent = true; component.m_distant = false; component.m_type = (ObjectType)0; component.m_syncInitialScale = true; } Piece component2 = prefab.GetComponent<Piece>(); if ((Object)(object)component2 == (Object)null) { log.Error("Mystical Light Ward has no Piece component."); return; } component2.m_enabled = true; component2.m_name = "Mystical Light Ward"; component2.m_description = "Keeps fueled light sources burning within its area."; GameObject prefab2 = MPrefabManager.GetPrefab("piece_workbench"); if ((Object)(object)prefab2 != (Object)null) { component2.m_craftingStation = prefab2.GetComponent<CraftingStation>(); } } private static void ScaleMysticalWard(GameObject prefab) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) prefab.transform.localScale = Vector3.one * 0.6f; } public static bool ToggleVisibility() { bool value = ConfigManager.MysticalLightWardEnabled.Value; SetVisualState(MysticalWardPrefab, value); foreach (MysticalLightWardArea activeWard in activeWards) { if ((Object)(object)activeWard != (Object)null) { SetVisualState(((Component)activeWard).gameObject, value); } } GameObject mysticalWardPrefab = MysticalWardPrefab; return BuildPieceController.TogglePiece((mysticalWardPrefab != null) ? mysticalWardPrefab.GetComponent<Piece>() : null, value, log); } internal static void RegisterWard(MysticalLightWardArea ward) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)ward == (Object)null)) { activeWards.Add(ward); SetVisualState(((Component)ward).gameObject, ConfigManager.MysticalLightWardEnabled.Value); log.Info($"Registered Mystical Light Ward area at {((Component)ward).transform.position}."); } } internal static void UnregisterWard(MysticalLightWardArea ward) { if (!((Object)(object)ward == (Object)null)) { activeWards.Remove(ward); } } public static bool IsInsideActiveWard(Vector3 position) { //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) if (!ConfigManager.MysticalLightWardEnabled.Value) { return false; } float num = EffectRadius * EffectRadius; foreach (MysticalLightWardArea activeWard in activeWards) { if (!((Object)(object)activeWard == (Object)null)) { Vector3 val = ((Component)activeWard).transform.position - position; if (((Vector3)(ref val)).sqrMagnitude <= num) { return true; } } } return false; } private static void ApplyMysticalGlow(GameObject prefab) { //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Expected O, but got Unknown //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) Renderer[] componentsInChildren = prefab.GetComponentsInChildren<Renderer>(true); foreach (Renderer val in componentsInChildren) { Material[] sharedMaterials = val.sharedMaterials; bool flag = false; for (int j = 0; j < sharedMaterials.Length; j++) { Material val2 = sharedMaterials[j]; if (!((Object)(object)val2 == (Object)null) && ((Object)val2).name.StartsWith("Guardstone_OdenGlow_mat")) { Material val3 = new Material(val2) { name = "MysticalWard_BlueGlow" }; if (val3.HasProperty("_Color")) { val3.SetColor("_Color", MysticalGlowColor); } if (val3.HasProperty("_EmissionColor")) { val3.SetColor("_EmissionColor", MysticalGlowColor * 2f); } sharedMaterials[j] = val3; flag = true; log.Info("Changed glow material on renderer '" + ((Object)val).name + "' to mystical blue."); } } if (flag) { val.sharedMaterials = sharedMaterials; } } } private static void SetVisualState(GameObject ward, bool enabled) { //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)ward == (Object)null) { return; } Renderer[] componentsInChildren = ward.GetComponentsInChildren<Renderer>(true); foreach (Renderer val in componentsInChildren) { Material[] sharedMaterials = val.sharedMaterials; foreach (Material val2 in sharedMaterials) { if (!((Object)(object)val2 == (Object)null) && ((Object)val2).name.StartsWith("MysticalWard_BlueGlow") && val2.HasProperty("_EmissionColor")) { val2.SetColor("_EmissionColor", enabled ? (MysticalGlowColor * 2f) : Color.black); } } if (((Object)val).name == "glow" || ((Object)val).name == "sparcs" || ((Object)val).name.StartsWith("pulse") || ((Object)val).name == "flare") { val.enabled = enabled; } } ParticleSystem[] componentsInChildren2 = ward.GetComponentsInChildren<ParticleSystem>(true); foreach (ParticleSystem val3 in componentsInChildren2) { EmissionModule emission = val3.emission; ((EmissionModule)(ref emission)).enabled = enabled; if (enabled) { val3.Play(true); } else { val3.Stop(true, (ParticleSystemStopBehavior)0); } } Light[] componentsInChildren3 = ward.GetComponentsInChildren<Light>(true); foreach (Light val4 in componentsInChildren3) { ((Behaviour)val4).enabled = enabled; } } private static void SetRadiusMarker(GameObject prefab) { CircleProjector[] componentsInChildren = prefab.GetComponentsInChildren<CircleProjector>(true); foreach (CircleProjector val in componentsInChildren) { if (!(((Object)((Component)val).gameObject).name != "AreaMarker")) { val.m_radius = EffectRadius; val.m_nrOfSegments = Mathf.CeilToInt(Mathf.Max(5f, 4f * EffectRadius)); return; } } log.Warn("Could not find AreaMarker on Mystical Light Ward."); } public static void RefreshRadius() { if (!((Object)(object)MysticalWardPrefab == (Object)null)) { SetRadiusMarker(MysticalWardPrefab); log.Info($"Mystical Light Ward radius updated to {EffectRadius:0}m."); } } internal static void HideRadiusMarker(GameObject prefab) { CircleProjector[] componentsInChildren = prefab.GetComponentsInChildren<CircleProjector>(true); foreach (CircleProjector val in componentsInChildren) { if (!(((Object)((Component)val).gameObject).name != "AreaMarker")) { ((Component)val).gameObject.SetActive(false); return; } } log.Warn("Could not find AreaMarker on Mystical Light Ward."); } private static void SetupPlacementRadius(GameObject placementGhost) { CircleProjector[] componentsInChildren = placementGhost.GetComponentsInChildren<CircleProjector>(true); foreach (CircleProjector val in componentsInChildren) { if (!(((Object)((Component)val).gameObject).name != "AreaMarker")) { ((Component)val).gameObject.SetActive(true); ((Behaviour)val).enabled = true; return; } } log.Warn("Could not find AreaMarker on Mystical Light Ward placement ghost."); } } internal class MysticalLightWardArea : MonoBehaviour, Hoverable { private ZNetView nview; private void Start() { nview = ((Component)this).GetComponent<ZNetView>(); if (!((Object)(object)nview == (Object)null) && nview.GetZDO() != null) { MysticalLightWard.HideRadiusMarker(((Component)this).gameObject); MysticalLightWard.RegisterWard(this); } } private void OnDestroy() { MysticalLightWard.UnregisterWard(this); } public string GetHoverName() { return "Mystical Light Ward"; } public string GetHoverText() { if (!ConfigManager.MysticalLightWardEnabled.Value) { return "Mystical Light Ward\nThe mystical energy of this ward is dormant."; } return $"Mystical Light Ward\nKeeps fueled light sources permanently lit within {MysticalLightWard.EffectRadius:0}m."; } public float GetHoverOffset() { return 0f; } } public static class PocketPortal { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { private static void Postfix(ZNetScene __instance) { if (!((Object)(object)__instance == (Object)null) && !initialized) { initialized = true; Init(); } } } [HarmonyPatch(typeof(Game), "Awake")] public static class EarlyPortalPrefabRegister { private static void Prefix(Game __instance) { int stableHashCode = StringExtensionMethods.GetStableHashCode("pocket_portal"); if (!__instance.PortalPrefabHash.Contains(stableHashCode)) { __instance.PortalPrefabHash.Add(stableHashCode); log.Info($"Registered pocket_portal prefab hash early: {stableHashCode}"); } } } [HarmonyPatch(typeof(Game), "ConnectPortals")] public static class Game_ConnectPortals_Patch { private static void Prefix(Game __instance) { GameObject pocketPortalPrefab = PocketPortalPrefab; if ((Object)(object)pocketPortalPrefab == (Object)null) { log.Info("ConnectPortals patch: prefab not ready yet."); } else if (!__instance.m_portalPrefabs.Contains(pocketPortalPrefab)) { __instance.m_portalPrefabs.Add(pocketPortalPrefab); __instance.PortalPrefabHash.Add(StringExtensionMethods.GetStableHashCode("pocket_portal")); log.Info("Registered 'pocket_portal' in Game.m_portalPrefabs via ConnectPortals."); } } } [HarmonyPatch(typeof(TeleportWorld), "Awake")] public static class TeleportWorld_Awake_AuthorFix { private static void Postfix(TeleportWorld __instance) { //IL_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) ZNetView component = ((Component)__instance).GetComponent<ZNetView>(); if ((Object)(object)component == (Object)null || !component.IsValid()) { return; } ZDO zDO = component.GetZDO(); if (zDO == null) { return; } string value = zDO.GetString(ZDOVars.s_tagauthor, ""); if (string.IsNullOrEmpty(value)) { IDistributionPlatform distributionPlatform = PlatformManager.DistributionPlatform; object obj; if (distributionPlatform == null) { obj = null; } else { ILocalUser localUser = distributionPlatform.LocalUser; obj = ((localUser != null) ? ((object)((IUser)localUser).PlatformUserID/*cast due to .constrained prefix*/).ToString() : null); } if (obj == null) { obj = ""; } string text = (string)obj; zDO.Set(ZDOVars.s_tagauthor, text); log.Info("Auto-assigned missing tagauthor: " + text); } } } [HarmonyPatch(typeof(Player), "TryPlacePiece")] public static class PocketPortal_LimitPlacement { private static bool Prefix(Player __instance, Piece piece, ref bool __result) { if ((Object)(object)piece == (Object)null || (Object)(object)PocketPortalPrefab == (Object)null || ((Object)piece).name != ((Object)PocketPortalPrefab).name) { return true; } if (PlayerHasPocketPortal(__instance)) { log.Info($"Blocking Pocket Portal placement for {__instance.GetPlayerName()} ({__instance.GetPlayerID()})"); ((Character)__instance).Message((MessageType)2, "You can only place one Pocket Portal.", 0, (Sprite)null, false); __result = false; return false; } log.Info($"Allowing Pocket Portal placement for {__instance.GetPlayerName()} ({__instance.GetPlayerID()})"); return true; } } [HarmonyPatch(typeof(Tutorial), "Awake")] public static class Tutorial_Awake_Patch { private static void Postfix(Tutorial __instance) { if (!((Object)(object)__instance == (Object)null)) { AddCustomTutorial(); } } } [HarmonyPatch(typeof(Player), "OnInventoryChanged")] public static class Player_OnInventoryChanged_Patch { private static void Postfix(Player __instance) { if ((Object)(object)__instance == (Object)null || !((Character)__instance).IsOwner() || __instance.HaveSeenTutorial("portal_core_intro")) { return; } foreach (ItemData allItem in ((Humanoid)__instance).GetInventory().GetAllItems()) { if (allItem.m_shared.m_name == "Portal Core") { __instance.ShowTutorial("portal_core_intro", false); log.Info("Triggered Portal Core tutorial."); break; } } } } private static readonly LogManager log = new LogManager("Pocket Portal", LogManager.LogLevel.Warning); private static bool initialized = false; private static GameObject PocketPortalPrefab; private static Recipe PortalCoreRecipe; private static void Init() { CreatePocketPortal(); CreatePortalCore(); } private static void CreatePocketPortal() { if (!((Object)(object)MPrefabManager.GetPrefab("pocket_portal") != (Object)null)) { ClonePocketPortalPrefab(); if (!((Object)(object)PocketPortalPrefab == (Object)null)) { SetupPocketPortalDefaults(); GameObject pocketPortalEffectsPrefab = RegisterPocketPortalEffects(); ApplyPocketPortalVisuals(pocketPortalEffectsPrefab); MPrefabManager.RegisterToZNetScene(PocketPortalPrefab); BuildPieceController.ConfigurePiece(PocketPortalPrefab, "Misc", (RequirementConfig[])(object)new RequirementConfig[1] { BuildPieceController.MakeRequirement("PortalCore", 1) }); PocketPortalPrefab.SetActive(true); log.Info("Pocket Portal registered and ready."); } } } private static void ClonePocketPortalPrefab() { PocketPortalPrefab = MPrefabManager.ClonePrefab("portal_wood", "pocket_portal"); if ((Object)(object)PocketPortalPrefab == (Object)null) { log.Error("Cloning of portal_wood failed."); } } private static void SetupPocketPortalDefaults() { //IL_0028: Unknown result type (might be due to invalid IL or missing references) ZNetView component = PocketPortalPrefab.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null) { component.m_persistent = true; component.m_distant = false; component.m_type = (ObjectType)2; component.m_syncInitialScale = false; } Piece component2 = PocketPortalPrefab.GetComponent<Piece>(); if ((Object)(object)component2 != (Object)null) { component2.m_enabled = true; component2.m_name = "Pocket Portal"; component2.m_description = "A portal meant to be easy to carry and make exploration more convenient"; component2.m_craftingStation = null; } } private static GameObject RegisterPocketPortalEffects() { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) GameObject val = MPrefabManager.ClonePrefab("fx_portal_connected", "fx_pocket_portal_connected"); if ((Object)(object)val == (Object)null) { log.Error("Failed to clone portal effect prefab!"); return null; } ParticleSystem[] componentsInChildren = val.GetComponentsInChildren<ParticleSystem>(); foreach (ParticleSystem val2 in componentsInChildren) { MainModule main = val2.main; ((MainModule)(ref main)).startColor = new MinMaxGradient(new Color(0f, 1f, 3f)); } Transform obj = val.transform.Find("blue flames"); ParticleSystem val3 = ((obj != null) ? ((Component)obj).GetComponent<ParticleSystem>() : null); if ((Object)(object)val3 != (Object)null) { ParticleSystemRenderer component = ((Component)val3).GetComponent<ParticleSystemRenderer>(); if ((Object)(object)component != (Object)null && (Object)(object)((Renderer)component).material != (Object)null) { ((Renderer)component).material.color = new Color(0f, 1f, 3f); } } else { log.Warn("Could not find 'blue flames' particle system."); } MPrefabManager.RegisterToZNetScene(val); return val; } private static void ApplyPocketPortalVisuals(GameObject pocketPortalEffectsPrefab) { //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_0114: Unknown result type (might be due to invalid IL or missing references) //IL_0119: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0149: Expected O, but got Unknown //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Unknown result type (might be due to invalid IL or missing references) //IL_0167: Expected O, but got Unknown GameObject prefab = MPrefabManager.GetPrefab("portal"); if ((Object)(object)prefab == (Object)null) { log.Error("Unused portal prefab not found"); return; } Transform val = PocketPortalPrefab.transform.Find("_target_found_red"); if ((Object)(object)val != (Object)null) { Object.DestroyImmediate((Object)(object)((Component)val).gameObject); } Transform val2 = prefab.transform.Find("_target_found"); if ((Object)(object)val2 != (Object)null) { GameObject val3 = Object.Instantiate<GameObject>(((Component)val2).gameObject, PocketPortalPrefab.transform); ((Object)val3).name = "_target_found_blue"; Vector3 localPosition = val3.transform.localPosition; localPosition.y -= 0.3f; val3.transform.localPosition = localPosition; TeleportWorld component = PocketPortalPrefab.GetComponent<TeleportWorld>(); if ((Object)(object)component != (Object)null) { component.m_target_found = val3.GetComponent<EffectFade>(); component.m_colorTargetfound = new Color(1f, 4f, 6f, 1f); if ((Object)(object)pocketPortalEffectsPrefab == (Object)null) { log.Error("Custom effect prefab not found."); return; } EffectList val4 = new EffectList(); val4.m_effectPrefabs = (EffectData[])(object)new EffectData[1] { new EffectData { m_prefab = pocketPortalEffectsPrefab, m_enabled = true } }; component.m_connected = val4; } else { log.Warn("TeleportWorld not found while assigning new target_found VFX."); } } else { log.Warn("Could not find _target_found in vanilla portal."); } } private static void CreatePortalCore() { GameObject val = ClonePortalCorePrefab(); if (!((Object)(object)val == (Object)null)) { ModifyPortalCoreColors(val); ItemDrop component = val.GetComponent<ItemDrop>(); Sprite val2 = ModifyPortalCoreIcon(component); component.m_itemData.m_shared.m_icons = (Sprite[])(object)new Sprite[1] { val2 }; component.m_itemData.m_shared.m_name = "Portal Core"; component.m_itemData.m_shared.m_description = "The core of an easy to carry portal"; component.m_itemData.m_shared.m_maxStackSize = 1; component.m_itemData.m_shared.m_weight = 10f; MPrefabManager.RegisterToZNetScene(val); MPrefabManager.RegisterItem(val); CreatePortalCoreRecipe(); } } private static GameObject ClonePortalCorePrefab() { GameObject val = MPrefabManager.ClonePrefab("SurtlingCore", "PortalCore"); if ((Object)(object)val == (Object)null) { log.Error("[PortalCore] Cloning of SurtlingCore failed."); return null; } return val; } private static void ModifyPortalCoreColors(GameObject portalCorePrefab) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Expected O, but got Unknown //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) Transform val = portalCorePrefab.transform.Find("attach/core"); if ((Object)(object)val != (Object)null) { Renderer component = ((Component)val).GetComponent<Renderer>(); if ((Object)(object)component != (Object)null) { Material val2 = new Material(component.sharedMaterial); val2.EnableKeyword("_EMISSION"); val2.SetColor("_EmissionColor", new Color(0f, 1f, 5f) * 3f); component.sharedMaterial = val2; } else { log.Warn("[PortalCore] No Renderer found on 'attach/core' object"); } } else { log.Warn("[PortalCore] 'attach/core' child not found"); } Transform val3 = portalCorePrefab.transform.Find("attach/Point light"); if ((Object)(object)val3 != (Object)null) { Light component2 = ((Component)val3).GetComponent<Light>(); if ((Object)(object)component2 != (Object)null) { component2.color = new Color(0f, 0.5f, 1f); component2.intensity = 2.5f; component2.range = 3f; } else { log.Warn("[PortalCore] No Light component found on 'attach/Point Light'"); } } else { log.Warn("[PortalCore] 'attach/Point Light' child not found"); } } private static Sprite ModifyPortalCoreIcon(ItemDrop portalCoreItemDrop) { //IL_0078: 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_0090: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Expected O, but got Unknown //IL_00e5: Unknown result type (might be due to invalid IL or missing references) //IL_010e: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0123: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_0197: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_016f: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) Sprite val = MPrefabManager.GetPrefab("SurtlingCore").GetComponent<ItemDrop>().m_itemData.m_shared.m_icons[0]; if ((Object)(object)val == (Object)null) { log.Warn("[PortalCore] Could not get icon for Surtling Core"); return null; } if ((Object)(object)val.texture == (Object)null) { log.Warn("[PortalCore] Original icon texture is null."); return null; } Rect textureRect = val.textureRect; Texture2D val2 = new Texture2D((int)((Rect)(ref textureRect)).width, (int)((Rect)(ref textureRect)).height, (TextureFormat)4, false); RenderTexture temporary = RenderTexture.GetTemporary(((Texture)val.texture).width, ((Texture)val.texture).height, 0, (RenderTextureFormat)0); Graphics.Blit((Texture)(object)val.texture, temporary); RenderTexture.active = temporary; val2.ReadPixels(new Rect(((Rect)(ref textureRect)).x, ((Rect)(ref textureRect)).y, ((Rect)(ref textureRect)).width, ((Rect)(ref textureRect)).height), 0, 0); val2.Apply(); Color[] pixels = val2.GetPixels(); for (int i = 0; i < pixels.Length; i++) { Color val3 = pixels[i]; if (val3.r > 0.5f && val3.r > val3.g + 0.1f && val3.r > val3.b + 0.1f) { pixels[i] = new Color(0f, val3.r * 0.8f, val3.r * 1.1f, val3.a); } else { pixels[i] = val3; } } val2.SetPixels(pixels); val2.Apply(); RenderTexture.ReleaseTemporary(temporary); RenderTexture.active = null; return Sprite.Create(val2, new Rect(0f, 0f, (float)((Texture)val2).width, (float)((Texture)val2).height), new Vector2(0.5f, 0.5f), val.pixelsPerUnit); } private static void CreatePortalCoreRecipe() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Expected O, but got Unknown //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Expected O, but got Unknown //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Expected O, but got Unknown RecipeConfig val = new RecipeConfig(); val.Item = "PortalCore"; val.Amount = 1; val.CraftingStation = "Workbench"; val.MinStationLevel = 4; val.Requirements = (RequirementConfig[])(object)new RequirementConfig[4] { new RequirementConfig("SurtlingCore", 5, 0, true), new RequirementConfig("FineWood", 20, 0, true), new RequirementConfig("FreezeGland", 5, 0, true), new RequirementConfig("Obsidian", 20, 0, true) }; RecipeConfig recipe = val; PortalCoreRecipe = MPrefabManager.RegisterRecipe(recipe); TogglePortalCoreVisibility(); } public static bool TogglePocketPortalVisibility() { bool value = ConfigManager.PocketPortalEnabled.Value; GameObject pocketPortalPrefab = PocketPortalPrefab; return BuildPieceController.TogglePiece((pocketPortalPrefab != null) ? pocketPortalPrefab.GetComponent<Piece>() : null, value, log); } public static void TogglePortalCoreVisibility() { if ((Object)(object)PortalCoreRecipe == (Object)null) { log.Warn("[PortalCore] Recipe does not exist. No toggle made."); } else { PortalCoreRecipe.m_enabled = ConfigManager.PocketPortalEnabled.Value; } } private static bool PlayerHasPocketPortal(Player player) { if ((Object)(object)ZNet.instance == (Object)null || ZDOMan.instance == null || (Object)(object)player == (Object)null) { log.Info("PlayerHasPocketPortal: required instance is null"); return false; } long playerID = player.GetPlayerID(); int stableHashCode = StringExtensionMethods.GetStableHashCode(((Object)PocketPortalPrefab).name); FieldInfo field = typeof(ZDOMan).GetField("m_objectsByID", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { log.Info("PlayerHasPocketPortal: m_objectsByID reflection field is null"); return false; } if (!(field.GetValue(ZDOMan.instance) is Dictionary<ZDOID, ZDO> dictionary)) { log.Info("PlayerHasPocketPortal: ZDO dictionary is null"); return false; } log.Info($"Checking Pocket Portal for {player.GetPlayerName()} | Player ID: {playerID} | ZDO count: {dictionary.Count} | Server: {ZNet.instance.IsServer()} | Dedicated: {ZNet.instance.IsDedicated()}"); foreach (ZDO value in dictionary.Values) { if (value != null && value.GetPrefab() == stableHashCode) { long num = value.GetLong(ZDOVars.s_creator, 0L); log.Info(string.Format("Found Pocket Portal ZDO | Creator ID: {0} | Player ID: {1} | Creator name: {2}", num, playerID, value.GetString(ZDOVars.s_creatorName, ""))); if (num == playerID) { log.Info("Player " + player.GetPlayerName() + " already owns a Pocket Portal"); return true; } } } log.Info($"No Pocket Portal found for {player.GetPlayerName()} ({playerID})"); return false; } private static void AddCustomTutorial() { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Expected O, but got Unknown if (!((Object)(object)Tutorial.instance == (Object)null)) { TutorialText item = new TutorialText { m_name = "portal_core_intro", m_topic = "Pocket Portal", m_label = "Portal Core", m_text = "You've crafted a <color=yellow>Portal Core</color>.\nUse it to build a <color=yellow>Pocket Portal</color> which should make your exploration journeys easier.\nBut keep in mind that you can only have one of these portals placed at a time.\nHowever, you can always destroy it and place it somewhere else as needed.", m_isMunin = false }; Tutorial.instance.m_texts.Add(item); log.Info("Added custom tutorial text."); } } } internal static class SilverHangingBrazier { [HarmonyPatch(typeof(ZNetScene), "Awake")] public static class ZNetScene_Awake_Patch { private static void Postfix(ZNetScene __instance) { if (!((Object)(object)__instance == (Object)null) && !initialized) { initialized = true; CreateSilverHangingBrazier(); } } } private static readonly LogManager log = new LogManager("Silver Hanging Brazier", LogManager.LogLevel.Warning); private static bool initialized = false; private static GameObject SilverHangingBrazierPrefab; private static GameObject SilverHangingBrazierPrefabBlue; private static GameObject SilverHangingBrazierPrefabGreen; private static void CreateSilverHangingBrazier() { //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01c6: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)MPrefabManager.GetPrefab("piece_brazierceiling02") != (Object)null && (Object)(object)MPrefabManager.GetPrefab("piece_brazierceiling03") != (Object)null && (Object)(object)MPrefabManager.GetPrefab("piece_brazierceiling04") != (Object)null) { return; } SilverHangingBrazierPrefab = CloneSilverHangingBrazierPrefab("piece_brazierceiling01", "piece_brazierceiling02"); if ((Object)(object)SilverHangingBrazierPrefab == (Object)null) { return; } SilverHangingBrazierPrefabBlue = CloneSilverHangingBrazierPrefab("piece_brazierceiling01", "piece_brazierceiling03"); if (!((Object)(object)SilverHangingBrazierPrefabBlue == (Object)null)) { SilverHangingBrazierPrefabGreen = CloneSilverHangingBrazierPrefab("piece_brazierceiling01", "piece_brazierceiling04"); if (!((Object)(object)SilverHangingBrazierPrefabGreen == (Object)null)) { SetupSilverHangingBrazierDefaults(SilverHangingBrazierPrefab, "Silver Hanging Brazier", "forge"); SetupSilverHangingBrazierDefaults(SilverHangingBrazierPrefabBlue, "Blue-burning Silver Hanging Brazier", "forge"); SetupSilverHangingBrazierDefaults(SilverHangingBrazierPrefabGreen, "Green-burning Silver Hanging Brazier", "forge"); ScaleSilverHangingBrazier(SilverHangingBrazierPrefab); ScaleSilverHangingBrazier(SilverHangingBrazierPrefabBlue); ScaleSilverHangingBrazier(SilverHangingBrazierPrefabGreen); ModifySilverHangingBrazierMaterial(SilverHangingBrazierPrefab, "SilverNecklace", "MaceSilver"); ModifySilverHangingBrazierMaterial(SilverHangingBrazierPrefabBlue, "SilverNecklace", "MaceSilver"); ModifySilverHangingBrazierMaterial(SilverHangingBrazierPrefabGreen, "SilverNecklace", "MaceSilver"); ModifySilverHangingBrazierFuel(SilverHangingBrazierPrefabBlue, "GreydwarfEye"); ModifySilverHangingBrazierFuel(SilverHangingBrazierPrefabGreen, "Guck"); CopyLightSettings("piece_brazierfloor02", SilverHangingBrazierPrefabBlue); ModifyLightSettings(SilverHangingBrazierPrefabGreen); ModifySilverHangingBrazierIcon(SilverHangingBrazierPrefabBlue, new Color(0.3f, 0.85f, 1f)); ModifySilverHangingBrazierIcon(SilverHangingBrazierPrefabGreen, new Color(0.2f, 1f, 0.4f)); MPrefabManager.RegisterToZNetScene(SilverHangingBrazierPrefab); MPrefabManager.RegisterToZNetScene(SilverHangingBrazierPrefabBlue); MPrefabManager.RegisterToZNetScene(SilverHangingBrazierPrefabGreen); BuildPieceController.ConfigurePiece(SilverHangingBrazierPrefab, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Silver", CompatibilityManager.BuildPieceAmountsEnabled ? 3 : 5), BuildPieceController.MakeRequirement("Coal", CompatibilityManager.PermanentLightsEnabled ? 5 : 2, recover: false), BuildPieceController.MakeRequirement("Chain", 1) }); BuildPieceController.ConfigurePiece(SilverHangingBrazierPrefabBlue, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Silver", CompatibilityManager.BuildPieceAmountsEnabled ? 3 : 5), BuildPieceController.MakeRequirement("GreydwarfEye", CompatibilityManager.PermanentLightsEnabled ? 5 : 2, recover: false), BuildPieceController.MakeRequirement("Chain", 1) }); BuildPieceController.ConfigurePiece(SilverHangingBrazierPrefabGreen, "Furniture", (RequirementConfig[])(object)new RequirementConfig[3] { BuildPieceController.MakeRequirement("Silver", CompatibilityManager.BuildPieceAmountsEnabled ? 3 : 5), BuildPieceController.MakeRequirement("Guck", CompatibilityManager.PermanentLightsEnabled ? 5 : 2, recover: false), BuildPieceController.MakeRequirement("Chain", 1) }); SilverHangingBrazierPrefab.SetActive(true); SilverHangingBrazierPrefabBlue.SetActive(true); SilverHangingBrazierPrefabGreen.SetActive(true); log.Info("Silver Hanging Braziers registered and ready."); } } } private static GameObject CloneSilverHangingBrazierPrefab(string sourcePrefabName, string newPrefabName) { GameObject val = MPrefabManager.ClonePrefab(sourcePrefabName, newPrefabName); if ((Object)(object)val == (Object)null) { log.Error("Cloning of " + sourcePrefabName + " failed."); } return val; } private static void SetupSilverHangingBrazierDefaults(GameObject prefab, string name, string craftingStation = null) { //IL_0024: Unknown result type (might be due to invalid IL or missing references) ZNetView component = prefab.GetComponent<ZNetView>(); if ((Object)(object)component != (Object)null) { component.m_persistent = true; component.m_distant = false; component.m_type = (ObjectType)0; component.m_syncInitialScale = true; } Piece component2 = prefab.GetComponent<Piece>(); if (!((Object)(object)component2 != (Object)null)) { return; } component2.m_enabled = true; component2.m_name = name; component2.m_description = ""; GameObject prefab2 = MPrefabManager.GetPrefab(craftingStation); if ((Object)(object)prefab2 != (Object)null) { CraftingStation component3 = prefab2.GetComponent<CraftingStation>(); if ((Object)(object)component3 != (Object)null) { component2.m_craftingStation = component3; log.Info("Crafting station set to " + ((Object)component3).name + " for piece " + ((Object)component2).name); } } } private static void ScaleSilverHangingBrazier(GameObject prefab) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0010: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) Vector3 localScale = Vector3.one * 1.1f; prefab.transform.localScale = localScale; } private static void ModifySilverHangingBrazierMaterial(GameObject prefab, string metalPrefabName, string metalPrefabName2) { MeshRenderer val = null; Transform val2 = prefab.transform.Find("New"); MeshRenderer val3 = default(MeshRenderer); if ((Object)(object)val2 != (Object)null && ((Component)val2).TryGetComponent<MeshRenderer>(ref val3)) { val = val3; } if ((Object)(object)val == (Object)null) { log.Error("Could not find target MeshRenderer for Silver Hanging Brazier."); return; } GameObject prefab2 = MPrefabManager.GetPrefab(metalPrefabName); if ((Object)(object)prefab2 == (Object)null) { log.Error("Could not find '" + metalPrefabName + "' prefab."); return; } MeshRenderer componentInChildren = prefab2.GetComponentInChildren<MeshRenderer>(); if ((Object)(object)componentInChildren == (Object)null || (Object)(object)((Renderer)componentInChildren).sharedMaterial == (Object)null) { log.Error("'" + metalPrefabName + "' has no MeshRenderer or material."); return; } GameObject prefab3 = MPrefabManager.GetPrefab(metalPrefabName2); if ((Object)(object)prefab3 == (Object)null) { log.Error("Could not find '" + metalPrefabName2 + "' prefab."); return; } MeshRenderer componentInChildren2 = prefab3.GetComponentInChildren<MeshRenderer>(); if ((Object)(object)componentInChildren2 == (Object)null || (Object)(object)((Renderer)componentInChildren2).sharedMaterial == (Object)null) { log.Error("'" + metalPrefabName2 + "' has no MeshRenderer or material."); return; } Material sharedMaterial = ((Renderer)componentInChildren).sharedMaterial; Material sharedMaterial2 = ((Renderer)componentInChildren2).sharedMaterial; Material[] materials = ((Renderer)val).materials; if (materials.Length >= 2) { materials[0] = sharedMaterial; materials[1] = sharedMaterial2; } else if (materials.Length == 1) { materials[0] = sharedMaterial; } ((Renderer)val).materials = materials; } private static void ModifySilverHangingBrazierFuel(GameObject prefab, string fuelItemName) { Fireplace component = prefab.GetComponent<Fireplace>(); if ((Object)(object)component == (Object)null) { log.Error("No Fireplace component found on " + ((Object)prefab).name); return; } GameObject prefab2 = MPrefabManager.GetPrefab(fuelItemName); if ((Object)(object)prefab2 == (Object)null) { log.Error("Could not find fuel item '" + fuelItemName + "' for " + ((Object)prefab).name); return; } component.m_fuelItem = prefab2.GetComponent<ItemDrop>(); component.m_secPerFuel += 10000f; log.Info($"Sec Per Fuel: {component.m_secPerFuel}"); log.Info("Set fuel for " + ((Object)prefab).name + " to " + fuelItemName); } private static void CopyLightSettings(string sourcePrefabName, GameObject targetPrefab) { //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_012e: Unknown result type (might be due to invalid IL or missing references) //IL_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Expected O, but got Unknown //IL_0296: 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_02af: Unknown result type (might be due to invalid IL or missing references) GameObject prefab = MPrefabManager.GetPrefab(sourcePrefabName); if ((Object)(object)prefab == (Object)null) { log.Error("Source prefab '" + sourcePrefabName + "' not found."); return; } string[] array = new string[3] { "_enabled", "_enabled_high", "_enabled_low" }; string[] array2 = array; foreach (string text in array2) { Transform val = prefab.transform.Find(text); if ((Object)(object)val == (Object)null) { log.Warn("No '" + text + "' found on source '" + sourcePrefabName + "', skipping."); continue; } Transform val2 = targetPrefab.transform.Find(text); if ((Object)(object)val2 != (Object)null) { Object.DestroyImmediate((Object)(object)((Component)val2).gameObject); } GameObject val3 = Object.Instantiate<GameObject>(((Component)val).gameObject, targetPrefab.transform); ((Object)val3).name = text; val3.transform.localPosition = val.localPosition; val3.transform.localRotation = val.localRotation; val3.transform.localScale = val.localScale; Transform transform = val3.transform; transform.localPosition += new Vector3(0f, 0.46f, 0f); foreach (Transform item in val3.transform) { Transform val4 = item; switch (((Object)val4).name) { case "Quad (1)": case "Coal": case "Coal (1)": case "Coal (2)": case "Coal (3)": case "Coal (4)": case "Coal (5)": val4.localPosition += new Vector3(0f, 0.04f, 0f); break; } } if (text == "_enabled_high") { val3.SetActive(true); } else { val3.SetActive(((Component)val).gameObject.activeSelf); } log.Info("Copied full '" + text + "' (with children) from " + sourcePrefabName + " to " + ((Object)targetPrefab).name); } Fireplace component = targetPrefab.GetComponent<Fireplace>(); if ((Object)(object)component == (Object)null) { log.Warn("No Fireplace component found on " + ((Object)targetPrefab).name); return; } Transform val5 = targetPrefab.transform.Find("_enabled"); Transform val6 = targetPrefab.transform.Find("_enabled_high"); Transform val7 = targetPrefab.transform.Find("_enabled_low"); if ((Object)(object)val5 != (Object)null) { component.m_enabledObject = ((Component)val5).gameObject; } else { log.Warn("'_enabled' missing on " + ((Object)targetPrefab).name + " after copy."); } if ((Object)(object)val6 != (Object)null) { component.m_enabledObjectHigh = ((Component)val6).gameObject; } else { log.Warn("'_enabled_high' missing on " + ((Object)targetPrefab).name + " after copy."); } if ((Object)(object)val7 != (Object)null) { component.m_enabledObjectLow = ((Component)val7).gameObject; } else { log.Warn("'_enabled_low' missing on " + ((Object)targetPrefab).name + " after copy."); } log.Info("Rebound Fireplace enabled objects for " + ((Object)targetPrefab).name + "."); } private static void ModifyLightSettings(GameObject prefab) { //IL_0072: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Expected O, but got Unknown //IL_010c: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0141: Unknown result type (might be due to invalid IL or missing references) //IL_0146: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_020d: Unknown result type (might be due to invalid IL or missing references) //IL_0212: Unknown result type (might be due to invalid IL or missing references) log.Info("Modifying light settings for green brazier..."); Transform val = prefab.transform.Find("_enabled_high"); if ((Object)(object)val == (Object)null) { log.Warn("Could not find _enabled_high in brazier prefab."); return; } Transform val2 = val.Find("Point light"); if ((Object)(object)val2 != (Object)null) { Light val3 = default(Light); if (((Component)val2).TryGetComponent<Light>(ref val3)) { val3.color = Color.green; log.Info("Point Light color set to green."); } else { log.Warn("Point Light missing Light component"); } } else { log.Warn("Point Light not found."); } Transform val4 = val.Find("fx_Brazier_flames"); if ((Object)(object)val4 != (Object)null) { ParticleSystem val6 = default(ParticleSystem); foreach (Transform item in val4) { Transform val5 = item; if (((Component)val5).TryGetComponent<ParticleSystem>(ref val6)) { MainModule main = val6.main; if (((Object)val5).name.Contains("low_flames")) { ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0.1f, 1f, 0.1f, 0.8f)); log.Info("Recolored flame particle system '" + ((Object)val5).name + "' to green."); } else if (((Object)val5).name.Contains("flames (1)")) { ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0.3f, 1f, 0.3f, 1f)); log.Info("Recolored flame particle system '" + ((Object)val5).name + "' to green."); } else if (((Object)val5).name.Equals("flare", StringComparison.OrdinalIgnoreCase)) { ((MainModule)(ref main)).startColor = MinMaxGradient.op_Implicit(new Color(0f, 0.8f, 0f, 0.1f)); log.Info("Recolored flare particle system to green."); } } } } else { log.Warn("fx_Brazier_flames not found."); } ModifyCoalMaterials(prefab); } private static void ModifyCoalMaterials(GameObject prefab) { //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Expected O, but got Unknown //IL_00ff: Unknown result type (might be due to invalid IL or missing references) //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_0210: Unknown result type (might be due to invalid IL or missing references) log.Info("Replacing coal materials for green brazier..."); Transform val = prefab.transform.Find("_enabled"); if ((Object)(object)val == (Object)null) { log.Warn("_enabled not found in brazier prefab."); return; } MeshRenderer val3 = default(MeshRenderer); MeshRenderer val5 = default(MeshRenderer); foreach (Transform item in val) { Transform val2 = item; if (((Object)val2).name.StartsWith("Coal")) { if (!((Component)val2).TryGetComponent<MeshRenderer>(ref val3)) { continue; } Material[] materials = ((Renderer)val3).materials; for (int i = 0; i < materials.Length; i++) { if (((Object)materials[i]).name.StartsWith("glowing_coal")) { Material val4 = Object.Instantiate<Material>(materials[i]); ((Object)val4).name = "glowing_coal_green"; if (val4.HasProperty("_EmissionColor")) { val4.SetColor("_EmissionColor", new Color(0f, 1f, 0.2f) * 1.5f); log.Info("Set emission color for " + ((Object)val2).name + " to green."); } materials[i] = val4; } } ((Renderer)val3).materials = materials; } else { if (!((Object)val2).name.StartsWith("Quad") || !((Component)val2).TryGetComponent<MeshRenderer>(ref val5)) { continue; } Material[] materials2 = ((Renderer)val5).materials; for (int j = 0; j < materials2.Length; j++) { if (((Object)materials2[j]).name.StartsWith("fireplace_ash_glowing")) { Material val6 = Object.Instantiate<Material>(materials2[j]); ((Object)val6).name = "fireplace_ash_glowing_green"; if (val6.HasProperty("_EmissionColor")) { val6.SetColor("_EmissionColor", new Color(0f, 1f, 0.2f) * 1.5f); log.Info("Set emission color for " + ((Object)val2).name + " to green."); } materials2[j] = val6; } } ((Renderer)val5).materials = materials2; } } } private static Sprite ModifySilverHangingBrazierIcon(GameObject prefab, Color targetTint) { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: Expected O, but got Unknown //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0126: Unknown result type (might be due to invalid IL or missing references) //IL_012b: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_0256: Unknown result type (might be due to invalid IL or missing references) //IL_0265: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_014c: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_01fe: Unknown result type (might be due to invalid IL or missing references) //IL_0200: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: 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_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e5: Unknown result type (might be due to invalid IL or missing references) //IL_01ec: Unknown result type (might be due to invalid IL or missing references) //IL_01f1: Unknown result type (might be due to invalid IL or missing references) Piece component = prefab.GetComponent<Piece>(); if ((Object)(object)component == (Object)null) { log.Warn("Piece prefab is null."); return null; } Sprite icon = component.m_icon; if ((Object)(object)icon == (Object)null) { log.Warn("Piece '" + ((Object)component).name + "' has no icon assigned."); return null; } if ((Object)(object)icon.texture == (Object)null) { log.Warn("Original icon texture is null for piece '" + ((Object)component).name + "'."); return null; } Rect textureRect = icon.textureRect; Texture2D val = new Texture2D((int)((Rect)(ref textureRect)).width, (int)((Rect)(ref textureRect)).height, (TextureFormat)4, false); RenderTexture temporary = RenderTexture.GetTemporary(((Texture)icon.texture).width, ((Texture)icon.texture).height, 0, (RenderTextureFormat)0); Graphics.Blit((Texture)(object)icon.texture, temporary); RenderTexture.active = temporary; val.ReadPixels(textureRect, 0, 0); val.Apply(); Col