Decompiled source of KemyFurnitureMod v1.5.1

KemyFurniture.dll

Decompiled a week ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using KemyFurniture.Core;
using KemyFurniture.Items.Bed;
using KemyFurniture.Items.Cabinet;
using KemyFurniture.Items.CaptainsDesk;
using KemyFurniture.Items.Carpet;
using KemyFurniture.Items.NavigatorDesk;
using KemyFurniture.Items.ScrollShelf;
using KemyFurniture.Items.SeaChest;
using UnityEngine;
using UnityEngine.SceneManagement;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("KemyFurniture")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("KemyFurniture")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("ec87f5a4-7ee0-4db2-8327-3c3cf6400372")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace KemyFurniture
{
	[BepInPlugin("com.kemy.kemyfurniture", "Kemy's Furniture", "1.5.1")]
	public class FurniturePlugin : BaseUnityPlugin
	{
		public const string PLUGIN_GUID = "com.kemy.kemyfurniture";

		public const string PLUGIN_NAME = "Kemy's Furniture";

		public const string PLUGIN_VERSION = "1.5.1";

		public static AssetBundle MainAssetBundle { get; private set; }

		public static GameObject[] LoadedPrefabs { get; private set; }

		public static ManualLogSource DiagLogger { get; private set; }

		public static ConfigEntry<bool> ShowShopBounds { get; private set; }

		private void Awake()
		{
			//IL_0130: Unknown result type (might be due to invalid IL or missing references)
			//IL_0137: Expected O, but got Unknown
			DiagLogger = ((BaseUnityPlugin)this).Logger;
			ShowShopBounds = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug & Diagnostics", "ShowShopBounds", false, "Visualise shop interaction trigger boxes as semi-transparent green volumes in-game.");
			ShowShopBounds.SettingChanged += delegate
			{
				ShopStallInjection.ToggleAllVisualizers(ShowShopBounds.Value);
			};
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			string text = Path.Combine(directoryName, "kemyfurnitureassets");
			if (File.Exists(text))
			{
				MainAssetBundle = AssetBundle.LoadFromFile(text);
				DiagLogger.LogInfo((object)"[KEMY FURNITURE] AssetBundle loaded successfully.");
				LoadedPrefabs = MainAssetBundle.LoadAllAssets<GameObject>();
				if (LoadedPrefabs != null)
				{
					GameObject[] loadedPrefabs = LoadedPrefabs;
					foreach (GameObject val in loadedPrefabs)
					{
						if (!((Object)(object)val == (Object)null))
						{
							ItemSetup.ConfigurePrefabProperties(val);
						}
					}
					DiagLogger.LogInfo((object)"[KEMY FURNITURE] Prefabs configured and shaders rebound to native Standard.");
				}
				ForceDirectDirectoryInjection();
				try
				{
					Harmony val2 = new Harmony("com.kemy.kemyfurniture");
					val2.PatchAll();
					DiagLogger.LogInfo((object)"[KEMY FURNITURE] Harmony patches applied successfully.");
				}
				catch (Exception arg)
				{
					DiagLogger.LogError((object)$"[KEMY FURNITURE] Failed to apply patches: {arg}");
				}
				SceneManager.sceneLoaded += OnSceneLoadedInternal;
				SceneManager.sceneLoaded += ShopStallInjection.OnSceneLoaded;
			}
			else
			{
				DiagLogger.LogError((object)("[KEMY FURNITURE] Critical Error: AssetBundle not found at " + text));
			}
		}

		private static void OnSceneLoadedInternal(Scene scene, LoadSceneMode mode)
		{
			ForceDirectDirectoryInjection();
		}

		public static void ForceDirectDirectoryInjection()
		{
			if (LoadedPrefabs == null || LoadedPrefabs.Length == 0 || (Object)(object)PrefabsDirectory.instance == (Object)null || PrefabsDirectory.instance.directory == null)
			{
				return;
			}
			try
			{
				GameObject[] loadedPrefabs = LoadedPrefabs;
				foreach (GameObject val in loadedPrefabs)
				{
					if ((Object)(object)val == (Object)null)
					{
						continue;
					}
					SaveablePrefab component = val.GetComponent<SaveablePrefab>();
					if (!((Object)(object)component == (Object)null))
					{
						int prefabIndex = component.prefabIndex;
						if (PrefabsDirectory.instance.directory.Length <= prefabIndex)
						{
							Array.Resize(ref PrefabsDirectory.instance.directory, prefabIndex + 1);
						}
						PrefabsDirectory.instance.directory[prefabIndex] = val;
					}
				}
			}
			catch (Exception ex)
			{
				DiagLogger.LogError((object)("[KEMY FURNITURE] Critical Failure during directory injection: " + ex));
			}
		}

		private void OnDestroy()
		{
			SceneManager.sceneLoaded -= OnSceneLoadedInternal;
			SceneManager.sceneLoaded -= ShopStallInjection.OnSceneLoaded;
		}
	}
	public static class ShopStallInjection
	{
		public static void OnSceneLoaded(Scene scene, LoadSceneMode mode)
		{
			string text = ((Scene)(ref scene)).name.ToLower();
			if (!text.Contains("main menu"))
			{
				if (text.Contains("gold rock"))
				{
					((MonoBehaviour)GetRunner()).StartCoroutine(SpawnGoldRockShopRoutine());
				}
				else if (text.Contains("dragon cliffs") || text.Contains("island 9 e"))
				{
					((MonoBehaviour)GetRunner()).StartCoroutine(SpawnDragonCliffsShopRoutine());
				}
				else if (text.Contains("fort") || text.Contains("island 15 m") || text.Contains("aestrin"))
				{
					((MonoBehaviour)GetRunner()).StartCoroutine(SpawnFortAestrinShopRoutine());
				}
			}
		}

		private static CoroutineRunner GetRunner()
		{
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			GameObject val = GameObject.Find("FurnitureShopRunner");
			if ((Object)(object)val == (Object)null)
			{
				val = new GameObject("FurnitureShopRunner");
				Object.DontDestroyOnLoad((Object)(object)val);
			}
			return val.GetComponent<CoroutineRunner>() ?? val.AddComponent<CoroutineRunner>();
		}

		private static GameObject ResolvePrefab(string targetName)
		{
			if (FurniturePlugin.LoadedPrefabs == null || FurniturePlugin.LoadedPrefabs.Length == 0)
			{
				return null;
			}
			string cleanTarget = targetName.Replace(" ", "").Replace("_", "").ToLower();
			GameObject val = ((IEnumerable<GameObject>)FurniturePlugin.LoadedPrefabs).FirstOrDefault((Func<GameObject, bool>)((GameObject p) => (Object)(object)p != (Object)null && ((Object)p).name.Replace(" ", "").Replace("_", "").ToLower()
				.Equals(cleanTarget, StringComparison.OrdinalIgnoreCase)));
			if ((Object)(object)val != (Object)null)
			{
				return val;
			}
			return ((IEnumerable<GameObject>)FurniturePlugin.LoadedPrefabs).FirstOrDefault((Func<GameObject, bool>)((GameObject p) => (Object)(object)p != (Object)null && ((Object)p).name.Replace(" ", "").Replace("_", "").ToLower()
				.Contains(cleanTarget)));
		}

		private static IEnumerator SpawnGoldRockShopRoutine()
		{
			yield return (object)new WaitForSeconds(2.5f);
			GameObject sceneryRoot = GameObject.Find("island 1 A (gold rock) scenery");
			if ((Object)(object)sceneryRoot == (Object)null || (Object)(object)sceneryRoot.transform.Find("Kemy_GRC_Custom_ShopArea") != (Object)null)
			{
				yield break;
			}
			try
			{
				Vector3 stallPos = new Vector3(1537.722f, 7.3f, -367.737f);
				Quaternion stallRot = Quaternion.Euler(270f, 235f, 0f);
				Vector3 keeperPos = new Vector3(1536.423f, 5.497f, -366.105f);
				Quaternion keeperRot = Quaternion.Euler(0f, 145.9f, 0f);
				Vector3 shopAreaPos = new Vector3(1533.948f, 5.537f, -370.439f);
				Quaternion shopAreaRot = Quaternion.Euler(270f, 235.1f, 0f);
				Vector3 shopAreaSize = new Vector3(14f, 18f, 10f);
				ShopArea newShopArea = CreateClonedShop(sceneryRoot, "GRC", null, "shop", "shopkeeper (6)", stallPos, stallRot, shopAreaPos, shopAreaRot, shopAreaSize, keeperPos, keeperRot);
				AttachShopAreaVisualizer(newShopArea, shopAreaSize);
				GameObject cabinetAlAnkhPrefab = ResolvePrefab("CabinetAlAnkh") ?? ResolvePrefab("Cabinet");
				GameObject cabinetWideAlAnkhPrefab = ResolvePrefab("CabinetWideAlAnkh") ?? ResolvePrefab("CabinetWide");
				GameObject cabinetSmallAlAnkhPrefab = ResolvePrefab("CabinetSmallAlAnkh") ?? ResolvePrefab("CabinetSmall");
				GameObject chestAlAnkhPrefab = ResolvePrefab("ChestAlAnkh") ?? ResolvePrefab("SeaChest");
				GameObject bedAlAnkhPrefab = ResolvePrefab("BedAlAnkh") ?? ResolvePrefab("Bed");
				GameObject scrollShelfAlAnkhPrefab = ResolvePrefab("ScrollShelfAlAnkh") ?? ResolvePrefab("ScrollShelf");
				GameObject carpetPrefab = ResolvePrefab("Carpet");
				GameObject carpetBluePrefab = ResolvePrefab("CarpetBlue") ?? carpetPrefab;
				GameObject carpetGreenPrefab = ResolvePrefab("CarpetGreen") ?? carpetPrefab;
				GameObject navDeskAlAnkhPrefab = ResolvePrefab("NavigatorDeskAlAnkh") ?? ResolvePrefab("NavigatorTable");
				GameObject cushionRedPrefab = ResolvePrefab("CushionRed");
				GameObject cushionWhitePrefab = ResolvePrefab("CushionWhite");
				Transform parent = sceneryRoot.transform;
				CreateShopItemSpawner(parent, "Kemy_GRC_Cabinet_1", new Vector3(1527.726f, 5.891f, -371.374f), Quaternion.Euler(0f, 146.4f, 0.1f), cabinetAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_CabinetWide", new Vector3(1528.834f, 5.8f, -372.561f), Quaternion.Euler(0f, 145.2f, 0f), cabinetWideAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_CabinetSmall", new Vector3(1530.41f, 5.8f, -373.35f), Quaternion.Euler(0f, 146.7f, 0f), cabinetSmallAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_Bed_Lower", new Vector3(1531.235f, 6.164f, -370.532f), Quaternion.Euler(0f, 147.5f, 0f), bedAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_Bed_Upper", new Vector3(1531.235f, 7.797f, -370.532f), Quaternion.Euler(0f, 147.5f, 0f), bedAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_Chest_Lower", new Vector3(1531.997f, 6.625f, -368.457f), Quaternion.Euler(0f, 144f, 0f), chestAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_Chest_Upper", new Vector3(1531.997f, 8.213f, -368.457f), Quaternion.Euler(0f, 144f, 0f), chestAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_ScrollShelf_1", new Vector3(1534.89f, 6.398f, -369.552f), Quaternion.Euler(0f, 326.4f, 180f), scrollShelfAlAnkhPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_ScrollShelf_2", new Vector3(1533.572f, 6.398f, -370.359f), Quaternion.Euler(0f, 324.7f, 180f), scrollShelfAlAnkhPrefab);
				Quaternion carpetRot = Quaternion.Euler(90f, 145.9f, 0f);
				CreateShopItemSpawner(parent, "Kemy_GRC_Carpet_Red", new Vector3(1535.796f, 5.577f, -372.323f), carpetRot, carpetPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_Carpet_Green", new Vector3(1531.998f, 5.577f, -374.867f), carpetRot, carpetGreenPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_Carpet_Blue", new Vector3(1533.59f, 5.63f, -373.365f), carpetRot, carpetBluePrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_NavigatorTable", new Vector3(1539.571f, 5.597f, -366.124f), Quaternion.Euler(0f, 234.8f, 0f), navDeskAlAnkhPrefab);
				Quaternion cushionRot = Quaternion.Euler(0f, 145.9f, 90f);
				CreateShopItemSpawner(parent, "Kemy_GRC_CushionRed", new Vector3(1538.869f, 5.708f, -368.688f), cushionRot, cushionRedPrefab);
				CreateShopItemSpawner(parent, "Kemy_GRC_CushionWhite", new Vector3(1537.573f, 5.708f, -369.704f), cushionRot, cushionWhitePrefab);
				FurniturePlugin.DiagLogger.LogInfo((object)"[KEMY FURNITURE] Gold Rock City furniture stall verified/spawned.");
			}
			catch (Exception arg)
			{
				FurniturePlugin.DiagLogger.LogError((object)$"[KEMY FURNITURE] Failed during GRC stall setup: {arg}");
			}
		}

		private static IEnumerator SpawnDragonCliffsShopRoutine()
		{
			yield return (object)new WaitForSeconds(2.5f);
			GameObject sceneryRoot = GameObject.Find("island 9 E (dragon cliffs) scenery");
			if ((Object)(object)sceneryRoot == (Object)null || (Object)(object)sceneryRoot.transform.Find("Kemy_DC_Custom_ShopArea") != (Object)null)
			{
				yield break;
			}
			try
			{
				Vector3 keeperPos = new Vector3(-113.562f, 2.078f, -536.031f);
				Quaternion keeperRot = Quaternion.Euler(0f, 45f, 0f);
				Vector3 shopAreaPos = new Vector3(-112.27f, 1.999f, -538.193f);
				Quaternion shopAreaRot = Quaternion.Euler(270f, 43f, 0f);
				Vector3 shopAreaSize = new Vector3(10.64f, 5.05f, 6.5f);
				ShopArea newShopArea = CreateClonedShop(sceneryRoot, "DC", null, "shop (1)", "shopkeeper (1)", keeperPos, keeperRot, shopAreaPos, shopAreaRot, shopAreaSize, keeperPos, keeperRot);
				AttachShopAreaVisualizer(newShopArea, shopAreaSize);
				GameObject cabinetEAPrefab = ResolvePrefab("CabinetEA") ?? ResolvePrefab("Cabinet");
				GameObject cabinetSmallEAPrefab = ResolvePrefab("CabinetSmallEA") ?? ResolvePrefab("CabinetSmall");
				GameObject cabinetWideEAPrefab = ResolvePrefab("CabinetWideEA") ?? ResolvePrefab("CabinetWide");
				GameObject bedEAPrefab = ResolvePrefab("BedEA") ?? ResolvePrefab("Bed");
				GameObject chestEAPrefab = ResolvePrefab("ChestEA") ?? ResolvePrefab("SeaChest");
				GameObject scrollShelfEAPrefab = ResolvePrefab("ScrollShelfEA") ?? ResolvePrefab("ScrollShelf");
				GameObject navDeskEAPrefab = ResolvePrefab("NavigatorDeskEA") ?? ResolvePrefab("NavigatorTable");
				GameObject chairEAPrefab = ResolvePrefab("ChairEA");
				GameObject dividerPrefab = ResolvePrefab("Divider");
				GameObject carpetPrefab = ResolvePrefab("Carpet");
				GameObject carpetBluePrefab = ResolvePrefab("CarpetBlue") ?? carpetPrefab;
				GameObject carpetGreenPrefab = ResolvePrefab("CarpetGreen") ?? carpetPrefab;
				Transform parent = sceneryRoot.transform;
				CreateShopItemSpawner(parent, "Kemy_DC_NavigatorTable", new Vector3(-116.519f, 1.997f, -536.67f), Quaternion.Euler(0f, 315f, 0f), navDeskEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_ScrollShelf_Lower", new Vector3(-115.249f, 2.248f, -535.453f), Quaternion.Euler(1.1f, 134.7f, 90.4f), scrollShelfEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_ScrollShelf_Upper", new Vector3(-115.19f, 2.753f, -535.475f), Quaternion.Euler(1.1f, 134.5f, 90.4f), scrollShelfEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Chest_Lower", new Vector3(-114.616f, 2.155f, -538.091f), Quaternion.Euler(0f, 42.4f, 0f), chestEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Chest_Upper", new Vector3(-114.621f, 2.938f, -538.114f), Quaternion.Euler(0f, 42.4f, 0f), chestEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Bed_Lower", new Vector3(-112.385f, 2.285f, -537.402f), Quaternion.Euler(0f, 134.1f, 0f), bedEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Bed_Upper", new Vector3(-112.385f, 3.089f, -537.402f), Quaternion.Euler(0f, 134.1f, 0f), bedEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Cabinet_1", new Vector3(-110.891f, 2.155f, -538.721f), Quaternion.Euler(0.3f, 45.1f, 359.8f), cabinetEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Cabinet_2", new Vector3(-110.328f, 2.149f, -538.106f), Quaternion.Euler(0f, 43.3f, 0.1f), cabinetEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_CabinetSmall", new Vector3(-114.238f, 3.118f, -534.576f), Quaternion.Euler(0f, 44.3f, 0f), cabinetSmallEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_CabinetWide", new Vector3(-114f, 2.078f, -534.8f), keeperRot, cabinetWideEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Carpet", new Vector3(-110.736f, 2.046f, -536.406f), Quaternion.Euler(271.7f, 315.7f, 90f), carpetPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Carpet_Green", new Vector3(-111.449f, 1.983f, -535.442f), Quaternion.Euler(90f, 270f, 223.7f), carpetGreenPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Carpet_Blue", new Vector3(-109.771f, 2.018f, -537.092f), Quaternion.Euler(90f, 119.1f, 73.4f), carpetBluePrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_ChairEA_1", new Vector3(-111.275f, 2.082f, -537.288f), Quaternion.Euler(270f, 134.7f, 0f), chairEAPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_ChairEA_2", new Vector3(-111.909f, 2.082f, -536.646f), Quaternion.Euler(270f, 134.7f, 0f), chairEAPrefab);
				Quaternion dividerRot = Quaternion.Euler(0f, 45f, 0f);
				CreateShopItemSpawner(parent, "Kemy_DC_Divider_1", new Vector3(-110.052f, 2.081f, -539.519f), dividerRot, dividerPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Divider_2", new Vector3(-109.575f, 2.113f, -539.077f), dividerRot, dividerPrefab);
				CreateShopItemSpawner(parent, "Kemy_DC_Divider_3", new Vector3(-109.117f, 2.108f, -538.604f), dividerRot, dividerPrefab);
				FurniturePlugin.DiagLogger.LogInfo((object)"[KEMY FURNITURE] Dragon Cliffs furniture stall spawned with full Emerald Archipelago (EA) set.");
			}
			catch (Exception arg)
			{
				FurniturePlugin.DiagLogger.LogError((object)$"[KEMY FURNITURE] Failed during Dragon Cliffs setup: {arg}");
			}
		}

		private static IEnumerator SpawnFortAestrinShopRoutine()
		{
			yield return (object)new WaitForSeconds(2.5f);
			GameObject sceneryRoot = GameObject.Find("island 15 M (Fort) scenery");
			if ((Object)(object)sceneryRoot == (Object)null || (Object)(object)sceneryRoot.transform.Find("Kemy_FA_Custom_ShopArea") != (Object)null)
			{
				yield break;
			}
			try
			{
				Vector3 stallPos = new Vector3(-113.321f, 2.099f, 44.512f);
				Quaternion stallRot = Quaternion.Euler(270f, 0f, 0f);
				Vector3 keeperPos = new Vector3(-113.203f, 2.099f, 42.729f);
				Quaternion keeperRot = Quaternion.Euler(0f, 0f, 0f);
				Vector3 shopAreaPos = stallPos;
				Quaternion shopAreaRot = Quaternion.Euler(270f, 0f, 0f);
				Vector3 shopAreaSize = new Vector3(10f, 10f, 7f);
				ShopArea newShopArea = CreateClonedShop(sceneryRoot, "FA", "market stall medi 3 (1)", "shop area (3)", "shopkeeper (3)", stallPos, stallRot, shopAreaPos, shopAreaRot, shopAreaSize, keeperPos, keeperRot);
				AttachShopAreaVisualizer(newShopArea, shopAreaSize);
				GameObject cabinetPrefab = ResolvePrefab("Cabinet");
				GameObject cabinetSmallPrefab = ResolvePrefab("CabinetSmall");
				GameObject cabinetWidePrefab = ResolvePrefab("CabinetWide");
				GameObject bedPrefab = ResolvePrefab("Bed");
				GameObject chestPrefab = ResolvePrefab("SeaChest");
				GameObject carpetPrefab = ResolvePrefab("Carpet");
				GameObject carpetBluePrefab = ResolvePrefab("CarpetBlue") ?? carpetPrefab;
				GameObject carpetGreenPrefab = ResolvePrefab("CarpetGreen") ?? carpetPrefab;
				GameObject scrollShelfPrefab = ResolvePrefab("ScrollShelf");
				GameObject captainsDeskPrefab = ResolvePrefab("CaptainsDesk") ?? ResolvePrefab("CaptainDesk");
				GameObject navDeskAestrinPrefab = ResolvePrefab("NavigatorDeskAestrin") ?? ResolvePrefab("NavigatorDesk");
				Transform parent = sceneryRoot.transform;
				CreateShopItemSpawner(parent, "Kemy_FA_NavigatorDeskAestrin", new Vector3(-115.431f, 2.129f, 43.826f), Quaternion.Euler(0f, 270f, 0f), navDeskAestrinPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_CaptainsDesk", new Vector3(-109.8f, 2.279f, 43.833f), Quaternion.Euler(0f, 90f, 0f), captainsDeskPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Chest_Lower", new Vector3(-115.441f, 2.514f, 45.624f), Quaternion.Euler(0.3f, 359.1f, 0f), chestPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Chest_Upper", new Vector3(-115.441f, 3.294f, 45.624f), Quaternion.Euler(0.3f, 0.2f, 0f), chestPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_ScrollShelf_Lower", new Vector3(-112.023f, 2.362f, 46.443f), Quaternion.Euler(0.2f, 178.2f, 89.9f), scrollShelfPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_ScrollShelf_Upper", new Vector3(-112.016f, 2.864f, 46.444f), Quaternion.Euler(0.2f, 179.4f, 269.9f), scrollShelfPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Bed_Lower", new Vector3(-111.126f, 2.313f, 45.245f), Quaternion.Euler(359.9f, 270.2f, 0f), bedPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Bed_Upper", new Vector3(-111.126f, 3.13f, 45.245f), Quaternion.Euler(359.9f, 271.7f, 0f), bedPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Cabinet_1", new Vector3(-111.617f, 2.164f, 43.25f), Quaternion.Euler(0.1f, 0.2f, 0f), cabinetPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Cabinet_2", new Vector3(-111.35f, 2.164f, 44.2f), Quaternion.Euler(0.1f, 0.2f, 0f), cabinetPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_CabinetWide", new Vector3(-115.655f, 2.124f, 47.343f), Quaternion.Euler(0.3f, 359.3f, 0f), cabinetWidePrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_CabinetSmall", new Vector3(-110.438f, 2.131f, 46.485f), Quaternion.Euler(359.8f, 1.1f, 359.9f), cabinetSmallPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Carpet", new Vector3(-113.707f, 2.123f, 45.453f), Quaternion.Euler(270f, 359.4f, 0f), carpetPrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Carpet_Blue", new Vector3(-113.71f, 2.123f, 46.464f), Quaternion.Euler(89.8f, 179f, 359.3f), carpetBluePrefab);
				CreateShopItemSpawner(parent, "Kemy_FA_Carpet_Green", new Vector3(-113.665f, 2.123f, 47.494f), Quaternion.Euler(89.7f, 172.9f, 353.2f), carpetGreenPrefab);
			}
			catch (Exception arg)
			{
				FurniturePlugin.DiagLogger.LogError((object)$"[KEMY FURNITURE] Failed during Fort Aestrin setup: {arg}");
			}
		}

		private static ShopArea CreateClonedShop(GameObject scenery, string prefix, string templateStallName, string templateShopAreaName, string templateShopkeeperName, Vector3 stallPos, Quaternion stallRot, Vector3 shopAreaPos, Quaternion shopAreaRot, Vector3 shopAreaSize, Vector3 keeperPos, Quaternion keeperRot)
		{
			//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_01d0: Unknown result type (might be due to invalid IL or missing references)
			//IL_01de: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
			//IL_0378: Unknown result type (might be due to invalid IL or missing references)
			//IL_0387: Unknown result type (might be due to invalid IL or missing references)
			//IL_0460: Unknown result type (might be due to invalid IL or missing references)
			//IL_0489: Unknown result type (might be due to invalid IL or missing references)
			Transform[] componentsInChildren = scenery.GetComponentsInChildren<Transform>(true);
			if (!string.IsNullOrEmpty(templateStallName))
			{
				Transform val = ((IEnumerable<Transform>)componentsInChildren).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name.Equals(templateStallName, StringComparison.OrdinalIgnoreCase))) ?? ((IEnumerable<Transform>)componentsInChildren).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name.ToLower().Contains("stall") && ((Object)t).name.ToLower().Contains("medi")));
				if ((Object)(object)val != (Object)null)
				{
					GameObject val2 = Object.Instantiate<GameObject>(((Component)val).gameObject, scenery.transform);
					((Object)val2).name = "Kemy_" + prefix + "_Custom_MarketStall_Mesh";
					val2.transform.localPosition = stallPos;
					val2.transform.localRotation = stallRot;
					MeshRenderer[] componentsInChildren2 = val2.GetComponentsInChildren<MeshRenderer>(true);
					foreach (MeshRenderer val3 in componentsInChildren2)
					{
						((Renderer)val3).enabled = true;
					}
				}
			}
			Transform val4 = ((IEnumerable<Transform>)componentsInChildren).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name.Equals(templateShopAreaName, StringComparison.OrdinalIgnoreCase))) ?? ((IEnumerable<Transform>)componentsInChildren).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name.StartsWith("shop area", StringComparison.OrdinalIgnoreCase) && (Object)(object)((Component)t).GetComponent<ShopArea>() != (Object)null)) ?? ((IEnumerable<Transform>)componentsInChildren).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name.StartsWith("shop", StringComparison.OrdinalIgnoreCase) && (Object)(object)((Component)t).GetComponent<ShopArea>() != (Object)null));
			if ((Object)(object)val4 == (Object)null)
			{
				throw new Exception("Could not find shop area trigger template matching '" + templateShopAreaName + "'");
			}
			GameObject val5 = Object.Instantiate<GameObject>(((Component)val4).gameObject, scenery.transform);
			((Object)val5).name = "Kemy_" + prefix + "_Custom_ShopArea";
			val5.transform.localPosition = shopAreaPos;
			val5.transform.localRotation = shopAreaRot;
			val5.transform.localScale = Vector3.one;
			for (int num2 = val5.transform.childCount - 1; num2 >= 0; num2--)
			{
				Object.Destroy((Object)(object)((Component)val5.transform.GetChild(num2)).gameObject);
			}
			MeshFilter component = val5.GetComponent<MeshFilter>();
			if ((Object)(object)component != (Object)null)
			{
				Object.Destroy((Object)(object)component);
			}
			MeshRenderer component2 = val5.GetComponent<MeshRenderer>();
			if ((Object)(object)component2 != (Object)null)
			{
				Object.Destroy((Object)(object)component2);
			}
			ShopArea component3 = val5.GetComponent<ShopArea>();
			if ((Object)(object)component3 != (Object)null && component3.itemsForSale != null)
			{
				component3.itemsForSale.Clear();
			}
			BoxCollider component4 = val5.GetComponent<BoxCollider>();
			if ((Object)(object)component4 != (Object)null)
			{
				component4.center = new Vector3(0f, 0f, shopAreaSize.z * 0.5f);
				component4.size = shopAreaSize;
			}
			Transform val6 = ((IEnumerable<Transform>)componentsInChildren).FirstOrDefault((Func<Transform, bool>)((Transform t) => ((Object)t).name.Equals(templateShopkeeperName, StringComparison.OrdinalIgnoreCase))) ?? ((IEnumerable<Transform>)componentsInChildren).FirstOrDefault((Func<Transform, bool>)((Transform t) => (Object)(object)((Component)t).GetComponent<Shopkeeper>() != (Object)null));
			if ((Object)(object)val6 == (Object)null)
			{
				throw new Exception("Could not find Shopkeeper template matching '" + templateShopkeeperName + "'");
			}
			GameObject val7 = Object.Instantiate<GameObject>(((Component)val6).gameObject, scenery.transform);
			((Object)val7).name = "Kemy_" + prefix + "_Custom_Shopkeeper";
			val7.transform.localPosition = keeperPos;
			val7.transform.localRotation = keeperRot;
			for (int num3 = val7.transform.childCount - 1; num3 >= 0; num3--)
			{
				Transform child = val7.transform.GetChild(num3);
				if ((Object)(object)((Component)child).GetComponent<ShopItemSpawner>() != (Object)null || ((Object)child).name.ToLower().Contains("item") || ((Object)child).name.ToLower().Contains("stall"))
				{
					Object.Destroy((Object)(object)((Component)child).gameObject);
				}
			}
			Shopkeeper component5 = val7.GetComponent<Shopkeeper>();
			if ((Object)(object)component5 != (Object)null && (Object)(object)component3 != (Object)null)
			{
				AccessTools.Field(typeof(Shopkeeper), "shopLocalPos")?.SetValue(component5, stallPos);
				AccessTools.Field(typeof(Shopkeeper), "shopRotation")?.SetValue(component5, stallRot);
				AccessTools.Field(typeof(Shopkeeper), "shop")?.SetValue(component5, component3);
				AccessTools.Field(typeof(ShopArea), "keeper")?.SetValue(component3, component5);
			}
			return component3;
		}

		private static void CreateShopItemSpawner(Transform parent, string nodeName, Vector3 position, Quaternion rotation, GameObject prefab)
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Expected O, but got Unknown
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_005e: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)prefab == (Object)null))
			{
				Transform val = parent.Find(nodeName);
				if ((Object)(object)val != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
				GameObject val2 = new GameObject(nodeName);
				val2.transform.parent = parent;
				val2.transform.localPosition = position;
				val2.transform.localRotation = rotation;
				MeshFilter val3 = val2.AddComponent<MeshFilter>();
				MeshFilter component = prefab.GetComponent<MeshFilter>();
				if ((Object)(object)component != (Object)null)
				{
					val3.mesh = component.mesh;
				}
				MeshRenderer val4 = val2.AddComponent<MeshRenderer>();
				((Renderer)val4).enabled = false;
				ShopItemSpawner val5 = val2.AddComponent<ShopItemSpawner>();
				val5.itemPrefab = prefab;
				val5.priceMult = 1f;
			}
		}

		public static void ToggleAllVisualizers(bool enabled)
		{
			IEnumerable<GameObject> enumerable = from go in Object.FindObjectsOfType<GameObject>()
				where ((Object)go).name == "DEBUG_ShopArea_Visualizer"
				select go;
			foreach (GameObject item in enumerable)
			{
				MeshRenderer component = item.GetComponent<MeshRenderer>();
				if ((Object)(object)component != (Object)null)
				{
					((Renderer)component).enabled = enabled;
				}
			}
		}

		private static void AttachShopAreaVisualizer(ShopArea shopArea, Vector3 size)
		{
			//IL_0075: 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)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ee: Expected O, but got Unknown
			//IL_0175: Unknown result type (might be due to invalid IL or missing references)
			if (!((Object)(object)shopArea == (Object)null))
			{
				Transform val = ((Component)shopArea).transform.Find("DEBUG_ShopArea_Visualizer");
				if ((Object)(object)val != (Object)null)
				{
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
				GameObject val2 = GameObject.CreatePrimitive((PrimitiveType)3);
				((Object)val2).name = "DEBUG_ShopArea_Visualizer";
				val2.transform.SetParent(((Component)shopArea).transform, false);
				val2.transform.localPosition = new Vector3(0f, 0f, size.z * 0.5f);
				val2.transform.localRotation = Quaternion.identity;
				val2.transform.localScale = size;
				Collider component = val2.GetComponent<Collider>();
				if ((Object)(object)component != (Object)null)
				{
					Object.Destroy((Object)(object)component);
				}
				MeshRenderer component2 = val2.GetComponent<MeshRenderer>();
				if ((Object)(object)component2 != (Object)null)
				{
					Material val3 = new Material(Shader.Find("Standard"));
					val3.SetFloat("_Mode", 3f);
					val3.SetInt("_SrcBlend", 5);
					val3.SetInt("_DstBlend", 10);
					val3.SetInt("_ZWrite", 0);
					val3.DisableKeyword("_ALPHATEST_ON");
					val3.EnableKeyword("_ALPHABLEND_ON");
					val3.DisableKeyword("_ALPHAPREMULTIPLY_ON");
					val3.renderQueue = 3000;
					val3.color = new Color(0f, 1f, 0f, 0.35f);
					((Renderer)component2).material = val3;
					((Renderer)component2).enabled = FurniturePlugin.ShowShopBounds != null && FurniturePlugin.ShowShopBounds.Value;
				}
			}
		}
	}
	public class CoroutineRunner : MonoBehaviour
	{
	}
}
namespace KemyFurniture.Items.SeaChest
{
	[RequireComponent(typeof(ShipItemCrate))]
	public class SeaChestLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		private CrateInventory inventory;

