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;
}
}
}