Decompiled source of S1API v1.2.3

Plugins/S1APILoader.dll

Decompiled 5 hours ago
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using MelonLoader;
using Microsoft.CodeAnalysis;
using S1APILoader;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::S1APILoader.S1APILoader), "S1APILoader", "1.2.3", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("S1APILoader")]
[assembly: AssemblyConfiguration("Mono")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a00c4f0c2edb8d3c5803bad7b57f8e44e90b3225")]
[assembly: AssemblyProduct("S1APILoader")]
[assembly: AssemblyTitle("S1APILoader")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
}
namespace S1APILoader
{
	public class S1APILoader : MelonPlugin
	{
		private const string BuildFolderName = "S1API";

		public override void OnPreModsLoaded()
		{
			string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
			if (directoryName == null)
			{
				throw new Exception("Failed to identify plugins folder.");
			}
			string path = Path.Combine(directoryName, "..");
			string path2 = Path.Combine(path, "Mods");
			string path3 = Path.Combine(directoryName, "S1API");
			string text = (MelonUtils.IsGameIl2Cpp() ? "Il2Cpp" : "Mono");
			MelonLogger.Msg("Loading S1API for " + text + "...");
			string sourceFileName = Path.Combine(path3, "S1API." + text + ".dll");
			string destFileName = Path.Combine(path2, "S1API.dll");
			File.Copy(sourceFileName, destFileName, overwrite: true);
			MelonLogger.Msg("Successfully loaded S1API for " + text + "!");
		}
	}
}

Plugins/S1API/S1API.Mono.dll

Decompiled 5 hours 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.Versioning;
using HarmonyLib;
using MelonLoader;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using S1API;
using S1API.GameTime;
using S1API.Internal.Abstraction;
using S1API.Internal.Utils;
using S1API.Items;
using S1API.Money;
using S1API.NPCs;
using S1API.PhoneApp;
using S1API.Products;
using S1API.Quests;
using S1API.Saveables;
using S1API.Storages;
using ScheduleOne;
using ScheduleOne.AvatarFramework;
using ScheduleOne.DevUtilities;
using ScheduleOne.Economy;
using ScheduleOne.GameTime;
using ScheduleOne.Interaction;
using ScheduleOne.ItemFramework;
using ScheduleOne.Levelling;
using ScheduleOne.Map;
using ScheduleOne.Messaging;
using ScheduleOne.NPCs;
using ScheduleOne.NPCs.Behaviour;
using ScheduleOne.NPCs.Relation;
using ScheduleOne.NPCs.Responses;
using ScheduleOne.Noise;
using ScheduleOne.Persistence.Datas;
using ScheduleOne.Persistence.Loaders;
using ScheduleOne.PlayerScripts;
using ScheduleOne.Product;
using ScheduleOne.Product.Packaging;
using ScheduleOne.Quests;
using ScheduleOne.Storage;
using ScheduleOne.UI;
using ScheduleOne.UI.Phone.ContactsApp;
using ScheduleOne.UI.WorldspacePopup;
using ScheduleOne.Vehicles;
using ScheduleOne.Vision;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::S1API.S1API), "S1API", "1.2.3", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("KaBooMa")]
[assembly: AssemblyConfiguration("Mono")]
[assembly: AssemblyDescription("A Schedule One Mono / Il2Cpp Cross Compatibility Layer")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a00c4f0c2edb8d3c5803bad7b57f8e44e90b3225")]
[assembly: AssemblyProduct("S1API")]
[assembly: AssemblyTitle("S1API")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/KaBooMa/S1API")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
public static class ButtonUtils
{
	public static void AddListener(Button button, Action action)
	{
		if (!((Object)(object)button == (Object)null) && action != null)
		{
			EventHelper.AddListener(action, (UnityEvent)(object)button.onClick);
		}
	}

	public static void RemoveListener(Button button, Action action)
	{
		if (!((Object)(object)button == (Object)null) && action != null)
		{
			EventHelper.RemoveListener(action, (UnityEvent)(object)button.onClick);
		}
	}

	public static void ClearListeners(Button button)
	{
		if (!((Object)(object)button == (Object)null))
		{
			((UnityEventBase)button.onClick).RemoveAllListeners();
		}
	}

	public static void Enable(Button button, Text label = null, string text = null)
	{
		if ((Object)(object)button != (Object)null)
		{
			((Selectable)button).interactable = true;
		}
		if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
		{
			label.text = text;
		}
	}

	public static void Disable(Button button, Text label = null, string text = null)
	{
		if ((Object)(object)button != (Object)null)
		{
			((Selectable)button).interactable = false;
		}
		if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
		{
			label.text = text;
		}
	}

	public static void SetLabel(Text label, string text)
	{
		if ((Object)(object)label != (Object)null)
		{
			label.text = text;
		}
	}

	public static void SetStyle(Button button, Text label, string text, Color bg)
	{
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)button == (Object)null) && !((Object)(object)label == (Object)null))
		{
			label.text = text;
			((Graphic)((Selectable)button).image).color = bg;
		}
	}
}
public class ClickHandler
{
	private readonly UnityAction _callback;

	public ClickHandler(UnityAction callback)
	{
		_callback = callback;
	}

	public void OnClick()
	{
		_callback.Invoke();
	}
}
namespace S1API
{
	public class S1API : MelonMod
	{
	}
}
namespace S1API.UI
{
	public static class UIFactory
	{
		public static GameObject Panel(string name, Transform parent, Color bgColor, Vector2? anchorMin = null, Vector2? anchorMax = null, bool fullAnchor = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			if (fullAnchor)
			{
				val2.anchorMin = Vector2.zero;
				val2.anchorMax = Vector2.one;
				val2.offsetMin = Vector2.zero;
				val2.offsetMax = Vector2.zero;
			}
			else
			{
				val2.anchorMin = (Vector2)(((??)anchorMin) ?? new Vector2(0.5f, 0.5f));
				val2.anchorMax = (Vector2)(((??)anchorMax) ?? new Vector2(0.5f, 0.5f));
			}
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			return val;
		}

		public static Text Text(string name, string content, Transform parent, int fontSize = 14, TextAnchor anchor = 0, FontStyle style = 0)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			Text val3 = val.AddComponent<Text>();
			val3.text = content;
			val3.fontSize = fontSize;
			val3.alignment = anchor;
			val3.fontStyle = style;
			val3.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			((Graphic)val3).color = Color.white;
			val3.horizontalOverflow = (HorizontalWrapMode)0;
			val3.verticalOverflow = (VerticalWrapMode)1;
			return val3;
		}

		public static RectTransform ScrollableVerticalList(string name, Transform parent, out ScrollRect scrollRect)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Expected O, but got Unknown
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Expected O, but got Unknown
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			scrollRect = val.AddComponent<ScrollRect>();
			scrollRect.horizontal = false;
			GameObject val3 = new GameObject("Viewport");
			val3.transform.SetParent(val.transform, false);
			RectTransform val4 = val3.AddComponent<RectTransform>();
			val4.anchorMin = Vector2.zero;
			val4.anchorMax = Vector2.one;
			val4.offsetMin = Vector2.zero;
			val4.offsetMax = Vector2.zero;
			((Graphic)val3.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.05f);
			val3.AddComponent<Mask>().showMaskGraphic = false;
			scrollRect.viewport = val4;
			GameObject val5 = new GameObject("Content");
			val5.transform.SetParent(val3.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = new Vector2(0f, 1f);
			val6.anchorMax = new Vector2(1f, 1f);
			val6.pivot = new Vector2(0.5f, 1f);
			VerticalLayoutGroup val7 = val5.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val7).spacing = 10f;
			((LayoutGroup)val7).padding = new RectOffset(10, 10, 10, 10);
			((HorizontalOrVerticalLayoutGroup)val7).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val7).childForceExpandHeight = false;
			val5.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			scrollRect.content = val6;
			return val6;
		}

		public static void FitContentHeight(RectTransform content)
		{
			ContentSizeFitter val = ((Component)content).gameObject.GetComponent<ContentSizeFitter>();
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)content).gameObject.AddComponent<ContentSizeFitter>();
			}
			val.verticalFit = (FitMode)2;
		}

		public static (GameObject, Button, Text) ButtonWithLabel(string name, string label, Transform parent, Color bgColor)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(160f, 40f);
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			val3.sprite = Resources.GetBuiltinResource<Sprite>("UI/Skin/UISprite.psd");
			val3.type = (Type)1;
			Button val4 = val.AddComponent<Button>();
			((Selectable)val4).targetGraphic = (Graphic)(object)val3;
			GameObject val5 = new GameObject("Label");
			val5.transform.SetParent(val.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = Vector2.zero;
			val6.anchorMax = Vector2.one;
			val6.offsetMin = Vector2.zero;
			val6.offsetMax = Vector2.zero;
			Text val7 = val5.AddComponent<Text>();
			val7.text = label;
			val7.alignment = (TextAnchor)4;
			val7.fontSize = 16;
			val7.fontStyle = (FontStyle)1;
			((Graphic)val7).color = Color.white;
			val7.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			return (val, val4, val7);
		}

		public static void SetIcon(Sprite sprite, Transform parent)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Icon");
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			Image val3 = val.AddComponent<Image>();
			val3.sprite = sprite;
			val3.preserveAspect = true;
		}

		public static void CreateTextBlock(Transform parent, string title, string subtitle, bool isCompleted)
		{
			Text(((Object)parent).name + "Title", title, parent, 16, (TextAnchor)3, (FontStyle)1);
			Text(((Object)parent).name + "Subtitle", subtitle, parent, 14, (TextAnchor)0, (FontStyle)0);
			if (isCompleted)
			{
				Text("CompletedLabel", "<color=#888888><i>Already Delivered</i></color>", parent, 12, (TextAnchor)0, (FontStyle)0);
			}
		}

		public static void CreateRowButton(GameObject go, UnityAction clickHandler, bool enabled)
		{
			Button val = go.AddComponent<Button>();
			Image component = go.GetComponent<Image>();
			((Selectable)val).targetGraphic = (Graphic)(object)component;
			((Selectable)val).interactable = enabled;
			((UnityEvent)val.onClick).AddListener(clickHandler);
		}

		public static void ClearChildren(Transform parent)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			foreach (Transform item in parent)
			{
				Transform val = item;
				Object.Destroy((Object)(object)((Component)val).gameObject);
			}
		}

		public static void VerticalLayoutOnGO(GameObject go, int spacing = 10, RectOffset padding = null)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			VerticalLayoutGroup val = go.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
			((LayoutGroup)val).padding = (RectOffset)(((object)padding) ?? ((object)new RectOffset(10, 10, 10, 10)));
		}

		public static GameObject CreateQuestRow(string name, Transform parent, out GameObject iconPanel, out GameObject textPanel)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Expected O, but got Unknown
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Row_" + name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(0f, 90f);
			val.AddComponent<LayoutElement>().minHeight = 50f;
			((Shadow)val.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.2f);
			GameObject val3 = Panel("Separator", val.transform, new Color(1f, 1f, 1f, 0.05f));
			val3.GetComponent<RectTransform>().sizeDelta = new Vector2(300f, 1f);
			Image val4 = val.AddComponent<Image>();
			((Graphic)val4).color = new Color(0.12f, 0.12f, 0.12f);
			Button val5 = val.AddComponent<Button>();
			((Selectable)val5).targetGraphic = (Graphic)(object)val4;
			HorizontalLayoutGroup val6 = val.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val6).spacing = 20f;
			((LayoutGroup)val6).padding = new RectOffset(75, 10, 10, 10);
			((LayoutGroup)val6).childAlignment = (TextAnchor)3;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandHeight = false;
			LayoutElement val7 = val.AddComponent<LayoutElement>();
			val7.minHeight = 90f;
			val7.flexibleWidth = 1f;
			iconPanel = Panel("IconPanel", val.transform, new Color(0.12f, 0.12f, 0.12f));
			RectTransform component = iconPanel.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(80f, 80f);
			LayoutElement val8 = iconPanel.AddComponent<LayoutElement>();
			val8.preferredWidth = 80f;
			val8.preferredHeight = 80f;
			textPanel = Panel("TextPanel", val.transform, Color.clear);
			VerticalLayoutOnGO(textPanel, 2);
			LayoutElement val9 = textPanel.AddComponent<LayoutElement>();
			val9.minWidth = 200f;
			val9.flexibleWidth = 1f;
			return val;
		}

		public static void BindAcceptButton(Button btn, Text label, string text, UnityAction callback)
		{
			label.text = text;
			((UnityEventBase)btn.onClick).RemoveAllListeners();
			((UnityEvent)btn.onClick).AddListener(callback);
		}
	}
}
namespace S1API.Storages
{
	public class StorageInstance
	{
		internal readonly StorageEntity S1Storage;

		public ItemSlotInstance[] Slots => (from itemSlot in S1Storage.ItemSlots.ToArray()
			select new ItemSlotInstance(itemSlot)).ToArray();

		public event Action OnOpened
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onOpened);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onOpened);
			}
		}

		public event Action OnClosed
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onClosed);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onClosed);
			}
		}

		internal StorageInstance(StorageEntity storage)
		{
			S1Storage = storage;
		}

		public bool CanItemFit(ItemInstance itemInstance, int quantity = 1)
		{
			return S1Storage.CanItemFit(itemInstance.S1ItemInstance, quantity);
		}

		public void AddItem(ItemInstance itemInstance)
		{
			S1Storage.InsertItem(itemInstance.S1ItemInstance, true);
		}
	}
}
namespace S1API.Saveables
{
	[AttributeUsage(AttributeTargets.Field)]
	public class SaveableField : Attribute
	{
		internal string SaveName { get; }

		public SaveableField(string saveName)
		{
			SaveName = saveName;
		}
	}
}
namespace S1API.Quests
{
	public abstract class Quest : Saveable
	{
		protected readonly QuestEntry[] QuestEntries = Array.Empty<QuestEntry>();

		[SaveableField("QuestData")]
		private readonly QuestData _questData;

		internal readonly Quest S1Quest;

		private readonly GameObject _gameObject;

		protected abstract string Title { get; }

		protected abstract string Description { get; }

		protected virtual bool AutoBegin => true;

		internal string? SaveFolder => S1Quest.SaveFolderName;

		protected virtual Sprite? QuestIcon => null;