		public bool OverrideLookUI => true;

		public string CustomControlPrompt => "Open Chest";

		public bool HasCustomGrid => true;

		public Vector2 GridDimensions => new Vector2(4f, 4f);

		private void Awake()
		{
			inventory = ((Component)this).GetComponent<CrateInventory>();
		}

		public bool OnAltActivate(ShipItem item)
		{
			if ((Object)(object)inventory != (Object)null)
			{
				inventory.OpenCrate();
				return false;
			}
			return true;
		}
	}
}
namespace KemyFurniture.Items.ScrollShelf
{
	[RequireComponent(typeof(ShipItemCrate))]
	public class ScrollShelfLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		private CrateInventory inventory;

		private Transform[] visualScrolls;

		public bool OverrideLookUI => true;

		public string CustomControlPrompt => "Open Shelf";

		public bool HasCustomGrid => true;

		public Vector2 GridDimensions => new Vector2(3f, 4f);

		private void Awake()
		{
			inventory = ((Component)this).GetComponent<CrateInventory>();
			visualScrolls = (Transform[])(object)new Transform[12];
			Transform[] componentsInChildren = ((Component)this).GetComponentsInChildren<Transform>(true);
			for (int i = 0; i < 12; i++)
			{
				int num = i + 1;
				string text = $"Scroll_{num:D2}";
				string text2 = $"Scroll_{num}";
				Transform[] array = componentsInChildren;
				foreach (Transform val in array)
				{
					if (((Object)val).name == text || ((Object)val).name == text2)
					{
						visualScrolls[i] = val;
						break;
					}
				}
			}
		}

