Decompiled source of MarsarahBuildPieces v1.0.0

MarsarahBuildPieces.dll

Decompiled a week ago
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