		public Quest()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Expected O, but got Unknown
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Expected O, but got Unknown
			//IL_0080: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Expected O, but got Unknown
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009a: Expected O, but got Unknown
			//IL_011d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0123: Expected O, but got Unknown
			//IL_0198: Unknown result type (might be due to invalid IL or missing references)
			//IL_019e: Expected O, but got Unknown
			//IL_01d8: Unknown result type (might be due to invalid IL or missing references)
			//IL_01df: Expected O, but got Unknown
			//IL_0215: Unknown result type (might be due to invalid IL or missing references)
			//IL_021c: Expected O, but got Unknown
			//IL_0269: Unknown result type (might be due to invalid IL or missing references)
			//IL_0279: Unknown result type (might be due to invalid IL or missing references)
			//IL_0280: Expected O, but got Unknown
			_questData = new QuestData(GetType().Name);
			_gameObject = new GameObject("Quest");
			S1Quest = _gameObject.AddComponent<Quest>();
			S1Quest.StaticGUID = string.Empty;
			S1Quest.onActiveState = new UnityEvent();
			S1Quest.onComplete = new UnityEvent();
			S1Quest.onInitialComplete = new UnityEvent();
			S1Quest.onQuestBegin = new UnityEvent();
			S1Quest.onQuestEnd = new UnityEvent<EQuestState>();
			S1Quest.onTrackChange = new UnityEvent<bool>();
			S1Quest.TrackOnBegin = true;
			S1Quest.AutoCompleteOnAllEntriesComplete = true;
			FieldInfo fieldInfo = AccessTools.Field(typeof(Quest), "autoInitialize");
			fieldInfo.SetValue(S1Quest, false);
			GameObject val = new GameObject("IconPrefab", new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val.transform.SetParent(_gameObject.transform);
			Image component = val.GetComponent<Image>();
			component.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			S1Quest.IconPrefab = val.GetComponent<RectTransform>();
			GameObject val2 = new GameObject("PoIUIPrefab", new Type[4]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<EventTrigger>(),
				CrossType.Of<Button>()
			});
			val2.transform.SetParent(_gameObject.transform);
			GameObject val3 = new GameObject("MainLabel", new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Text>()
			});
			val3.transform.SetParent(val2.transform);
			GameObject val4 = new GameObject("IconContainer", new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val4.transform.SetParent(val2.transform);
			Image component2 = val4.GetComponent<Image>();
			component2.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			RectTransform component3 = ((Component)component2).GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(20f, 20f);
			GameObject val5 = new GameObject("POIPrefab");
			val5.SetActive(false);
			val5.transform.SetParent(_gameObject.transform);
			POI val6 = val5.AddComponent<POI>();
			val6.DefaultMainText = "Did it work?";
			FieldInfo fieldInfo2 = AccessTools.Field(typeof(POI), "UIPrefab");
			fieldInfo2.SetValue(val6, val2);
			S1Quest.PoIPrefab = val5;
			S1Quest.onQuestEnd.AddListener((UnityAction<EQuestState>)OnQuestEnded);
		}

		internal override void CreateInternal()
		{
			base.CreateInternal();
			S1Quest.InitializeQuest(Title, Description, Array.Empty<QuestEntryData>(), S1Quest?.StaticGUID);
			if (AutoBegin)
			{
				Quest s1Quest = S1Quest;
				if (s1Quest != null)
				{
					s1Quest.Begin(true);
				}
			}
		}

		internal override void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			string text = Path.Combine(folderPath, S1Quest.SaveFolderName);
			if (!Directory.Exists(text))
			{
				Directory.CreateDirectory(text);
			}
			base.SaveInternal(text, ref extraSaveables);
		}

		internal void OnQuestEnded(EQuestState questState)
		{
			Quest.Quests.Remove(S1Quest);
			QuestManager.Quests.Remove(this);
		}

		protected QuestEntry AddEntry(string title, Vector3? poiPosition = null)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("QuestEntry");
			Transform transform = val.transform;
			GameObject gameObject = _gameObject;
			transform.SetParent((gameObject != null) ? gameObject.transform : null);
			QuestEntry val2 = val.AddComponent<QuestEntry>();
			val2.PoILocation = val.transform;
			S1Quest.Entries.Add(val2);
			QuestEntry questEntry = new QuestEntry(val2)
			{
				Title = title,
				POIPosition = (Vector3)(((??)poiPosition) ?? Vector3.zero)
			};
			CollectionExtensions.AddItem<QuestEntry>((IEnumerable<QuestEntry>)QuestEntries, questEntry);
			return questEntry;
		}

		public void Begin()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Begin(true);
			}
		}

		public void Cancel()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Cancel(true);
			}
		}

		public void Expire()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Expire(true);
			}
		}

		public void Fail()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Fail(true);
			}
		}

		public void Complete()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Complete(true);
			}
		}

		public void End()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.End();
			}
		}
	}
	public class QuestData
	{
		public readonly string ClassName;

		public QuestData(string className)
		{
			ClassName = className;
		}
	}
	public class QuestEntry
	{
		internal readonly QuestEntry S1QuestEntry;

		public string Title
		{
			get
			{
				return S1QuestEntry.Title;
			}
			set
			{
				S1QuestEntry.SetEntryTitle(value);
			}
		}

		public Vector3 POIPosition
		{
			get
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				return S1QuestEntry.PoILocation.position;
			}
			set
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				S1QuestEntry.PoILocation.position = value;
			}
		}

		public event Action OnComplete
		{
			add
			{
				EventHelper.AddListener(value, S1QuestEntry.onComplete);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1QuestEntry.onComplete);
			}
		}

		internal QuestEntry(QuestEntry questEntry)
		{
			S1QuestEntry = questEntry;
		}

		public void Begin()
		{
			S1QuestEntry.Begin();
		}

		public void Complete()
		{
			S1QuestEntry.Complete();
		}

		public void SetState(QuestState questState)
		{
			S1QuestEntry.SetState((EQuestState)questState, true);
		}
	}
	public static class QuestManager
	{
		internal static readonly List<Quest> Quests = new List<Quest>();

		public static Quest CreateQuest<T>(string? guid = null) where T : Quest
		{
			return CreateQuest(typeof(T), guid);
		}

		public static Quest CreateQuest(Type questType, string? guid = null)
		{
			Quest quest = (Quest)Activator.CreateInstance(questType);
			Quests.Add(quest);
			return quest;
		}
	}
	public enum QuestState
	{
		Inactive,
		Active,
		Completed,
		Failed,
		Expired,
		Cancelled
	}
}
namespace S1API.Products
{
	public class CocaineDefinition : ProductDefinition
	{
		internal CocaineDefinition S1CocaineDefinition => CrossType.As<CocaineDefinition>(S1ItemDefinition);

		internal CocaineDefinition(CocaineDefinition definition)
			: base((ProductDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1CocaineDefinition).GetDefaultInstance(quantity)));
		}
	}
	public class MethDefinition : ProductDefinition
	{
		internal MethDefinition S1MethDefinition => CrossType.As<MethDefinition>(S1ItemDefinition);

		internal MethDefinition(MethDefinition definition)
			: base((ProductDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1MethDefinition).GetDefaultInstance(quantity)));
		}
	}
	public class PackagingDefinition : ItemDefinition
	{
		internal PackagingDefinition S1PackagingDefinition => CrossType.As<PackagingDefinition>(S1ItemDefinition);

		public int Quantity => S1PackagingDefinition.Quantity;

		internal PackagingDefinition(ItemDefinition s1ItemDefinition)
			: base(s1ItemDefinition)
		{
		}
	}
	public class ProductDefinition : ItemDefinition
	{
		internal ProductDefinition S1ProductDefinition => CrossType.As<ProductDefinition>(S1ItemDefinition);

		public float Price => S1ProductDefinition.Price;

		internal ProductDefinition(ProductDefinition productDefinition)
			: base((ItemDefinition)(object)productDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1ProductDefinition).GetDefaultInstance(quantity)));
		}
	}
	public static class ProductDefinitionWrapper
	{
		public static ProductDefinition Wrap(ProductDefinition def)
		{
			ItemDefinition s1ItemDefinition = def.S1ItemDefinition;
			if (CrossType.Is<WeedDefinition>(s1ItemDefinition, out var result))
			{
				return new WeedDefinition(result);
			}
			if (CrossType.Is<MethDefinition>(s1ItemDefinition, out var result2))
			{
				return new MethDefinition(result2);
			}
			if (CrossType.Is<CocaineDefinition>(s1ItemDefinition, out var result3))
			{
				return new CocaineDefinition(result3);
			}
			return def;
		}
	}
	public class ProductInstance : ItemInstance
	{
		internal ProductItemInstance S1ProductInstance => CrossType.As<ProductItemInstance>(S1ItemInstance);

		public bool IsPackaged => Object.op_Implicit((Object)(object)S1ProductInstance.AppliedPackaging);

		public PackagingDefinition AppliedPackaging => new PackagingDefinition((ItemDefinition)(object)S1ProductInstance.AppliedPackaging);

		internal ProductInstance(ProductItemInstance productInstance)
			: base((ItemInstance)(object)productInstance)
		{
		}
	}
	public static class ProductManager
	{
		public static ProductDefinition[] DiscoveredProducts => (from productDefinition in ProductManager.DiscoveredProducts.ToArray()
			select ProductDefinitionWrapper.Wrap(new ProductDefinition(productDefinition))).ToArray();
	}
	public class WeedDefinition : ProductDefinition
	{
		internal WeedDefinition S1WeedDefinition => CrossType.As<WeedDefinition>(S1ItemDefinition);

		internal WeedDefinition(WeedDefinition definition)
			: base((ProductDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>(((ItemDefinition)S1WeedDefinition).GetDefaultInstance(quantity)));
		}
	}
}
namespace S1API.PhoneApp
{
	public abstract class PhoneApp : Registerable
	{
		protected static readonly Instance LoggerInstance = new Instance("PhoneApp");

		protected GameObject Player;

		protected GameObject AppPanel;

		protected bool AppCreated;

		protected bool IconModified;

		protected abstract string AppName { get; }

		protected abstract string AppTitle { get; }

		protected abstract string IconLabel { get; }

		protected abstract string IconFileName { get; }

		protected abstract void OnCreatedUI(GameObject container);

		protected override void OnCreated()
		{
			MelonCoroutines.Start(InitApp());
		}

		protected override void OnDestroyed()
		{
			if ((Object)(object)AppPanel != (Object)null)
			{
				Object.Destroy((Object)(object)AppPanel);
				AppPanel = null;
			}
			AppCreated = false;
			IconModified = false;
		}

		private IEnumerator InitApp()
		{
			yield return (object)new WaitForSeconds(5f);
			Player = GameObject.Find("Player_Local");
			if ((Object)(object)Player == (Object)null)
			{
				LoggerInstance.Error("Player_Local not found.");
				yield break;
			}
			GameObject appsCanvas = GameObject.Find("Player_Local/CameraContainer/Camera/OverlayCamera/GameplayMenu/Phone/phone/AppsCanvas");
			if ((Object)(object)appsCanvas == (Object)null)
			{
				LoggerInstance.Error("AppsCanvas not found.");
				yield break;
			}
			Transform existingApp = appsCanvas.transform.Find(AppName);
			if ((Object)(object)existingApp != (Object)null)
			{
				AppPanel = ((Component)existingApp).gameObject;
				SetupExistingAppPanel(AppPanel);
			}
			else
			{
				Transform templateApp = appsCanvas.transform.Find("ProductManagerApp");
				if ((Object)(object)templateApp == (Object)null)
				{
					LoggerInstance.Error("Template ProductManagerApp not found.");
					yield break;
				}
				AppPanel = Object.Instantiate<GameObject>(((Component)templateApp).gameObject, appsCanvas.transform);
				((Object)AppPanel).name = AppName;
				Transform containerTransform = AppPanel.transform.Find("Container");
				if ((Object)(object)containerTransform != (Object)null)
				{
					GameObject container = ((Component)containerTransform).gameObject;
					ClearContainer(container);
					OnCreatedUI(container);
				}
				AppCreated = true;
			}
			AppPanel.SetActive(false);
			if (!IconModified)
			{
				IconModified = ModifyAppIcon(IconLabel, IconFileName);
			}
		}

		private void SetupExistingAppPanel(GameObject panel)
		{
			Transform val = panel.transform.Find("Container");
			if ((Object)(object)val != (Object)null)
			{
				GameObject gameObject = ((Component)val).gameObject;
				if (gameObject.transform.childCount < 2)
				{
					ClearContainer(gameObject);
					OnCreatedUI(gameObject);
				}
			}
			AppCreated = true;
		}

		private void ClearContainer(GameObject container)
		{
			for (int num = container.transform.childCount - 1; num >= 0; num--)
			{
				Object.Destroy((Object)(object)((Component)container.transform.GetChild(num)).gameObject);
			}
		}

		private bool ModifyAppIcon(string labelText, string fileName)
		{
			GameObject val = GameObject.Find("Player_Local/CameraContainer/Camera/OverlayCamera/GameplayMenu/Phone/phone/HomeScreen/AppIcons/");
			if ((Object)(object)val == (Object)null)
			{
				Instance loggerInstance = LoggerInstance;
				if (loggerInstance != null)
				{
					loggerInstance.Error("AppIcons not found.");
				}
				return false;
			}
			Transform val2 = ((val.transform.childCount > 0) ? val.transform.GetChild(val.transform.childCount - 1) : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Instance loggerInstance2 = LoggerInstance;
				if (loggerInstance2 != null)
				{
					loggerInstance2.Error("No icon found to clone.");
				}
				return false;
			}
			GameObject gameObject = ((Component)val2).gameObject;
			((Object)gameObject).name = AppName;
			Transform val3 = gameObject.transform.Find("Label");
			Text val4 = ((val3 != null) ? ((Component)val3).GetComponent<Text>() : null);
			if ((Object)(object)val4 != (Object)null)
			{
				val4.text = labelText;
			}
			return ChangeAppIconImage(gameObject, fileName);
		}

		private bool ChangeAppIconImage(GameObject iconObj, string filename)
		{
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Expected O, but got Unknown
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d8: Unknown result type (might be due to invalid IL or missing references)
			Transform val = iconObj.transform.Find("Mask/Image");
			Image val2 = ((val != null) ? ((Component)val).GetComponent<Image>() : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Instance loggerInstance = LoggerInstance;
				if (loggerInstance != null)
				{
					loggerInstance.Error("Image component not found in icon.");
				}
				return false;
			}
			string text = Path.Combine(MelonEnvironment.ModsDirectory, filename);
			if (!File.Exists(text))
			{
				Instance loggerInstance2 = LoggerInstance;
				if (loggerInstance2 != null)
				{
					loggerInstance2.Error("Icon file not found: " + text);
				}
				return false;
			}
			try
			{
				byte[] array = File.ReadAllBytes(text);
				Texture2D val3 = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val3, array))
				{
					val2.sprite = Sprite.Create(val3, new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), new Vector2(0.5f, 0.5f));
					return true;
				}
				Object.Destroy((Object)(object)val3);
			}
			catch (Exception ex)
			{
				Instance loggerInstance3 = LoggerInstance;
				if (loggerInstance3 != null)
				{
					loggerInstance3.Error("Failed to load image: " + ex.Message);
				}
			}
			return false;
		}
	}
}
namespace S1API.NPCs
{
	public abstract class NPC : Saveable
	{
		protected readonly List<Response> Responses = new List<Response>();

		internal readonly NPC S1NPC;

		private readonly GameObject _gameObject;

		protected virtual Sprite? NPCIcon => null;