		private void Start()
		{
			UpdateScrollVisibilities();
		}

		private void Update()
		{
			UpdateScrollVisibilities();
		}

		private void UpdateScrollVisibilities()
		{
			int num = (((Object)(object)inventory != (Object)null && inventory.containedItems != null) ? inventory.containedItems.Count : 0);
			for (int i = 0; i < visualScrolls.Length; i++)
			{
				if ((Object)(object)visualScrolls[i] != (Object)null)
				{
					((Component)visualScrolls[i]).gameObject.SetActive(i < num);
				}
			}
		}

		public bool OnAltActivate(ShipItem item)
		{
			if ((Object)(object)inventory != (Object)null)
			{
				inventory.OpenCrate();
				return false;
			}
			return true;
		}
	}
}
namespace KemyFurniture.Items.NavigatorDesk
{
	public class NavigatorDeskLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		public bool OverrideLookUI => false;

		public string CustomControlPrompt => string.Empty;

		public bool HasCustomGrid => false;

		public Vector2 GridDimensions => Vector2.zero;

		public bool OnAltActivate(ShipItem item)
		{
			return true;
		}
	}
}
namespace KemyFurniture.Items.Carpet
{
	public class CarpetLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		public bool OverrideLookUI => false;

		public string CustomControlPrompt => string.Empty;

		public bool HasCustomGrid => false;

		public Vector2 GridDimensions => Vector2.zero;

		public bool OnAltActivate(ShipItem item)
		{
			return true;
		}
	}
}
namespace KemyFurniture.Items.CaptainsDesk
{
	[RequireComponent(typeof(ShipItemCrate))]
	public class CaptainsDeskLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		public bool OverrideLookUI => true;

		public string CustomControlPrompt => "Open Desk";

		public bool HasCustomGrid => true;

		public Vector2 GridDimensions => new Vector2(4f, 3f);

		public bool OnAltActivate(ShipItem item)
		{
			CrateInventory component = ((Component)this).GetComponent<CrateInventory>();
			if ((Object)(object)component != (Object)null)
			{
				component.OpenCrate();
				return false;
			}
			return true;
		}
	}
}
namespace KemyFurniture.Items.Cabinet
{
	[RequireComponent(typeof(ShipItemCrate))]
	public class CabinetLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		private CrateInventory inventory;

		public bool OverrideLookUI => true;

		public string CustomControlPrompt => "Open Cabinet";

		public bool HasCustomGrid => true;

		public Vector2 GridDimensions => new Vector2(5f, 6f);

		private void Awake()
		{
			inventory = ((Component)this).GetComponent<CrateInventory>();
		}