		public NPC(string guid, string firstName, string lastName)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0115: Expected O, but got Unknown
			//IL_0120: Unknown result type (might be due to invalid IL or missing references)
			//IL_012a: Expected O, but got Unknown
			//IL_0155: Unknown result type (might be due to invalid IL or missing references)
			//IL_015b: Expected O, but got Unknown
			//IL_0253: Unknown result type (might be due to invalid IL or missing references)
			//IL_0259: Expected O, but got Unknown
			//IL_0284: Unknown result type (might be due to invalid IL or missing references)
			//IL_028b: Expected O, but got Unknown
			//IL_02ac: Unknown result type (might be due to invalid IL or missing references)
			//IL_02b3: Expected O, but got Unknown
			//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f7: Expected O, but got Unknown
			//IL_0334: Unknown result type (might be due to invalid IL or missing references)
			//IL_033b: Expected O, but got Unknown
			//IL_036c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0371: Unknown result type (might be due to invalid IL or missing references)
			//IL_0373: 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_0388: Expected O, but got Unknown
			//IL_03f0: Unknown result type (might be due to invalid IL or missing references)
			//IL_03fa: Expected O, but got Unknown
			_gameObject = new GameObject("NPC");
			_gameObject.SetActive(false);
			S1NPC = _gameObject.AddComponent<NPC>();
			S1NPC.FirstName = firstName;
			S1NPC.LastName = lastName;
			S1NPC.ID = guid;
			S1NPC.BakedGUID = Guid.NewGuid().ToString();
			S1NPC.MugshotSprite = NPCIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			S1NPC.ConversationCategories = new List<EConversationCategory>();
			S1NPC.ConversationCategories.Add((EConversationCategory)0);
			MethodInfo methodInfo = AccessTools.Method(typeof(NPC), "CreateMessageConversation", (Type[])null, (Type[])null);
			methodInfo.Invoke(S1NPC, null);
			S1NPC.Health = _gameObject.GetComponent<NPCHealth>();
			S1NPC.Health.onDie = new UnityEvent();
			S1NPC.Health.onKnockedOut = new UnityEvent();
			S1NPC.Health.Invincible = true;
			S1NPC.Health.MaxHealth = 100f;
			GameObject val = new GameObject("NPCAwareness");
			val.SetActive(false);
			val.transform.SetParent(_gameObject.transform);
			S1NPC.awareness = val.AddComponent<NPCAwareness>();
			S1NPC.awareness.onExplosionHeard = new UnityEvent<NoiseEvent>();
			S1NPC.awareness.onGunshotHeard = new UnityEvent<NoiseEvent>();
			S1NPC.awareness.onHitByCar = new UnityEvent<LandVehicle>();
			S1NPC.awareness.onNoticedDrugDealing = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedGeneralCrime = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedPettyCrime = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedPlayerViolatingCurfew = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedSuspiciousPlayer = new UnityEvent<Player>();
			S1NPC.awareness.Listener = _gameObject.AddComponent<Listener>();
			GameObject val2 = new GameObject("NPCBehaviour");
			val2.SetActive(false);
			val2.transform.SetParent(_gameObject.transform);
			NPCBehaviour val3 = val2.AddComponent<NPCBehaviour>();
			GameObject val4 = new GameObject("CowingBehaviour");
			val4.transform.SetParent(val2.transform);
			CoweringBehaviour coweringBehaviour = val4.AddComponent<CoweringBehaviour>();
			GameObject val5 = new GameObject("FleeBehaviour");
			val5.transform.SetParent(val2.transform);
			FleeBehaviour fleeBehaviour = val5.AddComponent<FleeBehaviour>();
			val3.CoweringBehaviour = coweringBehaviour;
			val3.FleeBehaviour = fleeBehaviour;
			S1NPC.behaviour = val3;
			GameObject val6 = new GameObject("NPCResponses");
			val6.SetActive(false);
			val6.transform.SetParent(_gameObject.transform);
			S1NPC.awareness.Responses = (NPCResponses)(object)val6.AddComponent<NPCResponses_Civilian>();
			GameObject val7 = new GameObject("VisionCone");
			val7.SetActive(false);
			val7.transform.SetParent(_gameObject.transform);
			VisionCone val8 = val7.AddComponent<VisionCone>();
			val8.StatesOfInterest.Add(new StateContainer
			{
				state = (EVisualState)4,
				RequiredNoticeTime = 0.1f
			});
			S1NPC.awareness.VisionCone = val8;
			S1NPC.awareness.VisionCone.QuestionMarkPopup = _gameObject.AddComponent<WorldspacePopup>();
			FieldInfo fieldInfo = AccessTools.Field(typeof(NPC), "intObj");
			fieldInfo.SetValue(S1NPC, _gameObject.AddComponent<InteractableObject>());
			S1NPC.RelationData = new NPCRelationData();
			NPCInventory val9 = _gameObject.AddComponent<NPCInventory>();
			val9.PickpocketIntObj = _gameObject.AddComponent<InteractableObject>();
			S1NPC.Avatar = Singleton<MugshotGenerator>.Instance.MugshotRig;
			_gameObject.SetActive(true);
			val7.SetActive(true);
			val6.SetActive(true);
			val.SetActive(true);
			val2.SetActive(true);
		}

		internal override void CreateInternal()
		{
			foreach (Response currentResponse in S1NPC.MSGConversation.currentResponses)
			{
				Response response = new Response(currentResponse)
				{
					Label = currentResponse.label,
					Text = currentResponse.text
				};
				Responses.Add(response);
				OnResponseLoaded(response);
			}
			base.CreateInternal();
		}

		internal override void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			string folderPath2 = Path.Combine(folderPath, S1NPC.SaveFolderName);
			base.SaveInternal(folderPath2, ref extraSaveables);
		}

		public void SendTextMessage(string message, Response[]? responses = null, float responseDelay = 1f, bool network = true)
		{
			S1NPC.SendTextMessage(message);
			S1NPC.MSGConversation.ClearResponses(false);
			if (responses != null && responses.Length != 0)
			{
				Responses.Clear();
				List<Response> list = new List<Response>();
				foreach (Response response in responses)
				{
					Responses.Add(response);
					list.Add(response.S1Response);
				}
				S1NPC.MSGConversation.ShowResponses(list, responseDelay, network);
			}
		}

		protected virtual void OnResponseLoaded(Response response)
		{
		}
	}
	public class NPCInstance
	{
	}
	public class NPCManager
	{
	}
	public class Response
	{
		internal readonly Response S1Response;

		public Action? OnTriggered
		{
			get
			{
				return (S1Response.callback == null) ? null : ((Action)delegate
				{
					S1Response.callback();
				});
			}
			set
			{
				S1Response.callback = value;
			}
		}

		public string Label
		{
			get
			{
				return S1Response.label;
			}
			set
			{
				S1Response.label = value;
			}
		}

		public string Text
		{
			get
			{
				return S1Response.text;
			}
			set
			{
				S1Response.text = value;
			}
		}

		public Response()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			S1Response = new Response();
		}

		internal Response(Response response)
		{
			S1Response = response;
		}
	}
}
namespace S1API.Money
{
	public class CashDefinition : ItemDefinition
	{
		internal CashDefinition S1CashDefinition => CrossType.As<CashDefinition>(S1ItemDefinition);

		internal CashDefinition(CashDefinition s1ItemDefinition)
			: base((ItemDefinition)(object)s1ItemDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new CashInstance(((ItemDefinition)S1CashDefinition).GetDefaultInstance(quantity));
		}
	}
	public class CashInstance : ItemInstance
	{
		internal CashInstance S1CashInstance => CrossType.As<CashInstance>(S1ItemInstance);

		internal CashInstance(ItemInstance itemInstance)
			: base(itemInstance)
		{
		}

		public void AddQuantity(float amount)
		{
			S1CashInstance.SetBalance(Mathf.Clamp(S1CashInstance.Balance + amount, 0f, float.MaxValue), false);
		}

		public void SetQuantity(float newQuantity)
		{
			S1CashInstance.SetBalance(newQuantity, false);
		}
	}
}
namespace S1API.Leveling
{
	public static class LevelManager
	{
		public static Rank Rank = (Rank)NetworkSingleton<LevelManager>.Instance.Rank;
	}
	public enum Rank
	{
		StreetRat,
		Hoodlum,
		Peddler,
		Hustler,
		Bagman,
		Enforcer,
		ShotCaller,
		BlockBoss,
		Underlord,
		Baron,
		Kingpin
	}
}
namespace S1API.Items
{
	public enum ItemCategory
	{
		Product,
		Packaging,
		Growing,
		Tools,
		Furniture,
		Lighting,
		Cash,
		Consumable,
		Equipment,
		Ingredient,
		Decoration,
		Clothing
	}
	public class ItemDefinition : IGUIDReference
	{
		internal readonly ItemDefinition S1ItemDefinition;

		public virtual string GUID => S1ItemDefinition.ID;

		public string ID => S1ItemDefinition.ID;

		public string Name => S1ItemDefinition.Name;

		public string Description => S1ItemDefinition.Description;

		public ItemCategory Category => (ItemCategory)S1ItemDefinition.Category;

		public int StackLimit => S1ItemDefinition.StackLimit;

		internal ItemDefinition(ItemDefinition s1ItemDefinition)
		{
			S1ItemDefinition = s1ItemDefinition;
		}

		internal static ItemDefinition GetFromGUID(string guid)
		{
			return ItemManager.GetItemDefinition(guid);
		}

		public override bool Equals(object? obj)
		{
			return obj is ItemDefinition itemDefinition && (Object)(object)S1ItemDefinition == (Object)(object)itemDefinition.S1ItemDefinition;
		}

		public override int GetHashCode()
		{
			return ((object)S1ItemDefinition)?.GetHashCode() ?? 0;
		}

		public static bool operator ==(ItemDefinition? left, ItemDefinition? right)
		{
			if ((object)left == right)
			{
				return true;
			}
			return (Object)(object)left?.S1ItemDefinition == (Object)(object)right?.S1ItemDefinition;
		}

		public static bool operator !=(ItemDefinition left, ItemDefinition right)
		{
			return !(left == right);
		}

		public virtual ItemInstance CreateInstance(int quantity = 1)
		{
			return new ItemInstance(S1ItemDefinition.GetDefaultInstance(quantity));
		}
	}
	public class ItemInstance
	{
		internal readonly ItemInstance S1ItemInstance;

		public ItemDefinition Definition => new ItemDefinition(S1ItemInstance.Definition);

		internal ItemInstance(ItemInstance itemInstance)
		{
			S1ItemInstance = itemInstance;
		}
	}
	public static class ItemManager
	{
		public static ItemDefinition GetItemDefinition(string itemID)
		{
			ItemDefinition item = Registry.GetItem(itemID);
			if (CrossType.Is<ProductDefinition>(item, out var result))
			{
				return new ProductDefinition(result);
			}
			if (CrossType.Is<CashDefinition>(item, out var result2))
			{
				return new CashDefinition(result2);
			}
			return new ItemDefinition(item);
		}
	}
	public class ItemSlotInstance
	{
		internal readonly ItemSlot S1ItemSlot;

		public int Quantity => S1ItemSlot.Quantity;

		public ItemInstance? ItemInstance
		{
			get
			{
				if (CrossType.Is<ProductItemInstance>(S1ItemSlot.ItemInstance, out var result))
				{
					return new ProductInstance(result);
				}
				if (CrossType.Is<CashInstance>(S1ItemSlot.ItemInstance, out var result2))
				{
					return new CashInstance((ItemInstance)(object)result2);
				}
				if (CrossType.Is<ItemInstance>(S1ItemSlot.ItemInstance, out var result3))
				{
					return new ItemInstance(result3);
				}
				return null;
			}
		}

		internal ItemSlotInstance(ItemSlot itemSlot)
		{
			S1ItemSlot = itemSlot;
		}

		public void AddQuantity(int amount)
		{
			S1ItemSlot.ChangeQuantity(amount, false);
		}
	}
}
namespace S1API.Internal.Utils
{
	internal static class CrossType
	{
		internal static Type Of<T>()
		{
			return typeof(T);
		}

		internal static bool Is<T>(object obj, out T result) where T : class
		{
			if (obj is T val)
			{
				result = val;
				return true;
			}
			result = null;
			return false;
		}

		internal static T As<T>(object obj) where T : class
		{
			return (T)obj;
		}
	}
	public static class ImageUtils
	{
		public static Sprite LoadImage(string fileName)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_0083: 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)
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, fileName);
			if (!File.Exists(text))
			{
				MelonLogger.Error("❌ Icon file not found: " + text);
				return null;
			}
			try
			{
				byte[] array = File.ReadAllBytes(text);
				Texture2D val = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val, array))
				{
					return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
				}
			}
			catch (Exception ex)
			{
				MelonLogger.Error("❌ Failed to load sprite: " + ex);
			}
			return null;
		}
	}
	internal static class ReflectionUtils
	{
		internal static List<Type> GetDerivedClasses<TBaseClass>()
		{
			List<Type> list = new List<Type>();
			Assembly[] array = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
				where !assembly.FullName.StartsWith("System") && !assembly.FullName.StartsWith("Unity") && !assembly.FullName.StartsWith("Il2Cpp") && !assembly.FullName.StartsWith("mscorlib") && !assembly.FullName.StartsWith("Mono.") && !assembly.FullName.StartsWith("netstandard")
				select assembly).ToArray();
			Assembly[] array2 = array;
			foreach (Assembly assembly2 in array2)
			{
				list.AddRange(from type in assembly2.GetTypes()
					where typeof(TBaseClass).IsAssignableFrom(type) && type != typeof(TBaseClass) && !type.IsAbstract
					select type);
			}
			return list;
		}

		internal static Type? GetTypeByName(string typeName)
		{
			string typeName2 = typeName;
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			Assembly[] array = assemblies;
			foreach (Assembly assembly in array)
			{
				Type type2 = assembly.GetTypes().FirstOrDefault((Type type) => type.Name == typeName2);
				if (!(type2 == null))
				{
					return type2;
				}
			}
			return null;
		}

		internal static FieldInfo[] GetAllFields(Type? type, BindingFlags bindingFlags)
		{
			List<FieldInfo> list = new List<FieldInfo>();
			while (type != null && type != typeof(object))
			{
				list.AddRange(type.GetFields(bindingFlags));
				type = type.BaseType;
			}
			return list.ToArray();
		}

		public static MethodInfo? GetMethod(Type? type, string methodName, BindingFlags bindingFlags)
		{
			while (type != null && type != typeof(object))
			{
				MethodInfo method = type.GetMethod(methodName, bindingFlags);
				if (method != null)
				{
					return method;
				}
				type = type.BaseType;
			}
			return null;
		}
	}
}
namespace S1API.Internal.Patches
{
	[HarmonyPatch]
	internal class NPCPatches
	{
		private static readonly List<NPC> NPCs = new List<NPC>();

		[HarmonyPatch(typeof(NPCsLoader), "Load")]
		[HarmonyPrefix]
		private static void NPCsLoadersLoad(NPCsLoader __instance, string mainPath)
		{
			foreach (Type derivedClass in ReflectionUtils.GetDerivedClasses<NPC>())
			{
				NPC nPC = (NPC)Activator.CreateInstance(derivedClass);
				NPCs.Add(nPC);
				string folderPath = Path.Combine(mainPath, nPC.S1NPC.SaveFolderName);
				nPC.LoadInternal(folderPath);
			}
		}