		public bool OnAltActivate(ShipItem item)
		{
			if ((Object)(object)inventory != (Object)null)
			{
				inventory.OpenCrate();
				return false;
			}
			return true;
		}
	}
	[RequireComponent(typeof(ShipItemCrate))]
	public class CabinetSmallLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		public bool OverrideLookUI => true;

		public string CustomControlPrompt => "Open Small Cabinet";

		public bool HasCustomGrid => true;

		public Vector2 GridDimensions => new Vector2(4f, 3f);

		public bool OnAltActivate(ShipItem item)
		{
			CrateInventory component = ((Component)this).GetComponent<CrateInventory>();
			if ((Object)(object)component != (Object)null)
			{
				component.OpenCrate();
				return false;
			}
			return true;
		}
	}
	[RequireComponent(typeof(ShipItemCrate))]
	public class CabinetWideLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		public bool OverrideLookUI => true;

		public string CustomControlPrompt => "Open Wide Cabinet";

		public bool HasCustomGrid => true;

		public Vector2 GridDimensions => new Vector2(6f, 3f);

		public bool OnAltActivate(ShipItem item)
		{
			CrateInventory component = ((Component)this).GetComponent<CrateInventory>();
			if ((Object)(object)component != (Object)null)
			{
				component.OpenCrate();
				return false;
			}
			return true;
		}
	}
}
namespace KemyFurniture.Items.Bed
{
	public class BedLogic : MonoBehaviour, ICustomFurnitureLogic
	{
		public bool OverrideLookUI => true;