		[HarmonyPatch(typeof(NPC), "Start")]
		[HarmonyPostfix]
		private static void NPCStart(NPC __instance)
		{
			NPC __instance2 = __instance;
			NPCs.FirstOrDefault((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2)?.CreateInternal();
		}

		[HarmonyPatch(typeof(NPC), "WriteData")]
		[HarmonyPostfix]
		private static void NPCWriteData(NPC __instance, string parentFolderPath, ref List<string> __result)
		{
			NPC __instance2 = __instance;
			NPCs.FirstOrDefault((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2)?.SaveInternal(parentFolderPath, ref __result);
		}

		[HarmonyPatch(typeof(NPC), "OnDestroy")]
		[HarmonyPostfix]
		private static void NPCOnDestroy(NPC __instance)
		{
			NPC __instance2 = __instance;
			NPCs.RemoveAll((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2);
			NPC nPC = NPCs.FirstOrDefault((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2);
			if (nPC != null)
			{
				NPCs.Remove(nPC);
			}
		}
	}
	[HarmonyPatch(typeof(SceneManager), "Internal_SceneLoaded", new Type[]
	{
		typeof(Scene),
		typeof(LoadSceneMode)
	})]
	internal static class PhoneAppPatches
	{
		private static bool _loaded;

		private static void Postfix(Scene scene, LoadSceneMode mode)
		{
			if (_loaded || ((Scene)(ref scene)).name != "Main")
			{
				return;
			}
			_loaded = true;
			List<Type> derivedClasses = ReflectionUtils.GetDerivedClasses<global::S1API.PhoneApp.PhoneApp>();
			foreach (Type item in derivedClasses)
			{
				if (!(item.GetConstructor(Type.EmptyTypes) == null))
				{
					try
					{
						global::S1API.PhoneApp.PhoneApp phoneApp = (global::S1API.PhoneApp.PhoneApp)Activator.CreateInstance(item);
						((IRegisterable)phoneApp).CreateInternal();
					}
					catch (Exception ex)
					{
						MelonLogger.Warning("[PhoneApp] Failed to register " + item.FullName + ": " + ex.Message);
					}
				}
			}
		}
	}
	[HarmonyPatch]
	internal class QuestPatches
	{
		[HarmonyPatch(typeof(QuestManager), "WriteData")]
		[HarmonyPostfix]
		private static void QuestManagerWriteData(QuestManager __instance, string parentFolderPath, ref List<string> __result)
		{
			string folderPath = Path.Combine(parentFolderPath, "Quests");
			foreach (Quest quest in QuestManager.Quests)
			{
				quest.SaveInternal(folderPath, ref __result);
			}
		}

		[HarmonyPatch(typeof(QuestsLoader), "Load")]
		[HarmonyPostfix]
		private static void QuestsLoaderLoad(QuestsLoader __instance, string mainPath)
		{
			if (!Directory.Exists(mainPath))
			{
				return;
			}
			string[] array = (from directory in Directory.GetDirectories(mainPath).Select(Path.GetFileName)
				where directory.StartsWith("Quest_")
				select directory).ToArray();
			string[] array2 = array;
			string text2 = default(string);
			string text5 = default(string);
			foreach (string path in array2)
			{
				string text = Path.Combine(mainPath, path);
				((Loader)__instance).TryLoadFile(text, ref text2, true);
				if (text2 == null)
				{
					continue;
				}
				QuestData val = JsonUtility.FromJson<QuestData>(text2);
				string text3 = Path.Combine(mainPath, path);
				string text4 = Path.Combine(text3, "QuestData");
				if (!((Loader)__instance).TryLoadFile(text4, ref text5, true))
				{
					continue;
				}
				QuestData questData = JsonConvert.DeserializeObject<QuestData>(text5, ISaveable.SerializerSettings);
				if (questData?.ClassName != null)
				{
					Type typeByName = ReflectionUtils.GetTypeByName(questData.ClassName);
					if (!(typeByName == null) && typeof(Quest).IsAssignableFrom(typeByName))
					{
						Quest quest = QuestManager.CreateQuest(typeByName, val?.GUID);
						quest.LoadInternal(text3);
					}
				}
			}
		}

		[HarmonyPatch(typeof(QuestManager), "DeleteUnapprovedFiles")]
		[HarmonyPostfix]
		private static void QuestManagerDeleteUnapprovedFiles(QuestManager __instance, string parentFolderPath)
		{
			string path = Path.Combine(parentFolderPath, "Quests");
			string?[] existingQuests = QuestManager.Quests.Select((Quest quest) => quest.SaveFolder).ToArray();
			string[] array = (from directory in Directory.GetDirectories(path)
				where directory.StartsWith("Quest_") && !existingQuests.Contains<string>(directory)
				select directory).ToArray();
			string[] array2 = array;
			foreach (string path2 in array2)
			{
				Directory.Delete(path2, recursive: true);
			}
		}

		[HarmonyPatch(typeof(Quest), "Start")]
		[HarmonyPrefix]
		private static void QuestStart(Quest __instance)
		{
			Quest __instance2 = __instance;
			QuestManager.Quests.FirstOrDefault((Quest quest) => (Object)(object)quest.S1Quest == (Object)(object)__instance2)?.CreateInternal();
		}
	}
	[HarmonyPatch]
	internal class TimePatches
	{
		[HarmonyPatch(typeof(TimeManager), "Awake")]
		[HarmonyPostfix]
		private static void TimeManagerAwake(TimeManager __instance)
		{
			__instance.onDayPass = (Action)Delegate.Combine(__instance.onDayPass, new Action(DayPass));
			static void DayPass()
			{
				TimeManager.OnDayPass();
			}
		}
	}
}
namespace S1API.Internal.Abstraction
{
	internal static class EventHelper
	{
		internal static readonly Dictionary<Action, UnityAction> SubscribedActions = new Dictionary<Action, UnityAction>();

		internal static void AddListener(Action listener, UnityEvent unityEvent)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Expected O, but got Unknown
			if (!SubscribedActions.ContainsKey(listener))
			{
				UnityAction val = new UnityAction(listener.Invoke);
				unityEvent.AddListener(val);
				SubscribedActions.Add(listener, val);
			}
		}

		internal static void RemoveListener(Action listener, UnityEvent unityEvent)
		{
			SubscribedActions.TryGetValue(listener, out UnityAction value);
			SubscribedActions.Remove(listener);
			unityEvent.RemoveListener(value);
		}
	}
	internal class GUIDReferenceConverter : JsonConverter
	{
		public override bool CanRead => true;

		public override bool CanConvert(Type objectType)
		{
			return typeof(IGUIDReference).IsAssignableFrom(objectType);
		}

		public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
		{
			if (value is IGUIDReference iGUIDReference)
			{
				writer.WriteValue(iGUIDReference.GUID);
			}
			else
			{
				writer.WriteNull();
			}
		}

		public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
		{
			string text = reader.Value?.ToString();
			if (string.IsNullOrEmpty(text))
			{
				return null;
			}
			MethodInfo method = ReflectionUtils.GetMethod(objectType, "GetFromGUID", BindingFlags.Static | BindingFlags.NonPublic);
			if (method == null)
			{
				throw new Exception("The type " + objectType.Name + " does not have a valid implementation of the GetFromGUID(string guid) method!");
			}
			return method.Invoke(null, new object[1] { text });
		}
	}
	internal interface IGUIDReference
	{
		string GUID { get; }
	}
	internal interface IRegisterable
	{
		void CreateInternal();

		void DestroyInternal();

		void OnCreated();

		void OnDestroyed();
	}
	internal interface ISaveable : IRegisterable
	{
		internal static JsonSerializerSettings SerializerSettings => new JsonSerializerSettings
		{
			ReferenceLoopHandling = (ReferenceLoopHandling)1,
			Converters = new List<JsonConverter> { (JsonConverter)(object)new GUIDReferenceConverter() }
		};

		void SaveInternal(string path, ref List<string> extraSaveables);

		void LoadInternal(string folderPath);

		void OnSaved();

		void OnLoaded();
	}
	public abstract class Registerable : IRegisterable
	{
		void IRegisterable.CreateInternal()
		{
			CreateInternal();
		}

		internal virtual void CreateInternal()
		{
			OnCreated();
		}

		void IRegisterable.DestroyInternal()
		{
			DestroyInternal();
		}

		internal virtual void DestroyInternal()
		{
			OnDestroyed();
		}

		void IRegisterable.OnCreated()
		{
			OnCreated();
		}

		protected virtual void OnCreated()
		{
		}

		void IRegisterable.OnDestroyed()
		{
			OnDestroyed();
		}

		protected virtual void OnDestroyed()
		{
		}
	}
	public abstract class Saveable : Registerable, ISaveable, IRegisterable
	{
		void ISaveable.LoadInternal(string folderPath)
		{
			LoadInternal(folderPath);
		}

		internal virtual void LoadInternal(string folderPath)
		{
			FieldInfo[] fields = GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			FieldInfo[] array = fields;
			foreach (FieldInfo fieldInfo in array)
			{
				SaveableField customAttribute = fieldInfo.GetCustomAttribute<SaveableField>();
				if (customAttribute != null)
				{
					string path = (customAttribute.SaveName.EndsWith(".json") ? customAttribute.SaveName : (customAttribute.SaveName + ".json"));
					string path2 = Path.Combine(folderPath, path);
					if (File.Exists(path2))
					{
						string text = File.ReadAllText(path2);
						Type fieldType = fieldInfo.FieldType;
						object value = JsonConvert.DeserializeObject(text, fieldType, ISaveable.SerializerSettings);
						fieldInfo.SetValue(this, value);
					}
				}
			}
			OnLoaded();
		}

		void ISaveable.SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			SaveInternal(folderPath, ref extraSaveables);
		}

		internal virtual void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			FieldInfo[] allFields = ReflectionUtils.GetAllFields(GetType(), BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			FieldInfo[] array = allFields;
			foreach (FieldInfo fieldInfo in array)
			{
				SaveableField customAttribute = fieldInfo.GetCustomAttribute<SaveableField>();
				if (customAttribute != null)
				{
					string text = (customAttribute.SaveName.EndsWith(".json") ? customAttribute.SaveName : (customAttribute.SaveName + ".json"));
					string path = Path.Combine(folderPath, text);
					object value = fieldInfo.GetValue(this);
					if (value == null)
					{
						File.Delete(path);
						continue;
					}
					extraSaveables.Add(text);
					string contents = JsonConvert.SerializeObject(value, (Formatting)1, ISaveable.SerializerSettings);
					File.WriteAllText(path, contents);
				}
			}
			OnSaved();
		}

		void ISaveable.OnLoaded()
		{
			OnLoaded();
		}

		protected virtual void OnLoaded()
		{
		}

		void ISaveable.OnSaved()
		{
			OnSaved();
		}

		protected virtual void OnSaved()
		{
		}
	}
}
namespace S1API.GameTime
{
	public enum Day
	{
		Monday,
		Tuesday,
		Wednesday,
		Thursday,
		Friday,
		Saturday,
		Sunday
	}
	public static class TimeManager
	{
		public static readonly Action OnDayPass = delegate
		{
		};

		public static Day CurrentDay => (Day)NetworkSingleton<TimeManager>.Instance.CurrentDay;
	}
}
namespace S1API.DeadDrops
{
	public class DeadDropInstance : IGUIDReference
	{
		internal readonly DeadDrop S1DeadDrop;

		private StorageInstance? _cachedStorage;

		public string GUID => S1DeadDrop.GUID.ToString();

		public StorageInstance Storage => _cachedStorage ?? (_cachedStorage = new StorageInstance(S1DeadDrop.Storage));

		public Vector3 Position => ((Component)S1DeadDrop).transform.position;

		internal DeadDropInstance(DeadDrop deadDrop)
		{
			S1DeadDrop = deadDrop;
		}

		internal static DeadDropInstance? GetFromGUID(string guid)
		{
			string guid2 = guid;
			return DeadDropManager.All.FirstOrDefault((DeadDropInstance deadDrop) => deadDrop.GUID == guid2);
		}
	}
	public class DeadDropManager
	{
		public static DeadDropInstance[] All => (from deadDrop in DeadDrop.DeadDrops.ToArray()
			select new DeadDropInstance(deadDrop)).ToArray();
	}
}
namespace S1API.Utils
{
	public static class ConsoleHelper
	{
		public static void RunCashCommand(int amount)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			ChangeCashCommand val = new ChangeCashCommand();
			List<string> list = new List<string>();
			list.Add(amount.ToString());
			((ConsoleCommand)val).Execute(list);
		}
	}
	public static class RandomUtils
	{
		private static readonly Random SystemRng = new Random();

		public static T PickOne<T>(this IList<T> list)
		{
			if (list == null || list.Count == 0)
			{
				return default(T);
			}
			return list[Random.Range(0, list.Count)];
		}

		public static T PickUnique<T>(this IList<T> list, Func<T, bool> isDuplicate, int maxTries = 10)
		{
			if (list == null || list.Count == 0)
			{
				return default(T);
			}
			for (int i = 0; i < maxTries; i++)
			{
				T val = list.PickOne();
				if (!isDuplicate(val))
				{
					return val;
				}
			}
			return default(T);
		}

		public static List<T> PickMany<T>(this IList<T> list, int count)
		{
			if (list == null || list.Count == 0)
			{
				return new List<T>();
			}
			List<T> list2 = new List<T>(list);
			List<T> list3 = new List<T>();
			for (int i = 0; i < count; i++)
			{
				if (list2.Count <= 0)
				{
					break;
				}
				int index = Random.Range(0, list2.Count);
				list3.Add(list2[index]);
				list2.RemoveAt(index);
			}
			return list3;
		}