		public string CustomControlPrompt => "Sleep";

		public bool HasCustomGrid => false;

		public Vector2 GridDimensions => Vector2.zero;

		public bool OnAltActivate(ShipItem item)
		{
			return true;
		}
	}
}
namespace KemyFurniture.Core
{
	public interface ICustomFurnitureLogic
	{
		bool OverrideLookUI { get; }

		string CustomControlPrompt { get; }

		bool HasCustomGrid { get; }

		Vector2 GridDimensions { get; }

		bool OnAltActivate(ShipItem item);
	}
	public class PriceEnforcer : MonoBehaviour
	{
		public int EnforcedPrice = 100;
	}
	public static class ItemSetup
	{
		private static Shader cachedNativeStandard;

		public static void RegisterSaveIndex(GameObject prefab, int saveIndex)
		{
			if (!((Object)(object)prefab == (Object)null))
			{
				SaveablePrefab val = prefab.GetComponent<SaveablePrefab>() ?? prefab.AddComponent<SaveablePrefab>();
				val.prefabIndex = saveIndex;
			}
		}

		public static void ConfigurePrefabProperties(GameObject prefab)
		{
			if ((Object)(object)prefab == (Object)null)
			{
				return;
			}
			ApplyFogTest(prefab);
			string text = ((Object)prefab).name.ToLower().Replace(" ", "").Replace("_", "");
			ShipItem val = prefab.GetComponent<ShipItem>() ?? prefab.AddComponent<ShipItem>();
			SanitizeRootColliders(prefab);
			int num = ResolveMasterId(text);
			if (num > 0)
			{
				RegisterSaveIndex(prefab, num);
			}
			if (text.Contains("captaindesk") || text.Contains("captainsdesk"))
			{
				EnsureCrateComponents(prefab);
				val.name = "Captain's Desk";
				((GoPointerButton)val).lookText = "Captain's Desk";
				if ((Object)(object)prefab.GetComponent<CaptainsDeskLogic>() == (Object)null)
				{
					prefab.AddComponent<CaptainsDeskLogic>();
				}
				SetItemValue(prefab, 750);
			}
			else if (text.Contains("cabinetsmall"))
			{
				EnsureCrateComponents(prefab);
				val.name = "Small Cabinet";
				((GoPointerButton)val).lookText = "Small Cabinet";
				if ((Object)(object)prefab.GetComponent<CabinetSmallLogic>() == (Object)null)
				{
					prefab.AddComponent<CabinetSmallLogic>();
				}
				SetItemValue(prefab, 480);
			}
			else if (text.Contains("cabinetwide"))
			{
				EnsureCrateComponents(prefab);
				val.name = "Wide Cabinet";
				((GoPointerButton)val).lookText = "Wide Cabinet";
				if ((Object)(object)prefab.GetComponent<CabinetWideLogic>() == (Object)null)
				{
					prefab.AddComponent<CabinetWideLogic>();
				}
				SetItemValue(prefab, 720);
			}
			else if (text.Contains("cabinet"))
			{
				EnsureCrateComponents(prefab);
				val.name = "Cabinet";
				((GoPointerButton)val).lookText = "Cabinet";
				if ((Object)(object)prefab.GetComponent<CabinetLogic>() == (Object)null)
				{
					prefab.AddComponent<CabinetLogic>();
				}
				SetItemValue(prefab, 1200);
			}
			else if (text.Contains("chest") || text.Contains("seachest"))
			{
				EnsureCrateComponents(prefab);
				val.name = "Chest";
				((GoPointerButton)val).lookText = "Chest";
				if ((Object)(object)prefab.GetComponent<SeaChestLogic>() == (Object)null)
				{
					prefab.AddComponent<SeaChestLogic>();
				}
				SetItemValue(prefab, 800);
			}
			else if (text.Contains("scroll") || text.Contains("shelf"))
			{
				EnsureCrateComponents(prefab);
				val.name = "Scroll Shelf";
				((GoPointerButton)val).lookText = "Scroll Shelf";
				if ((Object)(object)prefab.GetComponent<ScrollShelfLogic>() == (Object)null)
				{
					prefab.AddComponent<ScrollShelfLogic>();
				}
				SetItemValue(prefab, 450);
			}
			else if (text.Contains("carpet"))
			{
				string text2 = "Red Carpet";
				if (text.Contains("blue"))
				{
					text2 = "Blue Carpet";
				}
				else if (text.Contains("green"))
				{
					text2 = "Green Carpet";
				}
				val.name = text2;
				((GoPointerButton)val).lookText = text2;
				if ((Object)(object)prefab.GetComponent<CarpetLogic>() == (Object)null)
				{
					prefab.AddComponent<CarpetLogic>();
				}
				SetItemValue(prefab, 400);
			}
			else if (text.Contains("navigatordesk") || text.Contains("navigatortable") || text.Contains("navtable") || text.Contains("table"))
			{
				val.name = "Navigator's Desk";
				((GoPointerButton)val).lookText = "Navigator's Desk";
				if ((Object)(object)prefab.GetComponent<NavigatorDeskLogic>() == (Object)null)
				{
					prefab.AddComponent<NavigatorDeskLogic>();
				}
				SetItemValue(prefab, 650);
			}
			else if (text.Contains("bed"))
			{
				val.name = "Bed";
				((GoPointerButton)val).lookText = "Bed";
				if ((Object)(object)prefab.GetComponent<BedLogic>() == (Object)null)
				{
					prefab.AddComponent<BedLogic>();
				}
				SetItemValue(prefab, 950);
			}
			else if (text.Contains("cushion"))
			{
				((GoPointerButton)val).lookText = (val.name = (text.Contains("white") ? "White Cushion" : "Red Cushion"));
				SetItemValue(prefab, 400);
			}
			else if (text.Contains("chairea") || text.Contains("chair"))
			{
				val.name = "Chair";
				((GoPointerButton)val).lookText = "Chair";
				SetItemValue(prefab, 480);
			}
			else if (text.Contains("divider"))
			{
				val.name = "Room Divider";
				((GoPointerButton)val).lookText = "Room Divider";
				SetItemValue(prefab, 480);
			}
		}