		public static int RangeInt(int minInclusive, int maxExclusive)
		{
			return SystemRng.Next(minInclusive, maxExclusive);
		}
	}
}

Plugins/S1API/S1API.Il2Cpp.dll

Decompiled 5 hours 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.Versioning;
using HarmonyLib;
using Il2CppInterop.Runtime;
using Il2CppInterop.Runtime.InteropTypes;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using Il2CppScheduleOne;
using Il2CppScheduleOne.AvatarFramework;
using Il2CppScheduleOne.DevUtilities;
using Il2CppScheduleOne.Economy;
using Il2CppScheduleOne.GameTime;
using Il2CppScheduleOne.Interaction;
using Il2CppScheduleOne.ItemFramework;
using Il2CppScheduleOne.Levelling;
using Il2CppScheduleOne.Map;
using Il2CppScheduleOne.Messaging;
using Il2CppScheduleOne.NPCs;
using Il2CppScheduleOne.NPCs.Behaviour;
using Il2CppScheduleOne.NPCs.Relation;
using Il2CppScheduleOne.NPCs.Responses;
using Il2CppScheduleOne.Noise;
using Il2CppScheduleOne.Persistence.Datas;
using Il2CppScheduleOne.Persistence.Loaders;
using Il2CppScheduleOne.PlayerScripts;
using Il2CppScheduleOne.Product;
using Il2CppScheduleOne.Product.Packaging;
using Il2CppScheduleOne.Quests;
using Il2CppScheduleOne.Storage;
using Il2CppScheduleOne.UI;
using Il2CppScheduleOne.UI.Phone.ContactsApp;
using Il2CppScheduleOne.UI.WorldspacePopup;
using Il2CppScheduleOne.Vehicles;
using Il2CppScheduleOne.Vision;
using Il2CppSystem;
using Il2CppSystem.Collections;
using Il2CppSystem.Collections.Generic;
using MelonLoader;
using MelonLoader.Utils;
using Microsoft.CodeAnalysis;
using Newtonsoft.Json;
using S1API;
using S1API.GameTime;
using S1API.Internal.Abstraction;
using S1API.Internal.Utils;
using S1API.Items;
using S1API.Money;
using S1API.NPCs;
using S1API.PhoneApp;
using S1API.Products;
using S1API.Quests;
using S1API.Saveables;
using S1API.Storages;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Events;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(global::S1API.S1API), "S1API", "1.2.3", "KaBooMa", null)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("KaBooMa")]
[assembly: AssemblyConfiguration("Il2Cpp")]
[assembly: AssemblyDescription("A Schedule One Mono / Il2Cpp Cross Compatibility Layer")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+a00c4f0c2edb8d3c5803bad7b57f8e44e90b3225")]
[assembly: AssemblyProduct("S1API")]
[assembly: AssemblyTitle("S1API")]
[assembly: AssemblyMetadata("RepositoryUrl", "https://github.com/KaBooMa/S1API")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
}
public static class ButtonUtils
{
	public static void AddListener(Button button, Action action)
	{
		if (!((Object)(object)button == (Object)null) && action != null)
		{
			EventHelper.AddListener(action, (UnityEvent)(object)button.onClick);
		}
	}

	public static void RemoveListener(Button button, Action action)
	{
		if (!((Object)(object)button == (Object)null) && action != null)
		{
			EventHelper.RemoveListener(action, (UnityEvent)(object)button.onClick);
		}
	}

	public static void ClearListeners(Button button)
	{
		if (!((Object)(object)button == (Object)null))
		{
			((UnityEventBase)button.onClick).RemoveAllListeners();
		}
	}

	public static void Enable(Button button, Text label = null, string text = null)
	{
		if ((Object)(object)button != (Object)null)
		{
			((Selectable)button).interactable = true;
		}
		if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
		{
			label.text = text;
		}
	}

	public static void Disable(Button button, Text label = null, string text = null)
	{
		if ((Object)(object)button != (Object)null)
		{
			((Selectable)button).interactable = false;
		}
		if ((Object)(object)label != (Object)null && !string.IsNullOrEmpty(text))
		{
			label.text = text;
		}
	}

	public static void SetLabel(Text label, string text)
	{
		if ((Object)(object)label != (Object)null)
		{
			label.text = text;
		}
	}

	public static void SetStyle(Button button, Text label, string text, Color bg)
	{
		//IL_0028: Unknown result type (might be due to invalid IL or missing references)
		if (!((Object)(object)button == (Object)null) && !((Object)(object)label == (Object)null))
		{
			label.text = text;
			((Graphic)((Selectable)button).image).color = bg;
		}
	}
}
public class ClickHandler
{
	private readonly UnityAction _callback;

	public ClickHandler(UnityAction callback)
	{
		_callback = callback;
	}

	public void OnClick()
	{
		_callback.Invoke();
	}
}
namespace S1API
{
	public class S1API : MelonMod
	{
	}
}
namespace S1API.UI
{
	public static class UIFactory
	{
		public static GameObject Panel(string name, Transform parent, Color bgColor, Vector2? anchorMin = null, Vector2? anchorMax = null, bool fullAnchor = false)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_003d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0049: Unknown result type (might be due to invalid IL or missing references)
			//IL_0078: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a4: Unknown result type (might be due to invalid IL or missing references)
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			if (fullAnchor)
			{
				val2.anchorMin = Vector2.zero;
				val2.anchorMax = Vector2.one;
				val2.offsetMin = Vector2.zero;
				val2.offsetMax = Vector2.zero;
			}
			else
			{
				val2.anchorMin = (Vector2)(((??)anchorMin) ?? new Vector2(0.5f, 0.5f));
				val2.anchorMax = (Vector2)(((??)anchorMax) ?? new Vector2(0.5f, 0.5f));
			}
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			return val;
		}

		public static Text Text(string name, string content, Transform parent, int fontSize = 14, TextAnchor anchor = 0, FontStyle style = 0)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			//IL_003e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			Text val3 = val.AddComponent<Text>();
			val3.text = content;
			val3.fontSize = fontSize;
			val3.alignment = anchor;
			val3.fontStyle = style;
			val3.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			((Graphic)val3).color = Color.white;
			val3.horizontalOverflow = (HorizontalWrapMode)0;
			val3.verticalOverflow = (VerticalWrapMode)1;
			return val3;
		}

		public static RectTransform ScrollableVerticalList(string name, Transform parent, out ScrollRect scrollRect)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Unknown result type (might be due to invalid IL or missing references)
			//IL_0063: Unknown result type (might be due to invalid IL or missing references)
			//IL_0069: Expected O, but got Unknown
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			//IL_0090: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00fa: Expected O, but got Unknown
			//IL_0123: Unknown result type (might be due to invalid IL or missing references)
			//IL_013a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0151: Unknown result type (might be due to invalid IL or missing references)
			//IL_017c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0186: Expected O, but got Unknown
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			scrollRect = val.AddComponent<ScrollRect>();
			scrollRect.horizontal = false;
			GameObject val3 = new GameObject("Viewport");
			val3.transform.SetParent(val.transform, false);
			RectTransform val4 = val3.AddComponent<RectTransform>();
			val4.anchorMin = Vector2.zero;
			val4.anchorMax = Vector2.one;
			val4.offsetMin = Vector2.zero;
			val4.offsetMax = Vector2.zero;
			((Graphic)val3.AddComponent<Image>()).color = new Color(0f, 0f, 0f, 0.05f);
			val3.AddComponent<Mask>().showMaskGraphic = false;
			scrollRect.viewport = val4;
			GameObject val5 = new GameObject("Content");
			val5.transform.SetParent(val3.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = new Vector2(0f, 1f);
			val6.anchorMax = new Vector2(1f, 1f);
			val6.pivot = new Vector2(0.5f, 1f);
			VerticalLayoutGroup val7 = val5.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val7).spacing = 10f;
			((LayoutGroup)val7).padding = new RectOffset(10, 10, 10, 10);
			((HorizontalOrVerticalLayoutGroup)val7).childControlHeight = true;
			((HorizontalOrVerticalLayoutGroup)val7).childForceExpandHeight = false;
			val5.AddComponent<ContentSizeFitter>().verticalFit = (FitMode)2;
			scrollRect.content = val6;
			return val6;
		}

		public static void FitContentHeight(RectTransform content)
		{
			ContentSizeFitter val = ((Component)content).gameObject.GetComponent<ContentSizeFitter>();
			if ((Object)(object)val == (Object)null)
			{
				val = ((Component)content).gameObject.AddComponent<ContentSizeFitter>();
			}
			val.verticalFit = (FitMode)2;
		}

		public static (GameObject, Button, Text) ButtonWithLabel(string name, string label, Transform parent, Color bgColor)
		{
			//IL_0002: Unknown result type (might be due to invalid IL or missing references)
			//IL_0008: Expected O, but got Unknown
			//IL_0028: Unknown result type (might be due to invalid IL or missing references)
			//IL_003b: Unknown result type (might be due to invalid IL or missing references)
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Expected O, but got Unknown
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00af: 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_00f7: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject(name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(160f, 40f);
			Image val3 = val.AddComponent<Image>();
			((Graphic)val3).color = bgColor;
			val3.sprite = Resources.GetBuiltinResource<Sprite>("UI/Skin/UISprite.psd");
			val3.type = (Type)1;
			Button val4 = val.AddComponent<Button>();
			((Selectable)val4).targetGraphic = (Graphic)(object)val3;
			GameObject val5 = new GameObject("Label");
			val5.transform.SetParent(val.transform, false);
			RectTransform val6 = val5.AddComponent<RectTransform>();
			val6.anchorMin = Vector2.zero;
			val6.anchorMax = Vector2.one;
			val6.offsetMin = Vector2.zero;
			val6.offsetMax = Vector2.zero;
			Text val7 = val5.AddComponent<Text>();
			val7.text = label;
			val7.alignment = (TextAnchor)4;
			val7.fontSize = 16;
			val7.fontStyle = (FontStyle)1;
			((Graphic)val7).color = Color.white;
			val7.font = Resources.GetBuiltinResource<Font>("Arial.ttf");
			return (val, val4, val7);
		}

		public static void SetIcon(Sprite sprite, Transform parent)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002e: Unknown result type (might be due to invalid IL or missing references)
			//IL_003a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0046: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Icon");
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.anchorMin = Vector2.zero;
			val2.anchorMax = Vector2.one;
			val2.offsetMin = Vector2.zero;
			val2.offsetMax = Vector2.zero;
			Image val3 = val.AddComponent<Image>();
			val3.sprite = sprite;
			val3.preserveAspect = true;
		}

		public static void CreateTextBlock(Transform parent, string title, string subtitle, bool isCompleted)
		{
			Text(((Object)parent).name + "Title", title, parent, 16, (TextAnchor)3, (FontStyle)1);
			Text(((Object)parent).name + "Subtitle", subtitle, parent, 14, (TextAnchor)0, (FontStyle)0);
			if (isCompleted)
			{
				Text("CompletedLabel", "<color=#888888><i>Already Delivered</i></color>", parent, 12, (TextAnchor)0, (FontStyle)0);
			}
		}

		public static void CreateRowButton(GameObject go, UnityAction clickHandler, bool enabled)
		{
			Button val = go.AddComponent<Button>();
			Image component = go.GetComponent<Image>();
			((Selectable)val).targetGraphic = (Graphic)(object)component;
			((Selectable)val).interactable = enabled;
			((UnityEvent)val.onClick).AddListener(clickHandler);
		}

		public static void ClearChildren(Transform parent)
		{
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_0017: Expected O, but got Unknown
			IEnumerator enumerator = parent.GetEnumerator();
			try
			{
				while (enumerator.MoveNext())
				{
					Transform val = (Transform)enumerator.Current;
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
			}
			finally
			{
				if (enumerator is IDisposable disposable)
				{
					disposable.Dispose();
				}
			}
		}

		public static void VerticalLayoutOnGO(GameObject go, int spacing = 10, RectOffset padding = null)
		{
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			VerticalLayoutGroup val = go.AddComponent<VerticalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val).spacing = spacing;
			((LayoutGroup)val).padding = (RectOffset)(((object)padding) ?? ((object)new RectOffset(10, 10, 10, 10)));
		}

		public static GameObject CreateQuestRow(string name, Transform parent, out GameObject iconPanel, out GameObject textPanel)
		{
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			//IL_0068: 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_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e4: Unknown result type (might be due to invalid IL or missing references)
			//IL_011f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0129: Expected O, but got Unknown
			//IL_0182: Unknown result type (might be due to invalid IL or missing references)
			//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01f1: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Row_" + name);
			val.transform.SetParent(parent, false);
			RectTransform val2 = val.AddComponent<RectTransform>();
			val2.sizeDelta = new Vector2(0f, 90f);
			val.AddComponent<LayoutElement>().minHeight = 50f;
			((Shadow)val.AddComponent<Outline>()).effectColor = new Color(0f, 0f, 0f, 0.2f);
			GameObject val3 = Panel("Separator", val.transform, new Color(1f, 1f, 1f, 0.05f));
			val3.GetComponent<RectTransform>().sizeDelta = new Vector2(300f, 1f);
			Image val4 = val.AddComponent<Image>();
			((Graphic)val4).color = new Color(0.12f, 0.12f, 0.12f);
			Button val5 = val.AddComponent<Button>();
			((Selectable)val5).targetGraphic = (Graphic)(object)val4;
			HorizontalLayoutGroup val6 = val.AddComponent<HorizontalLayoutGroup>();
			((HorizontalOrVerticalLayoutGroup)val6).spacing = 20f;
			((LayoutGroup)val6).padding = new RectOffset(75, 10, 10, 10);
			((LayoutGroup)val6).childAlignment = (TextAnchor)3;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandWidth = false;
			((HorizontalOrVerticalLayoutGroup)val6).childForceExpandHeight = false;
			LayoutElement val7 = val.AddComponent<LayoutElement>();
			val7.minHeight = 90f;
			val7.flexibleWidth = 1f;
			iconPanel = Panel("IconPanel", val.transform, new Color(0.12f, 0.12f, 0.12f));
			RectTransform component = iconPanel.GetComponent<RectTransform>();
			component.sizeDelta = new Vector2(80f, 80f);
			LayoutElement val8 = iconPanel.AddComponent<LayoutElement>();
			val8.preferredWidth = 80f;
			val8.preferredHeight = 80f;
			textPanel = Panel("TextPanel", val.transform, Color.clear);
			VerticalLayoutOnGO(textPanel, 2);
			LayoutElement val9 = textPanel.AddComponent<LayoutElement>();
			val9.minWidth = 200f;
			val9.flexibleWidth = 1f;
			return val;
		}

		public static void BindAcceptButton(Button btn, Text label, string text, UnityAction callback)
		{
			label.text = text;
			((UnityEventBase)btn.onClick).RemoveAllListeners();
			((UnityEvent)btn.onClick).AddListener(callback);
		}
	}
}
namespace S1API.Storages
{
	public class StorageInstance
	{
		internal readonly StorageEntity S1Storage;

		public ItemSlotInstance[] Slots => ((IEnumerable<ItemSlot>)S1Storage.ItemSlots.ToArray()).Select((ItemSlot itemSlot) => new ItemSlotInstance(itemSlot)).ToArray();

		public event Action OnOpened
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onOpened);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onOpened);
			}
		}

		public event Action OnClosed
		{
			add
			{
				EventHelper.AddListener(value, S1Storage.onClosed);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1Storage.onClosed);
			}
		}

		internal StorageInstance(StorageEntity storage)
		{
			S1Storage = storage;
		}

		public bool CanItemFit(ItemInstance itemInstance, int quantity = 1)
		{
			return S1Storage.CanItemFit(itemInstance.S1ItemInstance, quantity);
		}

		public void AddItem(ItemInstance itemInstance)
		{
			S1Storage.InsertItem(itemInstance.S1ItemInstance, true);
		}
	}
}
namespace S1API.Saveables
{
	[AttributeUsage(AttributeTargets.Field)]
	public class SaveableField : Attribute
	{
		internal string SaveName { get; }

		public SaveableField(string saveName)
		{
			SaveName = saveName;
		}
	}
}
namespace S1API.Quests
{
	public abstract class Quest : Saveable
	{
		protected readonly QuestEntry[] QuestEntries = Array.Empty<QuestEntry>();

		[SaveableField("QuestData")]
		private readonly QuestData _questData;

		internal readonly Quest S1Quest;

		private readonly GameObject _gameObject;

		protected abstract string Title { get; }

		protected abstract string Description { get; }

		protected virtual bool AutoBegin => true;

		internal string? SaveFolder => S1Quest.SaveFolderName;

		protected virtual Sprite? QuestIcon => null;

		public Quest()
		{
			//IL_002f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Expected O, but got Unknown
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_006b: Expected O, but got Unknown
			//IL_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_007c: Expected O, but got Unknown
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Expected O, but got Unknown
			//IL_0094: Unknown result type (might be due to invalid IL or missing references)
			//IL_009e: Expected O, but got Unknown
			//IL_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Expected O, but got Unknown
			//IL_0187: Unknown result type (might be due to invalid IL or missing references)
			//IL_018d: Expected O, but got Unknown
			//IL_01c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01cd: Expected O, but got Unknown
			//IL_0202: Unknown result type (might be due to invalid IL or missing references)
			//IL_0209: Expected O, but got Unknown
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_0266: Unknown result type (might be due to invalid IL or missing references)
			//IL_026d: Expected O, but got Unknown
			_questData = new QuestData(GetType().Name);
			_gameObject = new GameObject("Quest");
			S1Quest = _gameObject.AddComponent<Quest>();
			S1Quest.StaticGUID = string.Empty;
			S1Quest.onActiveState = new UnityEvent();
			S1Quest.onComplete = new UnityEvent();
			S1Quest.onInitialComplete = new UnityEvent();
			S1Quest.onQuestBegin = new UnityEvent();
			S1Quest.onQuestEnd = new UnityEvent<EQuestState>();
			S1Quest.onTrackChange = new UnityEvent<bool>();
			S1Quest.TrackOnBegin = true;
			S1Quest.AutoCompleteOnAllEntriesComplete = true;
			S1Quest.autoInitialize = false;
			GameObject val = new GameObject("IconPrefab", (Type[])(object)new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val.transform.SetParent(_gameObject.transform);
			Image component = val.GetComponent<Image>();
			component.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			S1Quest.IconPrefab = val.GetComponent<RectTransform>();
			GameObject val2 = new GameObject("PoIUIPrefab", (Type[])(object)new Type[4]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<EventTrigger>(),
				CrossType.Of<Button>()
			});
			val2.transform.SetParent(_gameObject.transform);
			GameObject val3 = new GameObject("MainLabel", (Type[])(object)new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Text>()
			});
			val3.transform.SetParent(val2.transform);
			GameObject val4 = new GameObject("IconContainer", (Type[])(object)new Type[3]
			{
				CrossType.Of<RectTransform>(),
				CrossType.Of<CanvasRenderer>(),
				CrossType.Of<Image>()
			});
			val4.transform.SetParent(val2.transform);
			Image component2 = val4.GetComponent<Image>();
			component2.sprite = QuestIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			RectTransform component3 = ((Component)component2).GetComponent<RectTransform>();
			component3.sizeDelta = new Vector2(20f, 20f);
			GameObject val5 = new GameObject("POIPrefab");
			val5.SetActive(false);
			val5.transform.SetParent(_gameObject.transform);
			POI val6 = val5.AddComponent<POI>();
			val6.DefaultMainText = "Did it work?";
			val6.UIPrefab = val2;
			S1Quest.PoIPrefab = val5;
			S1Quest.onQuestEnd.AddListener(UnityAction<EQuestState>.op_Implicit((Action<EQuestState>)OnQuestEnded));
		}

		internal override void CreateInternal()
		{
			base.CreateInternal();
			Quest s1Quest = S1Quest;
			string title = Title;
			string description = Description;
			Il2CppReferenceArray<QuestEntryData> obj = Il2CppReferenceArray<QuestEntryData>.op_Implicit(Array.Empty<QuestEntryData>());
			Quest s1Quest2 = S1Quest;
			s1Quest.InitializeQuest(title, description, obj, (s1Quest2 != null) ? s1Quest2.StaticGUID : null);
			if (AutoBegin)
			{
				Quest s1Quest3 = S1Quest;
				if (s1Quest3 != null)
				{
					s1Quest3.Begin(true);
				}
			}
		}

		internal override void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			string text = Path.Combine(folderPath, S1Quest.SaveFolderName);
			if (!Directory.Exists(text))
			{
				Directory.CreateDirectory(text);
			}
			base.SaveInternal(text, ref extraSaveables);
		}

		internal void OnQuestEnded(EQuestState questState)
		{
			Quest.Quests.Remove(S1Quest);
			QuestManager.Quests.Remove(this);
		}

		protected QuestEntry AddEntry(string title, Vector3? poiPosition = null)
		{
			//IL_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Expected O, but got Unknown
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_006a: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("QuestEntry");
			Transform transform = val.transform;
			GameObject gameObject = _gameObject;
			transform.SetParent((gameObject != null) ? gameObject.transform : null);
			QuestEntry val2 = val.AddComponent<QuestEntry>();
			val2.PoILocation = val.transform;
			S1Quest.Entries.Add(val2);
			QuestEntry questEntry = new QuestEntry(val2)
			{
				Title = title,
				POIPosition = (Vector3)(((??)poiPosition) ?? Vector3.zero)
			};
			CollectionExtensions.AddItem<QuestEntry>((IEnumerable<QuestEntry>)QuestEntries, questEntry);
			return questEntry;
		}

		public void Begin()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Begin(true);
			}
		}

		public void Cancel()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Cancel(true);
			}
		}

		public void Expire()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Expire(true);
			}
		}

		public void Fail()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Fail(true);
			}
		}

		public void Complete()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.Complete(true);
			}
		}

		public void End()
		{
			Quest s1Quest = S1Quest;
			if (s1Quest != null)
			{
				s1Quest.End();
			}
		}
	}
	public class QuestData
	{
		public readonly string ClassName;

		public QuestData(string className)
		{
			ClassName = className;
		}
	}
	public class QuestEntry
	{
		internal readonly QuestEntry S1QuestEntry;

		public string Title
		{
			get
			{
				return S1QuestEntry.Title;
			}
			set
			{
				S1QuestEntry.SetEntryTitle(value);
			}
		}

		public Vector3 POIPosition
		{
			get
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				return S1QuestEntry.PoILocation.position;
			}
			set
			{
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				S1QuestEntry.PoILocation.position = value;
			}
		}

		public event Action OnComplete
		{
			add
			{
				EventHelper.AddListener(value, S1QuestEntry.onComplete);
			}
			remove
			{
				EventHelper.RemoveListener(value, S1QuestEntry.onComplete);
			}
		}

		internal QuestEntry(QuestEntry questEntry)
		{
			S1QuestEntry = questEntry;
		}

		public void Begin()
		{
			S1QuestEntry.Begin();
		}

		public void Complete()
		{
			S1QuestEntry.Complete();
		}

		public void SetState(QuestState questState)
		{
			S1QuestEntry.SetState((EQuestState)questState, true);
		}
	}
	public static class QuestManager
	{
		internal static readonly List<Quest> Quests = new List<Quest>();

		public static Quest CreateQuest<T>(string? guid = null) where T : Quest
		{
			return CreateQuest(typeof(T), guid);
		}

		public static Quest CreateQuest(Type questType, string? guid = null)
		{
			Quest quest = (Quest)Activator.CreateInstance(questType);
			Quests.Add(quest);
			return quest;
		}
	}
	public enum QuestState
	{
		Inactive,
		Active,
		Completed,
		Failed,
		Expired,
		Cancelled
	}
}
namespace S1API.Products
{
	public class CocaineDefinition : ProductDefinition
	{
		internal CocaineDefinition S1CocaineDefinition => CrossType.As<CocaineDefinition>((object)S1ItemDefinition);

		internal CocaineDefinition(CocaineDefinition definition)
			: base((ProductDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1CocaineDefinition).GetDefaultInstance(quantity)));
		}
	}
	public class MethDefinition : ProductDefinition
	{
		internal MethDefinition S1MethDefinition => CrossType.As<MethDefinition>((object)S1ItemDefinition);

		internal MethDefinition(MethDefinition definition)
			: base((ProductDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1MethDefinition).GetDefaultInstance(quantity)));
		}
	}
	public class PackagingDefinition : ItemDefinition
	{
		internal PackagingDefinition S1PackagingDefinition => CrossType.As<PackagingDefinition>((object)S1ItemDefinition);

		public int Quantity => S1PackagingDefinition.Quantity;

		internal PackagingDefinition(ItemDefinition s1ItemDefinition)
			: base(s1ItemDefinition)
		{
		}
	}
	public class ProductDefinition : ItemDefinition
	{
		internal ProductDefinition S1ProductDefinition => CrossType.As<ProductDefinition>((object)S1ItemDefinition);

		public float Price => S1ProductDefinition.Price;

		internal ProductDefinition(ProductDefinition productDefinition)
			: base((ItemDefinition)(object)productDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1ProductDefinition).GetDefaultInstance(quantity)));
		}
	}
	public static class ProductDefinitionWrapper
	{
		public static ProductDefinition Wrap(ProductDefinition def)
		{
			ItemDefinition s1ItemDefinition = def.S1ItemDefinition;
			if (CrossType.Is<WeedDefinition>((object)s1ItemDefinition, out WeedDefinition result))
			{
				return new WeedDefinition(result);
			}
			if (CrossType.Is<MethDefinition>((object)s1ItemDefinition, out MethDefinition result2))
			{
				return new MethDefinition(result2);
			}
			if (CrossType.Is<CocaineDefinition>((object)s1ItemDefinition, out CocaineDefinition result3))
			{
				return new CocaineDefinition(result3);
			}
			return def;
		}
	}
	public class ProductInstance : ItemInstance
	{
		internal ProductItemInstance S1ProductInstance => CrossType.As<ProductItemInstance>((object)S1ItemInstance);

		public bool IsPackaged => Object.op_Implicit((Object)(object)S1ProductInstance.AppliedPackaging);

		public PackagingDefinition AppliedPackaging => new PackagingDefinition((ItemDefinition)(object)S1ProductInstance.AppliedPackaging);

		internal ProductInstance(ProductItemInstance productInstance)
			: base((ItemInstance)(object)productInstance)
		{
		}
	}
	public static class ProductManager
	{
		public static ProductDefinition[] DiscoveredProducts => ((IEnumerable<ProductDefinition>)ProductManager.DiscoveredProducts.ToArray()).Select((ProductDefinition productDefinition) => ProductDefinitionWrapper.Wrap(new ProductDefinition(productDefinition))).ToArray();
	}
	public class WeedDefinition : ProductDefinition
	{
		internal WeedDefinition S1WeedDefinition => CrossType.As<WeedDefinition>((object)S1ItemDefinition);

		internal WeedDefinition(WeedDefinition definition)
			: base((ProductDefinition)(object)definition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new ProductInstance(CrossType.As<ProductItemInstance>((object)((ItemDefinition)S1WeedDefinition).GetDefaultInstance(quantity)));
		}
	}
}
namespace S1API.PhoneApp
{
	public abstract class PhoneApp : Registerable
	{
		protected static readonly Instance LoggerInstance = new Instance("PhoneApp");

		protected GameObject Player;

		protected GameObject AppPanel;

		protected bool AppCreated;

		protected bool IconModified;

		protected abstract string AppName { get; }

		protected abstract string AppTitle { get; }

		protected abstract string IconLabel { get; }

		protected abstract string IconFileName { get; }

		protected abstract void OnCreatedUI(GameObject container);

		protected override void OnCreated()
		{
			MelonCoroutines.Start(InitApp());
		}

		protected override void OnDestroyed()
		{
			if ((Object)(object)AppPanel != (Object)null)
			{
				Object.Destroy((Object)(object)AppPanel);
				AppPanel = null;
			}
			AppCreated = false;
			IconModified = false;
		}

		private IEnumerator InitApp()
		{
			yield return (object)new WaitForSeconds(5f);
			Player = GameObject.Find("Player_Local");
			if ((Object)(object)Player == (Object)null)
			{
				LoggerInstance.Error("Player_Local not found.");
				yield break;
			}
			GameObject appsCanvas = GameObject.Find("Player_Local/CameraContainer/Camera/OverlayCamera/GameplayMenu/Phone/phone/AppsCanvas");
			if ((Object)(object)appsCanvas == (Object)null)
			{
				LoggerInstance.Error("AppsCanvas not found.");
				yield break;
			}
			Transform existingApp = appsCanvas.transform.Find(AppName);
			if ((Object)(object)existingApp != (Object)null)
			{
				AppPanel = ((Component)existingApp).gameObject;
				SetupExistingAppPanel(AppPanel);
			}
			else
			{
				Transform templateApp = appsCanvas.transform.Find("ProductManagerApp");
				if ((Object)(object)templateApp == (Object)null)
				{
					LoggerInstance.Error("Template ProductManagerApp not found.");
					yield break;
				}
				AppPanel = Object.Instantiate<GameObject>(((Component)templateApp).gameObject, appsCanvas.transform);
				((Object)AppPanel).name = AppName;
				Transform containerTransform = AppPanel.transform.Find("Container");
				if ((Object)(object)containerTransform != (Object)null)
				{
					GameObject container = ((Component)containerTransform).gameObject;
					ClearContainer(container);
					OnCreatedUI(container);
				}
				AppCreated = true;
			}
			AppPanel.SetActive(false);
			if (!IconModified)
			{
				IconModified = ModifyAppIcon(IconLabel, IconFileName);
			}
		}

		private void SetupExistingAppPanel(GameObject panel)
		{
			Transform val = panel.transform.Find("Container");
			if ((Object)(object)val != (Object)null)
			{
				GameObject gameObject = ((Component)val).gameObject;
				if (gameObject.transform.childCount < 2)
				{
					ClearContainer(gameObject);
					OnCreatedUI(gameObject);
				}
			}
			AppCreated = true;
		}

		private void ClearContainer(GameObject container)
		{
			for (int num = container.transform.childCount - 1; num >= 0; num--)
			{
				Object.Destroy((Object)(object)((Component)container.transform.GetChild(num)).gameObject);
			}
		}

		private bool ModifyAppIcon(string labelText, string fileName)
		{
			GameObject val = GameObject.Find("Player_Local/CameraContainer/Camera/OverlayCamera/GameplayMenu/Phone/phone/HomeScreen/AppIcons/");
			if ((Object)(object)val == (Object)null)
			{
				Instance loggerInstance = LoggerInstance;
				if (loggerInstance != null)
				{
					loggerInstance.Error("AppIcons not found.");
				}
				return false;
			}
			Transform val2 = ((val.transform.childCount > 0) ? val.transform.GetChild(val.transform.childCount - 1) : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Instance loggerInstance2 = LoggerInstance;
				if (loggerInstance2 != null)
				{
					loggerInstance2.Error("No icon found to clone.");
				}
				return false;
			}
			GameObject gameObject = ((Component)val2).gameObject;
			((Object)gameObject).name = AppName;
			Transform val3 = gameObject.transform.Find("Label");
			Text val4 = ((val3 != null) ? ((Component)val3).GetComponent<Text>() : null);
			if ((Object)(object)val4 != (Object)null)
			{
				val4.text = labelText;
			}
			return ChangeAppIconImage(gameObject, fileName);
		}

		private bool ChangeAppIconImage(GameObject iconObj, string filename)
		{
			//IL_0095: Unknown result type (might be due to invalid IL or missing references)
			//IL_009c: Expected O, but got Unknown
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_00dd: Unknown result type (might be due to invalid IL or missing references)
			Transform val = iconObj.transform.Find("Mask/Image");
			Image val2 = ((val != null) ? ((Component)val).GetComponent<Image>() : null);
			if ((Object)(object)val2 == (Object)null)
			{
				Instance loggerInstance = LoggerInstance;
				if (loggerInstance != null)
				{
					loggerInstance.Error("Image component not found in icon.");
				}
				return false;
			}
			string text = Path.Combine(MelonEnvironment.ModsDirectory, filename);
			if (!File.Exists(text))
			{
				Instance loggerInstance2 = LoggerInstance;
				if (loggerInstance2 != null)
				{
					loggerInstance2.Error("Icon file not found: " + text);
				}
				return false;
			}
			try
			{
				byte[] array = File.ReadAllBytes(text);
				Texture2D val3 = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val3, Il2CppStructArray<byte>.op_Implicit(array)))
				{
					val2.sprite = Sprite.Create(val3, new Rect(0f, 0f, (float)((Texture)val3).width, (float)((Texture)val3).height), new Vector2(0.5f, 0.5f));
					return true;
				}
				Object.Destroy((Object)(object)val3);
			}
			catch (Exception ex)
			{
				Instance loggerInstance3 = LoggerInstance;
				if (loggerInstance3 != null)
				{
					loggerInstance3.Error("Failed to load image: " + ex.Message);
				}
			}
			return false;
		}
	}
}
namespace S1API.NPCs
{
	public abstract class NPC : Saveable
	{
		protected readonly List<Response> Responses = new List<Response>();

		internal readonly NPC S1NPC;

		private readonly GameObject _gameObject;

		protected virtual Sprite? NPCIcon => null;