		private static int ResolveMasterId(string cleanName)
		{
			if (cleanName == "navigatortable" || cleanName == "navtable")
			{
				return 450;
			}
			switch (cleanName)
			{
			case "scrollshelf":
				return 451;
			case "seachest":
				return 452;
			case "bed":
				return 453;
			default:
				if (!(cleanName == "carpetred"))
				{
					switch (cleanName)
					{
					case "cabinet":
						return 455;
					case "carpetblue":
						return 456;
					case "carpetgreen":
						return 457;
					case "cabinetsmall":
						return 458;
					case "cabinetwide":
						return 459;
					default:
						if (!(cleanName == "cabinetaa"))
						{
							if (cleanName == "cabinetwidealankh" || cleanName == "cabinetwideaa")
							{
								return 461;
							}
							if (cleanName == "cabinetsmallalankh" || cleanName == "cabinetsmallaa")
							{
								return 462;
							}
							if (cleanName == "chestalankh" || cleanName == "chestaa")
							{
								return 463;
							}
							if (cleanName == "bedalankh" || cleanName == "bedaa")
							{
								return 464;
							}
							if (cleanName == "scrollshelfalankh" || cleanName == "scrollshelfaa")
							{
								return 465;
							}
							if (cleanName == "captainsdesk" || cleanName == "captaindesk")
							{
								return 466;
							}
							if (cleanName == "navigatordesk" || cleanName == "navdesk")
							{
								return 467;
							}
							if (cleanName == "navigatordeskalankh" || cleanName == "navdeskaa")
							{
								return 468;
							}
							switch (cleanName)
							{
							case "cabinetea":
								return 469;
							case "cabinetsmallea":
								return 470;
							case "cabinetwideea":
								return 471;
							case "chestea":
								return 472;
							case "bedea":
								return 473;
							case "scrollshelfea":
								return 474;
							default:
								if (!(cleanName == "navdeskea"))
								{
									return cleanName switch
									{
										"divider" => 477, 
										"chairea" => 478, 
										"cushionred" => 479, 
										"cushionwhite" => 480, 
										_ => -1, 
									};
								}
								goto case "navigatordeskea";
							case "navigatordeskea":
								return 475;
							}
						}
						goto case "cabinetalankh";
					case "cabinetalankh":
						return 460;
					}
				}
				goto case "carpet";
			case "carpet":
				return 454;
			}
		}

		private static void ApplyFogTest(GameObject go)
		{
			if ((Object)(object)go == (Object)null)
			{
				return;
			}
			if ((Object)(object)cachedNativeStandard == (Object)null)
			{
				cachedNativeStandard = Shader.Find("Standard");
			}
			if ((Object)(object)cachedNativeStandard == (Object)null)
			{
				return;
			}
			Renderer[] componentsInChildren = go.GetComponentsInChildren<Renderer>(true);
			foreach (Renderer val in componentsInChildren)
			{
				Material[] sharedMaterials = val.sharedMaterials;
				bool flag = false;
				foreach (Material val2 in sharedMaterials)
				{
					if (!((Object)(object)val2 == (Object)null) && (Object)(object)val2.shader != (Object)null && ((Object)val2.shader).name.Contains("Standard"))
					{
						val2.shader = cachedNativeStandard;
						flag = true;
					}
				}
				if (flag)
				{
					val.sharedMaterials = sharedMaterials;
				}
			}
		}

		private static void EnsureCrateComponents(GameObject prefab)
		{
			if ((Object)(object)prefab.GetComponent<ShipItemCrate>() == (Object)null)
			{
				prefab.AddComponent<ShipItemCrate>();
			}
			if ((Object)(object)prefab.GetComponent<CrateInventory>() == (Object)null)
			{
				prefab.AddComponent<CrateInventory>();
			}
			GoPointerButton val = prefab.GetComponent<GoPointerButton>() ?? prefab.AddComponent<GoPointerButton>();
			((Behaviour)val).enabled = true;
		}

		private static void SanitizeRootColliders(GameObject prefab)
		{
			MeshCollider[] componentsInChildren = prefab.GetComponentsInChildren<MeshCollider>(true);
			MeshCollider[] array = componentsInChildren;
			foreach (MeshCollider val in array)
			{
				if (!val.convex)
				{
					val.convex = true;
				}
			}
			if ((Object)(object)prefab.GetComponent<Collider>() == (Object)null)
			{
				prefab.AddComponent<BoxCollider>();
			}
		}

		private static void SetItemValue(GameObject prefab, int value)
		{
			ShipItem component = prefab.GetComponent<ShipItem>();
			if ((Object)(object)component != (Object)null)
			{
				component.value = value;
			}
		}
	}
	[HarmonyPatch(typeof(ItemRigidbody), "ToggleCollider")]
	public static class ItemRigidbodyNREGuard
	{
		[HarmonyFinalizer]
		public static Exception Finalizer(Exception __exception)
		{
			return null;
		}
	}
	[HarmonyPatch(typeof(ItemRigidbody), "UpdateMass")]
	public static class ItemRigidbodyMassGuard
	{
		[HarmonyFinalizer]
		public static Exception Finalizer(Exception __exception)
		{
			return null;
		}
	}
	[HarmonyPatch(typeof(ShipItemCrate), "OnLoad")]
	public static class ShipItemCrateOnLoadGuard
	{
		[HarmonyFinalizer]
		public static Exception Finalizer(Exception __exception)
		{
			return null;
		}
	}
	[HarmonyPatch(typeof(ShipItem), "Awake")]
	public static class FurniturePriceAwakePatch
	{
		[HarmonyPostfix]
		public static void Postfix(ShipItem __instance)
		{
			ApplyEnforcedPrice(__instance);
		}