		public NPC(string guid, string firstName, string lastName)
		{
			//IL_0019: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: Expected O, but got Unknown
			//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
			//IL_0103: Expected O, but got Unknown
			//IL_010f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: Expected O, but got Unknown
			//IL_0147: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Expected O, but got Unknown
			//IL_024f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0255: Expected O, but got Unknown
			//IL_0280: Unknown result type (might be due to invalid IL or missing references)
			//IL_0286: Expected O, but got Unknown
			//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ac: Expected O, but got Unknown
			//IL_02ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f3: Expected O, but got Unknown
			//IL_0331: Unknown result type (might be due to invalid IL or missing references)
			//IL_0338: Expected O, but got Unknown
			//IL_0369: Unknown result type (might be due to invalid IL or missing references)
			//IL_036e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0376: Unknown result type (might be due to invalid IL or missing references)
			//IL_0387: Expected O, but got Unknown
			//IL_03d9: Unknown result type (might be due to invalid IL or missing references)
			//IL_03e3: Expected O, but got Unknown
			_gameObject = new GameObject("NPC");
			_gameObject.SetActive(false);
			S1NPC = _gameObject.AddComponent<NPC>();
			S1NPC.FirstName = firstName;
			S1NPC.LastName = lastName;
			S1NPC.ID = guid;
			S1NPC.BakedGUID = Guid.NewGuid().ToString();
			S1NPC.MugshotSprite = NPCIcon ?? ((App<ContactsApp>)(object)PlayerSingleton<ContactsApp>.Instance).AppIcon;
			S1NPC.ConversationCategories = new List<EConversationCategory>();
			S1NPC.ConversationCategories.Add((EConversationCategory)0);
			S1NPC.CreateMessageConversation();
			S1NPC.Health = _gameObject.GetComponent<NPCHealth>();
			S1NPC.Health.onDie = new UnityEvent();
			S1NPC.Health.onKnockedOut = new UnityEvent();
			S1NPC.Health.Invincible = true;
			S1NPC.Health.MaxHealth = 100f;
			GameObject val = new GameObject("NPCAwareness");
			val.SetActive(false);
			val.transform.SetParent(_gameObject.transform);
			S1NPC.awareness = val.AddComponent<NPCAwareness>();
			S1NPC.awareness.onExplosionHeard = new UnityEvent<NoiseEvent>();
			S1NPC.awareness.onGunshotHeard = new UnityEvent<NoiseEvent>();
			S1NPC.awareness.onHitByCar = new UnityEvent<LandVehicle>();
			S1NPC.awareness.onNoticedDrugDealing = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedGeneralCrime = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedPettyCrime = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedPlayerViolatingCurfew = new UnityEvent<Player>();
			S1NPC.awareness.onNoticedSuspiciousPlayer = new UnityEvent<Player>();
			S1NPC.awareness.Listener = _gameObject.AddComponent<Listener>();
			GameObject val2 = new GameObject("NPCBehaviour");
			val2.SetActive(false);
			val2.transform.SetParent(_gameObject.transform);
			NPCBehaviour val3 = val2.AddComponent<NPCBehaviour>();
			GameObject val4 = new GameObject("CowingBehaviour");
			val4.transform.SetParent(val2.transform);
			CoweringBehaviour coweringBehaviour = val4.AddComponent<CoweringBehaviour>();
			GameObject val5 = new GameObject("FleeBehaviour");
			val5.transform.SetParent(val2.transform);
			FleeBehaviour fleeBehaviour = val5.AddComponent<FleeBehaviour>();
			val3.CoweringBehaviour = coweringBehaviour;
			val3.FleeBehaviour = fleeBehaviour;
			S1NPC.behaviour = val3;
			GameObject val6 = new GameObject("NPCResponses");
			val6.SetActive(false);
			val6.transform.SetParent(_gameObject.transform);
			S1NPC.awareness.Responses = (NPCResponses)(object)val6.AddComponent<NPCResponses_Civilian>();
			GameObject val7 = new GameObject("VisionCone");
			val7.SetActive(false);
			val7.transform.SetParent(_gameObject.transform);
			VisionCone val8 = val7.AddComponent<VisionCone>();
			val8.StatesOfInterest.Add(new StateContainer
			{
				state = (EVisualState)4,
				RequiredNoticeTime = 0.1f
			});
			S1NPC.awareness.VisionCone = val8;
			S1NPC.awareness.VisionCone.QuestionMarkPopup = _gameObject.AddComponent<WorldspacePopup>();
			S1NPC.intObj = _gameObject.AddComponent<InteractableObject>();
			S1NPC.RelationData = new NPCRelationData();
			NPCInventory val9 = _gameObject.AddComponent<NPCInventory>();
			val9.PickpocketIntObj = _gameObject.AddComponent<InteractableObject>();
			S1NPC.Avatar = Singleton<MugshotGenerator>.Instance.MugshotRig;
			_gameObject.SetActive(true);
			val7.SetActive(true);
			val6.SetActive(true);
			val.SetActive(true);
			val2.SetActive(true);
		}

		internal override void CreateInternal()
		{
			Enumerator<Response> enumerator = S1NPC.MSGConversation.currentResponses.GetEnumerator();
			while (enumerator.MoveNext())
			{
				Response current = enumerator.Current;
				Response response = new Response(current)
				{
					Label = current.label,
					Text = current.text
				};
				Responses.Add(response);
				OnResponseLoaded(response);
			}
			base.CreateInternal();
		}

		internal override void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			string folderPath2 = Path.Combine(folderPath, S1NPC.SaveFolderName);
			base.SaveInternal(folderPath2, ref extraSaveables);
		}

		public void SendTextMessage(string message, Response[]? responses = null, float responseDelay = 1f, bool network = true)
		{
			S1NPC.SendTextMessage(message);
			S1NPC.MSGConversation.ClearResponses(false);
			if (responses != null && responses.Length != 0)
			{
				Responses.Clear();
				List<Response> val = new List<Response>();
				foreach (Response response in responses)
				{
					Responses.Add(response);
					val.Add(response.S1Response);
				}
				S1NPC.MSGConversation.ShowResponses(val, responseDelay, network);
			}
		}

		protected virtual void OnResponseLoaded(Response response)
		{
		}
	}
	public class NPCInstance
	{
	}
	public class NPCManager
	{
	}
	public class Response
	{
		internal readonly Response S1Response;

		public Action? OnTriggered
		{
			get
			{
				return ((Delegate)(object)S1Response.callback == (Delegate)null) ? null : ((Action)delegate
				{
					S1Response.callback.Invoke();
				});
			}
			set
			{
				S1Response.callback = Action.op_Implicit(value);
			}
		}

		public string Label
		{
			get
			{
				return S1Response.label;
			}
			set
			{
				S1Response.label = value;
			}
		}

		public string Text
		{
			get
			{
				return S1Response.text;
			}
			set
			{
				S1Response.text = value;
			}
		}

		public Response()
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_0012: Expected O, but got Unknown
			S1Response = new Response();
		}

		internal Response(Response response)
		{
			S1Response = response;
		}
	}
}
namespace S1API.Money
{
	public class CashDefinition : ItemDefinition
	{
		internal CashDefinition S1CashDefinition => CrossType.As<CashDefinition>((object)S1ItemDefinition);

		internal CashDefinition(CashDefinition s1ItemDefinition)
			: base((ItemDefinition)(object)s1ItemDefinition)
		{
		}

		public override ItemInstance CreateInstance(int quantity = 1)
		{
			return new CashInstance(((ItemDefinition)S1CashDefinition).GetDefaultInstance(quantity));
		}
	}
	public class CashInstance : ItemInstance
	{
		internal CashInstance S1CashInstance => CrossType.As<CashInstance>((object)S1ItemInstance);

		internal CashInstance(ItemInstance itemInstance)
			: base(itemInstance)
		{
		}

		public void AddQuantity(float amount)
		{
			S1CashInstance.SetBalance(Mathf.Clamp(S1CashInstance.Balance + amount, 0f, float.MaxValue), false);
		}

		public void SetQuantity(float newQuantity)
		{
			S1CashInstance.SetBalance(newQuantity, false);
		}
	}
}
namespace S1API.Leveling
{
	public static class LevelManager
	{
		public static Rank Rank = (Rank)NetworkSingleton<LevelManager>.Instance.Rank;
	}
	public enum Rank
	{
		StreetRat,
		Hoodlum,
		Peddler,
		Hustler,
		Bagman,
		Enforcer,
		ShotCaller,
		BlockBoss,
		Underlord,
		Baron,
		Kingpin
	}
}
namespace S1API.Items
{
	public enum ItemCategory
	{
		Product,
		Packaging,
		Growing,
		Tools,
		Furniture,
		Lighting,
		Cash,
		Consumable,
		Equipment,
		Ingredient,
		Decoration,
		Clothing
	}
	public class ItemDefinition : IGUIDReference
	{
		internal readonly ItemDefinition S1ItemDefinition;

		public virtual string GUID => S1ItemDefinition.ID;

		public string ID => S1ItemDefinition.ID;

		public string Name => S1ItemDefinition.Name;

		public string Description => S1ItemDefinition.Description;

		public ItemCategory Category => (ItemCategory)S1ItemDefinition.Category;

		public int StackLimit => S1ItemDefinition.StackLimit;

		internal ItemDefinition(ItemDefinition s1ItemDefinition)
		{
			S1ItemDefinition = s1ItemDefinition;
		}

		internal static ItemDefinition GetFromGUID(string guid)
		{
			return ItemManager.GetItemDefinition(guid);
		}

		public override bool Equals(object? obj)
		{
			return obj is ItemDefinition itemDefinition && (Object)(object)S1ItemDefinition == (Object)(object)itemDefinition.S1ItemDefinition;
		}

		public override int GetHashCode()
		{
			ItemDefinition s1ItemDefinition = S1ItemDefinition;
			return (s1ItemDefinition != null) ? ((Object)s1ItemDefinition).GetHashCode() : 0;
		}

		public static bool operator ==(ItemDefinition? left, ItemDefinition? right)
		{
			if ((object)left == right)
			{
				return true;
			}
			return (Object)(object)left?.S1ItemDefinition == (Object)(object)right?.S1ItemDefinition;
		}

		public static bool operator !=(ItemDefinition left, ItemDefinition right)
		{
			return !(left == right);
		}

		public virtual ItemInstance CreateInstance(int quantity = 1)
		{
			return new ItemInstance(S1ItemDefinition.GetDefaultInstance(quantity));
		}
	}
	public class ItemInstance
	{
		internal readonly ItemInstance S1ItemInstance;

		public ItemDefinition Definition => new ItemDefinition(S1ItemInstance.Definition);

		internal ItemInstance(ItemInstance itemInstance)
		{
			S1ItemInstance = itemInstance;
		}
	}
	public static class ItemManager
	{
		public static ItemDefinition GetItemDefinition(string itemID)
		{
			ItemDefinition item = Registry.GetItem(itemID);
			if (CrossType.Is<ProductDefinition>((object)item, out ProductDefinition result))
			{
				return new ProductDefinition(result);
			}
			if (CrossType.Is<CashDefinition>((object)item, out CashDefinition result2))
			{
				return new CashDefinition(result2);
			}
			return new ItemDefinition(item);
		}
	}
	public class ItemSlotInstance
	{
		internal readonly ItemSlot S1ItemSlot;

		public int Quantity => S1ItemSlot.Quantity;

		public ItemInstance? ItemInstance
		{
			get
			{
				if (CrossType.Is<ProductItemInstance>((object)S1ItemSlot.ItemInstance, out ProductItemInstance result))
				{
					return new ProductInstance(result);
				}
				if (CrossType.Is<CashInstance>((object)S1ItemSlot.ItemInstance, out CashInstance result2))
				{
					return new CashInstance((ItemInstance)(object)result2);
				}
				if (CrossType.Is<ItemInstance>((object)S1ItemSlot.ItemInstance, out ItemInstance result3))
				{
					return new ItemInstance(result3);
				}
				return null;
			}
		}

		internal ItemSlotInstance(ItemSlot itemSlot)
		{
			S1ItemSlot = itemSlot;
		}

		public void AddQuantity(int amount)
		{
			S1ItemSlot.ChangeQuantity(amount, false);
		}
	}
}
namespace S1API.Internal.Utils
{
	internal static class CrossType
	{
		internal static Type Of<T>()
		{
			return Il2CppType.Of<T>();
		}

		internal static bool Is<T>(object obj, out T result) where T : Il2CppObjectBase
		{
			Object val = (Object)((obj is Object) ? obj : null);
			if (val != null)
			{
				Type val2 = Il2CppType.Of<T>();
				if (val2.IsAssignableFrom(val.GetIl2CppType()))
				{
					result = ((Il2CppObjectBase)val).TryCast<T>();
					return true;
				}
			}
			result = default(T);
			return false;
		}

		internal static T As<T>(object obj) where T : Il2CppObjectBase
		{
			Object val = (Object)((obj is Object) ? obj : null);
			return (val != null) ? ((Il2CppObjectBase)val).Cast<T>() : default(T);
		}
	}
	public static class ImageUtils
	{
		public static Sprite LoadImage(string fileName)
		{
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0058: Expected O, but got Unknown
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			string text = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) ?? string.Empty, fileName);
			if (!File.Exists(text))
			{
				MelonLogger.Error("❌ Icon file not found: " + text);
				return null;
			}
			try
			{
				byte[] array = File.ReadAllBytes(text);
				Texture2D val = new Texture2D(2, 2);
				if (ImageConversion.LoadImage(val, Il2CppStructArray<byte>.op_Implicit(array)))
				{
					return Sprite.Create(val, new Rect(0f, 0f, (float)((Texture)val).width, (float)((Texture)val).height), new Vector2(0.5f, 0.5f));
				}
			}
			catch (Exception ex)
			{
				MelonLogger.Error("❌ Failed to load sprite: " + ex);
			}
			return null;
		}
	}
	internal static class ReflectionUtils
	{
		internal static List<Type> GetDerivedClasses<TBaseClass>()
		{
			List<Type> list = new List<Type>();
			Assembly[] array = (from assembly in AppDomain.CurrentDomain.GetAssemblies()
				where !assembly.FullName.StartsWith("System") && !assembly.FullName.StartsWith("Unity") && !assembly.FullName.StartsWith("Il2Cpp") && !assembly.FullName.StartsWith("mscorlib") && !assembly.FullName.StartsWith("Mono.") && !assembly.FullName.StartsWith("netstandard")
				select assembly).ToArray();
			Assembly[] array2 = array;
			foreach (Assembly assembly2 in array2)
			{
				list.AddRange(from type in assembly2.GetTypes()
					where typeof(TBaseClass).IsAssignableFrom(type) && type != typeof(TBaseClass) && !type.IsAbstract
					select type);
			}
			return list;
		}

		internal static Type? GetTypeByName(string typeName)
		{
			string typeName2 = typeName;
			Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
			Assembly[] array = assemblies;
			foreach (Assembly assembly in array)
			{
				Type type2 = assembly.GetTypes().FirstOrDefault((Type type) => type.Name == typeName2);
				if (!(type2 == null))
				{
					return type2;
				}
			}
			return null;
		}

		internal static FieldInfo[] GetAllFields(Type? type, BindingFlags bindingFlags)
		{
			List<FieldInfo> list = new List<FieldInfo>();
			while (type != null && type != typeof(object))
			{
				list.AddRange(type.GetFields(bindingFlags));
				type = type.BaseType;
			}
			return list.ToArray();
		}

		public static MethodInfo? GetMethod(Type? type, string methodName, BindingFlags bindingFlags)
		{
			while (type != null && type != typeof(object))
			{
				MethodInfo method = type.GetMethod(methodName, bindingFlags);
				if (method != null)
				{
					return method;
				}
				type = type.BaseType;
			}
			return null;
		}
	}
}
namespace S1API.Internal.Patches
{
	[HarmonyPatch]
	internal class NPCPatches
	{
		private static readonly List<NPC> NPCs = new List<NPC>();

		[HarmonyPatch(typeof(NPCsLoader), "Load")]
		[HarmonyPrefix]
		private static void NPCsLoadersLoad(NPCsLoader __instance, string mainPath)
		{
			foreach (Type derivedClass in ReflectionUtils.GetDerivedClasses<NPC>())
			{
				NPC nPC = (NPC)Activator.CreateInstance(derivedClass);
				NPCs.Add(nPC);
				string folderPath = Path.Combine(mainPath, nPC.S1NPC.SaveFolderName);
				nPC.LoadInternal(folderPath);
			}
		}

		[HarmonyPatch(typeof(NPC), "Start")]
		[HarmonyPostfix]
		private static void NPCStart(NPC __instance)
		{
			NPC __instance2 = __instance;
			NPCs.FirstOrDefault((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2)?.CreateInternal();
		}

		[HarmonyPatch(typeof(NPC), "WriteData")]
		[HarmonyPostfix]
		private static void NPCWriteData(NPC __instance, string parentFolderPath, ref List<string> __result)
		{
			NPC __instance2 = __instance;
			NPCs.FirstOrDefault((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2)?.SaveInternal(parentFolderPath, ref __result);
		}

		[HarmonyPatch(typeof(NPC), "OnDestroy")]
		[HarmonyPostfix]
		private static void NPCOnDestroy(NPC __instance)
		{
			NPC __instance2 = __instance;
			NPCs.RemoveAll((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2);
			NPC nPC = NPCs.FirstOrDefault((NPC npc) => (Object)(object)npc.S1NPC == (Object)(object)__instance2);
			if (nPC != null)
			{
				NPCs.Remove(nPC);
			}
		}
	}
	[HarmonyPatch(typeof(SceneManager), "Internal_SceneLoaded")]
	internal static class PhoneAppPatches
	{
		private static bool _loaded;

		private static void Postfix(Scene scene, LoadSceneMode mode)
		{
			if (_loaded || ((Scene)(ref scene)).name != "Main")
			{
				return;
			}
			_loaded = true;
			List<Type> derivedClasses = ReflectionUtils.GetDerivedClasses<global::S1API.PhoneApp.PhoneApp>();
			foreach (Type item in derivedClasses)
			{
				if (!(item.GetConstructor(Type.EmptyTypes) == null))
				{
					try
					{
						global::S1API.PhoneApp.PhoneApp phoneApp = (global::S1API.PhoneApp.PhoneApp)Activator.CreateInstance(item);
						((IRegisterable)phoneApp).CreateInternal();
					}
					catch (Exception ex)
					{
						MelonLogger.Warning("[PhoneApp] Failed to register " + item.FullName + ": " + ex.Message);
					}
				}
			}
		}
	}
	[HarmonyPatch]
	internal class QuestPatches
	{
		[HarmonyPatch(typeof(QuestManager), "WriteData")]
		[HarmonyPostfix]
		private static void QuestManagerWriteData(QuestManager __instance, string parentFolderPath, ref List<string> __result)
		{
			string folderPath = Path.Combine(parentFolderPath, "Quests");
			foreach (Quest quest in QuestManager.Quests)
			{
				quest.SaveInternal(folderPath, ref __result);
			}
		}

		[HarmonyPatch(typeof(QuestsLoader), "Load")]
		[HarmonyPostfix]
		private static void QuestsLoaderLoad(QuestsLoader __instance, string mainPath)
		{
			if (!Directory.Exists(mainPath))
			{
				return;
			}
			string[] array = (from directory in Directory.GetDirectories(mainPath).Select(Path.GetFileName)
				where directory.StartsWith("Quest_")
				select directory).ToArray();
			string[] array2 = array;
			string text2 = default(string);
			string text5 = default(string);
			foreach (string path in array2)
			{
				string text = Path.Combine(mainPath, path);
				((Loader)__instance).TryLoadFile(text, ref text2, true);
				if (text2 == null)
				{
					continue;
				}
				QuestData val = JsonUtility.FromJson<QuestData>(text2);
				string text3 = Path.Combine(mainPath, path);
				string text4 = Path.Combine(text3, "QuestData");
				if (!((Loader)__instance).TryLoadFile(text4, ref text5, true))
				{
					continue;
				}
				QuestData questData = JsonConvert.DeserializeObject<QuestData>(text5, ISaveable.SerializerSettings);
				if (questData?.ClassName != null)
				{
					Type typeByName = ReflectionUtils.GetTypeByName(questData.ClassName);
					if (!(typeByName == null) && typeof(Quest).IsAssignableFrom(typeByName))
					{
						Quest quest = QuestManager.CreateQuest(typeByName, (val != null) ? val.GUID : null);
						quest.LoadInternal(text3);
					}
				}
			}
		}

		[HarmonyPatch(typeof(QuestManager), "DeleteUnapprovedFiles")]
		[HarmonyPostfix]
		private static void QuestManagerDeleteUnapprovedFiles(QuestManager __instance, string parentFolderPath)
		{
			string path = Path.Combine(parentFolderPath, "Quests");
			string?[] existingQuests = QuestManager.Quests.Select((Quest quest) => quest.SaveFolder).ToArray();
			string[] array = (from directory in Directory.GetDirectories(path)
				where directory.StartsWith("Quest_") && !existingQuests.Contains<string>(directory)
				select directory).ToArray();
			string[] array2 = array;
			foreach (string path2 in array2)
			{
				Directory.Delete(path2, recursive: true);
			}
		}

		[HarmonyPatch(typeof(Quest), "Start")]
		[HarmonyPrefix]
		private static void QuestStart(Quest __instance)
		{
			Quest __instance2 = __instance;
			QuestManager.Quests.FirstOrDefault((Quest quest) => (Object)(object)quest.S1Quest == (Object)(object)__instance2)?.CreateInternal();
		}
	}
	[HarmonyPatch]
	internal class TimePatches
	{
		[HarmonyPatch(typeof(TimeManager), "Awake")]
		[HarmonyPostfix]
		private static void TimeManagerAwake(TimeManager __instance)
		{
			__instance.onDayPass += Action.op_Implicit((Action)DayPass);
			static void DayPass()
			{
				TimeManager.OnDayPass();
			}
		}
	}
}
namespace S1API.Internal.Abstraction
{
	internal static class EventHelper
	{
		internal static readonly Dictionary<Action, UnityAction> SubscribedActions = new Dictionary<Action, UnityAction>();

		internal static void AddListener(Action listener, UnityEvent unityEvent)
		{
			if (!SubscribedActions.ContainsKey(listener))
			{
				UnityAction val = UnityAction.op_Implicit((Action)listener.Invoke);
				unityEvent.AddListener(val);
				SubscribedActions.Add(listener, val);
			}
		}

		internal static void RemoveListener(Action listener, UnityEvent unityEvent)
		{
			SubscribedActions.TryGetValue(listener, out UnityAction value);
			SubscribedActions.Remove(listener);
			unityEvent.RemoveListener(value);
		}
	}
	internal class GUIDReferenceConverter : JsonConverter
	{
		public override bool CanRead => true;

		public override bool CanConvert(Type objectType)
		{
			return typeof(IGUIDReference).IsAssignableFrom(objectType);
		}

		public override void WriteJson(JsonWriter writer, object? value, JsonSerializer serializer)
		{
			if (value is IGUIDReference iGUIDReference)
			{
				writer.WriteValue(iGUIDReference.GUID);
			}
			else
			{
				writer.WriteNull();
			}
		}

		public override object? ReadJson(JsonReader reader, Type objectType, object? existingValue, JsonSerializer serializer)
		{
			string text = reader.Value?.ToString();
			if (string.IsNullOrEmpty(text))
			{
				return null;
			}
			MethodInfo method = ReflectionUtils.GetMethod(objectType, "GetFromGUID", BindingFlags.Static | BindingFlags.NonPublic);
			if (method == null)
			{
				throw new Exception("The type " + objectType.Name + " does not have a valid implementation of the GetFromGUID(string guid) method!");
			}
			return method.Invoke(null, new object[1] { text });
		}
	}
	internal interface IGUIDReference
	{
		string GUID { get; }
	}
	internal interface IRegisterable
	{
		void CreateInternal();

		void DestroyInternal();

		void OnCreated();

		void OnDestroyed();
	}
	internal interface ISaveable : IRegisterable
	{
		internal static JsonSerializerSettings SerializerSettings => new JsonSerializerSettings
		{
			ReferenceLoopHandling = (ReferenceLoopHandling)1,
			Converters = new List<JsonConverter> { (JsonConverter)(object)new GUIDReferenceConverter() }
		};

		void SaveInternal(string path, ref List<string> extraSaveables);

		void LoadInternal(string folderPath);

		void OnSaved();

		void OnLoaded();
	}
	public abstract class Registerable : IRegisterable
	{
		void IRegisterable.CreateInternal()
		{
			CreateInternal();
		}

		internal virtual void CreateInternal()
		{
			OnCreated();
		}

		void IRegisterable.DestroyInternal()
		{
			DestroyInternal();
		}

		internal virtual void DestroyInternal()
		{
			OnDestroyed();
		}

		void IRegisterable.OnCreated()
		{
			OnCreated();
		}

		protected virtual void OnCreated()
		{
		}

		void IRegisterable.OnDestroyed()
		{
			OnDestroyed();
		}

		protected virtual void OnDestroyed()
		{
		}
	}
	public abstract class Saveable : Registerable, ISaveable, IRegisterable
	{
		void ISaveable.LoadInternal(string folderPath)
		{
			LoadInternal(folderPath);
		}

		internal virtual void LoadInternal(string folderPath)
		{
			FieldInfo[] fields = GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			FieldInfo[] array = fields;
			foreach (FieldInfo fieldInfo in array)
			{
				SaveableField customAttribute = fieldInfo.GetCustomAttribute<SaveableField>();
				if (customAttribute != null)
				{
					string path = (customAttribute.SaveName.EndsWith(".json") ? customAttribute.SaveName : (customAttribute.SaveName + ".json"));
					string path2 = Path.Combine(folderPath, path);
					if (File.Exists(path2))
					{
						string text = File.ReadAllText(path2);
						Type fieldType = fieldInfo.FieldType;
						object value = JsonConvert.DeserializeObject(text, fieldType, ISaveable.SerializerSettings);
						fieldInfo.SetValue(this, value);
					}
				}
			}
			OnLoaded();
		}

		void ISaveable.SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			SaveInternal(folderPath, ref extraSaveables);
		}

		internal virtual void SaveInternal(string folderPath, ref List<string> extraSaveables)
		{
			FieldInfo[] allFields = ReflectionUtils.GetAllFields(GetType(), BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			FieldInfo[] array = allFields;
			foreach (FieldInfo fieldInfo in array)
			{
				SaveableField customAttribute = fieldInfo.GetCustomAttribute<SaveableField>();
				if (customAttribute != null)
				{
					string text = (customAttribute.SaveName.EndsWith(".json") ? customAttribute.SaveName : (customAttribute.SaveName + ".json"));
					string path = Path.Combine(folderPath, text);
					object value = fieldInfo.GetValue(this);
					if (value == null)
					{
						File.Delete(path);
						continue;
					}
					extraSaveables.Add(text);
					string contents = JsonConvert.SerializeObject(value, (Formatting)1, ISaveable.SerializerSettings);
					File.WriteAllText(path, contents);
				}
			}
			OnSaved();
		}

		void ISaveable.OnLoaded()
		{
			OnLoaded();
		}

		protected virtual void OnLoaded()
		{
		}

		void ISaveable.OnSaved()
		{
			OnSaved();
		}

		protected virtual void OnSaved()
		{
		}
	}
}
namespace S1API.GameTime
{
	public enum Day
	{
		Monday,
		Tuesday,
		Wednesday,
		Thursday,
		Friday,
		Saturday,
		Sunday
	}
	public static class TimeManager
	{
		public static readonly Action OnDayPass = delegate
		{
		};

		public static Day CurrentDay => (Day)NetworkSingleton<TimeManager>.Instance.CurrentDay;
	}
}
namespace S1API.DeadDrops
{
	public class DeadDropInstance : IGUIDReference
	{
		internal readonly DeadDrop S1DeadDrop;

		private StorageInstance? _cachedStorage;

		public string GUID
		{
			get
			{
				//IL_0006: Unknown result type (might be due to invalid IL or missing references)
				//IL_000b: Unknown result type (might be due to invalid IL or missing references)
				Guid gUID = S1DeadDrop.GUID;
				return ((object)(Guid)(ref gUID)).ToString();
			}
		}

		public StorageInstance Storage => _cachedStorage ?? (_cachedStorage = new StorageInstance(S1DeadDrop.Storage));

		public Vector3 Position => ((Component)S1DeadDrop).transform.position;

		internal DeadDropInstance(DeadDrop deadDrop)
		{
			S1DeadDrop = deadDrop;
		}

		internal static DeadDropInstance? GetFromGUID(string guid)
		{
			string guid2 = guid;
			return DeadDropManager.All.FirstOrDefault((DeadDropInstance deadDrop) => deadDrop.GUID == guid2);
		}
	}
	public class DeadDropManager
	{
		public static DeadDropInstance[] All => ((IEnumerable<DeadDrop>)DeadDrop.DeadDrops.ToArray()).Select((DeadDrop deadDrop) => new DeadDropInstance(deadDrop)).ToArray();
	}
}
namespace S1API.Utils
{
	public static class ConsoleHelper
	{
		public static void RunCashCommand(int amount)
		{
			//IL_0001: Unknown result type (might be due to invalid IL or missing references)
			//IL_0007: Expected O, but got Unknown
			ChangeCashCommand val = new ChangeCashCommand();
			List<string> val2 = new List<string>();
			val2.Add(amount.ToString());
			((ConsoleCommand)val).Execute(val2);
		}
	}
	public static class RandomUtils
	{
		private static readonly Random SystemRng = new Random();

		public static T PickOne<T>(this IList<T> list)
		{
			if (list == null || list.Count == 0)
			{
				return default(T);
			}
			return list[Random.Range(0, list.Count)];
		}

		public static T PickUnique<T>(this IList<T> list, Func<T, bool> isDuplicate, int maxTries = 10)
		{
			if (list == null || list.Count == 0)
			{
				return default(T);
			}
			for (int i = 0; i < maxTries; i++)
			{
				T val = list.PickOne();
				if (!isDuplicate(val))
				{
					return val;
				}
			}
			return default(T);
		}

		public static List<T> PickMany<T>(this IList<T> list, int count)
		{
			if (list == null || list.Count == 0)
			{
				return new List<T>();
			}
			List<T> list2 = new List<T>(list);
			List<T> list3 = new List<T>();
			for (int i = 0; i < count; i++)
			{
				if (list2.Count <= 0)
				{
					break;
				}
				int index = Random.Range(0, list2.Count);
				list3.Add(list2[index]);
				list2.RemoveAt(index);
			}
			return list3;
		}

		public static int RangeInt(int minInclusive, int maxExclusive)
		{
			return SystemRng.Next(minInclusive, maxExclusive);
		}
	}
}