		public static void ApplyEnforcedPrice(ShipItem item)
		{
			if (!((Object)(object)item == (Object)null))
			{
				string text = ((Object)((Component)item).gameObject).name.ToLower();
				if (text.Contains("captaindesk") || text.Contains("captainsdesk"))
				{
					item.value = 750;
				}
				else if (text.Contains("cabinetsmall"))
				{
					item.value = 480;
				}
				else if (text.Contains("cabinetwide"))
				{
					item.value = 720;
				}
				else if (text.Contains("cabinet"))
				{
					item.value = 1200;
				}
				else if (text.Contains("chest") || text.Contains("seachest"))
				{
					item.value = 800;
				}
				else if (text.Contains("scroll") || text.Contains("shelf"))
				{
					item.value = 450;
				}
				else if (text.Contains("carpet"))
				{
					item.value = 400;
				}
				else if (text.Contains("navigatordesk") || text.Contains("navigatortable") || text.Contains("table"))
				{
					item.value = 650;
				}
				else if (text.Contains("bed"))
				{
					item.value = 950;
				}
			}
		}
	}
	[HarmonyPatch(typeof(ShipItem), "Update")]
	public static class FurniturePriceUpdatePatch
	{
		[HarmonyPrefix]
		public static void Prefix(ShipItem __instance)
		{
			if (!__instance.sold)
			{
				FurniturePriceAwakePatch.ApplyEnforcedPrice(__instance);
			}
		}
	}
	[HarmonyPatch(typeof(PrefabsDirectory), "PopulateShipItems")]
	public static class FurnitureDirectoryInjectionPatch
	{
		[HarmonyPrefix]
		public static void Prefix()
		{
			FurniturePlugin.ForceDirectDirectoryInjection();
		}
	}
	[HarmonyPatch(typeof(LookUI), "ShowLookText")]
	public static class LookUIShowTextInjectionPatch
	{
		[HarmonyPrefix]
		public static bool Prefix(LookUI __instance, GoPointerButton button)
		{
			//IL_01d4: Unknown result type (might be due to invalid IL or missing references)
			ShipItem component = ((Component)button).GetComponent<ShipItem>();
			if ((Object)(object)component == (Object)null || !component.sold)
			{
				return true;
			}
			PickupableItem val = null;
			object value = AccessTools.Field(typeof(GoPointerButton), "pointedAtBy").GetValue(button);
			GoPointer val2 = (GoPointer)((value is GoPointer) ? value : null);
			if (val2 != null)
			{
				val = val2.GetHeldItem();
			}
			if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).GetComponent<ShipItemHammer>() != (Object)null)
			{
				return true;
			}
			ICustomFurnitureLogic component2 = ((Component)component).GetComponent<ICustomFurnitureLogic>();
			if (component2 != null && component2.OverrideLookUI)
			{
				__instance.ClearText();
				if (!component.nailed)
				{
					AccessTools.Method(typeof(LookUI), "ShowLicon", (Type[])null, (Type[])null).Invoke(__instance, null);
				}
				AccessTools.Method(typeof(LookUI), "ShowRicon", (Type[])null, (Type[])null).Invoke(__instance, null);
				object value2 = AccessTools.Field(typeof(LookUI), "extraText").GetValue(__instance);
				object value3 = AccessTools.Field(typeof(LookUI), "controlsText").GetValue(__instance);
				if (value2 != null)
				{
					string value4 = (string.IsNullOrEmpty(((GoPointerButton)component).lookText) ? component.name : ((GoPointerButton)component).lookText);
					AccessTools.Property(value2.GetType(), "text").SetValue(value2, value4);
				}
				if (value3 != null)
				{
					string value5 = (component.nailed ? component2.CustomControlPrompt : ("Pick Up\n" + component2.CustomControlPrompt));
					AccessTools.Property(value3.GetType(), "text").SetValue(value3, value5);
				}
				((Component)__instance).transform.position = ((Component)button).gameObject.transform.position;
				((Component)__instance).transform.LookAt(((Component)Camera.main).transform);
				if (Settings.hintTextEnabled)
				{
					object value6 = AccessTools.Field(typeof(LookUI), "hintText").GetValue(__instance);
					if (value6 != null)
					{
						AccessTools.Property(value6.GetType(), "text").SetValue(value6, button.description);
					}
					AccessTools.Field(typeof(LookUI), "currentButton").SetValue(__instance, button);
				}
				return false;
			}
			return true;
		}
	}
	[HarmonyPatch(typeof(ShipItem), "OnAltActivate", new Type[] { })]
	public static class ShipItemAltActivationPatch
	{
		[HarmonyPrefix]
		public static bool Prefix(ShipItem __instance)
		{
			if (!__instance.sold)
			{
				return true;
			}
			return ((Component)__instance).GetComponent<ICustomFurnitureLogic>()?.OnAltActivate(__instance) ?? true;
		}
	}
	[HarmonyPatch(typeof(CrateInventoryUI), "GetCrateDimensions")]
	public static class CrateInventoryUIOverridePatch
	{
		[HarmonyPostfix]
		public static void Postfix(CrateInventoryUI __instance, ref Vector2 __result)
		{
			//IL_0047: Unknown result type (might be due to invalid IL or missing references)
			//IL_004c: Unknown result type (might be due to invalid IL or missing references)
			if ((Object)(object)__instance.currentCrate != (Object)null && (Object)(object)((Component)__instance.currentCrate).gameObject != (Object)null)
			{
				ICustomFurnitureLogic component = ((Component)__instance.currentCrate).GetComponent<ICustomFurnitureLogic>();
				if (component != null && component.HasCustomGrid)
				{
					__result = component.GridDimensions;
				}
			}
		}
	}
	[HarmonyPatch(typeof(CargoCarrier), "InsertItem")]
	public static class CargoCarrierInsertPatch
	{
		[HarmonyPrefix]
		public static void Prefix(ShipItem item, out bool __state)
		{
			__state = false;
			if (!((Object)(object)item == (Object)null))
			{
				int prefabIndex = item.GetPrefabIndex();
				if (((prefabIndex >= 450 && prefabIndex <= 480) || ((Component)item).GetComponent<ICustomFurnitureLogic>() != null) && item.amount <= 0f)
				{
					item.amount = 1f;
					__state = true;
				}
			}
		}

		[HarmonyPostfix]
		public static void Postfix(ShipItem item, bool __state)
		{
			if (__state && (Object)(object)item != (Object)null)
			{
				item.amount = 0f;
			}
		}
	}
	[HarmonyPatch(typeof(CargoStorageUI), "UpdateButtons")]
	public static class CargoStorageUIUpdateButtonsPatch
	{
		[HarmonyPrefix]
		public static bool Prefix(CargoStorageUI __instance)
		{
			//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
			//IL_0105: Expected I4, but got Unknown
			if ((Object)(object)__instance.currentCarrier == (Object)null)
			{
				return false;
			}
			int num = __instance.currentPage * __instance.buttons.Length;
			for (int i = 0; i < __instance.buttons.Length; i++)
			{
				int num2 = i + num;
				if (num2 > __instance.currentCarrier.cargo.Count - 1)
				{
					((Component)__instance.buttons[i]).gameObject.SetActive(false);
					continue;
				}
				((Component)__instance.buttons[i]).gameObject.SetActive(true);
				ShipItem val = __instance.currentCarrier.cargo[num2];
				string text = (((Object)(object)val != (Object)null) ? val.name : "Unknown Item");
				__instance.buttons[i].ChangeText(text);
				float num3 = __instance.currentCarrier.GetWithdrawPrice(num2);
				string priceString = "";
				if (num3 > 0f)
				{
					priceString = "storage fee:\n" + num3 + " " + PlayerGold.GetCurrencyName((int)__instance.currentCarrier.currency);
				}
				__instance.buttons[i].SetPriceString(priceString);
				if (num3 > 0f)
				{
					__instance.buttons[i].SetMaterial(__instance.cargoStorageFeeMat);
					continue;
				}
				Good val2 = (((Object)(object)val != (Object)null) ? ((Component)val).GetComponent<Good>() : null);
				if ((Object)(object)val2 != (Object)null && val2.GetMissionIndex() >= 0)
				{
					__instance.buttons[i].SetMaterial(__instance.cargoMissionMat);
				}
				else
				{
					__instance.buttons[i].SetMaterial(__instance.cargoDefaultMat);
				}
			}
			return false;
		}
	}
}